From bb59db68673587cb7bb74b76bac0e6f2123cd1c9 Mon Sep 17 00:00:00 2001 From: zhoudaxia <1018795633@qq.cin> Date: Thu, 25 Aug 2016 08:42:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robocode战斗机器人——夏季学期计划.mpp | Bin 313856 -> 0 bytes 代码/workspace_robo4/.gitignore | 11 - 代码/workspace_robo4/LICENSE.txt | 14 - 代码/workspace_robo4/README.md | 12 - .../RemoteSystemsTempFiles/.project | 12 - 代码/workspace_robo4/jacobe.cmd | 17 - 代码/workspace_robo4/jacobe.sh | 24 - 代码/workspace_robo4/mvn.cmd | 15 - 代码/workspace_robo4/mvn.sh | 16 - 代码/workspace_robo4/mvnassembly.cmd | 12 - 代码/workspace_robo4/mvnassembly.sh | 11 - 代码/workspace_robo4/plugins/.project | 11 - .../workspace_robo4/plugins/dotnet/ReadMe.txt | 88 - .../plugins/dotnet/generateProxies.cmd | 41 - 代码/workspace_robo4/plugins/dotnet/mvn.cmd | 20 - .../plugins/dotnet/mvnassembly.cmd | 12 - 代码/workspace_robo4/plugins/dotnet/pom.xml | 62 - .../plugins/dotnet/robocode.dotnet.api/.project | 8 - .../.settings/org.eclipse.jdt.core.prefs | 10 - .../plugins/dotnet/robocode.dotnet.api/pom.xml | 52 - .../robocode.dotnet.api/robocode.dotnet.api.iml | 66 - .../robocode.dotnet.api/robotAPI.shfbproj | 87 - .../dotnet/robocode.dotnet.api/src/.gitignore | 3 - .../robocode.dotnet.api/src/AssemblyInf.cs | 12 - .../src/net/sf/robocode/io/LoggerN.cs | 132 - .../src/net/sf/robocode/nio/Buffer.cs | 508 --- .../src/net/sf/robocode/nio/ByteBuffer.cs | 1604 --------- .../src/net/sf/robocode/nio/HeapByteBuffer.cs | 380 -- .../net/sf/robocode/nio/InvalidMarkException.cs | 116 - .../src/net/sf/robocode/peer/IRobotStaticsN.cs | 23 - .../net/sf/robocode/security/HiddenAccessN.cs | 131 - .../sf/robocode/security/IHiddenBulletHelper.cs | 20 - .../sf/robocode/security/IHiddenEventHelper.cs | 29 - .../sf/robocode/security/IHiddenRandomHelper.cs | 20 - .../sf/robocode/security/IHiddenRulesHelper.cs | 21 - .../sf/robocode/security/IHiddenStatusHelper.cs | 25 - .../security/RobocodeInternalPermission.cs | 151 - .../serialization/ISerializableHelperN.cs | 22 - .../sf/robocode/serialization/RbSerializerN.cs | 524 --- .../src/robocode.dotnet.api.csproj | 164 - .../src/robocode/AdvancedRobot.cs | 2226 ------------ .../src/robocode/BattleEndedEvent.cs | 126 - .../src/robocode/BattleResults.cs | 225 -- .../src/robocode/BattleRules.cs | 137 - .../robocode.dotnet.api/src/robocode/Bullet.cs | 217 -- .../src/robocode/BulletHitBulletEvent.cs | 116 - .../src/robocode/BulletHitEvent.cs | 128 - .../src/robocode/BulletMissedEvent.cs | 102 - .../src/robocode/Condition.cs | 155 - .../src/robocode/CustomEvent.cs | 123 - .../src/robocode/DeathEvent.cs | 78 - .../robocode.dotnet.api/src/robocode/Event.cs | 279 -- .../src/robocode/GunTurnCompleteCondition.cs | 52 - .../src/robocode/HitByBulletEvent.cs | 177 - .../src/robocode/HitRobotEvent.cs | 172 - .../src/robocode/HitWallEvent.cs | 103 - .../src/robocode/IBorderSentry.cs | 32 - .../robocode.dotnet.api/src/robocode/IDroid.cs | 23 - .../src/robocode/IGraphics.cs | 160 - .../src/robocode/JuniorRobot.cs | 1324 ------- .../src/robocode/KeyEvent.cs | 78 - .../src/robocode/KeyPressedEvent.cs | 96 - .../src/robocode/KeyReleasedEvent.cs | 98 - .../src/robocode/KeyTypedEvent.cs | 98 - .../robocode.dotnet.api/src/robocode/Keys.cs | 292 -- .../src/robocode/MessageEvent.cs | 77 - .../src/robocode/MouseClickedEvent.cs | 103 - .../src/robocode/MouseDraggedEvent.cs | 103 - .../src/robocode/MouseEnteredEvent.cs | 104 - .../src/robocode/MouseEvent.cs | 91 - .../src/robocode/MouseExitedEvent.cs | 103 - .../src/robocode/MouseMovedEvent.cs | 104 - .../src/robocode/MousePressedEvent.cs | 105 - .../src/robocode/MouseReleasedEvent.cs | 104 - .../src/robocode/MouseWheelMovedEvent.cs | 134 - .../src/robocode/MoveCompleteCondition.cs | 52 - .../src/robocode/PaintEvent.cs | 50 - .../src/robocode/RadarTurnCompleteCondition.cs | 52 - .../src/robocode/RateControlRobot.cs | 364 -- .../robocode.dotnet.api/src/robocode/Robot.cs | 1927 ----------- .../src/robocode/RobotDeathEvent.cs | 95 - .../src/robocode/RobotStatus.cs | 401 --- .../src/robocode/RoundEndedEvent.cs | 134 - .../robocode.dotnet.api/src/robocode/Rules.cs | 214 -- .../src/robocode/ScannedRobotEvent.cs | 238 -- .../src/robocode/SkippedTurnEvent.cs | 125 - .../src/robocode/StatusEvent.cs | 66 - .../src/robocode/TeamRobot.cs | 193 -- .../robocode.dotnet.api/src/robocode/Thread.cs | 134 - .../src/robocode/TurnCompleteCondition.cs | 52 - .../src/robocode/WinEvent.cs | 80 - .../exception/EventInterruptedException.cs | 48 - .../src/robocode/exception/RobotException.cs | 45 - .../robocode/robotinterfaces/IAdvancedEvents.cs | 52 - .../robocode/robotinterfaces/IAdvancedRobot.cs | 32 - .../robocode/robotinterfaces/IBasicEvents.cs | 270 -- .../robocode/robotinterfaces/IBasicEvents2.cs | 38 - .../robocode/robotinterfaces/IBasicEvents3.cs | 40 - .../src/robocode/robotinterfaces/IBasicRobot.cs | 59 - .../robotinterfaces/IInteractiveEvents.cs | 183 - .../robotinterfaces/IInteractiveRobot.cs | 36 - .../robocode/robotinterfaces/IJuniorRobot.cs | 38 - .../robocode/robotinterfaces/IPaintEvents.cs | 42 - .../src/robocode/robotinterfaces/IPaintRobot.cs | 24 - .../src/robocode/robotinterfaces/IRunnable.cs | 22 - .../src/robocode/robotinterfaces/ITeamEvents.cs | 38 - .../src/robocode/robotinterfaces/ITeamRobot.cs | 33 - .../robotinterfaces/peer/IAdvancedRobotPeer.cs | 659 ---- .../robotinterfaces/peer/IBasicRobotPeer.cs | 698 ---- .../robotinterfaces/peer/IJuniorRobotPeer.cs | 65 - .../robotinterfaces/peer/IStandardRobotPeer.cs | 248 -- .../robotinterfaces/peer/ITeamRobotPeer.cs | 129 - .../src/robocode/util/Utils.cs | 206 -- .../dotnet/robocode.dotnet.content/.classpath | 13 - .../dotnet/robocode.dotnet.content/.project | 19 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../dotnet/robocode.dotnet.content/pom.xml | 33 - .../robocode.dotnet.content.iml | 147 - .../src/main/resources/libs/control/.gitignore | 3 - .../libs/control/BattleRunnnerSample.csproj | 69 - .../libs/control/BattleRunnnerSample.sln | 20 - .../src/main/resources/libs/control/Program.cs | 82 - .../src/main/resources/robocode.bat | 9 - .../src/main/resources/robots/SamplesCs.csproj | 89 - .../dotnet/robocode.dotnet.control.api/.project | 10 - .../.settings/org.eclipse.jdt.core.prefs | 10 - .../Content Layout.content | 4 - .../Introduction.aml | 113 - .../controlAPI.shfbproj | 81 - .../dotnet/robocode.dotnet.control.api/pom.xml | 66 - .../robocode.dotnet.control.api.iml | 74 - .../robocode.dotnet.control.api/src/.gitignore | 3 - .../src/generated/java/util/Random.generated.cs | 172 - .../control/BattleSpecification.generated.cs | 207 -- .../BattlefieldSpecification.generated.cs | 95 - .../robocode/control/RandomFactory.generated.cs | 105 - .../control/RobocodeEngine.generated.cs | 296 -- .../robocode/control/RobotResults.generated.cs | 95 - .../robocode/control/RobotSetup.generated.cs | 94 - .../control/RobotSpecification.generated.cs | 159 - .../events/BattleCompletedEvent.generated.cs | 94 - .../events/BattleErrorEvent.generated.cs | 72 - .../control/events/BattleEvent.generated.cs | 49 - .../events/BattleFinishedEvent.generated.cs | 72 - .../events/BattleMessageEvent.generated.cs | 72 - .../events/BattlePausedEvent.generated.cs | 61 - .../events/BattleResumedEvent.generated.cs | 61 - .../events/BattleStartedEvent.generated.cs | 94 - .../control/events/IBattleListener.generated.cs | 331 -- .../control/events/RoundEndedEvent.generated.cs | 94 - .../events/RoundStartedEvent.generated.cs | 83 - .../control/events/TurnEndedEvent.generated.cs | 72 - .../events/TurnStartedEvent.generated.cs | 61 - .../control/snapshot/BulletState.generated.cs | 195 -- .../snapshot/IBulletSnapshot.generated.cs | 431 --- .../snapshot/IDebugProperty.generated.cs | 119 - .../snapshot/IRobotSnapshot.generated.cs | 795 ----- .../snapshot/IScoreSnapshot.generated.cs | 558 --- .../control/snapshot/ITurnSnapshot.generated.cs | 249 -- .../control/snapshot/RobotState.generated.cs | 189 - .../src/glue/robocode/control/RandomFactory.cs | 76 - .../src/glue/robocode/control/RobocodeEngine.cs | 29 - .../robocode/control/BattleSpecification.cs | 257 -- .../control/BattlefieldSpecification.cs | 77 - .../robocode/control/IRobocodeEngine.cs | 237 -- .../robocode/control/RobocodeEngine.cs | 1682 --------- .../robocode/control/RobotSetup.cs | 70 - .../robocode/control/RobotSpecification.cs | 148 - .../control/events/BattleCompletedEvent.cs | 86 - .../robocode/control/events/BattleErrorEvent.cs | 44 - .../robocode/control/events/BattleEvent.cs | 22 - .../control/events/BattleFinishedEvent.cs | 47 - .../control/events/BattleMessageEvent.cs | 44 - .../control/events/BattlePausedEvent.cs | 24 - .../control/events/BattleResumedEvent.cs | 24 - .../control/events/BattleStartedEvent.cs | 71 - .../robocode/control/events/RoundEndedEvent.cs | 72 - .../control/events/RoundStartedEvent.cs | 58 - .../robocode/control/events/TurnEndedEvent.cs | 45 - .../robocode/control/events/TurnStartedEvent.cs | 24 - .../robocode/control/snapshot/BulletState.cs | 58 - .../control/snapshot/IBulletSnapshot.cs | 123 - .../robocode/control/snapshot/IDebugProperty.cs | 37 - .../robocode/control/snapshot/IRobotSnapshot.cs | 248 -- .../robocode/control/snapshot/IScoreSnapshot.cs | 165 - .../robocode/control/snapshot/ITurnSnapshot.cs | 81 - .../robocode/control/snapshot/RobotState.cs | 41 - .../src/robocode.dotnet.control.api.csproj | 200 -- .../src/robocode.ico | Bin 25214 -> 0 bytes .../robocode.dotnet.distribution/.classpath | 14 - .../robocode.dotnet.distribution/.project | 22 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../dotnet-setup.asm.xml | 119 - .../dotnet/robocode.dotnet.distribution/pom.xml | 76 - .../robocode.dotnet.distribution.iml | 149 - .../dotnet/robocode.dotnet.host/.classpath | 16 - .../dotnet/robocode.dotnet.host/.project | 18 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../plugins/dotnet/robocode.dotnet.host/pom.xml | 164 - .../robocode.dotnet.host.iml | 169 - .../src/main/java/java_/util/Random_.java | 33 - .../net/sf/robocode/core/ContainerBase_.java | 33 - .../net/sf/robocode/dotnet/host/DotNetHost.java | 58 - .../net/sf/robocode/dotnet/host/Module.java | 77 - .../net/sf/robocode/dotnet/nhost/ModuleN.java | 49 - .../repository/items/DotNetRobotItem.java | 30 - .../items/handlers/DotNetPropertiesHandler.java | 57 - .../dotnet/repository/root/DllRoot.java | 120 - .../dotnet/repository/root/DllRootHelper.java | 56 - .../repository/root/handlers/DllHandler.java | 62 - .../net/sf/robocode/host/IHostManager_.java | 73 - .../main/java/net/sf/robocode/host/IHost_.java | 52 - .../net/sf/robocode/host/RobotStatics_.java | 34 - .../host/proxies/IHostingRobotProxy_.java | 55 - .../main/java/net/sf/robocode/io/Logger_.java | 33 - .../robocode/manager/IVersionManagerBase_.java | 55 - .../java/net/sf/robocode/peer/BadBehavior_.java | 33 - .../java/net/sf/robocode/peer/IRobotPeer_.java | 73 - .../net/sf/robocode/peer/IRobotStatics_.java | 55 - .../net/sf/robocode/repository/IRobotItem_.java | 166 - .../sf/robocode/repository/IRobotSpecItem_.java | 127 - .../net/sf/robocode/repository/RobotType_.java | 33 - .../net/sf/robocode/security/HiddenAccess_.java | 33 - .../serialization/ISerializableHelper_.java | 52 - .../robocode/serialization/RbSerializer_.java | 33 - .../src/main/java/robocode/BattleRules_.java | 34 - .../robocode/control/BattleSpecification_.java | 33 - .../control/BattlefieldSpecification_.java | 33 - .../java/robocode/control/RandomFactory_.java | 33 - .../java/robocode/control/RobocodeEngine_.java | 33 - .../java/robocode/control/RobotResults_.java | 33 - .../main/java/robocode/control/RobotSetup_.java | 33 - .../robocode/control/RobotSpecification_.java | 33 - .../control/events/BattleCompletedEvent_.java | 33 - .../control/events/BattleErrorEvent_.java | 33 - .../robocode/control/events/BattleEvent_.java | 33 - .../control/events/BattleFinishedEvent_.java | 33 - .../control/events/BattleMessageEvent_.java | 33 - .../control/events/BattlePausedEvent_.java | 33 - .../control/events/BattleResumedEvent_.java | 33 - .../control/events/BattleStartedEvent_.java | 33 - .../control/events/IBattleListener_.java | 76 - .../control/events/RoundEndedEvent_.java | 33 - .../control/events/RoundStartedEvent_.java | 33 - .../control/events/TurnEndedEvent_.java | 33 - .../control/events/TurnStartedEvent_.java | 33 - .../robocode/control/snapshot/BulletState_.java | 33 - .../control/snapshot/IBulletSnapshot_.java | 85 - .../control/snapshot/IDebugProperty_.java | 49 - .../control/snapshot/IRobotSnapshot_.java | 127 - .../control/snapshot/IScoreSnapshot_.java | 100 - .../control/snapshot/ITurnSnapshot_.java | 64 - .../robocode/control/snapshot/RobotState_.java | 33 - .../robocode/exception/AbortedException_.java | 33 - .../robocode/exception/DeathException_.java | 33 - .../robocode/exception/DisabledException_.java | 33 - .../java/robocode/exception/WinException_.java | 33 - .../net/sf/robocode/dotnet/host/TestCLR.java | 24 - .../plugins/dotnet/robocode.dotnet.iml | 65 - .../dotnet/robocode.dotnet.installer/.classpath | 6 - .../dotnet/robocode.dotnet.installer/.project | 14 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../dotnet/robocode.dotnet.installer/pom.xml | 27 - .../robocode.dotnet.installer.iml | 67 - .../net/sf/robocode/installer/AutoExtract.java | 382 -- .../plugins/dotnet/robocode.dotnet.ipr | 118 - .../plugins/dotnet/robocode.dotnet.iws | 418 --- .../dotnet/robocode.dotnet.nhost/.project | 11 - .../.settings/org.eclipse.jdt.core.prefs | 10 - .../dotnet/robocode.dotnet.nhost/pom.xml | 93 - .../robocode.dotnet.nhost.iml | 75 - .../dotnet/robocode.dotnet.nhost/src/.gitignore | 3 - .../sf/robocode/core/ContainerBase.generated.cs | 73 - .../dotnet/host/DotNetHost.generated.cs | 129 - .../robocode/dotnet/nhost/ModuleN.generated.cs | 82 - .../repository/root/DllRootHelper.generated.cs | 117 - .../net/sf/robocode/host/IHost.generated.cs | 154 - .../sf/robocode/host/IHostManager.generated.cs | 323 -- .../proxies/IHostingRobotProxy.generated.cs | 163 - .../net/sf/robocode/io/Logger.generated.cs | 175 - .../manager/IVersionManagerBase.generated.cs | 171 - .../sf/robocode/peer/BadBehavior.generated.cs | 112 - .../sf/robocode/peer/IRobotPeer.generated.cs | 313 -- .../sf/robocode/peer/IRobotStatics.generated.cs | 171 - .../robocode/repository/IRobotItem.generated.cs | 1045 ------ .../repository/IRobotSpecItem.generated.cs | 788 ----- .../robocode/repository/RobotType.generated.cs | 196 -- .../robocode/security/HiddenAccess.generated.cs | 293 -- .../ISerializableHelper.generated.cs | 149 - .../serialization/RbSerializer.generated.cs | 1036 ------ .../exception/AbortedException.generated.cs | 78 - .../exception/DeathException.generated.cs | 78 - .../exception/DisabledException.generated.cs | 78 - .../exception/WinException.generated.cs | 78 - .../src/host/DotNetHost.cs | 50 - .../robocode.dotnet.nhost/src/host/ModuleN.cs | 79 - .../src/host/RobotStatics.cs | 312 -- .../src/host/events/EventManager.cs | 702 ---- .../src/host/events/EventQueue.cs | 53 - .../src/host/proxies/AdvancedRobotProxy.cs | 227 -- .../src/host/proxies/BasicRobotProxy.cs | 716 ---- .../src/host/proxies/GraphicsProxy.cs | 1284 ------- .../src/host/proxies/HostingRobotProxy.cs | 302 -- .../src/host/proxies/JuniorRobotProxy.cs | 121 - .../src/host/proxies/StandardRobotProxy.cs | 136 - .../src/host/proxies/TeamRobotProxy.cs | 149 - .../src/host/security/QuotaStream.cs | 117 - .../src/host/security/RobotFileSystemManager.cs | 134 - .../src/host/seed/AppDomainSeed.cs | 170 - .../src/host/seed/AppDomainShell.cs | 163 - .../src/host/seed/HostingSeed.cs | 183 - .../src/host/seed/HostingShell.cs | 88 - .../robocode.dotnet.nhost/src/io/Logger.cs | 34 - .../src/mono/reflection/CILReader.cs | 419 --- .../src/peer/BulletCommand.cs | 95 - .../src/peer/BulletStatus.cs | 80 - .../src/peer/DebugProperty.cs | 93 - .../src/peer/ExecCommands.cs | 490 --- .../src/peer/ExecResults.cs | 253 -- .../src/peer/TeamMessage.cs | 75 - .../src/repository/RobotType.cs | 44 - .../src/repository/root/DllRootHelper.cs | 84 - .../src/robocode.dotnet.nhost.csproj | 187 - .../src/serialization/RbSerializer.cs | 59 - .../src/utils/Reflection.cs | 189 - .../src/utils/Reflection.security.cs | 99 - .../dotnet/robocode.dotnet.ntests/.project | 14 - .../.settings/org.eclipse.jdt.core.prefs | 10 - .../dotnet/robocode.dotnet.ntests/pom.xml | 70 - .../robocode.dotnet.ntests.iml | 85 - .../src/AssemblyLoadTest.cs | 42 - .../robocode.dotnet.ntests/src/SimpleTest.cs | 125 - .../robocode.dotnet.ntests/src/TestBase.cs | 87 - .../src/robocode.dotnet.ntests.csproj | 108 - .../dotnet/robocode.dotnet.robotscs/.project | 10 - .../.settings/org.eclipse.jdt.core.prefs | 10 - .../dotnet/robocode.dotnet.robotscs/pom.xml | 51 - .../robocode.dotnet.robotscs.iml | 67 - ...ongNameIWouldSayTooLongMaybeEventLongerCs.cs | 22 - .../src/NoPackageShortNameCs.cs | 22 - .../src/SampleCs.csproj | 91 - .../robocode.dotnet.robotscs/src/SampleCs.sln | 20 - .../src/robocode.dotnet.robotscs.csproj | 114 - .../src/robocode/BadNamespaceCs.cs | 23 - .../src/tested/robotscs/Ahead.cs | 23 - .../src/tested/robotscs/BadFirePower.cs | 36 - .../src/tested/robotscs/BattleLost.cs | 41 - .../src/tested/robotscs/BattleWin.cs | 60 - .../src/tested/robotscs/BodyTurnRate.cs | 87 - .../src/tested/robotscs/CustomEvents.cs | 40 - .../src/tested/robotscs/DieFast.cs | 20 - .../src/tested/robotscs/EnvAttack.cs | 30 - .../src/tested/robotscs/EventPriorityFilter.cs | 37 - .../src/tested/robotscs/FairPlay.cs | 28 - .../src/tested/robotscs/FileAttack.cs | 69 - .../src/tested/robotscs/FileWriteSize.cs | 31 - .../src/tested/robotscs/FormsAttack.cs | 59 - .../src/tested/robotscs/GunHeat.cs | 24 - .../src/tested/robotscs/GunTurnRate.cs | 78 - .../src/tested/robotscs/HttpAttack.cs | 27 - .../src/tested/robotscs/InteruptibleEvent.cs | 36 - .../src/tested/robotscs/JuniorEvents.cs | 150 - .../src/tested/robotscs/MaxTurnRate.cs | 46 - .../src/tested/robotscs/MaxVelocity.cs | 75 - .../src/tested/robotscs/PrivateConstructor.cs | 18 - .../robotscs/RadarTurnRateAndSetAdjust.cs | 138 - .../src/tested/robotscs/Random.cs | 28 - .../src/tested/robotscs/RateControl.cs | 61 - .../src/tested/robotscs/ReflectionAttack.cs | 26 - .../src/tested/robotscs/RobotDeathEvents.cs | 41 - .../src/tested/robotscs/SkipTurns.cs | 88 - .../src/tested/robotscs/TestTeam.team | 7 - .../src/tested/robotscs/ThreadAttack.cs | 61 - .../TooLongNameThisIsReallyTooLongNameCs.cs | 25 - .../src/tested/robotscs/UndeadThread.cs | 64 - .../src/tested/robotscs/WatchBullets.cs | 93 - .../TooLongNamespaceCs.cs | 25 - .../dotnet/robocode.dotnet.samples/.project | 10 - .../.settings/org.eclipse.jdt.core.prefs | 8 - .../dotnet/robocode.dotnet.samples/pom.xml | 50 - .../robocode.dotnet.samples.iml | 68 - .../robocode.dotnet.samples/src/SampleCs.csproj | 91 - .../robocode.dotnet.samples/src/SampleCs.sln | 20 - .../src/SampleCs/Corners.cs | 155 - .../src/SampleCs/Crazy.cs | 107 - .../src/SampleCs/Fire.cs | 83 - .../src/SampleCs/Interactive.cs | 218 -- .../src/SampleCs/MyFirstJuniorRobot.cs | 61 - .../src/SampleCs/MyFirstRobot.cs | 50 - .../src/SampleCs/PaintingRobot.cs | 83 - .../src/SampleCs/PointD.cs | 27 - .../src/SampleCs/RamFire.cs | 98 - .../src/SampleCs/RobotColors.cs | 22 - .../src/SampleCs/SittingDuck.cs | 86 - .../src/SampleCs/SpinBot.cs | 70 - .../src/SampleCs/Target.cs | 64 - .../src/SampleCs/TrackFire.cs | 83 - .../src/SampleCs/Tracker.cs | 154 - .../src/SampleCs/VelociRobot.cs | 60 - .../src/SampleCs/Walls.cs | 95 - .../src/SampleCsSentry/BorderGuard.cs | 763 ---- .../src/SampleCsTeam/MyCsTeam.team | 7 - .../src/SampleCsTeam/MyFirstDroid.cs | 63 - .../src/SampleCsTeam/MyFirstLeader.cs | 98 - .../src/SampleFs/MyFirstRobot.fs | 23 - .../SampleFs/robocode.dotnet.samplesfs.fsproj | 57 - .../src/robocode.dotnet.samples.csproj | 93 - .../plugins/dotnet/robocode.dotnet.sln | 50 - .../dotnet/robocode.dotnet.tests/.classpath | 21 - .../dotnet/robocode.dotnet.tests/.project | 21 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../config/robocode.properties | 34 - .../dotnet/robocode.dotnet.tests/pom.xml | 71 - .../robocode.dotnet.tests.iml | 200 -- .../test/robotscs/TestCustomEvents.java | 57 - .../test/robotscs/TestDuplicatesAndScore.java | 172 - .../robocode/test/robotscs/TestEnvAttack.java | 52 - .../test/robotscs/TestEventPriorityFilter.java | 47 - .../robocode/test/robotscs/TestFileAttack.java | 59 - .../robocode/test/robotscs/TestFileWrite.java | 51 - .../test/robotscs/TestFileWriteSize.java | 90 - .../robocode/test/robotscs/TestFormsAttack.java | 53 - .../robocode/test/robotscs/TestHttpAttack.java | 48 - .../test/robotscs/TestInteruptibleEvent.java | 48 - .../sf/robocode/test/robotscs/TestJunior.java | 52 - .../net/sf/robocode/test/robotscs/TestLost.java | 61 - .../robocode/test/robotscs/TestMaxTurnRate.java | 72 - .../robocode/test/robotscs/TestMaxVelocity.java | 81 - .../sf/robocode/test/robotscs/TestNames.java | 38 - .../sf/robocode/test/robotscs/TestPosition.java | 77 - .../test/robotscs/TestPrivateConstructor.java | 55 - .../sf/robocode/test/robotscs/TestRandom.java | 53 - .../test/robotscs/TestReflectionAttack.java | 51 - .../test/robotscs/TestRobotDeathEvents.java | 42 - .../sf/robocode/test/robotscs/TestScoring.java | 84 - .../test/robotscs/TestSkippedTurns.java | 53 - .../test/robotscs/TestThreadAttack.java | 46 - .../test/robotscs/TestUndeadThread.java | 52 - .../robocode/test/robotscs/TestWatchBullet.java | 61 - .../net/sf/robocode/test/robotscs/TestWin.java | 74 - .../test/resources/config/robocode.properties | 4 - .../plugins/dotnet/tools/.gitignore | 1 - .../plugins/dotnet/tools/keys/.gitignore | 1 - .../plugins/dotnet/tools/keys/gennetkey.cmd | 9 - .../plugins/dotnet/tools/loadTools.cmd | 23 - .../proxygen/robocode.control.proxygen.xml | 56 - .../tools/proxygen/robocode.proxygen.net.xml | 28 - .../dotnet/tools/proxygen/robocode.proxygen.xml | 45 - .../workspace_robo4/plugins/testing/.gitignore | 1 - 代码/workspace_robo4/plugins/testing/mvn.cmd | 19 - 代码/workspace_robo4/plugins/testing/mvn.sh | 20 - .../plugins/testing/mvnassembly.cmd | 12 - .../plugins/testing/mvnassembly.sh | 11 - 代码/workspace_robo4/plugins/testing/pom.xml | 21 - .../testing/robocode.testing.api/.classpath | 9 - .../testing/robocode.testing.api/.project | 14 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../testing/robocode.testing.api/pom.xml | 59 - .../robocode.testing.api.iml | 88 - .../robocode/control/testing/RobotTestBed.java | 329 -- .../control/testing/RobotTestBedAssert.java | 32 - .../java/robocode/control/testing/package.html | 12 - .../testing/robocode.testing.content/.classpath | 7 - .../testing/robocode.testing.content/.project | 16 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../testing/robocode.testing.content/pom.xml | 33 - .../robocode.testing.content.iml | 67 - .../src/main/resources/testing/Read.Me.txt | 33 - .../src/main/resources/testing/compile.cmd | 10 - .../src/main/resources/testing/test.cmd | 10 - .../robocode.testing.distribution/.classpath | 12 - .../robocode.testing.distribution/.project | 19 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../robocode.testing.distribution/pom.xml | 72 - .../robocode.testing.distribution.iml | 90 - .../testing-setup.asm.xml | 79 - .../plugins/testing/robocode.testing.iml | 65 - .../robocode.testing.installer/.classpath | 6 - .../testing/robocode.testing.installer/.project | 14 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../testing/robocode.testing.installer/pom.xml | 27 - .../robocode.testing.installer.iml | 67 - .../net/sf/robocode/installer/AutoExtract.java | 389 --- .../plugins/testing/robocode.testing.ipr | 112 - .../plugins/testing/robocode.testing.iws | 418 --- .../testing/robocode.testing.samples/.classpath | 13 - .../testing/robocode.testing.samples/.project | 16 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../testing/robocode.testing.samples/pom.xml | 65 - .../robocode.testing.samples.iml | 110 - .../src/main/java/sample/TestWallBehavior.java | 104 - 代码/workspace_robo4/pom.xml | 61 - 代码/workspace_robo4/robocode.api/.classpath | 6 - .../Launch Dir Builder.launch | 21 - 代码/workspace_robo4/robocode.api/.gitignore | 1 - 代码/workspace_robo4/robocode.api/.project | 26 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../robocode.api/Robocode.launch | 30 - 代码/workspace_robo4/robocode.api/pom.xml | 60 - .../robocode.api/robocode.api.iml | 67 - .../src/main/java/gl4java/GLFont.java | 16 - .../src/main/java/gl4java/GLFunc.java | 16 - .../main/java/net/sf/robocode/api/Module.java | 54 - .../sf/robocode/battle/IBattleManagerBase.java | 28 - .../net/sf/robocode/core/ContainerBase.java | 22 - .../main/java/net/sf/robocode/core/IModule.java | 19 - .../net/sf/robocode/gui/IWindowManagerBase.java | 16 - .../main/java/net/sf/robocode/io/FileUtil.java | 352 -- .../main/java/net/sf/robocode/io/Logger.java | 109 - .../net/sf/robocode/io/RobocodeProperties.java | 79 - .../robocode/manager/IVersionManagerBase.java | 19 - .../net/sf/robocode/peer/IRobotStatics.java | 22 - .../robocode/repository/CodeSizeCalculator.java | 55 - .../repository/IRepositoryManagerBase.java | 21 - .../net/sf/robocode/security/HiddenAccess.java | 290 -- .../robocode/security/IHiddenBulletHelper.java | 19 - .../robocode/security/IHiddenEventHelper.java | 28 - .../robocode/security/IHiddenRulesHelper.java | 19 - .../security/IHiddenSpecificationHelper.java | 23 - .../robocode/security/IHiddenStatusHelper.java | 22 - .../robocode/security/IThreadManagerBase.java | 21 - .../net/sf/robocode/security/SafeComponent.java | 28 - .../serialization/ISerializableHelper.java | 21 - .../sf/robocode/serialization/RbSerializer.java | 539 --- .../java/net/sf/robocode/util/StringUtil.java | 61 - .../main/java/net/sf/robocode/util/UrlUtil.java | 35 - .../src/main/java/robocode/AdvancedRobot.java | 2027 ----------- .../main/java/robocode/BattleEndedEvent.java | 144 - .../src/main/java/robocode/BattleResults.java | 282 -- .../src/main/java/robocode/BattleRules.java | 148 - .../src/main/java/robocode/BorderSentry.java | 35 - .../src/main/java/robocode/Bullet.java | 261 -- .../java/robocode/BulletHitBulletEvent.java | 120 - .../src/main/java/robocode/BulletHitEvent.java | 161 - .../main/java/robocode/BulletMissedEvent.java | 102 - .../src/main/java/robocode/Condition.java | 147 - .../src/main/java/robocode/CustomEvent.java | 143 - .../src/main/java/robocode/DeathEvent.java | 98 - .../src/main/java/robocode/Droid.java | 24 - .../src/main/java/robocode/Event.java | 266 -- .../java/robocode/GunTurnCompleteCondition.java | 70 - .../main/java/robocode/HitByBulletEvent.java | 205 -- .../src/main/java/robocode/HitRobotEvent.java | 209 -- .../src/main/java/robocode/HitWallEvent.java | 122 - .../src/main/java/robocode/JuniorRobot.java | 907 ----- .../src/main/java/robocode/KeyEvent.java | 44 - .../src/main/java/robocode/KeyPressedEvent.java | 114 - .../main/java/robocode/KeyReleasedEvent.java | 114 - .../src/main/java/robocode/KeyTypedEvent.java | 114 - .../src/main/java/robocode/MessageEvent.java | 92 - .../main/java/robocode/MouseClickedEvent.java | 120 - .../main/java/robocode/MouseDraggedEvent.java | 121 - .../main/java/robocode/MouseEnteredEvent.java | 120 - .../src/main/java/robocode/MouseEvent.java | 43 - .../main/java/robocode/MouseExitedEvent.java | 120 - .../src/main/java/robocode/MouseMovedEvent.java | 120 - .../main/java/robocode/MousePressedEvent.java | 120 - .../main/java/robocode/MouseReleasedEvent.java | 120 - .../java/robocode/MouseWheelMovedEvent.java | 124 - .../java/robocode/MoveCompleteCondition.java | 70 - .../src/main/java/robocode/PaintEvent.java | 69 - .../robocode/RadarTurnCompleteCondition.java | 70 - .../main/java/robocode/RateControlRobot.java | 450 --- .../src/main/java/robocode/Robocode.java | 29 - .../java/robocode/RobocodeFileOutputStream.java | 157 - .../main/java/robocode/RobocodeFileWriter.java | 85 - .../src/main/java/robocode/Robot.java | 1550 --------- .../src/main/java/robocode/RobotDeathEvent.java | 113 - .../src/main/java/robocode/RobotStatus.java | 426 --- .../src/main/java/robocode/RoundEndedEvent.java | 152 - .../src/main/java/robocode/Rules.java | 229 -- .../main/java/robocode/ScannedRobotEvent.java | 314 -- .../main/java/robocode/SkippedTurnEvent.java | 150 - .../src/main/java/robocode/StatusEvent.java | 81 - .../src/main/java/robocode/TeamRobot.java | 73 - .../java/robocode/TurnCompleteCondition.java | 70 - .../src/main/java/robocode/WinEvent.java | 98 - .../java/robocode/_AdvancedRadiansRobot.java | 179 - .../src/main/java/robocode/_AdvancedRobot.java | 273 -- .../src/main/java/robocode/_Robot.java | 149 - .../src/main/java/robocode/_RobotBase.java | 92 - .../java/robocode/annotation/SafeStatic.java | 26 - .../java/robocode/annotation/package-info.java | 12 - .../robocode/control/BattleSpecification.java | 234 -- .../control/BattlefieldSpecification.java | 71 - .../java/robocode/control/IRobocodeEngine.java | 150 - .../java/robocode/control/RandomFactory.java | 119 - .../java/robocode/control/RobocodeEngine.java | 364 -- .../java/robocode/control/RobocodeListener.java | 64 - .../java/robocode/control/RobotResults.java | 188 - .../main/java/robocode/control/RobotSetup.java | 62 - .../robocode/control/RobotSpecification.java | 178 - .../robocode/control/events/BattleAdaptor.java | 101 - .../control/events/BattleCompletedEvent.java | 89 - .../control/events/BattleErrorEvent.java | 45 - .../robocode/control/events/BattleEvent.java | 27 - .../control/events/BattleFinishedEvent.java | 49 - .../control/events/BattleMessageEvent.java | 45 - .../control/events/BattlePausedEvent.java | 32 - .../control/events/BattleResumedEvent.java | 32 - .../control/events/BattleStartedEvent.java | 74 - .../control/events/IBattleListener.java | 163 - .../control/events/RoundEndedEvent.java | 75 - .../control/events/RoundStartedEvent.java | 61 - .../robocode/control/events/TurnEndedEvent.java | 48 - .../control/events/TurnStartedEvent.java | 32 - .../robocode/control/events/package-info.java | 13 - .../java/robocode/control/package-info.java | 105 - .../robocode/control/snapshot/BulletState.java | 101 - .../control/snapshot/IBulletSnapshot.java | 131 - .../control/snapshot/IDebugProperty.java | 33 - .../control/snapshot/IRobotSnapshot.java | 242 -- .../control/snapshot/IScoreSnapshot.java | 146 - .../control/snapshot/ITurnSnapshot.java | 75 - .../robocode/control/snapshot/RobotState.java | 122 - .../robocode/control/snapshot/package-info.java | 12 - .../robocode/exception/AbortedException.java | 28 - .../java/robocode/exception/DeathException.java | 26 - .../robocode/exception/DisabledException.java | 24 - .../exception/EventInterruptedException.java | 26 - .../java/robocode/exception/RobotException.java | 24 - .../java/robocode/exception/WinException.java | 24 - .../java/robocode/exception/package-info.java | 12 - .../src/main/java/robocode/package-info.java | 12 - .../java/robocode/robocodeGL/EllipseGL.java | 50 - .../main/java/robocode/robocodeGL/LabelGL.java | 25 - .../main/java/robocode/robocodeGL/LineGL.java | 42 - .../main/java/robocode/robocodeGL/PointGL.java | 37 - .../java/robocode/robocodeGL/RectangleGL.java | 49 - .../java/robocode/robocodeGL/RenderElement.java | 47 - .../robocode/robocodeGL/system/GLRenderer.java | 26 - .../robotinterfaces/IAdvancedEvents.java | 60 - .../robotinterfaces/IAdvancedRobot.java | 40 - .../robocode/robotinterfaces/IBasicEvents.java | 278 -- .../robocode/robotinterfaces/IBasicEvents2.java | 46 - .../robocode/robotinterfaces/IBasicEvents3.java | 45 - .../robocode/robotinterfaces/IBasicRobot.java | 77 - .../robotinterfaces/IInteractiveEvents.java | 223 -- .../robotinterfaces/IInteractiveRobot.java | 44 - .../robocode/robotinterfaces/IJuniorRobot.java | 40 - .../robocode/robotinterfaces/IPaintEvents.java | 53 - .../robocode/robotinterfaces/IPaintRobot.java | 31 - .../robocode/robotinterfaces/ITeamEvents.java | 27 - .../robocode/robotinterfaces/ITeamRobot.java | 40 - .../robocode/robotinterfaces/package-info.java | 12 - .../peer/IAdvancedRobotPeer.java | 751 ---- .../robotinterfaces/peer/IBasicRobotPeer.java | 738 ---- .../robotinterfaces/peer/IJuniorRobotPeer.java | 67 - .../peer/IStandardRobotPeer.java | 205 -- .../robotinterfaces/peer/ITeamRobotPeer.java | 47 - .../robotinterfaces/peer/package-info.java | 12 - .../src/main/java/robocode/util/Utils.java | 178 - .../main/java/robocode/util/package-info.java | 13 - .../workspace_robo4/robocode.battle/.classpath | 12 - 代码/workspace_robo4/robocode.battle/.project | 19 - .../.settings/org.eclipse.jdt.core.prefs | 9 - 代码/workspace_robo4/robocode.battle/pom.xml | 35 - .../robocode.battle/robocode.battle.iml | 85 - .../java/net/sf/robocode/battle/BaseBattle.java | 475 --- .../java/net/sf/robocode/battle/Battle.java | 886 ----- .../net/sf/robocode/battle/BattleManager.java | 404 --- .../sf/robocode/battle/BoundingRectangle.java | 62 - .../java/net/sf/robocode/battle/Command.java | 14 - .../java/net/sf/robocode/battle/IBattle.java | 32 - .../java/net/sf/robocode/battle/Module.java | 30 - .../net/sf/robocode/battle/peer/BulletPeer.java | 364 -- .../sf/robocode/battle/peer/ContestantPeer.java | 24 - .../battle/peer/ContestantStatistics.java | 57 - .../sf/robocode/battle/peer/ExplosionPeer.java | 52 - .../robocode/battle/peer/IRobotPeerBattle.java | 70 - .../net/sf/robocode/battle/peer/RobotPeer.java | 1764 ---------- .../robocode/battle/peer/RobotStatistics.java | 298 -- .../net/sf/robocode/battle/peer/TeamPeer.java | 94 - .../sf/robocode/battle/peer/TeamStatistics.java | 191 - .../battle/snapshot/BulletSnapshot.java | 360 -- .../robocode/battle/snapshot/RobotSnapshot.java | 729 ---- .../robocode/battle/snapshot/ScoreSnapshot.java | 562 --- .../robocode/battle/snapshot/TurnSnapshot.java | 297 -- .../net/sf/robocode/recording/BattlePlayer.java | 149 - .../sf/robocode/recording/BattleRecordInfo.java | 330 -- .../sf/robocode/recording/BattleRecorder.java | 142 - .../sf/robocode/recording/RecordManager.java | 448 --- .../workspace_robo4/robocode.content/.classpath | 7 - .../workspace_robo4/robocode.content/.project | 18 - .../.settings/org.eclipse.jdt.core.prefs | 9 - 代码/workspace_robo4/robocode.content/pom.xml | 62 - .../robocode.content/robocode.content.iml | 67 - .../src/main/resources/ReadMe.html | 233 -- .../src/main/resources/ReadMe.txt | 471 --- .../src/main/resources/battles/intro.battle | 8 - .../src/main/resources/battles/sample.battle | 8 - .../main/resources/compilers/CompilerTest.java | 12 - .../src/main/resources/desktop/robocode.png | Bin 3918 -> 0 bytes .../desktop/robocodeMeleeRumble.desktop | 9 - .../desktop/robocodeRoboRumble.desktop | 9 - .../resources/desktop/robocodeRobocode.desktop | 9 - .../desktop/robocodeTeamRumble.desktop | 9 - .../resources/desktop/robocodeTwinDuel.desktop | 9 - .../src/main/resources/desktop/roborumble.png | Bin 3401 -> 0 bytes .../src/main/resources/license/epl-v10.html | 188 - .../src/main/resources/meleerumble.bat | 9 - .../src/main/resources/meleerumble.command | 13 - .../src/main/resources/meleerumble.sh | 13 - .../src/main/resources/robocode.bat | 9 - .../src/main/resources/robocode.command | 13 - .../src/main/resources/robocode.ico | Bin 370070 -> 0 bytes .../src/main/resources/robocode.sh | 13 - .../src/main/resources/roborumble.bat | 9 - .../src/main/resources/roborumble.command | 13 - .../src/main/resources/roborumble.ico | Bin 32038 -> 0 bytes .../src/main/resources/roborumble.sh | 13 - .../main/resources/roborumble/meleerumble.txt | 244 -- .../resources/roborumble/roborumble.properties | 6 - .../main/resources/roborumble/roborumble.txt | 241 -- .../main/resources/roborumble/teamrumble.txt | 203 -- .../src/main/resources/roborumble/twinduel.txt | 203 -- .../src/main/resources/teamrumble.bat | 9 - .../src/main/resources/teamrumble.command | 13 - .../src/main/resources/teamrumble.sh | 13 - .../main/resources/templates/newjavafile.tpt | 8 - .../main/resources/templates/newjuniorrobot.tpt | 54 - .../src/main/resources/templates/newrobot.tpt | 56 - .../editor/Robocode Black Theme.properties | 23 - .../editor/Robocode White Theme.properties | 23 - .../src/main/resources/twinduel.bat | 9 - .../src/main/resources/twinduel.command | 13 - .../src/main/resources/twinduel.sh | 13 - 代码/workspace_robo4/robocode.core/.classpath | 12 - 代码/workspace_robo4/robocode.core/.project | 16 - .../.settings/org.eclipse.jdt.core.prefs | 9 - 代码/workspace_robo4/robocode.core/pom.xml | 61 - .../robocode.core/robocode.core.iml | 91 - .../sf/robocode/battle/BattleProperties.java | 333 -- .../battle/BattleRankingTableModel.java | 199 -- .../battle/BattleResultsTableModel.java | 253 -- .../net/sf/robocode/battle/IBattleManager.java | 94 - .../battle/events/BattleEventDispatcher.java | 154 - .../sf/robocode/cachecleaner/CacheCleaner.java | 73 - .../java/net/sf/robocode/core/BaseModule.java | 19 - .../java/net/sf/robocode/core/Container.java | 257 -- .../net/sf/robocode/core/EngineClassLoader.java | 97 - .../main/java/net/sf/robocode/core/Module.java | 42 - .../java/net/sf/robocode/core/RobocodeMain.java | 414 --- .../net/sf/robocode/core/RobocodeMainBase.java | 92 - .../java/net/sf/robocode/host/ICpuManager.java | 18 - .../java/net/sf/robocode/host/IHostManager.java | 43 - .../net/sf/robocode/host/IRobotClassLoader.java | 23 - .../java/net/sf/robocode/host/RobotStatics.java | 319 -- .../main/java/net/sf/robocode/io/JarJar.java | 17 - .../net/sf/robocode/io/URLJarCollector.java | 176 - .../java/net/sf/robocode/peer/BadBehavior.java | 19 - .../net/sf/robocode/peer/BulletCommand.java | 80 - .../java/net/sf/robocode/peer/BulletStatus.java | 71 - .../net/sf/robocode/peer/DebugProperty.java | 106 - .../java/net/sf/robocode/peer/ExecCommands.java | 428 --- .../java/net/sf/robocode/peer/ExecResults.java | 177 - .../java/net/sf/robocode/peer/IRobotPeer.java | 39 - .../java/net/sf/robocode/peer/TeamMessage.java | 66 - .../robocode/recording/BattleRecordFormat.java | 19 - .../sf/robocode/recording/IRecordManager.java | 29 - .../robocode/repository/CodeSizeCalculator.java | 55 - .../robocode/repository/IRepositoryManager.java | 56 - .../net/sf/robocode/repository/IRobotItem.java | 35 - .../sf/robocode/repository/IRobotSpecItem.java | 76 - .../sf/robocode/repository/RobotProperties.java | 84 - .../net/sf/robocode/repository/RobotType.java | 137 - .../sf/robocode/repository/TeamProperties.java | 66 - .../robotpaint/Graphics2DSerialized.java | 2340 ------------- .../sf/robocode/robotpaint/IGraphicsProxy.java | 24 - .../serialization/IXmlSerializable.java | 21 - .../serialization/SerializableOptions.java | 44 - .../sf/robocode/serialization/XmlReader.java | 189 - .../sf/robocode/serialization/XmlWriter.java | 142 - .../sf/robocode/settings/ISettingsListener.java | 16 - .../sf/robocode/settings/ISettingsManager.java | 317 -- .../sf/robocode/settings/SettingsManager.java | 896 ----- .../net/sf/robocode/sound/ISoundManager.java | 18 - .../java/net/sf/robocode/ui/IWindowManager.java | 55 - .../robocode/util/AlphanumericComparator.java | 197 -- .../sf/robocode/version/IVersionManager.java | 20 - .../java/net/sf/robocode/version/Version.java | 178 - .../net/sf/robocode/version/VersionManager.java | 224 -- .../src/main/resources/battleRecord.xsd | 193 -- .../src/main/resources/battleRecordS.xsd | 193 -- .../sf/robocode/serialization/ObjectCloner.java | 90 - .../serialization/RbSerializerTest.java | 261 -- .../net/sf/robocode/version/VersionTest.java | 135 - .../robocode.distribution/.classpath | 19 - .../robocode.distribution/.project | 27 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../robocode.distribution/pom.xml | 73 - .../robocode.distribution.iml | 91 - .../robocode.distribution/setup.asm.xml | 96 - .../robocode.distribution/src.asm.xml | 53 - 代码/workspace_robo4/robocode.dummy.zip | Bin 3658 -> 0 bytes 代码/workspace_robo4/robocode.host/.classpath | 13 - 代码/workspace_robo4/robocode.host/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 9 - 代码/workspace_robo4/robocode.host/pom.xml | 31 - .../robocode.host/robocode.host.iml | 93 - .../java/net/sf/robocode/host/CpuManager.java | 86 - .../java/net/sf/robocode/host/HostManager.java | 106 - .../main/java/net/sf/robocode/host/IHost.java | 26 - .../net/sf/robocode/host/IHostedThread.java | 32 - .../net/sf/robocode/host/IThreadManager.java | 43 - .../java/net/sf/robocode/host/JavaHost.java | 192 - .../main/java/net/sf/robocode/host/Module.java | 26 - .../sf/robocode/host/events/EventManager.java | 572 --- .../net/sf/robocode/host/events/EventQueue.java | 53 - .../sf/robocode/host/events/IEventManager.java | 50 - .../host/io/BufferedPipedInputStream.java | 40 - .../host/io/BufferedPipedOutputStream.java | 169 - .../robocode/host/io/RobotFileOutputStream.java | 75 - .../host/io/RobotFileSystemManager.java | 336 -- .../sf/robocode/host/io/RobotOutputStream.java | 294 -- .../host/jarjar/JarJarURLConnection.java | 182 - .../host/proxies/AdvancedRobotProxy.java | 216 -- .../robocode/host/proxies/BasicRobotProxy.java | 567 --- .../host/proxies/HostingRobotProxy.java | 306 -- .../host/proxies/IHostingRobotProxy.java | 28 - .../robocode/host/proxies/JuniorRobotProxy.java | 114 - .../host/proxies/StandardRobotProxy.java | 103 - .../robocode/host/proxies/TeamRobotProxy.java | 126 - .../robocode/host/security/ClassAnalyzer.java | 248 -- .../host/security/RobocodePermission.java | 100 - .../host/security/RobocodeSecurityManager.java | 128 - .../host/security/RobocodeSecurityPolicy.java | 322 -- .../host/security/RobotClassLoader.java | 424 --- .../host/security/RobotThreadManager.java | 343 -- .../host/security/SecureInputStream.java | 103 - .../host/security/SecurePrintStream.java | 293 -- .../robocode/host/security/ThreadManager.java | 213 -- .../RobocodeObjectInputStream.java | 40 - .../net/sf/robocode/host/jarjar/JarJarTest.java | 72 - .../robocode.host/src/test/resources/Outer.jar | Bin 611 -> 0 bytes 代码/workspace_robo4/robocode.iml | 65 - .../robocode.installer/.classpath | 6 - .../workspace_robo4/robocode.installer/.project | 14 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../workspace_robo4/robocode.installer/pom.xml | 27 - .../robocode.installer/robocode.installer.iml | 67 - .../net/sf/robocode/installer/AutoExtract.java | 705 ---- 代码/workspace_robo4/robocode.ipr | 122 - 代码/workspace_robo4/robocode.iws | 418 --- .../robocode.repository/.classpath | 10 - .../robocode.repository/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../workspace_robo4/robocode.repository/pom.xml | 29 - .../robocode.repository/robocode.repository.iml | 83 - .../net/sf/robocode/repository/IRepository.java | 105 - .../java/net/sf/robocode/repository/Module.java | 38 - .../net/sf/robocode/repository/Repository.java | 199 -- .../robocode/repository/RepositoryManager.java | 480 --- .../repository/items/IRepositoryItem.java | 38 - .../repository/items/RepositoryItem.java | 77 - .../sf/robocode/repository/items/RobotItem.java | 608 ---- .../repository/items/RobotSpecItem.java | 259 -- .../sf/robocode/repository/items/TeamItem.java | 258 -- .../repository/items/handlers/ClassHandler.java | 74 - .../repository/items/handlers/ItemHandler.java | 60 - .../items/handlers/PropertiesHandler.java | 104 - .../items/handlers/SourceHandler.java | 87 - .../repository/items/handlers/TeamHandler.java | 70 - .../repository/packager/JarCreator.java | 267 -- .../repository/packager/JarExtractor.java | 92 - .../repository/parsers/ClasspathFileParser.java | 63 - .../sf/robocode/repository/root/BaseRoot.java | 78 - .../robocode/repository/root/ClasspathRoot.java | 138 - .../repository/root/IRepositoryRoot.java | 38 - .../sf/robocode/repository/root/JarRoot.java | 177 - .../root/handlers/ClassPathHandler.java | 85 - .../repository/root/handlers/JarHandler.java | 70 - .../repository/root/handlers/RootHandler.java | 52 - .../robocode.roborumble/.classpath | 13 - .../robocode.roborumble/.project | 20 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../robocode.roborumble/MeleeRumble.launch | 20 - .../robocode.roborumble/RoboRumble.launch | 20 - .../robocode.roborumble/TeamRumble.launch | 20 - .../workspace_robo4/robocode.roborumble/pom.xml | 51 - .../robocode.roborumble/robocode.roborumble.iml | 86 - .../roborumble/battlesengine/BattlesRunner.java | 235 -- .../battlesengine/CompetitionsSelector.java | 77 - .../battlesengine/PrepareBattles.java | 579 ---- .../roborumble/netengine/BotsDownload.java | 625 ---- .../roborumble/netengine/FileTransfer.java | 657 ---- .../roborumble/netengine/ResultsUpload.java | 328 -- .../roborumble/netengine/UpdateRatingFiles.java | 130 - .../robocode/roborumble/util/ExcludesUtil.java | 80 - .../roborumble/util/PropertiesUtil.java | 102 - .../main/java/roborumble/RoboRumbleAtHome.java | 152 - .../workspace_robo4/robocode.samples/.classpath | 8 - .../workspace_robo4/robocode.samples/.project | 16 - .../.settings/org.eclipse.jdt.core.prefs | 9 - 代码/workspace_robo4/robocode.samples/pom.xml | 45 - .../robocode.samples/robocode.samples.iml | 69 - .../src/main/java/sample/Corners.java | 140 - .../src/main/java/sample/Crazy.java | 103 - .../src/main/java/sample/Fire.java | 84 - .../src/main/java/sample/Interactive.java | 223 -- .../src/main/java/sample/Interactive_v2.java | 263 -- .../main/java/sample/MyFirstJuniorRobot.java | 60 - .../src/main/java/sample/MyFirstRobot.java | 53 - .../src/main/java/sample/PaintingRobot.java | 87 - .../src/main/java/sample/RamFire.java | 86 - .../src/main/java/sample/SittingDuck.html | 24 - .../src/main/java/sample/SittingDuck.java | 96 - .../src/main/java/sample/SpinBot.java | 70 - .../src/main/java/sample/Target.java | 65 - .../src/main/java/sample/TrackFire.java | 80 - .../src/main/java/sample/Tracker.java | 144 - .../src/main/java/sample/VelociRobot.java | 59 - .../src/main/java/sample/Walls.java | 94 - .../src/main/java/sampleex/Alien.java | 82 - .../main/java/sampleex/AlienComposition.java | 95 - .../src/main/java/sampleex/MasterAndSlave.java | 115 - .../main/java/sampleex/ProxyOfGreyEminence.java | 73 - .../src/main/java/sampleex/RegullarMonk.java | 17 - .../src/main/java/sampleex/Slave.java | 40 - .../src/main/java/samplesentry/BorderGuard.java | 716 ---- .../src/main/java/sampleteam/MyFirstDroid.java | 62 - .../src/main/java/sampleteam/MyFirstLeader.java | 89 - .../src/main/java/sampleteam/Point.java | 33 - .../src/main/java/sampleteam/RobotColors.java | 29 - .../main/resources/sample/Corners.properties | 9 - .../src/main/resources/sample/Crazy.properties | 9 - .../src/main/resources/sample/Fire.properties | 9 - .../resources/sample/Interactive.properties | 9 - .../resources/sample/Interactive_v2.properties | 8 - .../sample/MyFirstJuniorRobot.properties | 9 - .../resources/sample/MyFirstRobot.properties | 9 - .../resources/sample/PaintingRobot.properties | 10 - .../main/resources/sample/RamFire.properties | 9 - .../resources/sample/SittingDuck.properties | 9 - .../main/resources/sample/SpinBot.properties | 9 - .../src/main/resources/sample/Target.properties | 9 - .../main/resources/sample/TrackFire.properties | 9 - .../main/resources/sample/Tracker.properties | 9 - .../resources/sample/VelociRobot.properties | 9 - .../src/main/resources/sample/Walls.properties | 9 - .../main/resources/sampleex/Alien.properties | 9 - .../sampleex/MasterAndSlave.properties | 9 - .../sampleex/ProxyOfGreyEminence.properties | 9 - .../samplesentry/BorderGuard.properties | 9 - .../main/resources/sampleteam/MyFirstTeam.team | 7 - .../workspace_robo4/robocode.sound/.classpath | 10 - 代码/workspace_robo4/robocode.sound/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 9 - 代码/workspace_robo4/robocode.sound/pom.xml | 19 - .../robocode.sound/robocode.sound.iml | 77 - .../main/java/net/sf/robocode/sound/Module.java | 22 - .../java/net/sf/robocode/sound/SoundCache.java | 219 -- .../net/sf/robocode/sound/SoundManager.java | 376 -- .../sound/sounds/13831_adcbicycle_22.wav | Bin 74240 -> 0 bytes .../net/sf/robocode/sound/sounds/explode.wav | Bin 23160 -> 0 bytes .../net/sf/robocode/sound/sounds/shellhit.wav | Bin 46496 -> 0 bytes .../net/sf/robocode/sound/sounds/zap.wav | Bin 18076 -> 0 bytes .../robocode.tests.robots/.classpath | 9 - .../robocode.tests.robots/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../robocode.tests.robots/pom.xml | 45 - .../robocode.tests.robots.iml | 70 - ...ongNameIWouldSayTooLongMaybeEventLonger.java | 24 - .../src/main/java/NoPackageShortName.java | 24 - .../src/main/java/robocode/BadNamespace.java | 24 - .../src/main/java/tested/robots/Ahead.java | 23 - .../src/main/java/tested/robots/AwtAttack.java | 84 - .../main/java/tested/robots/BadFirePower.java | 34 - .../src/main/java/tested/robots/BattleLost.java | 45 - .../src/main/java/tested/robots/BattleWin.java | 59 - .../main/java/tested/robots/BodyTurnRate.java | 75 - .../tested/robots/ConstructorAwtAttack.java | 68 - .../tested/robots/ConstructorHttpAttack.java | 40 - .../robots/ConstructorReflectionAttack.java | 49 - .../tested/robots/ConstructorSocketAttack.java | 62 - .../tested/robots/ConstructorThreadAttack.java | 61 - .../main/java/tested/robots/CustomEvents.java | 56 - .../java/tested/robots/DecelerationCaveat1.java | 35 - .../java/tested/robots/DecelerationCaveat2.java | 35 - .../java/tested/robots/DecelerationCaveat3.java | 34 - .../src/main/java/tested/robots/DieFast.java | 22 - .../src/main/java/tested/robots/EnvAttack.java | 32 - .../java/tested/robots/EventPriorityFilter.java | 40 - .../src/main/java/tested/robots/FairPlay.java | 28 - .../src/main/java/tested/robots/FileAttack.java | 81 - .../tested/robots/FileOutputStreamAttack.java | 42 - .../main/java/tested/robots/FileWriteSize.java | 58 - .../src/main/java/tested/robots/GunHeat.java | 27 - .../main/java/tested/robots/GunTurnRate.java | 70 - .../src/main/java/tested/robots/HttpAttack.java | 40 - .../tested/robots/IncludeNamespaceAttack.java | 45 - .../java/tested/robots/InteruptibleEvent.java | 46 - .../main/java/tested/robots/JuniorEvents.java | 135 - .../main/java/tested/robots/MaxTurnRate.java | 41 - .../main/java/tested/robots/MaxVelocity.java | 72 - .../java/tested/robots/PrivateConstructor.java | 20 - .../robots/RadarTurnRateAndSetAdjust.java | 134 - .../src/main/java/tested/robots/Random.java | 30 - .../main/java/tested/robots/RateControl.java | 46 - .../java/tested/robots/ReflectionAttack.java | 34 - .../java/tested/robots/ReverseDirection.java | 30 - .../java/tested/robots/RobotDeathEvents.java | 40 - .../src/main/java/tested/robots/SkipTurns.java | 80 - .../main/java/tested/robots/SocketAttack.java | 49 - .../main/java/tested/robots/ThreadAttack.java | 87 - .../java/tested/robots/ThreadGroupAttack.java | 71 - .../TooLongNameThisIsReallyTooLongName.java | 27 - .../main/java/tested/robots/UndeadThread.java | 44 - .../main/java/tested/robots/WatchBullets.java | 71 - .../TooLongNamespace.java | 27 - .../main/resources/tested/robots/TestTeam.team | 7 - .../workspace_robo4/robocode.tests/.classpath | 18 - 代码/workspace_robo4/robocode.tests/.project | 22 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../robocode.tests/config/robocode.properties | 3 - 代码/workspace_robo4/robocode.tests/pom.xml | 59 - .../robocode.tests/robocode.tests.iml | 103 - .../net/sf/robocode/test/helpers/Assert.java | 38 - .../robocode/test/helpers/RobocodeTestBed.java | 209 -- .../core/util/AlphanumericComparatorTest.java | 60 - .../host/security/RobotClassLoaderTest.java | 84 - .../robocode/test/robots/TestAcceleration.java | 197 -- .../sf/robocode/test/robots/TestAwtAttack.java | 82 - .../robocode/test/robots/TestBodyTurnRate.java | 128 - .../robocode/test/robots/TestBulletPower.java | 59 - .../test/robots/TestConstructorAwtAttack.java | 76 - .../test/robots/TestConstructorHttpAttack.java | 55 - .../robots/TestConstructorReflectionAttack.java | 49 - .../robots/TestConstructorSocketAttack.java | 55 - .../robots/TestConstructorThreadAttack.java | 41 - .../robocode/test/robots/TestCustomEvents.java | 56 - .../test/robots/TestDuplicatesAndScore.java | 159 - .../sf/robocode/test/robots/TestEnvAttack.java | 52 - .../test/robots/TestEventPriorityFilter.java | 47 - .../sf/robocode/test/robots/TestFairPlay.java | 66 - .../sf/robocode/test/robots/TestFileAttack.java | 74 - .../test/robots/TestFileOutputStreamAttack.java | 49 - .../sf/robocode/test/robots/TestFileWrite.java | 51 - .../robocode/test/robots/TestFileWriteSize.java | 70 - .../sf/robocode/test/robots/TestGunHeat.java | 90 - .../robocode/test/robots/TestGunTurnRate.java | 61 - .../sf/robocode/test/robots/TestHttpAttack.java | 49 - .../test/robots/TestIncludeNamespaceAttack.java | 38 - .../test/robots/TestInteruptibleEvent.java | 48 - .../net/sf/robocode/test/robots/TestJunior.java | 52 - .../net/sf/robocode/test/robots/TestLost.java | 61 - .../robocode/test/robots/TestMaxTurnRate.java | 72 - .../robocode/test/robots/TestMaxVelocity.java | 81 - .../net/sf/robocode/test/robots/TestNames.java | 38 - .../sf/robocode/test/robots/TestPosition.java | 78 - .../test/robots/TestPrivateConstructor.java | 54 - .../robots/TestRadarTurnRateAndSetAdjust.java | 59 - .../net/sf/robocode/test/robots/TestRandom.java | 53 - .../robots/TestRankingsWithTargetRobots.java | 70 - .../robocode/test/robots/TestRateControl.java | 121 - .../test/robots/TestReflectionAttack.java | 49 - .../test/robots/TestReverseDirection.java | 50 - .../test/robots/TestRobotDeathEvents.java | 42 - .../sf/robocode/test/robots/TestScoring.java | 83 - .../robocode/test/robots/TestSkippedTurns.java | 53 - .../robocode/test/robots/TestSocketAttack.java | 49 - .../robocode/test/robots/TestThreadAttack.java | 55 - .../test/robots/TestThreadGroupAttack.java | 59 - .../robocode/test/robots/TestUndeadThread.java | 59 - .../robocode/test/robots/TestWatchBullet.java | 50 - .../net/sf/robocode/test/robots/TestWin.java | 88 - .../robocode/test/samples/RobocodeRunner.java | 91 - .../robocode.ui.editor/.classpath | 15 - .../workspace_robo4/robocode.ui.editor/.project | 22 - .../.settings/org.eclipse.jdt.core.prefs | 9 - .../workspace_robo4/robocode.ui.editor/pom.xml | 19 - .../robocode.ui.editor/robocode.ui.editor.iml | 88 - .../ui/editor/CompilerPreferencesDialog.java | 171 - .../robocode/ui/editor/CompilerProperties.java | 138 - .../robocode/ui/editor/CompoundUndoManager.java | 147 - .../net/sf/robocode/ui/editor/EditWindow.java | 485 --- .../net/sf/robocode/ui/editor/EditorPane.java | 374 -- .../net/sf/robocode/ui/editor/EditorPanel.java | 181 - .../ui/editor/EditorThemeConfigDialog.java | 978 ------ .../robocode/ui/editor/FindReplaceDialog.java | 386 --- .../net/sf/robocode/ui/editor/FontStyle.java | 68 - .../robocode/ui/editor/IEditorProperties.java | 21 - .../net/sf/robocode/ui/editor/JavaDocument.java | 1137 ------ .../sf/robocode/ui/editor/LineHighlighter.java | 141 - .../sf/robocode/ui/editor/LineNumberArea.java | 137 - .../java/net/sf/robocode/ui/editor/Module.java | 23 - .../robocode/ui/editor/MoreWindowsDialog.java | 138 - .../sf/robocode/ui/editor/RobocodeCompiler.java | 112 - .../ui/editor/RobocodeCompilerFactory.java | 219 -- .../sf/robocode/ui/editor/RobocodeEditor.java | 664 ---- .../ui/editor/RobocodeEditorMenuBar.java | 722 ---- .../sf/robocode/ui/editor/StyledDocument.java | 64 - .../ui/editor/UndoManagerWithActions.java | 96 - .../sf/robocode/ui/editor/WindowMenuItem.java | 291 -- .../robocode/ui/editor/theme/ColorAndStyle.java | 159 - .../ui/editor/theme/ColorAndStyleAdapter.java | 28 - .../robocode/ui/editor/theme/ComboBoxUtil.java | 92 - .../ui/editor/theme/EditorProperties.java | 70 - .../editor/theme/EditorPropertiesManager.java | 74 - .../ui/editor/theme/EditorThemeProperties.java | 541 --- .../theme/EditorThemePropertiesManager.java | 248 -- .../theme/EditorThemePropertyChangeAdapter.java | 62 - .../ui/editor/theme/IColorAndStyleListener.java | 25 - .../ui/editor/theme/IEditorThemeProperties.java | 59 - .../IEditorThemePropertyChangeListener.java | 52 - 代码/workspace_robo4/robocode.ui/.classpath | 15 - 代码/workspace_robo4/robocode.ui/.project | 21 - .../.settings/org.eclipse.jdt.core.prefs | 9 - 代码/workspace_robo4/robocode.ui/pom.xml | 35 - .../workspace_robo4/robocode.ui/robocode.ui.iml | 88 - .../java/net/sf/robocode/ui/BrowserManager.java | 71 - .../main/java/net/sf/robocode/ui/CheckList.java | 220 -- .../java/net/sf/robocode/ui/IImageManager.java | 33 - .../net/sf/robocode/ui/IRobotDialogManager.java | 30 - .../net/sf/robocode/ui/IWindowManagerExt.java | 71 - .../java/net/sf/robocode/ui/ImageManager.java | 236 -- .../main/java/net/sf/robocode/ui/Module.java | 47 - .../net/sf/robocode/ui/RobotDialogManager.java | 97 - .../java/net/sf/robocode/ui/WindowManager.java | 632 ---- .../sf/robocode/ui/battle/AwtBattleAdaptor.java | 335 -- .../sf/robocode/ui/battleview/BattleField.java | 49 - .../sf/robocode/ui/battleview/BattleView.java | 698 ---- .../ui/battleview/InteractiveHandler.java | 153 - .../ui/battleview/MirroredGraphics.java | 567 --- .../robocode/ui/battleview/ScreenshotUtil.java | 84 - .../net/sf/robocode/ui/dialog/AboutBox.java | 225 -- .../ui/dialog/AvailableRobotsPanel.java | 421 --- .../sf/robocode/ui/dialog/BaseScoreDialog.java | 179 - .../net/sf/robocode/ui/dialog/BattleButton.java | 57 - .../net/sf/robocode/ui/dialog/BattleDialog.java | 244 -- .../sf/robocode/ui/dialog/ConsoleDialog.java | 163 - .../robocode/ui/dialog/ConsoleScrollPane.java | 170 - .../java/net/sf/robocode/ui/dialog/MenuBar.java | 939 ----- .../sf/robocode/ui/dialog/NewBattleDialog.java | 204 -- .../robocode/ui/dialog/NewBattleRulesTab.java | 492 --- .../ui/dialog/PreferencesCommonOptionsTab.java | 155 - .../PreferencesDevelopmentOptionsTab.java | 198 -- .../robocode/ui/dialog/PreferencesDialog.java | 149 - .../dialog/PreferencesRenderingOptionsTab.java | 297 -- .../ui/dialog/PreferencesSoundOptionsTab.java | 397 --- .../ui/dialog/PreferencesViewOptionsTab.java | 470 --- .../sf/robocode/ui/dialog/RankingDialog.java | 117 - .../sf/robocode/ui/dialog/RcSplashScreen.java | 114 - .../sf/robocode/ui/dialog/ResultsDialog.java | 140 - .../ui/dialog/ResultsTableCellRenderer.java | 51 - .../sf/robocode/ui/dialog/RobocodeFrame.java | 1011 ------ .../net/sf/robocode/ui/dialog/RobotButton.java | 228 -- .../ui/dialog/RobotDescriptionPanel.java | 230 -- .../net/sf/robocode/ui/dialog/RobotDialog.java | 450 --- .../sf/robocode/ui/dialog/RobotExtractor.java | 164 - .../robocode/ui/dialog/RobotSelectionPanel.java | 487 --- .../net/sf/robocode/ui/dialog/TeamCreator.java | 178 - .../ui/dialog/TeamCreatorOptionsPanel.java | 314 -- .../ui/dialog/WindowPositionManager.java | 154 - .../net/sf/robocode/ui/dialog/WindowUtil.java | 207 -- .../java/net/sf/robocode/ui/dialog/Wizard.java | 35 - .../sf/robocode/ui/dialog/WizardCardPanel.java | 116 - .../sf/robocode/ui/dialog/WizardController.java | 195 -- .../sf/robocode/ui/dialog/WizardListener.java | 18 - .../net/sf/robocode/ui/dialog/WizardPanel.java | 34 - .../sf/robocode/ui/dialog/WizardTabbedPane.java | 106 - .../sf/robocode/ui/editor/IRobocodeEditor.java | 16 - .../java/net/sf/robocode/ui/gfx/ColorUtil.java | 153 - .../net/sf/robocode/ui/gfx/GraphicsState.java | 60 - .../java/net/sf/robocode/ui/gfx/ImageUtil.java | 121 - .../net/sf/robocode/ui/gfx/RenderImage.java | 88 - .../net/sf/robocode/ui/gfx/RenderObject.java | 139 - .../net/sf/robocode/ui/gfx/RobocodeLogo.java | 445 --- .../sf/robocode/ui/packager/ConfirmPanel.java | 123 - .../sf/robocode/ui/packager/FilenamePanel.java | 269 -- .../ui/packager/PackagerOptionsPanel.java | 405 --- .../sf/robocode/ui/packager/RobotPackager.java | 233 -- .../ui/util/LimitedClassnameDocument.java | 52 - .../sf/robocode/ui/util/LimitedDocument.java | 103 - .../net/sf/robocode/ui/util/ShortcutUtil.java | 62 - .../net/sf/robocode/ui/html/about.html | 135 - .../net/sf/robocode/ui/html/transparent.png | Bin 1202 -> 0 bytes .../net/sf/robocode/ui/icons/robocode-icon.png | Bin 2243 -> 0 bytes .../net/sf/robocode/ui/images/.cvsignore | 1 - .../net/sf/robocode/ui/images/body.png | Bin 1702 -> 0 bytes .../sf/robocode/ui/images/explosion/.cvsignore | 1 - .../ui/images/explosion/explosion1-1.png | Bin 1513 -> 0 bytes .../ui/images/explosion/explosion1-10.png | Bin 19762 -> 0 bytes .../ui/images/explosion/explosion1-11.png | Bin 22670 -> 0 bytes .../ui/images/explosion/explosion1-12.png | Bin 25567 -> 0 bytes .../ui/images/explosion/explosion1-13.png | Bin 27867 -> 0 bytes .../ui/images/explosion/explosion1-14.png | Bin 28149 -> 0 bytes .../ui/images/explosion/explosion1-15.png | Bin 16242 -> 0 bytes .../ui/images/explosion/explosion1-16.png | Bin 201 -> 0 bytes .../ui/images/explosion/explosion1-17.png | Bin 201 -> 0 bytes .../ui/images/explosion/explosion1-2.png | Bin 2390 -> 0 bytes .../ui/images/explosion/explosion1-3.png | Bin 3464 -> 0 bytes .../ui/images/explosion/explosion1-4.png | Bin 4771 -> 0 bytes .../ui/images/explosion/explosion1-5.png | Bin 6418 -> 0 bytes .../ui/images/explosion/explosion1-6.png | Bin 8845 -> 0 bytes .../ui/images/explosion/explosion1-7.png | Bin 11331 -> 0 bytes .../ui/images/explosion/explosion1-8.png | Bin 14242 -> 0 bytes .../ui/images/explosion/explosion1-9.png | Bin 16936 -> 0 bytes .../ui/images/explosion/explosion2-1.png | Bin 743 -> 0 bytes .../ui/images/explosion/explosion2-10.png | Bin 2075 -> 0 bytes .../ui/images/explosion/explosion2-11.png | Bin 2307 -> 0 bytes .../ui/images/explosion/explosion2-12.png | Bin 2494 -> 0 bytes .../ui/images/explosion/explosion2-13.png | Bin 2724 -> 0 bytes .../ui/images/explosion/explosion2-14.png | Bin 2939 -> 0 bytes .../ui/images/explosion/explosion2-15.png | Bin 3159 -> 0 bytes .../ui/images/explosion/explosion2-16.png | Bin 3388 -> 0 bytes .../ui/images/explosion/explosion2-17.png | Bin 3669 -> 0 bytes .../ui/images/explosion/explosion2-18.png | Bin 3924 -> 0 bytes .../ui/images/explosion/explosion2-19.png | Bin 4234 -> 0 bytes .../ui/images/explosion/explosion2-2.png | Bin 851 -> 0 bytes .../ui/images/explosion/explosion2-20.png | Bin 4496 -> 0 bytes .../ui/images/explosion/explosion2-21.png | Bin 4817 -> 0 bytes .../ui/images/explosion/explosion2-22.png | Bin 5128 -> 0 bytes .../ui/images/explosion/explosion2-23.png | Bin 5518 -> 0 bytes .../ui/images/explosion/explosion2-24.png | Bin 5840 -> 0 bytes .../ui/images/explosion/explosion2-25.png | Bin 6255 -> 0 bytes .../ui/images/explosion/explosion2-26.png | Bin 6599 -> 0 bytes .../ui/images/explosion/explosion2-27.png | Bin 6974 -> 0 bytes .../ui/images/explosion/explosion2-28.png | Bin 7379 -> 0 bytes .../ui/images/explosion/explosion2-29.png | Bin 7822 -> 0 bytes .../ui/images/explosion/explosion2-3.png | Bin 1138 -> 0 bytes .../ui/images/explosion/explosion2-30.png | Bin 8185 -> 0 bytes .../ui/images/explosion/explosion2-31.png | Bin 8580 -> 0 bytes .../ui/images/explosion/explosion2-32.png | Bin 9082 -> 0 bytes .../ui/images/explosion/explosion2-33.png | Bin 9505 -> 0 bytes .../ui/images/explosion/explosion2-34.png | Bin 9957 -> 0 bytes .../ui/images/explosion/explosion2-35.png | Bin 10475 -> 0 bytes .../ui/images/explosion/explosion2-36.png | Bin 11068 -> 0 bytes .../ui/images/explosion/explosion2-37.png | Bin 11583 -> 0 bytes .../ui/images/explosion/explosion2-38.png | Bin 12170 -> 0 bytes .../ui/images/explosion/explosion2-39.png | Bin 12837 -> 0 bytes .../ui/images/explosion/explosion2-4.png | Bin 1225 -> 0 bytes .../ui/images/explosion/explosion2-40.png | Bin 13464 -> 0 bytes .../ui/images/explosion/explosion2-41.png | Bin 14302 -> 0 bytes .../ui/images/explosion/explosion2-42.png | Bin 15022 -> 0 bytes .../ui/images/explosion/explosion2-43.png | Bin 15790 -> 0 bytes .../ui/images/explosion/explosion2-44.png | Bin 16608 -> 0 bytes .../ui/images/explosion/explosion2-45.png | Bin 17417 -> 0 bytes .../ui/images/explosion/explosion2-46.png | Bin 18282 -> 0 bytes .../ui/images/explosion/explosion2-47.png | Bin 19130 -> 0 bytes .../ui/images/explosion/explosion2-48.png | Bin 20011 -> 0 bytes .../ui/images/explosion/explosion2-49.png | Bin 20823 -> 0 bytes .../ui/images/explosion/explosion2-5.png | Bin 1300 -> 0 bytes .../ui/images/explosion/explosion2-50.png | Bin 21664 -> 0 bytes .../ui/images/explosion/explosion2-51.png | Bin 22594 -> 0 bytes .../ui/images/explosion/explosion2-52.png | Bin 23543 -> 0 bytes .../ui/images/explosion/explosion2-53.png | Bin 24830 -> 0 bytes .../ui/images/explosion/explosion2-54.png | Bin 25827 -> 0 bytes .../ui/images/explosion/explosion2-55.png | Bin 26725 -> 0 bytes .../ui/images/explosion/explosion2-56.png | Bin 27702 -> 0 bytes .../ui/images/explosion/explosion2-57.png | Bin 28608 -> 0 bytes .../ui/images/explosion/explosion2-58.png | Bin 29323 -> 0 bytes .../ui/images/explosion/explosion2-59.png | Bin 30258 -> 0 bytes .../ui/images/explosion/explosion2-6.png | Bin 1418 -> 0 bytes .../ui/images/explosion/explosion2-60.png | Bin 31004 -> 0 bytes .../ui/images/explosion/explosion2-61.png | Bin 32043 -> 0 bytes .../ui/images/explosion/explosion2-62.png | Bin 32889 -> 0 bytes .../ui/images/explosion/explosion2-63.png | Bin 33011 -> 0 bytes .../ui/images/explosion/explosion2-64.png | Bin 31551 -> 0 bytes .../ui/images/explosion/explosion2-65.png | Bin 26477 -> 0 bytes .../ui/images/explosion/explosion2-66.png | Bin 10905 -> 0 bytes .../ui/images/explosion/explosion2-67.png | Bin 6613 -> 0 bytes .../ui/images/explosion/explosion2-68.png | Bin 2047 -> 0 bytes .../ui/images/explosion/explosion2-69.png | Bin 201 -> 0 bytes .../ui/images/explosion/explosion2-7.png | Bin 1598 -> 0 bytes .../ui/images/explosion/explosion2-70.png | Bin 201 -> 0 bytes .../ui/images/explosion/explosion2-71.png | Bin 201 -> 0 bytes .../ui/images/explosion/explosion2-8.png | Bin 1742 -> 0 bytes .../ui/images/explosion/explosion2-9.png | Bin 1925 -> 0 bytes .../net/sf/robocode/ui/images/ground/.cvsignore | 1 - .../images/ground/blue_metal/blue_metal_0.png | Bin 3859 -> 0 bytes .../images/ground/blue_metal/blue_metal_1.png | Bin 1532 -> 0 bytes .../images/ground/blue_metal/blue_metal_2.png | Bin 3513 -> 0 bytes .../images/ground/blue_metal/blue_metal_3.png | Bin 3173 -> 0 bytes .../images/ground/blue_metal/blue_metal_4.png | Bin 4540 -> 0 bytes .../ui/images/ground/explode_debris.png | Bin 3542 -> 0 bytes .../net/sf/robocode/ui/images/radar.png | Bin 833 -> 0 bytes .../net/sf/robocode/ui/images/turret.png | Bin 1188 -> 0 bytes 代码/workspace_robo4/super-pom/.project | 11 - 代码/workspace_robo4/super-pom/pom.xml | 179 - .../super-pom/robocode-license-header.txt | 5 - 代码/workspace_robo4/tools/.gitignore | 1 - 代码/workspace_robo4/tools/.project | 11 - 代码/workspace_robo4/tools/bin/ant.bat | 226 -- 代码/workspace_robo4/tools/bin/ant.sh | 94 - 代码/workspace_robo4/tools/bin/m2.conf | 4 - 代码/workspace_robo4/tools/bin/mvn.bat | 191 - 代码/workspace_robo4/tools/bin/mvn.sh | 162 - 代码/workspace_robo4/tools/debugall/all.iml | 33 - 代码/workspace_robo4/tools/jacobe/.gitignore | 1 - 代码/workspace_robo4/tools/jacobe/ReadMe.txt | 57 - .../workspace_robo4/tools/jacobe/robocode.cfg | 301 -- .../tools/licenses/ant-LICENSE.txt | 272 -- .../tools/licenses/ant-NOTICE.txt | 26 - .../tools/licenses/mvn-LICENSE.txt | 202 -- .../tools/licenses/mvn-NOTICE.txt | 11 - 代码/workspace_robo4/tools/loadTools.cmd | 19 - 代码/workspace_robo4/tools/loadTools.sh | 21 - 代码/workspace_robo4/tools/loader/Loader.java | 54 - 代码/workspace_robo4/versions.md | 3082 ----------------- 文档/robocode机器人战斗模拟——汇报.pptx | Bin 823344 -> 0 bytes 文档/robocode机器人战斗模拟——海报.jpg | Bin 42491 -> 0 bytes 文档/robocode机器人战斗模拟——视频.mp4 | Bin 3300589 -> 0 bytes 文档/robocode机器人战斗模拟——需求规约.docx | Bin 20282 -> 0 bytes 文档/软件需求规格说明书.doc | Bin 229888 -> 0 bytes 模型/robocode机器人战斗模拟——软件模型.vsdx | Bin 152202 -> 0 bytes 1306 files changed, 152039 deletions(-) delete mode 100644 robocode战斗机器人——夏季学期计划.mpp delete mode 100644 代码/workspace_robo4/.gitignore delete mode 100644 代码/workspace_robo4/LICENSE.txt delete mode 100644 代码/workspace_robo4/README.md delete mode 100644 代码/workspace_robo4/RemoteSystemsTempFiles/.project delete mode 100644 代码/workspace_robo4/jacobe.cmd delete mode 100644 代码/workspace_robo4/jacobe.sh delete mode 100644 代码/workspace_robo4/mvn.cmd delete mode 100644 代码/workspace_robo4/mvn.sh delete mode 100644 代码/workspace_robo4/mvnassembly.cmd delete mode 100644 代码/workspace_robo4/mvnassembly.sh delete mode 100644 代码/workspace_robo4/plugins/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/ReadMe.txt delete mode 100644 代码/workspace_robo4/plugins/dotnet/generateProxies.cmd delete mode 100644 代码/workspace_robo4/plugins/dotnet/mvn.cmd delete mode 100644 代码/workspace_robo4/plugins/dotnet/mvnassembly.cmd delete mode 100644 代码/workspace_robo4/plugins/dotnet/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robocode.dotnet.api.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robotAPI.shfbproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/.gitignore delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/AssemblyInf.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/io/LoggerN.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/Buffer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/ByteBuffer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/HeapByteBuffer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/InvalidMarkException.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/peer/IRobotStaticsN.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/HiddenAccessN.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenBulletHelper.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenEventHelper.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRandomHelper.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRulesHelper.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenStatusHelper.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/RobocodeInternalPermission.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/ISerializableHelperN.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/RbSerializerN.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode.dotnet.api.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/AdvancedRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleEndedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleResults.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleRules.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Bullet.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitBulletEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletMissedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Condition.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/CustomEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/DeathEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Event.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/GunTurnCompleteCondition.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitByBulletEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitRobotEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitWallEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IBorderSentry.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IDroid.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IGraphics.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/JuniorRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyPressedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyReleasedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyTypedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Keys.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MessageEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseClickedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseDraggedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEnteredEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseExitedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseMovedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MousePressedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseReleasedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseWheelMovedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MoveCompleteCondition.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/PaintEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RadarTurnCompleteCondition.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RateControlRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Robot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotDeathEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotStatus.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RoundEndedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Rules.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/ScannedRobotEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/SkippedTurnEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/StatusEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TeamRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Thread.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TurnCompleteCondition.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/WinEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/EventInterruptedException.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/RobotException.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents2.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents3.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IJuniorRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IRunnable.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IAdvancedRobotPeer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IBasicRobotPeer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IJuniorRobotPeer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IStandardRobotPeer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/ITeamRobotPeer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/util/Utils.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.classpath delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/robocode.dotnet.content.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/.gitignore delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.sln delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/Program.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robocode.bat delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robots/SamplesCs.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Content Layout.content delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Introduction.aml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/controlAPI.shfbproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/robocode.dotnet.control.api.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/.gitignore delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/java/util/Random.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattleSpecification.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattlefieldSpecification.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RandomFactory.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobocodeEngine.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotResults.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSetup.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSpecification.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleCompletedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleErrorEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleFinishedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleMessageEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattlePausedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleResumedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleStartedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/IBattleListener.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundEndedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundStartedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnEndedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnStartedEvent.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/BulletState.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IBulletSnapshot.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IDebugProperty.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IRobotSnapshot.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IScoreSnapshot.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/ITurnSnapshot.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/RobotState.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RandomFactory.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RobocodeEngine.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattleSpecification.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattlefieldSpecification.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/IRobocodeEngine.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobocodeEngine.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSetup.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSpecification.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleCompletedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleErrorEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleFinishedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleMessageEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattlePausedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleResumedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleStartedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundEndedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundStartedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnEndedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnStartedEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/BulletState.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IBulletSnapshot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IDebugProperty.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IRobotSnapshot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IScoreSnapshot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/ITurnSnapshot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/RobotState.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/robocode.dotnet.control.api.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/robocode.ico delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.classpath delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/dotnet-setup.asm.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/robocode.dotnet.distribution.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.classpath delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/robocode.dotnet.host.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/java_/util/Random_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/core/ContainerBase_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/DotNetHost.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/Module.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/nhost/ModuleN.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/DotNetRobotItem.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/handlers/DotNetPropertiesHandler.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRoot.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRootHelper.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/handlers/DllHandler.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHostManager_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHost_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/RobotStatics_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/io/Logger_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/manager/IVersionManagerBase_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/BadBehavior_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotPeer_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotStatics_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotItem_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotSpecItem_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/RobotType_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/security/HiddenAccess_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/ISerializableHelper_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/RbSerializer_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/BattleRules_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattleSpecification_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattlefieldSpecification_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RandomFactory_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobocodeEngine_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotResults_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSetup_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSpecification_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleCompletedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleErrorEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleFinishedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleMessageEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattlePausedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleResumedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleStartedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/IBattleListener_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundEndedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundStartedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnEndedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnStartedEvent_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/BulletState_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IBulletSnapshot_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IDebugProperty_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IRobotSnapshot_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IScoreSnapshot_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/ITurnSnapshot_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/RobotState_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/AbortedException_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DeathException_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DisabledException_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/WinException_.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/test/java/net/sf/robocode/dotnet/host/TestCLR.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.classpath delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/robocode.dotnet.installer.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ipr delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iws delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/robocode.dotnet.nhost.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/.gitignore delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/core/ContainerBase.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/host/DotNetHost.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/nhost/ModuleN.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/repository/root/DllRootHelper.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHost.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHostManager.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/proxies/IHostingRobotProxy.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/io/Logger.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/manager/IVersionManagerBase.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/BadBehavior.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotPeer.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotStatics.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotItem.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotSpecItem.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/RobotType.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/security/HiddenAccess.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/ISerializableHelper.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/RbSerializer.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/AbortedException.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DeathException.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DisabledException.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/WinException.generated.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/DotNetHost.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/ModuleN.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/RobotStatics.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventManager.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventQueue.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/AdvancedRobotProxy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/BasicRobotProxy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/GraphicsProxy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/HostingRobotProxy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/JuniorRobotProxy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/StandardRobotProxy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/TeamRobotProxy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/QuotaStream.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/RobotFileSystemManager.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainSeed.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainShell.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingSeed.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingShell.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/io/Logger.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/mono/reflection/CILReader.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletCommand.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletStatus.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/DebugProperty.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecCommands.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecResults.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/TeamMessage.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/RobotType.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/root/DllRootHelper.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/robocode.dotnet.nhost.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/serialization/RbSerializer.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.security.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/robocode.dotnet.ntests.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/AssemblyLoadTest.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/SimpleTest.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/TestBase.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/robocode.dotnet.ntests.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/robocode.dotnet.robotscs.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLongerCs.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageShortNameCs.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.sln delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode.dotnet.robotscs.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode/BadNamespaceCs.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Ahead.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BadFirePower.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleLost.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleWin.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BodyTurnRate.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/CustomEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/DieFast.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EnvAttack.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EventPriorityFilter.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FairPlay.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileAttack.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileWriteSize.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FormsAttack.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunHeat.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunTurnRate.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/HttpAttack.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/InteruptibleEvent.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/JuniorEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxTurnRate.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxVelocity.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/PrivateConstructor.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RadarTurnRateAndSetAdjust.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Random.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RateControl.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ReflectionAttack.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RobotDeathEvents.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/SkipTurns.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TestTeam.team delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ThreadAttack.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TooLongNameThisIsReallyTooLongNameCs.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/UndeadThread.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/WatchBullets.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespaceCs.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/robocode.dotnet.samples.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.sln delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Corners.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Crazy.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Fire.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Interactive.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstJuniorRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PaintingRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PointD.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RamFire.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RobotColors.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SittingDuck.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SpinBot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Target.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/TrackFire.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Tracker.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/VelociRobot.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Walls.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsSentry/BorderGuard.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyCsTeam.team delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstDroid.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstLeader.cs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/MyFirstRobot.fs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/robocode.dotnet.samplesfs.fsproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/robocode.dotnet.samples.csproj delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.sln delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.classpath delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.project delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/config/robocode.properties delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/pom.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/robocode.dotnet.tests.iml delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestCustomEvents.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestDuplicatesAndScore.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEnvAttack.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEventPriorityFilter.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileAttack.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWrite.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWriteSize.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFormsAttack.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestHttpAttack.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestInteruptibleEvent.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestJunior.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestLost.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxTurnRate.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxVelocity.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestNames.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPosition.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPrivateConstructor.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRandom.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestReflectionAttack.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRobotDeathEvents.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestScoring.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestSkippedTurns.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestThreadAttack.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestUndeadThread.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWatchBullet.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWin.java delete mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/resources/config/robocode.properties delete mode 100644 代码/workspace_robo4/plugins/dotnet/tools/.gitignore delete mode 100644 代码/workspace_robo4/plugins/dotnet/tools/keys/.gitignore delete mode 100644 代码/workspace_robo4/plugins/dotnet/tools/keys/gennetkey.cmd delete mode 100644 代码/workspace_robo4/plugins/dotnet/tools/loadTools.cmd delete mode 100644 代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.control.proxygen.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.net.xml delete mode 100644 代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.xml delete mode 100644 代码/workspace_robo4/plugins/testing/.gitignore delete mode 100644 代码/workspace_robo4/plugins/testing/mvn.cmd delete mode 100644 代码/workspace_robo4/plugins/testing/mvn.sh delete mode 100644 代码/workspace_robo4/plugins/testing/mvnassembly.cmd delete mode 100644 代码/workspace_robo4/plugins/testing/mvnassembly.sh delete mode 100644 代码/workspace_robo4/plugins/testing/pom.xml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/.classpath delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/.project delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/pom.xml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/robocode.testing.api.iml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBed.java delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBedAssert.java delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/package.html delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/.classpath delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/.project delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/pom.xml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/robocode.testing.content.iml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/Read.Me.txt delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/compile.cmd delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/test.cmd delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.classpath delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.project delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.distribution/pom.xml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.distribution/robocode.testing.distribution.iml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.distribution/testing-setup.asm.xml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.iml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.installer/.classpath delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.installer/.project delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.installer/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.installer/pom.xml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.installer/robocode.testing.installer.iml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.ipr delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.iws delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.samples/.classpath delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.samples/.project delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.samples/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.samples/pom.xml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.samples/robocode.testing.samples.iml delete mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.samples/src/main/java/sample/TestWallBehavior.java delete mode 100644 代码/workspace_robo4/pom.xml delete mode 100644 代码/workspace_robo4/robocode.api/.classpath delete mode 100644 代码/workspace_robo4/robocode.api/.externalToolBuilders/Launch Dir Builder.launch delete mode 100644 代码/workspace_robo4/robocode.api/.gitignore delete mode 100644 代码/workspace_robo4/robocode.api/.project delete mode 100644 代码/workspace_robo4/robocode.api/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.api/Robocode.launch delete mode 100644 代码/workspace_robo4/robocode.api/pom.xml delete mode 100644 代码/workspace_robo4/robocode.api/robocode.api.iml delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFont.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFunc.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/api/Module.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/battle/IBattleManagerBase.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/ContainerBase.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/IModule.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/gui/IWindowManagerBase.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/FileUtil.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/Logger.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/RobocodeProperties.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/manager/IVersionManagerBase.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/peer/IRobotStatics.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/IRepositoryManagerBase.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/HiddenAccess.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenBulletHelper.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenEventHelper.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenRulesHelper.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenSpecificationHelper.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenStatusHelper.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IThreadManagerBase.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/SafeComponent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/ISerializableHelper.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/RbSerializer.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/StringUtil.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/UrlUtil.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/AdvancedRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleEndedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleResults.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleRules.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/BorderSentry.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/Bullet.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitBulletEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletMissedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/Condition.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/CustomEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/DeathEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/Droid.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/Event.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/GunTurnCompleteCondition.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/HitByBulletEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/HitRobotEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/HitWallEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/JuniorRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyPressedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyReleasedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyTypedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MessageEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseClickedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseDraggedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEnteredEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseExitedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseMovedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MousePressedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseReleasedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseWheelMovedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/MoveCompleteCondition.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/PaintEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/RadarTurnCompleteCondition.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/RateControlRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/Robocode.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileOutputStream.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileWriter.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/Robot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotDeathEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotStatus.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/RoundEndedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/Rules.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/ScannedRobotEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/SkippedTurnEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/StatusEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/TeamRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/TurnCompleteCondition.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/WinEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRadiansRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/_Robot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/_RobotBase.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/SafeStatic.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattleSpecification.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattlefieldSpecification.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/IRobocodeEngine.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RandomFactory.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeEngine.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeListener.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotResults.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSetup.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSpecification.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleAdaptor.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleCompletedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleErrorEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleFinishedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleMessageEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattlePausedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleResumedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleStartedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/IBattleListener.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundEndedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundStartedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnEndedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnStartedEvent.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/BulletState.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IBulletSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IDebugProperty.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IRobotSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IScoreSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/ITurnSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/RobotState.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/AbortedException.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DeathException.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DisabledException.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/EventInterruptedException.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/RobotException.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/WinException.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/EllipseGL.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LabelGL.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LineGL.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/PointGL.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RectangleGL.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RenderElement.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/system/GLRenderer.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedEvents.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents2.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents3.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveEvents.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IJuniorRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintEvents.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamEvents.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamRobot.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IAdvancedRobotPeer.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IBasicRobotPeer.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IJuniorRobotPeer.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IStandardRobotPeer.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/ITeamRobotPeer.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/package-info.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/util/Utils.java delete mode 100644 代码/workspace_robo4/robocode.api/src/main/java/robocode/util/package-info.java delete mode 100644 代码/workspace_robo4/robocode.battle/.classpath delete mode 100644 代码/workspace_robo4/robocode.battle/.project delete mode 100644 代码/workspace_robo4/robocode.battle/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.battle/pom.xml delete mode 100644 代码/workspace_robo4/robocode.battle/robocode.battle.iml delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BaseBattle.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Battle.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BattleManager.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BoundingRectangle.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Command.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/IBattle.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Module.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/BulletPeer.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantPeer.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantStatistics.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ExplosionPeer.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/IRobotPeerBattle.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotPeer.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotStatistics.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamPeer.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamStatistics.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/BulletSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/RobotSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/ScoreSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/TurnSnapshot.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattlePlayer.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecordInfo.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecorder.java delete mode 100644 代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java delete mode 100644 代码/workspace_robo4/robocode.content/.classpath delete mode 100644 代码/workspace_robo4/robocode.content/.project delete mode 100644 代码/workspace_robo4/robocode.content/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.content/pom.xml delete mode 100644 代码/workspace_robo4/robocode.content/robocode.content.iml delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.html delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.txt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/battles/intro.battle delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/battles/sample.battle delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/compilers/CompilerTest.java delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocode.png delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeMeleeRumble.desktop delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRoboRumble.desktop delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRobocode.desktop delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTeamRumble.desktop delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTwinDuel.desktop delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/desktop/roborumble.png delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/license/epl-v10.html delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.bat delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.command delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.sh delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/robocode.bat delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/robocode.command delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/robocode.ico delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/robocode.sh delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble.bat delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble.command delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble.ico delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble.sh delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble/meleerumble.txt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.properties delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.txt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble/teamrumble.txt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/roborumble/twinduel.txt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.bat delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.command delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.sh delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/templates/newjavafile.tpt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/templates/newjuniorrobot.tpt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/templates/newrobot.tpt delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode Black Theme.properties delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode White Theme.properties delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/twinduel.bat delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/twinduel.command delete mode 100644 代码/workspace_robo4/robocode.content/src/main/resources/twinduel.sh delete mode 100644 代码/workspace_robo4/robocode.core/.classpath delete mode 100644 代码/workspace_robo4/robocode.core/.project delete mode 100644 代码/workspace_robo4/robocode.core/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.core/pom.xml delete mode 100644 代码/workspace_robo4/robocode.core/robocode.core.iml delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleProperties.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleRankingTableModel.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleResultsTableModel.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/IBattleManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/events/BattleEventDispatcher.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/cachecleaner/CacheCleaner.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/BaseModule.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Container.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/EngineClassLoader.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Module.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMain.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMainBase.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/ICpuManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IHostManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IRobotClassLoader.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/RobotStatics.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/JarJar.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/URLJarCollector.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BadBehavior.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletCommand.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletStatus.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/DebugProperty.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecCommands.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecResults.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/IRobotPeer.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/TeamMessage.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/BattleRecordFormat.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/IRecordManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRepositoryManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotItem.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotSpecItem.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotProperties.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotType.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/TeamProperties.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/Graphics2DSerialized.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/IGraphicsProxy.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/IXmlSerializable.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/SerializableOptions.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlReader.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlWriter.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsListener.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/SettingsManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/sound/ISoundManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/ui/IWindowManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/util/AlphanumericComparator.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/IVersionManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/Version.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/VersionManager.java delete mode 100644 代码/workspace_robo4/robocode.core/src/main/resources/battleRecord.xsd delete mode 100644 代码/workspace_robo4/robocode.core/src/main/resources/battleRecordS.xsd delete mode 100644 代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/ObjectCloner.java delete mode 100644 代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/RbSerializerTest.java delete mode 100644 代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/version/VersionTest.java delete mode 100644 代码/workspace_robo4/robocode.distribution/.classpath delete mode 100644 代码/workspace_robo4/robocode.distribution/.project delete mode 100644 代码/workspace_robo4/robocode.distribution/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.distribution/pom.xml delete mode 100644 代码/workspace_robo4/robocode.distribution/robocode.distribution.iml delete mode 100644 代码/workspace_robo4/robocode.distribution/setup.asm.xml delete mode 100644 代码/workspace_robo4/robocode.distribution/src.asm.xml delete mode 100644 代码/workspace_robo4/robocode.dummy.zip delete mode 100644 代码/workspace_robo4/robocode.host/.classpath delete mode 100644 代码/workspace_robo4/robocode.host/.project delete mode 100644 代码/workspace_robo4/robocode.host/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.host/pom.xml delete mode 100644 代码/workspace_robo4/robocode.host/robocode.host.iml delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/CpuManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/HostManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHost.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHostedThread.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IThreadManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/JavaHost.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/Module.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventQueue.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/IEventManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedInputStream.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedOutputStream.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileOutputStream.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileSystemManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotOutputStream.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/jarjar/JarJarURLConnection.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/AdvancedRobotProxy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/BasicRobotProxy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/HostingRobotProxy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/JuniorRobotProxy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/StandardRobotProxy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/TeamRobotProxy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ClassAnalyzer.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodePermission.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityPolicy.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotClassLoader.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotThreadManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecureInputStream.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecurePrintStream.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ThreadManager.java delete mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/serialization/RobocodeObjectInputStream.java delete mode 100644 代码/workspace_robo4/robocode.host/src/test/java/net/sf/robocode/host/jarjar/JarJarTest.java delete mode 100644 代码/workspace_robo4/robocode.host/src/test/resources/Outer.jar delete mode 100644 代码/workspace_robo4/robocode.iml delete mode 100644 代码/workspace_robo4/robocode.installer/.classpath delete mode 100644 代码/workspace_robo4/robocode.installer/.project delete mode 100644 代码/workspace_robo4/robocode.installer/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.installer/pom.xml delete mode 100644 代码/workspace_robo4/robocode.installer/robocode.installer.iml delete mode 100644 代码/workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java delete mode 100644 代码/workspace_robo4/robocode.ipr delete mode 100644 代码/workspace_robo4/robocode.iws delete mode 100644 代码/workspace_robo4/robocode.repository/.classpath delete mode 100644 代码/workspace_robo4/robocode.repository/.project delete mode 100644 代码/workspace_robo4/robocode.repository/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.repository/pom.xml delete mode 100644 代码/workspace_robo4/robocode.repository/robocode.repository.iml delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/IRepository.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Module.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Repository.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/RepositoryManager.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/IRepositoryItem.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RepositoryItem.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotItem.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotSpecItem.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/TeamItem.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ClassHandler.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ItemHandler.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/PropertiesHandler.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/SourceHandler.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/TeamHandler.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarCreator.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarExtractor.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/parsers/ClasspathFileParser.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/BaseRoot.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/ClasspathRoot.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/IRepositoryRoot.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/JarRoot.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/ClassPathHandler.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/JarHandler.java delete mode 100644 代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/RootHandler.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/.classpath delete mode 100644 代码/workspace_robo4/robocode.roborumble/.project delete mode 100644 代码/workspace_robo4/robocode.roborumble/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.roborumble/MeleeRumble.launch delete mode 100644 代码/workspace_robo4/robocode.roborumble/RoboRumble.launch delete mode 100644 代码/workspace_robo4/robocode.roborumble/TeamRumble.launch delete mode 100644 代码/workspace_robo4/robocode.roborumble/pom.xml delete mode 100644 代码/workspace_robo4/robocode.roborumble/robocode.roborumble.iml delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/BattlesRunner.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/CompetitionsSelector.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/PrepareBattles.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/BotsDownload.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/FileTransfer.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/ResultsUpload.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/UpdateRatingFiles.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/ExcludesUtil.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/PropertiesUtil.java delete mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/roborumble/RoboRumbleAtHome.java delete mode 100644 代码/workspace_robo4/robocode.samples/.classpath delete mode 100644 代码/workspace_robo4/robocode.samples/.project delete mode 100644 代码/workspace_robo4/robocode.samples/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.samples/pom.xml delete mode 100644 代码/workspace_robo4/robocode.samples/robocode.samples.iml delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Corners.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Crazy.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Fire.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive_v2.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstJuniorRobot.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstRobot.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/PaintingRobot.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/RamFire.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.html delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/SpinBot.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Target.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/TrackFire.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Tracker.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/VelociRobot.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sample/Walls.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Alien.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleex/AlienComposition.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleex/MasterAndSlave.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleex/ProxyOfGreyEminence.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleex/RegullarMonk.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Slave.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/samplesentry/BorderGuard.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstDroid.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstLeader.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/Point.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/RobotColors.java delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Corners.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Crazy.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Fire.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive_v2.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstJuniorRobot.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstRobot.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/PaintingRobot.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/RamFire.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/SittingDuck.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/SpinBot.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Target.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/TrackFire.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Tracker.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/VelociRobot.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sample/Walls.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/Alien.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/MasterAndSlave.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/ProxyOfGreyEminence.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/samplesentry/BorderGuard.properties delete mode 100644 代码/workspace_robo4/robocode.samples/src/main/resources/sampleteam/MyFirstTeam.team delete mode 100644 代码/workspace_robo4/robocode.sound/.classpath delete mode 100644 代码/workspace_robo4/robocode.sound/.project delete mode 100644 代码/workspace_robo4/robocode.sound/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.sound/pom.xml delete mode 100644 代码/workspace_robo4/robocode.sound/robocode.sound.iml delete mode 100644 代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/Module.java delete mode 100644 代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundCache.java delete mode 100644 代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundManager.java delete mode 100644 代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/13831_adcbicycle_22.wav delete mode 100644 代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/explode.wav delete mode 100644 代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/shellhit.wav delete mode 100644 代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/zap.wav delete mode 100644 代码/workspace_robo4/robocode.tests.robots/.classpath delete mode 100644 代码/workspace_robo4/robocode.tests.robots/.project delete mode 100644 代码/workspace_robo4/robocode.tests.robots/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.tests.robots/pom.xml delete mode 100644 代码/workspace_robo4/robocode.tests.robots/robocode.tests.robots.iml delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageShortName.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/robocode/BadNamespace.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Ahead.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/AwtAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BadFirePower.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleLost.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleWin.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BodyTurnRate.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorAwtAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorHttpAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorReflectionAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorSocketAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorThreadAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/CustomEvents.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat1.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat2.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat3.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DieFast.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EnvAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EventPriorityFilter.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FairPlay.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileOutputStreamAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileWriteSize.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunHeat.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunTurnRate.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/HttpAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/IncludeNamespaceAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/InteruptibleEvent.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/JuniorEvents.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxTurnRate.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxVelocity.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/PrivateConstructor.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RadarTurnRateAndSetAdjust.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Random.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RateControl.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReflectionAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReverseDirection.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RobotDeathEvents.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SkipTurns.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SocketAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadGroupAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/TooLongNameThisIsReallyTooLongName.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/UndeadThread.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/WatchBullets.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespace.java delete mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/resources/tested/robots/TestTeam.team delete mode 100644 代码/workspace_robo4/robocode.tests/.classpath delete mode 100644 代码/workspace_robo4/robocode.tests/.project delete mode 100644 代码/workspace_robo4/robocode.tests/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.tests/config/robocode.properties delete mode 100644 代码/workspace_robo4/robocode.tests/pom.xml delete mode 100644 代码/workspace_robo4/robocode.tests/robocode.tests.iml delete mode 100644 代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/Assert.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/RobocodeTestBed.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/core/util/AlphanumericComparatorTest.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/host/security/RobotClassLoaderTest.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAcceleration.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAwtAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBodyTurnRate.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBulletPower.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorAwtAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorHttpAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorReflectionAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorSocketAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorThreadAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestCustomEvents.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestDuplicatesAndScore.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEnvAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEventPriorityFilter.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFairPlay.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileOutputStreamAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWrite.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWriteSize.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunHeat.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunTurnRate.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestHttpAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestIncludeNamespaceAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestInteruptibleEvent.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestJunior.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestLost.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxTurnRate.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxVelocity.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestNames.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPosition.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPrivateConstructor.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRadarTurnRateAndSetAdjust.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRandom.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRankingsWithTargetRobots.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRateControl.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReflectionAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReverseDirection.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRobotDeathEvents.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestScoring.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSkippedTurns.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSocketAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadGroupAttack.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestUndeadThread.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWatchBullet.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWin.java delete mode 100644 代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/samples/RobocodeRunner.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/.classpath delete mode 100644 代码/workspace_robo4/robocode.ui.editor/.project delete mode 100644 代码/workspace_robo4/robocode.ui.editor/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.ui.editor/pom.xml delete mode 100644 代码/workspace_robo4/robocode.ui.editor/robocode.ui.editor.iml delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerPreferencesDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerProperties.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompoundUndoManager.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditWindow.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPane.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorThemeConfigDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FindReplaceDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FontStyle.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/IEditorProperties.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/JavaDocument.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineHighlighter.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineNumberArea.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/Module.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/MoreWindowsDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompiler.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompilerFactory.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditor.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditorMenuBar.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/StyledDocument.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/UndoManagerWithActions.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/WindowMenuItem.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyle.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyleAdapter.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ComboBoxUtil.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorProperties.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorPropertiesManager.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemeProperties.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertiesManager.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertyChangeAdapter.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IColorAndStyleListener.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemeProperties.java delete mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemePropertyChangeListener.java delete mode 100644 代码/workspace_robo4/robocode.ui/.classpath delete mode 100644 代码/workspace_robo4/robocode.ui/.project delete mode 100644 代码/workspace_robo4/robocode.ui/.settings/org.eclipse.jdt.core.prefs delete mode 100644 代码/workspace_robo4/robocode.ui/pom.xml delete mode 100644 代码/workspace_robo4/robocode.ui/robocode.ui.iml delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/BrowserManager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/CheckList.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IImageManager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IRobotDialogManager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IWindowManagerExt.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/ImageManager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/Module.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/RobotDialogManager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/WindowManager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battle/AwtBattleAdaptor.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleField.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleView.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/InteractiveHandler.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/MirroredGraphics.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/ScreenshotUtil.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AboutBox.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AvailableRobotsPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BaseScoreDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleButton.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleScrollPane.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/MenuBar.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleRulesTab.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesCommonOptionsTab.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDevelopmentOptionsTab.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesRenderingOptionsTab.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesSoundOptionsTab.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesViewOptionsTab.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RankingDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RcSplashScreen.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsTableCellRenderer.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobocodeFrame.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotButton.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDescriptionPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDialog.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotExtractor.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotSelectionPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreator.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreatorOptionsPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowPositionManager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowUtil.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/Wizard.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardCardPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardController.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardListener.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardTabbedPane.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/editor/IRobocodeEditor.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ColorUtil.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/GraphicsState.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ImageUtil.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderImage.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderObject.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RobocodeLogo.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/ConfirmPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/FilenamePanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/PackagerOptionsPanel.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/RobotPackager.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedClassnameDocument.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedDocument.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/ShortcutUtil.java delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/html/about.html delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/html/transparent.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/icons/robocode-icon.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/.cvsignore delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/body.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/.cvsignore delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-1.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-10.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-11.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-12.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-13.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-14.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-15.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-16.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-17.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-2.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-3.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-4.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-5.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-6.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-7.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-8.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-9.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-1.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-10.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-11.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-12.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-13.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-14.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-15.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-16.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-17.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-18.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-19.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-2.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-20.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-21.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-22.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-23.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-24.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-25.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-26.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-27.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-28.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-29.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-3.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-30.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-31.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-32.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-33.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-34.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-35.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-36.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-37.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-38.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-39.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-4.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-40.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-41.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-42.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-43.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-44.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-45.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-46.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-47.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-48.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-49.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-5.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-50.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-51.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-52.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-53.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-54.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-55.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-56.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-57.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-58.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-59.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-6.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-60.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-61.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-62.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-63.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-64.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-65.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-66.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-67.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-68.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-69.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-7.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-70.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-71.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-8.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-9.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/.cvsignore delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_0.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_1.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_2.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_3.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_4.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/explode_debris.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/radar.png delete mode 100644 代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/turret.png delete mode 100644 代码/workspace_robo4/super-pom/.project delete mode 100644 代码/workspace_robo4/super-pom/pom.xml delete mode 100644 代码/workspace_robo4/super-pom/robocode-license-header.txt delete mode 100644 代码/workspace_robo4/tools/.gitignore delete mode 100644 代码/workspace_robo4/tools/.project delete mode 100644 代码/workspace_robo4/tools/bin/ant.bat delete mode 100644 代码/workspace_robo4/tools/bin/ant.sh delete mode 100644 代码/workspace_robo4/tools/bin/m2.conf delete mode 100644 代码/workspace_robo4/tools/bin/mvn.bat delete mode 100644 代码/workspace_robo4/tools/bin/mvn.sh delete mode 100644 代码/workspace_robo4/tools/debugall/all.iml delete mode 100644 代码/workspace_robo4/tools/jacobe/.gitignore delete mode 100644 代码/workspace_robo4/tools/jacobe/ReadMe.txt delete mode 100644 代码/workspace_robo4/tools/jacobe/robocode.cfg delete mode 100644 代码/workspace_robo4/tools/licenses/ant-LICENSE.txt delete mode 100644 代码/workspace_robo4/tools/licenses/ant-NOTICE.txt delete mode 100644 代码/workspace_robo4/tools/licenses/mvn-LICENSE.txt delete mode 100644 代码/workspace_robo4/tools/licenses/mvn-NOTICE.txt delete mode 100644 代码/workspace_robo4/tools/loadTools.cmd delete mode 100644 代码/workspace_robo4/tools/loadTools.sh delete mode 100644 代码/workspace_robo4/tools/loader/Loader.java delete mode 100644 代码/workspace_robo4/versions.md delete mode 100644 文档/robocode机器人战斗模拟——汇报.pptx delete mode 100644 文档/robocode机器人战斗模拟——海报.jpg delete mode 100644 文档/robocode机器人战斗模拟——视频.mp4 delete mode 100644 文档/robocode机器人战斗模拟——需求规约.docx delete mode 100644 文档/软件需求规格说明书.doc delete mode 100644 模型/robocode机器人战斗模拟——软件模型.vsdx diff --git a/robocode战斗机器人——夏季学期计划.mpp b/robocode战斗机器人——夏季学期计划.mpp deleted file mode 100644 index b36984ca1c0fd638dece4d20ffaf516c4a0dfa3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313856 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 - - RemoteSystemsTempFiles - - - - - - - org.eclipse.rse.ui.remoteSystemsTempNature - - diff --git a/代码/workspace_robo4/jacobe.cmd b/代码/workspace_robo4/jacobe.cmd deleted file mode 100644 index 6c4a0e8..0000000 --- a/代码/workspace_robo4/jacobe.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - - -@rem NOTE: Here we expect jacobe.exe to be installed on system PATH - -@echo off -if exist "%~dp0\tools\lib\jacobe.jar" goto jacobe -call "%~dp0\tools\loadTools.cmd" - -:jacobe -call "%~dp0\tools\bin\ant.bat" -buildfile "%~dp0\tools\jacobe\build.xml" \ No newline at end of file diff --git a/代码/workspace_robo4/jacobe.sh b/代码/workspace_robo4/jacobe.sh deleted file mode 100644 index 4450e4e..0000000 --- a/代码/workspace_robo4/jacobe.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -# NOTE: Here we expect the jacobe tools to be installed on PATH - -dp0=${0%/*} - -if [ ! -f $dp0/tools/lib/ant-launcher.jar ]; then - $dp0/tools/loadTools.sh -elif [ ! -f $dp0/tools/lib/ant.jar ]; then - $dp0/tools/loadTools.sh -elif [ ! -f $dp0/tools/lib/jacobe.jar ]; then - $dp0/tools/loadTools.sh -fi - -export CLASSPATH=$CLASSPATH:$dp0/tools/lib/ant-launcher.jar:$dp0/tools/lib/ant.jar:$dp0/tools/lib/jacobe.jar -$dp0/tools/bin/ant.sh -buildfile $dp0/tools/jacobe/build.xml - diff --git a/代码/workspace_robo4/mvn.cmd b/代码/workspace_robo4/mvn.cmd deleted file mode 100644 index 133774c..0000000 --- a/代码/workspace_robo4/mvn.cmd +++ /dev/null @@ -1,15 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -if not exist "%~dp0\tools\lib\maven-*-uber.jar" ( - call "%~dp0\tools\loadTools.cmd" -) - -call "%~dp0\tools\bin\mvn.bat" %* \ No newline at end of file diff --git a/代码/workspace_robo4/mvn.sh b/代码/workspace_robo4/mvn.sh deleted file mode 100644 index 2ea9c12..0000000 --- a/代码/workspace_robo4/mvn.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -dp0=${0%/*} - -if [ ! -f $dp0/tools/lib/maven-*-uber.jar ]; then - $dp0/tools/loadTools.sh -fi - -$dp0/tools/bin/mvn.sh $* \ No newline at end of file diff --git a/代码/workspace_robo4/mvnassembly.cmd b/代码/workspace_robo4/mvnassembly.cmd deleted file mode 100644 index fb10c4c..0000000 --- a/代码/workspace_robo4/mvnassembly.cmd +++ /dev/null @@ -1,12 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -mvn clean install ant:ant -DskipTests=false %* -rem mvn eclipse:eclipse \ No newline at end of file diff --git a/代码/workspace_robo4/mvnassembly.sh b/代码/workspace_robo4/mvnassembly.sh deleted file mode 100644 index a498a71..0000000 --- a/代码/workspace_robo4/mvnassembly.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -./mvn.sh clean install ant:ant -DskipTests=false $* -#./mvn.sh eclipse:eclipse \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/.project b/代码/workspace_robo4/plugins/.project deleted file mode 100644 index 0ab6892..0000000 --- a/代码/workspace_robo4/plugins/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - plugins - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/ReadMe.txt b/代码/workspace_robo4/plugins/dotnet/ReadMe.txt deleted file mode 100644 index 7466121..0000000 --- a/代码/workspace_robo4/plugins/dotnet/ReadMe.txt +++ /dev/null @@ -1,88 +0,0 @@ -==== - Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://robocode.sourceforge.net/license/epl-v10.html -==== - -This is guide to build Robocode for .NET - -REQUIRED TOOLS FOR BUILDING THE ROBOCODE .NET PLUG-IN -===================================================== - -Microsoft C# Compiler and .NET SDK ----------------------------------- -- You need C# compiler and .NET SDK at least 4.0: - http://www.microsoft.com/en-us/download/details.aspx?id=17851 - -- Best option is to install Visual Studio C# Express 2010 or newer. - -- NOTE: Make sure you have csc.exe on PATH. - -Microsoft HTML Help 1 Compiler and Sandcastle Help File Builder ---------------------------------------------------------------- -- 'HTML Help 1 compiler' must be installed on the system - required by the - Sandcastle Help File Builder (SHFB) - - HTML Help 1 compiler: - http://msdn.microsoft.com/en-us/library/ms669985(VS.85).aspx - -- Sandcastle Help File Builder (SHFB) must be installed on the system. - http://shfb.codeplex.com/ - - NOTE: When installing the SHFB, you don't need to install HTML Help 2 as - only version 1 is used for Robocode. - -Java Development Kit (JDK) and JAVA_HOME path ---------------------------------------------- -- Oracle JDK 6 or newer must be installed on the system: - http://www.oracle.com/technetwork/java/javase/downloads - -- NOTE: Make sure to install the proper version (32 or 64-bit) depending on the - system. - - -HOW TO BUILD THE ROBOCODE .NET PLUG-IN -====================================== - -1) Build the regular part of Robocode first with 'mvn install' - (or mvnassembly.cmd) from source code root directory of Robocode. - -2) CD (change directory) to \plugins\dotnet - -3) Run: tools\loadTools.cmd - -4) Run: tools\keys\gennetkey.cmd - -5) Run: mvnassembly.cmd (standing in the \plugins\dotnet directory) - -9) Find the resulting distribution file for the Robocode .NET plug-in named - robocode.dotnet-x.x.x.x-setup.jar within this directory: - \plugins\dotnet\robocode.dotnet.distribution\target\ - - -HOW TO BUILD NEW PROXY CLASSES USING JNI4NET -============================================ -Robocode uses Jni4net (http://jni4net.com/) to bridge the .NET and Java parts -of Robocode. Only the .NET plug-in is written for the Microsoft .NET platform. -The rest of Robocode is build for the Java platform. - -When changing the public APIs or internal classes of Robocode it is important -that the corresponding .NET classes are updated as well. Some classes for the -.NET are handwritten. Other parts are auto-generated using the Jni4Net proxygen -tool (details are provided here: http://jni4net.com/). - -In order to update all the auto-generated source files for the .NET plugin you -must: - -1) CD (change directory) to \plugins\dotnet - -2) Run: generateProxies.cmd - -NOTE: You might need to remove the 'rem' and change the following lines inside - the generateProxies.cmd in order to force the JAVA_HOME and PATH to the - correct Java version: - -rem set JAVA_HOME=%JDK6_HOME% -rem set PATH=%JAVA_HOME%\bin;%PATH% \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/generateProxies.cmd b/代码/workspace_robo4/plugins/dotnet/generateProxies.cmd deleted file mode 100644 index 4b0c808..0000000 --- a/代码/workspace_robo4/plugins/dotnet/generateProxies.cmd +++ /dev/null @@ -1,41 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -rem set JAVA_HOME=%JDK6_HOME% -rem set PATH=%JAVA_HOME%\bin;%PATH% - -set NET_FRAMEWORK_HOME=C:\Windows\Microsoft.NET\Framework\v3.5 -set PATH=%NET_FRAMEWORK_HOME%;%PATH% - -if exist "%~dp0\tools\lib\proxygen.exe" goto gen -call "%~dp0\tools\loadTools.cmd" - -:gen -"%~dp0\tools\lib\proxygen.exe" tools\proxygen\robocode.control.proxygen.xml -"%~dp0\tools\lib\proxygen.exe" tools\proxygen\robocode.proxygen.xml - -if exist "%~dp0\robocode.dotnet.nhost\target\robocode.dotnet.nhost.dll" goto gen1 -echo cat't find robocode.dotnet.nhost\target\robocode.dotnet.nhost.dll, please compile it -goto end - -:gen1 -if exist "%~dp0\tools\lib\robocode.dll" goto gen3 -if exist "%~dp0\robocode.dotnet.api\target\robocode.dll" goto gen2 -echo cat't find \robocode.dotnet.api\target\robocode.dll, please compile it -goto end - -:gen2 - -copy "%~dp0\robocode.dotnet.api\target\robocode.dll" "%~dp0\tools\lib" - -:gen3 -"%~dp0\tools\lib\proxygen.exe" tools\proxygen\robocode.proxygen.net.xml - -:end \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/mvn.cmd b/代码/workspace_robo4/plugins/dotnet/mvn.cmd deleted file mode 100644 index 17e6ed1..0000000 --- a/代码/workspace_robo4/plugins/dotnet/mvn.cmd +++ /dev/null @@ -1,20 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -if not exist "%~dp0\tools\lib" ( - mkdir "%~dp0\tools\lib" - call "%~dp0\tools\loadTools.cmd" -) - -if not exist "%~dp0\..\..\tools\lib\maven-*-uber.jar" ( - call "%~dp0\..\..\tools\loadTools.cmd" -) - -call "%~dp0\..\..\mvn" %* \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/mvnassembly.cmd b/代码/workspace_robo4/plugins/dotnet/mvnassembly.cmd deleted file mode 100644 index fb10c4c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/mvnassembly.cmd +++ /dev/null @@ -1,12 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -mvn clean install ant:ant -DskipTests=false %* -rem mvn eclipse:eclipse \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/pom.xml b/代码/workspace_robo4/plugins/dotnet/pom.xml deleted file mode 100644 index c063b01..0000000 --- a/代码/workspace_robo4/plugins/dotnet/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - robocode.dotnet - .NET Robocode - ${robocode.dotnet.version} - pom - - net.sf.robocode - robocode - ${robocode.version} - ../.. - - - - jni4net.repo - jni4net Repository - http://jni4net.googlecode.com/svn/mvnrepo - - - aduna.repo - Aduna Repository - http://repository.aduna-software.org/maven2/ - - - - robocode.dotnet.api - robocode.dotnet.control.api - robocode.dotnet.content - robocode.dotnet.distribution - robocode.dotnet.host - robocode.dotnet.nhost - robocode.dotnet.ntests - robocode.dotnet.robotscs - robocode.dotnet.installer - robocode.dotnet.samples - robocode.dotnet.tests - - - - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - true - 0.17robocode - - - org.sonatype.nmaven.plugins - maven-dotnet-test-plugin - 0.17robocode - - - org.jvnet.maven-antrun-extended-plugin - maven-antrun-extended-plugin - 1.43 - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.project deleted file mode 100644 index 3b435ab..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.project +++ /dev/null @@ -1,8 +0,0 @@ - - - robocode.dotnet.api - .NET Robot API for Robocode. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 070758f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,10 +0,0 @@ -#Tue Nov 27 22:34:10 CET 2012 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 -encoding/src/main/resources=8859_1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/test/resources=8859_1 -encoding/src=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/pom.xml deleted file mode 100644 index cc1a6fc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - robocode.dotnet.api - Robocode .NET Robot API - .NET Robot API for Robocode - dotnet:library - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - robocode - src - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - - /unsafe /warn:0 /nowarn:1591 /keyfile:"${basedir}/../tools/keys/robocode.snk" - robocode.dll - - - - org.jvnet.maven-antrun-extended-plugin - maven-antrun-extended-plugin - - - process-classes - - - - - - - - - - - run - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robocode.dotnet.api.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robocode.dotnet.api.iml deleted file mode 100644 index 284265c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robocode.dotnet.api.iml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robotAPI.shfbproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robotAPI.shfbproj deleted file mode 100644 index b0d9b8a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/robotAPI.shfbproj +++ /dev/null @@ -1,87 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - {90f0d09b-f58d-4f2e-ac8a-164d89979ef1} - 1.9.5.0 - - Documentation - Documentation - Documentation - - .\target\Help\ - RobotAPI - - - - - AutoDocumentCtors, AutoDocumentDispose - Robocode Robot API for .NET - .NET Framework 3.5 - HtmlHelp1, Website - - - - - - - - - - - - - - - - - - - - - - - - - - InheritedMembers, Protected, SealedProtected - - Robot API used for writing robots for Robocode - Robot Interfaces used for creating new robot types, e.g. with other programming languages. - Robot peers available for implementing new robot types based on the Robot Interfaces. - Utility classes that can be used when writing robots. Kept for compatibility with legacy robots. - - Robocode Robot API for .NET - Copyright %28c%29 2001-2016 Mathew A. Nelson and Robocode contributors - fnl%40users.sourceforge.net - administator and maintainer of Robocode - vs2010 - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/.gitignore b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/.gitignore deleted file mode 100644 index 880d47a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/obj -/robocode.dotnet.api.sln -/robocode.dotnet.api.suo diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/AssemblyInf.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/AssemblyInf.cs deleted file mode 100644 index e7376c7..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/AssemblyInf.cs +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System.Security; - -[assembly: AllowPartiallyTrustedCallers] \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/io/LoggerN.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/io/LoggerN.cs deleted file mode 100644 index aeea87e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/io/LoggerN.cs +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using System.Security.Permissions; -using System.Text; -using net.sf.robocode.security; - -namespace net.sf.robocode.io -{ -#pragma warning disable 1591 - /// - /// This is a class used for logging. - /// - /// - [RobocodeInternalPermission(SecurityAction.LinkDemand)] - public class LoggerN - { - public static TextWriter realOut = Console.Out; - public static TextWriter realErr = Console.Error; - public static TextWriter robotOut = Console.Out; - - private static ILoggerN logListener; - private static readonly StringBuilder logBuffer = new StringBuilder(); - [ThreadStatic] public static bool IsSafeThread; - - public static void setLogListener(ILoggerN logListener) - { - LoggerN.logListener = logListener; - } - - public static void logMessage(string s) - { - logMessage(s, true); - } - - public static void logMessage(Exception e) - { - logMessage(e.StackTrace); - } - - public static void logMessage(string message, Exception t) - { - logMessage(message + ":\n" + t.StackTrace); - } - - public static void logError(string message, Exception t) - { - logError(message + ":\n" + t.StackTrace); - } - - public static void logError(Exception t) - { - logError(t.StackTrace); - } - - public static void logMessage(string s, bool newline) - { - if (logListener == null) - { - if (newline) - { - realOut.WriteLine(s); - } - else - { - realOut.Write(s); - realOut.Flush(); - } - } - else - { - lock (logBuffer) - { - if (!IsSafeThread) - { - // we just queue it, to not let unsafe thread travel thru system - logBuffer.Append(s); - logBuffer.Append("\n"); - } - else if (newline) - { - logMessage(logBuffer + s, true); - logBuffer.Length = 0; - } - else - { - logBuffer.Append(s); - } - } - } - } - - public static void logError(string s) - { - if (logListener == null) - { - realErr.WriteLine(s); - } - else - { - logListener.logError(s); - } - } - - public static void WriteLineToRobotsConsole(string s) - { - if (robotOut != null) - { - robotOut.WriteLine(s); - } - else - { - logMessage(s); - } - } - } - - /// - public interface ILoggerN - { - void logMessage(string s, bool newline); - void logError(string s); - } -} - -//happy \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/Buffer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/Buffer.cs deleted file mode 100644 index f1e3056..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/Buffer.cs +++ /dev/null @@ -1,508 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -// This class is based on the source code from Sun's Java 1.5.0 API for java.nio.Buffer, but -// rewritten for C# and .NET with the purpose to bridge the .NET and Java internals of Robocode. - -using System; -using System.Security.Permissions; -using net.sf.robocode.security; - -// ReSharper disable InconsistentNaming - -namespace net.sf.robocode.nio -{ -#pragma warning disable 1591 -#pragma warning disable 1570 - - /* - * A container for data of a specific primitive type. - * - *

A buffer is a linear, finite sequence of elements of a specific - * primitive type. Aside from its content, the essential properties of a - * buffer are its capacity, limit, and position:

- * - *
- * - *

A buffer's capacity is the number of elements it contains. The - * capacity of a buffer is never negative and never changes.

- * - *

A buffer's limit is the index of the first element that should - * not be read or written. A buffer's limit is never negative and is never - * greater than its capacity.

- * - *

A buffer's position is the index of the next element to be - * read or written. A buffer's position is never negative and is never - * greater than its limit.

- * - *
- * - *

There is one subclass of this class for each non-boolean primitive type. - * - * - *

Transferring data

- * - *

Each subclass of this class defines two categories of get and - * put operations:

- * - *
- * - *

Relative operations read or write one or more elements starting - * at the current position and then increment the position by the number of - * elements transferred. If the requested transfer exceeds the limit then a - * relative get operation throws a {@link BufferUnderflowException} - * and a relative put operation throws a {@link - * BufferOverflowException}; in either case, no data is transferred.

- * - *

Absolute operations take an explicit element index and do not - * affect the position. Absolute get and put operations throw - * an {@link IndexOutOfBoundsException} if the index argument exceeds the - * limit.

- * - *
- * - *

Data may also, of course, be transferred in to or out of a buffer by the - * I/O operations of an appropriate channel, which are always relative to the - * current position. - * - * - *

Marking and resetting

- * - *

A buffer's mark is the index to which its position will be reset - * when the {@link #reset reset} method is invoked. The mark is not always - * defined, but when it is defined it is never negative and is never greater - * than the position. If the mark is defined then it is discarded when the - * position or the limit is adjusted to a value smaller than the mark. If the - * mark is not defined then invoking the {@link #reset reset} method causes an - * {@link InvalidMarkException} to be thrown. - * - * - *

Invariants

- * - *

The following invariant holds for the mark, position, limit, and - * capacity values: - * - *

- * 0 <= - * mark <= - * position <= - * limit <= - * capacity - *
- * - *

A newly-created buffer always has a position of zero and a mark that is - * undefined. The initial limit may be zero, or it may be some other value - * that depends upon the type of the buffer and the manner in which it is - * constructed. The initial content of a buffer is, in general, - * undefined. - * - * - *

Clearing, flipping, and rewinding

- * - *

In addition to methods for accessing the position, limit, and capacity - * values and for marking and resetting, this class also defines the following - * operations upon buffers: - * - *

    - * - *
  • {@link #clear} makes a buffer ready for a new sequence of - * channel-read or relative put operations: It sets the limit to the - * capacity and the position to zero.

  • - * - *
  • {@link #flip} makes a buffer ready for a new sequence of - * channel-write or relative get operations: It sets the limit to the - * current position and then sets the position to zero.

  • - * - *
  • {@link #rewind} makes a buffer ready for re-reading the data that - * it already contains: It leaves the limit unchanged and sets the position - * to zero.

  • - * - *
- * - * - *

Read-only buffers

- * - *

Every buffer is readable, but not every buffer is writable. The - * mutation methods of each buffer class are specified as optional - * operations that will throw a {@link ReadOnlyBufferException} when - * invoked upon a read-only buffer. A read-only buffer does not allow its - * content to be changed, but its mark, position, and limit values are mutable. - * Whether or not a buffer is read-only may be determined by invoking its - * {@link #isReadOnly isReadOnly} method. - * - * - *

Thread safety

- * - *

Buffers are not safe for use by multiple concurrent threads. If a - * buffer is to be used by more than one thread then access to the buffer - * should be controlled by appropriate synchronization. - * - * - *

Invocation chaining

- * - *

Methods in this class that do not otherwise have a value to return are - * specified to return the buffer upon which they are invoked. This allows - * method invocations to be chained; for example, the sequence of statements - * - *

-     * b.flip();
-     * b.position(23);
-     * b.limit(42);
- * - * can be replaced by the single, more compact statement - * - *
-     * b.flip().position(23).limit(42);
- * - * - * @author Mark Reinhold - * @author JSR-51 Expert Group - * @version 1.35, 06/08/11 - * @since 1.4 - */ - - /// - [RobocodeInternalPermission(SecurityAction.LinkDemand)] - public abstract class Buffer - { - // Invariants: mark <= position <= limit <= capacity - private readonly int _capacity; - private int _limit; - private int _mark = -1; - private int _position; - - // Creates a new buffer with the given mark, position, limit, and capacity, - // after checking invariants. - // - protected Buffer(int mark, int pos, int lim, int cap) - { - // package-private - if (cap < 0) - throw new ArgumentException(); - _capacity = cap; - limit(lim); - position(pos); - if (mark >= 0) - { - if (mark > pos) - throw new ArgumentException(); - _mark = mark; - } - } - - /* - * Returns this buffer's capacity.

- * - * @return The capacity of this buffer - */ - public int capacity() - { - return _capacity; - } - - /* - * Returns this buffer's position.

- * - * @return The position of this buffer - */ - public int position() - { - return _position; - } - - /* - * Sets this buffer's position. If the mark is defined and larger than the - * new position then it is discarded.

- * - * @param newPosition - * The new position value; must be non-negative - * and no larger than the current limit - * - * @return This buffer - * - * @throws ArgumentException - * If the preconditions on newPosition do not hold - */ - public Buffer position(int newPosition) - { - if ((newPosition > _limit) || (newPosition < 0)) - throw new ArgumentException(); - _position = newPosition; - if (_mark > _position) _mark = -1; - return this; - } - - /* - * Returns this buffer's limit.

- * - * @return The limit of this buffer - */ - public int limit() - { - return _limit; - } - - /* - * Sets this buffer's limit. If the position is larger than the new limit - * then it is set to the new limit. If the mark is defined and larger than - * the new limit then it is discarded.

- * - * @param newLimit - * The new limit value; must be non-negative - * and no larger than this buffer's capacity - * - * @return This buffer - * - * @throws ArgumentException - * If the preconditions on newLimit do not hold - */ - public Buffer limit(int newLimit) - { - if ((newLimit > _capacity) || (newLimit < 0)) - throw new ArgumentException(); - _limit = newLimit; - if (_position > _limit) _position = _limit; - if (_mark > _limit) _mark = -1; - return this; - } - - /* - * Sets this buffer's mark at its position.

- * - * @return This buffer - */ - public Buffer mark() - { - _mark = _position; - return this; - } - - /* - * Resets this buffer's position to the previously-marked position. - * - *

Invoking this method neither changes nor discards the mark's - * value.

- * - * @return This buffer - * - * @throws InvalidMarkException - * If the mark has not been set - */ - public Buffer reset() - { - int m = _mark; - if (m < 0) - throw new InvalidMarkException(); - _position = m; - return this; - } - - /* - * Clears this buffer. The position is set to zero, the limit is set to - * the capacity, and the mark is discarded. - * - *

Invoke this method before using a sequence of channel-read or - * put operations to fill this buffer. For example: - * - *

-         * buf.clear();     // Prepare buffer for reading
-         * in.read(buf);    // Read data
- * - *

This method does not actually erase the data in the buffer, but it - * is named as if it did because it will most often be used in situations - * in which that might as well be the case.

- * - * @return This buffer - */ - public Buffer clear() - { - _position = 0; - _limit = _capacity; - _mark = -1; - return this; - } - - /* - * Flips this buffer. The limit is set to the current position and then - * the position is set to zero. If the mark is defined then it is - * discarded. - * - *

After a sequence of channel-read or put operations, invoke - * this method to prepare for a sequence of channel-write or relative - * get operations. For example: - * - *

-         * buf.put(magic);    // Prepend header
-         * in.read(buf);      // Read data into rest of buffer
-         * buf.flip();        // Flip buffer
-         * out.write(buf);    // Write header + data to channel
- * - *

This method is often used in conjunction with the {@link - * java.nio.ByteBuffer#compact compact} method when transferring data from - * one place to another.

- * - * @return This buffer - */ - public Buffer flip() - { - _limit = _position; - _position = 0; - _mark = -1; - return this; - } - - /* - * Rewinds this buffer. The position is set to zero and the mark is - * discarded. - * - *

Invoke this method before a sequence of channel-write or get - * operations, assuming that the limit has already been set - * appropriately. For example: - * - *

-         * out.write(buf);    // Write remaining data
-         * buf.rewind();      // Rewind buffer
-         * buf.get(array);    // Copy data into array
- * - * @return This buffer - */ - public Buffer rewind() - { - _position = 0; - _mark = -1; - return this; - } - - /* - * Returns the number of elements between the current position and the - * limit.

- * - * @return The number of elements remaining in this buffer - */ - public int remaining() - { - return _limit - _position; - } - - /* - * Tells whether there are any elements between the current position and - * the limit.

- * - * @return true if, and only if, there is at least one element - * remaining in this buffer - */ - public bool hasRemaining() - { - return _position < _limit; - } - - /* - * Tells whether or not this buffer is read-only.

- * - * @return true if, and only if, this buffer is read-only - */ - public abstract bool isReadOnly(); - - - // -- Package-private methods for bounds checking, etc. -- - - /* - * Checks the current position against the limit, throwing a {@link - * BufferUnderflowException} if it is not smaller than the limit, and then - * increments the position.

- * - * @return The current position value, before it is incremented - */ - internal int nextGetIndex() - { - // package-private - if (_position >= _limit) - throw new BufferUnderflowException(); - return _position++; - } - - internal int nextGetIndex(int nb) - { - // package-private - if (_limit - _position < nb) - throw new BufferUnderflowException(); - int p = _position; - _position += nb; - return p; - } - - /* - * Checks the current position against the limit, throwing a {@link - * BufferOverflowException} if it is not smaller than the limit, and then - * increments the position.

- * - * @return The current position value, before it is incremented - */ - internal int nextPutIndex() - { - // package-private - if (_position >= _limit) - throw new BufferOverflowException(); - return _position++; - } - - internal int nextPutIndex(int nb) - { - // package-private - if (_limit - _position < nb) - throw new BufferOverflowException(); - int p = _position; - _position += nb; - return p; - } - - /* - * Checks the given index against the limit, throwing an {@link - * IndexOutOfBoundsException} if it is not smaller than the limit - * or is smaller than zero. - */ - internal int checkIndex(int i) - { - // package-private - if ((i < 0) || (i >= _limit)) - throw new IndexOutOfRangeException(); - return i; - } - - internal int checkIndex(int i, int nb) - { - // package-private - if ((i < 0) || (nb > _limit - i)) - throw new IndexOutOfRangeException(); - return i; - } - - internal int markValue() - { - // package-private - return _mark; - } - - internal void discardMark() - { - // package-private - _mark = -1; - } - - internal static void checkBounds(int off, int len, int size) - { - // package-private - if ((off | len | (off + len) | (size - (off + len))) < 0) - throw new IndexOutOfRangeException(); - } - } -#pragma warning restore 1591 -} - -// ReSharper restore InconsistentNaming \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/ByteBuffer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/ByteBuffer.cs deleted file mode 100644 index 761a59f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/ByteBuffer.cs +++ /dev/null @@ -1,1604 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -// This class is based on the source code from Sun's Java 1.5.0 API for java.nio.ByteBuffer, but -// rewritten for C# and .NET with the purpose to bridge the .NET and Java internals of Robocode. - -using System; -using System.Security.Permissions; -using System.Text; -using net.sf.robocode.security; - -// ReSharper disable InconsistentNaming - -namespace net.sf.robocode.nio -{ -#pragma warning disable 1591 -#pragma warning disable 1570 - /// - public enum ByteOrder - { - BIG_ENDIAN, - LITTLE_ENDIAN, - } - - /* - * A byte buffer. - * - *

This class defines six categories of operations upon - * byte buffers: - * - *

    - * - *
  • Absolute and relative {@link #get() get} and - * {@link #put(byte) put} methods that read and write - * single bytes;

  • - * - *
  • Relative {@link #get(byte[]) bulk get} - * methods that transfer contiguous sequences of bytes from this buffer - * into an array;

  • - * - *
  • Relative {@link #put(byte[]) bulk put} - * methods that transfer contiguous sequences of bytes from a - * byte array or some other byte - * buffer into this buffer;

  • - * - * - *
  • Absolute and relative {@link #getChar() get} - * and {@link #putChar(char) put} methods that read and - * write values of other primitive types, translating them to and from - * sequences of bytes in a particular byte order;

  • - * - *
  • Methods for creating view buffers, - * which allow a byte buffer to be viewed as a buffer containing values of - * some other primitive type; and

  • - * - * - *
  • Methods for {@link #compact compacting}, {@link - * #duplicate duplicating}, and {@link #slice - * slicing} a byte buffer.

  • - * - *
- * - *

Byte buffers can be created either by {@link #allocate - * allocation}, which allocates space for the buffer's - * - * - * content, or by {@link #wrap(byte[]) wrapping} an - * existing byte array into a buffer. - * - * - * - * - *

Direct vs. non-direct buffers

- * - *

A byte buffer is either direct or non-direct. Given a - * direct byte buffer, the Java virtual machine will make a best effort to - * perform native I/O operations directly upon it. That is, it will attempt to - * avoid copying the buffer's content to (or from) an intermediate buffer - * before (or after) each invocation of one of the underlying operating - * system's native I/O operations. - * - *

A direct byte buffer may be created by invoking the {@link - * #allocateDirect(int) allocateDirect} factory method of this class. The - * buffers returned by this method typically have somewhat higher allocation - * and deallocation costs than non-direct buffers. The contents of direct - * buffers may reside outside of the normal garbage-collected heap, and so - * their impact upon the memory footprint of an application might not be - * obvious. It is therefore recommended that direct buffers be allocated - * primarily for large, long-lived buffers that are subject to the underlying - * system's native I/O operations. In general it is best to allocate direct - * buffers only when they yield a measureable gain in program performance. - * - *

A direct byte buffer may also be created by {@link - * java.nio.channels.FileChannel#map mapping} a region of a file - * directly into memory. An implementation of the Java platform may optionally - * support the creation of direct byte buffers from native code via JNI. If an - * instance of one of these kinds of buffers refers to an inaccessible region - * of memory then an attempt to access that region will not change the buffer's - * content and will cause an unspecified exception to be thrown either at the - * time of the access or at some later time. - * - *

Whether a byte buffer is direct or non-direct may be determined by - * invoking its {@link #isDirect isDirect} method. This method is provided so - * that explicit buffer management can be done in performance-critical code. - * - * - * - *

Access to binary data

- * - *

This class defines methods for reading and writing values of all other - * primitive types, except boolean. Primitive values are translated - * to (or from) sequences of bytes according to the buffer's current byte - * order, which may be retrieved and modified via the {@link #order order} - * methods. Specific byte orders are represented by instances of the {@link - * ByteOrder} class. The initial order of a byte buffer is always {@link - * ByteOrder#BIG_ENDIAN BIG_ENDIAN}. - * - *

For access to heterogeneous binary data, that is, sequences of values of - * different types, this class defines a family of absolute and relative - * get and put methods for each type. For 32-bit floating-point - * values, for example, this class defines: - * - *

-     * float  {@link #getFloat()}
-     * float  {@link #getFloat(int) getFloat(int index)}
-     *  void  {@link #putFloat(float) putFloat(float f)}
-     *  void  {@link #putFloat(int,float) putFloat(int index, float f)}
- * - *

Corresponding methods are defined for the types char, - * short, int, long, and double. The index - * parameters of the absolute get and put methods are in terms of - * bytes rather than of the type being read or written. - * - * - * - *

For access to homogeneous binary data, that is, sequences of values of - * the same type, this class defines methods that can create views of a - * given byte buffer. A view buffer is simply another buffer whose - * content is backed by the byte buffer. Changes to the byte buffer's content - * will be visible in the view buffer, and vice versa; the two buffers' - * position, limit, and mark values are independent. The {@link - * #asFloatBuffer() asFloatBuffer} method, for example, creates an instance of - * the {@link FloatBuffer} class that is backed by the byte buffer upon which - * the method is invoked. Corresponding view-creation methods are defined for - * the types char, short, int, long, and - * double. - * - *

View buffers have three important advantages over the families of - * type-specific get and put methods described above: - * - *

- * - *

The byte order of a view buffer is fixed to be that of its byte buffer - * at the time that the view is created.

- * - * - *

Invocation chaining

- * - *

Methods in this class that do not otherwise have a value to return are - * specified to return the buffer upon which they are invoked. This allows - * method invocations to be chained. - * - * - * The sequence of statements - * - *

-     * bb.putInt(0xCAFEBABE);
-     * bb.putShort(3);
-     * bb.putShort(45);
- * - * can, for example, be replaced by the single statement - * - *
-     * bb.putInt(0xCAFEBABE).putShort(3).putShort(45);
- * - * - * - * @author Mark Reinhold - * @author JSR-51 Expert Group - * @version 1.56, 04/07/16 - * @since 1.4 - */ - - /// - [RobocodeInternalPermission(SecurityAction.LinkDemand)] - public abstract class ByteBuffer : Buffer //, Comparable - { - // These fields are declared here rather than in Heap-X-Buffer in order to - // reduce the number of virtual method invocations needed to access these - // values, which is especially costly when coding small buffers. - // - internal int _offset; - - internal bool bigEndian // package-private - = true; - - internal byte[] hb; // Non-null only for heap buffers - - internal bool nativeByteOrder // package-private - = true; - - // Creates a new buffer with the given mark, position, limit, capacity, - // backing array, and array offset - // - internal ByteBuffer(int mark, int pos, int lim, int cap, // package-private - byte[] hb, int offset) - : base(mark, pos, lim, cap) - { - this.hb = hb; - _offset = offset; - } - - // Creates a new buffer with the given mark, position, limit, and capacity - // - internal ByteBuffer(int mark, int pos, int lim, int cap) - : this(mark, pos, lim, cap, null, 0) - { - // package-private - } - - - /* - * Allocates a new direct byte buffer. - * - *

The new buffer's position will be zero, its limit will be its - * capacity, and its mark will be undefined. Whether or not it has a - * {@link #hasArray backing array} is unspecified.

- * - * @param capacity - * The new buffer's capacity, in bytes - * - * @return The new byte buffer - * - * @throws ArgumentException - * If the capacity is a negative integer - */ - - public static ByteBuffer allocateDirect(int capacity) - { - if (capacity < 0) - throw new ArgumentException(); - return new HeapByteBuffer(capacity, capacity); - } - - - /* - * Allocates a new byte buffer. - * - *

The new buffer's position will be zero, its limit will be its - * capacity, and its mark will be undefined. It will have a {@link #array - * backing array}, and its {@link #arrayOffset array - * offset} will be zero. - * - * @param capacity - * The new buffer's capacity, in bytes - * - * @return The new byte buffer - * - * @throws ArgumentException - * If the capacity is a negative integer - */ - - public static ByteBuffer allocate(int capacity) - { - if (capacity < 0) - throw new ArgumentException(); - return new HeapByteBuffer(capacity, capacity); - } - - /* - * Wraps a byte array into a buffer. - * - *

The new buffer will be backed by the given byte array; - * that is, modifications to the buffer will cause the array to be modified - * and vice versa. The new buffer's capacity will be - * array.length, its position will be offset, its limit - * will be offset + length, and its mark will be undefined. Its - * {@link #array backing array} will be the given array, and - * its {@link #arrayOffset array offset} will be zero.

- * - * @param array - * The array that will back the new buffer - * - * @param offset - * The offset of the subarray to be used; must be non-negative and - * no larger than array.length. The new buffer's position - * will be set to this value. - * - * @param length - * The length of the subarray to be used; - * must be non-negative and no larger than - * array.length - offset. - * The new buffer's limit will be set to offset + length. - * - * @return The new byte buffer - * - * @throws IndexOutOfBoundsException - * If the preconditions on the offset and length - * parameters do not hold - */ - - public static ByteBuffer wrap(byte[] array, - int offset, int length) - { - try - { - return new HeapByteBuffer(array, offset, length); - } - catch (ArgumentException) - { - throw new IndexOutOfRangeException(); - } - } - - /* - * Wraps a byte array into a buffer. - * - *

The new buffer will be backed by the given byte array; - * that is, modifications to the buffer will cause the array to be modified - * and vice versa. The new buffer's capacity and limit will be - * array.length, its position will be zero, and its mark will be - * undefined. Its {@link #array backing array} will be the - * given array, and its {@link #arrayOffset array offset} will - * be zero.

- * - * @param array - * The array that will back this buffer - * - * @return The new byte buffer - */ - - public static ByteBuffer wrap(byte[] array) - { - return wrap(array, 0, array.Length); - } - - - /* - * Creates a new byte buffer whose content is a shared subsequence of - * this buffer's content. - * - *

The content of the new buffer will start at this buffer's current - * position. Changes to this buffer's content will be visible in the new - * buffer, and vice versa; the two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's position will be zero, its capacity and its limit - * will be the number of bytes remaining in this buffer, and its mark - * will be undefined. The new buffer will be direct if, and only if, this - * buffer is direct, and it will be read-only if, and only if, this buffer - * is read-only.

- * - * @return The new byte buffer - */ - public abstract ByteBuffer slice(); - - /* - * Creates a new byte buffer that shares this buffer's content. - * - *

The content of the new buffer will be that of this buffer. Changes - * to this buffer's content will be visible in the new buffer, and vice - * versa; the two buffers' position, limit, and mark values will be - * independent. - * - *

The new buffer's capacity, limit, position, and mark values will be - * identical to those of this buffer. The new buffer will be direct if, - * and only if, this buffer is direct, and it will be read-only if, and - * only if, this buffer is read-only.

- * - * @return The new byte buffer - */ - public abstract ByteBuffer duplicate(); - - /* - * Creates a new, read-only byte buffer that shares this buffer's - * content. - * - *

The content of the new buffer will be that of this buffer. Changes - * to this buffer's content will be visible in the new buffer; the new - * buffer itself, however, will be read-only and will not allow the shared - * content to be modified. The two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's capacity, limit, position, and mark values will be - * identical to those of this buffer. - * - *

If this buffer is itself read-only then this method behaves in - * exactly the same way as the {@link #duplicate duplicate} method.

- * - * @return The new, read-only byte buffer - */ - public abstract ByteBuffer asReadOnlyBuffer(); - - - // -- Singleton get/put methods -- - - /* - * Relative get method. Reads the byte at this buffer's - * current position, and then increments the position.

- * - * @return The byte at the buffer's current position - * - * @throws BufferUnderflowException - * If the buffer's current position is not smaller than its limit - */ - public abstract byte get(); - - /* - * Relative put method  (optional operation). - * - *

Writes the given byte into this buffer at the current - * position, and then increments the position.

- * - * @param b - * The byte to be written - * - * @return This buffer - * - * @throws BufferOverflowException - * If this buffer's current position is not smaller than its limit - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer put(byte b); - - /* - * Absolute get method. Reads the byte at the given - * index.

- * - * @param index - * The index from which the byte will be read - * - * @return The byte at the given index - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit - */ - public abstract byte get(int index); - - /* - * Absolute put method  (optional operation). - * - *

Writes the given byte into this buffer at the given - * index.

- * - * @param index - * The index at which the byte will be written - * - * @param b - * The byte value to be written - * - * @return This buffer - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer put(int index, byte b); - - - // -- Bulk get operations -- - - /* - * Relative bulk get method. - * - *

This method transfers bytes from this buffer into the given - * destination array. If there are fewer bytes remaining in the - * buffer than are required to satisfy the request, that is, if - * length > remaining(), then no - * bytes are transferred and a {@link BufferUnderflowException} is - * thrown. - * - *

Otherwise, this method copies length bytes from this - * buffer into the given array, starting at the current position of this - * buffer and at the given offset in the array. The position of this - * buffer is then incremented by length. - * - *

In other words, an invocation of this method of the form - * src.get(dst, off, len) has exactly the same effect as - * the loop - * - *

-     *     for (int i = off; i < off + len; i++)
-     *         dst[i] = src.get(); 
- * - * except that it first checks that there are sufficient bytes in - * this buffer and it is potentially much more efficient.

- * - * @param dst - * The array into which bytes are to be written - * - * @param offset - * The offset within the array of the first byte to be - * written; must be non-negative and no larger than - * dst.length - * - * @param length - * The maximum number of bytes to be written to the given - * array; must be non-negative and no larger than - * dst.length - offset - * - * @return This buffer - * - * @throws BufferUnderflowException - * If there are fewer than length bytes - * remaining in this buffer - * - * @throws IndexOutOfBoundsException - * If the preconditions on the offset and length - * parameters do not hold - */ - - public virtual ByteBuffer get(byte[] dst, int offset, int length) - { - checkBounds(offset, length, dst.Length); - if (length > remaining()) - throw new BufferUnderflowException(); - int end = offset + length; - for (int i = offset; i < end; i++) - dst[i] = get(); - return this; - } - - /* - * Relative bulk get method. - * - *

This method transfers bytes from this buffer into the given - * destination array. An invocation of this method of the form - * src.get(a) behaves in exactly the same way as the invocation - * - *

-     *     src.get(a, 0, a.length) 
- * - * @return This buffer - * - * @throws BufferUnderflowException - * If there are fewer than length bytes - * remaining in this buffer - */ - - public ByteBuffer get(byte[] dst) - { - return get(dst, 0, dst.Length); - } - - - // -- Bulk put operations -- - - /* - * Relative bulk put method  (optional operation). - * - *

This method transfers the bytes remaining in the given source - * buffer into this buffer. If there are more bytes remaining in the - * source buffer than in this buffer, that is, if - * src.remaining() > remaining(), - * then no bytes are transferred and a {@link - * BufferOverflowException} is thrown. - * - *

Otherwise, this method copies - * n = src.remaining() bytes from the given - * buffer into this buffer, starting at each buffer's current position. - * The positions of both buffers are then incremented by n. - * - *

In other words, an invocation of this method of the form - * dst.put(src) has exactly the same effect as the loop - * - *

-     *     while (src.hasRemaining())
-     *         dst.put(src.get()); 
- * - * except that it first checks that there is sufficient space in this - * buffer and it is potentially much more efficient.

- * - * @param src - * The source buffer from which bytes are to be read; - * must not be this buffer - * - * @return This buffer - * - * @throws BufferOverflowException - * If there is insufficient space in this buffer - * for the remaining bytes in the source buffer - * - * @throws ArgumentException - * If the source buffer is this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - - public virtual ByteBuffer put(ByteBuffer src) - { - if (src == this) - throw new ArgumentException(); - int n = src.remaining(); - if (n > remaining()) - throw new BufferOverflowException(); - for (int i = 0; i < n; i++) - put(src.get()); - return this; - } - - /* - * Relative bulk put method  (optional operation). - * - *

This method transfers bytes into this buffer from the given - * source array. If there are more bytes to be copied from the array - * than remain in this buffer, that is, if - * length > remaining(), then no - * bytes are transferred and a {@link BufferOverflowException} is - * thrown. - * - *

Otherwise, this method copies length bytes from the - * given array into this buffer, starting at the given offset in the array - * and at the current position of this buffer. The position of this buffer - * is then incremented by length. - * - *

In other words, an invocation of this method of the form - * dst.put(src, off, len) has exactly the same effect as - * the loop - * - *

-     *     for (int i = off; i < off + len; i++)
-     *         dst.put(a[i]); 
- * - * except that it first checks that there is sufficient space in this - * buffer and it is potentially much more efficient.

- * - * @param src - * The array from which bytes are to be read - * - * @param offset - * The offset within the array of the first byte to be read; - * must be non-negative and no larger than array.length - * - * @param length - * The number of bytes to be read from the given array; - * must be non-negative and no larger than - * array.length - offset - * - * @return This buffer - * - * @throws BufferOverflowException - * If there is insufficient space in this buffer - * - * @throws IndexOutOfBoundsException - * If the preconditions on the offset and length - * parameters do not hold - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - - public virtual ByteBuffer put(byte[] src, int offset, int length) - { - checkBounds(offset, length, src.Length); - if (length > remaining()) - throw new BufferOverflowException(); - int end = offset + length; - for (int i = offset; i < end; i++) - put(src[i]); - return this; - } - - /* - * Relative bulk put method  (optional operation). - * - *

This method transfers the entire content of the given source - * byte array into this buffer. An invocation of this method of the - * form dst.put(a) behaves in exactly the same way as the - * invocation - * - *

-     *     dst.put(a, 0, a.length) 
- * - * @return This buffer - * - * @throws BufferOverflowException - * If there is insufficient space in this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - - public ByteBuffer put(byte[] src) - { - return put(src, 0, src.Length); - } - - - // -- Other stuff -- - - /* - * Tells whether or not this buffer is backed by an accessible byte - * array. - * - *

If this method returns true then the {@link #array() array} - * and {@link #arrayOffset() arrayOffset} methods may safely be invoked. - *

- * - * @return true if, and only if, this buffer - * is backed by an array and is not read-only - */ - - public bool hasArray() - { - return (hb != null); - } - - /* - * Returns the byte array that backs this - * buffer  (optional operation). - * - *

Modifications to this buffer's content will cause the returned - * array's content to be modified, and vice versa. - * - *

Invoke the {@link #hasArray hasArray} method before invoking this - * method in order to ensure that this buffer has an accessible backing - * array.

- * - * @return The array that backs this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is backed by an array but is read-only - * - * @throws UnsupportedOperationException - * If this buffer is not backed by an accessible array - */ - - public byte[] array() - { - if (hb == null) - throw new NotSupportedException(); - return hb; - } - - /* - * Returns the offset within this buffer's backing array of the first - * element of the buffer  (optional operation). - * - *

If this buffer is backed by an array then buffer position p - * corresponds to array index p + arrayOffset(). - * - *

Invoke the {@link #hasArray hasArray} method before invoking this - * method in order to ensure that this buffer has an accessible backing - * array.

- * - * @return The offset within this buffer's array - * of the first element of the buffer - * - * @throws ReadOnlyBufferException - * If this buffer is backed by an array but is read-only - * - * @throws UnsupportedOperationException - * If this buffer is not backed by an accessible array - */ - - public int arrayOffset() - { - if (hb == null) - throw new NotSupportedException(); - return _offset; - } - - /* - * Compacts this buffer  (optional operation). - * - *

The bytes between the buffer's current position and its limit, - * if any, are copied to the beginning of the buffer. That is, the - * byte at index p = position() is copied - * to index zero, the byte at index p + 1 is copied - * to index one, and so forth until the byte at index - * limit() - 1 is copied to index - * n = limit() - 1 - p. - * The buffer's position is then set to n+1 and its limit is set to - * its capacity. The mark, if defined, is discarded. - * - *

The buffer's position is set to the number of bytes copied, - * rather than to zero, so that an invocation of this method can be - * followed immediately by an invocation of another relative put - * method.

- * - - * - *

Invoke this method after writing data from a buffer in case the - * write was incomplete. The following loop, for example, copies bytes - * from one channel to another via the buffer buf: - * - *

-     * buf.clear();          // Prepare buffer for use
-     * for (;;) {
-     *     if (in.read(buf) < 0 && !buf.hasRemaining())
-     *         break;        // No more bytes to transfer
-     *     buf.flip();
-     *     out.write(buf);
-     *     buf.compact();    // In case of partial write
-     * }
- * - - * - * @return This buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer compact(); - - /* - * Tells whether or not this byte buffer is direct.

- * - * @return true if, and only if, this buffer is direct - */ - public abstract bool isDirect(); - - - /* - * Returns a string summarizing the state of this buffer.

- * - * @return A summary string - */ - - public String toString() - { - var sb = new StringBuilder(); - sb.Append(GetType().Name); - sb.Append("[pos="); - sb.Append(position()); - sb.Append(" lim="); - sb.Append(limit()); - sb.Append(" cap="); - sb.Append(capacity()); - sb.Append("]"); - return sb.ToString(); - } - - - /* - * Returns the current hash code of this buffer. - * - *

The hash code of a byte buffer depends only upon its remaining - * elements; that is, upon the elements from position() up to, and - * including, the element at limit() - 1. - * - *

Because buffer hash codes are content-dependent, it is inadvisable - * to use buffers as keys in hash maps or similar data structures unless it - * is known that their contents will not change.

- * - * @return The current hash code of this buffer - */ - - public int hashCode() - { - int h = 1; - int p = position(); - for (int i = limit() - 1; i >= p; i--) - h = 31*h + get(i); - return h; - } - - /* - * Tells whether or not this buffer is equal to another object. - * - *

Two byte buffers are equal if, and only if, - * - *

    - * - *
  1. They have the same element type,

  2. - * - *
  3. They have the same number of remaining elements, and - *

  4. - * - *
  5. The two sequences of remaining elements, considered - * independently of their starting positions, are pointwise equal. - *

  6. - * - *
- * - *

A byte buffer is not equal to any other type of object.

- * - * @param ob The object to which this buffer is to be compared - * - * @return true if, and only if, this buffer is equal to the - * given object - */ - - public bool equals(object ob) - { - if (!(ob is ByteBuffer)) - return false; - var that = (ByteBuffer) ob; - if (remaining() != that.remaining()) - return false; - int p = position(); - for (int i = limit() - 1, j = that.limit() - 1; i >= p; i--, j--) - { - byte v1 = get(i); - byte v2 = that.get(j); - if (v1 != v2) - { - return false; - } - } - return true; - } - - /* - * Compares this buffer to another. - * - *

Two byte buffers are compared by comparing their sequences of - * remaining elements lexicographically, without regard to the starting - * position of each sequence within its corresponding buffer. - * - *

A byte buffer is not comparable to any other type of object. - * - * @return A negative integer, zero, or a positive integer as this buffer - * is less than, equal to, or greater than the given buffer - */ - - public int compareTo(ByteBuffer that) - { - int n = position() + Math.Min(remaining(), that.remaining()); - for (int i = position(), j = that.position(); i < n; i++, j++) - { - byte v1 = get(i); - byte v2 = that.get(j); - if (v1 == v2) - continue; - if (v1 < v2) - return -1; - return +1; - } - return remaining() - that.remaining(); - } - - - // -- Other char stuff -- - - - // -- Other byte stuff: Access to binary data -- - - - //= (Bits.byteOrder() == ByteOrder.BIG_ENDIAN); - - /* - * Retrieves this buffer's byte order. - * - *

The byte order is used when reading or writing multibyte values, and - * when creating buffers that are views of this byte buffer. The order of - * a newly-created byte buffer is always {@link ByteOrder#BIG_ENDIAN - * BIG_ENDIAN}.

- * - * @return This buffer's byte order - */ - - public ByteOrder order() - { - return bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; - } - - /* - * Modifies this buffer's byte order.

- * - * @param bo - * The new byte order, - * either {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN} - * or {@link ByteOrder#LITTLE_ENDIAN LITTLE_ENDIAN} - * - * @return This buffer - */ - - public ByteBuffer order(ByteOrder bo) - { - bigEndian = (bo == ByteOrder.BIG_ENDIAN); - nativeByteOrder = - (bigEndian == (!BitConverter.IsLittleEndian)); - return this; - } - - // Unchecked accessors, for use by ByteBufferAs-X-Buffer classes - // - internal abstract byte _get(int i); // package-private - internal abstract void _put(int i, byte b); // package-private - - - /* - * Relative get method for reading a char value. - * - *

Reads the next two bytes at this buffer's current position, - * composing them into a char value according to the current byte order, - * and then increments the position by two.

- * - * @return The char value at the buffer's current position - * - * @throws BufferUnderflowException - * If there are fewer than two bytes - * remaining in this buffer - */ - public abstract char getChar(); - - /* - * Relative put method for writing a char - * value  (optional operation). - * - *

Writes two bytes containing the given char value, in the - * current byte order, into this buffer at the current position, and then - * increments the position by two.

- * - * @param value - * The char value to be written - * - * @return This buffer - * - * @throws BufferOverflowException - * If there are fewer than two bytes - * remaining in this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putChar(char value); - - /* - * Absolute get method for reading a char value. - * - *

Reads two bytes at the given index, composing them into a - * char value according to the current byte order.

- * - * @param index - * The index from which the bytes will be read - * - * @return The char value at the given index - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus one - */ - public abstract char getChar(int index); - - /* - * Absolute put method for writing a char - * value  (optional operation). - * - *

Writes two bytes containing the given char value, in the - * current byte order, into this buffer at the given index.

- * - * @param index - * The index at which the bytes will be written - * - * @param value - * The char value to be written - * - * @return This buffer - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus one - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putChar(int index, char value); - - /* - * Creates a view of this byte buffer as a char buffer. - * - *

The content of the new buffer will start at this buffer's current - * position. Changes to this buffer's content will be visible in the new - * buffer, and vice versa; the two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's position will be zero, its capacity and its limit - * will be the number of bytes remaining in this buffer divided by - * two, and its mark will be undefined. The new buffer will be direct - * if, and only if, this buffer is direct, and it will be read-only if, and - * only if, this buffer is read-only.

- * - * @return A new char buffer - */ - public abstract Buffer asCharBuffer(); - - - /* - * Relative get method for reading a short value. - * - *

Reads the next two bytes at this buffer's current position, - * composing them into a short value according to the current byte order, - * and then increments the position by two.

- * - * @return The short value at the buffer's current position - * - * @throws BufferUnderflowException - * If there are fewer than two bytes - * remaining in this buffer - */ - public abstract short getShort(); - - /* - * Relative put method for writing a short - * value  (optional operation). - * - *

Writes two bytes containing the given short value, in the - * current byte order, into this buffer at the current position, and then - * increments the position by two.

- * - * @param value - * The short value to be written - * - * @return This buffer - * - * @throws BufferOverflowException - * If there are fewer than two bytes - * remaining in this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putShort(short value); - - /* - * Absolute get method for reading a short value. - * - *

Reads two bytes at the given index, composing them into a - * short value according to the current byte order.

- * - * @param index - * The index from which the bytes will be read - * - * @return The short value at the given index - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus one - */ - public abstract short getShort(int index); - - /* - * Absolute put method for writing a short - * value  (optional operation). - * - *

Writes two bytes containing the given short value, in the - * current byte order, into this buffer at the given index.

- * - * @param index - * The index at which the bytes will be written - * - * @param value - * The short value to be written - * - * @return This buffer - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus one - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putShort(int index, short value); - - /* - * Creates a view of this byte buffer as a short buffer. - * - *

The content of the new buffer will start at this buffer's current - * position. Changes to this buffer's content will be visible in the new - * buffer, and vice versa; the two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's position will be zero, its capacity and its limit - * will be the number of bytes remaining in this buffer divided by - * two, and its mark will be undefined. The new buffer will be direct - * if, and only if, this buffer is direct, and it will be read-only if, and - * only if, this buffer is read-only.

- * - * @return A new short buffer - */ - public abstract Buffer asShortBuffer(); - - - /* - * Relative get method for reading an int value. - * - *

Reads the next four bytes at this buffer's current position, - * composing them into an int value according to the current byte order, - * and then increments the position by four.

- * - * @return The int value at the buffer's current position - * - * @throws BufferUnderflowException - * If there are fewer than four bytes - * remaining in this buffer - */ - public abstract int getInt(); - - /* - * Relative put method for writing an int - * value  (optional operation). - * - *

Writes four bytes containing the given int value, in the - * current byte order, into this buffer at the current position, and then - * increments the position by four.

- * - * @param value - * The int value to be written - * - * @return This buffer - * - * @throws BufferOverflowException - * If there are fewer than four bytes - * remaining in this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putInt(int value); - - /* - * Absolute get method for reading an int value. - * - *

Reads four bytes at the given index, composing them into a - * int value according to the current byte order.

- * - * @param index - * The index from which the bytes will be read - * - * @return The int value at the given index - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus three - */ - public abstract int getInt(int index); - - /* - * Absolute put method for writing an int - * value  (optional operation). - * - *

Writes four bytes containing the given int value, in the - * current byte order, into this buffer at the given index.

- * - * @param index - * The index at which the bytes will be written - * - * @param value - * The int value to be written - * - * @return This buffer - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus three - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putInt(int index, int value); - - /* - * Creates a view of this byte buffer as an int buffer. - * - *

The content of the new buffer will start at this buffer's current - * position. Changes to this buffer's content will be visible in the new - * buffer, and vice versa; the two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's position will be zero, its capacity and its limit - * will be the number of bytes remaining in this buffer divided by - * four, and its mark will be undefined. The new buffer will be direct - * if, and only if, this buffer is direct, and it will be read-only if, and - * only if, this buffer is read-only.

- * - * @return A new int buffer - */ - public abstract Buffer asIntBuffer(); - - - /* - * Relative get method for reading a long value. - * - *

Reads the next eight bytes at this buffer's current position, - * composing them into a long value according to the current byte order, - * and then increments the position by eight.

- * - * @return The long value at the buffer's current position - * - * @throws BufferUnderflowException - * If there are fewer than eight bytes - * remaining in this buffer - */ - public abstract long getLong(); - - /* - * Relative put method for writing a long - * value  (optional operation). - * - *

Writes eight bytes containing the given long value, in the - * current byte order, into this buffer at the current position, and then - * increments the position by eight.

- * - * @param value - * The long value to be written - * - * @return This buffer - * - * @throws BufferOverflowException - * If there are fewer than eight bytes - * remaining in this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putLong(long value); - - /* - * Absolute get method for reading a long value. - * - *

Reads eight bytes at the given index, composing them into a - * long value according to the current byte order.

- * - * @param index - * The index from which the bytes will be read - * - * @return The long value at the given index - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus seven - */ - public abstract long getLong(int index); - - /* - * Absolute put method for writing a long - * value  (optional operation). - * - *

Writes eight bytes containing the given long value, in the - * current byte order, into this buffer at the given index.

- * - * @param index - * The index at which the bytes will be written - * - * @param value - * The long value to be written - * - * @return This buffer - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus seven - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putLong(int index, long value); - - /* - * Creates a view of this byte buffer as a long buffer. - * - *

The content of the new buffer will start at this buffer's current - * position. Changes to this buffer's content will be visible in the new - * buffer, and vice versa; the two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's position will be zero, its capacity and its limit - * will be the number of bytes remaining in this buffer divided by - * eight, and its mark will be undefined. The new buffer will be direct - * if, and only if, this buffer is direct, and it will be read-only if, and - * only if, this buffer is read-only.

- * - * @return A new long buffer - */ - public abstract Buffer asLongBuffer(); - - - /* - * Relative get method for reading a float value. - * - *

Reads the next four bytes at this buffer's current position, - * composing them into a float value according to the current byte order, - * and then increments the position by four.

- * - * @return The float value at the buffer's current position - * - * @throws BufferUnderflowException - * If there are fewer than four bytes - * remaining in this buffer - */ - public abstract float getFloat(); - - /* - * Relative put method for writing a float - * value  (optional operation). - * - *

Writes four bytes containing the given float value, in the - * current byte order, into this buffer at the current position, and then - * increments the position by four.

- * - * @param value - * The float value to be written - * - * @return This buffer - * - * @throws BufferOverflowException - * If there are fewer than four bytes - * remaining in this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putFloat(float value); - - /* - * Absolute get method for reading a float value. - * - *

Reads four bytes at the given index, composing them into a - * float value according to the current byte order.

- * - * @param index - * The index from which the bytes will be read - * - * @return The float value at the given index - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus three - */ - public abstract float getFloat(int index); - - /* - * Absolute put method for writing a float - * value  (optional operation). - * - *

Writes four bytes containing the given float value, in the - * current byte order, into this buffer at the given index.

- * - * @param index - * The index at which the bytes will be written - * - * @param value - * The float value to be written - * - * @return This buffer - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus three - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putFloat(int index, float value); - - /* - * Creates a view of this byte buffer as a float buffer. - * - *

The content of the new buffer will start at this buffer's current - * position. Changes to this buffer's content will be visible in the new - * buffer, and vice versa; the two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's position will be zero, its capacity and its limit - * will be the number of bytes remaining in this buffer divided by - * four, and its mark will be undefined. The new buffer will be direct - * if, and only if, this buffer is direct, and it will be read-only if, and - * only if, this buffer is read-only.

- * - * @return A new float buffer - */ - public abstract Buffer asFloatBuffer(); - - - /* - * Relative get method for reading a double value. - * - *

Reads the next eight bytes at this buffer's current position, - * composing them into a double value according to the current byte order, - * and then increments the position by eight.

- * - * @return The double value at the buffer's current position - * - * @throws BufferUnderflowException - * If there are fewer than eight bytes - * remaining in this buffer - */ - public abstract double getDouble(); - - /* - * Relative put method for writing a double - * value  (optional operation). - * - *

Writes eight bytes containing the given double value, in the - * current byte order, into this buffer at the current position, and then - * increments the position by eight.

- * - * @param value - * The double value to be written - * - * @return This buffer - * - * @throws BufferOverflowException - * If there are fewer than eight bytes - * remaining in this buffer - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putDouble(double value); - - /* - * Absolute get method for reading a double value. - * - *

Reads eight bytes at the given index, composing them into a - * double value according to the current byte order.

- * - * @param index - * The index from which the bytes will be read - * - * @return The double value at the given index - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus seven - */ - public abstract double getDouble(int index); - - /* - * Absolute put method for writing a double - * value  (optional operation). - * - *

Writes eight bytes containing the given double value, in the - * current byte order, into this buffer at the given index.

- * - * @param index - * The index at which the bytes will be written - * - * @param value - * The double value to be written - * - * @return This buffer - * - * @throws IndexOutOfBoundsException - * If index is negative - * or not smaller than the buffer's limit, - * minus seven - * - * @throws ReadOnlyBufferException - * If this buffer is read-only - */ - public abstract ByteBuffer putDouble(int index, double value); - - /* - * Creates a view of this byte buffer as a double buffer. - * - *

The content of the new buffer will start at this buffer's current - * position. Changes to this buffer's content will be visible in the new - * buffer, and vice versa; the two buffers' position, limit, and mark - * values will be independent. - * - *

The new buffer's position will be zero, its capacity and its limit - * will be the number of bytes remaining in this buffer divided by - * eight, and its mark will be undefined. The new buffer will be direct - * if, and only if, this buffer is direct, and it will be read-only if, and - * only if, this buffer is read-only.

- * - * @return A new double buffer - */ - public abstract Buffer asDoubleBuffer(); - } -#pragma warning restore 1591 -} - -// ReSharper restore InconsistentNaming \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/HeapByteBuffer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/HeapByteBuffer.cs deleted file mode 100644 index ce2ce1d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/HeapByteBuffer.cs +++ /dev/null @@ -1,380 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -// This class is based on the source code from Sun's Java 1.5.0 API for java.nio.HeapByteBuffer, but -// rewritten for C# and .NET with the purpose to bridge the .NET and Java internals of Robocode. - -using System; - -// ReSharper disable InconsistentNaming - -namespace net.sf.robocode.nio -{ - /// - /// A read/write HeapByteBuffer. - /// - /// - internal class HeapByteBuffer : ByteBuffer - { - internal HeapByteBuffer(int cap, int lim) - : base(-1, 0, lim, cap, new byte[cap], 0) - { - } - - internal HeapByteBuffer(byte[] buf, int off, int len) - : base(-1, off, off + len, buf.Length, buf, 0) - { - } - - protected HeapByteBuffer(byte[] buf, - int mark, int pos, int lim, int cap, - int off) - : base(mark, pos, lim, cap, buf, off) - { - } - - public override ByteBuffer slice() - { - return new HeapByteBuffer(hb, - -1, - 0, - remaining(), - remaining(), - position() + _offset); - } - - public override ByteBuffer duplicate() - { - return new HeapByteBuffer(hb, - markValue(), - position(), - limit(), - capacity(), - _offset); - } - - public override ByteBuffer asReadOnlyBuffer() - { - throw new NotImplementedException(); - } - - - protected int ix(int i) - { - return i + _offset; - } - - public override byte get() - { - return hb[ix(nextGetIndex())]; - } - - public override byte get(int i) - { - return hb[ix(checkIndex(i))]; - } - - public override ByteBuffer get(byte[] dst, int offset, int length) - { - checkBounds(offset, length, dst.Length); - if (length > remaining()) - throw new BufferUnderflowException(); - Array.Copy(hb, ix(position()), dst, offset, length); - position(position() + length); - return this; - } - - public override bool isDirect() - { - return false; - } - - - public override bool isReadOnly() - { - return false; - } - - public override ByteBuffer put(byte x) - { - hb[ix(nextPutIndex())] = x; - return this; - } - - public override ByteBuffer put(int i, byte x) - { - hb[ix(checkIndex(i))] = x; - return this; - } - - public override ByteBuffer put(byte[] src, int offset, int length) - { - checkBounds(offset, length, src.Length); - if (length > remaining()) - throw new BufferOverflowException(); - Array.Copy(src, offset, hb, ix(position()), length); - position(position() + length); - return this; - } - - public override ByteBuffer put(ByteBuffer src) - { - if (src is HeapByteBuffer) - { - if (src == this) - throw new ArgumentException(); - var sb = (HeapByteBuffer) src; - int n = sb.remaining(); - if (n > remaining()) - throw new BufferOverflowException(); - Array.Copy(sb.hb, sb.ix(sb.position()), - hb, ix(position()), n); - sb.position(sb.position() + n); - position(position() + n); - } - else if (src.isDirect()) - { - int n = src.remaining(); - if (n > remaining()) - throw new BufferOverflowException(); - src.get(hb, ix(position()), n); - position(position() + n); - } - else - { - base.put(src); - } - return this; - } - - public override ByteBuffer compact() - { - Array.Copy(hb, ix(position()), hb, ix(0), remaining()); - position(remaining()); - limit(capacity()); - discardMark(); - return this; - } - - - internal override byte _get(int i) - { - return hb[i]; - } - - internal override void _put(int i, byte b) - { - hb[i] = b; - } - - public override char getChar() - { - return BitConverter.ToChar(hb, ix(nextGetIndex(2))); - } - - public override char getChar(int i) - { - return BitConverter.ToChar(hb, ix(checkIndex(i, 2))); - } - - - public override ByteBuffer putChar(char x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(nextPutIndex(2)); - Array.Copy(bytes, 0, hb, index, 2); - return this; - } - - public override ByteBuffer putChar(int i, char x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(checkIndex(i, 2)); - Array.Copy(bytes, 0, hb, index, 2); - return this; - } - - public override Buffer asCharBuffer() - { - throw new NotImplementedException(); - } - - public override short getShort() - { - return BitConverter.ToInt16(hb, ix(nextGetIndex(2))); - } - - public override short getShort(int i) - { - return BitConverter.ToInt16(hb, ix(checkIndex(i, 2))); - } - - - public override ByteBuffer putShort(short x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(nextPutIndex(2)); - Array.Copy(bytes, 0, hb, index, 2); - return this; - } - - public override ByteBuffer putShort(int i, short x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(checkIndex(i, 2)); - Array.Copy(bytes, 0, hb, index, 2); - return this; - } - - public override Buffer asShortBuffer() - { - throw new NotImplementedException(); - } - - public override int getInt() - { - return BitConverter.ToInt32(hb, ix(nextGetIndex(4))); - } - - public override int getInt(int i) - { - return BitConverter.ToInt32(hb, ix(checkIndex(i, 4))); - } - - - public override ByteBuffer putInt(int x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(nextPutIndex(4)); - Array.Copy(bytes, 0, hb, index, 4); - return this; - } - - public override ByteBuffer putInt(int i, int x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(checkIndex(i, 4)); - Array.Copy(bytes, 0, hb, index, 4); - return this; - } - - public override Buffer asIntBuffer() - { - throw new NotImplementedException(); - } - - - // long - - - public override long getLong() - { - return BitConverter.ToInt64(hb, ix(nextGetIndex(8))); - } - - public override long getLong(int i) - { - return BitConverter.ToInt64(hb, ix(checkIndex(i, 8))); - } - - - public override ByteBuffer putLong(long x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(nextPutIndex(8)); - Array.Copy(bytes, 0, hb, index, 8); - return this; - } - - public override ByteBuffer putLong(int i, long x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(checkIndex(i, 8)); - Array.Copy(bytes, 0, hb, index, 8); - return this; - } - - public override Buffer asLongBuffer() - { - throw new NotImplementedException(); - } - - - // float - - - public override float getFloat() - { - return BitConverter.ToSingle(hb, ix(nextGetIndex(4))); - } - - public override float getFloat(int i) - { - return BitConverter.ToSingle(hb, ix(checkIndex(i, 4))); - } - - - public override ByteBuffer putFloat(float x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(nextPutIndex(4)); - Array.Copy(bytes, 0, hb, index, 4); - return this; - } - - public override ByteBuffer putFloat(int i, float x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(checkIndex(i, 4)); - Array.Copy(bytes, 0, hb, index, 4); - return this; - } - - public override Buffer asFloatBuffer() - { - throw new NotImplementedException(); - } - - - // double - - - public override double getDouble() - { - return BitConverter.ToDouble(hb, ix(nextGetIndex(8))); - } - - public override double getDouble(int i) - { - return BitConverter.ToDouble(hb, ix(checkIndex(i, 8))); - } - - - public override ByteBuffer putDouble(double x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(nextPutIndex(8)); - Array.Copy(bytes, 0, hb, index, 8); - return this; - } - - public override ByteBuffer putDouble(int i, double x) - { - byte[] bytes = BitConverter.GetBytes(x); - int index = ix(checkIndex(i, 8)); - Array.Copy(bytes, 0, hb, index, 8); - return this; - } - - public override Buffer asDoubleBuffer() - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/InvalidMarkException.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/InvalidMarkException.cs deleted file mode 100644 index 080851e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/nio/InvalidMarkException.cs +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Runtime.Serialization; - -namespace net.sf.robocode.nio -{ -#pragma warning disable 1591 - - /// - [Serializable] - public class InvalidMarkException : Exception - { - public InvalidMarkException() - { - } - - public InvalidMarkException(string message) - : base(message) - { - } - - public InvalidMarkException(string message, Exception inner) - : base(message, inner) - { - } - - protected InvalidMarkException(SerializationInfo info, - StreamingContext context) - : base(info, context) - { - } - } - - /// - [Serializable] - public class BufferUnderflowException : Exception - { - public BufferUnderflowException() - { - } - - public BufferUnderflowException(string message) - : base(message) - { - } - - public BufferUnderflowException(string message, Exception inner) - : base(message, inner) - { - } - - protected BufferUnderflowException(SerializationInfo info, - StreamingContext context) - : base(info, context) - { - } - } - - /// - [Serializable] - public class BufferOverflowException : Exception - { - public BufferOverflowException() - { - } - - public BufferOverflowException(string message) - : base(message) - { - } - - public BufferOverflowException(string message, Exception inner) - : base(message, inner) - { - } - - protected BufferOverflowException(SerializationInfo info, - StreamingContext context) - : base(info, context) - { - } - } - - /// - [Serializable] - public class ReadOnlyBufferException : Exception - { - public ReadOnlyBufferException() - { - } - - public ReadOnlyBufferException(string message) - : base(message) - { - } - - public ReadOnlyBufferException(string message, Exception inner) - : base(message, inner) - { - } - - protected ReadOnlyBufferException(SerializationInfo info, - StreamingContext context) - : base(info, context) - { - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/peer/IRobotStaticsN.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/peer/IRobotStaticsN.cs deleted file mode 100644 index b84b044..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/peer/IRobotStaticsN.cs +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace net.sf.robocode.peer -{ -#pragma warning disable 1591 - - /// - public interface IRobotStaticsN - { - bool IsInteractiveRobot(); - - bool IsPaintRobot(); - - bool IsAdvancedRobot(); - - bool IsTeamRobot(); - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/HiddenAccessN.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/HiddenAccessN.cs deleted file mode 100644 index 9dd414e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/HiddenAccessN.cs +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Security.Permissions; -using net.sf.robocode.io; -using net.sf.robocode.peer; -using Robocode; -using Robocode.RobotInterfaces; - -namespace net.sf.robocode.security -{ -#pragma warning disable 1591 - /// - [RobocodeInternalPermission(SecurityAction.LinkDemand)] - public class HiddenAccessN - { - private static IHiddenEventHelper eventHelper; - private static IHiddenBulletHelper bulletHelper; - private static IHiddenStatusHelper statusHelper; - private static IHiddenRulesHelper rulesHelper; - private static bool initialized; - public static IHiddenRandomHelper randomHelper; - - public static void init() - { - if (initialized) - { - return; - } - MethodInfo method; - - try - { - method = typeof (Event).GetMethod("createHiddenHelper", BindingFlags.Static | BindingFlags.NonPublic); - eventHelper = (IHiddenEventHelper) method.Invoke(null, null); - - method = typeof (Bullet).GetMethod("createHiddenHelper", BindingFlags.Static | BindingFlags.NonPublic); - bulletHelper = (IHiddenBulletHelper) method.Invoke(null, null); - - method = typeof (RobotStatus).GetMethod("createHiddenSerializer", - BindingFlags.Static | BindingFlags.NonPublic); - statusHelper = (IHiddenStatusHelper) method.Invoke(null, null); - - method = typeof (BattleRules).GetMethod("createHiddenHelper", - BindingFlags.Static | BindingFlags.NonPublic); - rulesHelper = (IHiddenRulesHelper) method.Invoke(null, null); - - initialized = true; - } - catch (Exception e) - { - LoggerN.logError(e); - Environment.Exit(-1); - } - } - - public static bool IsCriticalEvent(Event e) - { - return eventHelper.IsCriticalEvent(e); - } - - public static void SetEventTime(Event e, long newTime) - { - eventHelper.SetTime(e, newTime); - } - - public static void SetEventPriority(Event e, int newPriority) - { - eventHelper.SetPriority(e, newPriority); - } - - public static void Dispatch(Event evnt, IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - eventHelper.Dispatch(evnt, robot, statics, graphics); - } - - public static void SetDefaultPriority(Event e) - { - eventHelper.SetDefaultPriority(e); - } - - public static byte GetSerializationType(Event e) - { - return eventHelper.GetSerializationType(e); - } - - // Needed for .NET version - public static void UpdateBullets(Event e, Dictionary bullets) - { - eventHelper.UpdateBullets(e, bullets); - } - - public static void Update(Bullet bullet, double x, double y, string victimName, bool isActive) - { - bulletHelper.update(bullet, x, y, victimName, isActive); - } - - public static RobotStatus createStatus(double energy, double x, double y, double bodyHeading, double gunHeading, - double radarHeading, double velocity, double bodyTurnRemaining, - double radarTurnRemaining, double gunTurnRemaining, - double distanceRemaining, double gunHeat, int others, int numSentries, - int roundNum, int numRounds, long time) - { - return statusHelper.createStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, - bodyTurnRemaining, radarTurnRemaining, gunTurnRemaining, distanceRemaining, - gunHeat, others, numSentries, roundNum, numRounds, time); - } - - public static BattleRules createRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, long inactivityTime, - bool hideEnemyNames, int borderSentryRobotAttackRange) - { - return rulesHelper.createRules(battlefieldWidth, battlefieldHeight, numRounds, gunCoolingRate, inactivityTime, hideEnemyNames, borderSentryRobotAttackRange); - } - - public static string GetRobotName() - { - string name = (string)AppDomain.CurrentDomain.GetData("robotName"); - return name ?? ""; - } - } -#pragma warning restore 1591 -} - -//happy diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenBulletHelper.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenBulletHelper.cs deleted file mode 100644 index d1eb3cf..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenBulletHelper.cs +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace net.sf.robocode.security -{ -#pragma warning disable 1591 - /// - public interface IHiddenBulletHelper - { - void update(Bullet bullet, double x, double y, string victimName, bool isActive); - } -} - -//happy \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenEventHelper.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenEventHelper.cs deleted file mode 100644 index b485e5b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenEventHelper.cs +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Collections.Generic; -using net.sf.robocode.peer; -using Robocode; -using Robocode.RobotInterfaces; - -namespace net.sf.robocode.security -{ -#pragma warning disable 1591 - /// - public interface IHiddenEventHelper - { - void SetDefaultPriority(Event evnt); - void SetPriority(Event evnt, int newPriority); - void SetTime(Event evnt, long newTime); - bool IsCriticalEvent(Event evnt); - void Dispatch(Event evnt, IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics); - byte GetSerializationType(Event evnt); - void UpdateBullets(Event evnt, Dictionary bullets); // Needed for .NET version - } -} - -//happy diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRandomHelper.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRandomHelper.cs deleted file mode 100644 index 27e8963..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRandomHelper.cs +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; - -namespace net.sf.robocode.security -{ -#pragma warning disable 1591 - /// - public interface IHiddenRandomHelper - { - Random GetRandom(); - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRulesHelper.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRulesHelper.cs deleted file mode 100644 index 447d1db..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenRulesHelper.cs +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace net.sf.robocode.security -{ -#pragma warning disable 1591 - /// - public interface IHiddenRulesHelper - { - BattleRules createRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, long inactivityTime, - bool hideEnemyNames, int borderSentryRobotAttackRange); - } -} - -//happy \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenStatusHelper.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenStatusHelper.cs deleted file mode 100644 index db401f3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/IHiddenStatusHelper.cs +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace net.sf.robocode.security -{ -#pragma warning disable 1591 - /// - public interface IHiddenStatusHelper - { - RobotStatus createStatus(double energy, double x, double y, double bodyHeading, double gunHeading, - double radarHeading, - double velocity, double bodyTurnRemaining, double radarTurnRemaining, - double gunTurnRemaining, - double distanceRemaining, double gunHeat, int others, int numSentries, - int roundNum, int numRounds, long time); - } -} - -//happy \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/RobocodeInternalPermission.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/RobocodeInternalPermission.cs deleted file mode 100644 index 94a8e50..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/security/RobocodeInternalPermission.cs +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Security; -using System.Security.Permissions; -using System.Text; - -namespace net.sf.robocode.security -{ -#pragma warning disable 1591 - /// - [Serializable] - public sealed class RobocodeInternalPermission : CodeAccessPermission, IUnrestrictedPermission - { - private bool unrestricted; - - public RobocodeInternalPermission(PermissionState state) - { - unrestricted = state == PermissionState.Unrestricted; - } - - #region IUnrestrictedPermission Members - - public bool IsUnrestricted() - { - return unrestricted; - } - - #endregion - - public override IPermission Copy() - { - //Create a new instance of RobocodeInternalPermission with the current - //value of unrestricted. - var copy = new RobocodeInternalPermission(PermissionState.None); - - copy.unrestricted = IsUnrestricted(); - //Return the copy. - return copy; - } - - public override IPermission Intersect(IPermission target) - { - //If nothing was passed, return null. - if (null == target) - { - return null; - } - try - { - //Create a new instance of RobocodeInternalPermission from the passed object. - var PassedPermission = (RobocodeInternalPermission) target; - - //If one class has an unrestricted value of false, then the - //intersection will have an unrestricted value of false. - //Return the passed class with the unrestricted value of false. - if (!PassedPermission.unrestricted) - { - return target; - } - //Return a copy of the current class if the passed one has - //an unrestricted value of true. - return Copy(); - } - //Catch an InvalidCastException. - //Throw ArgumentException to notify the user. - catch (InvalidCastException) - { - throw new ArgumentException("Argument_WrongType", GetType().FullName); - } - } - - public override bool IsSubsetOf(IPermission target) - { - //If nothing was passed and unrestricted is false, - //then return true. - if (null == target) - { - return !unrestricted; - } - try - { - //Create a new instance of RobocodeInternalPermission from the passed object. - var passedpermission = (RobocodeInternalPermission) target; - - //If unrestricted has the same value in both objects, then - //one is the subset of the other. - return unrestricted == passedpermission.unrestricted; - } - //Catch an InvalidCastException. - //Throw ArgumentException to notify the user. - catch (InvalidCastException) - { - throw new ArgumentException("Argument_WrongType", GetType().FullName); - } - } - - public override void FromXml(SecurityElement PassedElement) - { - //Get the unrestricted value from the XML and initialize - //the current instance of unrestricted to that value. - string element = PassedElement.Attribute("Unrestricted"); - - if (null != element) - { - unrestricted = Convert.ToBoolean(element); - } - } - - public override SecurityElement ToXml() - { - //Encode the current permission to XML using the - //SecurityElement class. - var element = new SecurityElement("IPermission"); - Type type = GetType(); - var AssemblyName = new StringBuilder(type.Assembly.ToString()); - AssemblyName.Replace('\"', '\''); - element.AddAttribute("class", type.FullName + ", " + AssemblyName); - element.AddAttribute("version", "1"); - element.AddAttribute("Unrestricted", unrestricted.ToString()); - return element; - } - } - - - /// - [AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)] - public class RobocodeInternalPermissionAttribute : CodeAccessSecurityAttribute - { - public RobocodeInternalPermissionAttribute(SecurityAction action) - : base(action) - { - Unrestricted = false; - } - - public override IPermission CreatePermission() - { - return Unrestricted - ? new RobocodeInternalPermission(PermissionState.Unrestricted) - : new RobocodeInternalPermission(PermissionState.None); - } - } -#pragma warning restore 1591 -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/ISerializableHelperN.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/ISerializableHelperN.cs deleted file mode 100644 index 139d0e9..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/ISerializableHelperN.cs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using net.sf.robocode.nio; - -namespace net.sf.robocode.serialization -{ -#pragma warning disable 1591 - /// - public interface ISerializableHelperN - { - int sizeOf(RbSerializerN serializer, object obj); - void serialize(RbSerializerN serializer, ByteBuffer buffer, object obj); - object deserialize(RbSerializerN serializer, ByteBuffer buffer); - } -} - -//happy \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/RbSerializerN.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/RbSerializerN.cs deleted file mode 100644 index 28226d1..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/net/sf/robocode/serialization/RbSerializerN.cs +++ /dev/null @@ -1,524 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Security.Permissions; -using System.Text; -using net.sf.robocode.io; -using net.sf.robocode.nio; -using net.sf.robocode.security; -using Robocode; - -namespace net.sf.robocode.serialization -{ -#pragma warning disable 1591 - /// - [RobocodeInternalPermission(SecurityAction.LinkDemand)] - public sealed class RbSerializerN - { - private const int byteOrder = -1059135839; //0xC0DEDEA1 - public static readonly int SIZEOF_TYPEINFO = 1; - public static readonly int SIZEOF_BYTE = 1; - public static readonly int SIZEOF_BOOL = 1; - public static readonly int SIZEOF_CHAR = 2; - public static readonly int SIZEOF_INT = 4; - public static readonly int SIZEOF_LONG = 8; - public static readonly int SIZEOF_DOUBLE = 8; - - public static readonly byte TERMINATOR_TYPE = 0xff; - public static readonly byte ExecCommands_TYPE = 1; - public static readonly byte BulletCommand_TYPE = 2; - public static readonly byte TeamMessage_TYPE = 3; - public static readonly byte DebugProperty_TYPE = 4; - public static readonly byte ExecResults_TYPE = 5; - public static readonly byte RobotStatus_TYPE = 6; - public static readonly byte BulletStatus_TYPE = 7; - public static readonly byte BattleResults_TYPE = 8; - public static readonly byte Bullet_TYPE = 9; - public static readonly byte RobotStatics_TYPE = 10; - - public static readonly byte BattleEndedEvent_TYPE = 32; - public static readonly byte BulletHitBulletEvent_TYPE = 33; - public static readonly byte BulletHitEvent_TYPE = 34; - public static readonly byte BulletMissedEvent_TYPE = 35; - public static readonly byte DeathEvent_TYPE = 36; - public static readonly byte WinEvent_TYPE = 37; - public static readonly byte HitWallEvent_TYPE = 38; - public static readonly byte RobotDeathEvent_TYPE = 39; - public static readonly byte SkippedTurnEvent_TYPE = 40; - public static readonly byte ScannedRobotEvent_TYPE = 41; - public static readonly byte HitByBulletEvent_TYPE = 42; - public static readonly byte HitRobotEvent_TYPE = 43; - public static readonly byte KeyPressedEvent_TYPE = 44; - public static readonly byte KeyReleasedEvent_TYPE = 45; - public static readonly byte KeyTypedEvent_TYPE = 46; - public static readonly byte MouseClickedEvent_TYPE = 47; - public static readonly byte MouseDraggedEvent_TYPE = 48; - public static readonly byte MouseEnteredEvent_TYPE = 49; - public static readonly byte MouseExitedEvent_TYPE = 50; - public static readonly byte MouseMovedEvent_TYPE = 51; - public static readonly byte MousePressedEvent_TYPE = 52; - public static readonly byte MouseReleasedEvent_TYPE = 53; - public static readonly byte MouseWheelMovedEvent_TYPE = 54; - public static readonly byte RoundEndedEvent_TYPE = 55; - - private static readonly ISerializableHelperN[] typeToHelper = new ISerializableHelperN[256]; - private static readonly Dictionary classToType = new Dictionary(); - private static readonly Encoding charset; - - private static int currentVersion; - - static RbSerializerN() - { - charset = Encoding.UTF8; // we will use it as UCS-2 - register(null, TERMINATOR_TYPE); // reserved for end of (list) element - } - - public static void Init(int version) - { - if (currentVersion == 0) - { - currentVersion = version; - } - } - - public ByteBuffer serialize(byte type, object obj) - { - int length = sizeOf(type, obj); - - // header - ByteBuffer buffer = ByteBuffer.allocate(SIZEOF_INT + SIZEOF_INT + SIZEOF_INT + length); - - buffer.putInt(byteOrder); - buffer.putInt(currentVersion); - buffer.putInt(length); - - // body - serialize(buffer, type, obj); - if (buffer.remaining() != 0) - { - throw new IOException("Serialization failed: bad size"); - } - return buffer; - } - - public ByteBuffer serializeToBuffer(ByteBuffer buffer, byte type, object obj) - { - int length = sizeOf(type, obj); - buffer.limit(SIZEOF_INT + SIZEOF_INT + SIZEOF_INT + length); - - buffer.putInt(byteOrder); - buffer.putInt(currentVersion); - buffer.putInt(length); - - // body - serialize(buffer, type, obj); - if (buffer.remaining() != 0) - { - throw new IOException("Serialization failed: bad size"); - } - return buffer; - } - - public Object deserialize(ByteBuffer buffer) - { - int bo = buffer.getInt(); - - if (bo != byteOrder) - { - throw new IOException("Different byte order is not supported"); - } - - int version = buffer.getInt(); - - if (version != currentVersion) - { - throw new IOException("Version of data is not supported. We support only strong match"); - } - int length = buffer.getInt(); - - if (length != buffer.remaining()) - { - throw new IOException("Wrong buffer size, " + length + "expected but got " + buffer.remaining()); - } - - // body - Object res = deserializeAny(buffer); - - if (buffer.remaining() != 0) - { - throw new IOException("Serialization failed"); - } - return res; - } - - public void serialize(ByteBuffer buffer, byte type, object obj) - { - ISerializableHelperN helper = getHelper(type); - - // FOR-DEBUG int expect = sizeOf(type, object) + buffer.position(); - - if (obj != null) - { - buffer.put(type); - helper.serialize(this, buffer, obj); - } - else - { - buffer.put(TERMINATOR_TYPE); - } - // FOR-DEBUG if (expect != buffer.position()) { - // FOR-DEBUG throw new Exception("Bad size"); - // FOR-DEBUG } - } - - public void serialize(ByteBuffer buffer, string data) - { - if (data == null) - { - buffer.putInt(-1); - } - else - { - int bytes = charset.GetBytes(data, 0, data.Length, buffer.array(), buffer.position() + 4); - buffer.putInt(bytes); - buffer.position(buffer.position() + bytes); - } - } - - public void serialize(ByteBuffer buffer, byte[] data) - { - if (data == null) - { - buffer.putInt(-1); - } - else - { - buffer.putInt(data.Length); - buffer.put(data); - } - } - - public void serialize(ByteBuffer buffer, int[] data) - { - if (data == null) - { - buffer.putInt(-1); - } - else - { - buffer.putInt(data.Length); - foreach (int aData in data) - { - buffer.putInt(aData); - } - } - } - - public void serialize(ByteBuffer buffer, char[] data) - { - if (data == null) - { - buffer.putInt(-1); - } - else - { - buffer.putInt(data.Length); - foreach (char aData in data) - { - buffer.putChar(aData); - } - } - } - - public void serialize(ByteBuffer buffer, double[] data) - { - if (data == null) - { - buffer.putInt(-1); - } - else - { - buffer.putInt(data.Length); - foreach (double aData in data) - { - buffer.putDouble(aData); - } - } - } - - public void serialize(ByteBuffer buffer, float[] data) - { - if (data == null) - { - buffer.putInt(-1); - } - else - { - buffer.putInt(data.Length); - foreach (float aData in data) - { - buffer.putFloat(aData); - } - } - } - - public void serialize(ByteBuffer buffer, bool value) - { - buffer.put((byte) (value ? 1 : 0)); - } - - public void serialize(ByteBuffer buffer, double value) - { - buffer.putDouble(value); - } - - public void serialize(ByteBuffer buffer, char value) - { - buffer.putChar(value); - } - - public void serialize(ByteBuffer buffer, long value) - { - buffer.putLong(value); - } - - public void serialize(ByteBuffer buffer, int value) - { - buffer.putInt(value); - } - - public void serialize(ByteBuffer buffer, Event evnt) - { - byte type = HiddenAccessN.GetSerializationType(evnt); - - serialize(buffer, type, evnt); - } - - public Object deserializeAny(ByteBuffer buffer) - { - byte type = buffer.get(); - - if (type == TERMINATOR_TYPE) - { - return null; - } - return getHelper(type).deserialize(this, buffer); - } - - public string deserializeString(ByteBuffer buffer) - { - int bytes = buffer.getInt(); - - if (bytes == -1) - { - return null; - } - ByteBuffer slice = buffer.slice(); - - slice.limit(bytes); - string res; - - try - { - byte[] array = buffer.array(); - char[] chars = charset.GetChars(array, buffer.position(), bytes); - res = new string(chars); - } - catch (Exception e) - { - throw new Exception("Bad character", e); - } - buffer.position(buffer.position() + bytes); - return res; - } - - public byte[] deserializeBytes(ByteBuffer buffer) - { - int len = buffer.getInt(); - - if (len == -1) - { - return null; - } - var res = new byte[len]; - - buffer.get(res); - return res; - } - - public int[] deserializeints(ByteBuffer buffer) - { - int len = buffer.getInt(); - - if (len == -1) - { - return null; - } - var res = new int[len]; - - for (int i = 0; i < len; i++) - { - res[i] = buffer.getInt(); - } - return res; - } - - public float[] deserializeFloats(ByteBuffer buffer) - { - int len = buffer.getInt(); - - if (len == -1) - { - return null; - } - var res = new float[len]; - - for (int i = 0; i < len; i++) - { - res[i] = buffer.getFloat(); - } - return res; - } - - public char[] deserializeChars(ByteBuffer buffer) - { - int len = buffer.getInt(); - - if (len == -1) - { - return null; - } - var res = new char[len]; - - for (int i = 0; i < len; i++) - { - res[i] = buffer.getChar(); - } - return res; - } - - public double[] deserializeDoubles(ByteBuffer buffer) - { - int len = buffer.getInt(); - - if (len == -1) - { - return null; - } - var res = new double[len]; - - for (int i = 0; i < len; i++) - { - res[i] = buffer.getDouble(); - } - return res; - } - - public bool deserializeBoolean(ByteBuffer buffer) - { - return buffer.get() != 0; - } - - public char deserializeChar(ByteBuffer buffer) - { - return buffer.getChar(); - } - - public int deserializeInt(ByteBuffer buffer) - { - return buffer.getInt(); - } - - public long deserializeLong(ByteBuffer buffer) - { - return buffer.getLong(); - } - - public float deserializeFloat(ByteBuffer buffer) - { - return buffer.getFloat(); - } - - public double deserializeDouble(ByteBuffer buffer) - { - return buffer.getDouble(); - } - - public int sizeOf(string data) - { - return (data == null) ? SIZEOF_INT : SIZEOF_INT + charset.GetByteCount(data); - } - - public int sizeOf(byte[] data) - { - return (data == null) ? SIZEOF_INT : SIZEOF_INT + data.Length; - } - - public int sizeOf(byte type, object obj) - { - return getHelper(type).sizeOf(this, obj); - } - - public int sizeOf(Event evnt) - { - return sizeOf(HiddenAccessN.GetSerializationType(evnt), evnt); - } - - private static ISerializableHelperN getHelper(byte type) - { - ISerializableHelperN helper = typeToHelper[type]; - - if (helper == null) - { - throw new Exception("Unknownd or unsupported data type"); - } - return helper; - } - - public static void register(Type realClass, byte type) - { - try - { - if (realClass != null) - { - MethodInfo method = realClass.GetMethod("createHiddenSerializer", - BindingFlags.NonPublic | BindingFlags.Static); - var helper = (ISerializableHelperN) method.Invoke(null, null); - - typeToHelper[type] = helper; - classToType.Add(realClass, type); - } - } - catch (Exception e) - { - LoggerN.logError(e); - } - } - - public static ByteBuffer serializeToBuffer(Object src) - { - var rbs = new RbSerializerN(); - Byte type = classToType[src.GetType()]; - - return rbs.serialize(type, src); - } - - public static T deserializeFromBuffer(ByteBuffer buffer) - { - var rbs = new RbSerializerN(); - Object res = rbs.deserialize(buffer); - - return (T) res; - } - } -} - -//happy diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode.dotnet.api.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode.dotnet.api.csproj deleted file mode 100644 index c23f971..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode.dotnet.api.csproj +++ /dev/null @@ -1,164 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84} - Library - Properties - robocode - robocode - v3.5 - 512 - true - ..\..\tools\keys\robocode.snk - - - 3.5 - - - - true - full - false - ..\target\ - ..\target\obj\ - DEBUG;TRACE - prompt - 4 - ..\target\robocode.xml - - - pdbonly - true - ..\target\ - ..\target\obj\ - TRACE - prompt - 4 - - - - - - - - - - - - - - AssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - copy "$(TargetPath)" "$(SolutionDir)\robocode.dotnet.host\target" - if not exist $(OutDir)\build-sources\generated-sources\META-INF mkdir $(OutDir)\build-sources\generated-sources\META-INF\ -echo [assembly: System.Reflection.AssemblyVersion("1.9.2.4")] > $(OutDir)\build-sources\generated-sources\META-INF\AssemblyInfo.cs - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/AdvancedRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/AdvancedRobot.cs deleted file mode 100644 index b92ce97..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/AdvancedRobot.cs +++ /dev/null @@ -1,2226 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.IO; -using Robocode.RobotInterfaces; -using Robocode.RobotInterfaces.Peer; -using Robocode.Util; - -namespace Robocode -{ - /// - /// A more advanced type of robot than Robot that allows non-blocking calls, - /// custom events, and writes to the filesystem. - ///

- /// If you have not already, you should create a first. - ///
- ///
- /// Building your first robot - /// - /// - /// - /// - /// - /// - /// - ///

- public abstract class AdvancedRobot : Robot, IAdvancedRobot, IAdvancedEvents - { - /// - /// Returns the distance remaining in the robot's current move measured in - /// pixels. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the robot is currently moving forwards. Negative values means - /// that the robot is currently moving backwards. If the returned value is 0, - /// the robot currently stands still. - /// - /// - /// - /// - /// - /// - ///

- public double DistanceRemaining - { - get - { - if (peer != null) - { - return peer.GetDistanceRemaining(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the angle remaining in the robots's turn, in degrees. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the robot is currently turning to the right. - /// Negative values means that the robot is currently turning to the left. - /// If the returned value is 0, the robot is currently not turning. - /// - /// - /// - /// - /// - /// - ///

- public double TurnRemaining - { - get - { - if (peer != null) - { - return Utils.ToDegrees(peer.GetBodyTurnRemaining()); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the angle remaining in the gun's turn, in degrees. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the gun is currently turning to the right. - /// Negative values means that the gun is currently turning to the left. - /// If the returned value is 0, the gun is currently not turning. - /// - /// - /// - /// - /// - /// - ///

- public double GunTurnRemaining - { - get - { - if (peer != null) - { - return Utils.ToDegrees(peer.GetGunTurnRemaining()); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the angle remaining in the radar's turn, in degrees. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the radar is currently turning to the right. - /// Negative values means that the radar is currently turning to the left. - /// If the returned value is 0, the radar is currently not turning. - /// - /// - /// - /// - /// - /// - ///

- public double RadarTurnRemaining - { - get - { - if (peer != null) - { - return Utils.ToDegrees(peer.GetRadarTurnRemaining()); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Sets the robot to move ahead (forward) by distance measured in - /// pixels when the next execution takes place. - ///

- /// This call returns immediately, and will not execute until you - /// call or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where positive values means that the robot is set to move ahead, and negative - /// values means that the robot is set to move back. If 0 is given as input, the - /// robot will stop its movement, but will have to decelerate till it stands still, - /// and will thus not be able to stop its movement immediately, but eventually. - ///

- /// - /// The distance to move measured in pixels. - /// If distance > 0 the robot is set to move ahead. - /// If distance < 0 the robot is set to move back. - /// If distance = 0 the robot is set to stop its movement. - /// - /// - /// - /// // Set the robot to move 50 pixels ahead - /// SetAhead(50); - /// - /// // Set the robot to move 100 pixels back - /// // (overrides the previous order) - /// SetAhead(-100); - /// - /// ... - /// // Executes the last SetAhead() - /// Execute(); - /// - /// - /// - /// - /// - public void SetAhead(double distance) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetMove(distance); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot to move back by distance measured in pixels when the next - /// execution takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot is set to move back, and negative - /// values means that the robot is set to move ahead. If 0 is given as input, - /// the robot will stop its movement, but will have to decelerate - /// till it stands still, and will thus not be able to stop its movement - /// immediately, but eventually. - ///

- /// - /// - /// // Set the robot to move 50 pixels back - /// SetBack(50); - /// - /// // Set the robot to move 100 pixels ahead - /// // (overrides the previous order) - /// SetBack(-100); - /// - /// ... - /// // Executes the last SetBack() - /// Execute(); - /// - /// - /// - /// - /// - ///

- /// - /// The distance to move measured in pixels. - /// If distance > 0 the robot is set to move back. - /// If distance < 0 the robot is set to move ahead. - /// If distance = 0 the robot is set to stop its movement. - /// - public void SetBack(double distance) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetMove(-distance); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's body to turn left by degrees when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn right - /// instead of left. - ///

- /// - /// - /// // Set the robot to turn 180 degrees to the left - /// SetTurnLeft(180); - /// - /// // Set the robot to turn 90 degrees to the right instead of left - /// // (overrides the previous order) - /// SetTurnLeft(-90); - /// - /// ... - /// // Executes the last SetTurnLeft() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's body to the left. - /// If degrees > 0 the robot is set to turn left. - /// If degrees < 0 the robot is set to turn right. - /// If degrees = 0 the robot is set to stop turning. - /// - public void SetTurnLeft(double degrees) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnBody(-Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's body to turn right by degrees when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn left - /// instead of right. - ///

- /// - /// - /// // Set the robot to turn 180 degrees to the right - /// SetTurnRight(180); - /// - /// // Set the robot to turn 90 degrees to the left instead of right - /// // (overrides the previous order) - /// SetTurnRight(-90); - /// - /// ... - /// // Executes the last SetTurnRight() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's body to the right. - /// If degrees > 0 the robot is set to turn right. - /// If degrees < 0 the robot is set to turn left. - /// If degrees = 0 the robot is set to stop turning. - /// - public void SetTurnRight(double degrees) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnBody(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the gun to Fire a bullet when the next execution takes place. - /// The bullet will travel in the direction the gun is pointing. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// The specified bullet power is an amount of energy that will be taken from - /// the robot's energy. Hence, the more power you want to spend on the - /// bullet, the more energy is taken from your robot. - ///

- /// The bullet will do (4 * power) damage if it hits another robot. If power - /// is greater than 1, it will do an additional 2 * (power - 1) damage. - /// You will get (3 * power) back if you hit the other robot. You can call - /// Rules.GetBulletDamage(double)} for getting the damage that a - /// bullet with a specific bullet power will do. - ///

- /// The specified bullet power should be between - /// and . - ///

- /// Note that the gun cannot Fire if the gun is overheated, meaning that - /// returns a value > 0. - ///

- /// An event is generated when the bullet hits a robot, wall, or another - /// bullet. - ///

- /// - /// - /// // Fire a bullet with maximum power if the gun is ready - /// if (GunGeat == 0) - /// { - /// SetFire(Rules.MAX_BULLET_POWER); - /// } - /// ... - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of energy given to the bullet, and subtracted from the robot's energy. - /// - public void SetFire(double power) - { - if (peer != null) - { - peer.SetFire(power); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the gun to Fire a bullet when the next execution takes place. - /// The bullet will travel in the direction the gun is pointing. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// The specified bullet power is an amount of energy that will be taken from - /// the robot's energy. Hence, the more power you want to spend on the - /// bullet, the more energy is taken from your robot. - ///

- /// The bullet will do (4 * power) damage if it hits another robot. If power - /// is greater than 1, it will do an additional 2 * (power - 1) damage. - /// You will get (3 * power) back if you hit the other robot. You can call - /// for getting the damage that a - /// bullet with a specific bullet power will do. - ///

- /// The specified bullet power should be between - /// and . - ///

- /// Note that the gun cannot Fire if the gun is overheated, meaning that - /// returns a value > 0. - ///

- /// An event is generated when the bullet hits a robot - /// (), wall (), or another - /// bullet (). - ///

- /// - /// - /// Bullet bullet = null; - /// - /// // Fire a bullet with maximum power if the gun is ready - /// if (GunHeat == 0) - /// { - /// bullet = SetFireBullet(Rules.MAX_BULLET_POWER); - /// } - /// ... - /// Execute(); - /// ... - /// // Get the velocity of the bullet - /// if (bullet != null) - /// { - /// double bulletVelocity = bullet.Velocity; - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of energy given to the bullet, and subtracted from the robot's - /// energy. - /// - /// Returns a that contains information about the bullet if it - /// was actually fired, which can be used for tracking the bullet after it - /// has been fired. If the bullet was not fired, null is returned. - public Bullet SetFireBullet(double power) - { - if (peer != null) - { - return peer.SetFire(power); - } - UninitializedException(); - return null; - } - - /// - /// Registers a custom event to be called when a condition is met. - /// When you are finished with your condition or just want to remove it you - /// must call . - ///

- /// - /// - /// // Create the condition for our custom event - /// Condition triggerHitCondition = new Condition("triggerhit") - /// { - /// public bool Test() - /// { - /// return (Energy <= trigger); - /// } - /// } - /// - /// // Add our custom event based on our condition - /// AddCustomEvent(triggerHitCondition); - /// - /// - /// - /// - ///

- /// - /// The condition that must be met. - /// Throws ArgumentException if the condition parameter has been set to null. - /// - public void AddCustomEvent(Condition condition) - { - if (condition == null) - { - throw new ArgumentException("the condition cannot be null"); - } - if (peer != null) - { - ((IAdvancedRobotPeer) peer).AddCustomEvent(condition); - } - else - { - UninitializedException(); - } - } - - /// - /// Same as , but alows to define condition as anonymous method. - /// - public void AddCustomEvent(string name, int priority, ConditionTest test) - { - AddCustomEvent(new Condition(name, priority, test)); - } - - /// - /// Removes a custom event that was previously added by calling - /// . - ///

- /// - /// - /// // Create the condition for our custom event - /// Condition triggerHitCondition = new Condition("triggerhit") - /// { - /// public bool Test() - /// { - /// return (Energy <= trigger); - /// } - /// } - /// - /// // Add our custom event based on our condition - /// AddCustomEvent(triggerHitCondition); - /// ... - /// // do something with your robot - /// ... - /// // Remove the custom event based on our condition - /// RemoveCustomEvent(triggerHitCondition); - /// - /// - /// - /// - ///

- /// - /// The condition that was previous added and that must be removed now. - /// - public void RemoveCustomEvent(Condition condition) - { - if (condition == null) - { - throw new ArgumentException("the condition cannot be null"); - } - if (peer != null) - { - ((IAdvancedRobotPeer) peer).RemoveCustomEvent(condition); - } - else - { - UninitializedException(); - } - } - - /// - /// Clears Out any pending events in the robot's event queue immediately. - /// - /// - /// - public void ClearAllEvents() - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).clearAllEvents(); - } - else - { - UninitializedException(); - } - } - - /// - /// Executes any pending actions, or continues executing actions that are - /// in process. This call returns after the actions have been started. - ///

- /// Note that advanced robots must call this function in order to - /// Execute pending set* calls like e.g. , - /// , etc. - /// Otherwise, these calls will never get executed. - ///

- /// In this example the robot will move while turning: - /// - /// - /// SetTurnRight(90); - /// SetAhead(100); - /// Execute(); - /// - /// while (DistanceRemaining > 0 && TurnRemaining > 0) - /// { - /// Execute(); - /// } - /// - /// - ///

- public virtual void Execute() - { - if (peer != null) - { - peer.Execute(); - } - else - { - UninitializedException(); - } - } - - /// - /// Returns a list containing all events currently in the robot's queue. - /// You might, for example, call this while processing another event. - ///

- /// - /// - /// for (Event evnt : GetAllEvents()) { - /// if (evnt is HitRobotEvent) { - /// // do something with the event - /// } else if (evnt is HitByBulletEvent) { - /// // do something with the event - /// } - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public IList GetAllEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetAllEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all BulletHitBulletEvents currently in the - /// robot's queue. You might, for example, call this while processing another - /// event. - ///

- /// - /// - /// for (BulletHitBulletEvent evnt : GetBulletHitBulletEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetBulletHitBulletEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetBulletHitBulletEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all BulletHitEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// for (BulletHitEvent event: GetBulletHitEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetBulletHitEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetBulletHitEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all BulletMissedEvents currently in the - /// robot's queue. You might, for example, call this while processing another - /// event. - ///

- /// - /// - /// for (BulletMissedEvent evnt : GetBulletMissedEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetBulletMissedEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetBulletMissedEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a file representing a data directory for the robot. - ///

- /// The system will automatically create the directory for you, so you do not - /// need to create it by yourself. - /// - ///

- public string GetDataDirectory() - { - if (peer != null) - { - return ((IAdvancedRobotPeer) peer).GetDataDirectory(); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a file in your data directory that you can write to. - ///

- /// The system will automatically create the directory for you, so you do not - /// need to create it by yourself. - ///

- /// Please notice that the max. size of your data file is set to 200000 bytes - /// (~195 KB). - ///

- /// See the Sample.SittingDuck to see an example of how to use this - /// method. - /// - ///

- /// - /// The file name of the data file for your robot - /// - public Stream GetDataFile(string filename) - { - if (peer != null) - { - return ((IAdvancedRobotPeer) peer).GetDataFile(filename); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns the data quota available in your data directory, i.e. the amount - /// of bytes left in the data directory for the robot. - /// - /// - /// - public long DataQuotaAvailable - { - get - { - if (peer != null) - { - return ((IAdvancedRobotPeer) peer).GetDataQuotaAvailable(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the current priority of a class of events. - /// An event priority is a value from 0 - 99. The higher value, the higher priority. - ///

- /// - /// - /// int myHitRobotPriority = GetEventPriority("HitRobotEvent"); - /// - /// - ///

- /// The default priorities are, from highest to lowest: - ///

    :     100 (reserved)
-        ///    :             100 (reserved)
-        ///    :     100 (reserved)
-        ///    :           99
-        ///    Key and mouse events:  98
-        ///    :           80 (default value)
-        ///    :          75
-        ///    :       70
-        ///    :     60
-        ///    :  55
-        ///    :        50
-        ///    :      40
-        ///    :          30
-        ///    :         20
-        ///    :     10
-        ///    :             5
-        ///    :            -1 (reserved)
-        ///  
- /// - ///
- /// - /// the name of the event class (string) - /// - public int GetEventPriority(string eventClass) - { - if (peer != null) - { - return ((IAdvancedRobotPeer) peer).GetEventPriority(eventClass); - } - UninitializedException(); - return 0; // never called - } - - /// - /// Returns a list containing all HitByBulletEvents currently in the - /// robot's queue. You might, for example, call this while processing - /// another event. - ///

- /// - /// - /// for (HitByBulletEvent evnt : GetHitByBulletEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetHitByBulletEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetHitByBulletEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all HitRobotEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// for (HitRobotEvent evnt : GetHitRobotEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetHitRobotEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetHitRobotEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all HitWallEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// for (HitWallEvent evnt : GetHitWallEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetHitWallEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetHitWallEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all RobotDeathEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// for (RobotDeathEvent evnt : GetRobotDeathEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetRobotDeathEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetRobotDeathEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all ScannedRobotEvents currently in the robot's queue. - /// You might, for example, call this while processing another event. - ///

- /// - /// - /// for (ScannedRobotEvent evnt : GetScannedRobotEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetScannedRobotEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetScannedRobotEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - /// Returns a list containing all StatusEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// for (StatusEvent evnt : GetStatusEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- public IList GetStatusEvents() - { - if (peer != null) - { - return new List(((IAdvancedRobotPeer) peer).GetStatusEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - public virtual void OnCustomEvent(CustomEvent evnt) - { - } - - /// - /// Sets the priority of a class of events. - ///

- /// Events are sent to the onXXX handlers in order of priority. - /// Higher priority events can interrupt lower priority events. - /// For events with the same priority, newer events are always sent first. - /// Valid priorities are 0 - 99, where 100 is reserved and 80 is the default - /// priority. - ///

- /// - /// - /// SetEventPriority("RobotDeathEvent", 15); - /// - /// - ///

- /// The default priorities are, from highest to lowest: - ///

    :             100 (reserved)
-        ///    :     100 (reserved)
-        ///    :           99
-        ///    :           80
-        ///    :          75
-        ///    :       70
-        ///    :     60
-        ///    :  55
-        ///    :        50
-        ///    :      40
-        ///    :          30
-        ///    :         20
-        ///    :     10
-        ///    :             5
-        ///    :            -1 (reserved)
-        ///  
- ///

- /// Note that you cannot change the priority for events with the special - /// priority value -1 or 100 (reserved) as these events are system events. - /// Also note that you cannot change the priority of CustomEvent. - /// Instead you must change the priority of the condition(s) for your custom - /// event(s). - /// - ///

- /// - /// The name of the event class (string) to set the priority for - /// - /// - /// The new priority for that event class - /// - public void SetEventPriority(string eventClass, int priority) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetEventPriority(eventClass, priority); - } - else - { - UninitializedException(); - } - } - - /// - /// Call this during an event handler to allow new events of the same - /// priority to restart the event handler. - ///

- /// - /// - /// public override void OnScannedRobot(ScannedRobotEvent e) - /// { - /// Fire(1); - /// IsInterruptible = true; - /// Ahead(100); // If you see a robot while moving ahead, - /// // this handler will start from the top - /// // Without IsInterruptible (true), we wouldn't - /// // receive scan events at all! - /// // We'll only get here if we don't see a robot during the move. - /// Out.WriteLine("Ok, I can't see anyone"); - /// } - /// - /// - /// - /// - ///

- public bool IsInterruptible - { - set - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetInterruptible(value); - } - else - { - UninitializedException(); - } - } - } - - /// - /// Sets the maximum turn rate of the robot measured in degrees if the robot - /// should turn slower than (10 degress/turn). - /// - /// - /// - /// - /// - /// - public double MaxTurnRate - { - set - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetMaxTurnRate(Utils.ToRadians(value)); - } - else - { - UninitializedException(); - } - } - } - - /// - /// Sets the maximum velocity of the robot measured in pixels/turn if the - /// robot should move slower than (8 pixels/turn). - /// - /// - /// - /// - /// - /// - public double MaxVelocity - { - set - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetMaxVelocity(value); - } - else - { - UninitializedException(); - } - } - } - - /// - /// Sets the robot to resume the movement stopped by - /// or , if any. - ///

- /// This call returns immediately, and will not execute until you call - /// or take an action that executes. - /// - /// - /// - /// - /// - /// - /// - ///

- public void SetResume() - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetResume(); - } - else - { - UninitializedException(); - } - } - - /// - /// This call is identical to , but returns immediately, and - /// will not execute until you call or take an action that - /// executes. - ///

- /// If there is already movement saved from a previous stop, this will have - /// no effect. - ///

- /// This call is equivalent to calling SetStop(false); - /// - /// - /// - /// - /// - /// - /// - ///

- public void SetStop() - { - SetStop(false); - } - - /// - /// This call is identical to , but - /// returns immediately, and will not execute until you call - /// or take an action that executes. - ///

- /// If there is already movement saved from a previous stop, you can - /// overwrite it by calling SetStop(true). - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// true if the movement saved from a previous stop - /// should be overwritten; false otherwise. - /// - public void SetStop(bool overwrite) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetStop(overwrite); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's gun to turn left by degrees when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn right - /// instead of left. - ///

- /// - /// - /// // Set the gun to turn 180 degrees to the left - /// SetTurnGunLeft(180); - /// - /// // Set the gun to turn 90 degrees to the right instead of left - /// // (overrides the previous order) - /// SetTurnGunLeft(-90); - /// - /// ... - /// // Executes the last SetTurnGunLeft() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's gun to the left. - /// If degrees > 0 the robot's gun is set to turn left. - /// If degrees < 0 the robot's gun is set to turn right. - /// If degrees = 0 the robot's gun is set to stop turning. - /// - public void SetTurnGunLeft(double degrees) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnGun(-Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's gun to turn right by degrees when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn left - /// instead of right. - ///

- /// - /// - /// // Set the gun to turn 180 degrees to the right - /// SetTurnGunRight(180); - /// - /// // Set the gun to turn 90 degrees to the left instead of right - /// // (overrides the previous order) - /// SetTurnGunRight(-90); - /// - /// ... - /// // Executes the last SetTurnGunRight() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// - /// The amount of degrees to turn the robot's gun to the right. - /// If degrees > 0 the robot's gun is set to turn right. - /// If degrees < 0 the robot's gun is set to turn left. - /// If degrees = 0 the robot's gun is set to stop turning. - /// - public void SetTurnGunRight(double degrees) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnGun(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's radar to turn left by degrees when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn right - /// instead of left. - ///

- /// - /// - /// // Set the radar to turn 180 degrees to the left - /// SetTurnRadarLeft(180); - /// - /// // Set the radar to turn 90 degrees to the right instead of left - /// // (overrides the previous order) - /// SetTurnRadarLeft(-90); - /// - /// ... - /// // Executes the last SetTurnRadarLeft() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's radar to the left. - /// If degrees > 0 the robot's radar is set to turn left. - /// If degrees < 0 the robot's radar is set to turn right. - /// If degrees = 0 the robot's radar is set to stop turning. - /// - public void SetTurnRadarLeft(double degrees) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnRadar(-Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's radar to turn right by degrees when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn left - /// instead of right. - ///

- /// - /// - /// // Set the radar to turn 180 degrees to the right - /// SetTurnRadarRight(180); - /// - /// // Set the radar to turn 90 degrees to the right instead of right - /// // (overrides the previous order) - /// SetTurnRadarRight(-90); - /// - /// ... - /// // Executes the last SetTurnRadarRight() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's radar to the rright. - /// If degrees > 0 the robot's radar is set to turn right. - /// If degrees < 0 the robot's radar is set to turn left. - /// If degrees = 0 the robot's radar is set to stop turning. - /// - public void SetTurnRadarRight(double degrees) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnRadar(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Does not return until a condition is met, i.e. when a - /// returns true. - ///

- /// This call executes immediately. - ///

- /// See the Sample.Crazy robot for how this method can be used. - /// - /// - ///

- /// - /// the condition that must be met before this call returns - /// - public void WaitFor(Condition condition) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).WaitFor(condition); - } - else - { - UninitializedException(); - } - } - - /// - /// This method is called if your robot dies. - ///

- /// You should override it in your robot if you want to be informed of this - /// event. Actions will have no effect if called from this section. The - /// intent is to allow you to perform calculations or print something out - /// when the robot is killed. - /// - /// - ///

- /// the death event set by the game - public override void OnDeath(DeathEvent evnt) - { - } - - /// - public virtual void OnSkippedTurn(SkippedTurnEvent evnt) - { - } - - /// - /// Returns the direction that the robot's body is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - /// - /// - /// - ///

- public double HeadingRadians - { - get - { - if (peer != null) - { - return peer.GetBodyHeading(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Sets the robot's body to turn left by radians when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn right - /// instead of left. - ///

- /// - /// - /// // Set the robot to turn 180 degrees to the left - /// SetTurnLeftRadians(Math.PI); - /// - /// // Set the robot to turn 90 degrees to the right instead of left - /// // (overrides the previous order) - /// SetTurnLeftRadians(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnLeftRadians() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's body to the left. - /// If radians > 0 the robot is set to turn left. - /// If radians < 0 the robot is set to turn right. - /// If radians = 0 the robot is set to stop turning. - public void SetTurnLeftRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnBody(-radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's body to turn right by radians when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn left - /// instead of right. - ///

- /// - /// - /// // Set the robot to turn 180 degrees to the right - /// SetTurnRightRadians(Math.PI); - /// - /// // Set the robot to turn 90 degrees to the left instead of right - /// // (overrides the previous order) - /// SetTurnRightRadians(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnRightRadians() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's body to the right. - /// If radians > 0 the robot is set to turn right. - /// If radians < 0 the robot is set to turn left. - /// If radians = 0 the robot is set to stop turning. - public void SetTurnRightRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnBody(radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately turns the robot's body to the left by radians. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the robot's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn right - /// instead of left. - ///

- /// - /// - /// // Turn the robot 180 degrees to the left - /// TurnLeftRadians(Math.PI); - /// - /// // Afterwards, turn the robot 90 degrees to the right - /// TurnLeftRadians(-Math.PI / 2); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's body to the left. - /// If radians > 0 the robot will turn right. - /// If radians < 0 the robot will turn left. - /// If radians = 0 the robot will not turn, but execute. - public void TurnLeftRadians(double radians) - { - if (peer != null) - { - peer.TurnBody(-radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately turns the robot's body to the right by radians. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the robot's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn left - /// instead of right. - ///

- /// - /// - /// // Turn the robot 180 degrees to the right - /// TurnRightRadians(Math.PI); - /// - /// // Afterwards, turn the robot 90 degrees to the left - /// TurnRightRadians(-Math.PI / 2); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's body to the right. - /// If radians > 0 the robot will turn right. - /// If radians < 0 the robot will turn left. - /// If radians = 0 the robot will not turn, but execute. - public void TurnRightRadians(double radians) - { - if (peer != null) - { - peer.TurnBody(radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Returns the direction that the robot's gun is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - /// - /// - /// - ///

- public double GunHeadingRadians - { - get - { - if (peer != null) - { - return peer.GetGunHeading(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the direction that the robot's radar is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - /// - /// - /// - ///

- public double RadarHeadingRadians - { - get - { - if (peer != null) - { - return peer.GetRadarHeading(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Sets the robot's gun to turn left by radians when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn right - /// instead of left. - ///

- /// - /// - /// // Set the gun to turn 180 degrees to the left - /// SetTurnGunLeftRadians(Math.PI); - /// - /// // Set the gun to turn 90 degrees to the right instead of left - /// // (overrides the previous order) - /// SetTurnGunLeftRadians(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnGunLeftRadians() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's gun to the left. - /// If radians > 0 the robot's gun is set to turn left. - /// If radians < 0 the robot's gun is set to turn right. - /// If radians = 0 the robot's gun is set to stop turning. - public void SetTurnGunLeftRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnGun(-radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's gun to turn right by radians when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn left - /// instead of right. - ///

- /// - /// - /// // Set the gun to turn 180 degrees to the right - /// SetTurnGunRightRadians(Math.PI); - /// - /// // Set the gun to turn 90 degrees to the left instead of right - /// // (overrides the previous order) - /// SetTurnGunRightRadians(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnGunRightRadians() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's gun to the right. - /// If radians > 0 the robot's gun is set to turn left. - /// If radians < 0 the robot's gun is set to turn right. - /// If radians = 0 the robot's gun is set to stop turning. - public void SetTurnGunRightRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnGun(radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's radar to turn left by radians when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn right - /// instead of left. - ///

- /// - /// - /// // Set the radar to turn 180 degrees to the left - /// SetTurnRadarLeftRadians(Math.PI); - /// - /// // Set the radar to turn 90 degrees to the right instead of left - /// // (overrides the previous order) - /// SetTurnRadarLeftRadians(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnRadarLeftRadians() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's radar to the left. - /// If radians > 0 the robot's radar is set to turn left. - /// If radians < 0 the robot's radar is set to turn right. - /// If radians = 0 the robot's radar is set to stop turning. - public void SetTurnRadarLeftRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnRadar(-radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the robot's radar to turn right by radians when the next execution - /// takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn left - /// instead of right. - ///

- /// - /// - /// // Set the radar to turn 180 degrees to the right - /// SetTurnRadarRightRadians(Math.PI); - /// - /// // Set the radar to turn 90 degrees to the right instead of right - /// // (overrides the previous order) - /// SetTurnRadarRightRadians(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnRadarRightRadians() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's radar to the right. - /// If radians > 0 the robot's radar is set to turn left. - /// If radians < 0 the robot's radar is set to turn right. - /// If radians = 0 the robot's radar is set to stop turning. - public void SetTurnRadarRightRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).SetTurnRadar(radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately turns the robot's gun to the left by radians. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the gun's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn right - /// instead of left. - ///

- /// - /// - /// // Turn the robot's gun 180 degrees to the left - /// TurnGunLeftRadians(Math.PI); - /// - /// // Afterwards, turn the robot's gun 90 degrees to the right - /// TurnGunLeftRadians(-Math.PI / 2); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's gun to the left. - /// If radians > 0 the robot's gun will turn left. - /// If radians < 0 the robot's gun will turn right. - /// If radians = 0 the robot's gun will not turn, but execute. - public void TurnGunLeftRadians(double radians) - { - if (peer != null) - { - peer.TurnGun(-radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately turns the robot's gun to the right by radians. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the gun's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn left - /// instead of right. - ///

- /// - /// - /// // Turn the robot's gun 180 degrees to the right - /// TurnGunRightRadians(Math.PI); - /// - /// // Afterwards, turn the robot's gun 90 degrees to the left - /// TurnGunRightRadians(-Math.PI / 2); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's gun to the right. - /// If radians > 0 the robot's gun will turn right. - /// If radians < 0 the robot's gun will turn left. - /// If radians = 0 the robot's gun will not turn, but execute. - public void TurnGunRightRadians(double radians) - { - if (peer != null) - { - peer.TurnGun(radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately turns the robot's radar to the left by radians. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the radar's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn right - /// instead of left. - ///

- /// - /// - /// // Turn the robot's radar 180 degrees to the left - /// TurnRadarLeftRadians(Math.PI); - /// - /// // Afterwards, turn the robot's radar 90 degrees to the right - /// TurnRadarLeftRadians(-Math.PI / 2); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's radar to the left. - /// If radians > 0 the robot's radar will turn left. - /// If radians < 0 the robot's radar will turn right. - /// If radians = 0 the robot's radar will not turn, but execute. - public void TurnRadarLeftRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).TurnRadar(-radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately turns the robot's radar to the right by radians. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the radar's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn left - /// instead of right. - ///

- /// - /// - /// // Turn the robot's radar 180 degrees to the right - /// TurnRadarRightRadians(Math.PI); - /// - /// // Afterwards, turn the robot's radar 90 degrees to the left - /// TurnRadarRightRadians(-Math.PI / 2); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// the amount of radians to turn the robot's radar to the right. - /// If radians > 0 the robot's radar will turn right. - /// If radians < 0 the robot's radar will turn left. - /// If radians = 0 the robot's radar will not turn, but execute. - public void TurnRadarRightRadians(double radians) - { - if (peer != null) - { - ((IAdvancedRobotPeer) peer).TurnRadar(radians); - } - else - { - UninitializedException(); - } - } - - /// - /// Returns the angle remaining in the gun's turn, in radians. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the gun is currently turning to the right. Negative values - /// means that the gun is currently turning to the left. - /// - /// - /// - /// - /// - ///

- public double GunTurnRemainingRadians - { - get - { - if (peer != null) - { - return peer.GetGunTurnRemaining(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the angle remaining in the radar's turn, in radians. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the radar is currently turning to the right. Negative values - /// means that the radar is currently turning to the left. - /// - /// - /// - /// - /// - ///

- public double RadarTurnRemainingRadians - { - get - { - if (peer != null) - { - return peer.GetRadarTurnRemaining(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the angle remaining in the robot's turn, in radians. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the robot is currently turning to the right. Negative values - /// means that the robot is currently turning to the left. - /// - /// - /// - /// - /// - ///

- public double TurnRemainingRadians - { - get - { - if (peer != null) - { - return peer.GetBodyTurnRemaining(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - IAdvancedEvents IAdvancedRobot.GetAdvancedEventListener() - { - return this; // this robot is listening - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleEndedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleEndedEvent.cs deleted file mode 100644 index 7c877c1..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleEndedEvent.cs +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A BattleEndedEvent is sent to - /// when the battle is ended. - /// You can use the information contained in this event to determine if the - /// battle was aborted and also get the results of the battle. - /// - /// - /// - [Serializable] - public sealed class BattleEndedEvent : Event - { - private const int DEFAULT_PRIORITY = 100; // System event -> cannot be changed!; - - private readonly bool aborted; - private readonly BattleResults results; - - /// - /// - /// Called by the game to create a new BattleEndedEvent. - /// - public BattleEndedEvent(bool aborted, BattleResults results) - { - this.aborted = aborted; - this.results = results; - } - - /// - /// Checks if this battle was aborted. - /// Returns true if the battle was aborted - /// - public bool IsAborted - { - get { return aborted; } - } - - /// - /// Returns the battle results. - /// - public BattleResults Results - { - get { return results; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - /// - public override int Priority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (robot != null) - { - var listener = robot.GetBasicEventListener() as IBasicEvents2; - if (listener != null) - { - listener.OnBattleEnded(this); - } - } - } - - internal override bool IsCriticalEvent - { - get { return true; } - } - - internal override byte SerializationType - { - get { return RbSerializerN.BattleEndedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (BattleEndedEvent) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_BOOL - + serializer.sizeOf(RbSerializerN.BattleResults_TYPE, obj.results); - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (BattleEndedEvent) objec; - - serializer.serialize(buffer, obj.aborted); - serializer.serialize(buffer, RbSerializerN.BattleResults_TYPE, obj.results); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - bool aborted = serializer.deserializeBoolean(buffer); - var results = (BattleResults) serializer.deserializeAny(buffer); - - return new BattleEndedEvent(aborted, results); - } - } - } -} - -//docl \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleResults.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleResults.cs deleted file mode 100644 index 8975462..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleResults.cs +++ /dev/null @@ -1,225 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; - -namespace Robocode -{ - /// - /// Contains the battle results returned by - /// when a battle has ended. - /// - /// - /// - [Serializable] - public class BattleResults : IComparable - { - internal string teamLeaderName; - internal int rank; - internal double score; - internal double survival; - internal double lastSurvivorBonus; - internal double bulletDamage; - internal double bulletDamageBonus; - internal double ramDamage; - internal double ramDamageBonus; - internal int firsts; - internal int seconds; - internal int thirds; - - /// - /// Constructs this BattleResults object. - /// - public BattleResults( - string teamLeaderName, - int rank, - double score, - double survival, - double lastSurvivorBonus, - double bulletDamage, - double bulletDamageBonus, - double ramDamage, - double ramDamageBonus, - int firsts, - int seconds, - int thirds - ) - { - this.teamLeaderName = teamLeaderName; - this.rank = rank; - this.score = score; - this.survival = survival; - this.lastSurvivorBonus = lastSurvivorBonus; - this.bulletDamage = bulletDamage; - this.bulletDamageBonus = bulletDamageBonus; - this.ramDamage = ramDamage; - this.ramDamageBonus = ramDamageBonus; - this.firsts = firsts; - this.seconds = seconds; - this.thirds = thirds; - } - - /// - /// Returns the name of the team leader in the team or the name of the - /// robot if the robot is not participating in a team. - /// - public string TeamLeaderName - { - get { return teamLeaderName; } - } - - /// - /// Returns the rank of this robot in the battle results. - /// - public int Rank - { - get { return rank; } - } - - /// - /// Returns the total score of this robot in the battle. - /// - public int Score - { - get { return (int) (score + 0.5); } - } - - /// - /// Returns the survival score of this robot in the battle. - /// - public int Survival - { - get { return (int) (survival + 0.5); } - } - - /// - /// Returns the last survivor score of this robot in the battle. - /// - public int LastSurvivorBonus - { - get { return (int) (lastSurvivorBonus + 0.5); } - } - - /// - /// Returns the bullet damage score of this robot in the battle. - /// - public int BulletDamage - { - get { return (int) (bulletDamage + 0.5); } - } - - /// - /// Returns the bullet damage bonus of this robot in the battle. - /// - public int BulletDamageBonus - { - get { return (int) (bulletDamageBonus + 0.5); } - } - - /// - /// Returns the ram damage score of this robot in the battle. - /// - public int RamDamage - { - get { return (int) (ramDamage + 0.5); } - } - - /// - /// Returns the ram damage bonus of this robot in the battle. - /// - public int RamDamageBonus - { - get { return (int) (ramDamageBonus + 0.5); } - } - - /// - /// Returns the number of rounds this robot placed first in the battle. - /// - public int Firsts - { - get { return firsts; } - } - - /// - /// Returns the number of rounds this robot placed second in the battle. - /// - public int Seconds - { - get { return seconds; } - } - - /// - /// Returns the number of rounds this robot placed third in the battle. - /// - public int Thirds - { - get { return thirds; } - } - - public int CompareTo(BattleResults o) - { - return score.CompareTo(o.score); - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (BattleResults) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + serializer.sizeOf(obj.teamLeaderName) + - 4*RbSerializerN.SIZEOF_INT - + 7*RbSerializerN.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (BattleResults) objec; - - serializer.serialize(buffer, obj.teamLeaderName); - serializer.serialize(buffer, obj.rank); - serializer.serialize(buffer, obj.score); - serializer.serialize(buffer, obj.survival); - serializer.serialize(buffer, obj.lastSurvivorBonus); - serializer.serialize(buffer, obj.bulletDamage); - serializer.serialize(buffer, obj.bulletDamageBonus); - serializer.serialize(buffer, obj.ramDamage); - serializer.serialize(buffer, obj.ramDamageBonus); - serializer.serialize(buffer, obj.firsts); - serializer.serialize(buffer, obj.seconds); - serializer.serialize(buffer, obj.thirds); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - string teamLeaderName = serializer.deserializeString(buffer); - int rank = buffer.getInt(); - double score = buffer.getDouble(); - double survival = buffer.getDouble(); - double lastSurvivorBonus = buffer.getDouble(); - double bulletDamage = buffer.getDouble(); - double bulletDamageBonus = buffer.getDouble(); - double ramDamage = buffer.getDouble(); - double ramDamageBonus = buffer.getDouble(); - int firsts = buffer.getInt(); - int seconds = buffer.getInt(); - int thirds = buffer.getInt(); - - return new BattleResults(teamLeaderName, rank, score, survival, lastSurvivorBonus, bulletDamage, - bulletDamageBonus, ramDamage, ramDamageBonus, firsts, seconds, thirds); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleRules.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleRules.cs deleted file mode 100644 index 461d0f1..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BattleRules.cs +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.security; - -namespace Robocode -{ - /// - /// Contains the battle rules returned by BattleStartedEvent.BattleRules - /// when a battle is started and BattleCompletedEvent.BattleRules - /// when a battle is completed. - /// - /// BattleStartedEvent - /// BattleCompletedEvent - [Serializable] - public sealed class BattleRules - { - private readonly int battlefieldWidth; - private readonly int battlefieldHeight; - private readonly int numRounds; - private readonly double gunCoolingRate; - private readonly long inactivityTime; - private readonly bool hideEnemyNames; - private readonly int sentryBorderSize; - - /// - /// Returns the battlefield width. - /// - public int BattlefieldWidth - { - get { return battlefieldWidth; } - } - - /// - /// Returns the battlefield height. - /// - public int BattlefieldHeight - { - get { return battlefieldHeight; } - } - - /// - /// Returns the number of rounds. - /// - public int NumRounds - { - get { return numRounds; } - } - - /// - /// Returns the rate at which the gun will cool down, i.e. the amount of heat the gun heat will drop per turn. - ///

- /// The gun cooling rate is default 0.1 per turn, but can be changed by the battle setup. - /// So don't count on the cooling rate being 0.1! - /// - /// - /// - ///

- public double GunCoolingRate - { - get { return gunCoolingRate; } - } - - /// - /// Returns the allowed inactivity time, where the robot is not taking any action, before will begin to be zapped. - /// The inactivity time is measured in turns, and is the allowed time that a robot is allowed to omit taking - /// action before being punished by the game by zapping. - ///

- /// When a robot is zapped by the game, it will loose 0.1 energy points per turn. Eventually the robot will be - /// killed by zapping until the robot takes action. When the robot takes action, the inactivity time counter is - /// reset. - ///

- /// The allowed inactivity time is per default 450 turns, but can be changed by the battle setup. - /// So don't count on the inactivity time being 450 turns! - /// - /// - ///

- public long InactivityTime - { - get { return inactivityTime; } - } - - /// - /// Returns true if the enemy names are hidden, i.e. anonymous; false otherwise. - /// - public bool HideEnemyNames - { - get { return hideEnemyNames; } - } - - /// - /// Returns the sentry border size for a BorderSentry that defines the how - /// far a BorderSentry is allowed to move from the border edges measured in units.
- /// Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that - /// BorderSentrys cannot leave (sentry robots robots must stay in the border area), but it also define the - /// distance from the border edges where BorderSentrys are allowed/able to make damage to robots entering this - /// border area. - ///
- public int SentryBorderSize - { - get { return sentryBorderSize; } - } - - private BattleRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, long inactivityTime, - bool hideEnemyNames, int sentryBorderSize) - { - this.battlefieldWidth = battlefieldWidth; - this.battlefieldHeight = battlefieldHeight; - this.numRounds = numRounds; - this.gunCoolingRate = gunCoolingRate; - this.inactivityTime = inactivityTime; - this.hideEnemyNames = hideEnemyNames; - this.sentryBorderSize = sentryBorderSize; - } - - private static IHiddenRulesHelper createHiddenHelper() - { - return new HiddenHelper(); - } - - private class HiddenHelper : IHiddenRulesHelper - { - public BattleRules createRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, long inactivityTime, - bool hideEnemyNames, int borderSentryRobotAttackRange) - { - return new BattleRules(battlefieldWidth, battlefieldHeight, numRounds, gunCoolingRate, inactivityTime, hideEnemyNames, borderSentryRobotAttackRange); - } - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Bullet.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Bullet.cs deleted file mode 100644 index 2a4ddef..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Bullet.cs +++ /dev/null @@ -1,217 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.security; -using net.sf.robocode.serialization; -using Robocode.Util; - -namespace Robocode -{ - /// - /// - /// Represents a bullet. This is returned from - /// and , and all the bullet-related - /// events. - /// - /// - /// - /// - /// - /// - [Serializable] - public class Bullet - { - private readonly double headingRadians; - private double x; - private double y; - private readonly double power; - private readonly string ownerName; - private string victimName; - private bool _isActive; - private readonly int bulletId; - - /// - /// Called by the game to create a new Bullet object - /// - public Bullet(double heading, double x, double y, double power, string ownerName, string victimName, - bool isActive, int bulletId) - { - headingRadians = heading; - this.x = x; - this.y = y; - this.power = power; - this.ownerName = ownerName; - this.victimName = victimName; - _isActive = isActive; - this.bulletId = bulletId; - } - - public override bool Equals(Object obj) - { - if (obj is Bullet) - { - Bullet bullet = (Bullet)obj; - return bullet.bulletId == bulletId; - } - return Equals(obj); - } - - /// - /// Returns the direction the bullet is/was heading, in degrees - /// (0 <= getHeading() < 360). This is not relative to the direction you are facing. - /// - public double Heading - { - get { return Utils.ToDegrees(headingRadians); } - } - - /// - /// Returns the direction the bullet is/was heading, in radians - /// (0 <= getHeadingRadians() < 2 * Math.PI). This is not relative to the direction you are facing. - /// - public double HeadingRadians - { - get { return headingRadians; } - } - - /// - /// Returns the name of the robot that fired this bullet. - /// - public string Name - { - get { return ownerName; } - } - - /// - /// Returns the power of this bullet. - ///

- /// The bullet will do (4 * power) damage if it hits another robot. - /// If power is greater than 1, it will do an additional 2 * (power - 1) - /// damage. You will get (3 * power) back if you hit the other robot. - ///

- public double Power - { - get { return power; } - } - - /// - /// Returns the velocity of this bullet. The velocity of the bullet is - /// constant once it has been fired. - /// - public double Velocity - { - get { return Rules.GetBulletSpeed(power); } - } - - /// - /// Returns the name of the robot that this bullet hit, or null if - /// the bullet has not hit a robot. - /// - public string Victim - { - get { return victimName; } - } - - /// - /// Returns the X position of the bullet. - /// - public double X - { - get { return x; } - } - - /// - /// Returns the Y position of the bullet. - /// - public double Y - { - get { return y; } - } - - /// - /// Checks if this bullet is still active on the battlefield. - /// - public bool IsActive - { - get { return _isActive; } - } - - /// - /// Updates this bullet based on the specified bullet status. - /// - // this method is invisible on RobotAPI - private void update(double x, double y, string victimName, bool isActive) - { - this.x = x; - this.y = y; - this.victimName = victimName; - _isActive = isActive; - } - - internal int getBulletId() - { - return bulletId; - } - - private static IHiddenBulletHelper createHiddenHelper() - { - return new HiddenBulletHelper(); - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new HiddenBulletHelper(); - } - - private class HiddenBulletHelper : IHiddenBulletHelper, ISerializableHelperN - { - public void update(Bullet bullet, double x, double y, string victimName, bool isActive) - { - bullet.update(x, y, victimName, isActive); - } - - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (Bullet)objec; - - return RbSerializerN.SIZEOF_TYPEINFO + 4 * RbSerializerN.SIZEOF_DOUBLE + serializer.sizeOf(obj.ownerName) - + serializer.sizeOf(obj.victimName) + RbSerializerN.SIZEOF_BOOL + RbSerializerN.SIZEOF_INT; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (Bullet)objec; - - serializer.serialize(buffer, obj.headingRadians); - serializer.serialize(buffer, obj.x); - serializer.serialize(buffer, obj.y); - serializer.serialize(buffer, obj.power); - serializer.serialize(buffer, obj.ownerName); - serializer.serialize(buffer, obj.victimName); - serializer.serialize(buffer, obj._isActive); - serializer.serialize(buffer, obj.bulletId); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - double headingRadians = buffer.getDouble(); - double x = buffer.getDouble(); - double y = buffer.getDouble(); - double power = buffer.getDouble(); - string ownerName = serializer.deserializeString(buffer); - string victimName = serializer.deserializeString(buffer); - bool isActive = serializer.deserializeBoolean(buffer); - int bulletId = serializer.deserializeInt(buffer); - - return new Bullet(headingRadians, x, y, power, ownerName, victimName, isActive, bulletId); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitBulletEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitBulletEvent.cs deleted file mode 100644 index 6723d1b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitBulletEvent.cs +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to - /// when one of your bullets has hit another bullet. - /// - [Serializable] - public sealed class BulletHitBulletEvent : Event - { - private const int DEFAULT_PRIORITY = 55; - - private Bullet bullet; - private readonly Bullet hitBullet; - - /// - /// Called by the game to create a new BulletHitEvent. - /// - public BulletHitBulletEvent(Bullet bullet, Bullet hitBullet) - { - this.bullet = bullet; - this.hitBullet = hitBullet; - } - - /// - /// Returns your bullet that hit another bullet. - /// - public Bullet Bullet - { - get { return bullet; } - } - - /// - /// Returns the bullet that was hit by your bullet. - /// - public Bullet HitBullet - { - get { return hitBullet; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnBulletHitBullet(this); - } - } - - // Needed for .NET version - internal override void UpdateBullets(Dictionary bullets) - { - // we need to pass same instance - bullet = bullets[bullet.getBulletId()]; - } - - internal override byte SerializationType - { - get { return RbSerializerN.BulletHitBulletEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (BulletHitBulletEvent) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_INT - + serializer.sizeOf(RbSerializerN.Bullet_TYPE, obj.hitBullet); - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (BulletHitBulletEvent) objec; - - // no need to transmit whole bullet, rest of it is already known to proxy side - serializer.serialize(buffer, obj.bullet.getBulletId()); - serializer.serialize(buffer, RbSerializerN.Bullet_TYPE, obj.hitBullet); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - var bullet = new Bullet(0, 0, 0, 0, null, null, false, buffer.getInt()); - var hitBullet = (Bullet) serializer.deserializeAny(buffer); - - return new BulletHitBulletEvent(bullet, hitBullet); - } - } - } -} - -//doc diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitEvent.cs deleted file mode 100644 index bc35644..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletHitEvent.cs +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to - /// when one of your bullets has hit another robot. - /// - [Serializable] - public sealed class BulletHitEvent : Event - { - private const int DEFAULT_PRIORITY = 50; - - private readonly string name; - private readonly double energy; - private Bullet bullet; - - /// - /// Called by the game to create a new BulletHitEvent. - /// - public BulletHitEvent(string name, double energy, Bullet bullet) - { - this.name = name; - this.energy = energy; - this.bullet = bullet; - } - - /// - /// Returns the bullet of yours that hit the robot. - /// - public Bullet Bullet - { - get { return bullet; } - } - - /// - /// Returns the remaining energy of the robot your bullet has hit (after the - /// damage done by your bullet). - /// - public double VictimEnergy - { - get { return energy; } - } - - /// - /// Returns the name of the robot your bullet hit. - /// - public string VictimName - { - get { return name; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnBulletHit(this); - } - } - - // Needed for .NET version - internal override void UpdateBullets(Dictionary bullets) - { - // we need to pass same instance - bullet = bullets[bullet.getBulletId()]; - } - - internal override byte SerializationType - { - get { return RbSerializerN.BulletHitEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (BulletHitEvent) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_INT + serializer.sizeOf(obj.name) - + RbSerializerN.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (BulletHitEvent) objec; - - serializer.serialize(buffer, obj.bullet.getBulletId()); - serializer.serialize(buffer, obj.name); - serializer.serialize(buffer, obj.energy); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - var bullet = new Bullet(0, 0, 0, 0, null, null, false, buffer.getInt()); - string name = serializer.deserializeString(buffer); - double energy = buffer.getDouble(); - - return new BulletHitEvent(name, energy, bullet); - } - } - } -} - -//doc diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletMissedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletMissedEvent.cs deleted file mode 100644 index 19294d6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/BulletMissedEvent.cs +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to - /// when one of your bullets has missed, i.e. when the bullet has - /// reached the border of the battlefield. - /// - [Serializable] - public sealed class BulletMissedEvent : Event - { - private const int DEFAULT_PRIORITY = 60; - - private Bullet bullet; - - /// - /// - /// Called by the game to create a new BulletMissedEvent. - /// - public BulletMissedEvent(Bullet bullet) - { - this.bullet = bullet; - } - - /// - /// - /// Returns the bullet that missed. - /// - public Bullet Bullet - { - get { return bullet; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnBulletMissed(this); - } - } - - // Needed for .NET version - internal override void UpdateBullets(Dictionary bullets) - { - // we need to pass same instance - bullet = bullets[bullet.getBulletId()]; - } - - internal override byte SerializationType - { - get { return RbSerializerN.BulletMissedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_INT; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (BulletMissedEvent) objec; - - serializer.serialize(buffer, obj.bullet.getBulletId()); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - var bullet = new Bullet(0, 0, 0, 0, null, null, false, buffer.getInt()); - - return new BulletMissedEvent(bullet); - } - } - } -} -//doc diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Condition.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Condition.cs deleted file mode 100644 index 974fcea..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Condition.cs +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.io; - -namespace Robocode -{ - /// - /// Condition is used to define custom - /// and custom events for an AdvancedRobot. The code below is taken from the sample robot - /// named samplecs.Target. See the samplecs/Target.cs for details. - /// - /// - /// AddCustomEvent( - /// new Condition("triggerhit", (c) => - /// { - /// return Energy <= trigger; - /// })); - /// - /// - /// - /// - /// - /// - /// - public class Condition - { - private readonly ConditionTest test; - - /// - /// The priority of this condition. Defaults to 80. - /// - public int priority = 80; - - /// - /// The name of this condition. - /// - public string name; - - /// - /// Convinience constructor, allows to pass delegate to method, instead of overriding Test() method. - /// - public Condition(string name, int priority, ConditionTest test) - : this(name, priority) - { - this.test = test; - } - - /// - /// Convinience constructor, allows to pass delegate to method, instead of overriding Test() method. - /// - public Condition(string name, ConditionTest test) - : this(name) - { - this.test = test; - } - - /// - /// Convinience constructor, allows to pass delegate to method, instead of overriding Test() method. - /// - public Condition(ConditionTest test) - { - this.test = test; - } - - /// - /// Creates a new, unnamed Condition with the default priority, which is 80. - /// - protected Condition() - { - } - - /// - /// Creates a new Condition with the specified name, and default priority, which is 80. - /// - /// The name for the new Condition - protected Condition(string name) - { - this.name = name; - } - - /// - /// Creates a new Condition with the specified name and priority. - /// A condition priority is a value from 0 - 99. The higher value, the - /// higher priority. The default priority is 80. - /// - /// The name for the new condition - /// The priority of the new condition - protected Condition(string name, int priority) - { - this.name = name; - if (priority < 0) - { - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority must be between 0 and 99."); - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority for condition " + name + " will be 0."); - priority = 0; - } - else if (priority > 99) - { - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority must be between 0 and 99."); - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority for condition " + name + " will be 99."); - priority = 99; - } - this.priority = priority; - } - - /// - /// Returns the name of this condition. - /// - public string Name - { - get { return name ?? GetType().Name; } - set { name = value; } - } - - /// - /// Returns the priority of this condition. - /// A condition priority is a value from 0 - 99. The higher value, the - /// higher priority. The default priority is 80. - /// - public int Priority - { - get { return priority; } - set { priority=value; } - } - - /// - /// Overriding the Test() method is the point of a Condition. - /// The game will call your Test() function, and take action if it returns true. - /// This is valid for both and - /// - ///

- /// You may not take any actions inside of Test(). - ///

- public virtual bool Test() - { - if (test != null) - { - return test(this); - } - throw new NotImplementedException("You should inherit from Condition class and override Test() method or pass delegate into constructor"); - } - } - - /// - /// Method signature for Test method of - /// - public delegate bool ConditionTest(Condition condition); -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/CustomEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/CustomEvent.cs deleted file mode 100644 index 7a3ec36..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/CustomEvent.cs +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.peer; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to - /// when a custom condition is met. Be sure to reset or remove the custom condition to avoid - /// having it recurring repeatedly (see the example for the method. - /// - /// - [Serializable] - public class CustomEvent : Event - { - private const int DEFAULT_PRIORITY = 80; - - private readonly Condition condition; - - /// - /// Called by the game to create a new CustomEvent when a condition is met. - /// - public CustomEvent(Condition condition) - { - this.condition = condition; - if (condition != null) - { - Priority = condition.Priority; - } - } - - /// - /// Called by the game to create a new CustomEvent when a condition is met. - /// The event will have the given priority. - /// An event priority is a value from 0 - 99. The higher value, the higher - /// priority. The default priority is 80. - ///

- /// This is equivalent to calling on the - /// Condition. - ///

- /// The condition that must be met - /// The priority of the condition - public CustomEvent(Condition condition, int priority) - { - this.condition = condition; - Priority = priority; - if (condition != null) - { - condition.Priority = priority; - } - } - - /// - /// Returns the condition that fired, causing this event to be generated. - /// Use this to determine which condition fired, and to remove the custom event. - /// - /// - /// public void OnCustomEvent(CustomEvent evnt) - /// { - /// if (event.Condition.Name == "mycondition") - /// { - /// RemoveCustomEvent(event.Condition); - /// // do something else - /// } - /// } - /// - /// - /// - public Condition Condition - { - get { return condition; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override sealed void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsAdvancedRobot()) - { - IAdvancedEvents listener = ((IAdvancedRobot) robot).GetAdvancedEventListener(); - - if (listener != null) - { - listener.OnCustomEvent(this); - } - } - } - - // sealed to disable overrides - public override sealed int CompareTo(Event evnt) - { - return base.CompareTo(evnt); - } - - // sealed to disable overrides - internal override bool IsCriticalEvent - { - get { return false; } - } - - // sealed to disable overrides - public sealed override int Priority - { - get { return base.Priority; } - } - - internal override byte SerializationType - { - get { throw new System.Exception("Serialization not supported on this event type"); } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/DeathEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/DeathEvent.cs deleted file mode 100644 index 7c02457..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/DeathEvent.cs +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to when your robot dies. - /// - [Serializable] - public sealed class DeathEvent : Event - { - private const int DEFAULT_PRIORITY = -1; // System event -> cannot be changed!; - - /// - public override int Priority - { - get { return DEFAULT_PRIORITY; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnDeath(this); - } - } - - internal override bool IsCriticalEvent - { - get { return true; } - } - - internal override byte SerializationType - { - get { return RbSerializerN.DeathEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - return new DeathEvent(); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Event.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Event.cs deleted file mode 100644 index b09b84b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Event.cs +++ /dev/null @@ -1,279 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using net.sf.robocode.io; -using net.sf.robocode.peer; -using net.sf.robocode.security; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// The superclass of all Robocode events. - /// - [Serializable] - public abstract class Event : IComparable - { - private const int DEFAULT_PRIORITY = 80; - - private long time; - private int priority; - - // time is valid only after adding to event manager on proxy side, we do not update it on battle side - private volatile bool addedToQueue; - - /// - /// Compares this event to another event regarding precedence. - /// - /// The event precedence is first and foremost determined by the event time, - /// secondly the event priority, and lastly specific event information. - /// - /// This method will first compare the time of each event. If the event time - /// is the same for both events, then this method compared the priority of - /// each event. If the event priorities are equals, then this method will - /// compare the two events based on specific event information. - /// - /// This method is called by the game in order to sort the event queue of a - /// robot to make sure the events are listed in chronological order. - /// - /// - /// the event to compare to this event. - /// - /// Returns a negative value if this event has higher precedence, i.e. must - /// be listed before the specified event. A positive value if this event - /// has a lower precedence, i.e. must be listed after the specified event. - /// 0 means that the precedence of the two events are equal. - /// - public virtual int CompareTo(Event evnt) - { - // Compare the time difference which has precedence over priority. - var timeDiff = (int) (time - evnt.time); - - if (timeDiff != 0) - { - return timeDiff; // Time differ - } - - // Same time -> Compare the difference in priority - int priorityDiff = evnt.Priority - Priority; - - if (priorityDiff != 0) - { - return priorityDiff; // Priority differ - } - - // Same time and priority -> Compare specific event types - // look at overrides in ScannedRobotEvent and HitRobotEvent - - // No difference found - return 0; - } - - /// - /// The time when this event occurred. - /// - /// - /// Note that the time is equal to the turn of a battle round. - /// - /// This method is intended for letting robot developers create their own event types. - /// It is not possible to change the time of an event after it has been added to the event - /// queue of the robot. - /// - public long Time - { - get { return time; } - set - { - if (addedToQueue) - { - LoggerN.WriteLineToRobotsConsole("SYSTEM: The time of an event cannot be changed after it has been added the event queue."); - } - else - { - time = value; - } - } - } - - /// - /// The priority of this event. - /// - /// An event priority is a value from 0 - 99. The higher value, the higher priority. - /// - /// The default priority is 80, but varies depending on the type of event. - /// - /// - /// This method is intended for letting robot developers create their own event types. - /// - /// It is not possible to change the priority of an event after it has been added to the event - /// queue of the robot. - /// - /// - public virtual int Priority - { - get { return priority; } - set - { - if (addedToQueue) - { - LoggerN.WriteLineToRobotsConsole("SYSTEM: The priority of an event cannot be changed after it has been added the event queue."); - } - else - { - SetPriorityHidden(value); - } - } - } - - /// - /// Hidden method for setting the exact time when this event occurred. - /// - /// - /// This method is called by the game engine only. - /// - /// the time when this event occurred. - // This method must be invisible on Robot API - private void SetTimeHidden(long time) - { - // we do not replace time which is set by robot to the future - if (this.time < time) - { - this.time = time; - } - // when this flag is set, robots are not allowed to change the time or priority of the event anymore - addedToQueue = true; - } - - /// - /// Hidden method for setting the priority from the game engine without checking for the 'addedToQueue' flag. - /// - /// - /// This method is called by the game engine only. - /// - /// the new priority of this event. - // This method must be invisible on Robot API - private void SetPriorityHidden(int newPriority) - { - if (newPriority < 0) - { - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority must be between 0 and 99"); - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority for " + GetType().Name + " will be 0"); - newPriority = 0; - } - else if (newPriority > 99) - { - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority must be between 0 and 99"); - LoggerN.WriteLineToRobotsConsole("SYSTEM: Priority for " + GetType().Name + " will be 99"); - newPriority = 99; - } - priority = newPriority; - } - - /// - /// Dispatch this event for a robot, it's statistics, and graphics context. - /// - /// the robot to dispatch to. - /// the robot to statistics to. - /// the robot to graphics to. - // This method must be invisible on Robot API - internal virtual void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - } - - /// - /// The default priority of this event class. - /// - // This method must be invisible on Robot API - internal virtual int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - /// - /// Checks if this event must be delivered even after timeout. - /// - /// - /// true when this event must be delivered even after timeout; - /// false otherwise. - /// - // This method must be invisible on Robot API - internal virtual bool IsCriticalEvent - { - get { return false; } - } - - // This method must be invisible on Robot API - internal virtual byte SerializationType - { - get { throw new System.Exception("Serialization not supported on this event type"); } - } - - // Needed for .NET version - // This method must be invisible on Robot API - internal virtual void UpdateBullets(Dictionary bullets) - { - } - - /// - /// Returns a hidden event helper for accessing hidden methods on this object. - /// - // This method must be invisible on Robot API - private static IHiddenEventHelper createHiddenHelper() - { - return new HiddenEventHelper(); - } - - /// - /// Hidden event helper implementation for accessing the internal methods of an event. - /// - /// - /// This class is used internally by the game engine. - /// - // This method must be invisible on Robot API - private class HiddenEventHelper : IHiddenEventHelper - { - public void SetTime(Event evnt, long newTime) - { - evnt.SetTimeHidden(newTime); - } - - public void SetDefaultPriority(Event evnt) - { - evnt.Priority = evnt.DefaultPriority; - } - - public void SetPriority(Event evnt, int newPriority) - { - evnt.SetPriorityHidden(newPriority); - } - - public bool IsCriticalEvent(Event evnt) - { - return evnt.IsCriticalEvent; - } - - public void Dispatch(Event evnt, IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - evnt.Dispatch(robot, statics, graphics); - } - - public byte GetSerializationType(Event evnt) - { - return evnt.SerializationType; - } - - // Needed for .NET version - public void UpdateBullets(Event evnt, Dictionary bullets) - { - evnt.UpdateBullets(bullets); - } - } - } -} -//doc diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/GunTurnCompleteCondition.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/GunTurnCompleteCondition.cs deleted file mode 100644 index e6f7fe0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/GunTurnCompleteCondition.cs +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode -{ - /// - /// A prebuilt condition you can use that indicates your gun has finished turning. - /// - /// - public class GunTurnCompleteCondition : Condition - { - private readonly AdvancedRobot robot; - - /// - /// Creates a new GunTurnCompleteCondition with default priority. - /// The default priority is 80. - /// - /// Your robot, which must be an - public GunTurnCompleteCondition(AdvancedRobot robot) - { - this.robot = robot; - } - - /// - /// Creates a new GunTurnCompleteCondition with a specific priority. - /// A condition priority is a value from 0 - 99. The higher value, the - /// higher priority. The default priority is 80. - /// - /// - /// Your robot, which must be an - /// The priority of this condition - public GunTurnCompleteCondition(AdvancedRobot robot, int priority) - { - this.robot = robot; - this.priority = priority; - } - - /// - /// Tests if the gun has stopped turning. - /// Returns true if the gun has stopped turning - /// - public override bool Test() - { - return (robot.GunTurnRemaining == 0); - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitByBulletEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitByBulletEvent.cs deleted file mode 100644 index 394eff0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitByBulletEvent.cs +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A HitByBulletEvent is sent to - /// when your robot has been hit by a bullet. - /// You can use the information contained in this event to determine what to do. - /// - [Serializable] - public sealed class HitByBulletEvent : Event - { - private const int DEFAULT_PRIORITY = 20; - - private readonly double bearing; - private readonly Bullet bullet; - - /// - /// Called by the game to create a new HitByBulletEvent. - /// - public HitByBulletEvent(double bearing, Bullet bullet) - { - this.bearing = bearing; - this.bullet = bullet; - } - - /// - /// Returns the bearing to the bullet, relative to your robot's heading, - /// in degrees (-180 < getBearing() <= 180). - ///

- /// If you were to TurnRight(event.Bearing), you would be facing the - /// direction the bullet came from. The calculation used here is: - /// (bullet's heading in degrees + 180) - (your heading in degrees) - ///

- public double Bearing - { - get { return bearing*180.0/Math.PI; } - } - - /// - /// Returns the bearing to the bullet, relative to your robot's heading, - /// in radians (-Math.PI < getBearingRadians() <= Math.PI). - ///

- /// If you were to TurnRightRadians(event.BearingRadians), you would be - /// facing the direction the bullet came from. The calculation used here is: - /// (bullet's heading in radians + Math.PI) - (your heading in radians) - ///

- public double BearingRadians - { - get { return bearing; } - } - - /// - /// Returns the bullet that hit your robot. - /// - public Bullet Bullet - { - get { return bullet; } - } - - /// - /// Returns the heading of the bullet when it hit you, in degrees - /// (0 <= getHeading() < 360). - ///

- /// Note: This is not relative to the direction you are facing. The robot - /// that fired the bullet was in the opposite direction of getHeading() when - /// it fired the bullet. - ///

- public double Heading - { - get { return bullet.Heading; } - } - - /// - /// Returns the heading of the bullet when it hit you, in radians - /// (0 <= getHeadingRadians() < 2 * PI). - ///

- /// Note: This is not relative to the direction you are facing. The robot - /// that fired the bullet was in the opposite direction of - /// getHeadingRadians() when it fired the bullet. - ///

- public double HeadingRadians - { - get { return bullet.HeadingRadians; } - } - - /// - /// Returns the name of the robot that fired the bullet. - /// - public string Name - { - get { return bullet.Name; } - } - - /// - /// Returns the power of this bullet. The damage you take (in fact, already - /// took) is 4 * power, plus 2 * (power-1) if power > 1. The robot that fired - /// the bullet receives 3 * power back. - /// - public double Power - { - get { return bullet.Power; } - } - - /// - /// Returns the velocity of this bullet. - /// - public double Velocity - { - get { return bullet.Velocity; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnHitByBullet(this); - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.HitByBulletEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (HitByBulletEvent) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + serializer.sizeOf(RbSerializerN.Bullet_TYPE, obj.bullet) - + RbSerializerN.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (HitByBulletEvent) objec; - - serializer.serialize(buffer, RbSerializerN.Bullet_TYPE, obj.bullet); - serializer.serialize(buffer, obj.bearing); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - var bullet = (Bullet) serializer.deserializeAny(buffer); - double bearing = buffer.getDouble(); - - return new HitByBulletEvent(bearing, bullet); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitRobotEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitRobotEvent.cs deleted file mode 100644 index 675b933..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitRobotEvent.cs +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A HitRobotEvent is sent to - /// when your robot collides with another robot. - /// You can use the information contained in this event to determine what to do. - /// - [Serializable] - public sealed class HitRobotEvent : Event - { - private const int DEFAULT_PRIORITY = 40; - - private readonly string name; - private readonly double bearing; - private readonly double energy; - private readonly bool atFault; - - /// - /// Called by the game to create a new HitRobotEvent. - /// - public HitRobotEvent(string name, double bearing, double energy, bool atFault) - { - this.name = name; - this.bearing = bearing; - this.energy = energy; - this.atFault = atFault; - } - - /// - /// Returns the bearing to the robot you hit, relative to your robot's - /// heading, in degrees (-180 <= getBearing() < 180) - /// - public double Bearing - { - get { return bearing*180.0/Math.PI; } - } - - /// - /// Returns the bearing to the robot you hit, relative to your robot's - /// heading, in radians (-PI <= getBearingRadians() < PI) - /// - public double BearingRadians - { - get { return bearing; } - } - - /// - /// Returns the amount of energy of the robot you hit. - /// - public double Energy - { - get { return energy; } - } - - /// - /// Returns the name of the robot you hit. - /// - public string Name - { - get { return name; } - } - - /// - /// Checks if your robot was moving towards the robot that was hit. - ///

- /// If returns true then your robot's movement (including - /// turning) will have stopped and been marked complete. - ///

- /// Note: If two robots are moving toward each other and collide, they will - /// each receive two HitRobotEvents. The first will be the one if isMyFault() - /// returns true. - ///

- public bool IsMyFault - { - get { return atFault; } - } - - /// - public override int CompareTo(Event evnt) - { - int res = base.CompareTo(evnt); - - if (res != 0) - { - return res; - } - - // Compare the IsMyFault, if the events are HitRobotEvents - // The isMyFault has higher priority when it is set compared to when it is not set - if (evnt is HitRobotEvent) - { - int compare1 = (this).IsMyFault ? -1 : 0; - int compare2 = ((HitRobotEvent) evnt).IsMyFault ? -1 : 0; - - return compare1 - compare2; - } - - // No difference found - return 0; - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnHitRobot(this); - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.HitRobotEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (HitRobotEvent) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + serializer.sizeOf(obj.name) + 2*RbSerializerN.SIZEOF_DOUBLE - + RbSerializerN.SIZEOF_BOOL; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (HitRobotEvent) objec; - - serializer.serialize(buffer, obj.name); - serializer.serialize(buffer, obj.bearing); - serializer.serialize(buffer, obj.energy); - serializer.serialize(buffer, obj.atFault); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - string robotName = serializer.deserializeString(buffer); - double bearing = buffer.getDouble(); - double energy = buffer.getDouble(); - bool atFault = serializer.deserializeBoolean(buffer); - - return new HitRobotEvent(robotName, bearing, energy, atFault); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitWallEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitWallEvent.cs deleted file mode 100644 index 1b73982..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/HitWallEvent.cs +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A HitWallEvent is sent to - /// when you collide a wall. - /// You can use the information contained in this event to determine what to do. - /// - [Serializable] - public sealed class HitWallEvent : Event - { - private const int DEFAULT_PRIORITY = 30; - - private readonly double bearing; - - /// - /// Called by the game to create a new HitWallEvent. - /// - public HitWallEvent(double bearing) - { - this.bearing = bearing; - } - - /// - /// Returns the bearing to the wall you hit, relative to your robot's - /// heading, in degrees (-180 <= getBearing() < 180) - /// - public double Bearing - { - get { return bearing*180.0/Math.PI; } - } - - - /// - /// Returns the bearing to the wall you hit, relative to your robot's - /// heading, in radians (-PI <= getBearingRadians() < PI) - /// - public double BearingRadians - { - get { return bearing; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnHitWall(this); - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.HitWallEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (HitWallEvent) objec; - - serializer.serialize(buffer, obj.bearing); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - double bearing = buffer.getDouble(); - - return new HitWallEvent(bearing); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IBorderSentry.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IBorderSentry.cs deleted file mode 100644 index ea60f9c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IBorderSentry.cs +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode -{ - /// - /// A robot that implement IBorderSentry is a robot type used for keeping other robots away from the borders, - /// i.e. guarding the borders in order to prevent "wall crawlers".
- /// Robots that implement IBorderSentry have 400 extra life/energy (500 in total), but is placed at the border - /// of the battlefield when the game is started.
- /// Border sentry robots cannot move away from the border area, and they can only make damage to robots that - /// are moving into the border area. The size of the border area is determined by the - /// battle rules.
- /// This type of robot is intended for use in battles where robots should be forced away from the borders in - /// order to prevent "wall crawlers".
- /// Border sentry robots does not get scores, and will not occur in the battle results or rankings. - ///
- /// - /// - /// - /// - /// - /// - /// - public interface IBorderSentry - { - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IDroid.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IDroid.cs deleted file mode 100644 index 4c682b3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IDroid.cs +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode -{ - /// - /// Robots that implement IDroid have no scanner, but an extra 20 life/energy. - /// This class is intended for use in teams. - /// - /// - /// - /// - /// - /// - /// - public interface IDroid - { - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IGraphics.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IGraphics.cs deleted file mode 100644 index e92c808..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/IGraphics.cs +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; - -namespace Robocode -{ - /// - /// - /// - public interface IGraphics - { -#pragma warning disable 1591 - //TODO xml doc - void DrawLine(Pen pen, float x1, float y1, float x2, float y2); - void DrawLine(Pen pen, PointF pt1, PointF pt2); - void DrawLine(Pen pen, int x1, int y1, int x2, int y2); - void DrawLine(Pen pen, Point pt1, Point pt2); - void DrawArc(Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle); - void DrawArc(Pen pen, RectangleF rect, float startAngle, float sweepAngle); - void DrawArc(Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle); - void DrawArc(Pen pen, Rectangle rect, float startAngle, float sweepAngle); - void DrawRectangle(Pen pen, RectangleF rect); - void DrawRectangle(Pen pen, Rectangle rect); - void DrawRectangle(Pen pen, float x, float y, float width, float height); - void DrawRectangle(Pen pen, int x, int y, int width, int height); - void DrawEllipse(Pen pen, RectangleF rect); - void DrawEllipse(Pen pen, float x, float y, float width, float height); - void DrawEllipse(Pen pen, Rectangle rect); - void DrawEllipse(Pen pen, int x, int y, int width, int height); - void DrawPie(Pen pen, RectangleF rect, float startAngle, float sweepAngle); - void DrawPie(Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle); - void DrawPie(Pen pen, Rectangle rect, float startAngle, float sweepAngle); - void DrawPie(Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle); - void DrawPolygon(Pen pen, PointF[] points); - void DrawPolygon(Pen pen, Point[] points); - void FillRectangle(Brush brush, RectangleF rect); - void FillRectangle(Brush brush, float x, float y, float width, float height); - void FillRectangle(Brush brush, Rectangle rect); - void FillRectangle(Brush brush, int x, int y, int width, int height); - void FillPolygon(Brush brush, PointF[] points); - void FillPolygon(Brush brush, Point[] points); - void FillEllipse(Brush brush, RectangleF rect); - void FillEllipse(Brush brush, float x, float y, float width, float height); - void FillEllipse(Brush brush, Rectangle rect); - void FillEllipse(Brush brush, int x, int y, int width, int height); - void FillPie(Brush brush, Rectangle rect, float startAngle, float sweepAngle); - void FillPie(Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle); - void FillPie(Brush brush, int x, int y, int width, int height, int startAngle, int sweepAngle); - void DrawString(string s, Font font, Brush brush, int x, int y); - void DrawString(string s, Font font, Brush brush, float x, float y); - void DrawString(string s, Font font, Brush brush, PointF point); - void DrawString(string s, Font font, Brush brush, Point point); - - /* - void DrawLines(Pen pen, PointF[] points); - void DrawLines(Pen pen, Point[] points); - void DrawRectangles(Pen pen, RectangleF[] rects); - void DrawRectangles(Pen pen, Rectangle[] rects); - void DrawPath(Pen pen, GraphicsPath path); - void DrawCurve(Pen pen, PointF[] points); - void DrawCurve(Pen pen, PointF[] points, float tension); - void DrawCurve(Pen pen, PointF[] points, int offset, int numberOfSegments); - void DrawCurve(Pen pen, PointF[] points, int offset, int numberOfSegments, float tension); - void DrawCurve(Pen pen, Point[] points); - void DrawCurve(Pen pen, Point[] points, float tension); - void DrawCurve(Pen pen, Point[] points, int offset, int numberOfSegments, float tension); - void DrawClosedCurve(Pen pen, PointF[] points); - void DrawClosedCurve(Pen pen, PointF[] points, float tension, FillMode fillmode); - void DrawClosedCurve(Pen pen, Point[] points); - void DrawClosedCurve(Pen pen, Point[] points, float tension, FillMode fillmode); - void FillPolygon(Brush brush, PointF[] points, FillMode fillMode); - void FillPolygon(Brush brush, Point[] points, FillMode fillMode); - void FillRectangles(Brush brush, RectangleF[] rects); - void FillRectangles(Brush brush, Rectangle[] rects); - void FillClosedCurve(Brush brush, PointF[] points); - void FillClosedCurve(Brush brush, PointF[] points, FillMode fillmode); - void FillClosedCurve(Brush brush, PointF[] points, FillMode fillmode, float tension); - void FillClosedCurve(Brush brush, Point[] points); - void FillClosedCurve(Brush brush, Point[] points, FillMode fillmode); - void FillClosedCurve(Brush brush, Point[] points, FillMode fillmode, float tension); - void FillRegion(Brush brush, Region region); - void FillPath(Brush brush, GraphicsPath path); - void DrawString(string s, Font font, Brush brush, float x, float y, StringFormat format); - void DrawString(string s, Font font, Brush brush, PointF point, StringFormat format); - void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle); - void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format); - - SizeF MeasureString(string text, Font font, SizeF layoutArea, StringFormat stringFormat, - out int charactersFitted, out int linesFilled); - - SizeF MeasureString(string text, Font font, PointF origin, StringFormat stringFormat); - SizeF MeasureString(string text, Font font, SizeF layoutArea); - SizeF MeasureString(string text, Font font, SizeF layoutArea, StringFormat stringFormat); - SizeF MeasureString(string text, Font font); - SizeF MeasureString(string text, Font font, int width); - SizeF MeasureString(string text, Font font, int width, StringFormat format); - Region[] MeasureCharacterRanges(string text, Font font, RectangleF layoutRect, StringFormat stringFormat); - - void ResetTransform(); - void MultiplyTransform(Matrix matrix); - void MultiplyTransform(Matrix matrix, MatrixOrder order); - void TranslateTransform(float dx, float dy); - void TranslateTransform(float dx, float dy, MatrixOrder order); - void ScaleTransform(float sx, float sy); - void ScaleTransform(float sx, float sy, MatrixOrder order); - void RotateTransform(float angle); - void RotateTransform(float angle, MatrixOrder order); - void TransformPoints(CoordinateSpace destSpace, CoordinateSpace srcSpace, PointF[] pts); - void TransformPoints(CoordinateSpace destSpace, CoordinateSpace srcSpace, Point[] pts); - void SetClip(Graphics g); - void SetClip(Graphics g, CombineMode combineMode); - void SetClip(Rectangle rect); - void SetClip(Rectangle rect, CombineMode combineMode); - void SetClip(RectangleF rect); - void SetClip(RectangleF rect, CombineMode combineMode); - void SetClip(GraphicsPath path); - void SetClip(GraphicsPath path, CombineMode combineMode); - void SetClip(Region region, CombineMode combineMode); - void IntersectClip(Rectangle rect); - void IntersectClip(RectangleF rect); - void IntersectClip(Region region); - void ExcludeClip(Rectangle rect); - void ExcludeClip(Region region); - void ResetClip(); - void TranslateClip(float dx, float dy); - void TranslateClip(int dx, int dy); - bool IsVisible(int x, int y); - bool IsVisible(Point point); - bool IsVisible(float x, float y); - bool IsVisible(PointF point); - bool IsVisible(int x, int y, int width, int height); - bool IsVisible(Rectangle rect); - bool IsVisible(float x, float y, float width, float height); - bool IsVisible(RectangleF rect); - CompositingMode CompositingMode { get; set; } - Point RenderingOrigin { get; set; } - CompositingQuality CompositingQuality { get; set; } - TextRenderingHint TextRenderingHint { get; set; } - int TextContrast { get; set; } - SmoothingMode SmoothingMode { get; set; } - PixelOffsetMode PixelOffsetMode { get; set; } - InterpolationMode InterpolationMode { get; set; } - Matrix Transform { get; set; } - GraphicsUnit PageUnit { get; set; } - float PageScale { get; set; } - float DpiX { get; } - float DpiY { get; } - Region Clip { get; set; } - RectangleF ClipBounds { get; } - bool IsClipEmpty { get; } - RectangleF VisibleClipBounds { get; } - bool IsVisibleClipEmpty { get; } - */ - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/JuniorRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/JuniorRobot.cs deleted file mode 100644 index 0ea5d59..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/JuniorRobot.cs +++ /dev/null @@ -1,1324 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using System.IO; -using Robocode.Exception; -using Robocode.RobotInterfaces; -using Robocode.RobotInterfaces.Peer; -using Robocode.Util; - -namespace Robocode -{ - /// - /// This is the simplest robot type, which is simpler than the and - /// classes. The JuniorRobot has a simplified model, in - /// purpose of teaching programming skills to inexperienced in programming - /// students. The simplified robot model will keep player from overwhelming of - /// Robocode's rules, programming syntax and programming concept. - ///

- /// Instead of using getters and setters, public fields are provided for - /// receiving information like the last scanned robot, the coordinate of the - /// robot etc. - ///

- /// All methods on this class are blocking calls, i.e. they do not return before - /// their action has been completed and will at least take one turn to execute. - /// However, setting colors is executed immediately and does not cost a turn to - /// perform. - /// - /// - /// - /// - ///

- public abstract class JuniorRobot : IJuniorRobot - { - internal IBasicRobotPeer peer; - internal TextWriter _output; - - /// - /// The color black (0x000000) - /// - public const int BLACK=0; - - /// - /// The color white (0xFFFFFF) - /// - public const int WHITE = 0xFFFFFF; - - /// - /// The color red (0xFF0000) - /// - public const int RED = 0xFF0000; - - /// - /// The color orange (0xFFA500) - /// - public const int ORANGE = 0xFFA500; - - /// - /// The color yellow (0xFFFF00) - /// - public const int YELLOW = 0xFFFF00; - - /// - /// The color green (0x008000) - /// - public const int GREEN = 0x008000; - - /// - /// The color blue (0x0000FF) - /// - public const int BLUE = 0x0000FF; - - /// - /// The color purple (0x800080) - /// - public const int PURPLE = 0x800080; - - /// - /// The color brown (0x8B4513) - /// - public const int BROWN = 0x8B4513; - - /// - /// The color gray (0x808080) - /// - public const int GRAY = 0x808080; - - /// - /// Contains the width of the battlefield. - /// - /// - /// - private int fieldWidth; - - /// - /// Contains the height of the battlefield. - /// - /// - /// - private int fieldHeight; - - /// - /// Current number of other robots on the battle field. - /// - private int others; - - /// - /// Current energy of this robot, where 100 means full energy and 0 means no energy (dead). - /// - private int energy; - - /// - /// Current horizontal location of this robot (in pixels). - /// - /// - /// - private int robotX; - - /// - /// Current vertical location of this robot (in pixels). - /// - /// - /// - private int robotY; - - /// - /// Current heading angle of this robot (in degrees). - /// - /// - /// - /// - /// - /// - /// - /// - /// - private int heading; - - /// - /// Current gun heading angle of this robot (in degrees). - /// - /// - /// - /// - /// - /// - /// - private int gunHeading; - - /// - /// Current gun heading angle of this robot compared to its body (in degrees). - /// - /// - /// - /// - /// - /// - /// - private int gunBearing; - - /// - /// Flag specifying if the gun is ready to Fire, i.e. gun heat <= 0. - /// true means that the gun is able to Fire; false - /// means that the gun cannot Fire yet as it still needs to cool down. - /// - /// - /// - /// - private bool gunReady; - - /// - /// Current distance to the scanned nearest other robot (in pixels). - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - private int scannedDistance = -1; - - /// - /// Current angle to the scanned nearest other robot (in degrees). - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - private int scannedAngle = -1; - - /// - /// Current angle to the scanned nearest other robot (in degrees) compared to - /// the body of this robot. - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - private int scannedBearing = -1; - - /// - /// Current velocity of the scanned nearest other robot. - /// If there is no robot in the radar's sight, this field will be -99. - /// Note that a positive value means that the robot moves forward, a negative - /// value means that the robot moved backward, and 0 means that the robot is - /// not moving at all. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - private int scannedVelocity = -99; - - /// - /// Current heading of the scanned nearest other robot (in degrees). - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - private int scannedHeading = -1; - - /// - /// Current energy of scanned nearest other robot. - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - private int scannedEnergy = -1; - - /// - /// Latest angle from where this robot was hit by a bullet (in degrees). - /// If the robot has never been hit, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - private int hitByBulletAngle = -1; - - /// - /// Latest angle from where this robot was hit by a bullet (in degrees) - /// compared to the body of this robot. - /// If the robot has never been hit, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - private int hitByBulletBearing = -1; - - /// - /// Latest angle where this robot has hit another robot (in degrees). - /// If this robot has never hit another robot, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - private int hitRobotAngle = -1; - - /// - /// Latest angle where this robot has hit another robot (in degrees) - /// compared to the body of this robot. - /// If this robot has never hit another robot, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - private int hitRobotBearing = -1; - - /// - /// Latest angle where this robot has hit a wall (in degrees). - /// If this robot has never hit a wall, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - private int hitWallAngle = -1; - - /// - /// Latest angle where this robot has hit a wall (in degrees) - /// compared to the body of this robot. - /// If this robot has never hit a wall, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - private int hitWallBearing = -1; - - /// - /// The robot event handler for this robot. - /// - private InnerEventHandler innerEventHandler; - - - /// - /// The Out stream your robot should use to print. - ///

- /// You can view the print-outs by clicking the button for your robot in the - /// right side of the battle window. - ///

- /// - /// - /// // Print Out a line each time my robot hits another robot - /// public void OnHitRobot(HitRobotEvent e) - /// { - /// Out.WriteLine("I hit a robot! My energy: " + Energy + " his energy: " + e.Energy); - /// } - /// - /// - ///

- public TextWriter Out - { - get { return _output; } - } - - /// - /// Contains the width of the battlefield. - /// - /// - /// - public int FieldWidth - { - get { return fieldWidth; } - } - - /// - /// Contains the height of the battlefield. - /// - /// - /// - public int FieldHeight - { - get { return fieldHeight; } - } - - /// - /// Current number of other robots on the battle field. - /// - public int Others - { - get { return others; } - } - - /// - /// Current energy of this robot, where 100 means full energy and 0 means no energy (dead). - /// - public int Energy - { - get { return energy; } - } - - /// - /// Current horizontal location of this robot (in pixels). - /// - /// - /// - public int RobotX - { - get { return robotX; } - } - - /// - /// Current vertical location of this robot (in pixels). - /// - /// - /// - public int RobotY - { - get { return robotY; } - } - - /// - /// Current heading angle of this robot (in degrees). - /// - /// - /// - /// - /// - /// - /// - /// - /// - public int Heading - { - get { return heading; } - } - - /// - /// Current gun heading angle of this robot (in degrees). - /// - /// - /// - /// - /// - /// - /// - public int GunHeading - { - get { return gunHeading; } - } - - /// - /// Current gun heading angle of this robot compared to its body (in degrees). - /// - /// - /// - /// - /// - /// - /// - public int GunBearing - { - get { return gunBearing; } - } - - /// - /// Flag specifying if the gun is ready to Fire, i.e. gun heat <= 0. - /// true means that the gun is able to Fire; false - /// means that the gun cannot Fire yet as it still needs to cool down. - /// - /// - /// - /// - public bool IsGunReady - { - get { return gunReady; } - } - - /// - /// Current distance to the scanned nearest other robot (in pixels). - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - public int ScannedDistance - { - get { return scannedDistance; } - } - - /// - /// Current angle to the scanned nearest other robot (in degrees). - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - public int ScannedAngle - { - get { return scannedAngle; } - } - - /// - /// Current angle to the scanned nearest other robot (in degrees) compared to - /// the body of this robot. - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - public int ScannedBearing - { - get { return scannedBearing; } - } - - /// - /// Current velocity of the scanned nearest other robot. - /// If there is no robot in the radar's sight, this field will be -99. - /// Note that a positive value means that the robot moves forward, a negative - /// value means that the robot moved backward, and 0 means that the robot is - /// not moving at all. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - public int ScannedVelocity - { - get { return scannedVelocity; } - } - - /// - /// Current heading of the scanned nearest other robot (in degrees). - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - /// - public int ScannedHeading - { - get { return scannedHeading; } - } - - /// - /// Current energy of scanned nearest other robot. - /// If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - /// - /// - /// - public int ScannedEnergy - { - get { return scannedEnergy; } - } - - /// - /// Latest angle from where this robot was hit by a bullet (in degrees). - /// If the robot has never been hit, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - public int HitByBulletAngle - { - get { return hitByBulletAngle; } - } - - /// - /// Latest angle from where this robot was hit by a bullet (in degrees) - /// compared to the body of this robot. - /// If the robot has never been hit, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - public int HitByBulletBearing - { - get { return hitByBulletBearing; } - } - - /// - /// Latest angle where this robot has hit another robot (in degrees). - /// If this robot has never hit another robot, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - public int HitRobotAngle - { - get { return hitRobotAngle; } - } - - /// - /// Latest angle where this robot has hit another robot (in degrees) - /// compared to the body of this robot. - /// If this robot has never hit another robot, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - public int HitRobotBearing - { - get { return hitRobotBearing; } - } - - /// - /// Latest angle where this robot has hit a wall (in degrees). - /// If this robot has never hit a wall, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - public int HitWallAngle - { - get { return hitWallAngle; } - } - - /// - /// Latest angle where this robot has hit a wall (in degrees) - /// compared to the body of this robot. - /// If this robot has never hit a wall, this field will be less than 0, i.e. -1. - /// This field will not be updated while event is active. - /// - /// - /// - /// - public int HitWallBearing - { - get { return hitWallBearing; } - } - - /// - void IBasicRobot.SetOut(TextWriter outpt) - { - _output = outpt; - } - - /// - void IBasicRobot.SetPeer(IBasicRobotPeer per) - { - peer = per; - } - - /// - /// Throws a RobotException. This method should be called when the robot's peer - /// is uninitialized. - /// - internal static void UninitializedException() - { - throw new RobotException( - "You cannot call the methods before your Run() method is called, or you are using a Robot object that the game doesn't know about."); - } - - /// - IRunnable IBasicRobot.GetRobotRunnable() - { - return getEventHandler(); - } - - /// - IBasicEvents IBasicRobot.GetBasicEventListener() - { - return getEventHandler(); - } - - - /// - /// Moves this robot forward by pixels. - /// - /// - /// - /// - /// The amount of pixels to move forward - public void Ahead(int distance) - { - if (peer != null) - { - peer.Move(distance); - } - else - { - UninitializedException(); - } - } - - /// - /// Moves this robot backward by pixels. - /// - /// - /// - /// - /// - /// the amount of pixels to move backward - public void Back(int distance) - { - Ahead(-distance); - } - - /// - /// Turns the gun to the specified angle (in degrees) relative to body of this robot. - /// The gun will turn to the side with the shortest delta angle to the specified angle. - /// - /// - /// - /// - /// - /// - /// the angle to turn the gun to relative to the body of this robot - public void BearGunTo(int angle) - { - if (peer != null) - { - peer.TurnGun( - Utils.NormalRelativeAngle(peer.GetBodyHeading() + Utils.ToRadians(angle) - peer.GetGunHeading())); - } - else - { - UninitializedException(); - } - } - - /// - /// Skips a turn. - /// - /// - public void DoNothing() - { - if (peer != null) - { - peer.Execute(); - } - else - { - UninitializedException(); - } - } - - /// - /// Skips the specified number of turns. - /// - /// - /// The number of turns to skip - public void DoNothing(int turns) - { - if (turns <= 0) - { - return; - } - if (peer != null) - { - for (int i = 0; i < turns; i++) - { - peer.Execute(); - } - } - else - { - UninitializedException(); - } - } - - /// - /// Fires a bullet with the default power of 1. - /// If the gun heat is more than 0 and hence cannot Fire, this method will - /// suspend until the gun is ready to Fire, and then Fire a bullet. - /// - /// - /// - public void Fire() - { - Fire(1); - } - - /// - /// Fires a bullet with the specified bullet power, which is between 0.1 and 3 - /// where 3 is the maximum bullet power. - /// If the gun heat is more than 0 and hence cannot Fire, this method will - /// suspend until the gun is ready to Fire, and then Fire a bullet. - /// - /// - /// Between 0.1 and 3 - public void Fire(double power) - { - if (peer != null) - { - getEventHandler().juniorFirePower = power; - peer.Execute(); - } - else - { - UninitializedException(); - } - } - - /// - /// This event method is called from the game when this robot has been hit - /// by another robot's bullet. When this event occurs the - /// and fields values - /// are automatically updated. - /// - /// - /// - /// - public virtual void OnHitByBullet() - { - } - - /// - /// This event method is called from the game when a bullet from this robot - /// has hit another robot. When this event occurs the - /// and fields values are automatically updated. - /// - /// - /// - /// - public virtual void OnHitRobot() - { - } - - /// - /// This event method is called from the game when this robot has hit a wall. - /// When this event occurs the and - /// fields values are automatically updated. - /// - /// - /// - /// - public virtual void OnHitWall() - { - } - - /// - /// This event method is called from the game when the radar detects another - /// robot. When this event occurs the , - /// , , and - /// field values are automatically updated. - /// - /// - /// - /// - /// - public virtual void OnScannedRobot() - { - } - - /// - /// The main method in every robot. You must override this to set up your - /// robot's basic behavior. - ///

- /// - /// - /// // A basic robot that moves around in a square - /// public void Run() - /// { - /// Ahead(100); - /// TurnRight(90); - /// } - /// - /// - /// This method is automatically re-called when it has returned. - ///

- public virtual void Run() - { - } - - /// - /// Sets the colors of the robot. The color values are RGB values. - /// You can use the colors that are already defined for this class. - /// - /// - /// The RGB color value for the body - /// The RGB color value for the gun - /// The RGB color value for the radar - public void SetColors(int bodyColor, int gunColor, int radarColor) - { - if (peer != null) - { - peer.SetBodyColor(Color.FromArgb(bodyColor)); - peer.SetGunColor(Color.FromArgb(gunColor)); - peer.SetRadarColor(Color.FromArgb(radarColor)); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the colors of the robot. The color values are RGB values. - /// You can use the colors that are already defined for this class. - /// - /// - /// The RGB color value for the body - /// The RGB color value for the gun - /// The RGB color value for the radar - /// The RGB color value for the bullets - /// The RGB color value for the scan arc - public void SetColors(int bodyColor, int gunColor, int radarColor, int bulletColor, int scanArcColor) - { - if (peer != null) - { - peer.SetBodyColor(Color.FromArgb(bodyColor)); - peer.SetGunColor(Color.FromArgb(gunColor)); - peer.SetRadarColor(Color.FromArgb(radarColor)); - peer.SetBulletColor(Color.FromArgb(bulletColor)); - peer.SetScanColor(Color.FromArgb(scanArcColor)); - } - else - { - UninitializedException(); - } - } - - /// - /// Moves this robot forward by pixels and turns this robot left by degrees - /// at the same time. The robot will move in a curve that follows a perfect - /// circle, and the moving and turning will end at the same time. - ///

- /// Note that the max. velocity and max. turn rate is automatically adjusted, - /// which means that the robot will move slower the sharper the turn is - /// compared to the distance. - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// The amount of pixels to move forward - /// The amount of degrees to turn to the left - public void TurnAheadLeft(int distance, int degrees) - { - TurnAheadRight(distance, -degrees); - } - - /// - /// Moves this robot forward by pixels and turns this robot right by degrees - /// at the same time. The robot will move in a curve that follows a perfect - /// circle, and the moving and turning will end at the same time. - ///

- /// Note that the max. velocity and max. turn rate is automatically adjusted, - /// which means that the robot will move slower the sharper the turn is - /// compared to the distance. - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// The amount of pixels to move forward - /// The amount of degrees to turn to the right - public void TurnAheadRight(int distance, int degrees) - { - if (peer != null) - { - ((IJuniorRobotPeer) peer).TurnAndMove(distance, Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Moves this robot backward by pixels and turns this robot left by degrees - /// at the same time. The robot will move in a curve that follows a perfect - /// circle, and the moving and turning will end at the same time. - ///

- /// Note that the max. velocity and max. turn rate is automatically adjusted, - /// which means that the robot will move slower the sharper the turn is - /// compared to the distance. - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// The amount of pixels to move backward - /// The amount of degrees to turn to the left - public void TurnBackLeft(int distance, int degrees) - { - TurnAheadRight(-distance, degrees); - } - - /// - /// Moves this robot backward by pixels and turns this robot right by degrees - /// at the same time. The robot will move in a curve that follows a perfect - /// circle, and the moving and turning will end at the same time. - ///

- /// Note that the max. velocity and max. turn rate is automatically adjusted, - /// which means that the robot will move slower the sharper the turn is - /// compared to the distance. - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// The amount of pixels to move backward - /// The amount of degrees to turn to the right - public void TurnBackRight(int distance, int degrees) - { - TurnAheadRight(-distance, -degrees); - } - - /// - /// Turns the gun left by degrees. - /// - /// - /// - /// - /// - /// - /// The amount of degrees to turn the gun to the left - public void TurnGunLeft(int degrees) - { - TurnGunRight(-degrees); - } - - /// - /// Turns the gun right by degrees. - /// - /// - /// - /// - /// - /// - /// The amount of degrees to turn the gun to the right - public void TurnGunRight(int degrees) - { - if (peer != null) - { - peer.TurnGun(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Turns the gun to the specified angle (in degrees). - /// The gun will turn to the side with the shortest delta angle to the - /// specified angle. - /// - /// - /// - /// - /// - /// - /// The angle to turn the gun to - public void TurnGunTo(int angle) - { - if (peer != null) - { - peer.TurnGun(Utils.NormalRelativeAngle(Utils.ToRadians(angle) - peer.GetGunHeading())); - } - else - { - UninitializedException(); - } - } - - /// - /// Turns this robot left by degrees. - /// - /// - /// - /// - /// - /// - /// - /// - /// The amount of degrees to turn to the left - public void TurnLeft(int degrees) - { - TurnRight(-degrees); - } - - /// - /// Turns this robot right by degrees. - /// - /// - /// - /// - /// - /// - /// - /// - /// The amount of degrees to turn to the right - public void TurnRight(int degrees) - { - if (peer != null) - { - peer.TurnBody(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Turns this robot to the specified angle (in degrees). - /// The robot will turn to the side with the shortest delta angle to the - /// specified angle. - /// - /// - /// - /// - /// - /// - /// - /// - /// The angle to turn this robot to - public void TurnTo(int angle) - { - if (peer != null) - { - peer.TurnBody(Utils.NormalRelativeAngle(Utils.ToRadians(angle) - peer.GetBodyHeading())); - } - else - { - UninitializedException(); - } - } - - /// - /// Returns the event handler of this robot. - /// - private InnerEventHandler getEventHandler() - { - if (innerEventHandler == null) - { - innerEventHandler = new InnerEventHandler(this); - } - return innerEventHandler; - } - - /// - /// The JuniorRobot event handler, which extends the basic robot events, - /// IBasicEvents, and IRunnable. - /// - private sealed class InnerEventHandler : IBasicEvents, IRunnable - { - public InnerEventHandler(JuniorRobot robot) - { - this.robot = robot; - } - - private readonly JuniorRobot robot; - internal double juniorFirePower; - private long currentTurn; - - public void OnBulletHit(BulletHitEvent evnt) - { - } - - public void OnBulletHitBullet(BulletHitBulletEvent evnt) - { - } - - public void OnBulletMissed(BulletMissedEvent evnt) - { - } - - public void OnDeath(DeathEvent evnt) - { - } - - public void OnHitByBullet(HitByBulletEvent evnt) - { - double angle = robot.peer.GetBodyHeading() + evnt.BearingRadians; - - robot.hitByBulletAngle = (int) (Utils.ToDegrees(Utils.NormalAbsoluteAngle(angle)) + 0.5); - robot.hitByBulletBearing = (int) (evnt.Bearing + 0.5); - robot.OnHitByBullet(); - } - - public void OnHitRobot(HitRobotEvent evnt) - { - double angle = robot.peer.GetBodyHeading() + evnt.BearingRadians; - - robot.hitRobotAngle = (int) (Utils.ToDegrees(Utils.NormalAbsoluteAngle(angle)) + 0.5); - robot.hitRobotBearing = (int) (evnt.Bearing + 0.5); - robot.OnHitRobot(); - } - - public void OnHitWall(HitWallEvent evnt) - { - double angle = robot.peer.GetBodyHeading() + evnt.BearingRadians; - - robot.hitWallAngle = (int) (Utils.ToDegrees(Utils.NormalAbsoluteAngle(angle)) + 0.5); - robot.hitWallBearing = (int) (evnt.Bearing + 0.5); - robot.OnHitWall(); - } - - public void OnRobotDeath(RobotDeathEvent evnt) - { - robot.others = robot.peer.GetOthers(); - } - - public void OnScannedRobot(ScannedRobotEvent evnt) - { - robot.scannedDistance = (int) (evnt.Distance + 0.5); - robot.scannedEnergy = Math.Max(1, (int) (evnt.Energy + 0.5)); - robot.scannedAngle = (int) (Utils.ToDegrees( - Utils.NormalAbsoluteAngle(robot.peer.GetBodyHeading() + - evnt.BearingRadians)) - + 0.5); - robot.scannedBearing = (int) (evnt.Bearing + 0.5); - robot.scannedHeading = (int) (evnt.Heading + 0.5); - robot.scannedVelocity = (int) (evnt.Velocity + 0.5); - - robot.OnScannedRobot(); - } - - public void OnStatus(StatusEvent e) - { - RobotStatus s = e.Status; - - robot.others = robot.peer.GetOthers(); - robot.energy = Math.Max(1, (int) (s.Energy + 0.5)); - robot.robotX = (int) (s.X + 0.5); - robot.robotY = (int) (s.Y + 0.5); - robot.heading = (int) (Utils.ToDegrees(s.Heading) + 0.5); - robot.gunHeading = (int) (Utils.ToDegrees(s.GunHeading) + 0.5); - robot.gunBearing = - (int) (Utils.ToDegrees(Utils.NormalRelativeAngle(s.GunHeading - s.Heading)) + 0.5); - robot.gunReady = (s.GunHeat <= 0); - - currentTurn = e.Time; - - // Auto Fire - if (juniorFirePower > 0 && robot.gunReady && (robot.peer.GetGunTurnRemaining() == 0)) - { - if (robot.peer.SetFire(juniorFirePower) != null) - { - robot.gunReady = false; - juniorFirePower = 0; - } - } - - // Reset event data - robot.scannedDistance = -1; - robot.scannedAngle = -1; - robot.scannedBearing = -1; - robot.scannedVelocity = -99; - robot.scannedHeading = -1; - robot.scannedEnergy = -1; - robot.hitByBulletAngle = -1; - robot.hitByBulletBearing = -1; - robot.hitRobotAngle = -1; - robot.hitRobotBearing = -1; - robot.hitWallAngle = -1; - robot.hitWallBearing = -1; - } - - public void OnWin(WinEvent evnt) - { - } - - // ReSharper disable FunctionNeverReturns - public void Run() - { - robot.fieldWidth = (int) (robot.peer.GetBattleFieldWidth() + 0.5); - robot.fieldHeight = (int) (robot.peer.GetBattleFieldHeight() + 0.5); - - // noinspection InfiniteLoopStatement - while (true) - { - long lastTurn = currentTurn; // Used for the Rescan check - - robot.Run(); // Run the code in the JuniorRobot - - // Make sure that we Rescan if the robot did not execute anything this turn. - // When the robot executes the currentTurn will automatically be increased by 1, - // So when the turn stays the same, the robot did not take any action this turn. - if (lastTurn == currentTurn) - { - robot.peer.Rescan(); // Spend a turn on rescanning - } - } - } - } - // ReSharper restore FunctionNeverReturns - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyEvent.cs deleted file mode 100644 index 1bb3bdd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyEvent.cs +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; - -namespace Robocode -{ - /// - /// Super class of all events that originates from the keyboard. - /// - [Serializable] - public abstract class KeyEvent : Event - { - private readonly char keyChar; - private readonly int keyCode; - private readonly int keyLocation; - private readonly int id; - private readonly int modifiersEx; - private readonly long when; - - /// - /// Called by game - /// - protected KeyEvent(char keyChar, int keyCode, int keyLocation, int id, int modifiersEx, long when) - { - this.keyChar = keyChar; - this.keyCode = keyCode; - this.keyLocation = keyLocation; - this.id = id; - this.modifiersEx = modifiersEx; - this.when = when; - } - - /// - /// Char of they key pressed - /// - public char KeyChar - { - get { return keyChar; } - } - - /// - /// - /// - public int KeyCode - { - get { return keyCode; } - } - - internal int KeyLocation - { - get { return keyLocation; } - } - - internal int ID - { - get { return id; } - } - - internal int ModifiersEx - { - get { return modifiersEx; } - } - - /// - /// Age of the event - /// - public long When - { - get { return when; } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyPressedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyPressedEvent.cs deleted file mode 100644 index 0ec1caa..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyPressedEvent.cs +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A KeyPressedEvent is sent to - /// when a key has been pressed on the keyboard. - /// - /// - /// - [Serializable] - public sealed class KeyPressedEvent : KeyEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new KeyPressedEvent. - /// - public KeyPressedEvent(char keyChar, int keyCode, int keyLocation, int id, int modifiersEx, long when) - : base(keyChar, keyCode, keyLocation, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnKeyPressed(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.KeyPressedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_CHAR + RbSerializerN.SIZEOF_INT - + RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG + RbSerializerN.SIZEOF_INT + - RbSerializerN.SIZEOF_INT; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (KeyPressedEvent) objec; - serializer.serialize(buffer, obj.KeyChar); - serializer.serialize(buffer, obj.KeyCode); - serializer.serialize(buffer, obj.KeyLocation); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - char keyChar = buffer.getChar(); - int keyCode = buffer.getInt(); - int keyLocation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - return new KeyPressedEvent(keyChar, keyCode, keyLocation, id, modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyReleasedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyReleasedEvent.cs deleted file mode 100644 index 30add3e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyReleasedEvent.cs +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A KeyReleasedEvent is sent to - /// when a key has been released on the keyboard. - /// - /// - /// - [Serializable] - public sealed class KeyReleasedEvent : KeyEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new KeyReleasedEvent. - /// - public KeyReleasedEvent(char keyChar, int keyCode, int keyLocation, int id, int modifiersEx, long when) - : base(keyChar, keyCode, keyLocation, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnKeyReleased(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.KeyReleasedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_CHAR + RbSerializerN.SIZEOF_INT - + RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG + RbSerializerN.SIZEOF_INT + - RbSerializerN.SIZEOF_INT; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (KeyReleasedEvent) objec; - - serializer.serialize(buffer, obj.KeyChar); - serializer.serialize(buffer, obj.KeyCode); - serializer.serialize(buffer, obj.KeyLocation); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - char keyChar = buffer.getChar(); - int keyCode = buffer.getInt(); - int keyLocation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new KeyReleasedEvent(keyChar, keyCode, keyLocation, id, modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyTypedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyTypedEvent.cs deleted file mode 100644 index b59b4fa..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/KeyTypedEvent.cs +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A KeyTypedEvent is sent to - /// when a key has been typed (pressed and released) on the keyboard. - /// - /// - /// - [Serializable] - public sealed class KeyTypedEvent : KeyEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new KeyTypedEvent. - /// - public KeyTypedEvent(char keyChar, int keyCode, int keyLocation, int id, int modifiersEx, long when) - : base(keyChar, keyCode, keyLocation, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnKeyTyped(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.KeyTypedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_CHAR + RbSerializerN.SIZEOF_INT - + RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG + RbSerializerN.SIZEOF_INT + - RbSerializerN.SIZEOF_INT; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (KeyTypedEvent) objec; - - serializer.serialize(buffer, obj.KeyChar); - serializer.serialize(buffer, obj.KeyCode); - serializer.serialize(buffer, obj.KeyLocation); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - char keyChar = buffer.getChar(); - int keyCode = buffer.getInt(); - int keyLocation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new KeyTypedEvent(keyChar, keyCode, keyLocation, id, modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Keys.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Keys.cs deleted file mode 100644 index fd834ca..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Keys.cs +++ /dev/null @@ -1,292 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// This class is based on the source code from Sun's Java 1.5.0 API for java.awt.event.KeyEvent, but -// rewritten for C# and .NET with the purpose to bridge the .NET and Java internals of Robocode. - -namespace Robocode -{ -#pragma warning disable 1591 - /// - public static class Keys - { - public const int KEY_FIRST = 400; - - public const int KEY_LAST = 402; - - public const int KEY_TYPED = KEY_FIRST; - - public const int KEY_PRESSED = 1 + KEY_FIRST; - - public const int KEY_RELEASED = 2 + KEY_FIRST; - - public const int VK_ENTER = 0x0A; - public const int VK_BACK_SPACE = 0x20; - public const int VK_TAB = 0x08; - public const int VK_CANCEL = 0x03; - public const int VK_CLEAR = 0x0C; - public const int VK_SHIFT = 0x10; - public const int VK_CONTROL = 0x11; - public const int VK_ALT = 0x12; - public const int VK_PAUSE = 0x13; - public const int VK_CAPS_LOCK = 0x14; - public const int VK_ESCAPE = 0x1B; - public const int VK_SPACE = 0x20; - public const int VK_PAGE_UP = 0x21; - public const int VK_PAGE_DOWN = 0x22; - public const int VK_END = 0x23; - public const int VK_HOME = 0x24; - - public const int VK_LEFT = 0x25; - - public const int VK_UP = 0x26; - - public const int VK_RIGHT = 0x27; - - public const int VK_DOWN = 0x28; - - public const int VK_COMMA = 0x2C; - - public const int VK_MINUS = 0x2D; - - public const int VK_PERIOD = 0x2E; - - public const int VK_SLASH = 0x2F; - - public const int VK_0 = 0x30; - public const int VK_1 = 0x31; - public const int VK_2 = 0x32; - public const int VK_3 = 0x33; - public const int VK_4 = 0x34; - public const int VK_5 = 0x35; - public const int VK_6 = 0x36; - public const int VK_7 = 0x37; - public const int VK_8 = 0x38; - public const int VK_9 = 0x39; - - public const int VK_SEMICOLON = 0x3B; - - public const int VK_EQUALS = 0x3D; - - public const int VK_A = 0x41; - public const int VK_B = 0x42; - public const int VK_C = 0x43; - public const int VK_D = 0x44; - public const int VK_E = 0x45; - public const int VK_F = 0x46; - public const int VK_G = 0x47; - public const int VK_H = 0x48; - public const int VK_I = 0x49; - public const int VK_J = 0x4A; - public const int VK_K = 0x4B; - public const int VK_L = 0x4C; - public const int VK_M = 0x4D; - public const int VK_N = 0x4E; - public const int VK_O = 0x4F; - public const int VK_P = 0x50; - public const int VK_Q = 0x51; - public const int VK_R = 0x52; - public const int VK_S = 0x53; - public const int VK_T = 0x54; - public const int VK_U = 0x55; - public const int VK_V = 0x56; - public const int VK_W = 0x57; - public const int VK_X = 0x58; - public const int VK_Y = 0x59; - public const int VK_Z = 0x5A; - - public const int VK_OPEN_BRACKET = 0x5B; - - public const int VK_BACK_SLASH = 0x5C; - - public const int VK_CLOSE_BRACKET = 0x5D; - - public const int VK_NUMPAD0 = 0x60; - public const int VK_NUMPAD1 = 0x61; - public const int VK_NUMPAD2 = 0x62; - public const int VK_NUMPAD3 = 0x63; - public const int VK_NUMPAD4 = 0x64; - public const int VK_NUMPAD5 = 0x65; - public const int VK_NUMPAD6 = 0x66; - public const int VK_NUMPAD7 = 0x67; - public const int VK_NUMPAD8 = 0x68; - public const int VK_NUMPAD9 = 0x69; - public const int VK_MULTIPLY = 0x6A; - public const int VK_ADD = 0x6B; - - public const int VK_SEPARATER = 0x6C; - - public const int VK_SEPARATOR = VK_SEPARATER; - - public const int VK_SUBTRACT = 0x6D; - public const int VK_DECIMAL = 0x6E; - public const int VK_DIVIDE = 0x6F; - public const int VK_DELETE = 0x7F; - public const int VK_NUM_LOCK = 0x90; - public const int VK_SCROLL_LOCK = 0x91; - - public const int VK_F1 = 0x70; - - public const int VK_F2 = 0x71; - - public const int VK_F3 = 0x72; - - public const int VK_F4 = 0x73; - - public const int VK_F5 = 0x74; - - public const int VK_F6 = 0x75; - - public const int VK_F7 = 0x76; - - public const int VK_F8 = 0x77; - - public const int VK_F9 = 0x78; - - public const int VK_F10 = 0x79; - - public const int VK_F11 = 0x7A; - - public const int VK_F12 = 0x7B; - - public const int VK_F13 = 0xF000; - - public const int VK_F14 = 0xF001; - - public const int VK_F15 = 0xF002; - - public const int VK_F16 = 0xF003; - - public const int VK_F17 = 0xF004; - - public const int VK_F18 = 0xF005; - - public const int VK_F19 = 0xF006; - - public const int VK_F20 = 0xF007; - - public const int VK_F21 = 0xF008; - - public const int VK_F22 = 0xF009; - - public const int VK_F23 = 0xF00A; - - public const int VK_F24 = 0xF00B; - - public const int VK_PRINTSCREEN = 0x9A; - public const int VK_INSERT = 0x9B; - public const int VK_HELP = 0x9C; - public const int VK_META = 0x9D; - - public const int VK_BACK_QUOTE = 0xC0; - public const int VK_QUOTE = 0xDE; - - public const int VK_KP_UP = 0xE0; - - public const int VK_KP_DOWN = 0xE1; - - public const int VK_KP_LEFT = 0xE2; - - public const int VK_KP_RIGHT = 0xE3; - - public const int VK_DEAD_GRAVE = 0x80; - public const int VK_DEAD_ACUTE = 0x81; - public const int VK_DEAD_CIRCUMFLEX = 0x82; - public const int VK_DEAD_TILDE = 0x83; - public const int VK_DEAD_MACRON = 0x84; - public const int VK_DEAD_BREVE = 0x85; - public const int VK_DEAD_ABOVEDOT = 0x86; - public const int VK_DEAD_DIAERESIS = 0x87; - public const int VK_DEAD_ABOVERING = 0x88; - public const int VK_DEAD_DOUBLEACUTE = 0x89; - public const int VK_DEAD_CARON = 0x8a; - public const int VK_DEAD_CEDILLA = 0x8b; - public const int VK_DEAD_OGONEK = 0x8c; - public const int VK_DEAD_IOTA = 0x8d; - public const int VK_DEAD_VOICED_SOUND = 0x8e; - public const int VK_DEAD_SEMIVOICED_SOUND = 0x8f; - - public const int VK_AMPERSAND = 0x96; - public const int VK_ASTERISK = 0x97; - public const int VK_QUOTEDBL = 0x98; - public const int VK_LESS = 0x99; - public const int VK_GREATER = 0xa0; - public const int VK_BRACELEFT = 0xa1; - public const int VK_BRACERIGHT = 0xa2; - - public const int VK_AT = 0x0200; - public const int VK_COLON = 0x0201; - public const int VK_CIRCUMFLEX = 0x0202; - public const int VK_DOLLAR = 0x0203; - public const int VK_EURO_SIGN = 0x0204; - - public const int VK_EXCLAMATION_MARK = 0x0205; - public const int VK_INVERTED_EXCLAMATION_MARK = 0x0206; - public const int VK_LEFT_PARENTHESIS = 0x0207; - public const int VK_NUMBER_SIGN = 0x0208; - public const int VK_PLUS = 0x0209; - public const int VK_RIGHT_PARENTHESIS = 0x020A; - public const int VK_UNDERSCORE = 0x020B; - public const int VK_WINDOWS = 0x020C; - public const int VK_CONTEXT_MENU = 0x020D; - public const int VK_const = 0x0018; - public const int VK_CONVERT = 0x001C; - public const int VK_NONCONVERT = 0x001D; - public const int VK_ACCEPT = 0x001E; - public const int VK_MODECHANGE = 0x001F; - public const int VK_KANA = 0x0015; - public const int VK_KANJI = 0x0019; - public const int VK_ALPHANUMERIC = 0x00F0; - public const int VK_KATAKANA = 0x00F1; - public const int VK_HIRAGANA = 0x00F2; - public const int VK_FULL_WIDTH = 0x00F3; - public const int VK_HALF_WIDTH = 0x00F4; - public const int VK_ROMAN_CHARACTERS = 0x00F5; - public const int VK_ALL_CANDIDATES = 0x0100; - public const int VK_PREVIOUS_CANDIDATE = 0x0101; - public const int VK_CODE_INPUT = 0x0102; - public const int VK_JAPANESE_KATAKANA = 0x0103; - public const int VK_JAPANESE_HIRAGANA = 0x0104; - public const int VK_JAPANESE_ROMAN = 0x0105; - public const int VK_KANA_LOCK = 0x0106; - public const int VK_INPUT_METHOD_ON_OFF = 0x0107; - public const int VK_CUT = 0xFFD1; - public const int VK_COPY = 0xFFCD; - public const int VK_PASTE = 0xFFCF; - public const int VK_UNDO = 0xFFCB; - public const int VK_AGAIN = 0xFFC9; - public const int VK_FIND = 0xFFD0; - public const int VK_PROPS = 0xFFCA; - public const int VK_STOP = 0xFFC8; - public const int VK_COMPOSE = 0xFF20; - public const int VK_ALT_GRAPH = 0xFF7E; - public const int VK_BEGIN = 0xFF58; - public const int VK_UNDEFINED = 0x0; - public const int KEY_LOCATION_UNKNOWN = 0; - public const int KEY_LOCATION_STANDARD = 1; - public const int KEY_LOCATION_LEFT = 2; - public const int KEY_LOCATION_RIGHT = 3; - public const int KEY_LOCATION_NUMPAD = 4; - public static readonly char CHAR_UNDEFINED = (char) 0xFFFF; - public const int MOUSE_FIRST = 500; - public const int MOUSE_LAST = 507; - public const int MOUSE_CLICKED = MOUSE_FIRST; - public const int MOUSE_PRESSED = 1 + MOUSE_FIRST; //Event.MOUSE_DOWN - public const int MOUSE_RELEASED = 2 + MOUSE_FIRST; //Event.MOUSE_UP - public const int MOUSE_MOVED = 3 + MOUSE_FIRST; //Event.MOUSE_MOVE - public const int MOUSE_ENTERED = 4 + MOUSE_FIRST; //Event.MOUSE_ENTER - public const int MOUSE_EXITED = 5 + MOUSE_FIRST; //Event.MOUSE_EXIT - public const int MOUSE_DRAGGED = 6 + MOUSE_FIRST; //Event.MOUSE_DRAG - public const int MOUSE_WHEEL = 7 + MOUSE_FIRST; - public const int NOBUTTON = 0; - public const int BUTTON1 = 1; - public const int BUTTON2 = 2; - public const int BUTTON3 = 3; - - } -#pragma warning restore 1591 -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MessageEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MessageEvent.cs deleted file mode 100644 index 8e01625..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MessageEvent.cs +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.peer; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MessageEvent is sent to - /// when a teammate sends a message to your robot. - /// You can use the information contained in this event to determine what to do. - /// - [Serializable] - public sealed class MessageEvent : Event - { - private const int DEFAULT_PRIORITY = 75; - - private readonly string sender; - [NonSerialized] - private readonly object message; - - /// - /// Called by the game to create a new MessageEvent. - /// - public MessageEvent(string sender, object message) - { - this.sender = sender; - this.message = message; - } - - /// - /// Returns the name of the sending robot. - /// - public string Sender - { - get { return sender; } - } - - /// - /// Returns the message itself. - /// - public object Message - { - get { return message; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsTeamRobot()) - { - ITeamEvents listener = ((ITeamRobot) robot).GetTeamEventListener(); - - if (listener != null) - { - listener.OnMessageReceived(this); - } - } - } - - internal override byte SerializationType - { - get { throw new System.Exception("Serialization of event type not supported"); } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseClickedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseClickedEvent.cs deleted file mode 100644 index bfeba0b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseClickedEvent.cs +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MouseClickedEvent is sent to - /// when the mouse is clicked inside the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MouseClickedEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new MouseClickedEvent. - /// - public MouseClickedEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - : base(button, clickCount, x, y, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMouseClicked(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MouseClickedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 6*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MouseClickedEvent) objec; - - serializer.serialize(buffer, obj.Button); - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseClickedEvent(button, clickCount, x, y, id, modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseDraggedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseDraggedEvent.cs deleted file mode 100644 index 013a1e3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseDraggedEvent.cs +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MouseDraggedEvent is sent to - /// when the mouse is dragged inside the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MouseDraggedEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new MouseDraggedEvent. - /// - public MouseDraggedEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - : base(button, clickCount, x, y, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMouseDragged(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MouseDraggedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 6*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MouseDraggedEvent) objec; - - serializer.serialize(buffer, obj.Button); - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseDraggedEvent(button, clickCount, x, y, id, modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEnteredEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEnteredEvent.cs deleted file mode 100644 index b0ce310..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEnteredEvent.cs +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MouseEnteredEvent is sent to - /// when the mouse has entered the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MouseEnteredEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new MouseDraggedEvent. - /// - public MouseEnteredEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - : base(button, clickCount, x, y, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMouseEntered(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MouseEnteredEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 6*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MouseEnteredEvent)objec; - - serializer.serialize(buffer, obj.Button); - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseEnteredEvent(button, clickCount, x, y, id, modifiersEx, when); - } - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEvent.cs deleted file mode 100644 index 2f87e17..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseEvent.cs +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; - -namespace Robocode -{ - /// - /// Super class of all events that originates from the mouse. - /// - [Serializable] - public abstract class MouseEvent : Event - { - private readonly int button; - private readonly int clickCount; - private readonly int x; - private readonly int y; - private readonly int id; - private readonly int modifiersEx; - private readonly long when; - - /// - /// Called by the game to create a new MouseEvent. - /// - protected MouseEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - { - this.button = button; - this.clickCount = clickCount; - this.x = x; - this.y = y; - this.id = id; - this.modifiersEx = modifiersEx; - this.when = when; - } - - /// - /// Number of the button - /// - public int Button - { - get { return button; } - } - - /// - /// Click count - /// - public int ClickCount - { - get { return clickCount; } - } - - /// - /// Cursor coordinates - /// - public int X - { - get { return x; } - } - - /// - /// Cursor coordinates - /// - public int Y - { - get { return y; } - } - - internal int ID - { - get { return id; } - } - - internal int ModifiersEx - { - get { return modifiersEx; } - } - - /// - /// Age of the event - /// - public long When - { - get { return when; } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseExitedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseExitedEvent.cs deleted file mode 100644 index 7a39cc7..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseExitedEvent.cs +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MouseExitedEvent is sent to - /// when the mouse has exited the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MouseExitedEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new MouseDraggedEvent. - /// - public MouseExitedEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - : base(button, clickCount, x, y, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMouseExited(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MouseExitedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 6*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MouseExitedEvent)objec; - - serializer.serialize(buffer, obj.Button); - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseExitedEvent(button, clickCount, x, y, id, modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseMovedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseMovedEvent.cs deleted file mode 100644 index 6b4b640..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseMovedEvent.cs +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MouseMovedEvent is sent to - /// when the mouse has moved inside the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MouseMovedEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new MouseDraggedEvent. - /// - public MouseMovedEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - : base(button, clickCount, x, y, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMouseMoved(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MouseMovedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 6*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MouseMovedEvent)objec; - - serializer.serialize(buffer, obj.Button); - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseMovedEvent(button, clickCount, x, y, id, modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MousePressedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MousePressedEvent.cs deleted file mode 100644 index 35b7470..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MousePressedEvent.cs +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MousePressedEvent is sent to - /// when the mouse is pressed inside the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MousePressedEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new MouseDraggedEvent. - /// - public MousePressedEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - : base(button, clickCount, x, y, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMousePressed(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MousePressedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 6*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MousePressedEvent)objec; - - serializer.serialize(buffer, obj.Button); - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MousePressedEvent(button, clickCount, x, y, id, modifiersEx, when); - } - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseReleasedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseReleasedEvent.cs deleted file mode 100644 index f3c6e75..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseReleasedEvent.cs +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MouseReleasedEvent is sent to - /// when the mouse is released inside the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MouseReleasedEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - - /// - /// Called by the game to create a new MouseDraggedEvent. - /// - public MouseReleasedEvent(int button, int clickCount, int x, int y, int id, int modifiersEx, long when) - : base(button, clickCount, x, y, id, modifiersEx, when) - { - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMouseReleased(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MouseReleasedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 6*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MouseReleasedEvent)objec; - - serializer.serialize(buffer, obj.Button); - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseReleasedEvent(button, clickCount, x, y, id, modifiersEx, when); - } - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseWheelMovedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseWheelMovedEvent.cs deleted file mode 100644 index 986507d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MouseWheelMovedEvent.cs +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A MouseWheelMovedEvent is sent to - /// when the mouse wheel is rotated inside the battle view. - /// - /// - /// - /// - /// - /// - /// - /// - [Serializable] - public sealed class MouseWheelMovedEvent : MouseEvent - { - private const int DEFAULT_PRIORITY = 98; - private readonly int scrollType; - private readonly int scrollAmount; - private readonly int wheelRotation; - - /// - /// Called by the game to create a new MouseWheelMovedEvent. - /// - public MouseWheelMovedEvent(int clickCount, int x, int y, int scrollType, int scrollAmount, int wheelRotation, - int id, int modifiersEx, long when) - : base(-1, clickCount, x, y, id, modifiersEx, when) - { - this.scrollType = scrollType; - this.scrollAmount = scrollAmount; - this.wheelRotation = wheelRotation; - } - - internal int ScrollType - { - get { return scrollType; } - } - - internal int ScrollAmount - { - get { return scrollAmount; } - } - - /// - /// Indicates how far the mouse wheel was rotated. - /// - public int WheelRotation - { - get { return wheelRotation; } - } - - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsInteractiveRobot()) - { - IInteractiveEvents listener = ((IInteractiveRobot) robot).GetInteractiveEventListener(); - - if (listener != null) - { - listener.OnMouseWheelMoved(this); - } - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.MouseWheelMovedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 8*RbSerializerN.SIZEOF_INT + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (MouseWheelMovedEvent) objec; - - serializer.serialize(buffer, obj.ClickCount); - serializer.serialize(buffer, obj.X); - serializer.serialize(buffer, obj.Y); - serializer.serialize(buffer, obj.ScrollType); - serializer.serialize(buffer, obj.ScrollAmount); - serializer.serialize(buffer, obj.WheelRotation); - serializer.serialize(buffer, obj.ID); - serializer.serialize(buffer, obj.ModifiersEx); - serializer.serialize(buffer, obj.When); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int scrollType = buffer.getInt(); - int scrollAmount = buffer.getInt(); - int wheelRotation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseWheelMovedEvent(clickCount, x, y, scrollType, scrollAmount, wheelRotation, id, - modifiersEx, when); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MoveCompleteCondition.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MoveCompleteCondition.cs deleted file mode 100644 index dde6a0b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/MoveCompleteCondition.cs +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode -{ - /// - /// A prebuilt condition you can use that indicates your robot has finished moving. - /// - /// - public class MoveCompleteCondition : Condition - { - private readonly AdvancedRobot robot; - - /// - /// Creates a new MoveCompleteCondition with default priority. - /// The default priority is 80. - /// - /// Your robot, which must be a - public MoveCompleteCondition(AdvancedRobot robot) - { - this.robot = robot; - } - - /// - /// Creates a new MoveCompleteCondition with the specified priority. - /// A condition priority is a value from 0 - 99. The higher value, the - /// higher priority. The default priority is 80. - /// - /// - /// Your robot, which must be a - /// The priority of this condition - public MoveCompleteCondition(AdvancedRobot robot, int priority) - { - this.robot = robot; - this.priority = priority; - } - - /// - /// Tests if the robot has stopped moving. - /// Returns true if the robot has stopped moving - /// - public override bool Test() - { - return (robot.DistanceRemaining == 0); - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/PaintEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/PaintEvent.cs deleted file mode 100644 index 6848122..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/PaintEvent.cs +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.peer; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event occurs when your robot should paint, where the - /// is called on your robot. - ///

- /// You can use this event for setting the event priority by calling - /// - ///

- [Serializable] - public sealed class PaintEvent : Event - { - private const int DEFAULT_PRIORITY = 5; - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsPaintRobot()) - { - IPaintEvents listener = ((IPaintRobot) robot).GetPaintEventListener(); - - if (listener != null) - { - listener.OnPaint(graphics); - } - } - } - - internal override byte SerializationType - { - get { throw new System.Exception("Serialization of this type is not supported"); } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RadarTurnCompleteCondition.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RadarTurnCompleteCondition.cs deleted file mode 100644 index a46092a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RadarTurnCompleteCondition.cs +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode -{ - /// - /// A prebuilt condition you can use that indicates your radar has finished turning. - /// - /// - public class RadarTurnCompleteCondition : Condition - { - private readonly AdvancedRobot robot; - - /// - /// Creates a new RadarTurnCompleteCondition with default priority. - /// The default priority is 80. - /// - /// Your robot, which must be a - public RadarTurnCompleteCondition(AdvancedRobot robot) - { - this.robot = robot; - } - - /// - /// Creates a new RadarTurnCompleteCondition with the specified priority. - /// A condition priority is a value from 0 - 99. The higher value, the - /// higher priority. The default priority is 80. - /// - /// - /// Your robot, which must be a - /// The priority of this condition - public RadarTurnCompleteCondition(AdvancedRobot robot, int priority) - { - this.robot = robot; - this.priority = priority; - } - - /// - /// Tests if the radar has stopped turning. - /// Returns true if the radar has stopped turning; false otherwise - /// - public override bool Test() - { - return (robot.RadarTurnRemaining == 0); - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RateControlRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RateControlRobot.cs deleted file mode 100644 index 2521bcd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RateControlRobot.cs +++ /dev/null @@ -1,364 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode.Util; - -namespace Robocode -{ - /// - /// This advanced robot type allows you to set a rate for each of the robot's movements. - ///

- /// You can set the rate for: - ///

    - ///
  • velocity - pixels per turn
  • - ///
  • robot turn - radians per turn
  • - ///
  • gun rotation - radians per turn
  • - ///
  • radar rotation - radians per turn
  • - ///
- /// When you set a rate for one of the above movements, the movement will continue the move by - /// specified rate for ever, until the rate is changed. In order to move ahead or right, the - /// rate must be set to a positive value. If a negative value is used instead, the movement - /// will go back or to the left. In order to stop the movement, the rate must be - /// set to 0. - /// - /// Note: When calling , , - /// , and variants, - /// any previous calls to "movement" functions outside of , - /// such as , - /// , - /// and similar will be - /// overridden when calling the on this robot class. - ///

- /// Look into the source code for the samplecs.VelociRobot in order to see how to use this - /// robot type. - /// - /// - /// - /// - /// - /// - ///

- public abstract class RateControlRobot : TeamRobot - { - private double velocityRate; // Pixels per turn - private double turnRate; // Radians per turn - private double gunRotationRate; // Radians per turn - private double radarRotationRate; // Radians per turn - - /// - /// - /// The speed the robot will move (forward), in pixels per turn. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot will move backwards - ///

- /// - /// - /// // Set the robot to move forward 2 pixels per turn - /// VelocityRate = 2; - /// - /// // Set the robot to move backwards 8 pixels per turn - /// // (overrides the previous order) - /// VelocityRate = -8; - /// - /// ... - /// // Executes the last VelocityRate - /// Execute(); - /// - /// - /// Note: This method overrules and - /// - /// - /// - /// - /// - /// - /// - ///

- public double VelocityRate - { - get { return velocityRate; } - set { velocityRate = value; } - } - - /// - /// - /// The robot's clockwise (right) rotation per turn, in degrees. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot turns counterclockwise (left) - ///

- /// - /// - /// // Set the robot to turn right 10 degrees per turn - /// TurnRate = 10; - /// - /// // Set the robot to turn left 4 degrees per turn - /// // (overrides the previous order) - /// TurnRate = -5; - /// - /// ... - /// // Executes the last TurnRate - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public double TurnRate - { - get { return Utils.ToRadians(turnRate); } - set { turnRate = Utils.ToRadians(value); } - } - - /// - /// The robot's clockwise (right) rotation per turn, in radians. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot turns counterclockwise (left) - ///

- /// - /// - /// // Set the robot to turn right pi / 32 radians per turn - /// TurnRateRadians = Math.PI / 32; - /// - /// // Set the robot to turn left pi / 20 radians per turn - /// // (overrides the previous order) - /// TurnRateRadians = -Math.PI / 20; - /// - /// ... - /// // Executes the last TurnRateRadians - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public double TurnRateRadians - { - get { return turnRate; } - set { turnRate = value; } - } - - /// - /// The gun's clockwise (right) rotation per turn, in degrees. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the gun turns counterclockwise (left) - ///

- /// - /// - /// // Set the gun to turn right 15 degrees per turn - /// GunRotationRate = 15; - /// - /// // Set the gun to turn left 9 degrees per turn - /// // (overrides the previous order) - /// GunRotationRate = -9; - /// - /// ... - /// // Executes the last GunRotationRate() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public double GunRotationRate - { - get { return Utils.ToDegrees(gunRotationRate); } - set { gunRotationRate = Utils.ToRadians(value); } - } - - /// - /// The gun's clockwise (right) rotation per turn, in radians. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the gun turns counterclockwise (left) - ///

- /// - /// - /// // Set the gun to turn right pi / 16 radians per turn - /// GunRotationRateRadians = Math.PI / 16; - /// - /// // Set the gun to turn left pi / 12 radians per turn - /// // (overrides the previous order) - /// GunRotationRateRadians = -Math.PI / 12; - /// - /// ... - /// // Executes the last GunRotationRateRadians - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public double GunRotationRateRadians - { - get { return gunRotationRate; } - set { gunRotationRate = value; } - } - - /// - /// The radar's clockwise (right) rotation per turn, in degrees. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the radar turns counterclockwise (left) - ///

- /// - /// - /// // Set the radar to turn right 45 degrees per turn - /// RadarRotationRate = 45; - /// - /// // Set the radar to turn left 15 degrees per turn - /// // (overrides the previous order) - /// RadarRotationRate = -15; - /// - /// ... - /// // Executes the last RadarRotationRate - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public double RadarRotationRate - { - get { return Utils.ToDegrees(radarRotationRate); } - set { radarRotationRate = Utils.ToRadians(value); } - } - - /// - /// The radar's clockwise (right) rotation per turn, in radians. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the radar turns counterclockwise (left) - ///

- /// - /// - /// // Set the radar to turn right pi / 4 radians per turn - /// RadarRotationRateRadians = Math.PI / 4; - /// - /// // Set the radar to turn left pi / 8 radians per turn - /// // (overrides the previous order) - /// RadarRotationRateRadians = -Math.PI / 8; - /// - /// ... - /// // Executes the last RadarRotationRateRadians - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public double RadarRotationRateRadians - { - get { return radarRotationRate; } - set { radarRotationRate = value; } - } - - /// - /// Executes any pending actions, or continues executing actions that are - /// in process. This call returns after the actions have been started. - ///

- /// Note that advanced robots must call this function in order to - /// Execute pending set* calls like e.g. , - /// , - /// etc. Otherwise, these calls will never get executed. - ///

- /// Any previous calls to "movement" functions outside of - /// , such as - /// , - /// , - /// - /// etc. will be overridden when this method is called on this robot class. - ///

- /// - /// In this example the robot will move while turning: - /// - /// VelocityRate = 6; - /// TurnRate = 7; - /// - /// while (true) - /// { - /// Execute(); - /// } - /// - /// - ///

- public override void Execute() - { - MaxVelocity = velocityRate; - if (velocityRate > 0) - { - SetAhead(Double.PositiveInfinity); - } - else if (velocityRate < 0) - { - SetBack(Double.PositiveInfinity); - } - else - { - SetAhead(0); - } - - SetTurnGunRightRadians(gunRotationRate); - SetTurnRadarRightRadians(radarRotationRate); - SetTurnRightRadians(turnRate); - - base.Execute(); - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Robot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Robot.cs deleted file mode 100644 index 4d65225..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Robot.cs +++ /dev/null @@ -1,1927 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using System.IO; -using System.Security.Permissions; -using net.sf.robocode.security; -using Robocode.Exception; -using Robocode.RobotInterfaces; -using Robocode.RobotInterfaces.Peer; -using Robocode.Util; - -namespace Robocode -{ - /// - /// - /// The basic robot class that you will extend to create your own robots. - ///

- /// Please note the following standards will be used: - ///

- /// heading - absolute angle in degrees with 0 facing up the screen, - /// positive clockwise. 0 <= heading < 360. - ///

- /// bearing - relative angle to some obj from your robot's heading, - /// positive clockwise. -180 < bearing <= 180 - ///

- /// All coordinates are expressed as (x,y). - /// All coordinates are positive. - ///

- /// The origin (0,0) is at the bottom left of the screen. - ///

- /// Positive X is right. - /// Positive Y is up. - ///
- ///
- /// Building your first robot - /// - /// - /// - /// - /// - /// - /// - ///

- public abstract class Robot : IInteractiveRobot, IPaintRobot, IBasicEvents3, IInteractiveEvents, IPaintEvents, IRunnable - { - private const int - WIDTH = 36, - HEIGHT = 36; - - internal IBasicRobotPeer peer; - internal TextWriter _output; - - /// - /// The Out stream your robot should use to print. - ///

- /// You can view the print-outs by clicking the button for your robot in the - /// right side of the battle window. - ///

- /// - /// - /// // Print Out a line each time my robot hits another robot - /// public void OnHitRobot(HitRobotEvent e) - /// { - /// Out.WriteLine("I hit a robot! My energy: " + Energy + " his energy: " + e.Energy); - /// } - /// - /// - ///

- public TextWriter Out - { - get { return _output; } - } - - [RobocodeInternalPermission(SecurityAction.LinkDemand)] - void IBasicRobot.SetOut(TextWriter outpt) - { - _output = outpt; - } - - [RobocodeInternalPermission(SecurityAction.LinkDemand)] - void IBasicRobot.SetPeer(IBasicRobotPeer per) - { - peer = per; - } - - /// - /// Throws a RobotException. - /// This method should be called when the robot's peer is uninitialized. - /// - internal static void UninitializedException() - { - throw new RobotException( - "You cannot call the methods before your Run() method is called, or you are using a Robot object that the game doesn't know about."); - } - - /// - IRunnable IBasicRobot.GetRobotRunnable() - { - return this; - } - - /// - IBasicEvents IBasicRobot.GetBasicEventListener() - { - return this; - } - - /// - IInteractiveEvents IInteractiveRobot.GetInteractiveEventListener() - { - return this; - } - - /// - IPaintEvents IPaintRobot.GetPaintEventListener() - { - return this; - } - - /// - /// Immediately moves your robot ahead (forward) by distance measured in - /// pixels. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the remaining distance to move is 0. - ///

- /// If the robot collides with a wall, the move is complete, meaning that the - /// robot will not move any further. If the robot collides with another - /// robot, the move is complete if you are heading toward the other robot. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot is set to move backward - /// instead of forward. - ///

- /// - /// - /// // Move the robot 100 pixels forward - /// Ahead(100); - /// - /// // Afterwards, move the robot 50 pixels backward - /// Ahead(-50); - /// - /// - ///

- /// - /// The distance to move ahead measured in pixels. - /// If this value is negative, the robot will move back instead of ahead. - /// - /// - /// - /// - public void Ahead(double distance) - { - if (peer != null) - { - peer.Move(distance); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately moves your robot backward by distance measured in pixels. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the remaining distance to move is 0. - ///

- /// If the robot collides with a wall, the move is complete, meaning that the - /// robot will not move any further. If the robot collides with another - /// robot, the move is complete if you are heading toward the other robot. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot is set to move forward instead - /// of backward. - ///

- /// - /// - /// // Move the robot 100 pixels backward - /// Back(100); - /// - /// // Afterwards, move the robot 50 pixels forward - /// Back(-50); - /// - /// - /// - /// - /// - ///

- /// - /// The distance to move back measured in pixels. - /// If this value is negative, the robot will move ahead instead of back. - /// - public void Back(double distance) - { - if (peer != null) - { - peer.Move(-distance); - } - else - { - UninitializedException(); - } - } - - /// - /// Returns the width of the current battlefield measured in pixels. - /// - public double BattleFieldWidth - { - get - { - if (peer != null) - { - return peer.GetBattleFieldWidth(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the height of the current battlefield measured in pixels. - /// - public double BattleFieldHeight - { - get - { - if (peer != null) - { - return peer.GetBattleFieldHeight(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the direction that the robot's body is facing, in degrees. - /// The value returned will be between 0 and 360 (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// 90 means East, 180 means South, and 270 means West. - /// - /// - ///

- public double Heading - { - get - { - if (peer != null) - { - double rv = 180.0*peer.GetBodyHeading()/Math.PI; - - while (rv < 0) - { - rv += 360; - } - while (rv >= 360) - { - rv -= 360; - } - return rv; - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the height of the robot measured in pixels. - /// - /// - public double Height - { - get - { - if (peer == null) - { - UninitializedException(); - } - return HEIGHT; - } - } - - /// - /// Returns the width of the robot measured in pixels. - /// - /// - public double Width - { - get - { - if (peer == null) - { - UninitializedException(); - } - return WIDTH; - } - } - - /// - /// Returns the robot's name. - /// - public string Name - { - get - { - if (peer != null) - { - return peer.GetName(); - } - UninitializedException(); - return null; // never called - } - } - - /// - /// Returns the X position of the robot. (0,0) is at the bottom left of the battlefield. - /// - /// - public double X - { - get - { - if (peer != null) - { - return peer.GetX(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the Y position of the robot. (0,0) is at the bottom left of the battlefield. - /// - /// - public double Y - { - get - { - if (peer != null) - { - return peer.GetY(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// The main method in every robot. You must override this to set up your - /// robot's basic behavior. - ///

- /// - /// - /// // A basic robot that moves around in a square - /// public void Run() - /// { - /// while (true) - /// { - /// Ahead(100); - /// TurnRight(90); - /// } - /// } - /// - /// - ///

- public virtual void Run() - { - } - - /// - /// Immediately turns the robot's body to the left by degrees. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the robot's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn right - /// instead of left. - ///

- /// - /// - /// // Turn the robot 180 degrees to the left - /// TurnLeft(180); - /// - /// // Afterwards, turn the robot 90 degrees to the right - /// TurnLeft(-90); - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's body to the left. - /// If degrees > 0 the robot will turn left. - /// If degrees < 0 the robot will turn right. - /// If degrees = 0 the robot will not turn, but execute. - /// - public void TurnLeft(double degrees) - { - if (peer != null) - { - peer.TurnBody(-Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// - /// Immediately turns the robot's body to the right by degrees. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the robot's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's body is set to turn left - /// instead of right. - ///

- /// - /// - /// // Turn the robot 180 degrees to the right - /// TurnRight(180); - /// - /// // Afterwards, turn the robot 90 degrees to the left - /// TurnRight(-90); - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's body to the right. - /// If degrees > 0 the robot will turn right. - /// If degrees < 0 the robot will turn left. - /// If degrees = 0 the robot will not turn, but execute. - /// - public void TurnRight(double degrees) - { - if (peer != null) - { - peer.TurnBody(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Do nothing this turn, meaning that the robot will skip it's turn. - ///

- /// This call executes immediately, and does not return until the turn is over. - ///

- public void DoNothing() - { - if (peer != null) - { - peer.Execute(); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately fires a bullet. The bullet will travel in the direction the - /// gun is pointing. - ///

- /// The specified bullet power is an amount of energy that will be taken from - /// the robot's energy. Hence, the more power you want to spend on the - /// bullet, the more energy is taken from your robot. - ///

- /// The bullet will do (4 * power) damage if it hits another robot. If power - /// is greater than 1, it will do an additional 2 * (power - 1) damage. - /// You will get (3 * power) back if you hit the other robot. You can call - /// - /// for getting the damage that a - /// bullet with a specific bullet power will do. - ///

- /// The specified bullet power should be between - /// and . - ///

- /// Note that the gun cannot Fire if the gun is overheated, meaning that - /// - /// returns a value > 0. - ///

- /// A event is generated when the bullet hits a robot (), - /// wall (), or another bullet - /// (). - ///

- /// - /// - /// // Fire a bullet with maximum power if the gun is ready - /// if (GetGunHeat() == 0) - /// { - /// Fire(Rules.MAX_BULLET_POWER); - /// } - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of energy given to the bullet, and subtracted from the robot's energy. - /// - public void Fire(double power) - { - if (peer != null) - { - peer.SetFire(power); - peer.Execute(); - } - else - { - UninitializedException(); - } - } - - /// - /// - /// Immediately fires a bullet. The bullet will travel in the direction the - /// gun is pointing. - ///

- /// The specified bullet power is an amount of energy that will be taken from - /// the robot's energy. Hence, the more power you want to spend on the - /// bullet, the more energy is taken from your robot. - ///

- /// The bullet will do (4 * power) damage if it hits another robot. If power - /// is greater than 1, it will do an additional 2 * (power - 1) damage. - /// You will get (3 * power) back if you hit the other robot. You can call - /// - /// for getting the damage that a - /// bullet with a specific bullet power will do. - ///

- /// The specified bullet power should be between - /// and . - ///

- /// Note that the gun cannot Fire if the gun is overheated, meaning that - /// returns a value > 0. - ///

- /// A event is generated when the bullet hits a robot (), - /// wall (), or another bullet - /// (). - ///

- /// - /// - /// // Fire a bullet with maximum power if the gun is ready - /// if (GetGunHeat() == 0) - /// { - /// Bullet bullet = FireBullet(Rules.MAX_BULLET_POWER); - /// - /// // Get the velocity of the bullet - /// if (bullet != null) - /// { - /// double bulletVelocity = bullet.Velocity; - /// } - /// } - /// - /// - /// Returns a - /// - /// That contains information about the bullet if it was actually fired, - /// which can be used for tracking the bullet after it has been fired. - /// If the bullet was not fired, null is returned. - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// power the amount of energy given to the bullet, and subtracted from the robot's energy. - /// - public Bullet FireBullet(double power) - { - if (peer != null) - { - return peer.Fire(power); - } - UninitializedException(); - return null; - } - - /// - /// Returns the rate at which the gun will cool down, i.e. the amount of heat - /// the gun heat will drop per turn. - ///

- /// The gun cooling rate is default 0.1 / turn, but can be changed by the - /// battle setup. So don't count on the cooling rate being 0.1! - /// - /// - /// - ///

- public double GunCoolingRate - { - get - { - if (peer != null) - { - return peer.GetGunCoolingRate(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the direction that the robot's gun is facing, in degrees. - /// The value returned will be between 0 and 360 (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// 90 means East, 180 means South, and 270 means West. - /// - /// - ///

- public double GunHeading - { - get - { - if (peer != null) - { - return peer.GetGunHeading()*180.0/Math.PI; - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the current heat of the gun. The gun cannot Fire unless this is - /// 0. (Calls to Fire will succeed, but will not actually Fire unless - /// GetGunHeat() == 0). - ///

- /// The amount of gun heat generated when the gun is fired is 1 + (firePower / 5). - /// Each turn the gun heat drops by the amount returned by , - /// which is a battle setup. - ///

- /// Note that all guns are "hot" at the start of each round, where the gun heat is 3. - /// - /// - /// - ///

- public double GunHeat - { - get - { - if (peer != null) - { - return peer.GetGunHeat(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the number of rounds in the current battle. - /// - /// - public int NumRounds - { - get - { - if (peer != null) - { - return peer.GetNumRounds(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the sentry border size for a BorderSentry that defines the how - /// far a BorderSentry is allowed to move from the border edges measured in units.
- /// Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that - /// BorderSentrys cannot leave (sentry robots robots must stay in the border area), but it also define the - /// distance from the border edges where BorderSentrys are allowed/able to make damage to robots entering this - /// border area. - ///
- public int SentryBorderSize - { - get { - if (peer != null) - { - return peer.GetSentryBorderSize(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns how many opponents that are left in the current round. - /// - public int Others - { - get - { - if (peer != null) - { - return peer.GetOthers(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns how many sentry robots that are left in the current round. - /// - public int NumSentries - { - get - { - if (peer != null) - { - return peer.GetNumSentries(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the direction that the robot's radar is facing, in degrees. - /// The value returned will be between 0 and 360 (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// 90 means East, 180 means South, and 270 means West. - /// - /// - ///

- public double RadarHeading - { - get - { - if (peer != null) - { - return peer.GetRadarHeading()*180.0/Math.PI; - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the current round number (0 to - 1) of the battle. - /// - /// - public int RoundNum - { - get - { - if (peer != null) - { - return peer.GetRoundNum(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the game time of the current round, where the time is equal to - /// the current turn in the round. - ///

- /// A battle consists of multiple rounds. - ///

- /// Time is reset to 0 at the beginning of every round. - ///

- public long Time - { - get - { - if (peer != null) - { - return peer.GetTime(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns the velocity of the robot measured in pixels/turn. - ///

- /// The maximum velocity of a robot is defined by - /// (8 pixels / turn). - /// - ///

- public double Velocity - { - get - { - if (peer != null) - { - return peer.GetVelocity(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - public virtual void OnBulletHit(BulletHitEvent evnt) - { - } - - /// - public virtual void OnBulletHitBullet(BulletHitBulletEvent evnt) - { - } - - /// - public virtual void OnBulletMissed(BulletMissedEvent evnt) - { - } - - /// - public virtual void OnDeath(DeathEvent evnt) - { - } - - /// - public virtual void OnHitByBullet(HitByBulletEvent evnt) - { - } - - /// - public virtual void OnHitRobot(HitRobotEvent evnt) - { - } - - /// - public virtual void OnHitWall(HitWallEvent evnt) - { - } - - /// - public virtual void OnRobotDeath(RobotDeathEvent evnt) - { - } - - /// - public virtual void OnScannedRobot(ScannedRobotEvent evnt) - { - } - - /// - public virtual void OnWin(WinEvent evnt) - { - } - - /// - public virtual void OnRoundEnded(RoundEndedEvent evnt) - { - } - - /// - public virtual void OnBattleEnded(BattleEndedEvent evnt) - { - } - - /// - /// - /// Scans for other robots. This method is called automatically by the game, - /// as long as the robot is moving, turning its body, turning its gun, or - /// turning its radar. - ///

- /// Scan will cause - /// to be called if you see a robot. - ///

- /// There are 2 reasons to call manually: - ///

    - ///
  1. - /// You want to scan after you stop moving. - ///
  2. - ///
  3. - /// You want to interrupt the - /// event. This is more likely. If you are in - /// and call - /// , and you still see a robot, then the system will interrupt your - /// event immediately and start it - /// from the top. - ///
  4. - ///
- ///

- /// This call executes immediately. - /// - /// - ///

- public void Scan() - { - if (peer != null) - { - peer.Rescan(); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the gun to turn independent from the robot's turn. - ///

- /// Ok, so this needs some explanation: The gun is mounted on the robot's - /// body. So, normally, if the robot turns 90 degrees to the right, then the - /// gun will turn with it as it is mounted on top of the robot's body. To - /// compensate for this, you can call - /// . - /// When this is set, the gun will turn independent from the robot's turn, - /// i.e. the gun will compensate for the robot's body turn. - ///

- /// Note: This method is additive until you reach the maximum the gun can - /// turn. The "adjust" is added to the amount you set for turning the robot, - /// then capped by the physics of the game. If you turn infinite, then the - /// adjust is ignored (and hence overridden). - ///

- /// - /// Assuming both the robot and gun start Out facing up (0 degrees): - /// - /// // Set gun to turn with the robot's turn - /// SetAdjustGunForRobotTurn(false); // This is the default - /// TurnRight(90); - /// // At this point, both the robot and gun are facing right (90 degrees) - /// TurnLeft(90); - /// // Both are back to 0 degrees - /// - /// -- or -- - /// - /// // Set gun to turn independent from the robot's turn - /// SetAdjustGunForRobotTurn(true); - /// TurnRight(90); - /// // At this point, the robot is facing right (90 degrees), but the gun is still facing up. - /// TurnLeft(90); - /// // Both are back to 0 degrees. - /// - /// - ///

- /// Note: The gun compensating this way does count as "turning the gun". - /// - ///

- public virtual bool IsAdjustGunForRobotTurn - { - get - { - if (peer != null) - { - return ((IStandardRobotPeer) peer).IsAdjustGunForBodyTurn(); - } - UninitializedException(); - return false; - } - set - { - if (peer != null) - { - ((IStandardRobotPeer) peer).SetAdjustGunForBodyTurn(value); - } - else - { - UninitializedException(); - } - } - } - - /// - /// Sets the radar to turn independent from the robot's turn. - ///

- /// Ok, so this needs some explanation: The radar is mounted on the gun, and - /// the gun is mounted on the robot's body. So, normally, if the robot turns - /// 90 degrees to the right, the gun turns, as does the radar. Hence, if the - /// robot turns 90 degrees to the right, then the gun and radar will turn - /// with it as the radar is mounted on top of the gun. To compensate for - /// this, you can call = true. - /// When this is set, the radar will turn independent from the robot's turn, - /// i.e. the radar will compensate for the robot's turn. - ///

- /// Note: This method is additive until you reach the maximum the radar can - /// turn. The "adjust" is added to the amount you set for turning the robot, - /// then capped by the physics of the game. If you turn infinite, then the - /// adjust is ignored (and hence overridden). - ///

- /// - /// Assuming the robot, gun, and radar all start Out facing up (0 - /// degrees): - /// - /// // Set radar to turn with the robots's turn - /// SetAdjustRadarForRobotTurn(false); // This is the default - /// TurnRight(90); - /// // At this point, the body, gun, and radar are all facing right (90 degrees); - /// - /// -- or -- - /// - /// // Set radar to turn independent from the robot's turn - /// SetAdjustRadarForRobotTurn(true); - /// TurnRight(90); - /// // At this point, the robot and gun are facing right (90 degrees), but the radar is still facing up. - /// - /// - /// - /// - ///

- public bool IsAdjustRadarForRobotTurn - { - get - { - if (peer != null) - { - return ((IStandardRobotPeer) peer).IsAdjustRadarForBodyTurn(); - } - UninitializedException(); - return false; - } - set - { - if (peer != null) - { - ((IStandardRobotPeer) peer).SetAdjustRadarForBodyTurn(value); - } - else - { - UninitializedException(); - } - } - } - - /// - /// Sets the radar to turn independent from the gun's turn. - ///

- /// Ok, so this needs some explanation: The radar is mounted on the robot's - /// gun. So, normally, if the gun turns 90 degrees to the right, then the - /// radar will turn with it as it is mounted on top of the gun. To compensate - /// for this, you can call = (true). - /// When this is set, the radar will turn independent from the robot's turn, - /// i.e. the radar will compensate for the gun's turn. - ///

- /// Note: This method is additive until you reach the maximum the radar can - /// turn. The "adjust" is added to the amount you set for turning the gun, - /// then capped by the physics of the game. If you turn infinite, then the - /// adjust is ignored (and hence overridden). - ///

- /// - /// Assuming both the gun and radar start Out facing up (0 degrees): - /// - /// // Set radar to turn with the gun's turn - /// SetAdjustRadarForGunTurn(false); // This is the default - /// TurnGunRight(90); - /// // At this point, both the radar and gun are facing right (90 degrees); - /// - /// -- or -- - /// - /// // Set radar to turn independent from the gun's turn - /// SetAdjustRadarForGunTurn(true); - /// TurnGunRight(90); - /// // At this point, the gun is facing right (90 degrees), but the radar is still facing up. - /// - /// - /// Note: Calling will automatically call - /// with the same value, unless you have - /// already called it earlier. This behavior is primarily for backward compatibility - /// with older Robocode robots. - /// - /// - ///

- public bool IsAdjustRadarForGunTurn - { - get - { - if (peer != null) - { - return ((IStandardRobotPeer) peer).IsAdjustRadarForGunTurn(); - } - UninitializedException(); - return false; - } - set - { - if (peer != null) - { - ((IStandardRobotPeer) peer).SetAdjustRadarForGunTurn(value); - } - else - { - UninitializedException(); - } - } - } - - /// - /// Sets the color of the robot's body, gun, and radar in the same time. - ///

- /// You may only call this method one time per battle. A null - /// indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetColors(null, Color.Red, Color.fromArgb(150, 0, 150)); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// The new body color - /// The new gun color - /// The new radar color - public void SetColors(Color bodyColor, Color gunColor, Color radarColor) - { - if (peer != null) - { - peer.SetBodyColor(bodyColor); - peer.SetGunColor(gunColor); - peer.SetRadarColor(radarColor); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the color of the robot's body, gun, radar, bullet, and scan arc in - /// the same time. - ///

- /// You may only call this method one time per battle. A null - /// indicates the default (blue) color for the body, gun, radar, and scan - /// arc, but white for the bullet color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetColors(null, Color.Red, Color.Greeen, null, Color.fromArgb(150, 0, 150)); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// The new body color - /// The new gun color - /// The new radar color - /// The new bullet color - /// The new scan arc color - public void SetColors(Color bodyColor, Color gunColor, Color radarColor, Color bulletColor, Color scanArcColor) - { - if (peer != null) - { - peer.SetBodyColor(bodyColor); - peer.SetGunColor(gunColor); - peer.SetRadarColor(radarColor); - peer.SetBulletColor(bulletColor); - peer.SetScanColor(scanArcColor); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets all the robot's color to the same color in the same time, i.e. the - /// color of the body, gun, radar, bullet, and scan arc. - ///

- /// You may only call this method one time per battle. A null - /// indicates the default (blue) color for the body, gun, radar, and scan - /// arc, but white for the bullet color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetAllColors(Color.Red); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// The new color for all the colors of the robot - public void SetAllColors(Color color) - { - if (peer != null) - { - peer.SetBodyColor(color); - peer.SetGunColor(color); - peer.SetRadarColor(color); - peer.SetBulletColor(color); - peer.SetScanColor(color); - } - else - { - UninitializedException(); - } - } - - /// - /// Sets the color of the robot's body. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetBodyColor(Color.Black); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public Color BodyColor - { - set - { - if (peer != null) - { - peer.SetBodyColor(value); - } - else - { - UninitializedException(); - } - } - get - { - if (peer != null) - { - return peer.GetBodyColor(); - } - UninitializedException(); - return default(Color); - } - } - - /// - /// - /// Sets the color of the robot's gun. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetGunColor(Color.Red); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public Color GunColor - { - set - { - if (peer != null) - { - peer.SetGunColor(value); - } - else - { - UninitializedException(); - } - } - get - { - if (peer != null) - { - return peer.GetGunColor(); - } - UninitializedException(); - return default(Color); - } - } - - /// - /// - /// Sets the color of the robot's radar. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetRadarColor(Color.Yellow); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public Color RadarColor - { - set - { - if (peer != null) - { - peer.SetRadarColor(value); - } - else - { - UninitializedException(); - } - } - get - { - if (peer != null) - { - return peer.GetRadarColor(); - } - UninitializedException(); - return default(Color); - } - } - - /// - /// - /// Sets the color of the robot's bullets. - ///

- /// A null indicates the default white color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetBulletColor(Color.Green); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public Color BulletColor - { - set - { - if (peer != null) - { - peer.SetBulletColor(value); - } - else - { - UninitializedException(); - } - } - get - { - if (peer != null) - { - return peer.GetBulletColor(); - } - UninitializedException(); - return default(Color); - } - } - - /// - /// - /// Sets the color of the robot's scan arc. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetScanColor(Color.White); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- public Color ScanColor - { - set - { - if (peer != null) - { - peer.SetScanColor(value); - } - else - { - UninitializedException(); - } - } - get - { - if (peer != null) - { - return peer.GetScanColor(); - } - UninitializedException(); - return default(Color); - } - } - - /// - /// - /// Immediately stops all movement, and saves it for a call to . - /// If there is already movement saved from a previous stop, this will have no effect. - ///

- /// This method is equivalent to Stop(false). - /// - /// - ///

- public void Stop() - { - Stop(false); - } - - /// - /// Immediately stops all movement, and saves it for a call to . - /// If there is already movement saved from a previous stop, you can overwrite it by - /// calling Stop(true). - /// - /// - /// - /// - /// If there is already movement saved from a previous stop, you can overwrite it by - /// calling Stop(true). - /// - public void Stop(bool overwrite) - { - if (peer != null) - { - ((IStandardRobotPeer) peer).Stop(overwrite); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately resumes the movement you stopped by , if any. - ///

- /// This call executes immediately, and does not return until it is complete. - /// - /// - ///

- public void Resume() - { - if (peer != null) - { - ((IStandardRobotPeer) peer).Resume(); - } - else - { - UninitializedException(); - } - } - - /// - /// - /// Immediately turns the robot's gun to the left by degrees. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the gun's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn right - /// instead of left. - ///

- /// - /// - /// // Turn the robot's gun 180 degrees to the left - /// TurnGunLeft(180); - /// - /// // Afterwards, turn the robot's gun 90 degrees to the right - /// TurnGunLeft(-90); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's gun to the left. - /// If degrees > 0 the robot's gun will turn left. - /// If degrees < 0 the robot's gun will turn right. - /// If degrees = 0 the robot's gun will not turn, but execute. - /// - public void TurnGunLeft(double degrees) - { - if (peer != null) - { - peer.TurnGun(-Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// - /// Immediately turns the robot's gun to the right by degrees. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the gun's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's gun is set to turn left - /// instead of right. - ///

- /// - /// - /// // Turn the robot's gun 180 degrees to the right - /// TurnGunRight(180); - /// - /// // Afterwards, turn the robot's gun 90 degrees to the left - /// TurnGunRight(-90); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's gun to the right. - /// If degrees > 0 the robot's gun will turn right. - /// If degrees < 0 the robot's gun will turn left. - /// If degrees = 0 the robot's gun will not turn, but execute. - /// - public void TurnGunRight(double degrees) - { - if (peer != null) - { - peer.TurnGun(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Immediately turns the robot's radar to the left by degrees. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the radar's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn right - /// instead of left. - ///

- /// - /// - /// // Turn the robot's radar 180 degrees to the left - /// TurnRadarLeft(180); - /// - /// // Afterwards, turn the robot's radar 90 degrees to the right - /// TurnRadarLeft(-90); - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's radar to the left. - /// If degrees > 0 the robot's radar will turn left. - /// If degrees < 0 the robot's radar will turn right. - /// If degrees = 0 the robot's radar will not turn, but execute. - /// - public void TurnRadarLeft(double degrees) - { - if (peer != null) - { - ((IStandardRobotPeer) peer).TurnRadar(-Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// - /// Immediately turns the robot's radar to the right by degrees. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the radar's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, - /// where negative values means that the robot's radar is set to turn left - /// instead of right. - ///

- /// - /// - /// // Turn the robot's radar 180 degrees to the right - /// TurnRadarRight(180); - /// - /// // Afterwards, turn the robot's radar 90 degrees to the left - /// TurnRadarRight(-90); - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of degrees to turn the robot's radar to the right. - /// If degrees > 0 the robot's radar will turn right. - /// If degrees < 0 the robot's radar will turn left. - /// If degrees = 0 the robot's radar will not turn, but execute. - /// - public void TurnRadarRight(double degrees) - { - if (peer != null) - { - ((IStandardRobotPeer) peer).TurnRadar(Utils.ToRadians(degrees)); - } - else - { - UninitializedException(); - } - } - - /// - /// Returns the robot's current energy. - /// - public double Energy - { - get - { - if (peer != null) - { - return peer.GetEnergy(); - } - UninitializedException(); - return 0; // never called - } - } - - /// - /// Returns a graphics context used for painting graphical items for the robot. - ///

- /// This method is very useful for debugging your robot. - ///

- /// Note that the robot will only be painted if the "Paint" is enabled on the - /// robot's console window; otherwise the robot will never get painted (the - /// reason being that all robots might have graphical items that must be - /// painted, and then you might not be able to tell what graphical items that - /// have been painted for your robot). - ///

- /// Also note that the coordinate system for the graphical context where you - /// paint items fits for the Robocode coordinate system where (0, 0) is at - /// the bottom left corner of the battlefield, where X is towards right and Y - /// is upwards. - /// - ///

- public IGraphics Graphics - { - get - { - if (peer != null) - { - return peer.GetGraphics(); - } - UninitializedException(); - return null; // never called - } - } - - /// - /// Sets the debug property with the specified key to the specified value. - ///

- /// This method is very useful when debugging or reviewing your robot as you - /// will be able to see this property displayed in the robot console for your - /// robots under the Debug Properties tab page. - ///

- public DebugPropertyH DebugProperty - { - get - { - if (peer != null) - { - if (debugProperty == null) - { - debugProperty = new DebugPropertyH(peer); - } - return debugProperty; - } - UninitializedException(); - return null; - } - } - - private DebugPropertyH debugProperty; - - /// - /// Container class for debug properties - /// - public class DebugPropertyH - { - private readonly IBasicRobotPeer peer; - - internal DebugPropertyH(IBasicRobotPeer peer) - { - this.peer = peer; - } - - /// - /// Set the new value of the debug property, where null or - /// the empty string is used for removing this debug property. - /// - /// - /// The name/key of the debug property - /// - /// - public string this[string key] - { - set { peer.SetDebugProperty(key, value); } - } - } - - - /// - public virtual void OnPaint(IGraphics graphics) - { - } - - /// - public virtual void OnKeyPressed(KeyEvent e) - { - } - - /// - public virtual void OnKeyReleased(KeyEvent e) - { - } - - /// - public virtual void OnKeyTyped(KeyEvent e) - { - } - - /// - public virtual void OnMouseClicked(MouseEvent e) - { - } - - /// - public virtual void OnMouseEntered(MouseEvent e) - { - } - - /// - public virtual void OnMouseExited(MouseEvent e) - { - } - - /// - public virtual void OnMousePressed(MouseEvent e) - { - } - - /// - public virtual void OnMouseReleased(MouseEvent e) - { - } - - /// - public virtual void OnMouseMoved(MouseEvent e) - { - } - - /// - public virtual void OnMouseDragged(MouseEvent e) - { - } - - /// - public virtual void OnMouseWheelMoved(MouseWheelMovedEvent e) - { - } - - /// - public virtual void OnStatus(StatusEvent e) - { - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotDeathEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotDeathEvent.cs deleted file mode 100644 index e93c3cf..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotDeathEvent.cs +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to - /// when another robot (not your robot) dies. - /// - [Serializable] - public sealed class RobotDeathEvent : Event - { - private const int DEFAULT_PRIORITY = 70; - - private readonly string robotName; - - /// - /// Called by the game to create a new RobotDeathEvent. - /// - /// the name of the robot that died - public RobotDeathEvent(string robotName) - { - this.robotName = robotName; - } - - /// - /// Returns the name of the robot that died. - /// - public string Name - { - get { return robotName; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnRobotDeath(this); - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.RobotDeathEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (RobotDeathEvent) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + serializer.sizeOf(obj.robotName); - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (RobotDeathEvent) objec; - - serializer.serialize(buffer, obj.robotName); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - string name = serializer.deserializeString(buffer); - - return new RobotDeathEvent(name); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotStatus.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotStatus.cs deleted file mode 100644 index 0d6be6e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RobotStatus.cs +++ /dev/null @@ -1,401 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.security; -using net.sf.robocode.serialization; -using Robocode.Util; - -namespace Robocode -{ - /// - /// Contains the status of a robot for a specific time/turn returned by - /// . - /// - [Serializable] - public sealed class RobotStatus - { - private readonly double energy; - private readonly double x; - private readonly double y; - private readonly double bodyHeading; - private readonly double gunHeading; - private readonly double radarHeading; - private readonly double velocity; - private readonly double bodyTurnRemaining; - private readonly double radarTurnRemaining; - private readonly double gunTurnRemaining; - private readonly double distanceRemaining; - private readonly double gunHeat; - private readonly int others; - private readonly int numSentries; - private readonly int roundNum; - private readonly int numRounds; - private readonly long time; - - /// - /// Returns the robot's current energy. - /// - public double Energy - { - get { return energy; } - } - - /// - /// Returns the X position of the robot. (0,0) is at the bottom left of the - /// battlefield. - /// - /// - public double X - { - get { return x; } - } - - /// - /// Returns the Y position of the robot. (0,0) is at the bottom left of the - /// battlefield. - /// - /// - public double Y - { - get { return y; } - } - - /// - /// Returns the direction that the robot's body is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - ///

- public double HeadingRadians - { - get { return bodyHeading; } - } - - /// - /// Returns the direction that the robot's body is facing, in degrees. - /// The value returned will be between 0 and 360 (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// 90 means East, 180 means South, and 270 means West. - ///

- public double Heading - { - get { return Utils.ToDegrees(bodyHeading); } - } - - /// - /// Returns the direction that the robot's gun is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - ///

- public double GunHeadingRadians - { - get { return gunHeading; } - } - - /// - /// Returns the direction that the robot's gun is facing, in degrees. - /// The value returned will be between 0 and 360 (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// 90 means East, 180 means South, and 270 means West. - ///

- public double GunHeading - { - get { return Utils.ToDegrees(gunHeading); } - } - - /// - /// Returns the direction that the robot's radar is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - ///

- public double RadarHeadingRadians - { - get { return radarHeading; } - } - - /// - /// Returns the direction that the robot's radar is facing, in degrees. - /// The value returned will be between 0 and 360 (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// 90 means East, 180 means South, and 270 means West. - ///

- public double RadarHeading - { - get { return Utils.ToDegrees(radarHeading); } - } - - /// - /// Returns the velocity of the robot measured in pixels/turn. - ///

- /// The maximum velocity of a robot is defined by - /// (8 pixels / turn). - /// - ///

- public double Velocity - { - get { return velocity; } - } - - /// - /// Returns the angle remaining in the robots's turn, in radians. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the robot is currently turning to the right. - /// Negative values means that the robot is currently turning to the left. - ///

- public double TurnRemainingRadians - { - get { return bodyTurnRemaining; } - } - - /// - /// Returns the angle remaining in the robots's turn, in degrees. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the robot is currently turning to the right. - /// Negative values means that the robot is currently turning to the left. - ///

- public double TurnRemaining - { - get { return Utils.ToDegrees(bodyTurnRemaining); } - } - - /// - /// Returns the angle remaining in the radar's turn, in radians. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the radar is currently turning to the right. - /// Negative values means that the radar is currently turning to the left. - ///

- public double RadarTurnRemainingRadians - { - get { return radarTurnRemaining; } - } - - /// - /// Returns the angle remaining in the radar's turn, in degrees. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the radar is currently turning to the right. - /// Negative values means that the radar is currently turning to the left. - ///

- public double RadarTurnRemaining - { - get { return Utils.ToDegrees(radarTurnRemaining); } - } - - /// - /// Returns the angle remaining in the gun's turn, in radians. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the gun is currently turning to the right. - /// Negative values means that the gun is currently turning to the left. - ///

- public double GunTurnRemainingRadians - { - get { return gunTurnRemaining; } - } - - /// - /// Returns the angle remaining in the gun's turn, in degrees. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the gun is currently turning to the right. - /// Negative values means that the gun is currently turning to the left. - ///

- public double GunTurnRemaining - { - get { return Utils.ToDegrees(gunTurnRemaining); } - } - - /// - /// Returns the distance remaining in the robot's current move measured in - /// pixels. - ///

- /// This call returns both positive and negative values. - /// Positive values means that the robot is currently moving forwards. - /// Negative values means that the robot is currently moving backwards. - ///

- public double DistanceRemaining - { - get { return distanceRemaining; } - } - - /// - /// Returns the current heat of the gun. The gun cannot Fire unless this is - /// 0. (Calls to Fire will succeed, but will not actually Fire unless - /// GetGunHeat() == 0). - ///

- /// The amount of gun heat generated when the gun is fired is - /// 1 + (firePower / 5). Each turn the gun heat drops by the amount returned - /// by , which is a battle setup. - ///

- /// Note that all guns are "hot" at the start of each round, where the gun - /// heat is 3. - ///

- /// - /// - /// - public double GunHeat - { - get { return gunHeat; } - } - - /// - /// Returns how many opponents that are left in the current round. - /// - public int Others - { - get { return others; } - } - - /// - /// Returns how many sentry robots that are left in the current round. - /// - public int NumSentries - { - get { return numSentries; } - } - - /// - /// Returns the number of rounds in the current battle. - /// - /// - public int NumRounds - { - get { return numRounds; } - } - - /// - /// Returns the current round number (0 to - 1) of - /// the battle. - /// - /// - public int RoundNum - { - get { return roundNum; } - } - - /// - /// Returns the game time of the round, where the time is equal to the current turn in the round. - /// - public long Time - { - get { return time; } - } - - private RobotStatus(double energy, double x, double y, double bodyHeading, double gunHeading, - double radarHeading, - double velocity, double bodyTurnRemaining, double radarTurnRemaining, - double gunTurnRemaining, - double distanceRemaining, double gunHeat, - int others, int numSentries, - int roundNum, int numRounds, long time) - { - this.energy = energy; - this.x = x; - this.y = y; - this.bodyHeading = bodyHeading; - this.gunHeading = gunHeading; - this.radarHeading = radarHeading; - this.bodyTurnRemaining = bodyTurnRemaining; - this.velocity = velocity; - this.radarTurnRemaining = radarTurnRemaining; - this.gunTurnRemaining = gunTurnRemaining; - this.distanceRemaining = distanceRemaining; - this.gunHeat = gunHeat; - this.others = others; - this.numSentries = numSentries; - this.roundNum = roundNum; - this.numRounds = numRounds; - this.time = time; - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN, IHiddenStatusHelper - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + 12*RbSerializerN.SIZEOF_DOUBLE + 4*RbSerializerN.SIZEOF_INT - + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (RobotStatus) objec; - - serializer.serialize(buffer, obj.energy); - serializer.serialize(buffer, obj.x); - serializer.serialize(buffer, obj.y); - serializer.serialize(buffer, obj.bodyHeading); - serializer.serialize(buffer, obj.gunHeading); - serializer.serialize(buffer, obj.radarHeading); - serializer.serialize(buffer, obj.velocity); - serializer.serialize(buffer, obj.bodyTurnRemaining); - serializer.serialize(buffer, obj.radarTurnRemaining); - serializer.serialize(buffer, obj.gunTurnRemaining); - serializer.serialize(buffer, obj.distanceRemaining); - serializer.serialize(buffer, obj.gunHeat); - serializer.serialize(buffer, obj.others); - serializer.serialize(buffer, obj.numSentries); - serializer.serialize(buffer, obj.roundNum); - serializer.serialize(buffer, obj.numRounds); - serializer.serialize(buffer, obj.time); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - double energy = buffer.getDouble(); - double x = buffer.getDouble(); - double y = buffer.getDouble(); - double bodyHeading = buffer.getDouble(); - double gunHeading = buffer.getDouble(); - double radarHeading = buffer.getDouble(); - double velocity = buffer.getDouble(); - double bodyTurnRemaining = buffer.getDouble(); - double radarTurnRemaining = buffer.getDouble(); - double gunTurnRemaining = buffer.getDouble(); - double distanceRemaining = buffer.getDouble(); - double gunHeat = buffer.getDouble(); - int others = buffer.getInt(); - int numSentries = buffer.getInt(); - int roundNum = buffer.getInt(); - int numRounds = buffer.getInt(); - long time = buffer.getLong(); - - return new RobotStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, bodyTurnRemaining, - radarTurnRemaining, gunTurnRemaining, distanceRemaining, gunHeat, others, numSentries, - roundNum, numRounds, time); - } - - public RobotStatus createStatus(double energy, double x, double y, double bodyHeading, double gunHeading, - double radarHeading, double velocity, double bodyTurnRemaining, - double radarTurnRemaining, double gunTurnRemaining, double distanceRemaining, - double gunHeat, int others, int numSentries, int roundNum, int numRounds, long time) - { - return new RobotStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, bodyTurnRemaining, - radarTurnRemaining, gunTurnRemaining, distanceRemaining, gunHeat, others, numSentries, - roundNum, numRounds, time); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RoundEndedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RoundEndedEvent.cs deleted file mode 100644 index 5554c77..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/RoundEndedEvent.cs +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A RoundEndedEvent is sent to when a round has ended. - /// You can use the information contained in this event to determine which round that has ended. - /// - /// - public class RoundEndedEvent : Event - { - private const int DEFAULT_PRIORITY = 110; // System event -> cannot be changed! - - private readonly int round; - private readonly int turns; - private readonly int totalTurns; - - - /// - /// Called by the game to create a new RoundEndedEvent. - /// - /// The round that has ended (zero-indexed) - /// The number of turns that this round reached - /// The total number of turns reached in the battle when this round ended - public RoundEndedEvent(int round, int turns, int totalTurns) - { - this.round = round; - this.turns = turns; - this.totalTurns = totalTurns; - } - - /// - /// The round that ended (zero-indexed). - /// - public int Round - { - get { return round; } - } - - /// - /// The number of turns that this round reached. - /// - public int Turns - { - get { return turns; } - } - - /// - /// The total number of turns reached in the battle when this round ended. - /// - public int TotalTurns - { - get { return totalTurns; } - } - - internal override sealed int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - /// - public override sealed int Priority - { - get { return DEFAULT_PRIORITY; } - } - - internal override sealed void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (robot != null) - { - IBasicEvents3 listener = robot.GetBasicEventListener() as IBasicEvents3; - - - if (listener != null) - { - listener.OnRoundEnded(this); - } - } - } - - internal override sealed bool IsCriticalEvent - { - get { return true; } - } - - internal override byte SerializationType - { - get { return RbSerializerN.RoundEndedEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, Object obje) - { - return RbSerializerN.SIZEOF_TYPEINFO + 3*RbSerializerN.SIZEOF_INT; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, Object obje) - { - RoundEndedEvent evnt = (RoundEndedEvent) obje; - - serializer.serialize(buffer, evnt.round); - serializer.serialize(buffer, evnt.turns); - serializer.serialize(buffer, evnt.totalTurns); - } - - public Object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int round = serializer.deserializeInt(buffer); - int turns = serializer.deserializeInt(buffer); - int totalTurns = serializer.deserializeInt(buffer); - - return new RoundEndedEvent(round, turns, totalTurns); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Rules.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Rules.cs deleted file mode 100644 index 50af6b4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Rules.cs +++ /dev/null @@ -1,214 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode.Util; - -namespace Robocode -{ - /// - /// Constants and methods that defines the rules of Robocode. - /// Constants are used for rules that will not change. - /// Methods are provided for rules that can be changed between battles or which depends - /// on some other factor. - /// - public static class Rules - { - // Hide the constructor in the docs as it should not be used - - /// - /// The acceleration of a robot, i.e. the increase of velocity when the - /// robot moves forward, which is 1 pixel/turn. - /// - public static readonly double ACCELERATION = 1; - - /// - /// The deceleration of a robot, i.e. the decrease of velocity when the - /// robot moves backwards (or brakes), which is 2 pixels/turn. - /// - public static readonly double DECELERATION = 2; - - /// - /// The maximum velocity of a robot, which is 8 pixels/turn. - /// - public static readonly double MAX_VELOCITY = 8; - - /// - /// The radar scan radius, which is 1200 pixels. - /// Robots which is more than 1200 pixels away cannot be seen on the radar. - /// - public static readonly double RADAR_SCAN_RADIUS = 1200; - - /// - /// The minimum bullet power, i.e the amount of energy required for firing a - /// bullet, which is 0.1 energy points. - /// - public static readonly double MIN_BULLET_POWER = 0.1; - - /// - /// The maximum bullet power, i.e. the maximum amount of energy that can be - /// transferred to a bullet when it is fired, which is 3 energy points. - /// - public static readonly double MAX_BULLET_POWER = 3; - - /// - /// The maximum turning rate of the robot, in degrees, which is - /// 10 degress/turn. - /// Note, that the turn rate of the robot depends on it's velocity. - /// - /// - /// - /// - public static readonly double MAX_TURN_RATE = 10; - - /// - /// The maximum turning rate of the robot measured in radians instead of - /// degrees. - /// - /// - /// - /// - /// - public static readonly double MAX_TURN_RATE_RADIANS = Utils.ToRadians(MAX_TURN_RATE); - - /// - /// The turning rate of the gun measured in degrees, which is 20 degrees/turn. - /// Note, that if AdjustGunForRobotTurn = true has been set, the gun turn is - /// independent of the robot turn. In this case the gun moves relatively to the screen. - ///

- /// If AdjustGunForRobotTurn = false has been set or AdjustGunForRobotTurn has not - /// been called at all (this is the default), then the gun turn is dependent on - /// the robot turn, and in this case the gun moves relatively to the robot body. - /// - /// - /// - ///

- public static readonly double GUN_TURN_RATE = 20; - - /// - /// The turning rate of the gun measured in radians instead of degrees. - /// - /// - /// - public static readonly double GUN_TURN_RATE_RADIANS = Utils.ToRadians(GUN_TURN_RATE); - - /// - /// The turning rate of the radar measured in degrees, which is 45 degrees/turn. - /// Note, that if AdjustRadarForRobotTurn = true and/or - /// AdjustRadarForGunTurn = true has been set, the radar turn is independent of - /// the robot and/or gun turn. If both properties hava been set to true, the radar - /// moves relatively to the screen. - ///

- /// If AdjustRadarForRobotTurn = false and/or AdjustRadarForGunTurn = false - /// have been set or not set at all (this is the default), then the radar turn is - /// dependent on the robot and/or gun turn, and in this case the radar moves - /// relatively to the gun and/or robot body. - /// - /// - /// - /// - ///

- public static readonly double RADAR_TURN_RATE = 45; - - /// - /// The turning rate of the radar measured in radians instead of degrees. - /// - /// - /// - public static readonly double RADAR_TURN_RATE_RADIANS = Utils.ToRadians(RADAR_TURN_RATE); - - /// - /// The amount of damage taken when a robot hits or is hit by another robot, - /// which is 0.6 energy points. - /// - public static readonly double ROBOT_HIT_DAMAGE = 0.6; - - /// - /// The amount of bonus given when a robot moving forward hits an opponent - /// robot (ramming), which is 1.2 energy points. - /// - public static readonly double ROBOT_HIT_BONUS = 1.2; - - /// - /// Returns the turn rate of a robot given a specific velocity measured in - /// degrees/turn. - /// - /// - /// The velocity of the robot. - public static double GetTurnRate(double velocity) - { - return MAX_TURN_RATE - 0.75*velocity; - } - - /// - /// Returns the turn rate of a robot given a specific velocity measured in - /// radians/turn. - /// - /// - /// the velocity of the robot. - public static double GetTurnRateRadians(double velocity) - { - return Utils.ToRadians(GetTurnRate(velocity)); - } - - /// - /// Returns the amount of damage taken when robot hits a wall with a - /// specific velocity. - /// - /// the velocity of the robot. - public static double GetWallHitDamage(double velocity) - { - return Math.Max(Math.Abs(velocity)/2 - 1, 0); - } - - /// - /// Returns the amount of damage of a bullet given a specific bullet power. - /// - /// the energy power of the bullet. - public static double GetBulletDamage(double bulletPower) - { - double damage = 4*bulletPower; - - if (bulletPower > 1) - { - damage += 2*(bulletPower - 1); - } - return damage; - } - - /// - /// Returns the amount of bonus given when a robot's bullet hits an opponent - /// robot given a specific bullet power. - /// - /// the energy power of the bullet - public static double GetBulletHitBonus(double bulletPower) - { - return 3*bulletPower; - } - - /// - /// Returns the speed of a bullet given a specific bullet power measured in - /// pixels/turn. - /// - /// the energy power of the bullet. - public static double GetBulletSpeed(double bulletPower) - { - bulletPower = Math.Min(Math.Max(bulletPower, MIN_BULLET_POWER), MAX_BULLET_POWER); - return 20 - 3 * bulletPower; - } - - /// - /// Returns the heat produced by firing the gun given a specific bullet power. - /// - /// the energy power of the bullet - public static double GetGunHeat(double bulletPower) - { - return 1 + (bulletPower/5); - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/ScannedRobotEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/ScannedRobotEvent.cs deleted file mode 100644 index c76ff49..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/ScannedRobotEvent.cs +++ /dev/null @@ -1,238 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A ScannedRobotEvent is sent to - /// OnScannedRobot()} when you scan a robot. - /// You can use the information contained in this event to determine what to do. - ///

- /// Note: You should not inherit from this class in your own event class! - /// The internal logic of this event class might change. Hence, your robot might - /// not work in future Robocode versions, if you choose to inherit from this class. - ///

- public class ScannedRobotEvent : Event - { - private const int DEFAULT_PRIORITY = 10; - - private readonly string name; - private readonly double energy; - private readonly double heading; - private readonly double bearing; - private readonly double distance; - private readonly double velocity; - private readonly bool isSentryRobot; - - [Obsolete("ScannedRobotEvent() is obsolete.\n" + - "Please use ScannedRobotEvent(string, double, double, double, double, double, bool) instead.")] - internal ScannedRobotEvent() - : this(null, 0, 0, 0, 0, 0, false) - { - } - - /// - /// Called by the game to create a new ScannedRobotEvent. - /// - /// The name of the scanned robot - /// The energy of the scanned robot - /// The bearing of the scanned robot, in radians - /// The distance from your robot to the scanned robot - /// The heading of the scanned robot - /// The velocity of the scanned robot - [Obsolete("ScannedRobotEvent(string, double, double, double, double, double) is obsolete.\n" + - "Please use ScannedRobotEvent(string, double, double, double, double, double, bool) instead.")] - public ScannedRobotEvent(string name, double energy, double bearing, double distance, double heading, double velocity) : - this(name, energy, bearing, distance, heading, velocity, false) - { - } - - /// - /// Called by the game to create a new ScannedRobotEvent. - /// - /// The name of the scanned robot - /// The energy of the scanned robot - /// The bearing of the scanned robot, in radians - /// The distance from your robot to the scanned robot - /// The heading of the scanned robot - /// The velocity of the scanned robot - /// Flag specifying if the scanned robot is a sentry robot - public ScannedRobotEvent(string name, double energy, double bearing, double distance, double heading, double velocity, bool isSentryRobot) - { - this.name = name; - this.energy = energy; - this.bearing = bearing; - this.distance = distance; - this.heading = heading; - this.velocity = velocity; - this.isSentryRobot = isSentryRobot; - } - - /// - /// Returns the bearing to the robot you scanned, relative to your robot's - /// heading, in degrees (-180 <= getBearing() < 180) - /// - public double Bearing - { - get { return bearing*180.0/Math.PI; } - } - - /// - /// Returns the bearing to the robot you scanned, relative to your robot's - /// heading, in radians (-PI <= getBearingRadians() < PI) - /// - public double BearingRadians - { - get { return bearing; } - } - - /// - /// Returns the distance to the robot (your center to his center). - /// - public double Distance - { - get { return distance; } - } - - /// - /// Returns the energy of the robot. - /// - public double Energy - { - get { return energy; } - } - - /// - /// Returns the heading of the robot, in degrees (0 <= getHeading() < 360) - /// - public double Heading - { - get { return heading*180.0/Math.PI; } - } - - /// - /// Returns the heading of the robot, in radians (0 <= getHeading() < 2 * PI) - /// - public double HeadingRadians - { - get { return heading; } - } - - - /// - /// Returns the name of the robot. - /// - public string Name - { - get { return name; } - } - - - /// - /// Returns the velocity of the robot. - /// - public double Velocity - { - get { return velocity; } - } - - /// - /// true if the scanned robot is a sentry robot; false otherwise. - /// - public bool IsSentryRobot - { - get { return isSentryRobot; } - } - - /// - public override sealed int CompareTo(Event evnt) - { - int res = base.CompareTo(evnt); - - if (res != 0) - { - return res; - } - // Compare the distance, if the events are ScannedRobotEvents - // The shorter distance to the robot, the higher priority - if (evnt is ScannedRobotEvent) - { - return (int) (Distance - ((ScannedRobotEvent) evnt).Distance); - } - // No difference found - return 0; - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnScannedRobot(this); - } - } - - internal override byte SerializationType - { - get { return RbSerializerN.ScannedRobotEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - var obj = (ScannedRobotEvent) objec; - - return RbSerializerN.SIZEOF_TYPEINFO + serializer.sizeOf(obj.name) + 5 * RbSerializerN.SIZEOF_DOUBLE + RbSerializerN.SIZEOF_BOOL; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (ScannedRobotEvent) objec; - - serializer.serialize(buffer, obj.name); - serializer.serialize(buffer, obj.energy); - serializer.serialize(buffer, obj.heading); - serializer.serialize(buffer, obj.bearing); - serializer.serialize(buffer, obj.distance); - serializer.serialize(buffer, obj.velocity); - serializer.serialize(buffer, obj.isSentryRobot); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - string name = serializer.deserializeString(buffer); - double energy = buffer.getDouble(); - double heading = buffer.getDouble(); - double bearing = buffer.getDouble(); - double distance = buffer.getDouble(); - double velocity = buffer.getDouble(); - bool isSentryRobot = serializer.deserializeBoolean(buffer); - - return new ScannedRobotEvent(name, energy, bearing, distance, heading, velocity, isSentryRobot); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/SkippedTurnEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/SkippedTurnEvent.cs deleted file mode 100644 index a0aaef0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/SkippedTurnEvent.cs +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// A SkippedTurnEvent is sent to - /// OnSkippedTurn()} when your robot is forced to skipping a turn. - /// You must take an action every turn in order to participate in the game. - /// - /// - /// Thread.Sleep(1000); - /// - /// will cause many SkippedTurnEvents, because you are not responding to the game. - /// If you receive 30 SkippedTurnEvents, you will be removed from the round. - ///

- /// Instead, you should do something such as: - /// - /// for (int i = 0; i < 30; i++) - /// { - /// DoNothing(); // or perhaps Scan(); - /// } - /// - /// - ///

- /// This event may also be generated if you are simply doing too much processing - /// between actions, that is using too much processing power for the calculations - /// etc. in your robot. - /// - /// - ///

- public sealed class SkippedTurnEvent : Event - { - private const int DEFAULT_PRIORITY = 100; // System event -> cannot be changed!; - - private readonly long skippedTurn; - - /// - /// Called by the game to create a new SkippedTurnEvent. - /// - public SkippedTurnEvent(long skippedTurn) - { - this.skippedTurn = skippedTurn; - } - - /// - /// Returns the turn that was skipped. - /// - public long SkippedTurn - { - get { return skippedTurn; } - } - - /// - public override int Priority - { - get { return DEFAULT_PRIORITY; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - if (statics.IsAdvancedRobot()) - { - IAdvancedEvents listener = ((IAdvancedRobot) robot).GetAdvancedEventListener(); - - if (listener != null) - { - listener.OnSkippedTurn(this); - } - } - } - - internal override bool IsCriticalEvent - { - get { return true; } - } - - internal override byte SerializationType - { - get { return RbSerializerN.SkippedTurnEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_LONG; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - var obj = (SkippedTurnEvent)objec; - - serializer.serialize(buffer, obj.skippedTurn); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - long skippedTurn = buffer.getLong(); - - return new SkippedTurnEvent(skippedTurn); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/StatusEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/StatusEvent.cs deleted file mode 100644 index 84bac6a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/StatusEvent.cs +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.peer; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to every - /// turn in a battle to provide the status of the robot. - /// - [Serializable] - public sealed class StatusEvent : Event - { - private const int DEFAULT_PRIORITY = 99; - - private readonly RobotStatus status; - - /// - /// This constructor is called internally from the game in order to create - /// a new . - /// - /// - /// the current states - public StatusEvent(RobotStatus status) - { - this.status = status; - } - - /// - /// Returns the at the time defined by . - /// - /// - public RobotStatus Status - { - get { return status; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnStatus(this); - } - } - - internal override byte SerializationType - { - get { throw new System.Exception("Serialization of this type is not supported"); } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TeamRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TeamRobot.cs deleted file mode 100644 index bfa6eda..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TeamRobot.cs +++ /dev/null @@ -1,193 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Collections.Generic; -using Robocode.RobotInterfaces; -using Robocode.RobotInterfaces.Peer; - -namespace Robocode -{ - /// - /// An advanced type of robot that supports sending messages between team - /// mates in a robot team. - ///

- /// If you have not done already, you should create a or - /// first. - /// - /// - /// - /// - /// - /// - ///

- public abstract class TeamRobot : AdvancedRobot, ITeamRobot, ITeamEvents - { - - /// - /// Broadcasts a message to all teammates. - ///

- /// - /// - /// public void Run() - /// { - /// BroadcastMessage("I'm here!"); - /// } - /// - /// - ///

- /// The message to broadcast to all teammates - /// if the message could not be broadcasted to the teammates. - /// - /// - /// - /// - public void BroadcastMessage(object message) - { - if (peer != null) - { - ((ITeamRobotPeer) peer).BroadcastMessage(message); - } - else - { - UninitializedException(); - } - } - - /// - /// Returns a list containing all MessageEvents currently in the robot's queue. - /// You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (MessageEvent e in GetMessageEvents()) - /// { - /// // do something with e - /// } - /// - /// - /// - /// - ///

- public IList GetMessageEvents() - { - if (peer != null) - { - return new List(((ITeamRobotPeer) peer).GetMessageEvents()); - } - UninitializedException(); - return null; // never called - } - - /// - ITeamEvents ITeamRobot.GetTeamEventListener() - { - return this; // this robot is listening - } - - /// - /// Returns the names of all teammates, or null there is no teammates. - /// The length of the string array is equal to the number of teammates. - ///

- /// - /// - /// public void Run() - /// { - /// // Prints Out all teammates - /// string[] teammates = GetTeammates(); - /// if (teammates != null) - /// { - /// foreach (string member in teammates) - /// { - /// Out.WriteLine(member); - /// } - /// } - /// } - /// - /// - /// - /// - /// - ///

- public string[] Teammates - { - get - { - if (peer != null) - { - return ((ITeamRobotPeer) peer).GetTeammates(); - } - UninitializedException(); - return null; - } - } - - /// - /// Checks if a given robot name is the name of one of your teammates. - ///

- /// - /// - /// public void OnScannedRobot(ScannedRobotEvent e) - /// { - /// if (IsTeammate(e.Name) - /// { - /// return; - /// } - /// Fire(1); - /// } - /// - /// - /// - /// - /// - ///

- /// The robot name to check - public bool IsTeammate(string name) - { - if (peer != null) - { - return ((ITeamRobotPeer) peer).IsTeammate(name); - } - UninitializedException(); - return false; - } - - /// - public virtual void OnMessageReceived(MessageEvent evnt) - { - } - - /// - /// Sends a message to one (or more) teammates. - ///

- /// - /// - /// public void Run() - /// { - /// SendMessage("Sample.DroidBot", "I'm here!"); - /// } - /// - /// - /// - /// - /// - ///

- /// The name of the intended recipient of the message - /// The message to send - public void SendMessage(string name, object message) - { - if (peer != null) - { - ((ITeamRobotPeer) peer).SendMessage(name, message); - } - else - { - UninitializedException(); - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Thread.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Thread.cs deleted file mode 100644 index 3bcdfdd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/Thread.cs +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Threading; -using net.sf.robocode.io; -using net.sf.robocode.security; - -namespace Robocode -{ - /// - /// Wrapper for .NET Thread, secured according to robocode rules. - /// - public class Thread - { - private static readonly object syncRoot=new object(); - private static int runningCounter; - - private readonly System.Threading.Thread thread; - private readonly ParameterizedThreadStart real1; - private readonly ThreadStart real2; - - /// - /// Initializes a new instance of the Thread class - /// - /// A ThreadStart delegate that represents the methods to be invoked when this thread begins executing. - public Thread(ParameterizedThreadStart start) - { - if (start == null) - { - throw new ArgumentException("start"); - } - int id = CheckCount(); - real1 = start; - thread = new System.Threading.Thread(main); - string name = (string) AppDomain.CurrentDomain.GetData("robotName"); - if (!string.IsNullOrEmpty(name)) - { - thread.Name = name + " [" + id + "]"; - } - } - - /// - /// Initializes a new instance of the Thread class - /// - /// A ThreadStart delegate that represents the methods to be invoked when this thread begins executing. - public Thread(ThreadStart start) - { - if (start==null) - { - throw new ArgumentException("start"); - } - int id = CheckCount(); - real2 = start; - thread = new System.Threading.Thread(main); - string name = (string)AppDomain.CurrentDomain.GetData("robotName"); - if (!string.IsNullOrEmpty(name)) - { - thread.Name = name + " [" + id + "]"; - } - } - - private static int CheckCount() - { - lock (syncRoot) - { - if (runningCounter > 5) - { - string message = "Preventing " + HiddenAccessN.GetRobotName() + "from thread creation. You may only create 5 threads at same time."; - LoggerN.logError(message); - LoggerN.WriteLineToRobotsConsole(message); - throw new AccessViolationException(message); - } - runningCounter++; - return runningCounter; - } - } - - /// - /// Blocks the current thread for the specified number of milliseconds. - /// - public static void Sleep(int millisecondsTimeout) - { - System.Threading.Thread.Sleep(millisecondsTimeout); - } - - /// - /// Causes a thread to be scheduled for execution. - /// - public void Start(object param) - { - thread.Start(param); - } - - /// - /// Causes a thread to be scheduled for execution. - /// - public void Start() - { - thread.Start(null); - } - - private void main(object param) - { - try - { - if (real1!=null) - { - real1.Invoke(param); - } - real2.Invoke(); - } - catch (System.Exception ex) - { - Console.WriteLine("Undandled exception on thread " + thread.Name); - Console.WriteLine(ex); - } - finally - { - lock (syncRoot) - { - runningCounter--; - } - } - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TurnCompleteCondition.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TurnCompleteCondition.cs deleted file mode 100644 index 4a5af67..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/TurnCompleteCondition.cs +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode -{ - /// - /// A prebuilt condition you can use that indicates your robot has finished turning. - /// - /// - public class TurnCompleteCondition : Condition - { - private readonly AdvancedRobot robot; - - /// - /// Creates a new TurnCompleteCondition with default priority. - /// The default priority is 80. - /// - /// Your robot, which must be an - public TurnCompleteCondition(AdvancedRobot robot) - { - this.robot = robot; - } - - /// - /// Creates a new TurnCompleteCondition with the specified priority. - /// A condition priority is a value from 0 - 99. The higher value, the - /// higher priority. The default priority is 80. - /// - /// Your robot, which must be an - /// The priority of this condition - /// - public TurnCompleteCondition(AdvancedRobot robot, int priority) - { - this.robot = robot; - this.priority = priority; - } - - /// - /// Tests if the robot has finished turning. - /// Returns true if the robot has stopped turning; false otherwise - /// - public override bool Test() - { - return (robot.TurnRemaining == 0); - } - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/WinEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/WinEvent.cs deleted file mode 100644 index 2cd83be..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/WinEvent.cs +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.serialization; -using Robocode.RobotInterfaces; - -namespace Robocode -{ - /// - /// This event is sent to when your robot - /// wins the round in a battle. - /// - [Serializable] - public sealed class WinEvent : Event - { - private const int DEFAULT_PRIORITY = 100; // System event -> cannot be changed!; - - /// - public override int Priority - { - get { return DEFAULT_PRIORITY; } - } - - internal override int DefaultPriority - { - get { return DEFAULT_PRIORITY; } - } - - internal override void Dispatch(IBasicRobot robot, IRobotStaticsN statics, IGraphics graphics) - { - IBasicEvents listener = robot.GetBasicEventListener(); - - if (listener != null) - { - listener.OnWin(this); - } - } - - internal override bool IsCriticalEvent - { - get { return true; } - } - - internal override byte SerializationType - { - get { return RbSerializerN.WinEvent_TYPE; } - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - private class SerializableHelper : ISerializableHelperN - { - public int sizeOf(RbSerializerN serializer, object objec) - { - return RbSerializerN.SIZEOF_TYPEINFO; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object objec) - { - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - return new WinEvent(); - } - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/EventInterruptedException.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/EventInterruptedException.cs deleted file mode 100644 index b7891db..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/EventInterruptedException.cs +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Runtime.Serialization; - -namespace Robocode.Exception -{ - /// - [Serializable] - public class EventInterruptedException : System.Exception - { - private readonly int priority = int.MinValue; - - /// - /// Used by game - /// - public EventInterruptedException(int priority) - { - this.priority = priority; - } - - /// - /// Last top priority - /// - public int Priority - { - get - { - return priority; - } - } - - /// - /// Serialization constructor - /// - protected EventInterruptedException(SerializationInfo info, StreamingContext context) : - base(info, context) - { - } - - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/RobotException.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/RobotException.cs deleted file mode 100644 index 4d37cf6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/exception/RobotException.cs +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Runtime.Serialization; - -namespace Robocode.Exception -{ - /// - /// Throw this exception to stop robot - /// - /// - [Serializable] - public class RobotException : System.Exception - { - /// - /// Default constructor - /// - public RobotException() - { - } - - /// - /// Constructor with message - /// - public RobotException(string s) - : base(s) - { - } - - /// - /// Deserialization constructor - /// - protected RobotException(SerializationInfo info, StreamingContext context) : - base(info, context) - { - } - - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedEvents.cs deleted file mode 100644 index e7579e1..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedEvents.cs +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace Robocode.RobotInterfaces -{ - /// - /// An event interface for receiving advanced robot events with an - /// - /// - /// - public interface IAdvancedEvents - { - /// - /// This method is called if the robot is using too much time between - /// actions. When this event occur, the robot's turn is skipped, meaning that - /// it cannot take action anymore in this turn. - ///

- /// If you receive 30 skipped turn event, your robot will be removed from the - /// round and loose the round. - ///

- /// You will only receive this event after taking an action. So a robot in an - /// infinite loop will not receive any events, and will simply be stopped. - ///

- /// No correctly working, reasonable robot should ever receive this event - /// unless it is using too many CPU cycles. - /// - /// - ///

- /// The skipped turn event set by the game - void OnSkippedTurn(SkippedTurnEvent evnt); - - /// - /// This method is called when a custom condition is met. - ///

- /// See the sample robots for examples of use, e.g. the Sample.Target - /// robot. - /// - /// - /// - ///

- /// The custom event that occurred - void OnCustomEvent(CustomEvent evnt); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedRobot.cs deleted file mode 100644 index 392ab8d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IAdvancedRobot.cs +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces -{ - /// - /// A robot interface for creating a more advanced type of robot like - /// that is able to handle advanced robot events. - /// An advanced robot allows non-blocking calls, custom events, get notifications - /// about skipped turns, and also allow writes to the file system. - /// - /// - /// - /// - /// - /// - public interface IAdvancedRobot : IBasicRobot - { - /// - /// This method is called by the game to notify this robot about advanced - /// robot event. Hence, this method must be implemented so it returns your - /// listener. - /// - IAdvancedEvents GetAdvancedEventListener(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents.cs deleted file mode 100644 index 2d15b9c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents.cs +++ /dev/null @@ -1,270 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace Robocode.RobotInterfaces -{ - /// - /// An event interface for receiving basic robot events with an - /// . - /// - /// - public interface IBasicEvents - { - /// - /// This method is called every turn in a battle round in order to provide - /// the robot status as a complete snapshot of the robot's current state at - /// that specific time. - ///

- /// The main benefit of this method is that you'll automatically receive all - /// current data values of the robot like e.g. the x and y coordinate, - /// heading, gun heat etc., which are grouped into the exact same time/turn. - ///

- /// This is the only way to map the robots data values to a specific time. - /// For example, it is not possible to determine the exact time of the - /// robot's heading by calling first calling and then - /// afterwards, as the time might change - /// after between the and - /// call. - /// - /// - ///

- void OnStatus(StatusEvent evnt); - - /// - /// This method is called when one of your bullets hits another robot. - /// You should override it in your robot if you want to be informed of this - /// event. - ///

- /// - /// - /// public void OnBulletHit(BulletHitEvent evnt) - /// { - /// Out.WriteLine("I hit " + evnt.Name + "!"); - /// } - /// - /// - /// - /// - ///

- void OnBulletHit(BulletHitEvent evnt); - - /// - /// This method is called when one of your bullets hits another bullet. - /// You should override it in your robot if you want to be informed of this - /// event. - ///

- /// - /// - /// public void OnBulletHitBullet(BulletHitBulletEvent evnt) - /// { - /// Out.WriteLine("I hit a bullet fired by " + evnt.Bullet.Name + "!"); - /// } - /// - /// - /// - /// - ///

- void OnBulletHitBullet(BulletHitBulletEvent evnt); - - /// - /// This method is called when one of your bullets misses, i.e. hits a wall. - /// You should override it in your robot if you want to be informed of this - /// event. - ///

- /// - /// - /// public void OnBulletMissed(BulletMissedEvent evnt) - /// { - /// Out.WriteLine("Drat, I missed."); - /// } - /// - /// - /// - /// - ///

- void OnBulletMissed(BulletMissedEvent evnt); - - /// - /// This method is called if your robot dies. - ///

- /// You should override it in your robot if you want to be informed of this - /// event. Actions will have no effect if called from this section. The - /// intent is to allow you to perform calculations or print something out - /// when the robot is killed. - /// - /// - /// - /// - ///

- void OnDeath(DeathEvent evnt); - - /// - /// This method is called when your robot is hit by a bullet. - /// You should override it in your robot if you want to be informed of this - /// event. - ///

- /// - /// - /// void OnHitByBullet(HitByBulletEvent evnt) - /// { - /// Out.WriteLine(event.RobotName + " hit me!"); - /// } - /// - /// - /// - /// - ///

- void OnHitByBullet(HitByBulletEvent evnt); - - /// - /// This method is called when your robot collides with another robot. - /// You should override it in your robot if you want to be informed of this - /// event. - ///

- /// - /// - /// void OnHitRobot(HitRobotEvent evnt) - /// { - /// if (event.Bearing > -90 && evnt.Bearing <= 90) - /// { - /// Back(100); - /// } - /// else - /// { - /// Ahead(100); - /// } - /// } - /// - /// -- or perhaps, for a more advanced robot -- - /// - /// public void OnHitRobot(HitRobotEvent evnt) - /// { - /// if (event.Bearing > -90 && evnt.Bearing <= 90) - /// { - /// SetBack(100); - /// } - /// else - /// { - /// SetAhead(100); - /// } - /// } - /// - /// - ///

- /// The angle is relative to your robot's facing. So 0 is straight ahead of - /// you. - ///

- /// This event can be generated if another robot hits you, in which case - /// will return false. - /// In this case, you will not be automatically stopped by the game -- - /// but if you continue moving toward the robot you will hit it (and - /// generate another event). If you are moving away, then you won't hit it. - /// - /// - ///

- void OnHitRobot(HitRobotEvent evnt); - - /// - /// This method is called when your robot collides with a wall. - /// You should override it in your robot if you want to be informed of this - /// event. - ///

- /// The wall at the top of the screen is 0 degrees, right is 90 degrees, - /// bottom is 180 degrees, left is 270 degrees. But this event is relative to - /// your heading, so: The bearing is such that - /// will point you perpendicular to the wall. - ///

- /// - /// - /// void OnHitWall(HitWallEvent evnt) - /// { - /// Out.WriteLine("Ouch, I hit a wall bearing " + evnt.Bearing + " degrees."); - /// } - /// - /// - /// - /// - ///

- void OnHitWall(HitWallEvent evnt); - - /// - /// This method is called when your robot sees another robot, i.e. when the - /// robot's radar scan "hits" another robot. - /// You should override it in your robot if you want to be informed of this - /// event. (Almost all robots should override this!) - ///

- /// This event is automatically called if there is a robot in range of your - /// radar. - ///

- /// Note that the robot's radar can only see robot within the range defined - /// by (1200 pixels). - ///

- /// Also not that the bearing of the scanned robot is relative to your - /// robot's heading. - ///

- /// - /// - /// void OnScannedRobot(ScannedRobotEvent evnt) - /// { - /// // Assuming radar and gun are aligned... - /// if (event.Distance < 100) - /// { - /// Fire(3); - /// } - /// else - /// { - /// Fire(1); - /// } - /// } - /// - /// - ///

- /// Note:
- /// The game assists Robots in firing, as follows: - ///

    - ///
  • If the gun and radar are aligned (and were aligned last turn),
  • - ///
  • and the event is current,
  • - ///
  • and you call Fire() before taking any other actions, Robot.Fire(double) will Fire directly at the robot.
  • - ///
- ///

- /// In essence, this means that if you can see a robot, and it doesn't move, - /// then Fire will hit it. - ///

- /// AdvancedRobots will NOT be assisted in this manner, and are expected to - /// examine the event to determine if would - /// hit. (i.e. you are spinning your gun around, but by the time you get the - /// event, your gun is 5 degrees past the robot). - /// - /// - /// - ///

- void OnScannedRobot(ScannedRobotEvent evnt); - - /// - /// This method is called when another robot dies. - /// You should override it in your robot if you want to be informed of this - /// event. - /// - /// - /// - void OnRobotDeath(RobotDeathEvent evnt); - - /// - /// This method is called if your robot wins a battle. - ///

- /// Your robot could perform a victory dance here! :-) - /// - /// - /// - ///

- void OnWin(WinEvent evnt); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents2.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents2.cs deleted file mode 100644 index e08397c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents2.cs +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace Robocode.RobotInterfaces -{ - /// - /// First extended version of the interface. - /// - public interface IBasicEvents2 : IBasicEvents - { - /// - /// This method is called after end of the battle, even when the battle is aborted. - /// You should override it in your robot if you want to be informed of this event. - ///

- /// - /// - /// public void OnBattleEnded(BattleEndedEvent evnt) - /// { - /// Out.WriteLine("The battle has ended"); - /// } - /// - /// - /// - /// - /// - /// - ///

- void OnBattleEnded(BattleEndedEvent evnt); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents3.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents3.cs deleted file mode 100644 index 1352a47..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicEvents3.cs +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using Robocode; - -namespace Robocode.RobotInterfaces -{ - /// - /// Second extended version of the interface. - /// - public interface IBasicEvents3 : IBasicEvents2 - { - /// - /// This method is called after the end of a round. - /// You should override it in your robot if you want to be informed of this event. - ///

- /// - /// - /// public void OnRoundEnded(RoundEndedEvent event) - /// { - /// Out.WriteLine("The round has ended"); - /// } - /// - /// - /// - /// - /// - /// - /// - ///

- /// - void OnRoundEnded(RoundEndedEvent evnt); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicRobot.cs deleted file mode 100644 index ef3dfad..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IBasicRobot.cs +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.IO; -using Robocode.RobotInterfaces.Peer; - -namespace Robocode.RobotInterfaces -{ - /// - /// A robot interface for creating a basic type of robot like - /// that is able to receive common robot events, but not interactive events as - /// with the class. - /// A basic robot allows blocking calls only and cannot handle custom events nor - /// writes to the file system like an advanced robot. - /// - /// - /// - /// - /// - /// - public interface IBasicRobot - { - /// - /// This method is called by the game to invoke the - /// method of your robot, where the program of your robot is implemented. - /// - IRunnable GetRobotRunnable(); - - /// - /// This method is called by the game to notify this robot about basic - /// robot event. Hence, this method must be implemented so it returns your - /// listener. - /// - IBasicEvents GetBasicEventListener(); - - /// - /// Do not call this method! Your robot will simply stop interacting with - /// the game. - ///

- /// This method is called by the game. A robot peer is the object that deals - /// with game mechanics and rules, and makes sure your robot abides by them. - ///

- void SetPeer(IBasicRobotPeer peer); - - /// - /// Do not call this method! - ///

- /// This method is called by the game when setting the Out stream for your - /// robot. - ///

- void SetOut(TextWriter output); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveEvents.cs deleted file mode 100644 index b49ec7e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveEvents.cs +++ /dev/null @@ -1,183 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace Robocode.RobotInterfaces -{ - /// - /// An event interface for receiving interactive events with an . - /// - /// - public interface IInteractiveEvents - { - /// - /// This method is called when a key has been pressed. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// key events. - /// - /// - ///

- /// Holds details about current event - void OnKeyPressed(KeyEvent evnt); - - /// - /// This method is called when a key has been released. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// key events. - /// - /// - ///

- /// Holds details about current event - void OnKeyReleased(KeyEvent evnt); - - /// - /// This method is called when a key has been typed (pressed and released). - ///

- /// See the Sample.Interactive robot for an example of how to use - /// key events. - /// - /// - ///

- /// Holds details about current event - void OnKeyTyped(KeyEvent evnt); - - /// - /// This method is called when a mouse button has been clicked (pressed and - /// released). - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMouseClicked(MouseEvent evnt); - - /// - /// This method is called when the mouse has entered the battle view. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMouseEntered(MouseEvent evnt); - - /// - /// This method is called when the mouse has exited the battle view. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMouseExited(MouseEvent evnt); - - /// - /// This method is called when a mouse button has been pressed. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMousePressed(MouseEvent evnt); - - /// - /// This method is called when a mouse button has been released. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMouseReleased(MouseEvent evnt); - - /// - /// This method is called when the mouse has been moved. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMouseMoved(MouseEvent evnt); - - /// - /// This method is called when a mouse button has been pressed and then - /// dragged. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMouseDragged(MouseEvent evnt); - - /// - /// This method is called when the mouse wheel has been rotated. - ///

- /// See the Sample.Interactive robot for an example of how to use - /// mouse events. - /// - /// - /// - /// - /// - /// - /// - ///

- /// Holds details about current event - void OnMouseWheelMoved(MouseWheelMovedEvent evnt); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveRobot.cs deleted file mode 100644 index d2d0ad9..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IInteractiveRobot.cs +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces -{ - /// - /// A robot interface for creating an interactive type of robot like - /// and that is able to - /// receive interactive events from the keyboard or mouse. - /// If a robot is directly inherited from this class it will behave as similar to - /// a . If you need it to behave similar to an - /// or , you should inherit from these - /// interfaces instead, as these are inherited from this interface. - /// - /// - /// - /// - /// - /// - /// - public interface IInteractiveRobot : IBasicRobot - { - /// - /// This method is called by the game to notify this robot about interactive - /// events, i.e. keyboard and mouse events. Hence, this method must be - /// implemented so it returns your listener. - /// - IInteractiveEvents GetInteractiveEventListener(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IJuniorRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IJuniorRobot.cs deleted file mode 100644 index 127970e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IJuniorRobot.cs +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces -{ - /// - /// A robot interface for creating the most primitive robot type, which is a - /// . A junior robot is simpler than the - /// class. - ///

- /// A junior robot has a simplified model, in purpose of teaching programming - /// skills to inexperienced in programming students. - /// The simplified robot model will keep player from overwhelming of Robocode's - /// rules, programming syntax and programming concept. - ///

- /// Instead of using getters and setters, public fields are provided for - /// receiving information like the last scanned robot, the coordinate of the - /// robot etc. - ///

- /// All methods on a junior robot are blocking calls, i.e. they do not return - /// before their action has been completed and will at least take one turn to - /// Execute. - /// - /// - /// - /// - /// - ///

- public interface IJuniorRobot : IBasicRobot - { - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintEvents.cs deleted file mode 100644 index c423597..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintEvents.cs +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace Robocode.RobotInterfaces -{ - /// - /// An event interface for receiving paint events with an . - /// - /// - public interface IPaintEvents - { - /// - /// This method is called every time the robot is painted. You should - /// override this method if you want to draw items for your robot on the - /// battle field, e.g. targets, virtual bullets etc. - ///

- /// This method is very useful for debugging your robot. - ///

- /// Note that the robot will only be painted if the "Paint" is enabled on the - /// robot's console window; otherwise the robot will never get painted (the - /// reason being that all robots might have graphical items that must be - /// painted, and then you might not be able to tell what graphical items that - /// have been painted for your robot). - ///

- /// Also note that the coordinate system for the graphical context where you - /// paint items fits for the Robocode coordinate system where (0, 0) is at - /// the bottom left corner of the battlefield, where X is towards right and Y - /// is upwards. - /// - ///

- /// The graphics context to use for painting graphical items for the robot - void OnPaint(IGraphics graphics); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintRobot.cs deleted file mode 100644 index f23f9fc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IPaintRobot.cs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces -{ - /// - /// A robot interface that makes it possible for a robot to receive paint events. - /// - public interface IPaintRobot : IBasicRobot - { - /// - /// This method is called by the game to notify this robot about painting - /// events. Hence, this method must be implemented so it returns your - /// listener. - /// - IPaintEvents GetPaintEventListener(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IRunnable.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IRunnable.cs deleted file mode 100644 index a389814..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/IRunnable.cs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces -{ - /// - /// Interface to anything what could run - /// - public interface IRunnable - { - /// - /// Robot main loop or anything what could run. - /// - void Run(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamEvents.cs deleted file mode 100644 index 16723c4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamEvents.cs +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace Robocode.RobotInterfaces -{ - /// - /// An event interface for receiving robot team events with an . - /// - /// - public interface ITeamEvents - { - /// - /// This method is called when your robot receives a message from a teammate. - /// You should override it in your robot if you want to be informed of this - /// event. - ///

- /// - /// - /// public void OnMessageReceived(MessageEvent evnt) - /// { - /// Out.WriteLine(event.Sender + " sent me: " + evnt.Message); - /// } - /// - /// - /// - /// - ///

- /// The message event sent by the game - void OnMessageReceived(MessageEvent evnt); - } -} -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamRobot.cs deleted file mode 100644 index e0b3ceb..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/ITeamRobot.cs +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces -{ - /// - /// A robot interface for creating a team robot like - /// that is able to receive team events. - /// A team robot is an advanced type of robot that supports sending messages - /// between teammates that participates in a team. - /// - /// - /// - /// - /// - /// - /// - public interface ITeamRobot : IAdvancedRobot - { - /// - /// This method is called by the game to notify this robot about team events. - /// Hence, this method must be implemented so it returns your - /// listener. - /// - ITeamEvents GetTeamEventListener(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IAdvancedRobotPeer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IAdvancedRobotPeer.cs deleted file mode 100644 index e84346e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IAdvancedRobotPeer.cs +++ /dev/null @@ -1,659 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Collections.Generic; -using System.IO; - -namespace Robocode.RobotInterfaces.Peer -{ - /// - /// The advanced robot peer for advanced robot types like - /// and . - ///

- /// A robot peer is the object that deals with game mechanics and rules, and - /// makes sure your robot abides by them. - /// - /// - /// - /// - ///

- public interface IAdvancedRobotPeer : IStandardRobotPeer - { - /// - /// This call is identical to , - /// but returns immediately, and will not execute until you - /// call or take an action that executes. - ///

- /// If there is already movement saved from a previous stop, you can - /// overwrite it by calling SetStop(true). - /// - /// - /// - /// - ///

- /// true if the movement saved from a previous stop - /// should be overwritten; false otherwise. - void SetStop(bool overwrite); - - /// - /// Sets the robot to Resume the movement stopped by - /// or , if any. - ///

- /// This call returns immediately, and will not execute until you call - /// or take an action that executes. - /// - /// - /// - /// - /// - ///

- void SetResume(); - - /// - /// Sets the robot to move forward or backward by distance measured in pixels - /// when the next execution takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// or take an action that executes. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot is set to move forward, and negative - /// values means that the robot is set to move backward. If 0 is given as - /// input, the robot will stop its movement, but will have to decelerate - /// till it stands still, and will thus not be able to stop its movement - /// immediately, but eventually. - ///

- /// - /// - /// // Set the robot to move 50 pixels forward - /// SetMove(50); - /// - /// // Set the robot to move 100 pixels backward - /// // (overrides the previous order) - /// SetMove(-100); - /// - /// ... - /// // Executes the last SetMove() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The distance to move measured in pixels. - /// If distance > 0 the robot is set to move forward. - /// If distance < 0 the robot is set to move backward. - /// If distance = 0 the robot is set to stop its movement. - /// - void SetMove(double distance); - - /// - /// Sets the robot's body to turn right or left by radians when the next - /// execution takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// or take an action that - /// executes. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot's body is set to turn right, and - /// negative values means that the robot's body is set to turn left. - /// If 0 is given as input, the robot's body will stop turning. - ///

- /// - /// - /// // Set the robot's body to turn 180 degrees to the right - /// SetTurnBody(Math.PI); - /// - /// // Set the robot's body to turn 90 degrees to the left instead of right - /// // (overrides the previous order) - /// SetTurnBody(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnBody() - /// Execute(); - /// - /// - /// - /// - /// - /// - /// - ///

- /// T - /// The amount of radians to turn the robot's body. - /// If radians > 0 the robot's body is set to turn right. - /// If radians < 0 the robot's body is set to turn left. - /// If radians = 0 the robot's body is set to stop turning. - /// - void SetTurnBody(double radians); - - /// - /// Sets the robot's gun to turn right or left by radians when the next - /// execution takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// or take an action that - /// executes. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot's gun is set to turn right, and - /// negative values means that the robot's gun is set to turn left. - /// If 0 is given as input, the robot's gun will stop turning. - ///

- /// - /// - /// // Set the robot's gun to turn 180 degrees to the right - /// SetTurnGun(Math.PI); - /// - /// // Set the robot's gun to turn 90 degrees to the left instead of right - /// // (overrides the previous order) - /// SetTurnGun(-Math.PI / 2); - /// - /// ... - /// // Executes the last setTurnFun() - /// Execute(); - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of radians to turn the robot's gun. - /// If radians > 0 the robot's gun is set to turn right. - /// If radians < 0 the robot's gun is set to turn left. - /// If radians = 0 the robot's gun is set to stop turning. - /// - void SetTurnGun(double radians); - - /// - /// Sets the robot's radar to turn right or left by radians when the next - /// execution takes place. - ///

- /// This call returns immediately, and will not execute until you call - /// or take an action that - /// executes. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot's radar is set to turn right, and - /// negative values means that the robot's radar is set to turn left. - /// If 0 is given as input, the robot's radar will stop turning. - ///

- /// - /// - /// // Set the robot's radar to turn 180 degrees to the right - /// SetTurnRadar(Math.PI); - /// - /// // Set the robot's radar to turn 90 degrees to the left instead of right - /// // (overrides the previous order) - /// SetTurnRadar(-Math.PI / 2); - /// - /// ... - /// // Executes the last SetTurnRadar() - /// Execute(); - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of radians to turn the robot's radar. - /// If radians > 0 the robot's radar is set to turn right. - /// If radians < 0 the robot's radar is set to turn left. - /// If radians = 0 the robot's radar is set to stop turning. - /// - void SetTurnRadar(double radians); - - /// - /// Sets the maximum turn rate of the robot measured in degrees if the robot - /// should turn slower than (10 degress/turn). - /// - /// - /// - /// - /// - /// The new maximum turn rate of the robot measured in degrees. - /// Valid values are 0 - - /// - void SetMaxTurnRate(double newMaxTurnRate); - - /// - /// Sets the maximum velocity of the robot measured in pixels/turn if the - /// robot should move slower than (8 pixels/turn). - /// - /// - /// - /// - /// - /// The new maximum turn rate of the robot measured in pixels/turn. - /// Valid values are 0 - - /// - void SetMaxVelocity(double newMaxVelocity); - - /// - /// Does not return until a condition is met, i.e. when a returns true. - ///

- /// This call executes immediately. - ///

- /// See the Sample.Crazy robot for how this method can be used. - /// - /// - ///

- /// The condition that must be met before this call returns - void WaitFor(Condition condition); - - /// - /// Call this during an event handler to allow new events of the same - /// priority to restart the event handler. - ///

- /// - /// - /// public void OnScannedRobot(ScannedRobotEvent e) - /// { - /// Fire(1); - /// SetInterruptible(true); - /// Move(100); // If you see a robot while moving ahead, - /// // this handler will start from the top - /// // Without SetInterruptible(true), we wouldn't - /// // receive scan events at all! - /// // We'll only get here if we don't see a robot during the move. - /// Out().WriteLine("Ok, I can't see anyone"); - /// } - /// - /// - /// - /// - ///

- /// - /// true if the event handler should be interrupted if new events of - /// the same priority occurs; false otherwise - /// - void SetInterruptible(bool interruptible); - - /// - /// Sets the priority of a class of events. - ///

- /// Events are sent to the onXXX handlers in order of priority. - /// Higher priority events can interrupt lower priority events. - /// For events with the same priority, newer events are always sent first. - /// Valid priorities are 0 - 99, where 100 is reserved and 80 is the default - /// priority. - ///

- /// - /// - /// SetEventPriority("RobotDeathEvent", 15); - /// - ///

- /// - /// The default priorities are, from highest to lowest: - /// - /// : 100 (reserved) - /// : 100 (reserved) - /// : 100 (reserved) - /// : 99 - /// Key and mouse events: 98 - /// : 80 (default value) - /// : 75 - /// : 70 - /// : 60 - /// : 55 - /// : 50 - /// : 40 - /// : 30 - /// : 20 - /// : 10 - /// : 5 - /// : -1 (reserved) - /// - ///

- /// Note that you cannot change the priority for events with the special - /// priority value -1 or 100 (reserved) as these event are system events. - /// Also note that you cannot change the priority of CustomEvent. - /// Instead you must change the priority of the condition(s) for your custom - /// event(s). - /// - /// - ///

- /// The name of the event class (string) to set the priority for - /// The new priority for that event class - void SetEventPriority(string eventClass, int priority); - - /// - /// Returns the current priority of a class of events. - /// An event priority is a value from 0 - 99. The higher value, the higher - /// priority. - ///

- /// - /// - /// int myHitRobotPriority = GetEventPriority("HitRobotEvent"); - /// - ///

- /// - /// The default priorities are, from highest to lowest: - /// - /// : 100 (reserved) - /// : 100 (reserved) - /// : 100 (reserved) - /// : 99 - /// Key and mouse events: 98 - /// : 80 (default value) - /// : 75 - /// : 70 - /// : 60 - /// : 55 - /// : 50 - /// : 40 - /// : 30 - /// : 20 - /// : 10 - /// : 5 - /// : -1 (reserved) - /// - /// - ///

- /// The name of the event class (string) - int GetEventPriority(string eventClass); - - /// - /// Registers a custom event to be called when a condition is met. - /// When you are finished with your condition or just want to remove it you - /// must call . - ///

- /// - /// - /// AddCustomEvent( - /// new Condition("triggerhit", (c) => - /// { - /// return Energy <= trigger; - /// })); - /// - /// // Add our custom event based on our condition - /// AddCustomEvent(triggerHitCondition); - /// - /// - /// - /// - ///

- /// The condition that must be met. - void AddCustomEvent(Condition condition); - - /// - /// Removes a custom event that was previously added by calling . - ///

- /// - /// - /// AddCustomEvent( - /// new Condition("triggerhit", (c) => - /// { - /// return Energy <= trigger; - /// })); - /// - /// // Add our custom event based on our condition - /// AddCustomEvent(triggerHitCondition); - /// ... - /// // do something with your robot - /// ... - /// // Remove the custom event based on our condition - /// RemoveCustomEvent(triggerHitCondition); - /// - /// - /// - /// - ///

- /// - /// The condition that was previous added and that must be removed now. - /// - void RemoveCustomEvent(Condition condition); - - /// - /// Clears Out any pending events in the robot's event queue immediately. - /// - /// - /// - void clearAllEvents(); - - /// - /// Returns a list containing all events currently in the robot's queue. - /// You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (Event evnt in GetAllEvents()) - /// { - /// if (event is HitRobotEvent) - /// { - /// // do something with the event - /// } - /// else if (event is HitByBulletEvent) - /// { - /// // do something with the event - /// } - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- IList GetAllEvents(); - - /// - /// Returns a list containing all StatusEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (StatusEvent evnt inGetStatusEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetStatusEvents(); - - /// - /// Returns a list containing all BulletMissedEvents currently in the - /// robot's queue. You might, for example, call this while processing another - /// event. - ///

- /// - /// - /// foreach (BulletMissedEvent evnt inGetBulletMissedEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetBulletMissedEvents(); - - /// - /// Returns a list containing all BulletHitBulletEvents currently in the - /// robot's queue. You might, for example, call this while processing another - /// event. - ///

- /// - /// - /// foreach (BulletHitBulletEvent evnt inGetBulletHitBulletEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetBulletHitBulletEvents(); - - /// - /// Returns a list containing all BulletHitEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (BulletHitEvent event: GetBulletHitEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetBulletHitEvents(); - - /// - /// Returns a list containing all HitByBulletEvents currently in the - /// robot's queue. You might, for example, call this while processing - /// another event. - ///

- /// - /// - /// foreach (HitByBulletEvent evnt inGetHitByBulletEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetHitByBulletEvents(); - - /// - /// Returns a list containing all HitRobotEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (HitRobotEvent evnt inGetHitRobotEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetHitRobotEvents(); - - /// - /// Returns a list containing all HitWallEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (HitWallEvent evnt inGetHitWallEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetHitWallEvents(); - - /// - /// Returns a list containing all RobotDeathEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (RobotDeathEvent evnt inGetRobotDeathEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetRobotDeathEvents(); - - /// - /// Returns a list containing all ScannedRobotEvents currently in the - /// robot's queue. You might, for example, call this while processing another - /// event. - ///

- /// - /// - /// foreach (ScannedRobotEvent evnt inGetScannedRobotEvents()) - /// { - /// // do something with the event - /// } - /// - /// - /// - /// - /// - ///

- IList GetScannedRobotEvents(); - - /// - /// Returns a file representing a data directory for the robot, which can be - /// written to. - ///

- /// The system will automatically create the directory for you, so you do not - /// need to create it by yourself. - /// - ///

- string GetDataDirectory(); - - /// - /// Returns a file in your data directory that you can write to. - ///

- /// The system will automatically create the directory for you, so you do not - /// need to create it by yourself. - ///

- /// Please notice that the max. size of your data file is set to 200000 - /// (~195 KB). - ///

- /// See the Sample.SittingDuck to see an example of how to use this - /// method. - /// - ///

- /// The file name of the data file for your robot - Stream GetDataFile(string filename); - - /// - /// Returns the data quota available in your data directory, i.e. the amount - /// of bytes left in the data directory for the robot. - /// - /// - /// - long GetDataQuotaAvailable(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IBasicRobotPeer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IBasicRobotPeer.cs deleted file mode 100644 index f5b5822..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IBasicRobotPeer.cs +++ /dev/null @@ -1,698 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; -using Robocode; -using Robocode.RobotInterfaces; - -namespace Robocode.RobotInterfaces.Peer -{ - /// - /// The basic robot peer for all robot types. - ///

- /// A robot peer is the obj that deals with game mechanics and rules, and - /// makes sure your robot abides by them. - /// - /// - /// - /// - ///

- public interface IBasicRobotPeer - { - /// - /// Returns the robot's name. - /// - string GetName(); - - /// - /// Returns the game time of the current round, where the time is equal to - /// the current turn in the round. - ///

- /// A battle consists of multiple rounds. - ///

- /// Time is reset to 0 at the beginning of every round. - ///

- long GetTime(); - - /// - /// Returns the robot's current energy. - /// - double GetEnergy(); - - /// - /// Returns the X position of the robot. (0,0) is at the bottom left of the - /// battlefield. - /// - /// - double GetX(); - - /// - /// Returns the Y position of the robot. (0,0) is at the bottom left of the - /// battlefield. - /// - /// - double GetY(); - - /// - /// Returns the velocity of the robot measured in pixels/turn. - ///

- /// The maximum velocity of a robot is defined by - /// (8 pixels / turn). - /// - ///

- double GetVelocity(); - - /// - /// Returns the direction that the robot's body is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - /// - /// - ///

- double GetBodyHeading(); - - /// - /// Returns the direction that the robot's gun is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - /// - /// - ///

- double GetGunHeading(); - - /// - /// Returns the direction that the robot's radar is facing, in radians. - /// The value returned will be between 0 and 2 * PI (is excluded). - ///

- /// Note that the heading in Robocode is like a compass, where 0 means North, - /// PI / 2 means East, PI means South, and 3 * PI / 2 means West. - /// - /// - ///

- double GetRadarHeading(); - - /// - /// Returns the current heat of the gun. The gun cannot Fire unless this is - /// 0. (Calls to Fire will succeed, but will not actually Fire unless - /// GetGunHeat() == 0). - ///

- /// The amount of gun heat generated when the gun is fired is - /// 1 + (firePower / 5). Each turn the gun heat drops by the amount returned - /// by , which is a battle setup. - ///

- /// Note that all guns are "hot" at the start of each round, where the gun - /// heat is 3. - /// - /// - ///

- double GetGunHeat(); - - /// - /// Returns the width of the current battlefield measured in pixels. - /// - double GetBattleFieldWidth(); - - /// - /// Returns the height of the current battlefield measured in pixels. - /// - double GetBattleFieldHeight(); - - /// - /// Returns how many opponents that are left in the current round. - /// - int GetOthers(); - - /// - /// Returns how many sentry robots that are left in the current round. - /// - int GetNumSentries(); - - /// - /// Returns the number of rounds in the current battle. - /// - /// - int GetNumRounds(); - - /// - /// Returns the number of the current round (0 to - 1) - /// in the battle. - /// - /// - int GetRoundNum(); - - /// - /// Returns the sentry border size for a BorderSentry that defines the how - /// far a BorderSentry is allowed to move from the border edges measured in units.
- /// Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that - /// BorderSentrys cannot leave (sentry robots robots must stay in the border area), but it also define the - /// distance from the border edges where BorderSentrys are allowed/able to make damage to robots entering this - /// border area. - ///
- int GetSentryBorderSize(); - - /// - /// Returns the rate at which the gun will cool down, i.e. the amount of heat - /// the gun heat will drop per turn. - ///

- /// The gun cooling rate is default 0.1 / turn, but can be changed by the - /// battle setup. So don't count on the cooling rate being 0.1! - /// - /// - ///

- double GetGunCoolingRate(); - - /// - /// Returns the distance remaining in the robot's current move measured in - /// pixels. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the robot is currently moving forwards. Negative values means - /// that the robot is currently moving backwards. If the returned value is 0, - /// the robot currently stands still. - /// - /// - /// - ///

- double GetDistanceRemaining(); - - /// - /// Returns the angle remaining in the robot's turn, in radians. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the robot is currently turning to the right. Negative values - /// means that the robot is currently turning to the left. - /// - /// - /// - ///

- double GetBodyTurnRemaining(); - - /// - /// Returns the angle remaining in the gun's turn, in radians. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the gun is currently turning to the right. Negative values - /// means that the gun is currently turning to the left. - /// - /// - /// - ///

- double GetGunTurnRemaining(); - - /// - /// Returns the angle remaining in the radar's turn, in radians. - ///

- /// This call returns both positive and negative values. Positive values - /// means that the radar is currently turning to the right. Negative values - /// means that the radar is currently turning to the left. - /// - /// - /// - ///

- double GetRadarTurnRemaining(); - - /// - /// Executes any pending actions, or continues executing actions that are - /// in process. This call returns after the actions have been started. - ///

- /// Note that advanced robots must call this function in order to - /// Execute pending set* calls like e.g. - /// , etc. - /// Otherwise, these calls will never get executed. - ///

- /// In this example the robot will move while turning: - /// - /// - /// SetTurnBody(90); - /// SetMove(100); - /// Execute(); - /// - /// while (GetDistanceRemaining() > 0 && GetTurnRemaining() > 0) - /// { - /// Execute(); - /// } - /// - /// - ///

- void Execute(); - - /// - /// Immediately moves your robot forward or backward by distance measured in - /// pixels. - ///

- /// This call executes immediately, and does not return until it is complete, - /// i.e. when the remaining distance to move is 0. - ///

- /// If the robot collides with a wall, the move is complete, meaning that the - /// robot will not move any further. If the robot collides with another - /// robot, the move is complete if you are heading toward the other robot. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot is set to move forward, and negative - /// values means that the robot is set to move backward. - ///

- /// - /// - /// // Move the robot 100 pixels forward - /// Ahead(100); - /// - /// // Afterwards, move the robot 50 pixels backward - /// Ahead(-50); - /// - /// - /// - /// - ///

- /// - /// The distance to move measured in pixels. - /// If distance > 0 the robot is set to move forward. - /// If distance < 0 the robot is set to move backward. - /// If distance = 0 the robot will not move anywhere, but just finish its turn. - /// - void Move(double distance); - - /// - /// Immediately turns the robot's body to the right or left by radians. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the body's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot's body is set to turn right, and - /// negative values means that the robot's body is set to turn left. - /// If 0 is given as input, the robot's body will stop turning. - ///

- /// - /// - /// // Turn the robot's body 180 degrees to the right - /// TurnBody(Math.PI); - /// - /// // Afterwards, turn the robot's body 90 degrees to the left - /// TurnBody(-Math.PI / 2); - /// - /// - /// - /// - /// - ///

- /// - /// The amount of radians to turn the robot's body. - /// If radians > 0 the robot's body is set to turn right. - /// If radians < 0 the robot's body is set to turn left. - /// If radians = 0 the robot's body is set to stop turning. - /// - void TurnBody(double radians); - - /// - /// Immediately turns the robot's gun to the right or left by radians. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the gun's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot's gun is set to turn right, and - /// negative values means that the robot's gun is set to turn left. - /// If 0 is given as input, the robot's gun will stop turning. - ///

- /// - /// - /// // Turn the robot's gun 180 degrees to the right - /// TurnGun(Math.PI); - /// - /// // Afterwards, turn the robot's gun 90 degrees to the left - /// TurnGun(-Math.PI / 2); - /// - /// - /// - /// - /// - ///

- /// - /// The amount of radians to turn the robot's gun. - /// If radians > 0 the robot's gun is set to turn right. - /// If radians < 0 the robot's gun is set to turn left. - /// If radians = 0 the robot's gun is set to stop turning. - /// - void TurnGun(double radians); - - /// - /// Immediately fires a bullet. The bullet will travel in the direction the - /// gun is pointing. - ///

- /// The specified bullet power is an amount of energy that will be taken from - /// the robot's energy. Hence, the more power you want to spend on the - /// bullet, the more energy is taken from your robot. - ///

- /// The bullet will do (4 * power) damage if it hits another robot. If power - /// is greater than 1, it will do an additional 2 * (power - 1) damage. - /// You will get (3 * power) back if you hit the other robot. You can call - /// for getting the damage that a - /// bullet with a specific bullet power will do. - ///

- /// The specified bullet power should be between - /// and . - ///

- /// Note that the gun cannot Fire if the gun is overheated, meaning that - /// returns a value > 0. - ///

- /// An event is generated when the bullet hits a robot - /// ("/>, wall (), or another - /// bullet (). - ///

- /// - /// - /// // Fire a bullet with maximum power if the gun is ready - /// if (GetGunHeat() == 0) - /// { - /// Bullet bullet = Fire(Rules.MAX_BULLET_POWER); - /// - /// // Get the velocity of the bullet - /// if (bullet != null) - /// { - /// double bulletVelocity = bullet.Velocity; - /// } - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of energy given to the bullet, and subtracted from the robot's energy. - /// - Bullet Fire(double power); - - /// - /// Sets the gun to Fire a bullet when the next execution takes place. - /// The bullet will travel in the direction the gun is pointing. - ///

- /// This call returns immediately, and will not execute until you call - /// Execute() or take an action that executes. - ///

- /// The specified bullet power is an amount of energy that will be taken from - /// the robot's energy. Hence, the more power you want to spend on the - /// bullet, the more energy is taken from your robot. - ///

- /// The bullet will do (4 * power) damage if it hits another robot. If power - /// is greater than 1, it will do an additional 2 * (power - 1) damage. - /// You will get (3 * power) back if you hit the other robot. You can call - /// for getting the damage that a - /// bullet with a specific bullet power will do. - ///

- /// The specified bullet power should be between - /// and . - ///

- /// Note that the gun cannot Fire if the gun is overheated, meaning that - /// returns a value > 0. - ///

- /// An event is generated when the bullet hits a robot - /// (), wall (), or another - /// bullet (). - ///

- /// - /// - /// Bullet bullet = null; - /// - /// // Fire a bullet with maximum power if the gun is ready - /// if (GetGunHeat() == 0) - /// { - /// bullet = SetFireBullet(Rules.MAX_BULLET_POWER); - /// } - /// ... - /// Execute(); - /// ... - /// // Get the velocity of the bullet - /// if (bullet != null) - /// { - /// double bulletVelocity = bullet.Velocity; - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// - ///

- /// - /// The amount of energy given to the bullet, and subtracted from the robot's energy. - /// - Bullet SetFire(double power); - - /// - /// Sets the color of the robot's body. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetBodyColor(Color.BLACK); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - /// - /// The new body color - ///

- void SetBodyColor(Color color); - - /// - /// Returns current color of body - /// - Color GetBodyColor(); - - /// - /// Sets the color of the robot's gun. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetGunColor(Color.RED); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - ///

- /// The new gun color - void SetGunColor(Color color); - - /// - /// Returns current color of gun - /// - Color GetGunColor(); - - /// - /// Sets the color of the robot's radar. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetRadarColor(Color.YELLOW); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - ///

- /// The new radar color - void SetRadarColor(Color color); - - /// - /// Returns current color of radar - /// - Color GetRadarColor(); - - /// - /// Sets the color of the robot's bullets. - ///

- /// A null indicates the default white color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetBulletColor(Color.GREEN); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - ///

- /// The new bullet color - void SetBulletColor(Color color); - - /// - /// Returns current color of bullet - /// - Color GetBulletColor(); - - /// - /// Sets the color of the robot's scan arc. - ///

- /// A null indicates the default (blue) color. - ///

- /// - /// - /// // Don't forget to using System.Drawing at the top... - /// using System.Drawing; - /// ... - /// - /// public void Run() - /// { - /// SetScanColor(Color.WHITE); - /// ... - /// } - /// - /// - /// - /// - /// - /// - /// - ///

- /// the new scan arc color - void SetScanColor(Color color); - - /// - /// Returns current color of scan beam - /// - Color GetScanColor(); - - /// - /// This call must be made from a robot call to inform the game - /// that the robot made a Get* call like e.g. or - /// . - ///

- /// This method is used by the game to determine if the robot is inactive or - /// not. Note: You should only make this call once in a Get* method! - /// - ///

- void GetCall(); - - /// - /// This call must be made from a robot call to inform the game - /// that the robot made a Set* call like e.g. - /// or . - ///

- /// This method is used by the game to determine if the robot is inactive or - /// not. Note: You should only make this call once in a Set* method! - /// - /// - ///

- void SetCall(); - - /// - /// Returns a graphics context used for painting graphical items for the robot. - ///

- /// This method is very useful for debugging your robot. - ///

- /// Note that the robot will only be painted if the "Paint" is enabled on the - /// robot's console window; otherwise the robot will never get painted (the - /// reason being that all robots might have graphical items that must be - /// painted, and then you might not be able to tell what graphical items that - /// have been painted for your robot). - ///

- /// Also note that the coordinate system for the graphical context where you - /// paint items fits for the Robocode coordinate system where (0, 0) is at - /// the bottom left corner of the battlefield, where X is towards right and Y - /// is upwards. - /// - ///

- IGraphics GetGraphics(); - - /// - /// Sets the debug property with the specified key to the specified value. - ///

- /// This method is very useful when debugging or reviewing your robot as you - /// will be able to see this property displayed in the robot console for your - /// robots under the Debug Properties tab page. - ///

- /// The name/key of the debug property. - /// - /// The new value of the debug property, where null or the empty string is used - /// for removing this debug property. - /// - void SetDebugProperty(string key, string value); - - /// - /// Rescan for other robots. This method is called automatically by the game, - /// as long as the robot is moving, turning its body, turning its gun, or - /// turning its radar. - ///

- /// Rescan will cause - /// to be called if you see a robot. - ///

- /// There are 2 reasons to call Rescan() manually: - ///

    - ///
  1. You want to scan after you stop moving.
  2. - ///
  3. You want to interrupt the OnScannedRobot event. This is more - /// likely. If you are in OnScannedRobot and call Scan(), - /// and you still see a robot, then the system will interrupt your - /// OnScannedRobot event immediately and start it from the top.
  4. - ///
- ///

- /// This call executes immediately. - /// - /// - /// - ///

- void Rescan(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IJuniorRobotPeer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IJuniorRobotPeer.cs deleted file mode 100644 index f07e86d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IJuniorRobotPeer.cs +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces.Peer -{ - /// - /// The junior robot peer for junior robot types like . - ///

- /// A robot peer is the obj that deals with game mechanics and rules, and - /// makes sure your robot abides by them. - /// - /// - /// - /// - ///

- public interface IJuniorRobotPeer : IBasicRobotPeer - { - /// - /// Moves this robot forward or backwards by pixels and turns this robot - /// right or left by degrees at the same time. The robot will move in a curve - /// that follows a perfect circle, and the moving and turning will end at - /// exactly the same time. - ///

- /// Note that the max. velocity and max. turn rate is automatically adjusted, - /// which means that the robot will move slower the sharper the turn is - /// compared to the distance. - ///

- /// Note that both positive and negative values can be given as input: - ///

    - ///
  • If the distance parameter is set to a positive value, it - /// means that the robot is set to move forward, and a negative value means - /// that the robot is set to move backward. If set to 0, the robot will not - /// move, but will be able to turn.
  • - ///
  • If the radians parameter is set to a positive value, it means - /// that the robot is set to turn to the right, and a negative value means - /// that the robot is set to turn to the left. If set to 0, the robot will - /// not turn, but will be able to move.
  • - ///
- /// - /// - /// - /// - /// - ///
- /// - /// The distance to move measured in pixels. - /// If distance > 0 the robot is set to move forward. - /// If distance < 0 the robot is set to move backward. - /// If distance = 0 the robot will not move anywhere, but just finish its turn. - /// - /// - /// The amount of radians to turn the robot's body. - /// If radians > 0 the robot's body is set to turn right. - /// If radians < 0 the robot's body is set to turn left. - /// If radians = 0 the robot's body is set to stop turning. - /// - void TurnAndMove(double distance, double radians); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IStandardRobotPeer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IStandardRobotPeer.cs deleted file mode 100644 index 5b785c5..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/IStandardRobotPeer.cs +++ /dev/null @@ -1,248 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode.RobotInterfaces.Peer -{ - /// - /// The standard robot peer for standard robot types like , - /// , and . - ///

- /// A robot peer is the obj that deals with game mechanics and rules, and - /// makes sure your robot abides by them. - /// - /// - /// - /// - ///

- public interface IStandardRobotPeer : IBasicRobotPeer - { - /// - /// Immediately stops all movement, and saves it for a call to - /// . If there is already movement saved from a previous - /// stop, you can overwrite it by calling Stop(true). - /// - /// - /// - /// If there is already movement saved from a previous stop, - /// you can overwrite it by calling Stop(true). - /// - void Stop(bool overwrite); - - /// - /// Immediately resumes the movement you stopped by , if any. - ///

- /// This call executes immediately, and does not return until it is complete. - /// - /// - ///

- void Resume(); - - /// - /// Immediately turns the robot's radar to the right or left by radians. - /// This call executes immediately, and does not return until it is complete, - /// i.e. when the angle remaining in the radar's turn is 0. - ///

- /// Note that both positive and negative values can be given as input, where - /// positive values means that the robot's radar is set to turn right, and - /// negative values means that the robot's radar is set to turn left. - /// If 0 is given as input, the robot's radar will stop turning. - ///

- /// - /// - /// // Turn the robot's radar 180 degrees to the right - /// TurnRadar(Math.PI); - /// - /// // Afterwards, turn the robot's radar 90 degrees to the left - /// TurnRadar(-Math.PI / 2); - /// - /// - /// - /// - /// - ///

- /// - /// The amount of radians to turn the robot's radar. - /// If radians > 0 the robot's radar is set to turn right. - /// If radians < 0 the robot's radar is set to turn left. - /// If radians = 0 the robot's radar is set to stop turning. - /// - void TurnRadar(double radians); - - /// - /// Sets the gun to turn independent from the robot's turn. - ///

- /// Ok, so this needs some explanation: The gun is mounted on the robot's - /// body. So, normally, if the robot turns 90 degrees to the right, then the - /// gun will turn with it as it is mounted on top of the robot's body. To - /// compensate for this, you can call IsAdjustGunForBodyTurn(true). - /// When this is set, the gun will turn independent from the robot's turn, - /// i.e. the gun will compensate for the robot's body turn. - ///

- /// Note: This method is additive until you reach the maximum the gun can - /// turn. The "adjust" is added to the amount you set for turning the robot, - /// then capped by the physics of the game. If you turn infinite, then the - /// adjust is ignored (and hence overridden). - ///

- /// - /// Assuming both the robot and gun start Out facing up (0 degrees): - /// - /// // Set gun to turn with the robot's turn - /// SetAdjustGunForBodyTurn(false); // This is the default - /// TurnBodyRight(Math.PI / 2); - /// // At this point, both the robot and gun are facing right (90 degrees) - /// TurnBodyLeft(Math.PI / 2); - /// // Both are back to 0 degrees - /// - /// -- or -- - /// - /// // Set gun to turn independent from the robot's turn - /// SetAdjustGunForBodyTurn(true); - /// TurnBodyRight(Math.PI / 2); - /// // At this point, the robot is facing right (90 degrees), but the gun is still facing up. - /// TurnBodyLeft(Math.PI / 2); - /// // Both are back to 0 degrees. - /// - /// - ///

- /// Note: The gun compensating this way does count as "turning the gun". - /// See for details. - /// - ///

- /// - /// true if the gun must turn independent from the robot's turn; - /// false if the gun must turn with the robot's turn. - /// - void SetAdjustGunForBodyTurn(bool independent); - - /// - /// Sets the radar to turn independent from the gun's turn. - ///

- /// Ok, so this needs some explanation: The radar is mounted on the robot's - /// gun. So, normally, if the gun turns 90 degrees to the right, then the - /// radar will turn with it as it is mounted on top of the gun. To compensate - /// for this, you can call IsAdjustRadarForGunTurn(true). When this - /// is set, the radar will turn independent from the robot's turn, i.e. the - /// radar will compensate for the gun's turn. - ///

- /// Note: This method is additive until you reach the maximum the radar can - /// turn. The "adjust" is added to the amount you set for turning the robot, - /// then capped by the physics of the game. If you turn infinite, then the - /// adjust is ignored (and hence overridden). - ///

- /// - /// Assuming both the gun and radar start Out facing up (0 degrees): - /// - /// // Set radar to turn with the gun's turn - /// SetAdjustRadarForGunTurn(false); // This is the default - /// TurnGunRight(Math.PI / 2); - /// // At this point, both the radar and gun are facing right (90 degrees); - /// - /// -- or -- - /// - /// // Set radar to turn independent from the gun's turn - /// SetAdjustRadarForGunTurn(true); - /// TurnGunRight(Math.PI / 2); - /// // At this point, the gun is facing right (90 degrees), but the radar is still facing up. - /// - /// - /// Note: Calling IsAdjustRadarForGunTurn(bool) will - /// automatically call with the - /// same value, unless you have already called it earlier. This behavior is - /// primarily for backward compatibility with older Robocode robots. - /// - /// - ///

- /// - /// true if the radar must turn independent from the gun's turn; - /// false if the radar must turn with the gun's turn. - /// - void SetAdjustRadarForGunTurn(bool independent); - - /// - /// Sets the radar to turn independent from the robot's turn. - ///

- /// Ok, so this needs some explanation: The radar is mounted on the gun, and - /// the gun is mounted on the robot's body. So, normally, if the robot turns - /// 90 degrees to the right, the gun turns, as does the radar. Hence, if the - /// robot turns 90 degrees to the right, then the gun and radar will turn - /// with it as the radar is mounted on top of the gun. To compensate for - /// this, you can call IsAdjustRadarForBodyTurn(true). When this is - /// set, the radar will turn independent from the robot's turn, i.e. the - /// radar will compensate for the robot's turn. - ///

- /// Note: This method is additive until you reach the maximum the radar can - /// turn. The "adjust" is added to the amount you set for turning the gun, - /// then capped by the physics of the game. If you turn infinite, then the - /// adjust is ignored (and hence overridden). - ///

- /// - /// Assuming the robot, gun, and radar all start Out facing up (0 degrees): - /// - /// // Set radar to turn with the robots's turn - /// SetAdjustRadarForBodyTurn(false); // This is the default - /// TurnRight(Math.PI / 2); - /// // At this point, the body, gun, and radar are all facing right (90 degrees); - /// - /// -- or -- - /// - /// // Set radar to turn independent from the robot's turn - /// SetAdjustRadarForBodyTurn(true); - /// TurnRight(Math.PI / 2); - /// // At this point, the robot and gun are facing right (90 degrees), but the radar is still facing up. - /// - /// - /// - /// - ///

- /// - /// true if the radar must turn independent from the robots's turn; - /// false if the radar must turn with the robot's turn. - /// - void SetAdjustRadarForBodyTurn(bool independent); - - /// - /// Checks if the gun is set to adjust for the robot turning, i.e. to turn - /// independent from the robot's body turn. - ///

- /// This call returns true if the gun is set to turn independent of - /// the turn of the robot's body. Otherwise, false is returned, - /// meaning that the gun is set to turn with the robot's body turn. - /// - /// - /// - ///

- bool IsAdjustGunForBodyTurn(); - - /// - /// Checks if the radar is set to adjust for the robot turning, i.e. to turn - /// independent from the robot's body turn. - ///

- /// This call returns true if the radar is set to turn independent of - /// the turn of the robot. Otherwise, false is returned, meaning that - /// the radar is set to turn with the robot's turn. - /// - /// - /// - ///

- bool IsAdjustRadarForGunTurn(); - - /// - /// Checks if the radar is set to adjust for the gun turning, i.e. to turn - /// independent from the gun's turn. - ///

- /// This call returns true if the radar is set to turn independent of - /// the turn of the gun. Otherwise, false is returned, meaning that - /// the radar is set to turn with the gun's turn. - /// - /// - /// - ///

- bool IsAdjustRadarForBodyTurn(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/ITeamRobotPeer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/ITeamRobotPeer.cs deleted file mode 100644 index cdd4872..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/robotinterfaces/peer/ITeamRobotPeer.cs +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Collections.Generic; -using Robocode; - -namespace Robocode.RobotInterfaces.Peer -{ - /// - /// The team robot peer for team robots like . - ///

- /// A robot peer is the object that deals with game mechanics and rules, and - /// makes sure your robot abides by them. - /// - /// - /// - /// - ///

- public interface ITeamRobotPeer : IAdvancedRobotPeer - { - /// - /// Returns the names of all teammates, or null there is no teammates. - ///

- /// - /// - /// public void Run() - /// { - /// // Prints Out all teammates - /// string[] teammates = GetTeammates(); - /// if (teammates != null) - /// { - /// foreach (string member in teammates) - /// { - /// Out.WriteLine(member); - /// } - /// } - /// } - /// - /// - /// - /// - /// - ///

- string[] GetTeammates(); - - /// - /// Checks if a given robot name is the name of one of your teammates. - ///

- /// - /// - /// public void OnScannedRobot(ScannedRobotEvent e) - /// { - /// if (IsTeammate(e.Name) - /// { - /// return; - /// } - /// Fire(1); - /// } - /// - /// - /// - /// - /// - /// - ///

- /// The robot name to check - bool IsTeammate(string name); - - /// - /// Broadcasts a message to all teammates. - ///

- /// - /// - /// public void Run() - /// { - /// BroadcastMessage("I'm here!"); - /// } - /// - /// - /// - /// - /// - ///

- /// The message to broadcast to all teammates - void BroadcastMessage(object message); - - /// - /// Sends a message to one (or more) teammates. - ///

- /// - /// - /// public void Run() - /// { - /// SendMessage("Sample.DroidBot", "I'm here!"); - /// } - /// - /// - /// - /// - /// - ///

- /// The name of the intended recipient of the message - /// The message to send - void SendMessage(string name, object message); - - /// - /// Returns a list containing all MessageEvents currently in the robot's - /// queue. You might, for example, call this while processing another event. - ///

- /// - /// - /// foreach (MessageEvent e in GetMessageEvents()) - /// { - /// // do something with e - /// } - /// - /// - /// - /// - ///

- IList GetMessageEvents(); - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/util/Utils.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/util/Utils.cs deleted file mode 100644 index fa1fdb5..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.api/src/robocode/util/Utils.cs +++ /dev/null @@ -1,206 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.security; - -namespace Robocode.Util -{ - /// - /// Utility class that provide methods for normalizing angles. - /// - public static class Utils - { - private const double TWO_PI = 2*Math.PI; - private const double THREE_PI_OVER_TWO = 3*Math.PI/2; - private const double PI_OVER_TWO = Math.PI/2; - private const double NEAR_DELTA = .00001; - - /// - /// Normalizes an angle to an absolute angle. - /// The normalized angle will be in the range from 0 to 2*PI, where 2*PI - /// itself is not included. - /// - /// the angle in radians to normalize - public static double NormalAbsoluteAngle(double angle) - { - return (angle %= TWO_PI) >= 0 ? angle : (angle + TWO_PI); - } - - /// - /// Normalizes an angle to an absolute angle. - /// The normalized angle will be in the range from 0 to 360, where 360 - /// itself is not included. - /// - /// the angle in degrees to normalize - public static double NormalAbsoluteAngleDegrees(double angle) - { - return (angle %= 360) >= 0 ? angle : (angle + 360); - } - - /// - /// Normalizes an angle to a relative angle. - /// The normalized angle will be in the range from -PI to PI, where PI - /// itself is not included. - /// - /// the angle in radinas to normalize - public static double NormalRelativeAngle(double angle) - { - return (angle %= TWO_PI) >= 0 - ? (angle < Math.PI) ? angle : angle - TWO_PI - : (angle >= -Math.PI) ? angle : angle + TWO_PI; - } - - /// - /// Normalizes an angle to a relative angle. - /// The normalized angle will be in the range from -180 to 180, where 180 - /// itself is not included. - /// - /// the angle to normalize - public static double NormalRelativeAngleDegrees(double angle) - { - return (angle %= 360) >= 0 ? (angle < 180) ? angle : angle - 360 : (angle >= -180) ? angle : angle + 360; - } - - /// - /// Normalizes an angle to be near an absolute angle. - /// The normalized angle will be in the range from 0 to 360, where 360 - /// itself is not included. - /// If the normalized angle is near to 0, 90, 180, 270 or 360, that - /// angle will be returned. The - /// method is used for defining when the angle is near one of angles listed - /// above. - /// - /// - /// - /// the angle to normalize - public static double NormalNearAbsoluteAngleDegrees(double angle) - { - angle = (angle %= 360) >= 0 ? angle : (angle + 360); - - if (IsNear(angle, 180)) - { - return 180; - } - if (angle < 180) - { - if (IsNear(angle, 0)) - { - return 0; - } - if (IsNear(angle, 90)) - { - return 90; - } - } - else - { - if (IsNear(angle, 270)) - { - return 270; - } - if (IsNear(angle, 360)) - { - return 0; - } - } - return angle; - } - - /// - /// Normalizes an angle to be near an absolute angle. - /// The normalized angle will be in the range from 0 to 2*PI, where 2*PI - /// itself is not included. - /// If the normalized angle is near to 0, PI/2, PI, 3*PI/2 or 2*PI, that - /// angle will be returned. The - /// method is used for defining when the angle is near one of angles listed - /// above. - /// - /// - /// - /// the angle to normalize - public static double NormalNearAbsoluteAngle(double angle) - { - angle = (angle %= TWO_PI) >= 0 ? angle : (angle + TWO_PI); - - if (IsNear(angle, Math.PI)) - { - return Math.PI; - } - if (angle < Math.PI) - { - if (IsNear(angle, 0)) - { - return 0; - } - if (IsNear(angle, PI_OVER_TWO)) - { - return PI_OVER_TWO; - } - } - else - { - if (IsNear(angle, THREE_PI_OVER_TWO)) - { - return THREE_PI_OVER_TWO; - } - if (IsNear(angle, TWO_PI)) - { - return 0; - } - } - return angle; - } - - /// - /// Tests if the two double values are near to each other. - /// It is recommended to use this method instead of testing if the two - /// doubles are equal using an this expression: value1 == value2. - /// The reason being, that this expression might never become - /// true due to the precision of double values. - /// Whether or not the specified doubles are near to each other is defined by - /// the following expression: - /// (Math.abs(value1 - value2) < .00001) - /// - /// the first double value - /// the second double value - public static bool IsNear(double value1, double value2) - { - return (Math.Abs(value1 - value2) < NEAR_DELTA); - } - - /// - /// Returns random number generator. It might be configured for repeatable behavior by setting -DRANDOMSEED option. - /// - public static Random GetRandom() - { - return HiddenAccessN.randomHelper.GetRandom(); - } - - /// - /// Conversion from degrees to radians - /// - /// in degrees - /// angle in radians - public static double ToRadians(double angle) - { - return Math.PI*angle/180.0; - } - - /// - /// Conversion from radians to degrees - /// - /// in radians - /// angle in degrees - public static double ToDegrees(double angle) - { - return angle*(180.0/Math.PI); - } - } -} - -//doc \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.classpath b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.classpath deleted file mode 100644 index 37239ec..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.classpath +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.project deleted file mode 100644 index 70b6969..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.project +++ /dev/null @@ -1,19 +0,0 @@ - - - robocode.dotnet.content - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.host - robocode.dotnet.nhost - robocode.dotnet.api - robocode.dotnet.control.api - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 764c3ab..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:34:11 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/test/java=8859_1 -encoding/src/main/resources=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/pom.xml deleted file mode 100644 index f67bbeb..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - robocode.dotnet.content - Robocode .NET Content - - net.sf.robocode - robocode.dotnet - ${robocode.dotnet.version} - - - - net.sf.robocode - robocode.dotnet.host - ${robocode.version} - - - net.sf.robocode - robocode.api - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/robocode.dotnet.content.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/robocode.dotnet.content.iml deleted file mode 100644 index 98715be..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/robocode.dotnet.content.iml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/.gitignore b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/.gitignore deleted file mode 100644 index 4a3496d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -obj -Properties -BattleRunnnerSample.suo diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.csproj deleted file mode 100644 index b5fb8dd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {9826B19C-0C68-4D4A-B6CE-6F2A80B4B114} - Exe - Properties - BattleRunnner - BattleRunnner - v3.5 - 512 - - - - - 3.5 - - - true - full - false - ..\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - C:\robocode\libs\jni4net.n-0.8.7.0.dll - - - False - C:\robocode\libs\robocode.dll - - - False - C:\robocode\libs\robocode.control.dll - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.sln b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.sln deleted file mode 100644 index 67b675a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/BattleRunnnerSample.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BattleRunnnerSample", "BattleRunnnerSample.csproj", "{9826B19C-0C68-4D4A-B6CE-6F2A80B4B114}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9826B19C-0C68-4D4A-B6CE-6F2A80B4B114}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9826B19C-0C68-4D4A-B6CE-6F2A80B4B114}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9826B19C-0C68-4D4A-B6CE-6F2A80B4B114}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9826B19C-0C68-4D4A-B6CE-6F2A80B4B114}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/Program.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/Program.cs deleted file mode 100644 index e757cab..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/libs/control/Program.cs +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -// Application that demonstrates how to run two sample robots in Robocode with the RobocodeEngine using the -// Robocode.Control package. -// -// NOTE: this application assumes that Robocode and the .NET plugin has been installed at C:\robocode, and that this -// application is run from the file path C:\robocode\libs\control. If this is not the case, the references for this -// solution must be changed to point at [your robocode dir]\libs directory where these references are located. -// Also note that the application will need some time to start up and initialize Robocode before the battle can begin. -// -// Author: Flemming N. Larsen - -using System; -using Robocode; -using Robocode.Control; -using Robocode.Control.Events; - -class BattleRunner -{ - static void Main(string[] args) - { - // Create the RobocodeEngine - RobocodeEngine engine = new RobocodeEngine("C:\\robocode"); // Run from C:\Robocode - - // Add battle event handlers - engine.BattleCompleted += new BattleCompletedEventHandler(BattleCompleted); - engine.BattleMessage += new BattleMessageEventHandler(BattleMessage); - engine.BattleError += new BattleErrorEventHandler(BattleError); - - // Show the Robocode battle view - engine.Visible = true; - - // Disable log messages from Robocode - RobocodeEngine.LogMessagesEnabled = false; - - // Setup the battle specification - - int numberOfRounds = 5; - BattlefieldSpecification battlefield = new BattlefieldSpecification(800, 600); // 800x600 - RobotSpecification[] selectedRobots = engine.GetLocalRepository("sample.RamFire,sample.Corners"); - - BattleSpecification battleSpec = new BattleSpecification(numberOfRounds, battlefield, selectedRobots); - - // Run our specified battle and let it run till it is over - engine.RunBattle(battleSpec, true /* wait till the battle is over */); - - // Cleanup our RobocodeEngine - engine.Close(); - } - - // Called when the battle is completed successfully with battle results - private static void BattleCompleted(BattleCompletedEvent e) - { - Console.WriteLine("-- Battle has completed --"); - - // Print out the sorted results with the robot names - Console.WriteLine("Battle results:"); - foreach (BattleResults result in e.SortedResults) - { - Console.WriteLine(" " + result.TeamLeaderName + ": " + result.Score); - } - } - - // Called when the game sends out an information message during the battle - private static void BattleMessage(BattleMessageEvent e) - { - Console.WriteLine("Msg> " + e.Message); - } - - // Called when the game sends out an error message during the battle - private static void BattleError(BattleErrorEvent e) - { - Console.WriteLine("Err> " + e.Error); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robocode.bat b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robocode.bat deleted file mode 100644 index af55147..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robocode.bat +++ /dev/null @@ -1,9 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -java -Xmx512M -cp libs/robocode.jar;libs/jni4net.j-0.8.7.0.jar robocode.Robocode %* diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robots/SamplesCs.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robots/SamplesCs.csproj deleted file mode 100644 index 58786f6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.content/src/main/resources/robots/SamplesCs.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {80857B97-6397-487B-A9F5-B07026DCB666} - Library - SampleCs - samplescs-1.9.2.4 - v2.0 - 512 - - - - - true - full - false - .\ - obj\ - DEBUG;TRACE - prompt - 4 - false - false - - - pdbonly - true - .\ - obj\ - - - prompt - 4 - true - - - - False - ..\libs\robocode.dll - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.project deleted file mode 100644 index 41b449a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.project +++ /dev/null @@ -1,10 +0,0 @@ - - - robocode.dotnet.control.api - .NET Control API for Robocode. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.api - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 070758f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,10 +0,0 @@ -#Tue Nov 27 22:34:10 CET 2012 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 -encoding/src/main/resources=8859_1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/test/resources=8859_1 -encoding/src=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Content Layout.content b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Content Layout.content deleted file mode 100644 index 31aca23..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Content Layout.content +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Introduction.aml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Introduction.aml deleted file mode 100644 index 09788c4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/Introduction.aml +++ /dev/null @@ -1,113 +0,0 @@ - - - - Introduction - - The Robocode Control API is used for controlling the Robocode - application from another external application. Basically, it is possible - to run battles between selected robots and retrieve the results. However, - it is also possible to get detailed information as snapshots during the - battles regarding e.g. the positions and headings of the individual robots - and bullets at a specific time during a battle. - - - The main entry class is the Robocode.Control.RobocodeEngine class, which - must be instantiated by the application controlling Robocode. With the - RobocodeEngine, a battle specification must be provided in order to run a - battle. The battle specification specify the size of the battlefield, and - which rules that must be used. In addition, the participant robots must be - selected, which must exist in the robot directory of Robocode in - advantage. - - -
- Example - - - Here is a simple sample application that runs a battle in Robocode for 5 - rounds on the default battlefield of 800x600 pixels. The robots selected - for the battle are sample.RamFire and sample.Corners. - - - A Visual Studio solution containing this BattleRunner can be found in - [your robocode dir]\lib\control if you have installed Robocode and the - .NET plugin for Robocode, where [your robocode dir] is your Robocode - installation directory, which could be C:\robocode like this example - assumes. - - -// Application that demonstrates how to run two sample robots in Robocode with the RobocodeEngine using the -// Robocode.Control package. -// -// NOTE: this application assumes that Robocode and the .NET plugin has been installed at C:\robocode, and that this -// application is run from the file path C:\robocode\libs\control. If this is not the case, the references for this -// solution must be changed to point at [your robocode dir]\libs directory where these references are located. -// Also note that the application will need some time to start up and initialize Robocode before the battle can begin. -// -// Author: Flemming N. Larsen - -using System; -using Robocode; -using Robocode.Control; -using Robocode.Control.Events; - -class BattleRunner -{ - static void Main(string[] args) - { - // Create the RobocodeEngine - RobocodeEngine engine = new RobocodeEngine("C:\\robocode"); // Run from C:\Robocode - - // Add battle event handlers - engine.BattleCompleted += new BattleCompletedEventHandler(BattleCompleted); - engine.BattleMessage += new BattleMessageEventHandler(BattleMessage); - engine.BattleError += new BattleErrorEventHandler(BattleError); - - // Show the Robocode battle view - engine.Visible = true; - - // Setup the battle specification - - int numberOfRounds = 5; - BattlefieldSpecification battlefield = new BattlefieldSpecification(800, 600); // 800x600 - RobotSpecification[] selectedRobots = engine.GetLocalRepository("sample.RamFire,sample.Corners"); - - BattleSpecification battleSpec = new BattleSpecification(numberOfRounds, battlefield, selectedRobots); - - // Run our specified battle and let it run till it is over - engine.RunBattle(battleSpec, true /* wait till the battle is over */); - - // Cleanup our RobocodeEngine - engine.Close(); - } - - // Called when the battle is completed successfully with battle results - private static void BattleCompleted(BattleCompletedEvent e) - { - Console.WriteLine("-- Battle has completed --"); - - // Print out the sorted results with the robot names - Console.WriteLine("Battle results:"); - foreach (BattleResults result in e.SortedResults) - { - Console.WriteLine(" " + result.TeamLeaderName + ": " + result.Score); - } - } - - // Called when the game sends out an information message during the battle - private static void BattleMessage(BattleMessageEvent e) - { - Console.WriteLine("Msg> " + e.Message); - } - - // Called when the game sends out an error message during the battle - private static void BattleError(BattleErrorEvent e) - { - Console.WriteLine("Err> " + e.Error); - } -} - - -
-
-
\ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/controlAPI.shfbproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/controlAPI.shfbproj deleted file mode 100644 index 15f8d16..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/controlAPI.shfbproj +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - {90f0d09b-f58d-4f2e-ac8a-164d89979ef1} - 1.9.5.0 - - Documentation - Documentation - Documentation - - .\target\Help\ - ControlAPI - - - - - AutoDocumentCtors, AutoDocumentDispose - Robocode Control API for .NET - .NET Framework 3.5 - HtmlHelp1, Website - - - - - - - InheritedMembers, Protected, SealedProtected - - Control API used for controlling Robocode from an external .NET application. - Control API used for controlling Robocode from an external .NET application. - Control API used for controlling Robocode from an external .NET application. - - Copyright %28c%29 2001-2016 Mathew A. Nelson and Robocode contributors - fnl%40users.sourceforge.net - administator and maintainer of Robocode - Robocode Control API for .NET - vs2010 - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\tools\lib\jni4net.n-0.8.7.0.dll - - - ..\robocode.dotnet.api\target\robocode.dll - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/pom.xml deleted file mode 100644 index 81f54e7..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/pom.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - 4.0.0 - robocode.dotnet.control.api - Robocode .NET Control API - .NET Control API for Robocode - dotnet:library - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - - net.sf.jni4net - jni4net.n - 0.8.7.0 - dotnet:library - - - net.sf.robocode - robocode.dotnet.api - ${project.version} - dotnet:library - - - - robocode.control - src - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - - /unsafe /warn:0 /nowarn:1591 /keyfile:"${basedir}/../tools/keys/robocode.snk" - robocode.control.dll - - - - org.jvnet.maven-antrun-extended-plugin - maven-antrun-extended-plugin - - - process-classes - - - - - - - - - - - run - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/robocode.dotnet.control.api.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/robocode.dotnet.control.api.iml deleted file mode 100644 index 64ccd25..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/robocode.dotnet.control.api.iml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/.gitignore b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/.gitignore deleted file mode 100644 index dcb7ccb..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/obj -/robocode.dotnet.control.api.sln -/robocode.dotnet.control.api.suo diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/java/util/Random.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/java/util/Random.generated.cs deleted file mode 100644 index 6b73e37..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/java/util/Random.generated.cs +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace java.util { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class Random : global::java.lang.Object, global::java.io.Serializable { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextInt0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextInt1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextLong2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextDouble3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextBoolean4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextBytes5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextFloat6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_nextGaussian7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setSeed8; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRandom9; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRandom10; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(J)V")] - public Random(long par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::java.util.Random.staticClass, global::java.util.Random.j4n__ctorRandom9, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public Random() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::java.util.Random.staticClass, global::java.util.Random.j4n__ctorRandom10, this); - } - } - - protected Random(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::java.util.Random.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::java.util.Random.staticClass = @__class; - global::java.util.Random.j4n_nextInt0 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextInt", "(I)I"); - global::java.util.Random.j4n_nextInt1 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextInt", "()I"); - global::java.util.Random.j4n_nextLong2 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextLong", "()J"); - global::java.util.Random.j4n_nextDouble3 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextDouble", "()D"); - global::java.util.Random.j4n_nextBoolean4 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextBoolean", "()Z"); - global::java.util.Random.j4n_nextBytes5 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextBytes", "([B)V"); - global::java.util.Random.j4n_nextFloat6 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextFloat", "()F"); - global::java.util.Random.j4n_nextGaussian7 = @__env.GetMethodID(global::java.util.Random.staticClass, "nextGaussian", "()D"); - global::java.util.Random.j4n_setSeed8 = @__env.GetMethodID(global::java.util.Random.staticClass, "setSeed", "(J)V"); - global::java.util.Random.j4n__ctorRandom9 = @__env.GetMethodID(global::java.util.Random.staticClass, "", "(J)V"); - global::java.util.Random.j4n__ctorRandom10 = @__env.GetMethodID(global::java.util.Random.staticClass, "", "()V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(I)I")] - public virtual int nextInt(int par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::java.util.Random.j4n_nextInt0, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int nextInt() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::java.util.Random.j4n_nextInt1))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()J")] - public virtual long nextLong() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((long)(@__env.CallLongMethod(this, global::java.util.Random.j4n_nextLong2))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - public virtual double nextDouble() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::java.util.Random.j4n_nextDouble3))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool nextBoolean() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::java.util.Random.j4n_nextBoolean4))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("([B)V")] - public virtual void nextBytes(byte[] par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::java.util.Random.j4n_nextBytes5, global::net.sf.jni4net.utils.Convertor.ParArrayPrimC2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()F")] - public virtual float nextFloat() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((float)(@__env.CallFloatMethod(this, global::java.util.Random.j4n_nextFloat6))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - public virtual double nextGaussian() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::java.util.Random.j4n_nextGaussian7))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(J)V")] - public virtual void setSeed(long par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::java.util.Random.j4n_setSeed8, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::java.util.Random(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattleSpecification.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattleSpecification.generated.cs deleted file mode 100644 index c714d62..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattleSpecification.generated.cs +++ /dev/null @@ -1,207 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleSpecification : global::java.lang.Object, global::java.io.Serializable { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getInactivityTime0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getGunCoolingRate1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getBattlefield2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getNumRounds3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getHideEnemyNames4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getSentryBorderSize5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobots6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getInitialSetups7; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleSpecification8; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleSpecification9; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleSpecification10; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleSpecification11; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleSpecification12; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(IJDLrobocode/control/BattlefieldSpecification;[Lrobocode/control/RobotSpecificat" + - "ion;)V")] - public BattleSpecification(int par0, long par1, double par2, global::robocode.control.BattlefieldSpecification par3, robocode.control.RobotSpecification[] par4) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 20)){ - @__env.NewObject(global::robocode.control.BattleSpecification.staticClass, global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification8, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par3), global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par4)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(IJDZLrobocode/control/BattlefieldSpecification;[Lrobocode/control/RobotSpecifica" + - "tion;)V")] - public BattleSpecification(int par0, long par1, double par2, bool par3, global::robocode.control.BattlefieldSpecification par4, robocode.control.RobotSpecification[] par5) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 22)){ - @__env.NewObject(global::robocode.control.BattleSpecification.staticClass, global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification9, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par3), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par4), global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par5)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/BattlefieldSpecification;IJDIZ[Lrobocode/control/RobotSpecific" + - "ation;)V")] - public BattleSpecification(global::robocode.control.BattlefieldSpecification par0, int par1, long par2, double par3, int par4, bool par5, robocode.control.RobotSpecification[] par6) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 24)){ - @__env.NewObject(global::robocode.control.BattleSpecification.staticClass, global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification10, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par3), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par4), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par5), global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par6)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/BattlefieldSpecification;IJDIZ[Lrobocode/control/RobotSpecific" + - "ation;[Lrobocode/control/RobotSetup;)V")] - public BattleSpecification(global::robocode.control.BattlefieldSpecification par0, int par1, long par2, double par3, int par4, bool par5, robocode.control.RobotSpecification[] par6, robocode.control.RobotSetup[] par7) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 26)){ - @__env.NewObject(global::robocode.control.BattleSpecification.staticClass, global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification11, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par3), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par4), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par5), global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par6), global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par7)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(ILrobocode/control/BattlefieldSpecification;[Lrobocode/control/RobotSpecificatio" + - "n;)V")] - public BattleSpecification(int par0, global::robocode.control.BattlefieldSpecification par1, robocode.control.RobotSpecification[] par2) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.NewObject(global::robocode.control.BattleSpecification.staticClass, global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification12, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par2)); - } - } - - protected BattleSpecification(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.BattleSpecification.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.BattleSpecification.staticClass = @__class; - global::robocode.control.BattleSpecification.j4n_getInactivityTime0 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getInactivityTime", "()J"); - global::robocode.control.BattleSpecification.j4n_getGunCoolingRate1 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getGunCoolingRate", "()D"); - global::robocode.control.BattleSpecification.j4n_getBattlefield2 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getBattlefield", "()Lrobocode/control/BattlefieldSpecification;"); - global::robocode.control.BattleSpecification.j4n_getNumRounds3 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getNumRounds", "()I"); - global::robocode.control.BattleSpecification.j4n_getHideEnemyNames4 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getHideEnemyNames", "()Z"); - global::robocode.control.BattleSpecification.j4n_getSentryBorderSize5 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getSentryBorderSize", "()I"); - global::robocode.control.BattleSpecification.j4n_getRobots6 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getRobots", "()[Lrobocode/control/RobotSpecification;"); - global::robocode.control.BattleSpecification.j4n_getInitialSetups7 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "getInitialSetups", "()[Lrobocode/control/RobotSetup;"); - global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification8 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "", "(IJDLrobocode/control/BattlefieldSpecification;[Lrobocode/control/RobotSpecificat" + - "ion;)V"); - global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification9 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "", "(IJDZLrobocode/control/BattlefieldSpecification;[Lrobocode/control/RobotSpecifica" + - "tion;)V"); - global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification10 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "", "(Lrobocode/control/BattlefieldSpecification;IJDIZ[Lrobocode/control/RobotSpecific" + - "ation;)V"); - global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification11 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "", "(Lrobocode/control/BattlefieldSpecification;IJDIZ[Lrobocode/control/RobotSpecific" + - "ation;[Lrobocode/control/RobotSetup;)V"); - global::robocode.control.BattleSpecification.j4n__ctorBattleSpecification12 = @__env.GetMethodID(global::robocode.control.BattleSpecification.staticClass, "", "(ILrobocode/control/BattlefieldSpecification;[Lrobocode/control/RobotSpecificatio" + - "n;)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()J")] - public virtual long getInactivityTime() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((long)(@__env.CallLongMethod(this, global::robocode.control.BattleSpecification.j4n_getInactivityTime0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - public virtual double getGunCoolingRate() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.BattleSpecification.j4n_getGunCoolingRate1))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/BattlefieldSpecification;")] - public virtual global::robocode.control.BattlefieldSpecification getBattlefield() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.BattleSpecification.j4n_getBattlefield2)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getNumRounds() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.BattleSpecification.j4n_getNumRounds3))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool getHideEnemyNames() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.BattleSpecification.j4n_getHideEnemyNames4))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getSentryBorderSize() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.BattleSpecification.j4n_getSentryBorderSize5))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/RobotSpecification;")] - public virtual robocode.control.RobotSpecification[] getRobots() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.BattleSpecification.j4n_getRobots6)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/RobotSetup;")] - public virtual robocode.control.RobotSetup[] getInitialSetups() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.BattleSpecification.j4n_getInitialSetups7)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.BattleSpecification(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattlefieldSpecification.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattlefieldSpecification.generated.cs deleted file mode 100644 index e7f0867..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/BattlefieldSpecification.generated.cs +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattlefieldSpecification : global::java.lang.Object, global::java.io.Serializable { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getWidth0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getHeight1; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattlefieldSpecification2; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattlefieldSpecification3; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public BattlefieldSpecification() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.control.BattlefieldSpecification.staticClass, global::robocode.control.BattlefieldSpecification.j4n__ctorBattlefieldSpecification2, this); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(II)V")] - public BattlefieldSpecification(int par0, int par1) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.NewObject(global::robocode.control.BattlefieldSpecification.staticClass, global::robocode.control.BattlefieldSpecification.j4n__ctorBattlefieldSpecification3, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - protected BattlefieldSpecification(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.BattlefieldSpecification.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.BattlefieldSpecification.staticClass = @__class; - global::robocode.control.BattlefieldSpecification.j4n_getWidth0 = @__env.GetMethodID(global::robocode.control.BattlefieldSpecification.staticClass, "getWidth", "()I"); - global::robocode.control.BattlefieldSpecification.j4n_getHeight1 = @__env.GetMethodID(global::robocode.control.BattlefieldSpecification.staticClass, "getHeight", "()I"); - global::robocode.control.BattlefieldSpecification.j4n__ctorBattlefieldSpecification2 = @__env.GetMethodID(global::robocode.control.BattlefieldSpecification.staticClass, "", "()V"); - global::robocode.control.BattlefieldSpecification.j4n__ctorBattlefieldSpecification3 = @__env.GetMethodID(global::robocode.control.BattlefieldSpecification.staticClass, "", "(II)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getWidth() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.BattlefieldSpecification.j4n_getWidth0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getHeight() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.BattlefieldSpecification.j4n_getHeight1))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.BattlefieldSpecification(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RandomFactory.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RandomFactory.generated.cs deleted file mode 100644 index 0309397..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RandomFactory.generated.cs +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RandomFactory : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isDeterministic0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRandom1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setRandom2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_resetDeterministic3; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRandomFactory4; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public RandomFactory() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.control.RandomFactory.staticClass, global::robocode.control.RandomFactory.j4n__ctorRandomFactory4, this); - } - } - - protected RandomFactory(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.RandomFactory.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.RandomFactory.staticClass = @__class; - global::robocode.control.RandomFactory.j4n_isDeterministic0 = @__env.GetMethodID(global::robocode.control.RandomFactory.staticClass, "isDeterministic", "()Z"); - global::robocode.control.RandomFactory.j4n_getRandom1 = @__env.GetStaticMethodID(global::robocode.control.RandomFactory.staticClass, "getRandom", "()Ljava/util/Random;"); - global::robocode.control.RandomFactory.j4n_setRandom2 = @__env.GetStaticMethodID(global::robocode.control.RandomFactory.staticClass, "setRandom", "(Ljava/util/Random;)V"); - global::robocode.control.RandomFactory.j4n_resetDeterministic3 = @__env.GetStaticMethodID(global::robocode.control.RandomFactory.staticClass, "resetDeterministic", "(J)V"); - global::robocode.control.RandomFactory.j4n__ctorRandomFactory4 = @__env.GetMethodID(global::robocode.control.RandomFactory.staticClass, "", "()V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isDeterministic() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.RandomFactory.j4n_isDeterministic0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/util/Random;")] - public static global::java.util.Random getRandom() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.RandomFactory.staticClass, global::robocode.control.RandomFactory.j4n_getRandom1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/util/Random;)V")] - public static void setRandom(global::java.util.Random par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::robocode.control.RandomFactory.staticClass, global::robocode.control.RandomFactory.j4n_setRandom2, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(J)V")] - public static void resetDeterministic(long par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::robocode.control.RandomFactory.staticClass, global::robocode.control.RandomFactory.j4n_resetDeterministic3, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.RandomFactory(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobocodeEngine.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobocodeEngine.generated.cs deleted file mode 100644 index fe32567..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobocodeEngine.generated.cs +++ /dev/null @@ -1,296 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RobocodeEngine : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_close0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVersion1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_addBattleListener2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_removeBattleListener3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setVisible4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getLocalRepository5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getLocalRepository6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_runBattle7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_runBattle8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_runBattle9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_waitTillBattleOver10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_abortCurrentBattle11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentWorkingDir12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotsDir13; - - internal static global::net.sf.jni4net.jni.MethodId j4n_printRunningThreads14; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setLogMessagesEnabled15; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setLogErrorsEnabled16; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobocodeEngine17; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobocodeEngine18; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobocodeEngine19; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobocodeEngine20; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobocodeEngine21; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/io/File;)V")] - public RobocodeEngine(global::java.io.File par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine17, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/io/File;Lrobocode/control/RobocodeListener;)V")] - public RobocodeEngine(global::java.io.File par0, global::java.lang.Object par1) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.NewObject(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine18, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/RobocodeListener;)V")] - public RobocodeEngine(global::java.lang.Object par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine19, this, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/IBattleListener;)V")] - public RobocodeEngine(global::robocode.control.events.IBattleListener par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine20, this, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public RobocodeEngine() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine21, this); - } - } - - protected RobocodeEngine(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.RobocodeEngine.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.RobocodeEngine.staticClass = @__class; - global::robocode.control.RobocodeEngine.j4n_close0 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "close", "()V"); - global::robocode.control.RobocodeEngine.j4n_getVersion1 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "getVersion", "()Ljava/lang/String;"); - global::robocode.control.RobocodeEngine.j4n_addBattleListener2 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "addBattleListener", "(Lrobocode/control/events/IBattleListener;)V"); - global::robocode.control.RobocodeEngine.j4n_removeBattleListener3 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "removeBattleListener", "(Lrobocode/control/events/IBattleListener;)V"); - global::robocode.control.RobocodeEngine.j4n_setVisible4 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "setVisible", "(Z)V"); - global::robocode.control.RobocodeEngine.j4n_getLocalRepository5 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "getLocalRepository", "()[Lrobocode/control/RobotSpecification;"); - global::robocode.control.RobocodeEngine.j4n_getLocalRepository6 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "getLocalRepository", "(Ljava/lang/String;)[Lrobocode/control/RobotSpecification;"); - global::robocode.control.RobocodeEngine.j4n_runBattle7 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "runBattle", "(Lrobocode/control/BattleSpecification;Z)V"); - global::robocode.control.RobocodeEngine.j4n_runBattle8 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "runBattle", "(Lrobocode/control/BattleSpecification;Ljava/lang/String;Z)V"); - global::robocode.control.RobocodeEngine.j4n_runBattle9 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "runBattle", "(Lrobocode/control/BattleSpecification;)V"); - global::robocode.control.RobocodeEngine.j4n_waitTillBattleOver10 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "waitTillBattleOver", "()V"); - global::robocode.control.RobocodeEngine.j4n_abortCurrentBattle11 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "abortCurrentBattle", "()V"); - global::robocode.control.RobocodeEngine.j4n_getCurrentWorkingDir12 = @__env.GetStaticMethodID(global::robocode.control.RobocodeEngine.staticClass, "getCurrentWorkingDir", "()Ljava/io/File;"); - global::robocode.control.RobocodeEngine.j4n_getRobotsDir13 = @__env.GetStaticMethodID(global::robocode.control.RobocodeEngine.staticClass, "getRobotsDir", "()Ljava/io/File;"); - global::robocode.control.RobocodeEngine.j4n_printRunningThreads14 = @__env.GetStaticMethodID(global::robocode.control.RobocodeEngine.staticClass, "printRunningThreads", "()V"); - global::robocode.control.RobocodeEngine.j4n_setLogMessagesEnabled15 = @__env.GetStaticMethodID(global::robocode.control.RobocodeEngine.staticClass, "setLogMessagesEnabled", "(Z)V"); - global::robocode.control.RobocodeEngine.j4n_setLogErrorsEnabled16 = @__env.GetStaticMethodID(global::robocode.control.RobocodeEngine.staticClass, "setLogErrorsEnabled", "(Z)V"); - global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine17 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "", "(Ljava/io/File;)V"); - global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine18 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "", "(Ljava/io/File;Lrobocode/control/RobocodeListener;)V"); - global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine19 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "", "(Lrobocode/control/RobocodeListener;)V"); - global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine20 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "", "(Lrobocode/control/events/IBattleListener;)V"); - global::robocode.control.RobocodeEngine.j4n__ctorRobocodeEngine21 = @__env.GetMethodID(global::robocode.control.RobocodeEngine.staticClass, "", "()V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public virtual void close() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_close0); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobocodeEngine.j4n_getVersion1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/IBattleListener;)V")] - public virtual void addBattleListener(global::robocode.control.events.IBattleListener par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_addBattleListener2, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/IBattleListener;)V")] - public virtual void removeBattleListener(global::robocode.control.events.IBattleListener par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_removeBattleListener3, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Z)V")] - public virtual void setVisible(bool par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_setVisible4, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/RobotSpecification;")] - public virtual robocode.control.RobotSpecification[] getLocalRepository() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobocodeEngine.j4n_getLocalRepository5)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)[Lrobocode/control/RobotSpecification;")] - public virtual robocode.control.RobotSpecification[] getLocalRepository(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobocodeEngine.j4n_getLocalRepository6, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/BattleSpecification;Z)V")] - public virtual void runBattle(global::robocode.control.BattleSpecification par0, bool par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_runBattle7, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/BattleSpecification;Ljava/lang/String;Z)V")] - public virtual void runBattle(global::robocode.control.BattleSpecification par0, global::java.lang.String par1, bool par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_runBattle8, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/BattleSpecification;)V")] - public virtual void runBattle(global::robocode.control.BattleSpecification par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_runBattle9, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public virtual void waitTillBattleOver() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_waitTillBattleOver10); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public virtual void abortCurrentBattle() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::robocode.control.RobocodeEngine.j4n_abortCurrentBattle11); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/io/File;")] - public static global::java.io.File getCurrentWorkingDir() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n_getCurrentWorkingDir12)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/io/File;")] - public static global::java.io.File getRobotsDir() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n_getRobotsDir13)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public static void printRunningThreads() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallStaticVoidMethod(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n_printRunningThreads14); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Z)V")] - public static void setLogMessagesEnabled(bool par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n_setLogMessagesEnabled15, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Z)V")] - public static void setLogErrorsEnabled(bool par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::robocode.control.RobocodeEngine.staticClass, global::robocode.control.RobocodeEngine.j4n_setLogErrorsEnabled16, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.RobocodeEngine(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotResults.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotResults.generated.cs deleted file mode 100644 index 7f246be..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotResults.generated.cs +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RobotResults : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobot0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_convertResults1; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobotResults2; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobotResults3; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/RobotSpecification;Ljava/lang/String;IDDDDDDDIII)V")] - public RobotResults(global::robocode.control.RobotSpecification par0, global::java.lang.String par1, int par2, double par3, double par4, double par5, double par6, double par7, double par8, double par9, int par10, int par11, int par12) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 36)){ - @__env.NewObject(global::robocode.control.RobotResults.staticClass, global::robocode.control.RobotResults.j4n__ctorRobotResults2, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par3), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par4), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par5), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par6), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par7), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par8), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par9), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par10), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par11), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par12)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/RobotSpecification;Lrobocode/BattleResults;)V")] - public RobotResults(global::robocode.control.RobotSpecification par0, global::java.lang.Object par1) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.NewObject(global::robocode.control.RobotResults.staticClass, global::robocode.control.RobotResults.j4n__ctorRobotResults3, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1)); - } - } - - protected RobotResults(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.RobotResults.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.RobotResults.staticClass = @__class; - global::robocode.control.RobotResults.j4n_getRobot0 = @__env.GetMethodID(global::robocode.control.RobotResults.staticClass, "getRobot", "()Lrobocode/control/RobotSpecification;"); - global::robocode.control.RobotResults.j4n_convertResults1 = @__env.GetStaticMethodID(global::robocode.control.RobotResults.staticClass, "convertResults", "([Lrobocode/BattleResults;)[Lrobocode/control/RobotResults;"); - global::robocode.control.RobotResults.j4n__ctorRobotResults2 = @__env.GetMethodID(global::robocode.control.RobotResults.staticClass, "", "(Lrobocode/control/RobotSpecification;Ljava/lang/String;IDDDDDDDIII)V"); - global::robocode.control.RobotResults.j4n__ctorRobotResults3 = @__env.GetMethodID(global::robocode.control.RobotResults.staticClass, "", "(Lrobocode/control/RobotSpecification;Lrobocode/BattleResults;)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/RobotSpecification;")] - public virtual global::robocode.control.RobotSpecification getRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotResults.j4n_getRobot0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("([Lrobocode/BattleResults;)[Lrobocode/control/RobotResults;")] - public static robocode.control.RobotResults[] convertResults(java.lang.Object[] par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.RobotResults.staticClass, global::robocode.control.RobotResults.j4n_convertResults1, global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par0))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.RobotResults(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSetup.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSetup.generated.cs deleted file mode 100644 index 38ee1c2..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSetup.generated.cs +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RobotSetup : global::java.lang.Object, global::java.io.Serializable { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getX0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getY1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getHeading2; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobotSetup3; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)V")] - public RobotSetup(global::java.lang.Double par0, global::java.lang.Double par1, global::java.lang.Double par2) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.NewObject(global::robocode.control.RobotSetup.staticClass, global::robocode.control.RobotSetup.j4n__ctorRobotSetup3, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par2)); - } - } - - protected RobotSetup(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.RobotSetup.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.RobotSetup.staticClass = @__class; - global::robocode.control.RobotSetup.j4n_getX0 = @__env.GetMethodID(global::robocode.control.RobotSetup.staticClass, "getX", "()Ljava/lang/Double;"); - global::robocode.control.RobotSetup.j4n_getY1 = @__env.GetMethodID(global::robocode.control.RobotSetup.staticClass, "getY", "()Ljava/lang/Double;"); - global::robocode.control.RobotSetup.j4n_getHeading2 = @__env.GetMethodID(global::robocode.control.RobotSetup.staticClass, "getHeading", "()Ljava/lang/Double;"); - global::robocode.control.RobotSetup.j4n__ctorRobotSetup3 = @__env.GetMethodID(global::robocode.control.RobotSetup.staticClass, "", "(Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/Double;")] - public virtual global::java.lang.Double getX() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSetup.j4n_getX0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/Double;")] - public virtual global::java.lang.Double getY() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSetup.j4n_getY1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/Double;")] - public virtual global::java.lang.Double getHeading() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSetup.j4n_getHeading2)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.RobotSetup(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSpecification.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSpecification.generated.cs deleted file mode 100644 index 6978fbc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/RobotSpecification.generated.cs +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RobotSpecification : global::java.lang.Object, global::java.io.Serializable { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getName0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getClassName1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getJarFile2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVersion3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getNameAndVersion4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getDescription5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobocodeVersion6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getWebpage7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getAuthorName8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTeamId9; - - protected RobotSpecification(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.RobotSpecification.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.RobotSpecification.staticClass = @__class; - global::robocode.control.RobotSpecification.j4n_getName0 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getName", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getClassName1 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getClassName", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getJarFile2 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getJarFile", "()Ljava/io/File;"); - global::robocode.control.RobotSpecification.j4n_getVersion3 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getVersion", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getNameAndVersion4 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getNameAndVersion", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getDescription5 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getDescription", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getRobocodeVersion6 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getRobocodeVersion", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getWebpage7 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getWebpage", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getAuthorName8 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getAuthorName", "()Ljava/lang/String;"); - global::robocode.control.RobotSpecification.j4n_getTeamId9 = @__env.GetMethodID(global::robocode.control.RobotSpecification.staticClass, "getTeamId", "()Ljava/lang/String;"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getName0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getClassName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getClassName1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/io/File;")] - public virtual global::java.io.File getJarFile() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getJarFile2)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getVersion3)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getNameAndVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getNameAndVersion4)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getDescription() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getDescription5)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getRobocodeVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getRobocodeVersion6)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getWebpage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getWebpage7)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getAuthorName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getAuthorName8)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getTeamId() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.RobotSpecification.j4n_getTeamId9)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.RobotSpecification(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleCompletedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleCompletedEvent.generated.cs deleted file mode 100644 index 025761f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleCompletedEvent.generated.cs +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleCompletedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getBattleRules0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getSortedResults1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getIndexedResults2; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleCompletedEvent3; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/BattleRules;[Lrobocode/BattleResults;)V")] - public BattleCompletedEvent(global::java.lang.Object par0, java.lang.Object[] par1) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.NewObject(global::robocode.control.events.BattleCompletedEvent.staticClass, global::robocode.control.events.BattleCompletedEvent.j4n__ctorBattleCompletedEvent3, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par1)); - } - } - - protected BattleCompletedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattleCompletedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattleCompletedEvent.staticClass = @__class; - global::robocode.control.events.BattleCompletedEvent.j4n_getBattleRules0 = @__env.GetMethodID(global::robocode.control.events.BattleCompletedEvent.staticClass, "getBattleRules", "()Lrobocode/BattleRules;"); - global::robocode.control.events.BattleCompletedEvent.j4n_getSortedResults1 = @__env.GetMethodID(global::robocode.control.events.BattleCompletedEvent.staticClass, "getSortedResults", "()[Lrobocode/BattleResults;"); - global::robocode.control.events.BattleCompletedEvent.j4n_getIndexedResults2 = @__env.GetMethodID(global::robocode.control.events.BattleCompletedEvent.staticClass, "getIndexedResults", "()[Lrobocode/BattleResults;"); - global::robocode.control.events.BattleCompletedEvent.j4n__ctorBattleCompletedEvent3 = @__env.GetMethodID(global::robocode.control.events.BattleCompletedEvent.staticClass, "", "(Lrobocode/BattleRules;[Lrobocode/BattleResults;)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/BattleRules;")] - public virtual global::java.lang.Object getBattleRules() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.BattleCompletedEvent.j4n_getBattleRules0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/BattleResults;")] - public virtual java.lang.Object[] getSortedResults() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.BattleCompletedEvent.j4n_getSortedResults1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/BattleResults;")] - public virtual java.lang.Object[] getIndexedResults() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.BattleCompletedEvent.j4n_getIndexedResults2)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattleCompletedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleErrorEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleErrorEvent.generated.cs deleted file mode 100644 index 0b4b42d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleErrorEvent.generated.cs +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleErrorEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getError0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleErrorEvent1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public BattleErrorEvent(global::java.lang.String par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.control.events.BattleErrorEvent.staticClass, global::robocode.control.events.BattleErrorEvent.j4n__ctorBattleErrorEvent1, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - protected BattleErrorEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattleErrorEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattleErrorEvent.staticClass = @__class; - global::robocode.control.events.BattleErrorEvent.j4n_getError0 = @__env.GetMethodID(global::robocode.control.events.BattleErrorEvent.staticClass, "getError", "()Ljava/lang/String;"); - global::robocode.control.events.BattleErrorEvent.j4n__ctorBattleErrorEvent1 = @__env.GetMethodID(global::robocode.control.events.BattleErrorEvent.staticClass, "", "(Ljava/lang/String;)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getError() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.BattleErrorEvent.j4n_getError0)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattleErrorEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleEvent.generated.cs deleted file mode 100644 index 0698cd0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleEvent.generated.cs +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleEvent : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - protected BattleEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattleEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattleEvent.staticClass = @__class; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattleEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleFinishedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleFinishedEvent.generated.cs deleted file mode 100644 index af8c2a8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleFinishedEvent.generated.cs +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleFinishedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isAborted0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleFinishedEvent1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Z)V")] - public BattleFinishedEvent(bool par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.control.events.BattleFinishedEvent.staticClass, global::robocode.control.events.BattleFinishedEvent.j4n__ctorBattleFinishedEvent1, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - protected BattleFinishedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattleFinishedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattleFinishedEvent.staticClass = @__class; - global::robocode.control.events.BattleFinishedEvent.j4n_isAborted0 = @__env.GetMethodID(global::robocode.control.events.BattleFinishedEvent.staticClass, "isAborted", "()Z"); - global::robocode.control.events.BattleFinishedEvent.j4n__ctorBattleFinishedEvent1 = @__env.GetMethodID(global::robocode.control.events.BattleFinishedEvent.staticClass, "", "(Z)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isAborted() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.events.BattleFinishedEvent.j4n_isAborted0))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattleFinishedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleMessageEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleMessageEvent.generated.cs deleted file mode 100644 index 27bf827..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleMessageEvent.generated.cs +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleMessageEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getMessage0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleMessageEvent1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public BattleMessageEvent(global::java.lang.String par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.control.events.BattleMessageEvent.staticClass, global::robocode.control.events.BattleMessageEvent.j4n__ctorBattleMessageEvent1, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - protected BattleMessageEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattleMessageEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattleMessageEvent.staticClass = @__class; - global::robocode.control.events.BattleMessageEvent.j4n_getMessage0 = @__env.GetMethodID(global::robocode.control.events.BattleMessageEvent.staticClass, "getMessage", "()Ljava/lang/String;"); - global::robocode.control.events.BattleMessageEvent.j4n__ctorBattleMessageEvent1 = @__env.GetMethodID(global::robocode.control.events.BattleMessageEvent.staticClass, "", "(Ljava/lang/String;)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - public virtual global::java.lang.String getMessage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.BattleMessageEvent.j4n_getMessage0)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattleMessageEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattlePausedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattlePausedEvent.generated.cs deleted file mode 100644 index 4cb8dfd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattlePausedEvent.generated.cs +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattlePausedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattlePausedEvent0; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public BattlePausedEvent() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.control.events.BattlePausedEvent.staticClass, global::robocode.control.events.BattlePausedEvent.j4n__ctorBattlePausedEvent0, this); - } - } - - protected BattlePausedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattlePausedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattlePausedEvent.staticClass = @__class; - global::robocode.control.events.BattlePausedEvent.j4n__ctorBattlePausedEvent0 = @__env.GetMethodID(global::robocode.control.events.BattlePausedEvent.staticClass, "", "()V"); - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattlePausedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleResumedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleResumedEvent.generated.cs deleted file mode 100644 index e3de918..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleResumedEvent.generated.cs +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleResumedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleResumedEvent0; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public BattleResumedEvent() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.control.events.BattleResumedEvent.staticClass, global::robocode.control.events.BattleResumedEvent.j4n__ctorBattleResumedEvent0, this); - } - } - - protected BattleResumedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattleResumedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattleResumedEvent.staticClass = @__class; - global::robocode.control.events.BattleResumedEvent.j4n__ctorBattleResumedEvent0 = @__env.GetMethodID(global::robocode.control.events.BattleResumedEvent.staticClass, "", "()V"); - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattleResumedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleStartedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleStartedEvent.generated.cs deleted file mode 100644 index 5efc401..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/BattleStartedEvent.generated.cs +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BattleStartedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getBattleRules0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isReplay1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotsCount2; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorBattleStartedEvent3; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/BattleRules;IZ)V")] - public BattleStartedEvent(global::java.lang.Object par0, int par1, bool par2) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.NewObject(global::robocode.control.events.BattleStartedEvent.staticClass, global::robocode.control.events.BattleStartedEvent.j4n__ctorBattleStartedEvent3, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2)); - } - } - - protected BattleStartedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.BattleStartedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.BattleStartedEvent.staticClass = @__class; - global::robocode.control.events.BattleStartedEvent.j4n_getBattleRules0 = @__env.GetMethodID(global::robocode.control.events.BattleStartedEvent.staticClass, "getBattleRules", "()Lrobocode/BattleRules;"); - global::robocode.control.events.BattleStartedEvent.j4n_isReplay1 = @__env.GetMethodID(global::robocode.control.events.BattleStartedEvent.staticClass, "isReplay", "()Z"); - global::robocode.control.events.BattleStartedEvent.j4n_getRobotsCount2 = @__env.GetMethodID(global::robocode.control.events.BattleStartedEvent.staticClass, "getRobotsCount", "()I"); - global::robocode.control.events.BattleStartedEvent.j4n__ctorBattleStartedEvent3 = @__env.GetMethodID(global::robocode.control.events.BattleStartedEvent.staticClass, "", "(Lrobocode/BattleRules;IZ)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/BattleRules;")] - public virtual global::java.lang.Object getBattleRules() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.BattleStartedEvent.j4n_getBattleRules0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isReplay() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.events.BattleStartedEvent.j4n_isReplay1))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getRobotsCount() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.events.BattleStartedEvent.j4n_getRobotsCount2))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.BattleStartedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/IBattleListener.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/IBattleListener.generated.cs deleted file mode 100644 index bc05339..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/IBattleListener.generated.cs +++ /dev/null @@ -1,331 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IBattleListener { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/BattleStartedEvent;)V")] - void onBattleStarted(global::robocode.control.events.BattleStartedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/BattleFinishedEvent;)V")] - void onBattleFinished(global::robocode.control.events.BattleFinishedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/BattleCompletedEvent;)V")] - void onBattleCompleted(global::robocode.control.events.BattleCompletedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/BattlePausedEvent;)V")] - void onBattlePaused(global::robocode.control.events.BattlePausedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/BattleResumedEvent;)V")] - void onBattleResumed(global::robocode.control.events.BattleResumedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/RoundStartedEvent;)V")] - void onRoundStarted(global::robocode.control.events.RoundStartedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/RoundEndedEvent;)V")] - void onRoundEnded(global::robocode.control.events.RoundEndedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/TurnStartedEvent;)V")] - void onTurnStarted(global::robocode.control.events.TurnStartedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/TurnEndedEvent;)V")] - void onTurnEnded(global::robocode.control.events.TurnEndedEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/BattleMessageEvent;)V")] - void onBattleMessage(global::robocode.control.events.BattleMessageEvent par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/BattleErrorEvent;)V")] - void onBattleError(global::robocode.control.events.BattleErrorEvent par0); - } - #endregion - - #region Component Designer generated code - public partial class IBattleListener_ { - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.@__IBattleListener.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::robocode.control.events.IBattleListener), typeof(global::robocode.control.events.IBattleListener_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::robocode.control.events.IBattleListener), typeof(global::robocode.control.events.IBattleListener_))] - internal sealed partial class @__IBattleListener : global::java.lang.Object, global::robocode.control.events.IBattleListener { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onBattleStarted0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onBattleFinished1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onBattleCompleted2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onBattlePaused3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onBattleResumed4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onRoundStarted5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onRoundEnded6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onTurnStarted7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onTurnEnded8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onBattleMessage9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_onBattleError10; - - private @__IBattleListener(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.@__IBattleListener.staticClass = @__class; - global::robocode.control.events.@__IBattleListener.j4n_onBattleStarted0 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onBattleStarted", "(Lrobocode/control/events/BattleStartedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onBattleFinished1 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onBattleFinished", "(Lrobocode/control/events/BattleFinishedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onBattleCompleted2 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onBattleCompleted", "(Lrobocode/control/events/BattleCompletedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onBattlePaused3 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onBattlePaused", "(Lrobocode/control/events/BattlePausedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onBattleResumed4 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onBattleResumed", "(Lrobocode/control/events/BattleResumedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onRoundStarted5 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onRoundStarted", "(Lrobocode/control/events/RoundStartedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onRoundEnded6 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onRoundEnded", "(Lrobocode/control/events/RoundEndedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onTurnStarted7 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onTurnStarted", "(Lrobocode/control/events/TurnStartedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onTurnEnded8 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onTurnEnded", "(Lrobocode/control/events/TurnEndedEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onBattleMessage9 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onBattleMessage", "(Lrobocode/control/events/BattleMessageEvent;)V"); - global::robocode.control.events.@__IBattleListener.j4n_onBattleError10 = @__env.GetMethodID(global::robocode.control.events.@__IBattleListener.staticClass, "onBattleError", "(Lrobocode/control/events/BattleErrorEvent;)V"); - } - - public void onBattleStarted(global::robocode.control.events.BattleStartedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onBattleStarted0, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onBattleFinished(global::robocode.control.events.BattleFinishedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onBattleFinished1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onBattleCompleted(global::robocode.control.events.BattleCompletedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onBattleCompleted2, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onBattlePaused(global::robocode.control.events.BattlePausedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onBattlePaused3, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onBattleResumed(global::robocode.control.events.BattleResumedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onBattleResumed4, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onRoundStarted(global::robocode.control.events.RoundStartedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onRoundStarted5, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onRoundEnded(global::robocode.control.events.RoundEndedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onRoundEnded6, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onTurnStarted(global::robocode.control.events.TurnStartedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onTurnStarted7, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onTurnEnded(global::robocode.control.events.TurnEndedEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onTurnEnded8, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onBattleMessage(global::robocode.control.events.BattleMessageEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onBattleMessage9, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void onBattleError(global::robocode.control.events.BattleErrorEvent par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::robocode.control.events.@__IBattleListener.j4n_onBattleError10, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IBattleListener); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onBattleStarted", "onBattleStarted0", "(Lrobocode/control/events/BattleStartedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onBattleFinished", "onBattleFinished1", "(Lrobocode/control/events/BattleFinishedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onBattleCompleted", "onBattleCompleted2", "(Lrobocode/control/events/BattleCompletedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onBattlePaused", "onBattlePaused3", "(Lrobocode/control/events/BattlePausedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onBattleResumed", "onBattleResumed4", "(Lrobocode/control/events/BattleResumedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onRoundStarted", "onRoundStarted5", "(Lrobocode/control/events/RoundStartedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onRoundEnded", "onRoundEnded6", "(Lrobocode/control/events/RoundEndedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onTurnStarted", "onTurnStarted7", "(Lrobocode/control/events/TurnStartedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onTurnEnded", "onTurnEnded8", "(Lrobocode/control/events/TurnEndedEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onBattleMessage", "onBattleMessage9", "(Lrobocode/control/events/BattleMessageEvent;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "onBattleError", "onBattleError10", "(Lrobocode/control/events/BattleErrorEvent;)V")); - return methods; - } - - private static void onBattleStarted0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/BattleStartedEvent;)V - // (Lrobocode/control/events/BattleStartedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onBattleStarted(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onBattleFinished1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/BattleFinishedEvent;)V - // (Lrobocode/control/events/BattleFinishedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onBattleFinished(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onBattleCompleted2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/BattleCompletedEvent;)V - // (Lrobocode/control/events/BattleCompletedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onBattleCompleted(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onBattlePaused3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/BattlePausedEvent;)V - // (Lrobocode/control/events/BattlePausedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onBattlePaused(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onBattleResumed4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/BattleResumedEvent;)V - // (Lrobocode/control/events/BattleResumedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onBattleResumed(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onRoundStarted5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/RoundStartedEvent;)V - // (Lrobocode/control/events/RoundStartedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onRoundStarted(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onRoundEnded6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/RoundEndedEvent;)V - // (Lrobocode/control/events/RoundEndedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onRoundEnded(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onTurnStarted7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/TurnStartedEvent;)V - // (Lrobocode/control/events/TurnStartedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onTurnStarted(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onTurnEnded8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/TurnEndedEvent;)V - // (Lrobocode/control/events/TurnEndedEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onTurnEnded(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onBattleMessage9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/BattleMessageEvent;)V - // (Lrobocode/control/events/BattleMessageEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onBattleMessage(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void onBattleError10(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lrobocode/control/events/BattleErrorEvent;)V - // (Lrobocode/control/events/BattleErrorEvent;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::robocode.control.events.IBattleListener @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.onBattleError(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.@__IBattleListener(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundEndedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundEndedEvent.generated.cs deleted file mode 100644 index 570931f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundEndedEvent.generated.cs +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RoundEndedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRound0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTurns1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalTurns2; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRoundEndedEvent3; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(III)V")] - public RoundEndedEvent(int par0, int par1, int par2) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.NewObject(global::robocode.control.events.RoundEndedEvent.staticClass, global::robocode.control.events.RoundEndedEvent.j4n__ctorRoundEndedEvent3, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2)); - } - } - - protected RoundEndedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.RoundEndedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.RoundEndedEvent.staticClass = @__class; - global::robocode.control.events.RoundEndedEvent.j4n_getRound0 = @__env.GetMethodID(global::robocode.control.events.RoundEndedEvent.staticClass, "getRound", "()I"); - global::robocode.control.events.RoundEndedEvent.j4n_getTurns1 = @__env.GetMethodID(global::robocode.control.events.RoundEndedEvent.staticClass, "getTurns", "()I"); - global::robocode.control.events.RoundEndedEvent.j4n_getTotalTurns2 = @__env.GetMethodID(global::robocode.control.events.RoundEndedEvent.staticClass, "getTotalTurns", "()I"); - global::robocode.control.events.RoundEndedEvent.j4n__ctorRoundEndedEvent3 = @__env.GetMethodID(global::robocode.control.events.RoundEndedEvent.staticClass, "", "(III)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getRound() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.events.RoundEndedEvent.j4n_getRound0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getTurns() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.events.RoundEndedEvent.j4n_getTurns1))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getTotalTurns() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.events.RoundEndedEvent.j4n_getTotalTurns2))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.RoundEndedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundStartedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundStartedEvent.generated.cs deleted file mode 100644 index 0ffd0f6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/RoundStartedEvent.generated.cs +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RoundStartedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRound0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getStartSnapshot1; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRoundStartedEvent2; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/snapshot/ITurnSnapshot;I)V")] - public RoundStartedEvent(global::robocode.control.snapshot.ITurnSnapshot par0, int par1) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.NewObject(global::robocode.control.events.RoundStartedEvent.staticClass, global::robocode.control.events.RoundStartedEvent.j4n__ctorRoundStartedEvent2, this, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - protected RoundStartedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.RoundStartedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.RoundStartedEvent.staticClass = @__class; - global::robocode.control.events.RoundStartedEvent.j4n_getRound0 = @__env.GetMethodID(global::robocode.control.events.RoundStartedEvent.staticClass, "getRound", "()I"); - global::robocode.control.events.RoundStartedEvent.j4n_getStartSnapshot1 = @__env.GetMethodID(global::robocode.control.events.RoundStartedEvent.staticClass, "getStartSnapshot", "()Lrobocode/control/snapshot/ITurnSnapshot;"); - global::robocode.control.events.RoundStartedEvent.j4n__ctorRoundStartedEvent2 = @__env.GetMethodID(global::robocode.control.events.RoundStartedEvent.staticClass, "", "(Lrobocode/control/snapshot/ITurnSnapshot;I)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getRound() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.events.RoundStartedEvent.j4n_getRound0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/snapshot/ITurnSnapshot;")] - public virtual global::robocode.control.snapshot.ITurnSnapshot getStartSnapshot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.RoundStartedEvent.j4n_getStartSnapshot1)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.RoundStartedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnEndedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnEndedEvent.generated.cs deleted file mode 100644 index 032500a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnEndedEvent.generated.cs +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class TurnEndedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTurnSnapshot0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorTurnEndedEvent1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/snapshot/ITurnSnapshot;)V")] - public TurnEndedEvent(global::robocode.control.snapshot.ITurnSnapshot par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.control.events.TurnEndedEvent.staticClass, global::robocode.control.events.TurnEndedEvent.j4n__ctorTurnEndedEvent1, this, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)); - } - } - - protected TurnEndedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.TurnEndedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.TurnEndedEvent.staticClass = @__class; - global::robocode.control.events.TurnEndedEvent.j4n_getTurnSnapshot0 = @__env.GetMethodID(global::robocode.control.events.TurnEndedEvent.staticClass, "getTurnSnapshot", "()Lrobocode/control/snapshot/ITurnSnapshot;"); - global::robocode.control.events.TurnEndedEvent.j4n__ctorTurnEndedEvent1 = @__env.GetMethodID(global::robocode.control.events.TurnEndedEvent.staticClass, "", "(Lrobocode/control/snapshot/ITurnSnapshot;)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/snapshot/ITurnSnapshot;")] - public virtual global::robocode.control.snapshot.ITurnSnapshot getTurnSnapshot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.events.TurnEndedEvent.j4n_getTurnSnapshot0)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.TurnEndedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnStartedEvent.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnStartedEvent.generated.cs deleted file mode 100644 index 118276b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/events/TurnStartedEvent.generated.cs +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.events { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class TurnStartedEvent : global::robocode.control.events.BattleEvent { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorTurnStartedEvent0; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public TurnStartedEvent() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.control.events.TurnStartedEvent.staticClass, global::robocode.control.events.TurnStartedEvent.j4n__ctorTurnStartedEvent0, this); - } - } - - protected TurnStartedEvent(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.events.TurnStartedEvent.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.events.TurnStartedEvent.staticClass = @__class; - global::robocode.control.events.TurnStartedEvent.j4n__ctorTurnStartedEvent0 = @__env.GetMethodID(global::robocode.control.events.TurnStartedEvent.staticClass, "", "()V"); - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.events.TurnStartedEvent(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/BulletState.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/BulletState.generated.cs deleted file mode 100644 index 6b49adf..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/BulletState.generated.cs +++ /dev/null @@ -1,195 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.snapshot { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BulletState : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_values0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_valueOf1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getValue2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_toState3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isActive4; - - internal static global::net.sf.jni4net.jni.FieldId j4n_FIRED5; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MOVING6; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HIT_VICTIM7; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HIT_BULLET8; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HIT_WALL9; - - internal static global::net.sf.jni4net.jni.FieldId j4n_EXPLODED10; - - internal static global::net.sf.jni4net.jni.FieldId j4n_INACTIVE11; - - protected BulletState(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.snapshot.BulletState.staticClass; - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState FIRED { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_FIRED5)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState MOVING { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_MOVING6)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState HIT_VICTIM { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_HIT_VICTIM7)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState HIT_BULLET { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_HIT_BULLET8)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState HIT_WALL { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_HIT_WALL9)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState EXPLODED { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_EXPLODED10)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState INACTIVE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_INACTIVE11)); - } - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.snapshot.BulletState.staticClass = @__class; - global::robocode.control.snapshot.BulletState.j4n_values0 = @__env.GetStaticMethodID(global::robocode.control.snapshot.BulletState.staticClass, "values", "()[Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_valueOf1 = @__env.GetStaticMethodID(global::robocode.control.snapshot.BulletState.staticClass, "valueOf", "(Ljava/lang/String;)Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_getValue2 = @__env.GetMethodID(global::robocode.control.snapshot.BulletState.staticClass, "getValue", "()I"); - global::robocode.control.snapshot.BulletState.j4n_toState3 = @__env.GetStaticMethodID(global::robocode.control.snapshot.BulletState.staticClass, "toState", "(I)Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_isActive4 = @__env.GetMethodID(global::robocode.control.snapshot.BulletState.staticClass, "isActive", "()Z"); - global::robocode.control.snapshot.BulletState.j4n_FIRED5 = @__env.GetStaticFieldID(global::robocode.control.snapshot.BulletState.staticClass, "FIRED", "Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_MOVING6 = @__env.GetStaticFieldID(global::robocode.control.snapshot.BulletState.staticClass, "MOVING", "Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_HIT_VICTIM7 = @__env.GetStaticFieldID(global::robocode.control.snapshot.BulletState.staticClass, "HIT_VICTIM", "Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_HIT_BULLET8 = @__env.GetStaticFieldID(global::robocode.control.snapshot.BulletState.staticClass, "HIT_BULLET", "Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_HIT_WALL9 = @__env.GetStaticFieldID(global::robocode.control.snapshot.BulletState.staticClass, "HIT_WALL", "Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_EXPLODED10 = @__env.GetStaticFieldID(global::robocode.control.snapshot.BulletState.staticClass, "EXPLODED", "Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.BulletState.j4n_INACTIVE11 = @__env.GetStaticFieldID(global::robocode.control.snapshot.BulletState.staticClass, "INACTIVE", "Lrobocode/control/snapshot/BulletState;"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/snapshot/BulletState;")] - public static robocode.control.snapshot.BulletState[] values() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_values0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState valueOf(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_valueOf1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getValue() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.BulletState.j4n_getValue2))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(I)Lrobocode/control/snapshot/BulletState;")] - public static global::robocode.control.snapshot.BulletState toState(int par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.snapshot.BulletState.staticClass, global::robocode.control.snapshot.BulletState.j4n_toState3, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isActive() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.BulletState.j4n_isActive4))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.snapshot.BulletState(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IBulletSnapshot.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IBulletSnapshot.generated.cs deleted file mode 100644 index 6c857ec..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IBulletSnapshot.generated.cs +++ /dev/null @@ -1,431 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.snapshot { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IBulletSnapshot { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/snapshot/BulletState;")] - global::robocode.control.snapshot.BulletState getState(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getX(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getY(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getHeading(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getPower(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getPaintX(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getPaintY(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getColor(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getFrame(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isExplosion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getExplosionImageIndex(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getBulletId(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getVictimIndex(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getOwnerIndex(); - } - #endregion - - #region Component Designer generated code - public partial class IBulletSnapshot_ { - - public static global::java.lang.Class _class { - get { - return global::robocode.control.snapshot.@__IBulletSnapshot.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::robocode.control.snapshot.IBulletSnapshot), typeof(global::robocode.control.snapshot.IBulletSnapshot_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::robocode.control.snapshot.IBulletSnapshot), typeof(global::robocode.control.snapshot.IBulletSnapshot_))] - internal sealed partial class @__IBulletSnapshot : global::java.lang.Object, global::robocode.control.snapshot.IBulletSnapshot { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getState0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getX1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getY2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getHeading3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getPower4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getPaintX5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getPaintY6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getColor7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFrame8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isExplosion9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getExplosionImageIndex10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getBulletId11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVictimIndex12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getOwnerIndex13; - - private @__IBulletSnapshot(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.snapshot.@__IBulletSnapshot.staticClass = @__class; - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getState0 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getState", "()Lrobocode/control/snapshot/BulletState;"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getX1 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getX", "()D"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getY2 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getY", "()D"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getHeading3 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getHeading", "()D"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getPower4 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getPower", "()D"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getPaintX5 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getPaintX", "()D"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getPaintY6 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getPaintY", "()D"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getColor7 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getColor", "()I"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getFrame8 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getFrame", "()I"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_isExplosion9 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "isExplosion", "()Z"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getExplosionImageIndex10 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getExplosionImageIndex", "()I"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getBulletId11 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getBulletId", "()I"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getVictimIndex12 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getVictimIndex", "()I"); - global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getOwnerIndex13 = @__env.GetMethodID(global::robocode.control.snapshot.@__IBulletSnapshot.staticClass, "getOwnerIndex", "()I"); - } - - public global::robocode.control.snapshot.BulletState getState() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getState0)); - } - } - - public double getX() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getX1))); - } - } - - public double getY() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getY2))); - } - } - - public double getHeading() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getHeading3))); - } - } - - public double getPower() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getPower4))); - } - } - - public double getPaintX() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getPaintX5))); - } - } - - public double getPaintY() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getPaintY6))); - } - } - - public int getColor() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getColor7))); - } - } - - public int getFrame() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getFrame8))); - } - } - - public bool isExplosion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_isExplosion9))); - } - } - - public int getExplosionImageIndex() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getExplosionImageIndex10))); - } - } - - public int getBulletId() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getBulletId11))); - } - } - - public int getVictimIndex() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getVictimIndex12))); - } - } - - public int getOwnerIndex() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IBulletSnapshot.j4n_getOwnerIndex13))); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IBulletSnapshot); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getState", "getState0", "()Lrobocode/control/snapshot/BulletState;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getX", "getX1", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getY", "getY2", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getHeading", "getHeading3", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getPower", "getPower4", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getPaintX", "getPaintX5", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getPaintY", "getPaintY6", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getColor", "getColor7", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getFrame", "getFrame8", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isExplosion", "isExplosion9", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getExplosionImageIndex", "getExplosionImageIndex10", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getBulletId", "getBulletId11", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVictimIndex", "getVictimIndex12", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getOwnerIndex", "getOwnerIndex13", "()I")); - return methods; - } - - private static global::net.sf.jni4net.utils.JniHandle getState0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Lrobocode/control/snapshot/BulletState; - // ()Lrobocode/control/snapshot/BulletState; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getState()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getX1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getX())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getY2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getY())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getHeading3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getHeading())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getPower4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getPower())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getPaintX5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getPaintX())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getPaintY6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getPaintY())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getColor7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getColor())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getFrame8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getFrame())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isExplosion9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isExplosion())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getExplosionImageIndex10(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getExplosionImageIndex())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getBulletId11(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getBulletId())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getVictimIndex12(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getVictimIndex())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getOwnerIndex13(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IBulletSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getOwnerIndex())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.snapshot.@__IBulletSnapshot(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IDebugProperty.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IDebugProperty.generated.cs deleted file mode 100644 index 9b34022..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IDebugProperty.generated.cs +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.snapshot { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IDebugProperty { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getValue(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getKey(); - } - #endregion - - #region Component Designer generated code - public partial class IDebugProperty_ { - - public static global::java.lang.Class _class { - get { - return global::robocode.control.snapshot.@__IDebugProperty.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::robocode.control.snapshot.IDebugProperty), typeof(global::robocode.control.snapshot.IDebugProperty_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::robocode.control.snapshot.IDebugProperty), typeof(global::robocode.control.snapshot.IDebugProperty_))] - internal sealed partial class @__IDebugProperty : global::java.lang.Object, global::robocode.control.snapshot.IDebugProperty { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getValue0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getKey1; - - private @__IDebugProperty(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.snapshot.@__IDebugProperty.staticClass = @__class; - global::robocode.control.snapshot.@__IDebugProperty.j4n_getValue0 = @__env.GetMethodID(global::robocode.control.snapshot.@__IDebugProperty.staticClass, "getValue", "()Ljava/lang/String;"); - global::robocode.control.snapshot.@__IDebugProperty.j4n_getKey1 = @__env.GetMethodID(global::robocode.control.snapshot.@__IDebugProperty.staticClass, "getKey", "()Ljava/lang/String;"); - } - - public global::java.lang.String getValue() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IDebugProperty.j4n_getValue0)); - } - } - - public global::java.lang.String getKey() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IDebugProperty.j4n_getKey1)); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IDebugProperty); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getValue", "getValue0", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getKey", "getKey1", "()Ljava/lang/String;")); - return methods; - } - - private static global::net.sf.jni4net.utils.JniHandle getValue0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IDebugProperty @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getValue()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getKey1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IDebugProperty @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getKey()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.snapshot.@__IDebugProperty(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IRobotSnapshot.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IRobotSnapshot.generated.cs deleted file mode 100644 index d73f872..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IRobotSnapshot.generated.cs +++ /dev/null @@ -1,795 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.snapshot { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IRobotSnapshot { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/snapshot/RobotState;")] - global::robocode.control.snapshot.RobotState getState(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getTeamName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getX(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getY(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getShortName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getVeryShortName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getRobotIndex(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getTeamIndex(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getContestantIndex(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getEnergy(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getVelocity(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getBodyHeading(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getGunHeading(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getRadarHeading(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getGunHeat(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getBodyColor(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getGunColor(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getRadarColor(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getScanColor(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isDroid(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isSentryRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isPaintRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isPaintEnabled(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isSGPaintEnabled(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/snapshot/IDebugProperty;")] - robocode.control.snapshot.IDebugProperty[] getDebugProperties(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getOutputStreamSnapshot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/snapshot/IScoreSnapshot;")] - global::robocode.control.snapshot.IScoreSnapshot getScoreSnapshot(); - } - #endregion - - #region Component Designer generated code - public partial class IRobotSnapshot_ { - - public static global::java.lang.Class _class { - get { - return global::robocode.control.snapshot.@__IRobotSnapshot.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::robocode.control.snapshot.IRobotSnapshot), typeof(global::robocode.control.snapshot.IRobotSnapshot_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::robocode.control.snapshot.IRobotSnapshot), typeof(global::robocode.control.snapshot.IRobotSnapshot_))] - internal sealed partial class @__IRobotSnapshot : global::java.lang.Object, global::robocode.control.snapshot.IRobotSnapshot { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getName0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getState1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTeamName2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getX3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getY4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getShortName5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVeryShortName6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotIndex7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTeamIndex8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getContestantIndex9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getEnergy10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVelocity11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getBodyHeading12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getGunHeading13; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRadarHeading14; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getGunHeat15; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getBodyColor16; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getGunColor17; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRadarColor18; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getScanColor19; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isDroid20; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isSentryRobot21; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isPaintRobot22; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isPaintEnabled23; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isSGPaintEnabled24; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getDebugProperties25; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getOutputStreamSnapshot26; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getScoreSnapshot27; - - private @__IRobotSnapshot(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.snapshot.@__IRobotSnapshot.staticClass = @__class; - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getName0 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getName", "()Ljava/lang/String;"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getState1 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getState", "()Lrobocode/control/snapshot/RobotState;"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getTeamName2 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getTeamName", "()Ljava/lang/String;"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getX3 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getX", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getY4 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getY", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getShortName5 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getShortName", "()Ljava/lang/String;"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getVeryShortName6 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getVeryShortName", "()Ljava/lang/String;"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getRobotIndex7 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getRobotIndex", "()I"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getTeamIndex8 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getTeamIndex", "()I"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getContestantIndex9 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getContestantIndex", "()I"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getEnergy10 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getEnergy", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getVelocity11 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getVelocity", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getBodyHeading12 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getBodyHeading", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getGunHeading13 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getGunHeading", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getRadarHeading14 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getRadarHeading", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getGunHeat15 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getGunHeat", "()D"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getBodyColor16 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getBodyColor", "()I"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getGunColor17 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getGunColor", "()I"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getRadarColor18 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getRadarColor", "()I"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getScanColor19 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getScanColor", "()I"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isDroid20 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "isDroid", "()Z"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isSentryRobot21 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "isSentryRobot", "()Z"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isPaintRobot22 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "isPaintRobot", "()Z"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isPaintEnabled23 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "isPaintEnabled", "()Z"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isSGPaintEnabled24 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "isSGPaintEnabled", "()Z"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getDebugProperties25 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getDebugProperties", "()[Lrobocode/control/snapshot/IDebugProperty;"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getOutputStreamSnapshot26 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getOutputStreamSnapshot", "()Ljava/lang/String;"); - global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getScoreSnapshot27 = @__env.GetMethodID(global::robocode.control.snapshot.@__IRobotSnapshot.staticClass, "getScoreSnapshot", "()Lrobocode/control/snapshot/IScoreSnapshot;"); - } - - public global::java.lang.String getName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getName0)); - } - } - - public global::robocode.control.snapshot.RobotState getState() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getState1)); - } - } - - public global::java.lang.String getTeamName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getTeamName2)); - } - } - - public double getX() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getX3))); - } - } - - public double getY() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getY4))); - } - } - - public global::java.lang.String getShortName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getShortName5)); - } - } - - public global::java.lang.String getVeryShortName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getVeryShortName6)); - } - } - - public int getRobotIndex() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getRobotIndex7))); - } - } - - public int getTeamIndex() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getTeamIndex8))); - } - } - - public int getContestantIndex() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getContestantIndex9))); - } - } - - public double getEnergy() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getEnergy10))); - } - } - - public double getVelocity() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getVelocity11))); - } - } - - public double getBodyHeading() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getBodyHeading12))); - } - } - - public double getGunHeading() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getGunHeading13))); - } - } - - public double getRadarHeading() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getRadarHeading14))); - } - } - - public double getGunHeat() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getGunHeat15))); - } - } - - public int getBodyColor() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getBodyColor16))); - } - } - - public int getGunColor() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getGunColor17))); - } - } - - public int getRadarColor() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getRadarColor18))); - } - } - - public int getScanColor() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getScanColor19))); - } - } - - public bool isDroid() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isDroid20))); - } - } - - public bool isSentryRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isSentryRobot21))); - } - } - - public bool isPaintRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isPaintRobot22))); - } - } - - public bool isPaintEnabled() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isPaintEnabled23))); - } - } - - public bool isSGPaintEnabled() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_isSGPaintEnabled24))); - } - } - - public robocode.control.snapshot.IDebugProperty[] getDebugProperties() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayFullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getDebugProperties25)); - } - } - - public global::java.lang.String getOutputStreamSnapshot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getOutputStreamSnapshot26)); - } - } - - public global::robocode.control.snapshot.IScoreSnapshot getScoreSnapshot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IRobotSnapshot.j4n_getScoreSnapshot27)); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IRobotSnapshot); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getName", "getName0", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getState", "getState1", "()Lrobocode/control/snapshot/RobotState;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTeamName", "getTeamName2", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getX", "getX3", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getY", "getY4", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getShortName", "getShortName5", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVeryShortName", "getVeryShortName6", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobotIndex", "getRobotIndex7", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTeamIndex", "getTeamIndex8", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getContestantIndex", "getContestantIndex9", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getEnergy", "getEnergy10", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVelocity", "getVelocity11", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getBodyHeading", "getBodyHeading12", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getGunHeading", "getGunHeading13", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRadarHeading", "getRadarHeading14", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getGunHeat", "getGunHeat15", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getBodyColor", "getBodyColor16", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getGunColor", "getGunColor17", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRadarColor", "getRadarColor18", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getScanColor", "getScanColor19", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isDroid", "isDroid20", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isSentryRobot", "isSentryRobot21", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isPaintRobot", "isPaintRobot22", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isPaintEnabled", "isPaintEnabled23", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isSGPaintEnabled", "isSGPaintEnabled24", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getDebugProperties", "getDebugProperties25", "()[Lrobocode/control/snapshot/IDebugProperty;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getOutputStreamSnapshot", "getOutputStreamSnapshot26", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getScoreSnapshot", "getScoreSnapshot27", "()Lrobocode/control/snapshot/IScoreSnapshot;")); - return methods; - } - - private static global::net.sf.jni4net.utils.JniHandle getName0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getState1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Lrobocode/control/snapshot/RobotState; - // ()Lrobocode/control/snapshot/RobotState; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getState()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getTeamName2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getTeamName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getX3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getX())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getY4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getY())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getShortName5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getShortName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getVeryShortName6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getVeryShortName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getRobotIndex7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getRobotIndex())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getTeamIndex8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getTeamIndex())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getContestantIndex9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getContestantIndex())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getEnergy10(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getEnergy())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getVelocity11(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getVelocity())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getBodyHeading12(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getBodyHeading())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getGunHeading13(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getGunHeading())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getRadarHeading14(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getRadarHeading())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getGunHeat15(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getGunHeat())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getBodyColor16(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getBodyColor())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getGunColor17(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getGunColor())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getRadarColor18(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getRadarColor())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getScanColor19(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getScanColor())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isDroid20(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isDroid())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isSentryRobot21(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isSentryRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isPaintRobot22(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isPaintRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isPaintEnabled23(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isPaintEnabled())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isSGPaintEnabled24(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isSGPaintEnabled())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getDebugProperties25(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()[Lrobocode/control/snapshot/IDebugProperty; - // ()[Lrobocode/control/snapshot/IDebugProperty; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayFullC2J(@__env, @__real.getDebugProperties()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getOutputStreamSnapshot26(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getOutputStreamSnapshot()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getScoreSnapshot27(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Lrobocode/control/snapshot/IScoreSnapshot; - // ()Lrobocode/control/snapshot/IScoreSnapshot; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IRobotSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.FullC2J(@__env, @__real.getScoreSnapshot()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.snapshot.@__IRobotSnapshot(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IScoreSnapshot.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IScoreSnapshot.generated.cs deleted file mode 100644 index 374c181..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/IScoreSnapshot.generated.cs +++ /dev/null @@ -1,558 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.snapshot { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IScoreSnapshot : global::java.lang.Comparable { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getTotalScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getTotalSurvivalScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getTotalLastSurvivorBonus(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getTotalBulletDamageScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getTotalBulletKillBonus(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getTotalRammingDamageScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getTotalRammingKillBonus(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getTotalFirsts(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getTotalSeconds(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getTotalThirds(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getCurrentScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getCurrentSurvivalScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getCurrentSurvivalBonus(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getCurrentBulletDamageScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getCurrentBulletKillBonus(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getCurrentRammingDamageScore(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()D")] - double getCurrentRammingKillBonus(); - } - #endregion - - #region Component Designer generated code - public partial class IScoreSnapshot_ { - - public static global::java.lang.Class _class { - get { - return global::robocode.control.snapshot.@__IScoreSnapshot.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::robocode.control.snapshot.IScoreSnapshot), typeof(global::robocode.control.snapshot.IScoreSnapshot_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::robocode.control.snapshot.IScoreSnapshot), typeof(global::robocode.control.snapshot.IScoreSnapshot_))] - internal sealed partial class @__IScoreSnapshot : global::java.lang.Object, global::robocode.control.snapshot.IScoreSnapshot { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_compareTo0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getName1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalScore2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalSurvivalScore3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalLastSurvivorBonus4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalBulletDamageScore5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalBulletKillBonus6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalRammingDamageScore7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalRammingKillBonus8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalFirsts9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalSeconds10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTotalThirds11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentScore12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentSurvivalScore13; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentSurvivalBonus14; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentBulletDamageScore15; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentBulletKillBonus16; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentRammingDamageScore17; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getCurrentRammingKillBonus18; - - private @__IScoreSnapshot(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.snapshot.@__IScoreSnapshot.staticClass = @__class; - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_compareTo0 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "compareTo", "(Ljava/lang/Object;)I"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getName1 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getName", "()Ljava/lang/String;"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalScore2 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalSurvivalScore3 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalSurvivalScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalLastSurvivorBonus4 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalLastSurvivorBonus", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalBulletDamageScore5 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalBulletDamageScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalBulletKillBonus6 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalBulletKillBonus", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalRammingDamageScore7 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalRammingDamageScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalRammingKillBonus8 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalRammingKillBonus", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalFirsts9 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalFirsts", "()I"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalSeconds10 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalSeconds", "()I"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalThirds11 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getTotalThirds", "()I"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentScore12 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getCurrentScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentSurvivalScore13 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getCurrentSurvivalScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentSurvivalBonus14 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getCurrentSurvivalBonus", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentBulletDamageScore15 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getCurrentBulletDamageScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentBulletKillBonus16 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getCurrentBulletKillBonus", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentRammingDamageScore17 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getCurrentRammingDamageScore", "()D"); - global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentRammingKillBonus18 = @__env.GetMethodID(global::robocode.control.snapshot.@__IScoreSnapshot.staticClass, "getCurrentRammingKillBonus", "()D"); - } - - public int compareTo(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_compareTo0, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)))); - } - } - - public global::java.lang.String getName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getName1)); - } - } - - public double getTotalScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalScore2))); - } - } - - public double getTotalSurvivalScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalSurvivalScore3))); - } - } - - public double getTotalLastSurvivorBonus() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalLastSurvivorBonus4))); - } - } - - public double getTotalBulletDamageScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalBulletDamageScore5))); - } - } - - public double getTotalBulletKillBonus() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalBulletKillBonus6))); - } - } - - public double getTotalRammingDamageScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalRammingDamageScore7))); - } - } - - public double getTotalRammingKillBonus() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalRammingKillBonus8))); - } - } - - public int getTotalFirsts() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalFirsts9))); - } - } - - public int getTotalSeconds() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalSeconds10))); - } - } - - public int getTotalThirds() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getTotalThirds11))); - } - } - - public double getCurrentScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentScore12))); - } - } - - public double getCurrentSurvivalScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentSurvivalScore13))); - } - } - - public double getCurrentSurvivalBonus() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentSurvivalBonus14))); - } - } - - public double getCurrentBulletDamageScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentBulletDamageScore15))); - } - } - - public double getCurrentBulletKillBonus() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentBulletKillBonus16))); - } - } - - public double getCurrentRammingDamageScore() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentRammingDamageScore17))); - } - } - - public double getCurrentRammingKillBonus() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((double)(@__env.CallDoubleMethod(this, global::robocode.control.snapshot.@__IScoreSnapshot.j4n_getCurrentRammingKillBonus18))); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IScoreSnapshot); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "compareTo", "compareTo0", "(Ljava/lang/Object;)I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getName", "getName1", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalScore", "getTotalScore2", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalSurvivalScore", "getTotalSurvivalScore3", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalLastSurvivorBonus", "getTotalLastSurvivorBonus4", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalBulletDamageScore", "getTotalBulletDamageScore5", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalBulletKillBonus", "getTotalBulletKillBonus6", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalRammingDamageScore", "getTotalRammingDamageScore7", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalRammingKillBonus", "getTotalRammingKillBonus8", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalFirsts", "getTotalFirsts9", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalSeconds", "getTotalSeconds10", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTotalThirds", "getTotalThirds11", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getCurrentScore", "getCurrentScore12", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getCurrentSurvivalScore", "getCurrentSurvivalScore13", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getCurrentSurvivalBonus", "getCurrentSurvivalBonus14", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getCurrentBulletDamageScore", "getCurrentBulletDamageScore15", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getCurrentBulletKillBonus", "getCurrentBulletKillBonus16", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getCurrentRammingDamageScore", "getCurrentRammingDamageScore17", "()D")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getCurrentRammingKillBonus", "getCurrentRammingKillBonus18", "()D")); - return methods; - } - - private static int compareTo0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Ljava/lang/Object;)I - // (Ljava/lang/Object;)I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(((global::java.lang.Comparable)(@__real)).compareTo(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0)))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getName1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getTotalScore2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getTotalScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getTotalSurvivalScore3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getTotalSurvivalScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getTotalLastSurvivorBonus4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getTotalLastSurvivorBonus())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getTotalBulletDamageScore5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getTotalBulletDamageScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getTotalBulletKillBonus6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getTotalBulletKillBonus())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getTotalRammingDamageScore7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getTotalRammingDamageScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getTotalRammingKillBonus8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getTotalRammingKillBonus())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getTotalFirsts9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getTotalFirsts())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getTotalSeconds10(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getTotalSeconds())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getTotalThirds11(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getTotalThirds())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getCurrentScore12(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getCurrentScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getCurrentSurvivalScore13(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getCurrentSurvivalScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getCurrentSurvivalBonus14(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getCurrentSurvivalBonus())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getCurrentBulletDamageScore15(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getCurrentBulletDamageScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getCurrentBulletKillBonus16(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getCurrentBulletKillBonus())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getCurrentRammingDamageScore17(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getCurrentRammingDamageScore())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static double getCurrentRammingKillBonus18(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()D - // ()D - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - double @__return = default(double); - try { - global::robocode.control.snapshot.IScoreSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((double)(@__real.getCurrentRammingKillBonus())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.snapshot.@__IScoreSnapshot(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/ITurnSnapshot.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/ITurnSnapshot.generated.cs deleted file mode 100644 index 417e14f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/ITurnSnapshot.generated.cs +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.snapshot { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface ITurnSnapshot { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/snapshot/IRobotSnapshot;")] - robocode.control.snapshot.IRobotSnapshot[] getRobots(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/snapshot/IBulletSnapshot;")] - robocode.control.snapshot.IBulletSnapshot[] getBullets(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getTPS(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getRound(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getTurn(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/snapshot/IScoreSnapshot;")] - robocode.control.snapshot.IScoreSnapshot[] getSortedTeamScores(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/snapshot/IScoreSnapshot;")] - robocode.control.snapshot.IScoreSnapshot[] getIndexedTeamScores(); - } - #endregion - - #region Component Designer generated code - public partial class ITurnSnapshot_ { - - public static global::java.lang.Class _class { - get { - return global::robocode.control.snapshot.@__ITurnSnapshot.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::robocode.control.snapshot.ITurnSnapshot), typeof(global::robocode.control.snapshot.ITurnSnapshot_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::robocode.control.snapshot.ITurnSnapshot), typeof(global::robocode.control.snapshot.ITurnSnapshot_))] - internal sealed partial class @__ITurnSnapshot : global::java.lang.Object, global::robocode.control.snapshot.ITurnSnapshot { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobots0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getBullets1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTPS2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRound3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTurn4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getSortedTeamScores5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getIndexedTeamScores6; - - private @__ITurnSnapshot(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.snapshot.@__ITurnSnapshot.staticClass = @__class; - global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getRobots0 = @__env.GetMethodID(global::robocode.control.snapshot.@__ITurnSnapshot.staticClass, "getRobots", "()[Lrobocode/control/snapshot/IRobotSnapshot;"); - global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getBullets1 = @__env.GetMethodID(global::robocode.control.snapshot.@__ITurnSnapshot.staticClass, "getBullets", "()[Lrobocode/control/snapshot/IBulletSnapshot;"); - global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getTPS2 = @__env.GetMethodID(global::robocode.control.snapshot.@__ITurnSnapshot.staticClass, "getTPS", "()I"); - global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getRound3 = @__env.GetMethodID(global::robocode.control.snapshot.@__ITurnSnapshot.staticClass, "getRound", "()I"); - global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getTurn4 = @__env.GetMethodID(global::robocode.control.snapshot.@__ITurnSnapshot.staticClass, "getTurn", "()I"); - global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getSortedTeamScores5 = @__env.GetMethodID(global::robocode.control.snapshot.@__ITurnSnapshot.staticClass, "getSortedTeamScores", "()[Lrobocode/control/snapshot/IScoreSnapshot;"); - global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getIndexedTeamScores6 = @__env.GetMethodID(global::robocode.control.snapshot.@__ITurnSnapshot.staticClass, "getIndexedTeamScores", "()[Lrobocode/control/snapshot/IScoreSnapshot;"); - } - - public robocode.control.snapshot.IRobotSnapshot[] getRobots() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayFullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getRobots0)); - } - } - - public robocode.control.snapshot.IBulletSnapshot[] getBullets() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayFullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getBullets1)); - } - } - - public int getTPS() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getTPS2))); - } - } - - public int getRound() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getRound3))); - } - } - - public int getTurn() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getTurn4))); - } - } - - public robocode.control.snapshot.IScoreSnapshot[] getSortedTeamScores() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayFullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getSortedTeamScores5)); - } - } - - public robocode.control.snapshot.IScoreSnapshot[] getIndexedTeamScores() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayFullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::robocode.control.snapshot.@__ITurnSnapshot.j4n_getIndexedTeamScores6)); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__ITurnSnapshot); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobots", "getRobots0", "()[Lrobocode/control/snapshot/IRobotSnapshot;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getBullets", "getBullets1", "()[Lrobocode/control/snapshot/IBulletSnapshot;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTPS", "getTPS2", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRound", "getRound3", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getTurn", "getTurn4", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getSortedTeamScores", "getSortedTeamScores5", "()[Lrobocode/control/snapshot/IScoreSnapshot;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getIndexedTeamScores", "getIndexedTeamScores6", "()[Lrobocode/control/snapshot/IScoreSnapshot;")); - return methods; - } - - private static global::net.sf.jni4net.utils.JniHandle getRobots0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()[Lrobocode/control/snapshot/IRobotSnapshot; - // ()[Lrobocode/control/snapshot/IRobotSnapshot; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.ITurnSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayFullC2J(@__env, @__real.getRobots()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getBullets1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()[Lrobocode/control/snapshot/IBulletSnapshot; - // ()[Lrobocode/control/snapshot/IBulletSnapshot; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.ITurnSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayFullC2J(@__env, @__real.getBullets()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getTPS2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.ITurnSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getTPS())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getRound3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.ITurnSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getRound())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getTurn4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::robocode.control.snapshot.ITurnSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getTurn())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getSortedTeamScores5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()[Lrobocode/control/snapshot/IScoreSnapshot; - // ()[Lrobocode/control/snapshot/IScoreSnapshot; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.ITurnSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayFullC2J(@__env, @__real.getSortedTeamScores()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getIndexedTeamScores6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()[Lrobocode/control/snapshot/IScoreSnapshot; - // ()[Lrobocode/control/snapshot/IScoreSnapshot; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::robocode.control.snapshot.ITurnSnapshot @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayFullC2J(@__env, @__real.getIndexedTeamScores()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.snapshot.@__ITurnSnapshot(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/RobotState.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/RobotState.generated.cs deleted file mode 100644 index 532ad1b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/generated/robocode/control/snapshot/RobotState.generated.cs +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.control.snapshot { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RobotState : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_values0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_valueOf1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getValue2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isAlive3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_toState4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isDead5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isHitRobot6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isHitWall7; - - internal static global::net.sf.jni4net.jni.FieldId j4n_ACTIVE8; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HIT_WALL9; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HIT_ROBOT10; - - internal static global::net.sf.jni4net.jni.FieldId j4n_DEAD11; - - protected RobotState(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.control.snapshot.RobotState.staticClass; - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/RobotState;")] - public static global::robocode.control.snapshot.RobotState ACTIVE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.RobotState.staticClass, global::robocode.control.snapshot.RobotState.j4n_ACTIVE8)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/RobotState;")] - public static global::robocode.control.snapshot.RobotState HIT_WALL { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.RobotState.staticClass, global::robocode.control.snapshot.RobotState.j4n_HIT_WALL9)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/RobotState;")] - public static global::robocode.control.snapshot.RobotState HIT_ROBOT { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.RobotState.staticClass, global::robocode.control.snapshot.RobotState.j4n_HIT_ROBOT10)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lrobocode/control/snapshot/RobotState;")] - public static global::robocode.control.snapshot.RobotState DEAD { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::robocode.control.snapshot.RobotState.staticClass, global::robocode.control.snapshot.RobotState.j4n_DEAD11)); - } - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.control.snapshot.RobotState.staticClass = @__class; - global::robocode.control.snapshot.RobotState.j4n_values0 = @__env.GetStaticMethodID(global::robocode.control.snapshot.RobotState.staticClass, "values", "()[Lrobocode/control/snapshot/RobotState;"); - global::robocode.control.snapshot.RobotState.j4n_valueOf1 = @__env.GetStaticMethodID(global::robocode.control.snapshot.RobotState.staticClass, "valueOf", "(Ljava/lang/String;)Lrobocode/control/snapshot/RobotState;"); - global::robocode.control.snapshot.RobotState.j4n_getValue2 = @__env.GetMethodID(global::robocode.control.snapshot.RobotState.staticClass, "getValue", "()I"); - global::robocode.control.snapshot.RobotState.j4n_isAlive3 = @__env.GetMethodID(global::robocode.control.snapshot.RobotState.staticClass, "isAlive", "()Z"); - global::robocode.control.snapshot.RobotState.j4n_toState4 = @__env.GetStaticMethodID(global::robocode.control.snapshot.RobotState.staticClass, "toState", "(I)Lrobocode/control/snapshot/RobotState;"); - global::robocode.control.snapshot.RobotState.j4n_isDead5 = @__env.GetMethodID(global::robocode.control.snapshot.RobotState.staticClass, "isDead", "()Z"); - global::robocode.control.snapshot.RobotState.j4n_isHitRobot6 = @__env.GetMethodID(global::robocode.control.snapshot.RobotState.staticClass, "isHitRobot", "()Z"); - global::robocode.control.snapshot.RobotState.j4n_isHitWall7 = @__env.GetMethodID(global::robocode.control.snapshot.RobotState.staticClass, "isHitWall", "()Z"); - global::robocode.control.snapshot.RobotState.j4n_ACTIVE8 = @__env.GetStaticFieldID(global::robocode.control.snapshot.RobotState.staticClass, "ACTIVE", "Lrobocode/control/snapshot/RobotState;"); - global::robocode.control.snapshot.RobotState.j4n_HIT_WALL9 = @__env.GetStaticFieldID(global::robocode.control.snapshot.RobotState.staticClass, "HIT_WALL", "Lrobocode/control/snapshot/RobotState;"); - global::robocode.control.snapshot.RobotState.j4n_HIT_ROBOT10 = @__env.GetStaticFieldID(global::robocode.control.snapshot.RobotState.staticClass, "HIT_ROBOT", "Lrobocode/control/snapshot/RobotState;"); - global::robocode.control.snapshot.RobotState.j4n_DEAD11 = @__env.GetStaticFieldID(global::robocode.control.snapshot.RobotState.staticClass, "DEAD", "Lrobocode/control/snapshot/RobotState;"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Lrobocode/control/snapshot/RobotState;")] - public static robocode.control.snapshot.RobotState[] values() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.snapshot.RobotState.staticClass, global::robocode.control.snapshot.RobotState.j4n_values0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)Lrobocode/control/snapshot/RobotState;")] - public static global::robocode.control.snapshot.RobotState valueOf(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.snapshot.RobotState.staticClass, global::robocode.control.snapshot.RobotState.j4n_valueOf1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getValue() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::robocode.control.snapshot.RobotState.j4n_getValue2))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isAlive() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.RobotState.j4n_isAlive3))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(I)Lrobocode/control/snapshot/RobotState;")] - public static global::robocode.control.snapshot.RobotState toState(int par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::robocode.control.snapshot.RobotState.staticClass, global::robocode.control.snapshot.RobotState.j4n_toState4, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isDead() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.RobotState.j4n_isDead5))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isHitRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.RobotState.j4n_isHitRobot6))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isHitWall() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::robocode.control.snapshot.RobotState.j4n_isHitWall7))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.control.snapshot.RobotState(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RandomFactory.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RandomFactory.cs deleted file mode 100644 index 971149f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RandomFactory.cs +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using net.sf.robocode.security; - -namespace robocode.control -{ - partial class RandomFactory : IHiddenRandomHelper - { - private RandomRedirect rr; - - public RandomFactory(bool fakeInstance) - { - } - - #region IHiddenRandomHelper Members - - public Random GetRandom() - { - if (isDeterministic()) - { - if (rr == null) - { - rr = new RandomRedirect(getRandom()); - } - return rr; - } - return new Random(); - } - - #endregion - } - - public class RandomRedirect : Random - { - private java.util.Random r; - - public RandomRedirect(java.util.Random r) - { - this.r = r; - } - - public override int Next() - { - return r.nextInt(); - } - - public override int Next(int maxValue) - { - return r.nextInt(maxValue); - } - - public override int Next(int minValue, int maxValue) - { - return minValue + r.nextInt(maxValue - minValue); - } - - public override void NextBytes(byte[] buffer) - { - throw new NotImplementedException(); - } - - public override double NextDouble() - { - return r.nextDouble(); - } - } - -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RobocodeEngine.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RobocodeEngine.cs deleted file mode 100644 index e6e2ca2..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/glue/robocode/control/RobocodeEngine.cs +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using net.sf.jni4net; -using File = java.io.File; - -namespace robocode.control -{ - public partial class RobocodeEngine - { - public static void Init(string robocodeHome) - { - BridgeSetup bridgeSetup = new BridgeSetup(); - bridgeSetup.BindStatic = true; - bridgeSetup.BindNative = true; - bridgeSetup.AddAllJarsClassPath(Path.Combine(robocodeHome, "libs")); - Bridge.CreateJVM(bridgeSetup); - Bridge.LoadAndRegisterAssemblyByName(typeof(RobocodeEngine).Assembly.FullName); - //Bridge.Setup.BindNative = true; - Bridge.Setup.BindStatic = true; - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattleSpecification.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattleSpecification.cs deleted file mode 100644 index 0401ff0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattleSpecification.cs +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control -{ - /// - /// A BattleSpecification defines a battle configuration used by the . - /// - [Serializable] - public class BattleSpecification - { - private readonly int battlefieldWidth; - private readonly int battlefieldHeight; - private readonly int numRounds; - private readonly double gunCoolingRate; - private readonly long inactivityTime; - private readonly bool hideEnemyNames; - private readonly int sentryBorderSize; - private readonly RobotSpecification[] robots; - private readonly RobotSetup[] initialSetups; - - /// - /// Creates a new BattleSpecification with the given number of rounds, - /// battlefield size, and robots. Inactivity time for the robots defaults to - /// 450, and the gun cooling rate defaults to 0.1. - /// - /// The number of rounds in this battle. - /// The battlefield size. - /// The robots participating in this battle. - public BattleSpecification(int numRounds, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) : - this(numRounds, 450, .1, battlefieldSize, robots) - { - } - - /// - /// Creates a new BattleSpecification with the given settings. - /// - /// The number of rounds in this battle. - /// The inactivity time allowed for the robots before - /// they will loose energy. - /// The gun cooling rate for the robots. - /// The battlefield size. - /// The robots participating in this battle. - public BattleSpecification(int numRounds, long inactivityTime, double gunCoolingRate, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) : - this(numRounds, inactivityTime, gunCoolingRate, false, battlefieldSize, robots) - { - } - - /// - /// Creates a new BattleSpecification with the given settings. - /// - /// The number of rounds in this battle. - /// The inactivity time allowed for the robots before - /// they will loose energy. - /// The gun cooling rate for the robots. - /// Flag specifying if enemy names are hidden from robots. - /// The battlefield size. - /// The robots participating in this battle. - public BattleSpecification(int numRounds, long inactivityTime, double gunCoolingRate, bool hideEnemyNames, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) : - this(battlefieldSize, numRounds, inactivityTime, gunCoolingRate, 100, hideEnemyNames, robots) - { - } - - /// - /// Creates a new BattleSpecification with the given settings. - /// - /// The battlefield size. - /// The number of rounds in this battle. - /// The inactivity time allowed for the robots before - /// they will loose energy. - /// The gun cooling rate for the robots. - /// The sentry border size for a BorderSentry. - /// Flag specifying if enemy names are hidden from robots. - /// The robots participating in this battle. - public BattleSpecification(BattlefieldSpecification battlefieldSize, int numRounds, long inactivityTime, double gunCoolingRate, int sentryBorderSize, bool hideEnemyNames, RobotSpecification[] robots) : - this(battlefieldSize, numRounds, inactivityTime, gunCoolingRate, 100, hideEnemyNames, robots, null) - { - } - - /// - /// Creates a new BattleSpecification with the given settings. - /// - /// The battlefield size. - /// The number of rounds in this battle. - /// The inactivity time allowed for the robots before - /// they will loose energy. - /// The gun cooling rate for the robots. - /// The sentry border size for a BorderSentry. - /// Flag specifying if enemy names are hidden from robots. - /// The robots participating in this battle. - /// The initial position and heading of the robots, where the indices matches the indices from the . - public BattleSpecification(BattlefieldSpecification battlefieldSize, int numRounds, long inactivityTime, double gunCoolingRate, int sentryBorderSize, bool hideEnemyNames, RobotSpecification[] robots, RobotSetup[] initialSetups) - { - if (battlefieldSize == null) - { - throw new ArgumentException("battlefieldSize cannot be null"); - } - if (robots == null) - { - throw new ArgumentException("robots cannot be null"); - } - if (robots.Length < 1) - { - throw new ArgumentException("robots.Length must be > 0"); - } - if (initialSetups != null && initialSetups.Length != robots.Length) - { - throw new ArgumentException("initialSetups.Length must be == robots.Length"); - } - if (numRounds < 1) - { - throw new ArgumentException("numRounds must be >= 1"); - } - if (inactivityTime < 1) - { - throw new ArgumentException("inactivityTime must be >= 1"); - } - if (gunCoolingRate < 0.1) - { - throw new ArgumentException("inactivityTime must be >= 0.1"); - } - if (sentryBorderSize < 50) - { - throw new ArgumentException("sentryBorderSize must be >= 50"); - } - this.battlefieldWidth = battlefieldSize.Width; - this.battlefieldHeight = battlefieldSize.Height; - this.numRounds = numRounds; - this.inactivityTime = inactivityTime; - this.gunCoolingRate = gunCoolingRate; - this.sentryBorderSize = sentryBorderSize; - this.hideEnemyNames = hideEnemyNames; - this.robots = robots; - this.initialSetups = initialSetups; - } - - /// - /// Contains the allowed inactivity time for the robots in this battle. - /// - /// - /// The allowed inactivity time for the robots in this battle. - /// - public long InactivityTime - { - get { return inactivityTime; } - } - - /// - /// Contains the gun cooling rate of the robots in this battle. - /// - /// - /// The gun cooling rate of the robots in this battle. - /// - public double GunCoolingRate - { - get { return gunCoolingRate; } - } - - /// - /// Contains the battlefield size for this battle. - /// - /// - /// The battlefield size for this battle. - /// - public BattlefieldSpecification Battlefield - { - get { return new BattlefieldSpecification(battlefieldWidth, battlefieldHeight); } - } - - /// - /// Contains the number of rounds in this battle. - /// - /// - /// The number of rounds in this battle. - /// - public int NumRounds - { - get { return numRounds; } - } - - /// - /// Flag specifying if the enemy names must be hidden from events sent to robots. - /// - /// - /// true if the enemy names must be hidden; false otherwise. - /// - public bool HideEnemyNames - { - get { return hideEnemyNames; } - } - - /// - /// Returns the sentry border size for a BorderSentry that defines the how - /// far a BorderSentry is allowed to move from the border edges measured in units. - ///

- /// Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that - /// border sentry robots cannot leave (they must stay in the border area), but it also define the - /// distance from the border edges where border sentry robots are allowed/able to make damage to robots entering this - /// border area. - ///

- public int SentryBorderSize - { - get { return sentryBorderSize; } - } - - /// - /// Contains the specifications of the robots participating in this battle. - /// - /// - /// An array of instances - one entry for each robot. - /// - /// - public RobotSpecification[] Robots - { - get - { - if (robots == null) - return null; - - RobotSpecification[] copy = new RobotSpecification[robots.Length]; - robots.CopyTo(copy, 0); - return copy; - } - } - - /// - /// Contains the initial position and heading of each robot participating in this battle. - /// - /// - /// An array of instances - one entry for each robot. - /// The the indices of this array matches the array indices from the robot specifications (see ). - /// - /// - public RobotSetup[] InitialSetups - { - get - { - if (initialSetups == null) - return null; - - RobotSetup[] copy = new RobotSetup[initialSetups.Length]; - initialSetups.CopyTo(copy, 0); - return copy; - } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattlefieldSpecification.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattlefieldSpecification.cs deleted file mode 100644 index d59dab6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/BattlefieldSpecification.cs +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control -{ - /// - /// Defines the size of a battlefield, which is a part of the . - /// - /// - /// - /// - [Serializable] - public class BattlefieldSpecification - { - private readonly int width; - private readonly int height; - - /// - /// Creates a standard 800 x 600 battlefield. - /// - public BattlefieldSpecification() - : this(800, 600) - { - } - - /// - /// Creates a battlefield of the specified width and height. - /// - /// The width of the battlefield, where 400 <= width <= 5000. - /// The height of the battlefield, where 400 <= height <= 5000. - /// Thrown when the width or height is < 400 or > 5000. - /// - public BattlefieldSpecification(int width, int height) - { - if (width < 400 || width > 5000) - throw new ArgumentException("width must be: 400 <= width <= 5000"); - - if (height < 400 || height > 5000) - throw new ArgumentException("height must be: 400 <= height <= 5000"); - - this.width = width; - this.height = height; - } - - /// - /// Contains the width of this battlefield. - /// - /// - /// The width of this battlefield. - /// - public int Width - { - get { return width; } - } - - /// - /// Contains the height of this battlefield. - /// - /// - /// The height of this battlefield. - /// - public int Height - { - get { return height; } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/IRobocodeEngine.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/IRobocodeEngine.cs deleted file mode 100644 index b87d8cc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/IRobocodeEngine.cs +++ /dev/null @@ -1,237 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; -using Robocode.Control.Events; // for the XML documentation - -namespace Robocode.Control -{ - /// - /// Event handler for the . - /// - /// The event. - public delegate void BattleStartedEventHandler(Robocode.Control.Events.BattleStartedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void BattleFinishedEventHandler(Robocode.Control.Events.BattleFinishedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void BattleCompletedEventHandler(Robocode.Control.Events.BattleCompletedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void BattlePausedEventHandler(Robocode.Control.Events.BattlePausedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void BattleResumedEventHandler(Robocode.Control.Events.BattleResumedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void RoundStartedEventHandler(Robocode.Control.Events.RoundStartedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void RoundEndedEventHandler(Robocode.Control.Events.RoundEndedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void TurnStartedEventHandler(Robocode.Control.Events.TurnStartedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void TurnEndedEventHandler(Robocode.Control.Events.TurnEndedEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void BattleMessageEventHandler(Robocode.Control.Events.BattleMessageEvent evnt); - - /// - /// Event handler for the . - /// - /// The event. - public delegate void BattleErrorEventHandler(Robocode.Control.Events.BattleErrorEvent evnt); - - /// - /// Interface for a RobocodeEngine. - /// - public interface IRobocodeEngine - { - /// - /// Occurs when a new battle is started. - /// - event BattleStartedEventHandler BattleStarted; - - /// - /// Occurs when the battle is finished, where the battle can be either completed or aborted. - /// - event BattleFinishedEventHandler BattleFinished; - - /// - /// Occurs when the battle is completed successfully and results are available. - /// - event BattleCompletedEventHandler BattleCompleted; - - /// - /// Occurs when the battle is paused. - /// - event BattlePausedEventHandler BattlePaused; - - /// - /// Occurs when the battle is resumed after having been paused. - /// - event BattleResumedEventHandler BattleResumed; - - /// - /// Occurs when a new round is started. - /// - event RoundStartedEventHandler RoundStarted; - - /// - /// Occurs when a round has ended. - /// - event RoundEndedEventHandler RoundEnded; - - /// - /// Occurs when a new turn is started. - /// - event TurnStartedEventHandler TurnStarted; - - /// - /// Occurs when a new turn is ended. - /// - event TurnEndedEventHandler TurnEnded; - - /// - /// Occurs when a message from the battle is sent from the game. - /// - event BattleMessageEventHandler BattleMessage; - - /// - /// Occurs when an error message from the battle is sent from the game. - /// - event BattleErrorEventHandler BattleError; - - /// - /// Closes the RobocodeEngine and releases any allocated resources it holds. - /// You should call this when you have finished using the RobocodeEngine. - /// This method automatically disposes the Robocode window if it open. - /// - void Close(); - - /// - /// Contains the installed version of Robocode controlled by this RobocodeEngine. - /// - /// - /// The installed version of Robocode controlled by this RobocodeEngine. - /// - string Version { get; } - - /// - /// Contains the visible state of the Robocode window. - /// - /// - /// Sets/gets the visible state of the Robocode window, where - /// true means that the window is visible, and - /// false means that the window is hidden. - /// - bool Visible { get; set; } - - /// - /// Returns all robots available from the local robot repository of Robocode. - /// These robots must exists in the \robocode\robots directory, and must be - /// compiled in advance, before these robot are returned with this method. - /// - /// - /// An array of all available robots from the local robot repository. - /// - RobotSpecification[] GetLocalRepository(); - - /// - /// Returns a selection of robots available from the local robot repository - /// of Robocode. These robots must exists in the \robocode\robots directory, - /// and must be compiled in advance, before these robot are returned with this method. - ///

- /// Notice: If a specified robot cannot be found in the repository, it will - /// not be returned in the array of robots returned by this method. - ///

- /// A comma or space separated list of robots to return. - /// The full class name must be used for specifying the individual robot, e.g. - /// "sample.Corners, sample.Crazy". - /// - /// An array containing the available robots from the local robot repository based on - /// the selected robots specified with the selectedRobotList parameter. - /// - RobotSpecification[] GetLocalRepository(String selectedRobotList); - - /// - /// Runs the specified battle. - /// - /// The specification of the battle to run - /// including the participation robots. - /// - void RunBattle(BattleSpecification battleSpecification); - - /// - /// Runs the specified battle. - /// - /// The specification of the battle to run - /// including the participating robots. - /// Will block caller till end of battle if set. - /// - void RunBattle(BattleSpecification battleSpecification, bool waitTillOver); - - /// - /// Runs the specified battle. - /// - /// The specification of the battle to run - /// including the participating robots. - /// A comma or space separated list like: - /// x1,y1,heading1, x2,y2,heading2, which are the coordinates and heading of - /// robot #1 and #2. So e.g. 0,0,180, 50,80,270 means that robot #1 has position - /// (0,0) and heading 180, and robot #2 has position (50,80) and heading 270. - /// Will block caller till end of battle if set. - /// - void RunBattle(BattleSpecification battleSpecification, string initialPositions, bool waitTillOver); - - /// - /// Will block caller until current battle is over. - /// - /// - void WaitTillBattleOver(); - - /// - /// Aborts the current battle if it is running. - /// - /// - void AbortCurrentBattle(); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobocodeEngine.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobocodeEngine.cs deleted file mode 100644 index 956f270..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobocodeEngine.cs +++ /dev/null @@ -1,1682 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Robocode.Control.Events; -using Robocode.Control.Snapshot; -using net.sf.robocode.security; - -namespace Robocode.Control -{ - /// - /// The RobocodeEngine is the interface provided for external applications - /// in order to let these applications run battles within the Robocode application, - /// and to get the results from these battles. - ///

- /// This class in the main entry class of the namespace. - ///

- /// The RobocodeEngine is used by e.g. RoboRumble@Home client, which is integrated in - /// Robocode. In addition, the RobocodeEngine is also used by the test units for - /// testing the Robocode application itself. - ///

- public class RobocodeEngine : IRobocodeEngine - { - /// - public event BattleStartedEventHandler BattleStarted; - /// - public event BattleFinishedEventHandler BattleFinished; - /// - public event BattleCompletedEventHandler BattleCompleted; - /// - public event BattlePausedEventHandler BattlePaused; - /// - public event BattleResumedEventHandler BattleResumed; - /// - public event RoundStartedEventHandler RoundStarted; - /// - public event RoundEndedEventHandler RoundEnded; - /// - public event TurnStartedEventHandler TurnStarted; - /// - public event TurnEndedEventHandler TurnEnded; - /// - public event BattleMessageEventHandler BattleMessage; - /// - public event BattleErrorEventHandler BattleError; - - // The internal hidden engine that has been generated based on the Java version of the engine - private robocode.control.RobocodeEngine engine; - // The internal robocode.control.events.IBattleListener - private BattleObserver battleObserver; - // Flag specifying if the Robocode window is currently visible - private bool isVisible; - - #region Public API - - /// - /// Creates a new RobocodeEngine for controlling Robocode. - /// In order for this constructor to work, the current working directory must be the - /// home directory directory of Robocode, e.g. C:\Robocode - /// - /// - public RobocodeEngine() : - this(AppDomain.CurrentDomain.BaseDirectory) - { - } - - /// - /// Creates a new RobocodeEngine for controlling Robocode, where the home directory - /// of Robocode is specified. - /// - /// The root directory of Robocode, e.g. "C:\Robocode". - /// - public RobocodeEngine(string robocodeHome) - { - robocode.control.RobocodeEngine.Init(robocodeHome); - engine = new robocode.control.RobocodeEngine(new java.io.File(robocodeHome)); - battleObserver = new BattleObserver(this); - engine.addBattleListener(battleObserver); - } - - ~RobocodeEngine() - { - // Make sure Close() is called to prevent memory leaks - Close(); - } - - /// - public void Close() - { - engine.close(); - } - - /// - public string Version - { - get { return engine.getVersion(); } - } - - /// - /// Returns the current working directory for Robocode. - /// - /// - /// The name of the current working directory. - /// - public static string CurrentWorkingDir - { - get { return robocode.control.RobocodeEngine.getCurrentWorkingDir().getAbsolutePath(); } - } - - /// - /// Returns the directory containing the robots. - /// - /// - /// The name of the robot directory containing all robots. - /// - public static string RobotsDir - { - get { return robocode.control.RobocodeEngine.getRobotsDir().getAbsolutePath(); } - } - - /// - public bool Visible - { - set - { - isVisible = value; - engine.setVisible(value); - } - get - { - return isVisible; - } - } - - /// - public RobotSpecification[] GetLocalRepository() - { - return MapRobotSpecifications(engine.getLocalRepository()); - } - - /// - public RobotSpecification[] GetLocalRepository(string selectedRobots) - { - return MapRobotSpecifications(engine.getLocalRepository(selectedRobots)); - } - - /// - public void RunBattle(BattleSpecification battleSpecification) - { - RunBattle(battleSpecification, null, false); - } - - /// - public void RunBattle(BattleSpecification battleSpecification, bool waitTillOver) - { - RunBattle(battleSpecification, "", waitTillOver); - } - - /// - public void RunBattle(BattleSpecification battleSpecification, string initialPositions, bool waitTillOver) - { - engine.runBattle(MapBattleSpecification(battleSpecification), initialPositions, waitTillOver); - } - - /// - public void WaitTillBattleOver() - { - engine.waitTillBattleOver(); - } - - /// - public void AbortCurrentBattle() - { - engine.abortCurrentBattle(); - } - - /// - /// Prints out all running threads to standard system out. - /// - public static void PrintRunningThreads() - { - robocode.control.RobocodeEngine.printRunningThreads(); - } - - /// - /// Enables or disables messages and warnings logged to Console.Out. - /// - /// - /// true means that log messages must be enabled, and - /// false means that log messages must be disabled. - /// - /// - public static bool LogMessagesEnabled - { - set - { - robocode.control.RobocodeEngine.setLogMessagesEnabled(value); - } - } - - /// - /// Enables or disables errors logged to Console.Error. - /// - /// - /// true means that log errors must be enabled, and - /// false means that log errors must be disabled. - /// - /// - public static bool LogErrorsEnabled - { - set - { - robocode.control.RobocodeEngine.setLogErrorsEnabled(value); - } - } - - #endregion - - #region Event dispatchers - - private void OnBattleStarted(BattleStartedEvent e) - { - if (BattleStarted != null) - BattleStarted(e); - } - - private void OnBattleFinished(BattleFinishedEvent e) - { - if (BattleFinished != null) - BattleFinished(e); - } - - private void OnBattleCompleted(BattleCompletedEvent e) - { - if (BattleCompleted != null) - BattleCompleted(e); - } - - private void OnBattlePaused(BattlePausedEvent e) - { - if (BattlePaused != null) - BattlePaused(e); - } - - private void OnBattleResumed(BattleResumedEvent e) - { - if (BattleResumed != null) - BattleResumed(e); - } - - private void OnRoundStarted(RoundStartedEvent e) - { - if (RoundStarted != null) - RoundStarted(e); - } - - private void OnRoundEnded(Robocode.Control.Events.RoundEndedEvent e) - { - if (RoundEnded != null) - RoundEnded(e); - } - - private void OnTurnStarted(TurnStartedEvent e) - { - if (TurnStarted != null) - TurnStarted(e); - } - - private void OnTurnEnded(TurnEndedEvent e) - { - if (TurnEnded != null) - TurnEnded(e); - } - - private void OnBattleMessage(BattleMessageEvent e) - { - if (BattleMessage != null) - BattleMessage(e); - } - - private void OnBattleError(BattleErrorEvent e) - { - if (BattleError != null) - BattleError(e); - } - - #endregion - - #region Specification mappers - - private RobotSpecification[] MapRobotSpecifications(robocode.control.RobotSpecification[] specifications) - { - if (specifications == null) - { - return null; - } - - RobotSpecification[] mappedSpecifications = new RobotSpecification[specifications.Length]; - - for (int i = 0; i < specifications.Length; i++) - { - mappedSpecifications[i] = MapRobotSpecification(specifications[i]); - } - return mappedSpecifications; - } - - private RobotSpecification MapRobotSpecification(robocode.control.RobotSpecification spec) - { - return new RobotSpecification(spec); - } - - private robocode.control.RobotSpecification[] MapRobotSpecifications(RobotSpecification[] specifications) - { - if (specifications == null) - { - return null; - } - - robocode.control.RobotSpecification[] mappedSpecifications = new robocode.control.RobotSpecification[specifications.Length]; - - for (int i = 0; i < specifications.Length; i++) - { - mappedSpecifications[i] = MapRobotSpecification(specifications[i]); - } - return mappedSpecifications; - } - - private robocode.control.RobotSpecification MapRobotSpecification(RobotSpecification spec) - { - return spec.robotSpecification; - } - - private robocode.control.BattleSpecification MapBattleSpecification(BattleSpecification spec) - { - robocode.control.BattlefieldSpecification battlefieldSpec = new robocode.control.BattlefieldSpecification(spec.Battlefield.Width, spec.Battlefield.Height); - robocode.control.RobotSpecification[] robotSpecs = MapRobotSpecifications(spec.Robots); - robocode.control.RobotSetup[] initialSetups = MapInitialSetups(spec.InitialSetups); - - return new robocode.control.BattleSpecification(battlefieldSpec, spec.NumRounds, spec.InactivityTime, - spec.GunCoolingRate, spec.SentryBorderSize, spec.HideEnemyNames, robotSpecs, initialSetups); - } - - private robocode.control.RobotSetup[] MapInitialSetups(RobotSetup[] setups) - { - if (setups == null) - { - return null; - } - - robocode.control.RobotSetup[] mappedSetups = new robocode.control.RobotSetup[setups.Length]; - - for (int i = 0; i < setups.Length; i++) - { - mappedSetups[i] = MapRobotSetup(setups[i]); - } - return mappedSetups; - } - - private robocode.control.RobotSetup MapRobotSetup(RobotSetup setup) - { - return new robocode.control.RobotSetup(setup.X, setup.Y, setup.Heading); - } - #endregion - - #region Battle observer (internal engine events -> Robocode.Control.Events) - - private class BattleObserver : robocode.control.events.IBattleListener - { - RobocodeEngine engine; - - public BattleObserver(RobocodeEngine engine) - { - this.engine = engine; - } - - public void onBattleStarted(robocode.control.events.BattleStartedEvent evnt) - { - engine.OnBattleStarted(MapEvent(evnt)); - } - - public void onBattleFinished(robocode.control.events.BattleFinishedEvent evnt) - { - engine.OnBattleFinished(MapEvent(evnt)); - } - - public void onBattleCompleted(robocode.control.events.BattleCompletedEvent evnt) - { - engine.OnBattleCompleted(MapEvent(evnt)); - } - - public void onBattlePaused(robocode.control.events.BattlePausedEvent evnt) - { - engine.OnBattlePaused(new BattlePausedEvent()); - } - - public void onBattleResumed(robocode.control.events.BattleResumedEvent evnt) - { - engine.OnBattleResumed(new BattleResumedEvent()); - } - - public void onRoundStarted(robocode.control.events.RoundStartedEvent evnt) - { - engine.OnRoundStarted(MapEvent(evnt)); - } - - public void onRoundEnded(robocode.control.events.RoundEndedEvent evnt) - { - engine.OnRoundEnded(MapEvent(evnt)); - } - - public void onTurnStarted(robocode.control.events.TurnStartedEvent evnt) - { - engine.OnTurnStarted(new TurnStartedEvent()); - } - - public void onTurnEnded(robocode.control.events.TurnEndedEvent evnt) - { - engine.OnTurnEnded(MapEvent(evnt)); - } - - public void onBattleMessage(robocode.control.events.BattleMessageEvent evnt) - { - engine.OnBattleMessage(MapEvent(evnt)); - } - - public void onBattleError(robocode.control.events.BattleErrorEvent evnt) - { - engine.OnBattleError(MapEvent(evnt)); - } - } - - #endregion - - #region Event mappers (generated events -> Robocode.Control.Events) - - private static BattleStartedEvent MapEvent(robocode.control.events.BattleStartedEvent evnt) - { - return new BattleStartedEvent(MapBattleRules(evnt.getBattleRules()), evnt.getRobotsCount(), evnt.isReplay()); - } - - private static BattleFinishedEvent MapEvent(robocode.control.events.BattleFinishedEvent evnt) - { - return new BattleFinishedEvent(evnt.isAborted()); - } - - private static BattleCompletedEvent MapEvent(robocode.control.events.BattleCompletedEvent evnt) - { - return new BattleCompletedEvent(MapBattleRules(evnt.getBattleRules()), MapBattleResults(evnt.getIndexedResults())); - } - - private static BattleMessageEvent MapEvent(robocode.control.events.BattleMessageEvent evnt) - { - return new BattleMessageEvent(evnt.getMessage()); - } - - private static BattleErrorEvent MapEvent(robocode.control.events.BattleErrorEvent evnt) - { - return new BattleErrorEvent(evnt.getError()); - } - - private static RoundStartedEvent MapEvent(robocode.control.events.RoundStartedEvent evnt) - { - return new RoundStartedEvent(MapTurnSnapshot(evnt.getStartSnapshot()), evnt.getRound()); - } - - private static Robocode.Control.Events.RoundEndedEvent MapEvent(robocode.control.events.RoundEndedEvent evnt) - { - return new Robocode.Control.Events.RoundEndedEvent(evnt.getRound(), evnt.getTurns(), evnt.getTotalTurns()); - } - - private static TurnEndedEvent MapEvent(robocode.control.events.TurnEndedEvent evnt) - { - return new TurnEndedEvent(MapTurnSnapshot(evnt.getTurnSnapshot())); - } - - private static BattleCompletedEvent[] MapEvents(robocode.control.events.BattleCompletedEvent[] events) - { - if (events == null) - { - return null; - } - - BattleCompletedEvent[] mappedEvents = new BattleCompletedEvent[events.Length]; - - for (int i = 0; i < events.Length; i++) - { - mappedEvents[i] = MapEvent(events[i]); - } - return mappedEvents; - } - - private static BattleResults[] MapBattleResults(java.lang.Object[] results) - { - if (results == null) - { - return null; - } - - BattleResults[] mappedResults = new BattleResults[results.Length]; - - for (int i = 0; i < results.Length; i++) - { - mappedResults[i] = MapBattleResults(results[i]); - } - return mappedResults; - } - - private static BattleRules MapBattleRules(java.lang.Object obj) - { - int battlefieldWidth = obj.Invoke("getBattlefieldWidth", "()I", new object[] { }); - int battlefieldHeight = obj.Invoke("getBattlefieldHeight", "()I", new object[] { }); - int numRounds = obj.Invoke("getNumRounds", "()I", new object[] { }); - double gunCoolingRate = obj.Invoke("getGunCoolingRate", "()D", new object[] { }); - long inactivityTime = obj.Invoke("getInactivityTime", "()J", new object[] { }); - bool hideEnemyNames = obj.Invoke("getHideEnemyNames", "()Z", new object[] { }); - int sentryBorderSize = obj.Invoke("getSentryBorderSize", "()I", new object[] { }); - - MethodInfo method = typeof(BattleRules).GetMethod("createHiddenHelper", BindingFlags.Static | BindingFlags.NonPublic); - IHiddenRulesHelper rulesHelper = (IHiddenRulesHelper)method.Invoke(null, null); - - return rulesHelper.createRules(battlefieldWidth, battlefieldHeight, numRounds, gunCoolingRate, inactivityTime, hideEnemyNames, sentryBorderSize); - } - - private static BattleResults MapBattleResults(java.lang.Object obj) - { - string teamLeaderName = obj.Invoke("getTeamLeaderName", "()Ljava/lang/String;", new object[] { }); - int rank = obj.Invoke("getRank", "()I", new object[] { }); - int score = obj.Invoke("getScore", "()I", new object[] { }); - int survival = obj.Invoke("getSurvival", "()I", new object[] { }); - int lastSurvivorBonus = obj.Invoke("getLastSurvivorBonus", "()I", new object[] { }); - int bulletDamage = obj.Invoke("getBulletDamage", "()I", new object[] { }); - int bulletDamageBonus = obj.Invoke("getBulletDamageBonus", "()I", new object[] { }); - int ramDamage = obj.Invoke("getRamDamage", "()I", new object[] { }); - int ramDamageBonus = obj.Invoke("getRamDamageBonus", "()I", new object[] { }); - int firsts = obj.Invoke("getFirsts", "()I", new object[] { }); - int seconds = obj.Invoke("getSeconds", "()I", new object[] { }); - int thirds = obj.Invoke("getThirds", "()I", new object[] { }); - - return new BattleResults(teamLeaderName, rank, score, survival, lastSurvivorBonus, - bulletDamage, bulletDamageBonus, ramDamage, ramDamageBonus, firsts, seconds, thirds); - } - - #endregion - - #region Snapshot mappers (generated snapshots -> Robocode.Control.Snapshot) - - private static ITurnSnapshot MapTurnSnapshot(robocode.control.snapshot.ITurnSnapshot turnSnapshot) - { - return new TurnSnapshot(turnSnapshot); - } - - private static IRobotSnapshot[] MapRobotSnapshots(robocode.control.snapshot.IRobotSnapshot[] robotSnapshots) - { - if (robotSnapshots == null) - { - return null; - } - - IRobotSnapshot[] mappedSnapshots = new IRobotSnapshot[robotSnapshots.Length]; - - for (int i = 0; i < robotSnapshots.Length; i++) - { - mappedSnapshots[i] = MapRobotSnapshot(robotSnapshots[i]); - } - return mappedSnapshots; - } - - private static IRobotSnapshot MapRobotSnapshot(robocode.control.snapshot.IRobotSnapshot robotSnapshot) - { - return new RobotSnapshot(robotSnapshot); - } - - private static IScoreSnapshot[] MapScoreSnapshots(robocode.control.snapshot.IScoreSnapshot[] bulletSnapshots) - { - if (bulletSnapshots == null) - { - return null; - } - - IScoreSnapshot[] mappedSnapshots = new IScoreSnapshot[bulletSnapshots.Length]; - - for (int i = 0; i < bulletSnapshots.Length; i++) - { - mappedSnapshots[i] = MapScoreSnapshot(bulletSnapshots[i]); - } - return mappedSnapshots; - } - - private static IScoreSnapshot MapScoreSnapshot(robocode.control.snapshot.IScoreSnapshot scoreSnapshot) - { - return new ScoreSnapshot(scoreSnapshot); - } - - private static IBulletSnapshot[] MapBulletSnapshots(robocode.control.snapshot.IBulletSnapshot[] bulletSnapshots) - { - if (bulletSnapshots == null) - { - return null; - } - - IBulletSnapshot[] mappedSnapshots = new IBulletSnapshot[bulletSnapshots.Length]; - - for (int i = 0; i < bulletSnapshots.Length; i++) - { - mappedSnapshots[i] = MapBulletSnapshot(bulletSnapshots[i]); - } - return mappedSnapshots; - } - - private static IBulletSnapshot MapBulletSnapshot(robocode.control.snapshot.IBulletSnapshot bulletSnapshot) - { - return new BulletSnapshot(bulletSnapshot); - } - - private static IDebugProperty[] MapDebugProperties(robocode.control.snapshot.IDebugProperty[] debugProperties) - { - if (debugProperties == null) - { - return null; - } - - IDebugProperty[] mappedProperties = new IDebugProperty[debugProperties.Length]; - - for (int i = 0; i < debugProperties.Length; i++) - { - mappedProperties[i] = MapDebugProperty(debugProperties[i]); - } - return mappedProperties; - } - - private static IDebugProperty MapDebugProperty(robocode.control.snapshot.IDebugProperty debugProperty) - { - return new DebugProperty(debugProperty.getKey(), debugProperty.getValue()); - } - - private static RobotState MapRobotState(robocode.control.snapshot.RobotState robotState) - { - switch (robotState.getValue()) - { - case 0: - return RobotState.Active; - case 1: - return RobotState.HitWall; - case 2: - return RobotState.HitRobot; - case 3: - default: - return RobotState.Dead; - } - } - - private static BulletState MapBulletState(robocode.control.snapshot.BulletState bulletState) - { - switch (bulletState.getValue()) - { - case 0: - return BulletState.Fired; - case 1: - return BulletState.Moving; - case 2: - return BulletState.HitVictim; - case 3: - return BulletState.HitBullet; - case 4: - return BulletState.HitWall; - case 5: - return BulletState.Exploded; - case 6: - default: - return BulletState.Inactive; - } - } - - #endregion - - #region Robocode.Control.Snapshot implementations - - private class TurnSnapshot : ITurnSnapshot - { - // The real snapshot - private readonly robocode.control.snapshot.ITurnSnapshot turnSnapshot; - - // Cached values created, when needed - private IRobotSnapshot[] robots; - private IBulletSnapshot[] bullets; - private int? tps; - private int? round; - private int? turn; - private IScoreSnapshot[] sortedTeamScores; - private IScoreSnapshot[] indexedTeamScores; - - public TurnSnapshot(robocode.control.snapshot.ITurnSnapshot turnSnapshot) - { - this.turnSnapshot = turnSnapshot; - } - - public IRobotSnapshot[] Robots - { - get - { - if (robots == null) - { - robots = MapRobotSnapshots(turnSnapshot.getRobots()); - } - return robots; - } - } - - public IBulletSnapshot[] Bullets - { - get - { - if (bullets == null) - { - bullets = MapBulletSnapshots(turnSnapshot.getBullets()); - } - return bullets; - } - } - - public int TPS - { - get - { - if (tps == null) - { - tps = turnSnapshot.getTPS(); - } - return tps.Value; - } - } - - public int Round - { - get - { - if (round == null) - { - round = turnSnapshot.getRound(); - } - return round.Value; - } - } - - public int Turn - { - get - { - if (turn == null) - { - turn = turnSnapshot.getTurn(); - } - return turn.Value; - } - } - - public IScoreSnapshot[] SortedTeamScores - { - get - { - if (sortedTeamScores == null) - { - sortedTeamScores = MapScoreSnapshots(turnSnapshot.getSortedTeamScores()); - } - return sortedTeamScores; - } - } - - public IScoreSnapshot[] IndexedTeamScores - { - get - { - if (indexedTeamScores == null) - { - indexedTeamScores = MapScoreSnapshots(turnSnapshot.getIndexedTeamScores()); - } - return indexedTeamScores; - } - } - } - - private class RobotSnapshot : IRobotSnapshot - { - // The real snapshot - private readonly robocode.control.snapshot.IRobotSnapshot robotSnapshot; - - // Cached values created, when needed - private string name; - private string shortName; - private string veryShortName; - private string teamName; - private int? robotIndex; - private int? teamIndex; - private RobotState? state; - private double? energy; - private double? velocity; - private double? bodyHeading; - private double? gunHeading; - private double? radarHeading; - private double? gunHeat; - private double? x; - private double? y; - private int? bodyColor; - private int? gunColor; - private int? radarColor; - private int? scanColor; - private bool? isDroid; - private bool? isPaintRobot; - private bool? isPaintEnabled; - private bool? isSGPaintEnabled; - private IDebugProperty[] debugProperties; - private string outputStreamSnapshot; - private IScoreSnapshot scoreSnapshot; - - public RobotSnapshot(robocode.control.snapshot.IRobotSnapshot robotSnapshot) - { - this.robotSnapshot = robotSnapshot; - } - - public string Name - { - get - { - if (name == null) - { - name = robotSnapshot.getName(); - } - return name; - } - } - - public string ShortName - { - get - { - if (shortName == null) - { - shortName = robotSnapshot.getShortName(); - } - return shortName; - } - } - - public string VeryShortName - { - get - { - if (veryShortName == null) - { - veryShortName = robotSnapshot.getVeryShortName(); - } - return veryShortName; - } - } - - public string TeamName - { - get - { - if (teamName == null) - { - teamName = robotSnapshot.getTeamName(); - } - return teamName; - } - } - - public int RobotIndex - { - get - { - if (robotIndex == null) - { - robotIndex = robotSnapshot.getRobotIndex(); - } - return robotIndex.Value; - } - } - - public int TeamIndex - { - get - { - if (teamIndex == null) - { - teamIndex = robotSnapshot.getTeamIndex(); - } - return teamIndex.Value; - } - } - - public int ContestantIndex - { - get - { - return TeamIndex >= 0 ? TeamIndex : RobotIndex; - } - } - - public RobotState State - { - get - { - if (state == null) - { - state = MapRobotState(robotSnapshot.getState()); - } - return state.Value; - } - } - - public double Energy - { - get - { - if (energy == null) - { - energy = robotSnapshot.getEnergy(); - } - return energy.Value; - } - } - - public double Velocity - { - get - { - if (velocity == null) - { - velocity = robotSnapshot.getVelocity(); - } - return velocity.Value; - } - } - - public double BodyHeading - { - get - { - if (bodyHeading == null) - { - bodyHeading = robotSnapshot.getBodyHeading(); - } - return bodyHeading.Value; - } - } - - public double GunHeading - { - get - { - if (gunHeading == null) - { - gunHeading = robotSnapshot.getGunHeading(); - } - return gunHeading.Value; - } - } - - public double RadarHeading - { - get - { - if (radarHeading == null) - { - radarHeading = robotSnapshot.getRadarHeading(); - } - return radarHeading.Value; - } - } - - public double GunHeat - { - get - { - if (gunHeat == null) - { - gunHeat = robotSnapshot.getGunHeat(); - } - return gunHeat.Value; - } - } - - public double X - { - get - { - if (x == null) - { - x = robotSnapshot.getX(); - } - return x.Value; - } - } - - public double Y - { - get - { - if (y == null) - { - y = robotSnapshot.getY(); - } - return y.Value; - } - } - - public int BodyColor - { - get - { - if (bodyColor == null) - { - bodyColor = robotSnapshot.getBodyColor(); - } - return bodyColor.Value; - } - } - - public int GunColor - { - get - { - if (gunColor == null) - { - gunColor = robotSnapshot.getGunColor(); - } - return gunColor.Value; - } - } - - public int RadarColor - { - get - { - if (radarColor == null) - { - radarColor = robotSnapshot.getRadarColor(); - } - return radarColor.Value; - } - } - - public int ScanColor - { - get - { - if (scanColor == null) - { - scanColor = robotSnapshot.getScanColor(); - } - return scanColor.Value; - } - } - - public bool IsDroid - { - get - { - if (isDroid == null) - { - isDroid = robotSnapshot.isDroid(); - } - return isDroid.Value; - } - } - - public bool IsPaintRobot - { - get - { - if (isPaintRobot == null) - { - isPaintRobot = robotSnapshot.isPaintRobot(); - } - return isPaintRobot.Value; - } - } - - public bool IsPaintEnabled - { - get - { - if (isPaintEnabled == null) - { - isPaintEnabled = robotSnapshot.isPaintEnabled(); - } - return isPaintEnabled.Value; - } - } - - public bool IsSGPaintEnabled - { - get - { - if (isSGPaintEnabled == null) - { - isSGPaintEnabled = robotSnapshot.isSGPaintEnabled(); - } - return isSGPaintEnabled.Value; - } - } - - public IDebugProperty[] DebugProperties - { - get - { - if (debugProperties == null) - { - debugProperties = MapDebugProperties(robotSnapshot.getDebugProperties()); - } - return debugProperties; - } - } - - public string OutputStreamSnapshot - { - get - { - if (outputStreamSnapshot == null) - { - outputStreamSnapshot = robotSnapshot.getOutputStreamSnapshot(); - } - return outputStreamSnapshot; - } - } - - public IScoreSnapshot ScoreSnapshot - { - get - { - if (scoreSnapshot == null) - { - scoreSnapshot = MapScoreSnapshot(robotSnapshot.getScoreSnapshot()); - } - return scoreSnapshot; - } - } - } - - private class BulletSnapshot : IBulletSnapshot - { - // The real snapshot - private readonly robocode.control.snapshot.IBulletSnapshot bulletSnapshot; - - // Cached values created, when needed - private BulletState? state; - private double? power; - private double? x; - private double? y; - private double? paintX; - private double? paintY; - private int? color; - private int? frame; - private bool? isExplosion; - private int? explosionImageIndex; - private int? bulletId; - - public BulletSnapshot(robocode.control.snapshot.IBulletSnapshot bulletSnapshot) - { - this.bulletSnapshot = bulletSnapshot; - } - - public BulletState State - { - get - { - if (state == null) - { - state = MapBulletState(bulletSnapshot.getState()); - } - return state.Value; - } - } - - public double Power - { - get - { - if (power == null) - { - power = bulletSnapshot.getPower(); - } - return power.Value; - } - } - - public double X - { - get - { - if (x == null) - { - x = bulletSnapshot.getX(); - } - return x.Value; - } - } - - public double Y - { - get - { - if (y == null) - { - y = bulletSnapshot.getY(); - } - return y.Value; - } - } - - public double PaintX - { - get - { - if (paintX == null) - { - paintX = bulletSnapshot.getPaintX(); - } - return paintX.Value; - } - } - - public double PaintY - { - get - { - if (paintY == null) - { - paintY = bulletSnapshot.getPaintY(); - } - return paintY.Value; - } - } - - public int Color - { - get - { - if (color == null) - { - color = bulletSnapshot.getColor(); - } - return color.Value; - } - } - - public int Frame - { - get - { - if (frame == null) - { - frame = bulletSnapshot.getFrame(); - } - return frame.Value; - } - } - - public bool IsExplosion - { - get - { - if (isExplosion == null) - { - isExplosion = bulletSnapshot.isExplosion(); - } - return isExplosion.Value; - } - } - - public int ExplosionImageIndex - { - get - { - if (explosionImageIndex == null) - { - explosionImageIndex = bulletSnapshot.getExplosionImageIndex(); - } - return explosionImageIndex.Value; - } - } - - public int BulletId - { - get - { - if (bulletId == null) - { - bulletId = bulletSnapshot.getBulletId(); - } - return bulletId.Value; - } - } - } - - private class ScoreSnapshot : IScoreSnapshot - { - // The real snapshot - private readonly robocode.control.snapshot.IScoreSnapshot scoreSnapshot; - - // Cached values created, when needed - private string name; - private double? totalScore; - private double? totalSurvivalScore; - private double? totalLastSurvivorBonus; - private double? totalBulletDamageScore; - private double? totalBulletKillBonus; - private double? totalRammingDamageScore; - private double? totalRammingKillBonus; - private int? totalFirsts; - private int? totalSeconds; - private int? totalThirds; - private double? currentScore; - private double? currentSurvivalScore; - private double? currentSurvivalBonus; - private double? currentBulletDamageScore; - private double? currentBulletKillBonus; - private double? currentRammingDamageScore; - private double? currentRammingKillBonus; - - public ScoreSnapshot(robocode.control.snapshot.IScoreSnapshot scoreSnapshot) - { - this.scoreSnapshot = scoreSnapshot; - } - - public int CompareTo(IScoreSnapshot snapshot) - { - double myScore = TotalScore + CurrentScore; - double hisScore = snapshot.TotalScore + snapshot.CurrentScore; - - if (myScore < hisScore) - { - return -1; - } - if (myScore > hisScore) - { - return 1; - } - return 0; - } - - public string Name - { - get - { - if (name == null) - { - name = scoreSnapshot.getName(); - } - return name; - } - } - - public double TotalScore - { - get - { - if (totalScore == null) - { - totalScore = scoreSnapshot.getTotalScore(); - } - return totalScore.Value; - } - } - - public double TotalSurvivalScore - { - get - { - if (totalSurvivalScore == null) - { - totalSurvivalScore = scoreSnapshot.getTotalSurvivalScore(); - } - return totalSurvivalScore.Value; - } - } - - public double TotalLastSurvivorBonus - { - get - { - if (totalLastSurvivorBonus == null) - { - totalLastSurvivorBonus = scoreSnapshot.getTotalLastSurvivorBonus(); - } - return totalLastSurvivorBonus.Value; - } - } - - public double TotalBulletDamageScore - { - get - { - if (totalBulletDamageScore == null) - { - totalBulletDamageScore = scoreSnapshot.getTotalBulletDamageScore(); - } - return totalBulletDamageScore.Value; - } - } - - public double TotalBulletKillBonus - { - get - { - if (totalBulletKillBonus == null) - { - totalBulletKillBonus = scoreSnapshot.getTotalBulletKillBonus(); - } - return totalBulletKillBonus.Value; - } - } - - public double TotalRammingDamageScore - { - get - { - if (totalRammingDamageScore == null) - { - totalRammingDamageScore = scoreSnapshot.getTotalRammingDamageScore(); - } - return totalRammingDamageScore.Value; - } - } - - public double TotalRammingKillBonus - { - get - { - if (totalRammingKillBonus == null) - { - totalRammingKillBonus = scoreSnapshot.getTotalRammingKillBonus(); - } - return totalRammingKillBonus.Value; - } - } - - public int TotalFirsts - { - get - { - if (totalFirsts == null) - { - totalFirsts = scoreSnapshot.getTotalFirsts(); - } - return totalFirsts.Value; - } - } - - public int TotalSeconds - { - get - { - if (totalSeconds == null) - { - totalSeconds = scoreSnapshot.getTotalSeconds(); - } - return totalSeconds.Value; - } - } - - public int TotalThirds - { - get - { - if (totalThirds == null) - { - totalThirds = scoreSnapshot.getTotalThirds(); - } - return totalThirds.Value; - } - } - - public double CurrentScore - { - get - { - if (currentScore == null) - { - currentScore = scoreSnapshot.getCurrentScore(); - } - return currentScore.Value; - } - } - - public double CurrentSurvivalScore - { - get - { - if (currentSurvivalScore == null) - { - currentSurvivalScore = scoreSnapshot.getCurrentSurvivalScore(); - } - return currentSurvivalScore.Value; - } - } - - public double CurrentSurvivalBonus - { - get - { - if (currentSurvivalBonus == null) - { - currentSurvivalBonus = scoreSnapshot.getCurrentSurvivalBonus(); - } - return currentSurvivalBonus.Value; - } - } - - public double CurrentBulletDamageScore - { - get - { - if (currentBulletDamageScore == null) - { - currentBulletDamageScore = scoreSnapshot.getCurrentBulletDamageScore(); - } - return currentBulletDamageScore.Value; - } - } - - public double CurrentBulletKillBonus - { - get - { - if (currentBulletKillBonus == null) - { - currentBulletKillBonus = scoreSnapshot.getCurrentBulletKillBonus(); - } - return currentBulletKillBonus.Value; - } - } - - public double CurrentRammingDamageScore - { - get - { - if (currentRammingDamageScore == null) - { - currentRammingDamageScore = scoreSnapshot.getCurrentBulletKillBonus(); - } - return currentRammingDamageScore.Value; - } - } - - public double CurrentRammingKillBonus - { - get - { - if (currentRammingKillBonus == null) - { - currentRammingKillBonus = scoreSnapshot.getCurrentRammingKillBonus(); - } - return currentRammingKillBonus.Value; - } - } - } - - private class DebugProperty : IDebugProperty - { - private readonly string key; - private readonly string value; - - public DebugProperty(string key, string value) - { - this.key = key; - this.value = value; - } - - public string Key - { - get { return key; } - } - - public string Value - { - get { return value; } - } - } - - #endregion - - #region robocode.control.RobotSpecification wrapper - - private class RobotSpecificationWrapper : robocode.control.RobotSpecification - { - private readonly string name; - private readonly string author; - private readonly string webpage; - private readonly string version; - private readonly string robocodeVersion; - private readonly string archiveFilePath; - private readonly string fullClassName; - private readonly string description; - private readonly string teamId; - - public RobotSpecificationWrapper(string name, string author, string webpage, string version, - string robocodeVersion, string archiveFilePath, string fullClassName, string description, string teamId) - : base(null) - { - this.name = name; - this.author = author; - this.webpage = webpage; - this.version = version; - this.robocodeVersion = robocodeVersion; - this.archiveFilePath = archiveFilePath; - this.fullClassName = fullClassName; - this.description = description; - this.teamId = teamId; - } - - public override java.lang.String getName() - { - return name; - } - - public override java.lang.String getVersion() - { - return version; - } - - public override java.lang.String getNameAndVersion() - { - string nameAndVersion = getName(); - string version = getVersion(); - - if (version != null && version.Trim().Length > 0) - { - nameAndVersion += ' ' + version.Trim(); - } - return nameAndVersion; - } - - public override java.lang.String getClassName() - { - return fullClassName; - } - - public override java.io.File getJarFile() - { - return new java.io.File(archiveFilePath); - } - - public override java.lang.String getDescription() - { - return description; - } - - public override java.lang.String getRobocodeVersion() - { - return robocodeVersion; - } - - public override java.lang.String getWebpage() - { - return webpage; - } - - public override java.lang.String getAuthorName() - { - return author; - } - - public override java.lang.String getTeamId() - { - return teamId; - } - } - - #endregion - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSetup.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSetup.cs deleted file mode 100644 index 28b4299..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSetup.cs +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; - -namespace Robocode.Control -{ - /// - /// Contains the initial position and heading for a robot. - /// - [Serializable] - public class RobotSetup - { - private readonly Double x; - private readonly Double y; - private readonly Double heading; - - /// - /// Constructs a new RobotSetup. - /// - /// The x coordinate, where null means random. - /// The y coordinate, where null means random. - /// The heading in degrees of the body, gun, and radar, where null means random. - public RobotSetup(Double x, Double y, Double heading) - { - this.x = x; - this.y = y; - this.heading = heading; - } - - /// - /// Contains the x coordinate. - /// - /// - /// The x coordinate, where null means unspecified (random). - /// - public Double X - { - get { return x; } - } - - /// - /// Contains the y coordinate. - /// - /// - /// The y coordinate, where null means unspecified (random). - /// - public Double Y - { - get { return y; } - } - - /// - /// Contains the body, gun, and radar heading (in degrees). - /// - /// - /// The heading (in degrees), where null means unspecified (random). - /// - public Double Heading - { - get { return heading; } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSpecification.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSpecification.cs deleted file mode 100644 index 77d6eff..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/RobotSpecification.cs +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace Robocode.Control -{ - /// - /// Defines the properties of a robot, which is returned from - /// . - /// - [Serializable] - public class RobotSpecification - { - internal readonly robocode.control.RobotSpecification robotSpecification; - - internal RobotSpecification(robocode.control.RobotSpecification robotSpecification) - { - this.robotSpecification = robotSpecification; - } - - /// - /// Contains the name of this robot or team. - /// - /// - /// The name of this robot or team. - /// - /// - /// - public string Name - { - get { return robotSpecification.getName(); } - } - - /// - /// Contains the version of this robot or team. - /// - /// - /// The version of this robot or team. - /// - /// - /// - public string Version - { - get { return robotSpecification.getVersion(); } - } - - /// - /// Contains the name and version of this robot or team. - /// - /// - /// The name and version of this robot or team. - /// - /// - /// - private string NameAndVersion - { - get { return robotSpecification.getNameAndVersion(); } - } - - /// - /// Contains the full class name of this robot or team. - /// - /// - /// The full class name of this robot or team. - /// - public string ClassName - { - get { return robotSpecification.getClassName(); } - } - - /// - /// Contains the path of the archive file containing this robot or team. - /// - /// - /// The path of the archive file containing this robot or team or null - /// if it does not come from an archive file (could be class files instead). - /// - public string ArchiveFilePath - { - get { return robotSpecification.getJarFile().getAbsolutePath(); } - } - - /// - /// Contains the description provided by the author of this robot or team. - /// - /// - /// The description provided by the author of this robot or team. - /// - public string Description - { - get { return robotSpecification.getDescription(); } - } - - /// - /// Contains the version of Robocode this robot or team was build with. - /// - /// - /// The version of Robocode this robot or team was build with. - /// - public string RobocodeVersion - { - get { return robotSpecification.getRobocodeVersion(); } - } - - /// - /// Contains the link to the web page for this robot or team. - /// - /// - /// The link to the web page for this robot or team. - /// - public string Webpage - { - get { return robotSpecification.getWebpage(); } - } - - /// - /// Contains the name of the author of this robot or team. - /// - /// - /// The name of the author of this robot or team. - /// - public string AuthorName - { - get { return robotSpecification.getAuthorName(); } - } - - /// - /// Contains the id of the robot team. - /// - /// - /// The id of the robot team. - /// - public string TeamId - { - get { return robotSpecification.getTeamId(); } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleCompletedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleCompletedEvent.cs deleted file mode 100644 index 5f5e156..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleCompletedEvent.cs +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when a battle has completed successfully where results are available. - /// This event will not occur if the battle is terminated or aborted by the user before the - /// battle is completed. - /// - /// - /// - public class BattleCompletedEvent : BattleEvent - { - private readonly BattleRules battleRules; - private readonly BattleResults[] results; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal BattleCompletedEvent(BattleRules battleRules, BattleResults[] results) - : base() - { - this.battleRules = battleRules; - this.results = results; - } - - /// - /// Contains the rules used in the battle. - /// - /// - /// The rules used in the battle. - /// - public BattleRules BattleRules - { - get { return battleRules; } - } - - /// - /// Contains the battle results sorted on score. - /// Note that the robot index cannot be used to determine the score with the sorted results. - /// - /// - /// An array of sorted BattleResults, where the results with the bigger score are placed first in the list. - /// - /// - public BattleResults[] SortedResults - { - get - { - List copy = new List(results); - copy.Sort(); - copy.Reverse(); - return copy.ToArray(); - } - } - - /// - /// Contains the battle results that can be used to determine the score for the individual robot based - /// on the robot index. - /// - /// - /// An array of indexed BattleResults, where each index matches an index of a specific robot. - /// - /// - public BattleResults[] IndexedResults - { - get - { - BattleResults[] copy = new BattleResults[results.Length]; - results.CopyTo(copy, 0); - return copy; - } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleErrorEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleErrorEvent.cs deleted file mode 100644 index 58ab08c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleErrorEvent.cs +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when an error message is sent from the game in the during the battle. - /// - /// - public class BattleErrorEvent : BattleEvent - { - private readonly string error; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal BattleErrorEvent(string error) - : base() - { - this.error = error; - } - - /// - /// Contains the error message. - /// - /// - /// The error message that was sent from the game during the battle. - /// - public string Error - { - get { return error; } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleEvent.cs deleted file mode 100644 index 630c309..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleEvent.cs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// This is the base class of all battle events. - /// - public abstract class BattleEvent - { - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleFinishedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleFinishedEvent.cs deleted file mode 100644 index 032783c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleFinishedEvent.cs +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when the battle is finished. This event is always sent as the last battle event, - /// both when the battle is completed successfully, terminated due to an error, or aborted by the user. - /// Hence, this events is well-suited for cleanup after the battle. - /// - /// - /// - public class BattleFinishedEvent : BattleEvent - { - private readonly bool isAborted; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal BattleFinishedEvent(bool isAborted) - : base() - { - this.isAborted = isAborted; - } - - /// - /// Flag specifying if the battle was aborted. - /// - /// - /// true if the battle was aborted; false otherwise. - /// - public bool IsAborted - { - get { return isAborted; } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleMessageEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleMessageEvent.cs deleted file mode 100644 index 944f159..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleMessageEvent.cs +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when an informal message is sent from the game in the during the battle. - /// - /// - public class BattleMessageEvent : BattleEvent - { - private readonly string message; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal BattleMessageEvent(string message) - : base() - { - this.message = message; - } - - /// - /// Contains the informal message. - /// - /// - /// The informal message that was sent from the game during the battle. - /// - public string Message - { - get { return message; } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattlePausedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattlePausedEvent.cs deleted file mode 100644 index 14a247c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattlePausedEvent.cs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when a battle has been paused. - /// - /// - public class BattlePausedEvent : BattleEvent - { - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleResumedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleResumedEvent.cs deleted file mode 100644 index 2f267a8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleResumedEvent.cs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when a battle has been resumed (after having been paused). - /// - /// - public class BattleResumedEvent : BattleEvent - { - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleStartedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleStartedEvent.cs deleted file mode 100644 index 49d81d3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/BattleStartedEvent.cs +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when a new battle is started. - /// - /// - /// - public class BattleStartedEvent : BattleEvent - { - private readonly BattleRules battleRules; - private readonly bool isReplay; - private readonly int robotsCount; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal BattleStartedEvent(BattleRules battleRules, int robotsCount, bool isReplay) - : base() - { - this.battleRules = battleRules; - this.isReplay = isReplay; - this.robotsCount = robotsCount; - } - - /// - /// Contains the rules that will be used in the battle. - /// - /// - /// The rules that will be used in the battle. - /// - public BattleRules BattleRules - { - get { return battleRules; } - } - - /// - /// Contains the number of robots participating in the battle. - /// - /// - /// The number of robots participating in the battle. - /// - public int RobotsCount - { - get { return robotsCount; } - } - - /// - /// Flag specifying if this battle is a replay or a new battle. - /// - /// - /// true if the battle is a replay; false otherwise. - /// - public bool IsReplay - { - get { return isReplay; } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundEndedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundEndedEvent.cs deleted file mode 100644 index 5bbad5f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundEndedEvent.cs +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when the current round of a battle has ended. - /// - /// - public class RoundEndedEvent : BattleEvent - { - private readonly int round; - private readonly int turns; - private readonly int totalTurns; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal RoundEndedEvent(int round, int turns, int totalTurns) - : base() - { - this.round = round; - this.turns = turns; - this.totalTurns = totalTurns; - } - - /// - /// Contains the round number that has ended. - /// - /// - /// The round number that has ended, which is zero indexed. - /// - public int Round - { - get { return round; } - } - - /// - /// Contains the number of turns that this round reached. - /// - /// - /// The number of turns that this round reached. - /// - /// - public int Turns - { - get { return turns; } - } - - /// - /// Contains the total number of turns reached in the battle when this round ended. - /// - /// - /// The total number of turns reached in the battle when this round ended. - /// - /// - public int TotalTurns - { - get { return totalTurns; } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundStartedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundStartedEvent.cs deleted file mode 100644 index f8e1530..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/RoundStartedEvent.cs +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; -using Robocode.Control.Snapshot; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when a new round in a battle is started. - /// - /// - public class RoundStartedEvent : BattleEvent - { - private readonly ITurnSnapshot startSnapshot; - private readonly int round; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal RoundStartedEvent(ITurnSnapshot startSnapshot, int round) - : base() - { - this.startSnapshot = startSnapshot; - this.round = round; - } - - /// - /// Contains the start snapshot of the participating robots, initial starting positions etc. - /// - /// - /// A that serves as the start snapshot of the round. - /// - public ITurnSnapshot StartSnapshot - { - get { return startSnapshot; } - } - - /// - /// Contains the round number. - /// - /// - /// The round number, which is zero indexed. - /// - public int Round - { - get { return round; } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnEndedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnEndedEvent.cs deleted file mode 100644 index a97ab93..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnEndedEvent.cs +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; -using Robocode.Control.Snapshot; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when when the current turn in a battle round is ended. - /// - /// - public class TurnEndedEvent : BattleEvent - { - private readonly ITurnSnapshot turnSnapshot; - - // Called by the game to create an instance of this event. - // Note: This constructor should not be available in the API. - internal TurnEndedEvent(ITurnSnapshot turnSnapshot) - : base() - { - this.turnSnapshot = turnSnapshot; - } - - /// - /// Contains a snapshot of the turn that has ended. - /// - /// - /// A snapshot of the turn that has ended. - /// - public ITurnSnapshot TurnSnapshot - { - get { return turnSnapshot; } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnStartedEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnStartedEvent.cs deleted file mode 100644 index b6c0284..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/events/TurnStartedEvent.cs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Events -{ - /// - /// Contains information about a event that is - /// triggered when a new turn in a battle round is started. - /// - /// - public class TurnStartedEvent : BattleEvent - { - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/BulletState.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/BulletState.cs deleted file mode 100644 index bc1ebfd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/BulletState.cs +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Snapshot -{ - /// - /// Defines a bullet state, which can be: just fired, moving somewhere, hitting a victim, - /// hitting another bullet, hitting the wall, exploded, or inactive. - /// - public enum BulletState - { - /// - /// The bullet has just been fired this turn and hence just been created. - /// This state only last one turn. - /// - Fired = 0, - - /// - /// The bullet is now moving across the battlefield, but has not hit anything yet. - /// - Moving = 1, - - /// - /// The bullet has hit a robot victim. - /// - HitVictim = 2, - - /// - /// The bullet has hit another bullet. - /// - HitBullet = 3, - - /// - /// The bullet has the wall, i.e. one of the four borders of the battlefield. - /// - HitWall = 4, - - /// - /// The bullet currently represents a robot explosion, i.e. a robot death. - /// - Exploded = 5, - - /// - /// The bullet is currently inactive. Hence, it is not active or visible on the battlefield. - /// - Inactive = 6 - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IBulletSnapshot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IBulletSnapshot.cs deleted file mode 100644 index 2a5406f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IBulletSnapshot.cs +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Snapshot -{ - /// - /// Interface of a bullet snapshot at a specific time in a battle. - /// - public interface IBulletSnapshot - { - /// - /// Contains the bullet state. - /// - /// - /// The bullet state. - /// - BulletState State { get; } - - /// - /// Contains the bullet power. - /// - /// - /// The bullet power. - /// - double Power { get; } - - /// - /// Contains the X position of the bullet. - /// - /// - /// The X position of the bullet. - /// - double X { get; } - - /// - /// Contains the Y position of the bullet. - /// - /// - /// The Y position of the bullet. - /// - double Y { get; } - - /// - /// Contains the X painting position of the bullet. - /// Note that this is not necessarily equal to the X position of the bullet, even though - /// it will be in most cases. The painting position of the bullet is needed as the bullet - /// will "stick" to its victim when it has been hit, but only visually. - /// - /// - /// The X painting position of the bullet. - /// - double PaintX { get; } - - /// - /// Contains the Y painting position of the bullet. - /// Note that this is not necessarily equal to the Y position of the bullet, even though - /// it will be in most cases. The painting position of the bullet is needed as the bullet - /// will "stick" to its victim when it has been hit, but only visually. - /// - /// - /// The Y painting position of the bullet. - /// - double PaintY { get; } - - /// - /// Contains the color of the bullet. - /// - /// - /// An ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - /// - int Color { get; } - - /// - /// Contains the current frame number to display, i.e. when the bullet explodes. - /// - /// - /// The current frame number. - /// - /// - /// - int Frame { get; } - - /// - /// Flag specifying if the bullet has become an explosion. - /// - /// - /// true if the bullet is an explosion; false otherwise. - /// - /// - /// - bool IsExplosion { get; } - - /// - /// Contains the explosion image index, which is different depending on the type of explosion. - /// E.g. if it is a small explosion on a robot that has been hit by this bullet, - /// or a big explosion when a robot dies. - /// - /// - /// The explosion image index. - /// - /// - /// - int ExplosionImageIndex { get; } - - /// - /// Contains the ID of the bullet used for identifying the bullet in a collection of bullets. - /// - /// - /// The ID of the bullet. - /// - int BulletId { get; } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IDebugProperty.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IDebugProperty.cs deleted file mode 100644 index 5be249e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IDebugProperty.cs +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Snapshot -{ - /// - /// Interface of a debug property, which is a key-value pair. - /// - public interface IDebugProperty - { - /// - /// Contains the key of the property. - /// - /// - /// The key of the property. - /// - string Key { get; } - - /// - /// Contains the value of the property. - /// - /// - /// The value of the property. - /// - string Value { get; } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IRobotSnapshot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IRobotSnapshot.cs deleted file mode 100644 index 82ab270..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IRobotSnapshot.cs +++ /dev/null @@ -1,248 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Snapshot -{ - /// - /// Interface of a robot snapshot at a specific time in a battle. - /// - public interface IRobotSnapshot - { - /// - /// Contains the name of the robot. - /// - /// - /// The name of the robot. - /// - string Name { get; } - - /// - /// Contains the short name of the robot. - /// - /// - /// The short name of the robot. - /// - string ShortName { get; } - - /// - /// Contains the very short name of the robot. - /// - /// - /// The very short name of the robot. - /// - string VeryShortName { get; } - - /// - /// Contains the name of the team, which can be the name of a robot if the contestant is not a team, but a robot. - /// - /// - /// The name of the team. - /// - string TeamName { get; } - - /// - /// Contains the index of the robot, which is unique for the specific robot and constant during a battle. - /// Since: 1.7.4.0 - /// - /// - /// The robot index. - /// - /// - int RobotIndex { get; } - - /// - /// Contains the index of the team that this robot is a member of, which is unique for the specific team and constant - /// during a battle. - /// Since: 1.7.4.0 - /// - /// - /// The team index or -1 if the robot is not a member of a team. - /// - /// - int TeamIndex { get; } - - /// - /// Contains the contestant index, which is unique for each robot or team participating in a battle. - /// Note: If a team of robots is participating in a battle, this method will return the team index (see - /// ); otherwise the robot index (see ) is used instead. - /// This method is used for the battle results as scores are calculated for either a team of robots or individual - /// robot. - /// - /// - /// The contestant index of the robot or team. - /// - /// - /// - int ContestantIndex { get; } - - /// - /// Contains the robot state. - /// - /// - /// The robot state. - /// - RobotState State { get; } - - /// - /// Contains the energy level of the robot. - /// - /// - /// The energy level of the robot. - /// - double Energy { get; } - - /// - /// Contains the velocity of the robot. - /// - /// - /// The velocity of the robot. - /// - double Velocity { get; } - - /// - /// Contains the body heading of the robot in radians. - /// - /// - /// The body heading of the robot in radians. - /// - double BodyHeading { get; } - - /// - /// Contains the gun heading of the robot in radians. - /// - /// - /// The gun heading of the robot in radians. - /// - double GunHeading { get; } - - /// - /// Contains the radar heading of the robot in radians. - /// - /// - /// The radar heading of the robot in radians. - /// - double RadarHeading { get; } - - /// - /// Contains the gun heat of the robot. - /// - /// - /// The gun heat of the robot. - /// - double GunHeat { get; } - - /// - /// Contains the X position of the robot. - /// - /// - /// The X position of the robot. - /// - double X { get; } - - /// - /// Contains the Y position of the robot. - /// - /// - /// The Y position of the robot. - /// - double Y { get; } - - /// - /// Contains the color of the body. - /// - /// - /// An ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - /// - int BodyColor { get; } - - /// - /// Contains the color of the gun. - /// - /// - /// An ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - /// - int GunColor { get; } - - /// - /// Contains the color of the radar. - /// - /// - /// An ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - /// - int RadarColor { get; } - - /// - /// Contains the color of the scan arc. - /// - /// - /// An ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - /// - int ScanColor { get; } - - /// - /// Flag specifying if this robot is an . - /// - /// - /// true if this robot is an ; false otherwise. - /// - bool IsDroid { get; } - - /// - /// Flag specifying if this robot is an . - /// - /// - /// true if this robot is an ; false otherwise. - /// - bool IsPaintRobot { get; } - - /// - /// Flag specifying if painting is enabled for this robot. - /// - /// - /// true if painting is enabled for this robot; false otherwise. - /// - bool IsPaintEnabled { get; } - - /// - /// Flag specifying if RobocodeSG painting (the point (0,0) is in the upper left corner) is enabled for this robot. - /// - /// - /// true if RobocodeSG painting is enabled for this robot; false otherwise. - /// - bool IsSGPaintEnabled { get; } - - /// - /// Contains a snapshot of debug properties. - /// - /// - /// A snapshot of debug properties. - /// - IDebugProperty[] DebugProperties { get; } - - /// - /// Contains a snapshot of the output print stream for this robot. - /// - /// - /// A string containing the snapshot of the output print stream. - /// - string OutputStreamSnapshot { get; } - - /// - /// Contains a snapshot of the current score for this robot. - /// - /// - /// A snapshot of the current score for this robot. - /// - IScoreSnapshot ScoreSnapshot { get; } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IScoreSnapshot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IScoreSnapshot.cs deleted file mode 100644 index 8e050e8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/IScoreSnapshot.cs +++ /dev/null @@ -1,165 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Snapshot -{ - /// - /// Interface of a bullet snapshot at a specific time in a battle. - /// - public interface IScoreSnapshot : IComparable - { - /// - /// Contains the name of the contestant, i.e. a robot or team. - /// - /// - /// The name of the contestant, i.e. a robot or team. - /// - string Name { get; } - - /// - /// Contains the total score. - /// - /// - /// The total score. - /// - double TotalScore { get; } - - /// - /// Contains the total survival score. - /// - /// - /// The total survival score. - /// - double TotalSurvivalScore { get; } - - /// - /// Contains the total last survival score. - /// - /// - /// The total last survival score. - /// - double TotalLastSurvivorBonus { get; } - - /// - /// Contains the total bullet damage score. - /// - /// - /// The total bullet damage score. - /// - double TotalBulletDamageScore { get; } - - /// - /// Contains the total bullet kill bonus. - /// - /// - /// The total bullet kill bonus. - /// - double TotalBulletKillBonus { get; } - - /// - /// Contains the total ramming damage score. - /// - /// - /// The total ramming damage score. - /// - double TotalRammingDamageScore { get; } - - /// - /// Contains the total ramming kill bonus. - /// - /// - /// The total ramming kill bonus. - /// - double TotalRammingKillBonus { get; } - - /// - /// Contains the total number of first places. - /// - /// - /// The total number of first places. - /// - int TotalFirsts { get; } - - /// - /// Contains the total number of second places. - /// - /// - /// The total number of second places. - /// - int TotalSeconds { get; } - - /// - /// Contains the total number of third places. - /// - /// - /// The total number of third places. - /// - int TotalThirds { get; } - - /// - /// Contains the current score. - /// - /// - /// The current score. - /// - double CurrentScore { get; } - - /// - /// Contains the current survival score. - /// - /// - /// The current survival score. - /// - double CurrentSurvivalScore { get; } - - /// - /// Contains the current survival bonus. - /// - /// - /// The current survival bonus. - /// - double CurrentSurvivalBonus { get; } - - /// - /// Contains the current bullet damage score. - /// - /// - /// The current bullet damage score. - /// - double CurrentBulletDamageScore { get; } - - /// - /// Contains the current bullet kill bonus. - /// - /// - /// The current bullet kill bonus. - /// - double CurrentBulletKillBonus { get; } - - /// - /// Contains the current ramming damage score. - /// - /// - /// The current ramming damage score. - /// - double CurrentRammingDamageScore { get; } - - /// - /// Contains the current ramming kill bonus. - /// - /// - /// The current ramming kill bonus. - /// - double CurrentRammingKillBonus { get; } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/ITurnSnapshot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/ITurnSnapshot.cs deleted file mode 100644 index 855969f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/ITurnSnapshot.cs +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Snapshot -{ - /// - /// Interface of a battle turn snapshot at a specific time in a battle. - /// - public interface ITurnSnapshot - { - /// - /// Contains a list of snapshots for the robots participating in the battle. - /// - /// - /// A list of snapshots for the robots participating in the battle. - /// - IRobotSnapshot[] Robots { get; } - - /// - /// Contains a list of snapshots for the bullets that are currently on the battlefield. - /// - /// - /// A list of snapshots for the bullets that are currently on the battlefield. - /// - IBulletSnapshot[] Bullets { get; } - - /// - /// Contains the current TPS (turns per second) rate. - /// - /// - /// The current TPS (turns per second) rate. - /// - int TPS { get; } - - /// - /// Contains the current round of the battle. - /// - /// - /// The current round of the battle. - /// - int Round { get; } - - /// - /// Contains the current turn in the battle round. - /// - /// - /// The current turn in the battle round. - /// - int Turn { get; } - - /// - /// Contains an array of sorted scores grouped by teams, ordered by position. - /// Note that the team index cannot be used to determine the score with the sorted scores. - /// - /// - /// An array of sorted IScoreSnapshots, where the bigger scores are placed first in the list. - /// - /// - IScoreSnapshot[] SortedTeamScores { get; } - - /// - /// Contains an array of indexed scores grouped by teams that can be used to determine the score - /// for the individual team based on the team index. - /// - /// - /// An array of indexed IScoreSnapshots, where each index matches an index of a specific team. - /// - /// - IScoreSnapshot[] IndexedTeamScores { get; } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/RobotState.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/RobotState.cs deleted file mode 100644 index c60d2ce..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/implementation/robocode/control/snapshot/RobotState.cs +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Robocode.Control.Snapshot -{ - /// - /// Defines a robot state, which can be: active on the battlefield, hitting a wall or robot this turn, or dead. - /// - public enum RobotState - { - /// - /// The robot is active on the battlefield and has not hit the wall or a robot at this turn. - /// - Active = 0, - - /// - /// The robot has hit a wall, i.e. one of the four borders, at this turn. This state only last one turn. - /// - HitWall = 1, - - /// - /// The robot has hit another robot at this turn. This state only last one turn. - /// - HitRobot = 2, - - /// - /// The robot is dead. - /// - Dead = 3 - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/robocode.dotnet.control.api.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/robocode.dotnet.control.api.csproj deleted file mode 100644 index 3ac19b0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/robocode.dotnet.control.api.csproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {674AED55-B9EC-4C7D-8E0B-1B2471C578B2} - Library - Robocode.Control - robocode.control - v3.5 - 512 - true - ..\..\tools\keys\robocode.snk - - - robocode.ico - - - 3.5 - - - - true - full - false - ..\target\ - ..\target\obj\ - DEBUG;TRACE - prompt - 4 - false - true - - - pdbonly - true - ..\target\ - ..\target\obj\ - - - prompt - 4 - true - - - - False - ..\..\tools\lib\jni4net.n-0.8.7.0.dll - - - - - - - - implementation\robocode\AssemblyInfo.cs - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84} - robocode.dotnet.api - - - - - - - - - if not exist $(OutDir)\build-sources\generated-sources\META-INF mkdir $(OutDir)\build-sources\generated-sources\META-INF\ -echo [assembly: System.Reflection.AssemblyVersion("1.9.2.4")] > $(OutDir)\build-sources\generated-sources\META-INF\AssemblyInfo.cs - - copy "$(TargetPath)" "$(SolutionDir)\robocode.dotnet.host\target" -copy "$(SolutionDir)\tools\lib\*.dll" "$(TargetDir)" -copy "$(SolutionDir)\tools\lib\*.jar" "$(TargetDir)" -copy "$(SolutionDir)\tools\lib\*.dll" "$(SolutionDir)\robocode.dotnet.host\target" - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/robocode.ico b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.control.api/src/robocode.ico deleted file mode 100644 index bbd6ef5791df03f733539e843b43296b8aae5324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25214 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 A!~g&Q diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.classpath b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.classpath deleted file mode 100644 index 90e2c30..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.classpath +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.project deleted file mode 100644 index 86e4817..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - robocode.dotnet.distribution - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.api - robocode.dotnet.control.api - robocode.dotnet.installer - robocode.dotnet.content - robocode.dotnet.host - robocode.dotnet.nhost - robocode.dotnet.samples - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 90b2716..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:34:11 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/dotnet-setup.asm.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/dotnet-setup.asm.xml deleted file mode 100644 index 6dbb158..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/dotnet-setup.asm.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - setup - - dir - jar - - false - - - - - net.sf.robocode:robocode.dotnet.api - - libs - false - robocode.${artifact.extension} - - - - - net.sf.robocode:robocode.dotnet.control.api - - libs - false - robocode.control.${artifact.extension} - - - - - net.sf.robocode:robocode.dotnet.* - net.sf.jni4net:* - - - - net.sf.robocode:robocode.dotnet.distribution - - net.sf.robocode:robocode.dotnet.installer - net.sf.robocode:robocode.dotnet.content - net.sf.robocode:robocode.dotnet.samples - - net.sf.robocode:robocode.dotnet.api - - net.sf.robocode:robocode.dotnet.control.api - - libs - false - - - - - net.sf.robocode:robocode.dotnet.installer - net.sf.robocode:robocode.dotnet.content - - true - - - **/META-INF/** - - - - - - - net.sf.robocode:robocode.dotnet.samples - - false - robots - samplescs-${project.version}.${artifact.extension} - - - - - - **/*.csproj - **/*.iws - **/*.user - **/*.bak - **/Thumbs.db - **/~* - **/.* - **/_svn/** - **/.svn/** - **/.git/** - **/.metadata/** - **/bin/** - **/target/** - **/lib/** - **/obj/** - - ../robocode.dotnet.samples/src - robots - - - - - ../robocode.dotnet.api/target/robocode.xml - libs - - - ../robocode.dotnet.api/target/Help/RobotAPI.chm - - - ../robocode.dotnet.control.api/target/robocode.control.xml - libs - - - ../robocode.dotnet.control.api/target/Help/ControlAPI.chm - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/pom.xml deleted file mode 100644 index 8b3150f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/pom.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - 4.0.0 - robocode.dotnet.distribution - Robocode .NET Distribution - - net.sf.robocode - robocode.dotnet - ${robocode.dotnet.version} - - - - net.sf.robocode - robocode.dotnet.api - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.control.api - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.installer - ${project.version} - jar - - - net.sf.robocode - robocode.dotnet.content - ${project.version} - jar - - - net.sf.robocode - robocode.dotnet.samples - ${project.version} - dotnet:library - - - - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - - - maven-assembly-plugin - - ${project.parent.artifactId}-${robocode.version} - true - - dotnet-setup.asm.xml - - - - net.sf.robocode.installer.AutoExtract - - - - - - make-assembly - package - - single - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/robocode.dotnet.distribution.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/robocode.dotnet.distribution.iml deleted file mode 100644 index 7e826aa..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.distribution/robocode.dotnet.distribution.iml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.classpath b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.classpath deleted file mode 100644 index c447aff..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.classpath +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.project deleted file mode 100644 index 158bb23..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.project +++ /dev/null @@ -1,18 +0,0 @@ - - - robocode.dotnet.host - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.nhost - robocode.dotnet.api - robocode.dotnet.control.api - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 15519c1..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:34:10 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/test/java=8859_1 -encoding/src/main/resources=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/pom.xml deleted file mode 100644 index 1e5b88d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/pom.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - 4.0.0 - robocode.dotnet.host - Robocode .NET Host - ${robocode.version} - - net.sf.robocode - robocode.dotnet - ${robocode.dotnet.version} - - - - net.sf.robocode - robocode.host - ${robocode.version} - - - net.sf.robocode - robocode.repository - ${robocode.version} - - - net.sf.robocode - robocode.dotnet.nhost - ${robocode.dotnet.version} - dotnet:library - - - net.sf.jni4net - jni4net.j - 0.8.7.0 - - - net.sf.jni4net - jni4net.n - 0.8.7.0 - dotnet:library - - - net.sf.jni4net - jni4net.n.w32.v20 - 0.8.7.0 - dotnet:library - - - net.sf.jni4net - jni4net.n.w64.v20 - 0.8.7.0 - dotnet:library - - - net.sf.jni4net - jni4net.n.w32.v40 - 0.8.7.0 - dotnet:library - - - net.sf.jni4net - jni4net.n.w64.v40 - 0.8.7.0 - dotnet:library - - - junit - junit - 4.11 - test - - - - - - org.jvnet.maven-antrun-extended-plugin - maven-antrun-extended-plugin - - - process-classes - - - - - - - - - - - - - - - - - - - - - - run - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/robocode.dotnet.host.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/robocode.dotnet.host.iml deleted file mode 100644 index 3fdf0ce..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/robocode.dotnet.host.iml +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/java_/util/Random_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/java_/util/Random_.java deleted file mode 100644 index 56d7c37..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/java_/util/Random_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package java_.util; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class Random_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return java_.util.Random_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - java_.util.Random_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/core/ContainerBase_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/core/ContainerBase_.java deleted file mode 100644 index 752fc5b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/core/ContainerBase_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.core; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class ContainerBase_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.core.ContainerBase_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.core.ContainerBase_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/DotNetHost.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/DotNetHost.java deleted file mode 100644 index 5c26c80..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/DotNetHost.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.dotnet.host; - -@net.sf.jni4net.attributes.ClrType -public class DotNetHost extends system.Object implements net.sf.robocode.host.IHost { - - // - private static system.Type staticType; - - protected DotNetHost(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrConstructor("()V") - public DotNetHost() { - super(((net.sf.jni4net.inj.INJEnv)(null)), 0); - net.sf.robocode.dotnet.host.DotNetHost.__ctorDotNetHost0(this); - } - - @net.sf.jni4net.attributes.ClrMethod("()V") - private native static void __ctorDotNetHost0(net.sf.jni4net.inj.IClrProxy thiz); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy;") - public native net.sf.robocode.host.proxies.IHostingRobotProxy createRobotProxy(net.sf.robocode.host.IHostManager par0, robocode.control.RobotSpecification par1, net.sf.robocode.peer.IRobotStatics par2, net.sf.robocode.peer.IRobotPeer par3); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;") - public native java.lang.String[] getReferencedClasses(net.sf.robocode.repository.IRobotItem par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;") - public native net.sf.robocode.repository.RobotType getRobotType(net.sf.robocode.repository.IRobotItem par0, boolean par1, boolean par2); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/host/IHostManager;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy;") - public native net.sf.robocode.host.proxies.IHostingRobotProxy createRobotProxy(net.sf.robocode.host.IHostManager hostManager, java.lang.Object robotSpecification, net.sf.robocode.peer.IRobotStatics statics, net.sf.robocode.peer.IRobotPeer peer); - - public static system.Type typeof() { - return net.sf.robocode.dotnet.host.DotNetHost.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.dotnet.host.DotNetHost.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/Module.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/Module.java deleted file mode 100644 index e538d7a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/Module.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.dotnet.host; - - -import net.sf.robocode.core.*; -import net.sf.robocode.dotnet.repository.items.handlers.DotNetPropertiesHandler; -import net.sf.robocode.dotnet.repository.root.handlers.DllHandler; -import net.sf.robocode.manager.IVersionManagerBase; -import net.sf.robocode.io.Logger; -import net.sf.jni4net.Bridge; - -import java.io.File; -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public class Module extends BaseModule { - static { - // .NET proxies and their interfaces must be loaded in system class loader in order to call native methods - Init(); - } - - private static void Init() { - try { - - String libsDir; - final String version = ContainerBase.getComponent(IVersionManagerBase.class).getVersionN(); - - final java.security.CodeSource source = Module.class.getProtectionDomain().getCodeSource(); - final File file = new File(source.getLocation().toURI()).getCanonicalFile(); - - if (file.getName().equals("classes")) { - libsDir = file.getParent(); - } else if (file.getName().endsWith(".jar")) { - libsDir = file.getParent(); - } else { - throw new Error("Can't find " + file); - } - - final String nhost = libsDir + "/robocode.dotnet.nhost-" + version + ".dll"; - final String ncontrol = libsDir + "/robocode.control.dll"; - - Bridge.init(new File(libsDir)); - // Bridge.setVerbose(true); - // Bridge.setDebug(true); - Bridge.SetSystemClassLoader(Container.engineLoader); - Bridge.LoadAndRegisterAssemblyFrom(new File(ncontrol)); - Bridge.LoadAndRegisterAssemblyFrom(new File(nhost)); - - Container.cache.addComponent("DllItemHandler", DllHandler.class); - Container.cache.addComponent("CsPropertiesHandler", DotNetPropertiesHandler.class); - Container.cache.addComponent("VbPropertiesHandler", DotNetPropertiesHandler.class); - Container.cache.addComponent("DotNetPropertiesHandler", DotNetPropertiesHandler.class); - - // .NET proxies - Container.cache.addComponent("robocode.host.cs", DotNetHost.class); - Container.cache.addComponent("robocode.host.vb", DotNetHost.class); - Container.cache.addComponent("robocode.host.dotnet", DotNetHost.class); - - } catch (RuntimeException e) { - Logger.logError(e); - throw new Error("Can't initialize .NET Robocode", e); - } - } - - public void afterLoaded(List allModules) { - net.sf.robocode.dotnet.nhost.ModuleN.InitN(); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/nhost/ModuleN.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/nhost/ModuleN.java deleted file mode 100644 index f5d9c0b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/nhost/ModuleN.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.dotnet.nhost; - -@net.sf.jni4net.attributes.ClrType -public class ModuleN extends system.Object { - - // - private static system.Type staticType; - - protected ModuleN(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrConstructor("()V") - public ModuleN() { - super(((net.sf.jni4net.inj.INJEnv)(null)), 0); - net.sf.robocode.dotnet.nhost.ModuleN.__ctorModuleN0(this); - } - - @net.sf.jni4net.attributes.ClrMethod("()V") - private native static void __ctorModuleN0(net.sf.jni4net.inj.IClrProxy thiz); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native static void InitN(); - - public static system.Type typeof() { - return net.sf.robocode.dotnet.nhost.ModuleN.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.dotnet.nhost.ModuleN.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/DotNetRobotItem.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/DotNetRobotItem.java deleted file mode 100644 index bf1c457..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/DotNetRobotItem.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.dotnet.repository.items; - - -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.root.IRepositoryRoot; - -import java.net.URL; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class DotNetRobotItem extends RobotItem { - private static final long serialVersionUID = 1L; - - public DotNetRobotItem(IRepositoryRoot root, URL itemURL) { - super(itemURL, root); - - properties.setProperty(ROBOT_PLATFORM, "DotNet"); // instead of ".NET", as it is used for class names etc. - isPropertiesLoaded = true; - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/handlers/DotNetPropertiesHandler.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/handlers/DotNetPropertiesHandler.java deleted file mode 100644 index e89c439..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/items/handlers/DotNetPropertiesHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.dotnet.repository.items.handlers; - - -import net.sf.robocode.repository.items.handlers.PropertiesHandler; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.dotnet.repository.items.DotNetRobotItem; -import net.sf.robocode.dotnet.repository.root.DllRoot; - -import java.net.URL; -import java.io.File; - - -/** - * @author Pavel Savara (original) - */ -public class DotNetPropertiesHandler extends PropertiesHandler { - - /** - * {@inheritDoc} - */ - @Override - protected IRepositoryItem acceptItem(URL itemURL, IRepositoryRoot root, IRepository repository) { - // Accept and register the item if it is a .NET properties file - String name = itemURL.toString().toLowerCase(); - if (name.contains(".dll!/")) { - return register(itemURL, root, repository); - } - return null; - } - - private IRepositoryItem register(URL itemURL, IRepositoryRoot root, IRepository repository) { - RobotItem item = (RobotItem) repository.getItem(itemURL.toString()); - if (item == null) { - item = createItem(itemURL, root, repository); - } - repository.addOrUpdateItem(item); - return item; - } - - protected RobotItem createItem(URL itemURL, IRepositoryRoot root, IRepository repository) { - File file = new File(itemURL.toString().replace(".properties", ".dll")); - DotNetRobotItem item = new DotNetRobotItem(new DllRoot(repository, file), itemURL); - - item.setClassURL(itemURL); - return item; - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRoot.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRoot.java deleted file mode 100644 index 527f029..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRoot.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.dotnet.repository.root; - - -import net.sf.robocode.repository.root.BaseRoot; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.items.handlers.ItemHandler; -import net.sf.robocode.io.Logger; - -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.net.MalformedURLException; -import java.io.File; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.List; -import java.lang.String; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public final class DllRoot extends BaseRoot implements IRepositoryRoot { - private static final long serialVersionUID = 1L; - - private final String dllPath; - private final URL dllUrl; - - private long lastModified; - - public DllRoot(IRepository repository, File rootPath) { - super(repository, rootPath); - String dllPath = null; - URL dllUrl = null; - try { - dllPath = rootPath.toURI().toString(); - dllUrl = new URL(dllPath + "!/"); - dllPath = URLDecoder.decode(dllPath, "UTF8"); - } catch (MalformedURLException e) { - Logger.logError(e); - } catch (UnsupportedEncodingException e) { - Logger.logError(e); - } - this.dllPath = dllPath; - this.dllUrl = dllUrl; - } - - /** - * {@inheritDoc} - */ - public void updateItems(boolean force) { - setStatus("Updating DLL: " + rootPath.toString()); - - long lastModified = rootPath.lastModified(); - - if (lastModified > this.lastModified) { - repository.removeItemsFromRoot(this); - this.lastModified = lastModified; - - List repositoryItems = new ArrayList(); - - visitItems(repositoryItems); - for (IRepositoryItem repositoryItem : repositoryItems) { - repositoryItem.update(lastModified, force); - } - } - } - - private void visitItems(List items) { - String[] dllItems = DllRootHelper.findItems(dllPath); - - for (String url : dllItems) { - createItem(items, dllUrl, url); - } - } - - private void createItem(List items, URL root, String url) { - try { - IRepositoryItem item = ItemHandler.registerItem(new URL(url), DllRoot.this, repository); - if (item != null) { - if (item instanceof RobotItem) { - ((RobotItem) item).setClassPathURL(root); - } - items.add(item); - } - } catch (MalformedURLException e) { - Logger.logError(e); - } - } - - public void updateItem(IRepositoryItem item, boolean force) { - item.update(rootPath.lastModified(), force); - } - - public boolean isChanged(IRepositoryItem item) { - return rootPath.lastModified() > lastModified; - } - - public URL getRootUrl() { - return dllUrl; - } - - public boolean isDevelopmentRoot() { - return false; - } - - public boolean isJAR() { - return true; - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRootHelper.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRootHelper.java deleted file mode 100644 index 4e485d6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/DllRootHelper.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.dotnet.repository.root; - -@net.sf.jni4net.attributes.ClrType -public class DllRootHelper extends system.Object { - - // - private static system.Type staticType; - - protected DllRootHelper(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - protected DllRootHelper() { - super(((net.sf.jni4net.inj.INJEnv)(null)), 0); - } - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native static void Open(); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native static void Close(); - - @net.sf.jni4net.attributes.ClrMethod("(LSystem/String;)[LSystem/String;") - public native static java.lang.String[] findItems(java.lang.String dllPath); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;)Lnet/sf/robocode/repository/RobotType;") - public native static net.sf.robocode.repository.RobotType GetRobotType(net.sf.robocode.repository.IRobotItem robotItem); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;)LSystem/String;") - public native static java.lang.String GetDllFileName(net.sf.robocode.repository.IRobotItem robotItem); - - public static system.Type typeof() { - return net.sf.robocode.dotnet.repository.root.DllRootHelper.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.dotnet.repository.root.DllRootHelper.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/handlers/DllHandler.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/handlers/DllHandler.java deleted file mode 100644 index 9e8502d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/repository/root/handlers/DllHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.dotnet.repository.root.handlers; - - -import net.sf.robocode.dotnet.repository.root.DllRootHelper; -import net.sf.robocode.dotnet.repository.root.DllRoot; -import net.sf.robocode.repository.root.handlers.RootHandler; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.repository.IRepository; - -import java.io.File; -import java.io.FileFilter; -import java.util.Map; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class DllHandler extends RootHandler { - - public void open() { - DllRootHelper.Open(); - } - - public void close() { - DllRootHelper.Close(); - } - - public void visitDirectory(File dir, boolean isDevel, Map newRoots, IRepository repository, boolean force) { - // find dll files - final File[] dlls = dir.listFiles(new FileFilter() { - public boolean accept(File pathname) { - String path = pathname.toString().toLowerCase(); - return pathname.isFile() && path.endsWith(".dll") && !path.equalsIgnoreCase("robocode.dll") - && !path.contains("jni4net"); - } - }); - - if (dlls != null) { - // update DLL files - for (File dll : dlls) { - String key = dll.toURI().toString(); - IRepositoryRoot root = repository.getRoots().get(key); - if (root == null) { - root = new DllRoot(repository, dll); - } else { - repository.removeRoot(key); - } - - root.updateItems(force); - newRoots.put(dll.toURI().toString(), root); - } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHostManager_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHostManager_.java deleted file mode 100644 index 53456b8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHostManager_.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.host; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IHostManager_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.host.IHostManager_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.host.IHostManager_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IHostManager extends system.Object implements net.sf.robocode.host.IHostManager { - - protected __IHostManager(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void cleanup(); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobotPeer;)Ljava/lang/Object;") - public native java.lang.Object createRobotProxy(robocode.control.RobotSpecification par0, net.sf.robocode.host.RobotStatics par1, net.sf.robocode.peer.IRobotPeer par2); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;") - public native java.lang.String[] getReferencedClasses(net.sf.robocode.repository.IRobotItem par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;") - public native net.sf.robocode.repository.RobotType getRobotType(net.sf.robocode.repository.IRobotItem par0, boolean par1, boolean par2); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void initSecurity(); - - @net.sf.jni4net.attributes.ClrMethod("()J") - public native long getRobotFilesystemQuota(); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void resetThreadManager(); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;)V") - public native void addSafeThread(java.lang.Thread par0); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;)V") - public native void removeSafeThread(java.lang.Thread par0); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/io/PrintStream;") - public native java.io.PrintStream getRobotOutputStream(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHost_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHost_.java deleted file mode 100644 index b1752e3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/IHost_.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.host; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IHost_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.host.IHost_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.host.IHost_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IHost extends system.Object implements net.sf.robocode.host.IHost { - - protected __IHost(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/host/IHostManager;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy;") - public native net.sf.robocode.host.proxies.IHostingRobotProxy createRobotProxy(net.sf.robocode.host.IHostManager par0, robocode.control.RobotSpecification par1, net.sf.robocode.peer.IRobotStatics par2, net.sf.robocode.peer.IRobotPeer par3); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;") - public native java.lang.String[] getReferencedClasses(net.sf.robocode.repository.IRobotItem par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;") - public native net.sf.robocode.repository.RobotType getRobotType(net.sf.robocode.repository.IRobotItem par0, boolean par1, boolean par2); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/RobotStatics_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/RobotStatics_.java deleted file mode 100644 index f0e0348..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/RobotStatics_.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.host; - - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RobotStatics_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.host.RobotStatics_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.host.RobotStatics_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy_.java deleted file mode 100644 index 5bf220e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy_.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.host.proxies; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IHostingRobotProxy_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.host.proxies.IHostingRobotProxy_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.host.proxies.IHostingRobotProxy_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IHostingRobotProxy extends system.Object implements net.sf.robocode.host.proxies.IHostingRobotProxy { - - protected __IHostingRobotProxy(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void cleanup(); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;Ljava/lang/Object;)V") - public native void startRound(net.sf.robocode.peer.ExecCommands par0, robocode.RobotStatus par1); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void forceStopThread(); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void waitForStopThread(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/io/Logger_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/io/Logger_.java deleted file mode 100644 index c010fde..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/io/Logger_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.io; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class Logger_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.io.Logger_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.io.Logger_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/manager/IVersionManagerBase_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/manager/IVersionManagerBase_.java deleted file mode 100644 index cded2c3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/manager/IVersionManagerBase_.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.manager; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IVersionManagerBase_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.manager.IVersionManagerBase_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.manager.IVersionManagerBase_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IVersionManagerBase extends system.Object implements net.sf.robocode.manager.IVersionManagerBase { - - protected __IVersionManagerBase(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getVersionAsInt(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getVersionN(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isLastRunVersionChanged(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/BadBehavior_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/BadBehavior_.java deleted file mode 100644 index e44a81b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/BadBehavior_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.peer; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BadBehavior_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.peer.BadBehavior_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.peer.BadBehavior_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotPeer_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotPeer_.java deleted file mode 100644 index 58f7867..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotPeer_.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.peer; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IRobotPeer_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.peer.IRobotPeer_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.peer.IRobotPeer_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IRobotPeer extends system.Object implements net.sf.robocode.peer.IRobotPeer { - - protected __IRobotPeer(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void drainEnergy(); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/peer/BadBehavior;)V") - public native void punishBadBehavior(net.sf.robocode.peer.BadBehavior par0); - - @net.sf.jni4net.attributes.ClrMethod("(Z)V") - public native void setRunning(boolean par0); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isRunning(); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;)Ljava/lang/Object;") - public native net.sf.robocode.peer.ExecResults waitForBattleEndImpl(net.sf.robocode.peer.ExecCommands par0); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;)Ljava/lang/Object;") - public native net.sf.robocode.peer.ExecResults executeImpl(net.sf.robocode.peer.ExecCommands par0); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/nio/ByteBuffer;)V") - public native void setupBuffer(java.nio.ByteBuffer par0); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void executeImplSerial(); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void waitForBattleEndImplSerial(); - - @net.sf.jni4net.attributes.ClrMethod("()V") - public native void setupThread(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotStatics_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotStatics_.java deleted file mode 100644 index 3fbbe89..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/peer/IRobotStatics_.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.peer; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IRobotStatics_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.peer.IRobotStatics_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.peer.IRobotStatics_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IRobotStatics extends system.Object implements net.sf.robocode.peer.IRobotStatics { - - protected __IRobotStatics(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isAdvancedRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isTeamRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isInteractiveRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isPaintRobot(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotItem_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotItem_.java deleted file mode 100644 index 217ce55..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotItem_.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.repository; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IRobotItem_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.repository.IRobotItem_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.repository.IRobotItem_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IRobotItem extends system.Object implements net.sf.robocode.repository.IRobotItem { - - protected __IRobotItem(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;)I") - public native int compareTo(java.lang.Object par0); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isValid(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isTeam(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isInJAR(); - - @net.sf.jni4net.attributes.ClrMethod("(Z)V") - public native void setValid(boolean par0); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getDescription(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getAuthorName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/net/URL;") - public native java.net.URL getWebpage(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean getIncludeSource(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean getIncludeData(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isSourceIncluded(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRootPath(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/net/URL;") - public native java.net.URL getItemURL(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isDevelopmentVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRobocodeVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getFullPackage(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRelativePath(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRootPackage(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getFullClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueFullClassName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueFullClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueShortClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueVeryShortClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getFullClassName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getShortClassName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/Object;") - public native robocode.control.RobotSpecification createRobotSpecification(); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/io/OutputStream;Ljava/lang/Object;)V") - public native void storeProperties(java.io.OutputStream par0, net.sf.robocode.repository.RobotProperties par1); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getPlatform(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isJuniorRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isStandardRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isAdvancedRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isTeamRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isDroid(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isSentryRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isInteractiveRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isPaintRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/net/URL;") - public native java.net.URL getClassPathURL(); - - @net.sf.jni4net.attributes.ClrMethod("()[Ljava/net/URL;") - public native java.net.URL[] getSourcePathURLs(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getWritableDirectory(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getReadableDirectory(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotSpecItem_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotSpecItem_.java deleted file mode 100644 index 1dabc34..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/IRobotSpecItem_.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.repository; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IRobotSpecItem_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.repository.IRobotSpecItem_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.repository.IRobotSpecItem_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IRobotSpecItem extends system.Object implements net.sf.robocode.repository.IRobotSpecItem { - - protected __IRobotSpecItem(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;)I") - public native int compareTo(java.lang.Object par0); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isValid(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isTeam(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isInJAR(); - - @net.sf.jni4net.attributes.ClrMethod("(Z)V") - public native void setValid(boolean par0); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getDescription(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getAuthorName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/net/URL;") - public native java.net.URL getWebpage(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean getIncludeSource(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean getIncludeData(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isSourceIncluded(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRootPath(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/net/URL;") - public native java.net.URL getItemURL(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isDevelopmentVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRobocodeVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getFullPackage(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRelativePath(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getRootPackage(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getFullClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueFullClassName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueFullClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueShortClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getUniqueVeryShortClassNameWithVersion(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getFullClassName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getShortClassName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/Object;") - public native robocode.control.RobotSpecification createRobotSpecification(); - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/io/OutputStream;Ljava/lang/Object;)V") - public native void storeProperties(java.io.OutputStream par0, net.sf.robocode.repository.RobotProperties par1); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/RobotType_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/RobotType_.java deleted file mode 100644 index 3c0292d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/repository/RobotType_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.repository; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RobotType_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.repository.RobotType_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.repository.RobotType_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/security/HiddenAccess_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/security/HiddenAccess_.java deleted file mode 100644 index 24bf34b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/security/HiddenAccess_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.security; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class HiddenAccess_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.security.HiddenAccess_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.security.HiddenAccess_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/ISerializableHelper_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/ISerializableHelper_.java deleted file mode 100644 index 3dbeb3d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/ISerializableHelper_.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.serialization; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class ISerializableHelper_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.serialization.ISerializableHelper_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.serialization.ISerializableHelper_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __ISerializableHelper extends system.Object implements net.sf.robocode.serialization.ISerializableHelper { - - protected __ISerializableHelper(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;Ljava/lang/Object;)V") - public native void serialize(net.sf.robocode.serialization.RbSerializer par0, java.nio.ByteBuffer par1, java.lang.Object par2); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;)Ljava/lang/Object;") - public native java.lang.Object deserialize(net.sf.robocode.serialization.RbSerializer par0, java.nio.ByteBuffer par1); - - @net.sf.jni4net.attributes.ClrMethod("(Lnet/sf/robocode/serialization/RbSerializer;Ljava/lang/Object;)I") - public native int sizeOf(net.sf.robocode.serialization.RbSerializer par0, java.lang.Object par1); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/RbSerializer_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/RbSerializer_.java deleted file mode 100644 index 3244d98..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/serialization/RbSerializer_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package net.sf.robocode.serialization; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RbSerializer_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return net.sf.robocode.serialization.RbSerializer_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - net.sf.robocode.serialization.RbSerializer_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/BattleRules_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/BattleRules_.java deleted file mode 100644 index 8825c15..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/BattleRules_.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode; - - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleRules_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.BattleRules_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.BattleRules_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattleSpecification_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattleSpecification_.java deleted file mode 100644 index 1ef3b27..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattleSpecification_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleSpecification_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.BattleSpecification_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.BattleSpecification_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattlefieldSpecification_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattlefieldSpecification_.java deleted file mode 100644 index 5bb04f6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/BattlefieldSpecification_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattlefieldSpecification_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.BattlefieldSpecification_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.BattlefieldSpecification_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RandomFactory_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RandomFactory_.java deleted file mode 100644 index 11488c8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RandomFactory_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RandomFactory_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.RandomFactory_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.RandomFactory_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobocodeEngine_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobocodeEngine_.java deleted file mode 100644 index 474d910..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobocodeEngine_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RobocodeEngine_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.RobocodeEngine_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.RobocodeEngine_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotResults_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotResults_.java deleted file mode 100644 index 8662aed..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotResults_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RobotResults_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.RobotResults_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.RobotResults_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSetup_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSetup_.java deleted file mode 100644 index b96a88d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSetup_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RobotSetup_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.RobotSetup_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.RobotSetup_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSpecification_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSpecification_.java deleted file mode 100644 index af1254f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/RobotSpecification_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RobotSpecification_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.RobotSpecification_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.RobotSpecification_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleCompletedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleCompletedEvent_.java deleted file mode 100644 index c8e28be..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleCompletedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleCompletedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattleCompletedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattleCompletedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleErrorEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleErrorEvent_.java deleted file mode 100644 index 64b99ea..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleErrorEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleErrorEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattleErrorEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattleErrorEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleEvent_.java deleted file mode 100644 index cc80540..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattleEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattleEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleFinishedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleFinishedEvent_.java deleted file mode 100644 index 6c664aa..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleFinishedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleFinishedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattleFinishedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattleFinishedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleMessageEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleMessageEvent_.java deleted file mode 100644 index 219e593..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleMessageEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleMessageEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattleMessageEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattleMessageEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattlePausedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattlePausedEvent_.java deleted file mode 100644 index ec6f7f6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattlePausedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattlePausedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattlePausedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattlePausedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleResumedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleResumedEvent_.java deleted file mode 100644 index 7be0da3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleResumedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleResumedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattleResumedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattleResumedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleStartedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleStartedEvent_.java deleted file mode 100644 index ded5769..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/BattleStartedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BattleStartedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.BattleStartedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.BattleStartedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/IBattleListener_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/IBattleListener_.java deleted file mode 100644 index 3be3fb9..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/IBattleListener_.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IBattleListener_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.IBattleListener_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.IBattleListener_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IBattleListener extends system.Object implements robocode.control.events.IBattleListener { - - protected __IBattleListener(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/BattleStartedEvent;)V") - public native void onBattleStarted(robocode.control.events.BattleStartedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/BattleFinishedEvent;)V") - public native void onBattleFinished(robocode.control.events.BattleFinishedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/BattleCompletedEvent;)V") - public native void onBattleCompleted(robocode.control.events.BattleCompletedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/BattlePausedEvent;)V") - public native void onBattlePaused(robocode.control.events.BattlePausedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/BattleResumedEvent;)V") - public native void onBattleResumed(robocode.control.events.BattleResumedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/RoundStartedEvent;)V") - public native void onRoundStarted(robocode.control.events.RoundStartedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/RoundEndedEvent;)V") - public native void onRoundEnded(robocode.control.events.RoundEndedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/TurnStartedEvent;)V") - public native void onTurnStarted(robocode.control.events.TurnStartedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/TurnEndedEvent;)V") - public native void onTurnEnded(robocode.control.events.TurnEndedEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/BattleMessageEvent;)V") - public native void onBattleMessage(robocode.control.events.BattleMessageEvent par0); - - @net.sf.jni4net.attributes.ClrMethod("(Lrobocode/control/events/BattleErrorEvent;)V") - public native void onBattleError(robocode.control.events.BattleErrorEvent par0); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundEndedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundEndedEvent_.java deleted file mode 100644 index 093cd60..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundEndedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RoundEndedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.RoundEndedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.RoundEndedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundStartedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundStartedEvent_.java deleted file mode 100644 index 43df805..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/RoundStartedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RoundStartedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.RoundStartedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.RoundStartedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnEndedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnEndedEvent_.java deleted file mode 100644 index efbc4cb..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnEndedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class TurnEndedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.TurnEndedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.TurnEndedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnStartedEvent_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnStartedEvent_.java deleted file mode 100644 index 0fb4c2b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/events/TurnStartedEvent_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.events; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class TurnStartedEvent_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.events.TurnStartedEvent_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.events.TurnStartedEvent_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/BulletState_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/BulletState_.java deleted file mode 100644 index c27d210..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/BulletState_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.snapshot; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class BulletState_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.snapshot.BulletState_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.snapshot.BulletState_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IBulletSnapshot_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IBulletSnapshot_.java deleted file mode 100644 index 390c165..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IBulletSnapshot_.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.snapshot; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IBulletSnapshot_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.snapshot.IBulletSnapshot_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.snapshot.IBulletSnapshot_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IBulletSnapshot extends system.Object implements robocode.control.snapshot.IBulletSnapshot { - - protected __IBulletSnapshot(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()Lrobocode/control/snapshot/BulletState;") - public native robocode.control.snapshot.BulletState getState(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getX(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getY(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getHeading(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getPower(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getPaintX(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getPaintY(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getColor(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getFrame(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isExplosion(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getExplosionImageIndex(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getBulletId(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getVictimIndex(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getOwnerIndex(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IDebugProperty_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IDebugProperty_.java deleted file mode 100644 index 66f78f4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IDebugProperty_.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.snapshot; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IDebugProperty_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.snapshot.IDebugProperty_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.snapshot.IDebugProperty_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IDebugProperty extends system.Object implements robocode.control.snapshot.IDebugProperty { - - protected __IDebugProperty(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getValue(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getKey(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IRobotSnapshot_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IRobotSnapshot_.java deleted file mode 100644 index 8d11a00..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IRobotSnapshot_.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.snapshot; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IRobotSnapshot_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.snapshot.IRobotSnapshot_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.snapshot.IRobotSnapshot_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IRobotSnapshot extends system.Object implements robocode.control.snapshot.IRobotSnapshot { - - protected __IRobotSnapshot(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getName(); - - @net.sf.jni4net.attributes.ClrMethod("()Lrobocode/control/snapshot/RobotState;") - public native robocode.control.snapshot.RobotState getState(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getTeamName(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getX(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getY(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getShortName(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getVeryShortName(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getRobotIndex(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getTeamIndex(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getContestantIndex(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getEnergy(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getVelocity(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getBodyHeading(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getGunHeading(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getRadarHeading(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getGunHeat(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getBodyColor(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getGunColor(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getRadarColor(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getScanColor(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isDroid(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isSentryRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isPaintRobot(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isPaintEnabled(); - - @net.sf.jni4net.attributes.ClrMethod("()Z") - public native boolean isSGPaintEnabled(); - - @net.sf.jni4net.attributes.ClrMethod("()[Lrobocode/control/snapshot/IDebugProperty;") - public native robocode.control.snapshot.IDebugProperty[] getDebugProperties(); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getOutputStreamSnapshot(); - - @net.sf.jni4net.attributes.ClrMethod("()Lrobocode/control/snapshot/IScoreSnapshot;") - public native robocode.control.snapshot.IScoreSnapshot getScoreSnapshot(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IScoreSnapshot_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IScoreSnapshot_.java deleted file mode 100644 index bac14e4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/IScoreSnapshot_.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.snapshot; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class IScoreSnapshot_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.snapshot.IScoreSnapshot_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.snapshot.IScoreSnapshot_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __IScoreSnapshot extends system.Object implements robocode.control.snapshot.IScoreSnapshot { - - protected __IScoreSnapshot(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("(Ljava/lang/Object;)I") - public native int compareTo(java.lang.Object par0); - - @net.sf.jni4net.attributes.ClrMethod("()Ljava/lang/String;") - public native java.lang.String getName(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getTotalScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getTotalSurvivalScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getTotalLastSurvivorBonus(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getTotalBulletDamageScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getTotalBulletKillBonus(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getTotalRammingDamageScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getTotalRammingKillBonus(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getTotalFirsts(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getTotalSeconds(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getTotalThirds(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getCurrentScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getCurrentSurvivalScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getCurrentSurvivalBonus(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getCurrentBulletDamageScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getCurrentBulletKillBonus(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getCurrentRammingDamageScore(); - - @net.sf.jni4net.attributes.ClrMethod("()D") - public native double getCurrentRammingKillBonus(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/ITurnSnapshot_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/ITurnSnapshot_.java deleted file mode 100644 index 7513dd2..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/ITurnSnapshot_.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.snapshot; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class ITurnSnapshot_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.snapshot.ITurnSnapshot_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.snapshot.ITurnSnapshot_.staticType = staticType; - } - // -} - -// -@net.sf.jni4net.attributes.ClrProxy -class __ITurnSnapshot extends system.Object implements robocode.control.snapshot.ITurnSnapshot { - - protected __ITurnSnapshot(net.sf.jni4net.inj.INJEnv __env, long __handle) { - super(__env, __handle); - } - - @net.sf.jni4net.attributes.ClrMethod("()[Lrobocode/control/snapshot/IRobotSnapshot;") - public native robocode.control.snapshot.IRobotSnapshot[] getRobots(); - - @net.sf.jni4net.attributes.ClrMethod("()[Lrobocode/control/snapshot/IBulletSnapshot;") - public native robocode.control.snapshot.IBulletSnapshot[] getBullets(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getTPS(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getRound(); - - @net.sf.jni4net.attributes.ClrMethod("()I") - public native int getTurn(); - - @net.sf.jni4net.attributes.ClrMethod("()[Lrobocode/control/snapshot/IScoreSnapshot;") - public native robocode.control.snapshot.IScoreSnapshot[] getSortedTeamScores(); - - @net.sf.jni4net.attributes.ClrMethod("()[Lrobocode/control/snapshot/IScoreSnapshot;") - public native robocode.control.snapshot.IScoreSnapshot[] getIndexedTeamScores(); -} -// diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/RobotState_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/RobotState_.java deleted file mode 100644 index 91f7cdc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/control/snapshot/RobotState_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.control.snapshot; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class RobotState_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.control.snapshot.RobotState_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.control.snapshot.RobotState_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/AbortedException_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/AbortedException_.java deleted file mode 100644 index b36c4c8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/AbortedException_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.exception; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class AbortedException_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.exception.AbortedException_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.exception.AbortedException_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DeathException_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DeathException_.java deleted file mode 100644 index dfef221..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DeathException_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.exception; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class DeathException_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.exception.DeathException_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.exception.DeathException_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DisabledException_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DisabledException_.java deleted file mode 100644 index 9c69e46..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/DisabledException_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.exception; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class DisabledException_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.exception.DisabledException_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.exception.DisabledException_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/WinException_.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/WinException_.java deleted file mode 100644 index 75df821..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/robocode/exception/WinException_.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// ------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ - -package robocode.exception; - -@net.sf.jni4net.attributes.ClrTypeInfo -public final class WinException_ { - - // - private static system.Type staticType; - - public static system.Type typeof() { - return robocode.exception.WinException_.staticType; - } - - private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { - robocode.exception.WinException_.staticType = staticType; - } - // -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/test/java/net/sf/robocode/dotnet/host/TestCLR.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/test/java/net/sf/robocode/dotnet/host/TestCLR.java deleted file mode 100644 index 858fd26..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/test/java/net/sf/robocode/dotnet/host/TestCLR.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.dotnet.host; - - -import org.junit.Test; - - -/** - * @author Pavel Savara (original) - */ -public class TestCLR { - - @Test - public void test1() {} - - @Test - public void test2() {} -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iml deleted file mode 100644 index c163c5f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.classpath b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.classpath deleted file mode 100644 index 5114d59..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.project deleted file mode 100644 index 26afbc5..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.project +++ /dev/null @@ -1,14 +0,0 @@ - - - robocode.dotnet.installer - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 764c3ab..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:34:11 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/test/java=8859_1 -encoding/src/main/resources=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/pom.xml deleted file mode 100644 index 66dc7b8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - 4.0.0 - robocode.dotnet.installer - Robocode .NET Installer - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - net.sf.robocode.installer.AutoExtract - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/robocode.dotnet.installer.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/robocode.dotnet.installer.iml deleted file mode 100644 index 93c108a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/robocode.dotnet.installer.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java deleted file mode 100644 index 852475f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java +++ /dev/null @@ -1,382 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.installer; - - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.URL; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.jar.JarInputStream; - - -/** - * Installer for Robocode. - * - * @author Mathew A. Nelsen (original) - * @author Flemming N. Larsen (contributor) - */ -public class AutoExtract implements ActionListener { - private JDialog licenseDialog; - private boolean accepted; - private final String[] spinner = { "-", "\\", "|", "/"}; - private String message = ""; - private static File installDir; - private static final String javaVersion = System.getProperty("java.version"); - - private boolean acceptLicense() { - String licenseText = ""; - - InputStream is; - - try { - JarFile extractJar = new JarFile("extract.jar"); - - is = extractJar.getInputStream(extractJar.getJarEntry("license/cpl-v10.html")); - } catch (IOException e) { - return true; - } - if (is == null) { - return true; - } - - BufferedReader r = new BufferedReader(new InputStreamReader(is)); - - try { - String line = r.readLine(); - - while (line != null) { - licenseText += line; - line = r.readLine(); - } - return acceptReject(licenseText); - - } catch (IOException e) { - System.err.println("Could not read line from license file: " + e); - } - return true; - } - - private boolean acceptReject(String text) { - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - licenseDialog = new JDialog(); - licenseDialog.setTitle("License Agreement"); - licenseDialog.setModal(true); - licenseDialog.setLocation((screenSize.width - 500) / 2, (screenSize.height - 400) / 2); - licenseDialog.setSize(500, 400); - JTextPane t = new JTextPane(); - - t.setContentType("text/html"); - t.setText(text); - t.setFont(new Font("Dialog", Font.PLAIN, 12)); - t.setEditable(false); - - JScrollPane s = new JScrollPane(); - - s.setViewportView(t); - - licenseDialog.getContentPane().setLayout(new BorderLayout()); - licenseDialog.getContentPane().add(s, BorderLayout.CENTER); - - JPanel p = new JPanel(); - - p.setLayout(new BorderLayout()); - JButton b1 = new JButton("Accept"); - JButton b2 = new JButton("Cancel"); - - p.add(b1, BorderLayout.WEST); - p.add(b2, BorderLayout.EAST); - - b1.addActionListener(this); - b2.addActionListener(this); - - licenseDialog.getContentPane().add(p, BorderLayout.SOUTH); - - licenseDialog.setVisible(true); - - return accepted; - } - - public void actionPerformed(ActionEvent e) { - accepted = e.getActionCommand().equals("Accept"); - licenseDialog.dispose(); - licenseDialog = null; - } - - private boolean extract(File dest) { - JDialog statusDialog = new JDialog(); - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - int width = 500; - int height = 100; - - statusDialog.setTitle("Installing"); - statusDialog.setLocation((screenSize.width - width) / 2, (screenSize.height - height) / 2); - statusDialog.setSize(width, height); - JLabel status = new JLabel(); - - statusDialog.getContentPane().setLayout(new BorderLayout()); - statusDialog.getContentPane().add(status, BorderLayout.CENTER); - - statusDialog.setVisible(true); - - FileOutputStream fos; - String entryName; - - byte buf[] = new byte[2048]; - - final String name = AutoExtract.class.getName().replaceAll("\\.", "/") + ".class"; - String urlJar = AutoExtract.class.getClassLoader().getResource(name).toString(); - final String src = urlJar.substring("jar:file:/".length(), urlJar.indexOf("!/")); - - if (src.indexOf('!') > -1) { - final String message = src - + "\nContains an exclamation point. Please move the file to a different directory."; - - JOptionPane.showMessageDialog(null, message); - System.err.println(message); - System.exit(0); - } - JarInputStream jarIS = null; - try { - final URL url = new URL("file:/" + src); - InputStream is = url.openStream(); - jarIS = new JarInputStream(is); - - JarEntry entry = jarIS.getNextJarEntry(); - - while (entry != null) { - int spin = 0; - - entryName = entry.getName(); - if (entry.isDirectory()) { - if (!entryName.startsWith("net")) { - File dir = new File(dest, entry.getName()); - - if (!dir.exists() && !dir.mkdirs()) { - System.out.println("Can't create dir " + dir); - } - } - } else { - if (!entryName.equals(name)) { - status.setText(entryName + " " + spinner[spin++]); - - File out = new File(dest, entry.getName()); - File parentDirectory = new File(out.getParent()); - - if (!parentDirectory.exists() && !parentDirectory.mkdirs()) { - System.out.println("Can't create dir " + parentDirectory); - } - fos = new FileOutputStream(out); - - int index = 0; - int num; - int count = 0; - - while ((num = jarIS.read(buf, 0, 2048)) != -1) { - fos.write(buf, 0, num); - index += num; - count++; - if (count > 80) { - status.setText(entryName + " " + spinner[spin++] + " (" + index + " bytes)"); - if (spin > 3) { - spin = 0; - } - count = 0; - } - } - fos.close(); - - if (entryName.length() > 3 && entryName.substring(entryName.length() - 3).equals(".sh")) { - if (File.separatorChar == '/') { - Runtime.getRuntime().exec("chmod 755 " + out.toString()); - } - } - - status.setText(entryName + " " + spinner[spin] + " (" + index + " bytes)"); - } - } - entry = jarIS.getNextJarEntry(); - } - statusDialog.dispose(); - message = "Installation successful"; - return true; - } catch (IOException e) { - message = "Installation failed" + e; - return false; - } finally { - if (jarIS != null) { - try { - jarIS.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String argv[]) { - // Verify that the Java version is version 6 (1.6.0) or newer - if (javaVersion.startsWith("1.") && javaVersion.charAt(2) < '5') { - final String message = "Robocode requires Java 6 (1.6.0) or newer.\n" - + "Your system is currently running Java " + javaVersion + ".\n" - + "If you have not installed (or activated) at least\n" + "JRE 6 or JDK 6, please do so."; - - JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE); - System.err.println(message); - System.exit(0); - } - - // Set native look and feel - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (RuntimeException t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF - } - - File suggestedDir; - - AutoExtract extractor = new AutoExtract(); - - if (extractor.acceptLicense()) { - if (argv.length == 1) { - suggestedDir = new File(argv[0]); - } else if (File.separatorChar == '\\') { - suggestedDir = new File("c:\\robocode\\"); - } else { - suggestedDir = new File(System.getProperty("user.home") + File.separator + "robocode" + File.separator); - } - - boolean done = false; - - while (!done) { - int rc = JOptionPane.showConfirmDialog(null, - "Robocode plugin will be installed in:\n" + suggestedDir + "\nIs this ok?", "Installing Robocode", - JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - - if (rc == JOptionPane.YES_OPTION) { - installDir = suggestedDir; - done = true; - } else if (rc == JOptionPane.NO_OPTION) { - Object r = JOptionPane.showInputDialog(null, "Please type in the installation directory", - "Installation Directory", JOptionPane.PLAIN_MESSAGE, null, null, suggestedDir); - - if (r == null) { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - System.exit(0); - } else { - suggestedDir = new File(((String) r).trim()); - } - } else if (rc == JOptionPane.CANCEL_OPTION) { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - System.exit(0); - } - } - if (!installDir.exists()) { - int rc = JOptionPane.showConfirmDialog(null, - installDir.getPath() + "\ndoes not exist. Would you like to create it?", "Installing Robocode", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - - if (rc == JOptionPane.YES_OPTION) { - if (!installDir.exists() && !installDir.mkdirs()) { - System.out.println("Can't create dir " + installDir); - } - } else { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - System.exit(0); - } - } - boolean rv = extractor.extract(installDir); - - if (!rv) { - JOptionPane.showMessageDialog(null, extractor.message); - } - } else { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - } - - // Delete the class file with the installer and it's parent folders in the robocode home dir - if (installDir != null) { - String installerPath = AutoExtract.class.getName().replaceAll("\\.", "/") + "$1.class"; - - deleteFileAndParentDirsIfEmpty(new File(installDir, installerPath)); - } - - System.exit(0); - } - - private static boolean deleteDir(File dir) { - if (dir.isDirectory()) { - for (File file : dir.listFiles()) { - if (file.isDirectory()) { - // Skip directories ending with ".data" - if (file.getName().endsWith(".data")) { - continue; - } - try { - // Test for symlink and ignore. - // Robocode won't create one, but just in case a user does... - if (file.getCanonicalFile().getParentFile().equals(dir.getCanonicalFile())) { - deleteDir(file); - if (file.exists() && !file.delete()) { - System.err.println("Can't delete: " + file); - } - } else { - System.out.println("Warning: " + file + " may be a symlink. It has been ignored"); - } - } catch (IOException e) { - System.out.println( - "Warning: Cannot determine canonical file for " + file + ". It has been ignored"); - } - } else { - if (file.exists() && !file.delete()) { - System.err.println("Can't delete: " + file); - } - } - } - return dir.delete(); - } - return false; - } - - /** - * Deletes a file and afterwards deletes the parent directories that are empty. - * - * @param file the file or directory to delete - * @return true if success - */ - private static boolean deleteFileAndParentDirsIfEmpty(final File file) { - boolean wasDeleted = false; - - if (file != null && file.exists()) { - if (file.isDirectory()) { - wasDeleted = deleteDir(file); - } else { - wasDeleted = file.delete(); - - File parent = file; - - while (wasDeleted && (parent = parent.getParentFile()) != null) { - // Delete parent directory, but only if it is empty - File[] files = parent.listFiles(); - - if (files != null && files.length == 0) { - wasDeleted = deleteDir(parent); - } else { - wasDeleted = false; - } - } - } - } - return wasDeleted; - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ipr b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ipr deleted file mode 100644 index d223cbc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ipr +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iws b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iws deleted file mode 100644 index 03c854e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.iws +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.project deleted file mode 100644 index 8426045..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - robocode.dotnet.nhost - .NET nhost for Robocode. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.api - robocode.dotnet.control.api - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 070758f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,10 +0,0 @@ -#Tue Nov 27 22:34:10 CET 2012 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 -encoding/src/main/resources=8859_1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/test/resources=8859_1 -encoding/src=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/pom.xml deleted file mode 100644 index 5b166f5..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - 4.0.0 - robocode.dotnet.nhost - Robocode .NET nHost - .NET nhost for Robocode - dotnet:library - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - - net.sf.jni4net - jni4net.n - 0.8.7.0 - dotnet:library - - - net.sf.robocode - robocode.dotnet.api - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.control.api - ${project.version} - dotnet:library - - - - src - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - - /unsafe /warn:0 /nowarn:1591 /keyfile:"${basedir}/../tools/keys/robocode.snk" - - - - org.jvnet.maven-antrun-extended-plugin - maven-antrun-extended-plugin - - - process-classes - - - - - - - - - - - - - - run - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/robocode.dotnet.nhost.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/robocode.dotnet.nhost.iml deleted file mode 100644 index f4981fc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/robocode.dotnet.nhost.iml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/.gitignore b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/.gitignore deleted file mode 100644 index 7c7991e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/robocode.dotnet.nhost.sln -/robocode.dotnet.nhost.suo -/obj diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/core/ContainerBase.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/core/ContainerBase.generated.cs deleted file mode 100644 index 321b090..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/core/ContainerBase.generated.cs +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.core { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class ContainerBase : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getComponent0; - - internal static global::net.sf.jni4net.jni.FieldId j4n_instance1; - - protected ContainerBase(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.core.ContainerBase.staticClass; - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lnet/sf/robocode/core/ContainerBase;")] - public static global::net.sf.robocode.core.ContainerBase instance { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.core.ContainerBase.staticClass, global::net.sf.robocode.core.ContainerBase.j4n_instance1)); - } - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.core.ContainerBase.staticClass = @__class; - global::net.sf.robocode.core.ContainerBase.j4n_getComponent0 = @__env.GetStaticMethodID(global::net.sf.robocode.core.ContainerBase.staticClass, "getComponent", "(Ljava/lang/Class;)Ljava/lang/Object;"); - global::net.sf.robocode.core.ContainerBase.j4n_instance1 = @__env.GetStaticFieldID(global::net.sf.robocode.core.ContainerBase.staticClass, "instance", "Lnet/sf/robocode/core/ContainerBase;"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Class;)Ljava/lang/Object;")] - public static global::java.lang.Object getComponent(global::java.lang.Class par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.core.ContainerBase.staticClass, global::net.sf.robocode.core.ContainerBase.j4n_getComponent0, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.core.ContainerBase(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/host/DotNetHost.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/host/DotNetHost.generated.cs deleted file mode 100644 index b981589..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/host/DotNetHost.generated.cs +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.dotnet.host { - - - #region Component Designer generated code - public partial class DotNetHost_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.dotnet.host.@__DotNetHost.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.dotnet.host.DotNetHost), typeof(global::net.sf.robocode.dotnet.host.DotNetHost_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.dotnet.host.DotNetHost), typeof(global::net.sf.robocode.dotnet.host.DotNetHost_))] - internal sealed partial class @__DotNetHost : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - private @__DotNetHost(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.dotnet.host.@__DotNetHost.staticClass = @__class; - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__DotNetHost); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "createRobotProxy", "createRobotProxy0", "(Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/" + - "robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/h" + - "ost/proxies/IHostingRobotProxy;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getReferencedClasses", "getReferencedClasses1", "(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobotType", "getRobotType2", "(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;" + - "")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "createRobotProxy", "createRobotProxy3", "(Lnet/sf/robocode/host/IHostManager;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobo" + - "tStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostin" + - "gRobotProxy;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "__ctorDotNetHost0", "__ctorDotNetHost0", "(Lnet/sf/jni4net/inj/IClrProxy;)V")); - return methods; - } - - private static global::net.sf.jni4net.utils.JniHandle createRobotProxy0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1, global::net.sf.jni4net.utils.JniLocalHandle par2, global::net.sf.jni4net.utils.JniLocalHandle par3) { - // (Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy; - // (Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.dotnet.host.DotNetHost @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.FullC2J(@__env, ((global::net.sf.robocode.host.IHost)(@__real)).createRobotProxy(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par2), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par3))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getReferencedClasses1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String; - // (Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.dotnet.host.DotNetHost @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayStrongCp2J(@__env, ((global::net.sf.robocode.host.IHost)(@__real)).getReferencedClasses(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRobotType2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, bool par1, bool par2) { - // (Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType; - // (Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.dotnet.host.DotNetHost @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.host.IHost)(@__real)).getRobotType(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0), par1, par2)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle createRobotProxy3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle hostManager, global::net.sf.jni4net.utils.JniLocalHandle robotSpecification, global::net.sf.jni4net.utils.JniLocalHandle statics, global::net.sf.jni4net.utils.JniLocalHandle peer) { - // (Lnet/sf/robocode/host/IHostManager;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy; - // (Lnet/sf/robocode/host/IHostManager;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.dotnet.host.DotNetHost @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.FullC2J(@__env, @__real.createRobotProxy(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, hostManager), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, robotSpecification), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, statics), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, peer))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void @__ctorDotNetHost0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.dotnet.host.DotNetHost @__real = new global::net.sf.robocode.dotnet.host.DotNetHost(); - global::net.sf.jni4net.utils.Convertor.InitProxy(@__env, @__obj, @__real); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.dotnet.host.@__DotNetHost(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/nhost/ModuleN.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/nhost/ModuleN.generated.cs deleted file mode 100644 index 27b66cc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/nhost/ModuleN.generated.cs +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.dotnet.nhost { - - - #region Component Designer generated code - public partial class ModuleN_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.dotnet.nhost.@__ModuleN.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.dotnet.nhost.ModuleN), typeof(global::net.sf.robocode.dotnet.nhost.ModuleN_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.dotnet.nhost.ModuleN), typeof(global::net.sf.robocode.dotnet.nhost.ModuleN_))] - internal sealed partial class @__ModuleN : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - private @__ModuleN(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.dotnet.nhost.@__ModuleN.staticClass = @__class; - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__ModuleN); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "InitN", "InitN0", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "__ctorModuleN0", "__ctorModuleN0", "(Lnet/sf/jni4net/inj/IClrProxy;)V")); - return methods; - } - - private static void InitN0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.dotnet.nhost.ModuleN.InitN(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void @__ctorModuleN0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.dotnet.nhost.ModuleN @__real = new global::net.sf.robocode.dotnet.nhost.ModuleN(); - global::net.sf.jni4net.utils.Convertor.InitProxy(@__env, @__obj, @__real); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.dotnet.nhost.@__ModuleN(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/repository/root/DllRootHelper.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/repository/root/DllRootHelper.generated.cs deleted file mode 100644 index c0c5016..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/dotnet/repository/root/DllRootHelper.generated.cs +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.dotnet.repository.root { - - - #region Component Designer generated code - public partial class DllRootHelper_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.dotnet.repository.root.@__DllRootHelper.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.dotnet.repository.root.DllRootHelper), typeof(global::net.sf.robocode.dotnet.repository.root.DllRootHelper_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.dotnet.repository.root.DllRootHelper), typeof(global::net.sf.robocode.dotnet.repository.root.DllRootHelper_))] - internal sealed partial class @__DllRootHelper : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - private @__DllRootHelper(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.dotnet.repository.root.@__DllRootHelper.staticClass = @__class; - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__DllRootHelper); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "Open", "Open0", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "Close", "Close1", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "findItems", "findItems2", "(Ljava/lang/String;)[Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "GetRobotType", "GetRobotType3", "(Lnet/sf/robocode/repository/IRobotItem;)Lnet/sf/robocode/repository/RobotType;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "GetDllFileName", "GetDllFileName4", "(Lnet/sf/robocode/repository/IRobotItem;)Ljava/lang/String;")); - return methods; - } - - private static void Open0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.dotnet.repository.root.DllRootHelper.Open(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void Close1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.dotnet.repository.root.DllRootHelper.Close(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static global::net.sf.jni4net.utils.JniHandle findItems2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle dllPath) { - // (Ljava/lang/String;)[Ljava/lang/String; - // (LSystem/String;)[LSystem/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - @__return = global::net.sf.jni4net.utils.Convertor.ArrayStrongC2JString(@__env, global::net.sf.robocode.dotnet.repository.root.DllRootHelper.findItems(global::net.sf.jni4net.utils.Convertor.StrongJ2CString(@__env, dllPath))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle GetRobotType3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle robotItem) { - // (Lnet/sf/robocode/repository/IRobotItem;)Lnet/sf/robocode/repository/RobotType; - // (Lnet/sf/robocode/repository/IRobotItem;)Lnet/sf/robocode/repository/RobotType; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(global::net.sf.robocode.dotnet.repository.root.DllRootHelper.GetRobotType(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, robotItem))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle GetDllFileName4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle robotItem) { - // (Lnet/sf/robocode/repository/IRobotItem;)Ljava/lang/String; - // (Lnet/sf/robocode/repository/IRobotItem;)LSystem/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - @__return = global::net.sf.jni4net.utils.Convertor.StrongC2JString(@__env, global::net.sf.robocode.dotnet.repository.root.DllRootHelper.GetDllFileName(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, robotItem))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.dotnet.repository.root.@__DllRootHelper(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHost.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHost.generated.cs deleted file mode 100644 index d2ea4ea..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHost.generated.cs +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.host { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IHost { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/" + - "robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/h" + - "ost/proxies/IHostingRobotProxy;")] - global::net.sf.robocode.host.proxies.IHostingRobotProxy createRobotProxy(global::net.sf.robocode.host.IHostManager par0, global::java.lang.Object par1, global::net.sf.robocode.peer.IRobotStatics par2, global::net.sf.robocode.peer.IRobotPeer par3); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;")] - java.lang.String[] getReferencedClasses(global::net.sf.robocode.repository.IRobotItem par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;" + - "")] - global::net.sf.robocode.repository.RobotType getRobotType(global::net.sf.robocode.repository.IRobotItem par0, bool par1, bool par2); - } - #endregion - - #region Component Designer generated code - public partial class IHost_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.host.@__IHost.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.host.IHost), typeof(global::net.sf.robocode.host.IHost_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.host.IHost), typeof(global::net.sf.robocode.host.IHost_))] - internal sealed partial class @__IHost : global::java.lang.Object, global::net.sf.robocode.host.IHost { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_createRobotProxy0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getReferencedClasses1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotType2; - - private @__IHost(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.host.@__IHost.staticClass = @__class; - global::net.sf.robocode.host.@__IHost.j4n_createRobotProxy0 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHost.staticClass, "createRobotProxy", "(Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/" + - "robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/h" + - "ost/proxies/IHostingRobotProxy;"); - global::net.sf.robocode.host.@__IHost.j4n_getReferencedClasses1 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHost.staticClass, "getReferencedClasses", "(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;"); - global::net.sf.robocode.host.@__IHost.j4n_getRobotType2 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHost.staticClass, "getRobotType", "(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;" + - ""); - } - - public global::net.sf.robocode.host.proxies.IHostingRobotProxy createRobotProxy(global::net.sf.robocode.host.IHostManager par0, global::java.lang.Object par1, global::net.sf.robocode.peer.IRobotStatics par2, global::net.sf.robocode.peer.IRobotPeer par3) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 18)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.host.@__IHost.j4n_createRobotProxy0, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par2), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par3))); - } - } - - public java.lang.String[] getReferencedClasses(global::net.sf.robocode.repository.IRobotItem par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.host.@__IHost.j4n_getReferencedClasses1, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0))); - } - } - - public global::net.sf.robocode.repository.RobotType getRobotType(global::net.sf.robocode.repository.IRobotItem par0, bool par1, bool par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.host.@__IHost.j4n_getRobotType2, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2))); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IHost); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "createRobotProxy", "createRobotProxy0", "(Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/" + - "robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/h" + - "ost/proxies/IHostingRobotProxy;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getReferencedClasses", "getReferencedClasses1", "(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobotType", "getRobotType2", "(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;" + - "")); - return methods; - } - - private static global::net.sf.jni4net.utils.JniHandle createRobotProxy0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1, global::net.sf.jni4net.utils.JniLocalHandle par2, global::net.sf.jni4net.utils.JniLocalHandle par3) { - // (Lnet/sf/robocode/host/IHostManager;Lrobocode/control/RobotSpecification;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy; - // (Lnet/sf/robocode/host/IHostManager;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Lnet/sf/robocode/host/proxies/IHostingRobotProxy; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.host.IHost @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.FullC2J(@__env, @__real.createRobotProxy(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par2), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par3))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getReferencedClasses1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String; - // (Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.host.IHost @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayStrongCp2J(@__env, @__real.getReferencedClasses(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRobotType2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, bool par1, bool par2) { - // (Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType; - // (Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.host.IHost @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getRobotType(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0), par1, par2)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.host.@__IHost(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHostManager.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHostManager.generated.cs deleted file mode 100644 index f8aa9fd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/IHostManager.generated.cs +++ /dev/null @@ -1,323 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.host { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IHostManager { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void cleanup(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/RobotSpecification;Lnet/sf/robocode/host/RobotStatics;Lnet/sf/" + - "robocode/peer/IRobotPeer;)Ljava/lang/Object;")] - global::java.lang.Object createRobotProxy(global::java.lang.Object par0, global::java.lang.Object par1, global::net.sf.robocode.peer.IRobotPeer par2); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;")] - java.lang.String[] getReferencedClasses(global::net.sf.robocode.repository.IRobotItem par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;" + - "")] - global::net.sf.robocode.repository.RobotType getRobotType(global::net.sf.robocode.repository.IRobotItem par0, bool par1, bool par2); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void initSecurity(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()J")] - long getRobotFilesystemQuota(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void resetThreadManager(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Thread;)V")] - void addSafeThread(global::java.lang.Object par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Thread;)V")] - void removeSafeThread(global::java.lang.Object par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/io/PrintStream;")] - global::java.io.PrintStream getRobotOutputStream(); - } - #endregion - - #region Component Designer generated code - public partial class IHostManager_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.host.@__IHostManager.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.host.IHostManager), typeof(global::net.sf.robocode.host.IHostManager_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.host.IHostManager), typeof(global::net.sf.robocode.host.IHostManager_))] - internal sealed partial class @__IHostManager : global::java.lang.Object, global::net.sf.robocode.host.IHostManager { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_cleanup0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_createRobotProxy1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getReferencedClasses2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotType3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_initSecurity4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotFilesystemQuota5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_resetThreadManager6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_addSafeThread7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_removeSafeThread8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotOutputStream9; - - private @__IHostManager(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.host.@__IHostManager.staticClass = @__class; - global::net.sf.robocode.host.@__IHostManager.j4n_cleanup0 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "cleanup", "()V"); - global::net.sf.robocode.host.@__IHostManager.j4n_createRobotProxy1 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "createRobotProxy", "(Lrobocode/control/RobotSpecification;Lnet/sf/robocode/host/RobotStatics;Lnet/sf/" + - "robocode/peer/IRobotPeer;)Ljava/lang/Object;"); - global::net.sf.robocode.host.@__IHostManager.j4n_getReferencedClasses2 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "getReferencedClasses", "(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;"); - global::net.sf.robocode.host.@__IHostManager.j4n_getRobotType3 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "getRobotType", "(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;" + - ""); - global::net.sf.robocode.host.@__IHostManager.j4n_initSecurity4 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "initSecurity", "()V"); - global::net.sf.robocode.host.@__IHostManager.j4n_getRobotFilesystemQuota5 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "getRobotFilesystemQuota", "()J"); - global::net.sf.robocode.host.@__IHostManager.j4n_resetThreadManager6 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "resetThreadManager", "()V"); - global::net.sf.robocode.host.@__IHostManager.j4n_addSafeThread7 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "addSafeThread", "(Ljava/lang/Thread;)V"); - global::net.sf.robocode.host.@__IHostManager.j4n_removeSafeThread8 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "removeSafeThread", "(Ljava/lang/Thread;)V"); - global::net.sf.robocode.host.@__IHostManager.j4n_getRobotOutputStream9 = @__env.GetMethodID(global::net.sf.robocode.host.@__IHostManager.staticClass, "getRobotOutputStream", "()Ljava/io/PrintStream;"); - } - - public void cleanup() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.@__IHostManager.j4n_cleanup0); - } - } - - public global::java.lang.Object createRobotProxy(global::java.lang.Object par0, global::java.lang.Object par1, global::net.sf.robocode.peer.IRobotPeer par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.host.@__IHostManager.j4n_createRobotProxy1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par2))); - } - } - - public java.lang.String[] getReferencedClasses(global::net.sf.robocode.repository.IRobotItem par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.host.@__IHostManager.j4n_getReferencedClasses2, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0))); - } - } - - public global::net.sf.robocode.repository.RobotType getRobotType(global::net.sf.robocode.repository.IRobotItem par0, bool par1, bool par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.host.@__IHostManager.j4n_getRobotType3, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2))); - } - } - - public void initSecurity() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.@__IHostManager.j4n_initSecurity4); - } - } - - public long getRobotFilesystemQuota() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((long)(@__env.CallLongMethod(this, global::net.sf.robocode.host.@__IHostManager.j4n_getRobotFilesystemQuota5))); - } - } - - public void resetThreadManager() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.@__IHostManager.j4n_resetThreadManager6); - } - } - - public void addSafeThread(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.@__IHostManager.j4n_addSafeThread7, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void removeSafeThread(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.@__IHostManager.j4n_removeSafeThread8, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public global::java.io.PrintStream getRobotOutputStream() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.host.@__IHostManager.j4n_getRobotOutputStream9)); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IHostManager); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "cleanup", "cleanup0", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "createRobotProxy", "createRobotProxy1", "(Lrobocode/control/RobotSpecification;Lnet/sf/robocode/host/RobotStatics;Lnet/sf/" + - "robocode/peer/IRobotPeer;)Ljava/lang/Object;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getReferencedClasses", "getReferencedClasses2", "(Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobotType", "getRobotType3", "(Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType;" + - "")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "initSecurity", "initSecurity4", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobotFilesystemQuota", "getRobotFilesystemQuota5", "()J")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "resetThreadManager", "resetThreadManager6", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "addSafeThread", "addSafeThread7", "(Ljava/lang/Thread;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "removeSafeThread", "removeSafeThread8", "(Ljava/lang/Thread;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobotOutputStream", "getRobotOutputStream9", "()Ljava/io/PrintStream;")); - return methods; - } - - private static void cleanup0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.cleanup(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static global::net.sf.jni4net.utils.JniHandle createRobotProxy1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1, global::net.sf.jni4net.utils.JniLocalHandle par2) { - // (Lrobocode/control/RobotSpecification;Lnet/sf/robocode/host/RobotStatics;Lnet/sf/robocode/peer/IRobotPeer;)Ljava/lang/Object; - // (Ljava/lang/Object;Ljava/lang/Object;Lnet/sf/robocode/peer/IRobotPeer;)Ljava/lang/Object; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.FullC2J(@__env, @__real.createRobotProxy(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par2))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getReferencedClasses2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String; - // (Lnet/sf/robocode/repository/IRobotItem;)[Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayStrongCp2J(@__env, @__real.getReferencedClasses(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRobotType3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, bool par1, bool par2) { - // (Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType; - // (Lnet/sf/robocode/repository/IRobotItem;ZZ)Lnet/sf/robocode/repository/RobotType; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getRobotType(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0), par1, par2)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void initSecurity4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.initSecurity(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static long getRobotFilesystemQuota5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()J - // ()J - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - long @__return = default(long); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((long)(@__real.getRobotFilesystemQuota())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void resetThreadManager6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.resetThreadManager(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void addSafeThread7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Ljava/lang/Thread;)V - // (Ljava/lang/Object;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.addSafeThread(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void removeSafeThread8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Ljava/lang/Thread;)V - // (Ljava/lang/Object;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.removeSafeThread(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static global::net.sf.jni4net.utils.JniHandle getRobotOutputStream9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/io/PrintStream; - // ()Ljava/io/PrintStream; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.host.IHostManager @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getRobotOutputStream()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.host.@__IHostManager(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/proxies/IHostingRobotProxy.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/proxies/IHostingRobotProxy.generated.cs deleted file mode 100644 index 9ee4cf0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/host/proxies/IHostingRobotProxy.generated.cs +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.host.proxies { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IHostingRobotProxy { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void cleanup(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/peer/ExecCommands;Lrobocode/RobotStatus;)V")] - void startRound(global::java.lang.Object par0, global::java.lang.Object par1); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void forceStopThread(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void waitForStopThread(); - } - #endregion - - #region Component Designer generated code - public partial class IHostingRobotProxy_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.host.proxies.IHostingRobotProxy), typeof(global::net.sf.robocode.host.proxies.IHostingRobotProxy_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.host.proxies.IHostingRobotProxy), typeof(global::net.sf.robocode.host.proxies.IHostingRobotProxy_))] - internal sealed partial class @__IHostingRobotProxy : global::java.lang.Object, global::net.sf.robocode.host.proxies.IHostingRobotProxy { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_cleanup0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_startRound1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_forceStopThread2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_waitForStopThread3; - - private @__IHostingRobotProxy(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.staticClass = @__class; - global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_cleanup0 = @__env.GetMethodID(global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.staticClass, "cleanup", "()V"); - global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_startRound1 = @__env.GetMethodID(global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.staticClass, "startRound", "(Lnet/sf/robocode/peer/ExecCommands;Lrobocode/RobotStatus;)V"); - global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_forceStopThread2 = @__env.GetMethodID(global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.staticClass, "forceStopThread", "()V"); - global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_waitForStopThread3 = @__env.GetMethodID(global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.staticClass, "waitForStopThread", "()V"); - } - - public void cleanup() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_cleanup0); - } - } - - public void startRound(global::java.lang.Object par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_startRound1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1)); - } - } - - public void forceStopThread() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_forceStopThread2); - } - } - - public void waitForStopThread() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.host.proxies.@__IHostingRobotProxy.j4n_waitForStopThread3); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IHostingRobotProxy); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "cleanup", "cleanup0", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "startRound", "startRound1", "(Lnet/sf/robocode/peer/ExecCommands;Lrobocode/RobotStatus;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "forceStopThread", "forceStopThread2", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "waitForStopThread", "waitForStopThread3", "()V")); - return methods; - } - - private static void cleanup0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.proxies.IHostingRobotProxy @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.cleanup(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void startRound1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1) { - // (Lnet/sf/robocode/peer/ExecCommands;Lrobocode/RobotStatus;)V - // (Ljava/lang/Object;Ljava/lang/Object;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.proxies.IHostingRobotProxy @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.startRound(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void forceStopThread2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.proxies.IHostingRobotProxy @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.forceStopThread(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void waitForStopThread3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.host.proxies.IHostingRobotProxy @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.waitForStopThread(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.host.proxies.@__IHostingRobotProxy(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/io/Logger.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/io/Logger.generated.cs deleted file mode 100644 index ed6fce7..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/io/Logger.generated.cs +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.io { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class Logger : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_logError0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_logError1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_logError2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setLogListener3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_logMessage4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_logMessage5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_logWarning6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_printlnToRobotsConsole7; - - internal static global::net.sf.jni4net.jni.FieldId j4n_realOut8; - - internal static global::net.sf.jni4net.jni.FieldId j4n_realErr9; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorLogger10; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public Logger() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n__ctorLogger10, this); - } - } - - protected Logger(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.io.Logger.staticClass; - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Ljava/io/PrintStream;")] - public static global::java.io.PrintStream realOut { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_realOut8)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Ljava/io/PrintStream;")] - public static global::java.io.PrintStream realErr { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_realErr9)); - } - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.io.Logger.staticClass = @__class; - global::net.sf.robocode.io.Logger.j4n_logError0 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "logError", "(Ljava/lang/Throwable;)V"); - global::net.sf.robocode.io.Logger.j4n_logError1 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "logError", "(Ljava/lang/String;)V"); - global::net.sf.robocode.io.Logger.j4n_logError2 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "logError", "(Ljava/lang/String;Ljava/lang/Throwable;)V"); - global::net.sf.robocode.io.Logger.j4n_setLogListener3 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "setLogListener", "(Lrobocode/control/events/IBattleListener;)V"); - global::net.sf.robocode.io.Logger.j4n_logMessage4 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "logMessage", "(Ljava/lang/String;Z)V"); - global::net.sf.robocode.io.Logger.j4n_logMessage5 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "logMessage", "(Ljava/lang/String;)V"); - global::net.sf.robocode.io.Logger.j4n_logWarning6 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "logWarning", "(Ljava/lang/String;)V"); - global::net.sf.robocode.io.Logger.j4n_printlnToRobotsConsole7 = @__env.GetStaticMethodID(global::net.sf.robocode.io.Logger.staticClass, "printlnToRobotsConsole", "(Ljava/lang/String;)V"); - global::net.sf.robocode.io.Logger.j4n_realOut8 = @__env.GetStaticFieldID(global::net.sf.robocode.io.Logger.staticClass, "realOut", "Ljava/io/PrintStream;"); - global::net.sf.robocode.io.Logger.j4n_realErr9 = @__env.GetStaticFieldID(global::net.sf.robocode.io.Logger.staticClass, "realErr", "Ljava/io/PrintStream;"); - global::net.sf.robocode.io.Logger.j4n__ctorLogger10 = @__env.GetMethodID(global::net.sf.robocode.io.Logger.staticClass, "", "()V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Throwable;)V")] - public static void logError(global::java.lang.Throwable par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_logError0, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public static void logError(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_logError1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;Ljava/lang/Throwable;)V")] - public static void logError(global::java.lang.String par0, global::java.lang.Throwable par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_logError2, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/events/IBattleListener;)V")] - public static void setLogListener(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_setLogListener3, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;Z)V")] - public static void logMessage(global::java.lang.String par0, bool par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_logMessage4, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public static void logMessage(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_logMessage5, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public static void logWarning(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_logWarning6, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public static void printlnToRobotsConsole(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.io.Logger.staticClass, global::net.sf.robocode.io.Logger.j4n_printlnToRobotsConsole7, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.io.Logger(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/manager/IVersionManagerBase.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/manager/IVersionManagerBase.generated.cs deleted file mode 100644 index 70279dc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/manager/IVersionManagerBase.generated.cs +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.manager { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IVersionManagerBase { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - int getVersionAsInt(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getVersionN(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isLastRunVersionChanged(); - } - #endregion - - #region Component Designer generated code - public partial class IVersionManagerBase_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.manager.@__IVersionManagerBase.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.manager.IVersionManagerBase), typeof(global::net.sf.robocode.manager.IVersionManagerBase_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.manager.IVersionManagerBase), typeof(global::net.sf.robocode.manager.IVersionManagerBase_))] - internal sealed partial class @__IVersionManagerBase : global::java.lang.Object, global::net.sf.robocode.manager.IVersionManagerBase { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVersion0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVersionAsInt1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVersionN2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isLastRunVersionChanged3; - - private @__IVersionManagerBase(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.manager.@__IVersionManagerBase.staticClass = @__class; - global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_getVersion0 = @__env.GetMethodID(global::net.sf.robocode.manager.@__IVersionManagerBase.staticClass, "getVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_getVersionAsInt1 = @__env.GetMethodID(global::net.sf.robocode.manager.@__IVersionManagerBase.staticClass, "getVersionAsInt", "()I"); - global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_getVersionN2 = @__env.GetMethodID(global::net.sf.robocode.manager.@__IVersionManagerBase.staticClass, "getVersionN", "()Ljava/lang/String;"); - global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_isLastRunVersionChanged3 = @__env.GetMethodID(global::net.sf.robocode.manager.@__IVersionManagerBase.staticClass, "isLastRunVersionChanged", "()Z"); - } - - public global::java.lang.String getVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_getVersion0)); - } - } - - public int getVersionAsInt() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_getVersionAsInt1))); - } - } - - public global::java.lang.String getVersionN() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_getVersionN2)); - } - } - - public bool isLastRunVersionChanged() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.manager.@__IVersionManagerBase.j4n_isLastRunVersionChanged3))); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IVersionManagerBase); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVersion", "getVersion0", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVersionAsInt", "getVersionAsInt1", "()I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVersionN", "getVersionN2", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isLastRunVersionChanged", "isLastRunVersionChanged3", "()Z")); - return methods; - } - - private static global::net.sf.jni4net.utils.JniHandle getVersion0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.manager.IVersionManagerBase @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int getVersionAsInt1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()I - // ()I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::net.sf.robocode.manager.IVersionManagerBase @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.getVersionAsInt())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getVersionN2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.manager.IVersionManagerBase @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getVersionN()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isLastRunVersionChanged3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.manager.IVersionManagerBase @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isLastRunVersionChanged())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.manager.@__IVersionManagerBase(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/BadBehavior.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/BadBehavior.generated.cs deleted file mode 100644 index a794055..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/BadBehavior.generated.cs +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.peer { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class BadBehavior : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_valueOf0; - - internal static global::net.sf.jni4net.jni.FieldId j4n_CANNOT_START1; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SKIPPED_TOO_MANY_TURNS2; - - internal static global::net.sf.jni4net.jni.FieldId j4n_UNSTOPPABLE3; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SECURITY_VIOLATION4; - - protected BadBehavior(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.peer.BadBehavior.staticClass; - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lnet/sf/robocode/peer/BadBehavior;")] - public static global::net.sf.robocode.peer.BadBehavior CANNOT_START { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.peer.BadBehavior.staticClass, global::net.sf.robocode.peer.BadBehavior.j4n_CANNOT_START1)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lnet/sf/robocode/peer/BadBehavior;")] - public static global::net.sf.robocode.peer.BadBehavior SKIPPED_TOO_MANY_TURNS { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.peer.BadBehavior.staticClass, global::net.sf.robocode.peer.BadBehavior.j4n_SKIPPED_TOO_MANY_TURNS2)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lnet/sf/robocode/peer/BadBehavior;")] - public static global::net.sf.robocode.peer.BadBehavior UNSTOPPABLE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.peer.BadBehavior.staticClass, global::net.sf.robocode.peer.BadBehavior.j4n_UNSTOPPABLE3)); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lnet/sf/robocode/peer/BadBehavior;")] - public static global::net.sf.robocode.peer.BadBehavior SECURITY_VIOLATION { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.peer.BadBehavior.staticClass, global::net.sf.robocode.peer.BadBehavior.j4n_SECURITY_VIOLATION4)); - } - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.peer.BadBehavior.staticClass = @__class; - global::net.sf.robocode.peer.BadBehavior.j4n_valueOf0 = @__env.GetStaticMethodID(global::net.sf.robocode.peer.BadBehavior.staticClass, "valueOf", "(Ljava/lang/String;)Lnet/sf/robocode/peer/BadBehavior;"); - global::net.sf.robocode.peer.BadBehavior.j4n_CANNOT_START1 = @__env.GetStaticFieldID(global::net.sf.robocode.peer.BadBehavior.staticClass, "CANNOT_START", "Lnet/sf/robocode/peer/BadBehavior;"); - global::net.sf.robocode.peer.BadBehavior.j4n_SKIPPED_TOO_MANY_TURNS2 = @__env.GetStaticFieldID(global::net.sf.robocode.peer.BadBehavior.staticClass, "SKIPPED_TOO_MANY_TURNS", "Lnet/sf/robocode/peer/BadBehavior;"); - global::net.sf.robocode.peer.BadBehavior.j4n_UNSTOPPABLE3 = @__env.GetStaticFieldID(global::net.sf.robocode.peer.BadBehavior.staticClass, "UNSTOPPABLE", "Lnet/sf/robocode/peer/BadBehavior;"); - global::net.sf.robocode.peer.BadBehavior.j4n_SECURITY_VIOLATION4 = @__env.GetStaticFieldID(global::net.sf.robocode.peer.BadBehavior.staticClass, "SECURITY_VIOLATION", "Lnet/sf/robocode/peer/BadBehavior;"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)Lnet/sf/robocode/peer/BadBehavior;")] - public static global::net.sf.robocode.peer.BadBehavior valueOf(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.peer.BadBehavior.staticClass, global::net.sf.robocode.peer.BadBehavior.j4n_valueOf0, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.peer.BadBehavior(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotPeer.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotPeer.generated.cs deleted file mode 100644 index e3e1c34..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotPeer.generated.cs +++ /dev/null @@ -1,313 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.peer { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IRobotPeer { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void drainEnergy(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/peer/BadBehavior;)V")] - void punishBadBehavior(global::net.sf.robocode.peer.BadBehavior par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Z)V")] - void setRunning(bool par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isRunning(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults;")] - global::java.lang.Object waitForBattleEndImpl(global::java.lang.Object par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults;")] - global::java.lang.Object executeImpl(global::java.lang.Object par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)V")] - void setupBuffer(global::java.nio.ByteBuffer par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void executeImplSerial(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void waitForBattleEndImplSerial(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - void setupThread(); - } - #endregion - - #region Component Designer generated code - public partial class IRobotPeer_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.peer.@__IRobotPeer.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.peer.IRobotPeer), typeof(global::net.sf.robocode.peer.IRobotPeer_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.peer.IRobotPeer), typeof(global::net.sf.robocode.peer.IRobotPeer_))] - internal sealed partial class @__IRobotPeer : global::java.lang.Object, global::net.sf.robocode.peer.IRobotPeer { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_drainEnergy0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_punishBadBehavior1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setRunning2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isRunning3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_waitForBattleEndImpl4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_executeImpl5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setupBuffer6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_executeImplSerial7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_waitForBattleEndImplSerial8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setupThread9; - - private @__IRobotPeer(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.peer.@__IRobotPeer.staticClass = @__class; - global::net.sf.robocode.peer.@__IRobotPeer.j4n_drainEnergy0 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "drainEnergy", "()V"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_punishBadBehavior1 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "punishBadBehavior", "(Lnet/sf/robocode/peer/BadBehavior;)V"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_setRunning2 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "setRunning", "(Z)V"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_isRunning3 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "isRunning", "()Z"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_waitForBattleEndImpl4 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "waitForBattleEndImpl", "(Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults;"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_executeImpl5 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "executeImpl", "(Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults;"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_setupBuffer6 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "setupBuffer", "(Ljava/nio/ByteBuffer;)V"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_executeImplSerial7 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "executeImplSerial", "()V"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_waitForBattleEndImplSerial8 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "waitForBattleEndImplSerial", "()V"); - global::net.sf.robocode.peer.@__IRobotPeer.j4n_setupThread9 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotPeer.staticClass, "setupThread", "()V"); - } - - public void drainEnergy() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_drainEnergy0); - } - } - - public void punishBadBehavior(global::net.sf.robocode.peer.BadBehavior par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_punishBadBehavior1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void setRunning(bool par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_setRunning2, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - public bool isRunning() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_isRunning3))); - } - } - - public global::java.lang.Object waitForBattleEndImpl(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_waitForBattleEndImpl4, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - public global::java.lang.Object executeImpl(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_executeImpl5, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - public void setupBuffer(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_setupBuffer6, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - public void executeImplSerial() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_executeImplSerial7); - } - } - - public void waitForBattleEndImplSerial() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_waitForBattleEndImplSerial8); - } - } - - public void setupThread() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.peer.@__IRobotPeer.j4n_setupThread9); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IRobotPeer); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "drainEnergy", "drainEnergy0", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "punishBadBehavior", "punishBadBehavior1", "(Lnet/sf/robocode/peer/BadBehavior;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setRunning", "setRunning2", "(Z)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isRunning", "isRunning3", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "waitForBattleEndImpl", "waitForBattleEndImpl4", "(Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "executeImpl", "executeImpl5", "(Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setupBuffer", "setupBuffer6", "(Ljava/nio/ByteBuffer;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "executeImplSerial", "executeImplSerial7", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "waitForBattleEndImplSerial", "waitForBattleEndImplSerial8", "()V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setupThread", "setupThread9", "()V")); - return methods; - } - - private static void drainEnergy0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.drainEnergy(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void punishBadBehavior1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lnet/sf/robocode/peer/BadBehavior;)V - // (Lnet/sf/robocode/peer/BadBehavior;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.punishBadBehavior(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void setRunning2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, bool par0) { - // (Z)V - // (Z)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.setRunning(par0); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static bool isRunning3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isRunning())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle waitForBattleEndImpl4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults; - // (Ljava/lang/Object;)Ljava/lang/Object; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.waitForBattleEndImpl(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle executeImpl5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Lnet/sf/robocode/peer/ExecCommands;)Lnet/sf/robocode/peer/ExecResults; - // (Ljava/lang/Object;)Ljava/lang/Object; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.executeImpl(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void setupBuffer6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Ljava/nio/ByteBuffer;)V - // (Ljava/nio/ByteBuffer;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.setupBuffer(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void executeImplSerial7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.executeImplSerial(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void waitForBattleEndImplSerial8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.waitForBattleEndImplSerial(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static void setupThread9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()V - // ()V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.peer.IRobotPeer @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.setupThread(); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.peer.@__IRobotPeer(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotStatics.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotStatics.generated.cs deleted file mode 100644 index 50f44bd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/peer/IRobotStatics.generated.cs +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.peer { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IRobotStatics { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isAdvancedRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isTeamRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isInteractiveRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isPaintRobot(); - } - #endregion - - #region Component Designer generated code - public partial class IRobotStatics_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.peer.@__IRobotStatics.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.peer.IRobotStatics), typeof(global::net.sf.robocode.peer.IRobotStatics_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.peer.IRobotStatics), typeof(global::net.sf.robocode.peer.IRobotStatics_))] - internal sealed partial class @__IRobotStatics : global::java.lang.Object, global::net.sf.robocode.peer.IRobotStatics { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isAdvancedRobot0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isTeamRobot1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isInteractiveRobot2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isPaintRobot3; - - private @__IRobotStatics(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.peer.@__IRobotStatics.staticClass = @__class; - global::net.sf.robocode.peer.@__IRobotStatics.j4n_isAdvancedRobot0 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotStatics.staticClass, "isAdvancedRobot", "()Z"); - global::net.sf.robocode.peer.@__IRobotStatics.j4n_isTeamRobot1 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotStatics.staticClass, "isTeamRobot", "()Z"); - global::net.sf.robocode.peer.@__IRobotStatics.j4n_isInteractiveRobot2 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotStatics.staticClass, "isInteractiveRobot", "()Z"); - global::net.sf.robocode.peer.@__IRobotStatics.j4n_isPaintRobot3 = @__env.GetMethodID(global::net.sf.robocode.peer.@__IRobotStatics.staticClass, "isPaintRobot", "()Z"); - } - - public bool isAdvancedRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.peer.@__IRobotStatics.j4n_isAdvancedRobot0))); - } - } - - public bool isTeamRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.peer.@__IRobotStatics.j4n_isTeamRobot1))); - } - } - - public bool isInteractiveRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.peer.@__IRobotStatics.j4n_isInteractiveRobot2))); - } - } - - public bool isPaintRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.peer.@__IRobotStatics.j4n_isPaintRobot3))); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IRobotStatics); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isAdvancedRobot", "isAdvancedRobot0", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isTeamRobot", "isTeamRobot1", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isInteractiveRobot", "isInteractiveRobot2", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isPaintRobot", "isPaintRobot3", "()Z")); - return methods; - } - - private static bool isAdvancedRobot0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.peer.IRobotStatics @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isAdvancedRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isTeamRobot1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.peer.IRobotStatics @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isTeamRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isInteractiveRobot2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.peer.IRobotStatics @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isInteractiveRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isPaintRobot3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.peer.IRobotStatics @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isPaintRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.peer.@__IRobotStatics(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotItem.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotItem.generated.cs deleted file mode 100644 index 4c46208..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotItem.generated.cs +++ /dev/null @@ -1,1045 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.repository { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IRobotItem : global::net.sf.robocode.repository.IRobotSpecItem { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getPlatform(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isJuniorRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isStandardRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isAdvancedRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isTeamRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isDroid(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isSentryRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isInteractiveRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isPaintRobot(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/net/URL;")] - global::java.net.URL getClassPathURL(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()[Ljava/net/URL;")] - java.net.URL[] getSourcePathURLs(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getWritableDirectory(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getReadableDirectory(); - } - #endregion - - #region Component Designer generated code - public partial class IRobotItem_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.repository.@__IRobotItem.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.repository.IRobotItem), typeof(global::net.sf.robocode.repository.IRobotItem_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.repository.IRobotItem), typeof(global::net.sf.robocode.repository.IRobotItem_))] - internal sealed partial class @__IRobotItem : global::java.lang.Object, global::net.sf.robocode.repository.IRobotItem { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_compareTo0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isValid1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVersion2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isTeam3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isInJAR4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setValid5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getDescription6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getAuthorName7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getWebpage8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getIncludeSource9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getIncludeData10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isSourceIncluded11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRootPath12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getItemURL13; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isDevelopmentVersion14; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobocodeVersion15; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFullPackage16; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRelativePath17; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRootPackage18; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFullClassNameWithVersion19; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueFullClassName20; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueFullClassNameWithVersion21; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueShortClassNameWithVersion22; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueVeryShortClassNameWithVersion23; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFullClassName24; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getShortClassName25; - - internal static global::net.sf.jni4net.jni.MethodId j4n_createRobotSpecification26; - - internal static global::net.sf.jni4net.jni.MethodId j4n_storeProperties27; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getPlatform28; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isJuniorRobot29; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isStandardRobot30; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isAdvancedRobot31; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isTeamRobot32; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isDroid33; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isSentryRobot34; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isInteractiveRobot35; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isPaintRobot36; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getClassPathURL37; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getSourcePathURLs38; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getWritableDirectory39; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getReadableDirectory40; - - private @__IRobotItem(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.repository.@__IRobotItem.staticClass = @__class; - global::net.sf.robocode.repository.@__IRobotItem.j4n_compareTo0 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "compareTo", "(Ljava/lang/Object;)I"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isValid1 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isValid", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getVersion2 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isTeam3 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isTeam", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isInJAR4 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isInJAR", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_setValid5 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "setValid", "(Z)V"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getDescription6 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getDescription", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getAuthorName7 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getAuthorName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getWebpage8 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getWebpage", "()Ljava/net/URL;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getIncludeSource9 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getIncludeSource", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getIncludeData10 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getIncludeData", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isSourceIncluded11 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isSourceIncluded", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getRootPath12 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getRootPath", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getItemURL13 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getItemURL", "()Ljava/net/URL;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isDevelopmentVersion14 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isDevelopmentVersion", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getRobocodeVersion15 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getRobocodeVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getFullPackage16 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getFullPackage", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getRelativePath17 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getRelativePath", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getRootPackage18 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getRootPackage", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getFullClassNameWithVersion19 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getFullClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueFullClassName20 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getUniqueFullClassName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueFullClassNameWithVersion21 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getUniqueFullClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueShortClassNameWithVersion22 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getUniqueShortClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueVeryShortClassNameWithVersion23 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getUniqueVeryShortClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getFullClassName24 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getFullClassName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getShortClassName25 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getShortClassName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_createRobotSpecification26 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "createRobotSpecification", "()Lrobocode/control/RobotSpecification;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_storeProperties27 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "storeProperties", "(Ljava/io/OutputStream;Lnet/sf/robocode/repository/RobotProperties;)V"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getPlatform28 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getPlatform", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isJuniorRobot29 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isJuniorRobot", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isStandardRobot30 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isStandardRobot", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isAdvancedRobot31 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isAdvancedRobot", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isTeamRobot32 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isTeamRobot", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isDroid33 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isDroid", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isSentryRobot34 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isSentryRobot", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isInteractiveRobot35 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isInteractiveRobot", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_isPaintRobot36 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "isPaintRobot", "()Z"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getClassPathURL37 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getClassPathURL", "()Ljava/net/URL;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getSourcePathURLs38 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getSourcePathURLs", "()[Ljava/net/URL;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getWritableDirectory39 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getWritableDirectory", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotItem.j4n_getReadableDirectory40 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotItem.staticClass, "getReadableDirectory", "()Ljava/lang/String;"); - } - - public int compareTo(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_compareTo0, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)))); - } - } - - public bool isValid() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isValid1))); - } - } - - public global::java.lang.String getVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getVersion2)); - } - } - - public bool isTeam() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isTeam3))); - } - } - - public bool isInJAR() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isInJAR4))); - } - } - - public void setValid(bool par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_setValid5, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - public global::java.lang.String getDescription() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getDescription6)); - } - } - - public global::java.lang.String getAuthorName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getAuthorName7)); - } - } - - public global::java.net.URL getWebpage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getWebpage8)); - } - } - - public bool getIncludeSource() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getIncludeSource9))); - } - } - - public bool getIncludeData() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getIncludeData10))); - } - } - - public bool isSourceIncluded() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isSourceIncluded11))); - } - } - - public global::java.lang.String getRootPath() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getRootPath12)); - } - } - - public global::java.net.URL getItemURL() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getItemURL13)); - } - } - - public bool isDevelopmentVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isDevelopmentVersion14))); - } - } - - public global::java.lang.String getRobocodeVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getRobocodeVersion15)); - } - } - - public global::java.lang.String getFullPackage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getFullPackage16)); - } - } - - public global::java.lang.String getRelativePath() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getRelativePath17)); - } - } - - public global::java.lang.String getRootPackage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getRootPackage18)); - } - } - - public global::java.lang.String getFullClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getFullClassNameWithVersion19)); - } - } - - public global::java.lang.String getUniqueFullClassName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueFullClassName20)); - } - } - - public global::java.lang.String getUniqueFullClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueFullClassNameWithVersion21)); - } - } - - public global::java.lang.String getUniqueShortClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueShortClassNameWithVersion22)); - } - } - - public global::java.lang.String getUniqueVeryShortClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getUniqueVeryShortClassNameWithVersion23)); - } - } - - public global::java.lang.String getFullClassName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getFullClassName24)); - } - } - - public global::java.lang.String getShortClassName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getShortClassName25)); - } - } - - public global::java.lang.Object createRobotSpecification() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_createRobotSpecification26)); - } - } - - public void storeProperties(global::java.io.OutputStream par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_storeProperties27, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1)); - } - } - - public global::java.lang.String getPlatform() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getPlatform28)); - } - } - - public bool isJuniorRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isJuniorRobot29))); - } - } - - public bool isStandardRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isStandardRobot30))); - } - } - - public bool isAdvancedRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isAdvancedRobot31))); - } - } - - public bool isTeamRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isTeamRobot32))); - } - } - - public bool isDroid() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isDroid33))); - } - } - - public bool isSentryRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isSentryRobot34))); - } - } - - public bool isInteractiveRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isInteractiveRobot35))); - } - } - - public bool isPaintRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_isPaintRobot36))); - } - } - - public global::java.net.URL getClassPathURL() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getClassPathURL37)); - } - } - - public java.net.URL[] getSourcePathURLs() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.ArrayStrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getSourcePathURLs38)); - } - } - - public global::java.lang.String getWritableDirectory() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getWritableDirectory39)); - } - } - - public global::java.lang.String getReadableDirectory() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotItem.j4n_getReadableDirectory40)); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IRobotItem); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "compareTo", "compareTo0", "(Ljava/lang/Object;)I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isValid", "isValid1", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVersion", "getVersion2", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isTeam", "isTeam3", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isInJAR", "isInJAR4", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setValid", "setValid5", "(Z)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getDescription", "getDescription6", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getAuthorName", "getAuthorName7", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getWebpage", "getWebpage8", "()Ljava/net/URL;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getIncludeSource", "getIncludeSource9", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getIncludeData", "getIncludeData10", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isSourceIncluded", "isSourceIncluded11", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRootPath", "getRootPath12", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getItemURL", "getItemURL13", "()Ljava/net/URL;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isDevelopmentVersion", "isDevelopmentVersion14", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobocodeVersion", "getRobocodeVersion15", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getFullPackage", "getFullPackage16", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRelativePath", "getRelativePath17", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRootPackage", "getRootPackage18", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getFullClassNameWithVersion", "getFullClassNameWithVersion19", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueFullClassName", "getUniqueFullClassName20", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueFullClassNameWithVersion", "getUniqueFullClassNameWithVersion21", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueShortClassNameWithVersion", "getUniqueShortClassNameWithVersion22", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueVeryShortClassNameWithVersion", "getUniqueVeryShortClassNameWithVersion23", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getFullClassName", "getFullClassName24", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getShortClassName", "getShortClassName25", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "createRobotSpecification", "createRobotSpecification26", "()Lrobocode/control/RobotSpecification;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "storeProperties", "storeProperties27", "(Ljava/io/OutputStream;Lnet/sf/robocode/repository/RobotProperties;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getPlatform", "getPlatform28", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isJuniorRobot", "isJuniorRobot29", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isStandardRobot", "isStandardRobot30", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isAdvancedRobot", "isAdvancedRobot31", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isTeamRobot", "isTeamRobot32", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isDroid", "isDroid33", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isSentryRobot", "isSentryRobot34", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isInteractiveRobot", "isInteractiveRobot35", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isPaintRobot", "isPaintRobot36", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getClassPathURL", "getClassPathURL37", "()Ljava/net/URL;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getSourcePathURLs", "getSourcePathURLs38", "()[Ljava/net/URL;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getWritableDirectory", "getWritableDirectory39", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getReadableDirectory", "getReadableDirectory40", "()Ljava/lang/String;")); - return methods; - } - - private static int compareTo0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Ljava/lang/Object;)I - // (Ljava/lang/Object;)I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(((global::java.lang.Comparable)(@__real)).compareTo(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0)))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isValid1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).isValid())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getVersion2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isTeam3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).isTeam())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isInJAR4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).isInJAR())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void setValid5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, bool par0) { - // (Z)V - // (Z)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - ((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).setValid(par0); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static global::net.sf.jni4net.utils.JniHandle getDescription6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getDescription()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getAuthorName7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getAuthorName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getWebpage8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/net/URL; - // ()Ljava/net/URL; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getWebpage()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool getIncludeSource9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getIncludeSource())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool getIncludeData10(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getIncludeData())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isSourceIncluded11(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).isSourceIncluded())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRootPath12(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getRootPath()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getItemURL13(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/net/URL; - // ()Ljava/net/URL; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getItemURL()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isDevelopmentVersion14(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).isDevelopmentVersion())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRobocodeVersion15(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getRobocodeVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getFullPackage16(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getFullPackage()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRelativePath17(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getRelativePath()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRootPackage18(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getRootPackage()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getFullClassNameWithVersion19(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getFullClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueFullClassName20(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getUniqueFullClassName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueFullClassNameWithVersion21(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getUniqueFullClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueShortClassNameWithVersion22(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getUniqueShortClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueVeryShortClassNameWithVersion23(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getUniqueVeryShortClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getFullClassName24(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getFullClassName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getShortClassName25(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).getShortClassName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle createRobotSpecification26(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Lrobocode/control/RobotSpecification; - // ()Ljava/lang/Object; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).createRobotSpecification()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void storeProperties27(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1) { - // (Ljava/io/OutputStream;Lnet/sf/robocode/repository/RobotProperties;)V - // (Ljava/io/OutputStream;Ljava/lang/Object;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - ((global::net.sf.robocode.repository.IRobotSpecItem)(@__real)).storeProperties(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static global::net.sf.jni4net.utils.JniHandle getPlatform28(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getPlatform()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isJuniorRobot29(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isJuniorRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isStandardRobot30(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isStandardRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isAdvancedRobot31(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isAdvancedRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isTeamRobot32(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isTeamRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isDroid33(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isDroid())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isSentryRobot34(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isSentryRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isInteractiveRobot35(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isInteractiveRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isPaintRobot36(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isPaintRobot())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getClassPathURL37(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/net/URL; - // ()Ljava/net/URL; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getClassPathURL()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getSourcePathURLs38(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()[Ljava/net/URL; - // ()[Ljava/net/URL; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.ArrayStrongCp2J(@__env, @__real.getSourcePathURLs()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getWritableDirectory39(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getWritableDirectory()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getReadableDirectory40(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getReadableDirectory()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.repository.@__IRobotItem(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotSpecItem.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotSpecItem.generated.cs deleted file mode 100644 index 5200f27..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/IRobotSpecItem.generated.cs +++ /dev/null @@ -1,788 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.repository { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface IRobotSpecItem : global::java.lang.Comparable { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isValid(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isTeam(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isInJAR(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Z)V")] - void setValid(bool par0); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getDescription(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getAuthorName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/net/URL;")] - global::java.net.URL getWebpage(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool getIncludeSource(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool getIncludeData(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isSourceIncluded(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getRootPath(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/net/URL;")] - global::java.net.URL getItemURL(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - bool isDevelopmentVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getRobocodeVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getFullPackage(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getRelativePath(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getRootPackage(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getFullClassNameWithVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getUniqueFullClassName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getUniqueFullClassNameWithVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getUniqueShortClassNameWithVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getUniqueVeryShortClassNameWithVersion(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getFullClassName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Ljava/lang/String;")] - global::java.lang.String getShortClassName(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Lrobocode/control/RobotSpecification;")] - global::java.lang.Object createRobotSpecification(); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/io/OutputStream;Lnet/sf/robocode/repository/RobotProperties;)V")] - void storeProperties(global::java.io.OutputStream par0, global::java.lang.Object par1); - } - #endregion - - #region Component Designer generated code - public partial class IRobotSpecItem_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.repository.IRobotSpecItem), typeof(global::net.sf.robocode.repository.IRobotSpecItem_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.repository.IRobotSpecItem), typeof(global::net.sf.robocode.repository.IRobotSpecItem_))] - internal sealed partial class @__IRobotSpecItem : global::java.lang.Object, global::net.sf.robocode.repository.IRobotSpecItem { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_compareTo0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isValid1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getVersion2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isTeam3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isInJAR4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setValid5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getDescription6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getAuthorName7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getWebpage8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getIncludeSource9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getIncludeData10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isSourceIncluded11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRootPath12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getItemURL13; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isDevelopmentVersion14; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobocodeVersion15; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFullPackage16; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRelativePath17; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRootPackage18; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFullClassNameWithVersion19; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueFullClassName20; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueFullClassNameWithVersion21; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueShortClassNameWithVersion22; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getUniqueVeryShortClassNameWithVersion23; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFullClassName24; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getShortClassName25; - - internal static global::net.sf.jni4net.jni.MethodId j4n_createRobotSpecification26; - - internal static global::net.sf.jni4net.jni.MethodId j4n_storeProperties27; - - private @__IRobotSpecItem(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass = @__class; - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_compareTo0 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "compareTo", "(Ljava/lang/Object;)I"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isValid1 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "isValid", "()Z"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getVersion2 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isTeam3 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "isTeam", "()Z"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isInJAR4 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "isInJAR", "()Z"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_setValid5 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "setValid", "(Z)V"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getDescription6 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getDescription", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getAuthorName7 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getAuthorName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getWebpage8 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getWebpage", "()Ljava/net/URL;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getIncludeSource9 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getIncludeSource", "()Z"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getIncludeData10 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getIncludeData", "()Z"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isSourceIncluded11 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "isSourceIncluded", "()Z"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRootPath12 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getRootPath", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getItemURL13 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getItemURL", "()Ljava/net/URL;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isDevelopmentVersion14 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "isDevelopmentVersion", "()Z"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRobocodeVersion15 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getRobocodeVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getFullPackage16 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getFullPackage", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRelativePath17 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getRelativePath", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRootPackage18 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getRootPackage", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getFullClassNameWithVersion19 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getFullClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueFullClassName20 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getUniqueFullClassName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueFullClassNameWithVersion21 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getUniqueFullClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueShortClassNameWithVersion22 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getUniqueShortClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueVeryShortClassNameWithVersion23 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getUniqueVeryShortClassNameWithVersion", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getFullClassName24 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getFullClassName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getShortClassName25 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "getShortClassName", "()Ljava/lang/String;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_createRobotSpecification26 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "createRobotSpecification", "()Lrobocode/control/RobotSpecification;"); - global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_storeProperties27 = @__env.GetMethodID(global::net.sf.robocode.repository.@__IRobotSpecItem.staticClass, "storeProperties", "(Ljava/io/OutputStream;Lnet/sf/robocode/repository/RobotProperties;)V"); - } - - public int compareTo(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_compareTo0, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0)))); - } - } - - public bool isValid() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isValid1))); - } - } - - public global::java.lang.String getVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getVersion2)); - } - } - - public bool isTeam() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isTeam3))); - } - } - - public bool isInJAR() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isInJAR4))); - } - } - - public void setValid(bool par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_setValid5, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - public global::java.lang.String getDescription() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getDescription6)); - } - } - - public global::java.lang.String getAuthorName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getAuthorName7)); - } - } - - public global::java.net.URL getWebpage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getWebpage8)); - } - } - - public bool getIncludeSource() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getIncludeSource9))); - } - } - - public bool getIncludeData() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getIncludeData10))); - } - } - - public bool isSourceIncluded() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isSourceIncluded11))); - } - } - - public global::java.lang.String getRootPath() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRootPath12)); - } - } - - public global::java.net.URL getItemURL() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getItemURL13)); - } - } - - public bool isDevelopmentVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_isDevelopmentVersion14))); - } - } - - public global::java.lang.String getRobocodeVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRobocodeVersion15)); - } - } - - public global::java.lang.String getFullPackage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getFullPackage16)); - } - } - - public global::java.lang.String getRelativePath() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRelativePath17)); - } - } - - public global::java.lang.String getRootPackage() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getRootPackage18)); - } - } - - public global::java.lang.String getFullClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getFullClassNameWithVersion19)); - } - } - - public global::java.lang.String getUniqueFullClassName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueFullClassName20)); - } - } - - public global::java.lang.String getUniqueFullClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueFullClassNameWithVersion21)); - } - } - - public global::java.lang.String getUniqueShortClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueShortClassNameWithVersion22)); - } - } - - public global::java.lang.String getUniqueVeryShortClassNameWithVersion() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getUniqueVeryShortClassNameWithVersion23)); - } - } - - public global::java.lang.String getFullClassName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getFullClassName24)); - } - } - - public global::java.lang.String getShortClassName() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_getShortClassName25)); - } - } - - public global::java.lang.Object createRobotSpecification() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_createRobotSpecification26)); - } - } - - public void storeProperties(global::java.io.OutputStream par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.repository.@__IRobotSpecItem.j4n_storeProperties27, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1)); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__IRobotSpecItem); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "compareTo", "compareTo0", "(Ljava/lang/Object;)I")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isValid", "isValid1", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getVersion", "getVersion2", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isTeam", "isTeam3", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isInJAR", "isInJAR4", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setValid", "setValid5", "(Z)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getDescription", "getDescription6", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getAuthorName", "getAuthorName7", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getWebpage", "getWebpage8", "()Ljava/net/URL;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getIncludeSource", "getIncludeSource9", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getIncludeData", "getIncludeData10", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isSourceIncluded", "isSourceIncluded11", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRootPath", "getRootPath12", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getItemURL", "getItemURL13", "()Ljava/net/URL;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isDevelopmentVersion", "isDevelopmentVersion14", "()Z")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRobocodeVersion", "getRobocodeVersion15", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getFullPackage", "getFullPackage16", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRelativePath", "getRelativePath17", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getRootPackage", "getRootPackage18", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getFullClassNameWithVersion", "getFullClassNameWithVersion19", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueFullClassName", "getUniqueFullClassName20", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueFullClassNameWithVersion", "getUniqueFullClassNameWithVersion21", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueShortClassNameWithVersion", "getUniqueShortClassNameWithVersion22", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getUniqueVeryShortClassNameWithVersion", "getUniqueVeryShortClassNameWithVersion23", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getFullClassName", "getFullClassName24", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getShortClassName", "getShortClassName25", "()Ljava/lang/String;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "createRobotSpecification", "createRobotSpecification26", "()Lrobocode/control/RobotSpecification;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "storeProperties", "storeProperties27", "(Ljava/io/OutputStream;Lnet/sf/robocode/repository/RobotProperties;)V")); - return methods; - } - - private static int compareTo0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0) { - // (Ljava/lang/Object;)I - // (Ljava/lang/Object;)I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(((global::java.lang.Comparable)(@__real)).compareTo(global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par0)))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isValid1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isValid())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getVersion2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isTeam3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isTeam())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isInJAR4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isInJAR())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void setValid5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, bool par0) { - // (Z)V - // (Z)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.setValid(par0); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static global::net.sf.jni4net.utils.JniHandle getDescription6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getDescription()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getAuthorName7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getAuthorName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getWebpage8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/net/URL; - // ()Ljava/net/URL; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getWebpage()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool getIncludeSource9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.getIncludeSource())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool getIncludeData10(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.getIncludeData())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isSourceIncluded11(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isSourceIncluded())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRootPath12(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getRootPath()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getItemURL13(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/net/URL; - // ()Ljava/net/URL; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getItemURL()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static bool isDevelopmentVersion14(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Z - // ()Z - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - bool @__return = default(bool); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((bool)(@__real.isDevelopmentVersion())); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRobocodeVersion15(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getRobocodeVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getFullPackage16(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getFullPackage()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRelativePath17(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getRelativePath()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getRootPackage18(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getRootPackage()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getFullClassNameWithVersion19(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getFullClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueFullClassName20(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getUniqueFullClassName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueFullClassNameWithVersion21(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getUniqueFullClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueShortClassNameWithVersion22(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getUniqueShortClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getUniqueVeryShortClassNameWithVersion23(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getUniqueVeryShortClassNameWithVersion()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getFullClassName24(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getFullClassName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle getShortClassName25(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Ljava/lang/String; - // ()Ljava/lang/String; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.getShortClassName()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static global::net.sf.jni4net.utils.JniHandle createRobotSpecification26(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { - // ()Lrobocode/control/RobotSpecification; - // ()Ljava/lang/Object; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.StrongCp2J(@__real.createRobotSpecification()); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static void storeProperties27(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1) { - // (Ljava/io/OutputStream;Lnet/sf/robocode/repository/RobotProperties;)V - // (Ljava/io/OutputStream;Ljava/lang/Object;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.repository.IRobotSpecItem @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.storeProperties(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.repository.@__IRobotSpecItem(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/RobotType.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/RobotType.generated.cs deleted file mode 100644 index 83b0eb4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/repository/RobotType.generated.cs +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.repository { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RobotType : global::java.lang.Object, global::java.io.Serializable { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isValid0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isJuniorRobot1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isStandardRobot2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isAdvancedRobot3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isTeamRobot4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isDroid5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isSentryRobot6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isInteractiveRobot7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isPaintRobot8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getTypeFlags9; - - internal static global::net.sf.jni4net.jni.FieldId j4n_INVALID10; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobotType11; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRobotType12; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(ZZZZZZZZ)V")] - public RobotType(bool par0, bool par1, bool par2, bool par3, bool par4, bool par5, bool par6, bool par7) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 26)){ - @__env.NewObject(global::net.sf.robocode.repository.RobotType.staticClass, global::net.sf.robocode.repository.RobotType.j4n__ctorRobotType11, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par3), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par4), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par5), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par6), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par7)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(I)V")] - public RobotType(int par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::net.sf.robocode.repository.RobotType.staticClass, global::net.sf.robocode.repository.RobotType.j4n__ctorRobotType12, this, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0)); - } - } - - protected RobotType(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.repository.RobotType.staticClass; - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("Lnet/sf/robocode/repository/RobotType;")] - public static global::net.sf.robocode.repository.RobotType INVALID { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.GetStaticObjectFieldPtr(global::net.sf.robocode.repository.RobotType.staticClass, global::net.sf.robocode.repository.RobotType.j4n_INVALID10)); - } - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.repository.RobotType.staticClass = @__class; - global::net.sf.robocode.repository.RobotType.j4n_isValid0 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isValid", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isJuniorRobot1 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isJuniorRobot", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isStandardRobot2 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isStandardRobot", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isAdvancedRobot3 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isAdvancedRobot", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isTeamRobot4 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isTeamRobot", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isDroid5 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isDroid", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isSentryRobot6 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isSentryRobot", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isInteractiveRobot7 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isInteractiveRobot", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_isPaintRobot8 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "isPaintRobot", "()Z"); - global::net.sf.robocode.repository.RobotType.j4n_getTypeFlags9 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "getTypeFlags", "()I"); - global::net.sf.robocode.repository.RobotType.j4n_INVALID10 = @__env.GetStaticFieldID(global::net.sf.robocode.repository.RobotType.staticClass, "INVALID", "Lnet/sf/robocode/repository/RobotType;"); - global::net.sf.robocode.repository.RobotType.j4n__ctorRobotType11 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "", "(ZZZZZZZZ)V"); - global::net.sf.robocode.repository.RobotType.j4n__ctorRobotType12 = @__env.GetMethodID(global::net.sf.robocode.repository.RobotType.staticClass, "", "(I)V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isValid() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isValid0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isJuniorRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isJuniorRobot1))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isStandardRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isStandardRobot2))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isAdvancedRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isAdvancedRobot3))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isTeamRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isTeamRobot4))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isDroid() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isDroid5))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isSentryRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isSentryRobot6))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isInteractiveRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isInteractiveRobot7))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public virtual bool isPaintRobot() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.repository.RobotType.j4n_isPaintRobot8))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()I")] - public virtual int getTypeFlags() { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.repository.RobotType.j4n_getTypeFlags9))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.repository.RobotType(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/security/HiddenAccess.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/security/HiddenAccess.generated.cs deleted file mode 100644 index 074fe17..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/security/HiddenAccess.generated.cs +++ /dev/null @@ -1,293 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.security { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class HiddenAccess : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_dispatch0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_init1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_cleanup2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_update3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_initContainer4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_robocodeMain5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isCriticalEvent6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setEventTime7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setEventPriority8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setDefaultPriority9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getSerializationType10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_createSpecification11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getFileSpecification12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_getRobotTeamName13; - - internal static global::net.sf.jni4net.jni.MethodId j4n_setTeamId14; - - internal static global::net.sf.jni4net.jni.MethodId j4n_createStatus15; - - internal static global::net.sf.jni4net.jni.MethodId j4n_createRules16; - - internal static global::net.sf.jni4net.jni.MethodId j4n_isSafeThread17; - - internal static global::net.sf.jni4net.jni.MethodId j4n_initContainerForRobotEngine18; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorHiddenAccess19; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public HiddenAccess() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n__ctorHiddenAccess19, this); - } - } - - protected HiddenAccess(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.security.HiddenAccess.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.security.HiddenAccess.staticClass = @__class; - global::net.sf.robocode.security.HiddenAccess.j4n_dispatch0 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "dispatch", "(Lrobocode/Event;Lrobocode/robotinterfaces/IBasicRobot;Lnet/sf/robocode/peer/IRob" + - "otStatics;Ljava/awt/Graphics2D;)V"); - global::net.sf.robocode.security.HiddenAccess.j4n_init1 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "init", "()V"); - global::net.sf.robocode.security.HiddenAccess.j4n_cleanup2 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "cleanup", "()V"); - global::net.sf.robocode.security.HiddenAccess.j4n_update3 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "update", "(Lrobocode/Bullet;DDLjava/lang/String;Z)V"); - global::net.sf.robocode.security.HiddenAccess.j4n_initContainer4 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "initContainer", "()V"); - global::net.sf.robocode.security.HiddenAccess.j4n_robocodeMain5 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "robocodeMain", "([Ljava/lang/String;)V"); - global::net.sf.robocode.security.HiddenAccess.j4n_isCriticalEvent6 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "isCriticalEvent", "(Lrobocode/Event;)Z"); - global::net.sf.robocode.security.HiddenAccess.j4n_setEventTime7 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "setEventTime", "(Lrobocode/Event;J)V"); - global::net.sf.robocode.security.HiddenAccess.j4n_setEventPriority8 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "setEventPriority", "(Lrobocode/Event;I)V"); - global::net.sf.robocode.security.HiddenAccess.j4n_setDefaultPriority9 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "setDefaultPriority", "(Lrobocode/Event;)V"); - global::net.sf.robocode.security.HiddenAccess.j4n_getSerializationType10 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "getSerializationType", "(Lrobocode/Event;)B"); - global::net.sf.robocode.security.HiddenAccess.j4n_createSpecification11 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "createSpecification", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/la" + - "ng/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Strin" + - "g;)Lrobocode/control/RobotSpecification;"); - global::net.sf.robocode.security.HiddenAccess.j4n_getFileSpecification12 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "getFileSpecification", "(Lrobocode/control/RobotSpecification;)Ljava/lang/Object;"); - global::net.sf.robocode.security.HiddenAccess.j4n_getRobotTeamName13 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "getRobotTeamName", "(Lrobocode/control/RobotSpecification;)Ljava/lang/String;"); - global::net.sf.robocode.security.HiddenAccess.j4n_setTeamId14 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "setTeamId", "(Lrobocode/control/RobotSpecification;Ljava/lang/String;)V"); - global::net.sf.robocode.security.HiddenAccess.j4n_createStatus15 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "createStatus", "(DDDDDDDDDDDDIIIIJ)Lrobocode/RobotStatus;"); - global::net.sf.robocode.security.HiddenAccess.j4n_createRules16 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "createRules", "(IIIDJZI)Lrobocode/BattleRules;"); - global::net.sf.robocode.security.HiddenAccess.j4n_isSafeThread17 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "isSafeThread", "()Z"); - global::net.sf.robocode.security.HiddenAccess.j4n_initContainerForRobotEngine18 = @__env.GetStaticMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "initContainerForRobotEngine", "(Ljava/io/File;Lrobocode/control/events/IBattleListener;)V"); - global::net.sf.robocode.security.HiddenAccess.j4n__ctorHiddenAccess19 = @__env.GetMethodID(global::net.sf.robocode.security.HiddenAccess.staticClass, "", "()V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Event;Lrobocode/robotinterfaces/IBasicRobot;Lnet/sf/robocode/peer/IRob" + - "otStatics;Ljava/awt/Graphics2D;)V")] - public static void dispatch(global::java.lang.Object par0, global::java.lang.Object par1, global::net.sf.robocode.peer.IRobotStatics par2, global::java.lang.Object par3) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 18)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_dispatch0, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par2), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par3)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public static void init() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_init1); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public static void cleanup() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_cleanup2); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Bullet;DDLjava/lang/String;Z)V")] - public static void update(global::java.lang.Object par0, double par1, double par2, global::java.lang.String par3, bool par4) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 20)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_update3, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par3), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par4)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public static void initContainer() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_initContainer4); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("([Ljava/lang/String;)V")] - public static void robocodeMain(java.lang.String[] par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_robocodeMain5, global::net.sf.jni4net.utils.Convertor.ParArrayStrongCp2J(@__env, par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Event;)Z")] - public static bool isCriticalEvent(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((bool)(@__env.CallStaticBooleanMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_isCriticalEvent6, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Event;J)V")] - public static void setEventTime(global::java.lang.Object par0, long par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_setEventTime7, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Event;I)V")] - public static void setEventPriority(global::java.lang.Object par0, int par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_setEventPriority8, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Event;)V")] - public static void setDefaultPriority(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_setDefaultPriority9, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Event;)B")] - public static byte getSerializationType(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((byte)(@__env.CallStaticByteMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_getSerializationType10, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/la" + - "ng/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Strin" + - "g;)Lrobocode/control/RobotSpecification;")] - public static global::java.lang.Object createSpecification(global::java.lang.Object par0, global::java.lang.String par1, global::java.lang.String par2, global::java.lang.String par3, global::java.lang.String par4, global::java.lang.String par5, global::java.lang.String par6, global::java.lang.String par7, global::java.lang.String par8) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 28)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_createSpecification11, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par2), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par3), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par4), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par5), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par6), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par7), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par8))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/RobotSpecification;)Ljava/lang/Object;")] - public static global::java.lang.Object getFileSpecification(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_getFileSpecification12, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/RobotSpecification;)Ljava/lang/String;")] - public static global::java.lang.String getRobotTeamName(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_getRobotTeamName13, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/control/RobotSpecification;Ljava/lang/String;)V")] - public static void setTeamId(global::java.lang.Object par0, global::java.lang.String par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_setTeamId14, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(DDDDDDDDDDDDIIIIJ)Lrobocode/RobotStatus;")] - public static global::java.lang.Object createStatus( - double par0, - double par1, - double par2, - double par3, - double par4, - double par5, - double par6, - double par7, - double par8, - double par9, - double par10, - double par11, - int par12, - int par13, - int par14, - int par15, - long par16) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 44)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_createStatus15, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par3), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par4), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par5), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par6), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par7), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par8), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par9), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par10), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par11), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par12), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par13), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par14), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par15), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par16))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(IIIDJZI)Lrobocode/BattleRules;")] - public static global::java.lang.Object createRules(int par0, int par1, int par2, double par3, long par4, bool par5, int par6) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 24)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_createRules16, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par2), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par3), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par4), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par5), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par6))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()Z")] - public static bool isSafeThread() { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((bool)(@__env.CallStaticBooleanMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_isSafeThread17))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/io/File;Lrobocode/control/events/IBattleListener;)V")] - public static void initContainerForRobotEngine(global::java.io.File par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.security.HiddenAccess.staticClass, global::net.sf.robocode.security.HiddenAccess.j4n_initContainerForRobotEngine18, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1)); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.security.HiddenAccess(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/ISerializableHelper.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/ISerializableHelper.generated.cs deleted file mode 100644 index 7c4c9d8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/ISerializableHelper.generated.cs +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.serialization { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaInterfaceAttribute()] - public partial interface ISerializableHelper { - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;Ljava/lang/Obje" + - "ct;)V")] - void serialize(global::net.sf.robocode.serialization.RbSerializer par0, global::java.nio.ByteBuffer par1, global::java.lang.Object par2); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;)Ljava/lang/Obj" + - "ect;")] - global::java.lang.Object deserialize(global::net.sf.robocode.serialization.RbSerializer par0, global::java.nio.ByteBuffer par1); - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lnet/sf/robocode/serialization/RbSerializer;Ljava/lang/Object;)I")] - int sizeOf(global::net.sf.robocode.serialization.RbSerializer par0, global::java.lang.Object par1); - } - #endregion - - #region Component Designer generated code - public partial class ISerializableHelper_ { - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.serialization.@__ISerializableHelper.staticClass; - } - } - } - #endregion - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::net.sf.robocode.serialization.ISerializableHelper), typeof(global::net.sf.robocode.serialization.ISerializableHelper_))] - [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::net.sf.robocode.serialization.ISerializableHelper), typeof(global::net.sf.robocode.serialization.ISerializableHelper_))] - internal sealed partial class @__ISerializableHelper : global::java.lang.Object, global::net.sf.robocode.serialization.ISerializableHelper { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserialize1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_sizeOf2; - - private @__ISerializableHelper(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.serialization.@__ISerializableHelper.staticClass = @__class; - global::net.sf.robocode.serialization.@__ISerializableHelper.j4n_serialize0 = @__env.GetMethodID(global::net.sf.robocode.serialization.@__ISerializableHelper.staticClass, "serialize", "(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;Ljava/lang/Obje" + - "ct;)V"); - global::net.sf.robocode.serialization.@__ISerializableHelper.j4n_deserialize1 = @__env.GetMethodID(global::net.sf.robocode.serialization.@__ISerializableHelper.staticClass, "deserialize", "(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;)Ljava/lang/Obj" + - "ect;"); - global::net.sf.robocode.serialization.@__ISerializableHelper.j4n_sizeOf2 = @__env.GetMethodID(global::net.sf.robocode.serialization.@__ISerializableHelper.staticClass, "sizeOf", "(Lnet/sf/robocode/serialization/RbSerializer;Ljava/lang/Object;)I"); - } - - public void serialize(global::net.sf.robocode.serialization.RbSerializer par0, global::java.nio.ByteBuffer par1, global::java.lang.Object par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.@__ISerializableHelper.j4n_serialize0, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par2)); - } - } - - public global::java.lang.Object deserialize(global::net.sf.robocode.serialization.RbSerializer par0, global::java.nio.ByteBuffer par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.@__ISerializableHelper.j4n_deserialize1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1))); - } - } - - public int sizeOf(global::net.sf.robocode.serialization.RbSerializer par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.serialization.@__ISerializableHelper.j4n_sizeOf2, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1)))); - } - } - - private static global::System.Collections.Generic.List @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { - global::System.Type @__type = typeof(__ISerializableHelper); - global::System.Collections.Generic.List methods = new global::System.Collections.Generic.List(); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "serialize", "serialize0", "(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;Ljava/lang/Obje" + - "ct;)V")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "deserialize", "deserialize1", "(Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;)Ljava/lang/Obj" + - "ect;")); - methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "sizeOf", "sizeOf2", "(Lnet/sf/robocode/serialization/RbSerializer;Ljava/lang/Object;)I")); - return methods; - } - - private static void serialize0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1, global::net.sf.jni4net.utils.JniLocalHandle par2) { - // (Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;Ljava/lang/Object;)V - // (Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;Ljava/lang/Object;)V - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - try { - global::net.sf.robocode.serialization.ISerializableHelper @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__real.serialize(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par2)); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - } - - private static global::net.sf.jni4net.utils.JniHandle deserialize1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1) { - // (Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;)Ljava/lang/Object; - // (Lnet/sf/robocode/serialization/RbSerializer;Ljava/nio/ByteBuffer;)Ljava/lang/Object; - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - global::net.sf.jni4net.utils.JniHandle @__return = default(global::net.sf.jni4net.utils.JniHandle); - try { - global::net.sf.robocode.serialization.ISerializableHelper @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = global::net.sf.jni4net.utils.Convertor.FullC2J(@__env, @__real.deserialize(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0), global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par1))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - private static int sizeOf2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle par0, global::net.sf.jni4net.utils.JniLocalHandle par1) { - // (Lnet/sf/robocode/serialization/RbSerializer;Ljava/lang/Object;)I - // (Lnet/sf/robocode/serialization/RbSerializer;Ljava/lang/Object;)I - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); - int @__return = default(int); - try { - global::net.sf.robocode.serialization.ISerializableHelper @__real = global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__obj); - @__return = ((int)(@__real.sizeOf(global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, par0), global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, par1)))); - }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} - return @__return; - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.serialization.@__ISerializableHelper(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/RbSerializer.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/RbSerializer.generated.cs deleted file mode 100644 index aa01b31..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/net/sf/robocode/serialization/RbSerializer.generated.cs +++ /dev/null @@ -1,1036 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace net.sf.robocode.serialization { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - public partial class RbSerializer : global::java.lang.Object { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n_register0; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize1; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize2; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize3; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize4; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize5; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize6; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize7; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize8; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize9; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize10; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize11; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize12; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize13; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize14; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serialize15; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serializeToBuffer16; - - internal static global::net.sf.jni4net.jni.MethodId j4n_serializeToBuffer17; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserialize18; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserialize19; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeAny20; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeString21; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeBytes22; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeIntegers23; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeFloats24; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeChars25; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeDoubles26; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeBoolean27; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeChar28; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeInt29; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeFloat30; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeDouble31; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeLong32; - - internal static global::net.sf.jni4net.jni.MethodId j4n_sizeOf33; - - internal static global::net.sf.jni4net.jni.MethodId j4n_sizeOf34; - - internal static global::net.sf.jni4net.jni.MethodId j4n_sizeOf35; - - internal static global::net.sf.jni4net.jni.MethodId j4n_sizeOf36; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deserializeFromBuffer37; - - internal static global::net.sf.jni4net.jni.MethodId j4n_deepCopy38; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SIZEOF_TYPEINFO39; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SIZEOF_BYTE40; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SIZEOF_BOOL41; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SIZEOF_CHAR42; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SIZEOF_INT43; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SIZEOF_LONG44; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SIZEOF_DOUBLE45; - - internal static global::net.sf.jni4net.jni.FieldId j4n_TERMINATOR_TYPE46; - - internal static global::net.sf.jni4net.jni.FieldId j4n_ExecCommands_TYPE47; - - internal static global::net.sf.jni4net.jni.FieldId j4n_BulletCommand_TYPE48; - - internal static global::net.sf.jni4net.jni.FieldId j4n_TeamMessage_TYPE49; - - internal static global::net.sf.jni4net.jni.FieldId j4n_DebugProperty_TYPE50; - - internal static global::net.sf.jni4net.jni.FieldId j4n_ExecResults_TYPE51; - - internal static global::net.sf.jni4net.jni.FieldId j4n_RobotStatus_TYPE52; - - internal static global::net.sf.jni4net.jni.FieldId j4n_BulletStatus_TYPE53; - - internal static global::net.sf.jni4net.jni.FieldId j4n_BattleResults_TYPE54; - - internal static global::net.sf.jni4net.jni.FieldId j4n_Bullet_TYPE55; - - internal static global::net.sf.jni4net.jni.FieldId j4n_RobotStatics_TYPE56; - - internal static global::net.sf.jni4net.jni.FieldId j4n_BattleEndedEvent_TYPE57; - - internal static global::net.sf.jni4net.jni.FieldId j4n_BulletHitBulletEvent_TYPE58; - - internal static global::net.sf.jni4net.jni.FieldId j4n_BulletHitEvent_TYPE59; - - internal static global::net.sf.jni4net.jni.FieldId j4n_BulletMissedEvent_TYPE60; - - internal static global::net.sf.jni4net.jni.FieldId j4n_DeathEvent_TYPE61; - - internal static global::net.sf.jni4net.jni.FieldId j4n_WinEvent_TYPE62; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HitWallEvent_TYPE63; - - internal static global::net.sf.jni4net.jni.FieldId j4n_RobotDeathEvent_TYPE64; - - internal static global::net.sf.jni4net.jni.FieldId j4n_SkippedTurnEvent_TYPE65; - - internal static global::net.sf.jni4net.jni.FieldId j4n_ScannedRobotEvent_TYPE66; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HitByBulletEvent_TYPE67; - - internal static global::net.sf.jni4net.jni.FieldId j4n_HitRobotEvent_TYPE68; - - internal static global::net.sf.jni4net.jni.FieldId j4n_KeyPressedEvent_TYPE69; - - internal static global::net.sf.jni4net.jni.FieldId j4n_KeyReleasedEvent_TYPE70; - - internal static global::net.sf.jni4net.jni.FieldId j4n_KeyTypedEvent_TYPE71; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MouseClickedEvent_TYPE72; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MouseDraggedEvent_TYPE73; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MouseEnteredEvent_TYPE74; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MouseExitedEvent_TYPE75; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MouseMovedEvent_TYPE76; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MousePressedEvent_TYPE77; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MouseReleasedEvent_TYPE78; - - internal static global::net.sf.jni4net.jni.FieldId j4n_MouseWheelMovedEvent_TYPE79; - - internal static global::net.sf.jni4net.jni.FieldId j4n_RoundEndedEvent_TYPE80; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorRbSerializer81; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public RbSerializer() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n__ctorRbSerializer81, this); - } - } - - protected RbSerializer(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - public static global::java.lang.Class _class { - get { - return global::net.sf.robocode.serialization.RbSerializer.staticClass; - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("I")] - public static int SIZEOF_TYPEINFO { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.GetStaticIntField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_TYPEINFO39))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("I")] - public static int SIZEOF_BYTE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.GetStaticIntField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_BYTE40))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("I")] - public static int SIZEOF_BOOL { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.GetStaticIntField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_BOOL41))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("I")] - public static int SIZEOF_CHAR { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.GetStaticIntField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_CHAR42))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("I")] - public static int SIZEOF_INT { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.GetStaticIntField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_INT43))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("I")] - public static int SIZEOF_LONG { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.GetStaticIntField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_LONG44))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("I")] - public static int SIZEOF_DOUBLE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((int)(@__env.GetStaticIntField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_DOUBLE45))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte TERMINATOR_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_TERMINATOR_TYPE46))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte ExecCommands_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_ExecCommands_TYPE47))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte BulletCommand_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_BulletCommand_TYPE48))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte TeamMessage_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_TeamMessage_TYPE49))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte DebugProperty_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_DebugProperty_TYPE50))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte ExecResults_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_ExecResults_TYPE51))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte RobotStatus_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_RobotStatus_TYPE52))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte BulletStatus_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_BulletStatus_TYPE53))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte BattleResults_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_BattleResults_TYPE54))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte Bullet_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_Bullet_TYPE55))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte RobotStatics_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_RobotStatics_TYPE56))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte BattleEndedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_BattleEndedEvent_TYPE57))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte BulletHitBulletEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_BulletHitBulletEvent_TYPE58))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte BulletHitEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_BulletHitEvent_TYPE59))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte BulletMissedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_BulletMissedEvent_TYPE60))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte DeathEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_DeathEvent_TYPE61))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte WinEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_WinEvent_TYPE62))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte HitWallEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_HitWallEvent_TYPE63))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte RobotDeathEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_RobotDeathEvent_TYPE64))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte SkippedTurnEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_SkippedTurnEvent_TYPE65))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte ScannedRobotEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_ScannedRobotEvent_TYPE66))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte HitByBulletEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_HitByBulletEvent_TYPE67))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte HitRobotEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_HitRobotEvent_TYPE68))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte KeyPressedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_KeyPressedEvent_TYPE69))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte KeyReleasedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_KeyReleasedEvent_TYPE70))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte KeyTypedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_KeyTypedEvent_TYPE71))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MouseClickedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MouseClickedEvent_TYPE72))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MouseDraggedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MouseDraggedEvent_TYPE73))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MouseEnteredEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MouseEnteredEvent_TYPE74))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MouseExitedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MouseExitedEvent_TYPE75))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MouseMovedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MouseMovedEvent_TYPE76))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MousePressedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MousePressedEvent_TYPE77))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MouseReleasedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MouseReleasedEvent_TYPE78))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte MouseWheelMovedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_MouseWheelMovedEvent_TYPE79))); - } - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("B")] - public static byte RoundEndedEvent_TYPE { - get { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - return ((byte)(@__env.GetStaticByteField(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_RoundEndedEvent_TYPE80))); - } - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::net.sf.robocode.serialization.RbSerializer.staticClass = @__class; - global::net.sf.robocode.serialization.RbSerializer.j4n_register0 = @__env.GetStaticMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "register", "(Ljava/lang/Class;B)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize1 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/io/OutputStream;BLjava/lang/Object;)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize2 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;Lrobocode/Event;)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize3 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;BLjava/lang/Object;)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize4 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;Ljava/lang/String;)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize5 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;[B)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize6 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;[I)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize7 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;[C)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize8 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;[D)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize9 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;[F)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize10 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;Z)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize11 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;D)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize12 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;C)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize13 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;J)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize14 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(Ljava/nio/ByteBuffer;I)V"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serialize15 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serialize", "(BLjava/lang/Object;)Ljava/nio/ByteBuffer;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serializeToBuffer16 = @__env.GetStaticMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serializeToBuffer", "(Ljava/lang/Object;)Ljava/nio/ByteBuffer;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_serializeToBuffer17 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "serializeToBuffer", "(Ljava/nio/ByteBuffer;BLjava/lang/Object;)Ljava/nio/ByteBuffer;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserialize18 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserialize", "(Ljava/io/InputStream;)Ljava/lang/Object;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserialize19 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserialize", "(Ljava/nio/ByteBuffer;)Ljava/lang/Object;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeAny20 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeAny", "(Ljava/nio/ByteBuffer;)Ljava/lang/Object;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeString21 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeString", "(Ljava/nio/ByteBuffer;)Ljava/lang/String;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeBytes22 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeBytes", "(Ljava/nio/ByteBuffer;)[B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeIntegers23 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeIntegers", "(Ljava/nio/ByteBuffer;)[I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeFloats24 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeFloats", "(Ljava/nio/ByteBuffer;)[F"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeChars25 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeChars", "(Ljava/nio/ByteBuffer;)[C"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeDoubles26 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeDoubles", "(Ljava/nio/ByteBuffer;)[D"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeBoolean27 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeBoolean", "(Ljava/nio/ByteBuffer;)Z"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeChar28 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeChar", "(Ljava/nio/ByteBuffer;)C"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeInt29 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeInt", "(Ljava/nio/ByteBuffer;)I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeFloat30 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeFloat", "(Ljava/nio/ByteBuffer;)Ljava/lang/Float;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeDouble31 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeDouble", "(Ljava/nio/ByteBuffer;)D"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeLong32 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeLong", "(Ljava/nio/ByteBuffer;)J"); - global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf33 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "sizeOf", "(BLjava/lang/Object;)I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf34 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "sizeOf", "(Lrobocode/Event;)I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf35 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "sizeOf", "([B)I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf36 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "sizeOf", "(Ljava/lang/String;)I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeFromBuffer37 = @__env.GetStaticMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deserializeFromBuffer", "(Ljava/nio/ByteBuffer;)Ljava/lang/Object;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_deepCopy38 = @__env.GetStaticMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "deepCopy", "(BLjava/lang/Object;)Ljava/lang/Object;"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_TYPEINFO39 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SIZEOF_TYPEINFO", "I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_BYTE40 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SIZEOF_BYTE", "I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_BOOL41 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SIZEOF_BOOL", "I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_CHAR42 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SIZEOF_CHAR", "I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_INT43 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SIZEOF_INT", "I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_LONG44 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SIZEOF_LONG", "I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SIZEOF_DOUBLE45 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SIZEOF_DOUBLE", "I"); - global::net.sf.robocode.serialization.RbSerializer.j4n_TERMINATOR_TYPE46 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "TERMINATOR_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_ExecCommands_TYPE47 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "ExecCommands_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_BulletCommand_TYPE48 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "BulletCommand_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_TeamMessage_TYPE49 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "TeamMessage_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_DebugProperty_TYPE50 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "DebugProperty_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_ExecResults_TYPE51 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "ExecResults_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_RobotStatus_TYPE52 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "RobotStatus_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_BulletStatus_TYPE53 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "BulletStatus_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_BattleResults_TYPE54 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "BattleResults_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_Bullet_TYPE55 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "Bullet_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_RobotStatics_TYPE56 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "RobotStatics_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_BattleEndedEvent_TYPE57 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "BattleEndedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_BulletHitBulletEvent_TYPE58 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "BulletHitBulletEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_BulletHitEvent_TYPE59 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "BulletHitEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_BulletMissedEvent_TYPE60 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "BulletMissedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_DeathEvent_TYPE61 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "DeathEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_WinEvent_TYPE62 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "WinEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_HitWallEvent_TYPE63 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "HitWallEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_RobotDeathEvent_TYPE64 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "RobotDeathEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_SkippedTurnEvent_TYPE65 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "SkippedTurnEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_ScannedRobotEvent_TYPE66 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "ScannedRobotEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_HitByBulletEvent_TYPE67 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "HitByBulletEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_HitRobotEvent_TYPE68 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "HitRobotEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_KeyPressedEvent_TYPE69 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "KeyPressedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_KeyReleasedEvent_TYPE70 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "KeyReleasedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_KeyTypedEvent_TYPE71 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "KeyTypedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MouseClickedEvent_TYPE72 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MouseClickedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MouseDraggedEvent_TYPE73 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MouseDraggedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MouseEnteredEvent_TYPE74 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MouseEnteredEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MouseExitedEvent_TYPE75 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MouseExitedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MouseMovedEvent_TYPE76 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MouseMovedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MousePressedEvent_TYPE77 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MousePressedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MouseReleasedEvent_TYPE78 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MouseReleasedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_MouseWheelMovedEvent_TYPE79 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "MouseWheelMovedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n_RoundEndedEvent_TYPE80 = @__env.GetStaticFieldID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "RoundEndedEvent_TYPE", "B"); - global::net.sf.robocode.serialization.RbSerializer.j4n__ctorRbSerializer81 = @__env.GetMethodID(global::net.sf.robocode.serialization.RbSerializer.staticClass, "", "()V"); - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Class;B)V")] - public static void register(global::java.lang.Class par0, byte par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallStaticVoidMethod(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_register0, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/io/OutputStream;BLjava/lang/Object;)V")] - public virtual void serialize(global::java.io.OutputStream par0, byte par1, global::java.lang.Object par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize1, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par2)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;Lrobocode/Event;)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize2, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;BLjava/lang/Object;)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, byte par1, global::java.lang.Object par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize3, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par2)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;Ljava/lang/String;)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, global::java.lang.String par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize4, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;[B)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, byte[] par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize5, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParArrayPrimC2J(@__env, par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;[I)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, int[] par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize6, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParArrayPrimC2J(@__env, par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;[C)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, char[] par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize7, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParArrayPrimC2J(@__env, par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;[D)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, double[] par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize8, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParArrayPrimC2J(@__env, par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;[F)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, float[] par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize9, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParArrayPrimC2J(@__env, par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;Z)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, bool par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize10, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;D)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, double par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize11, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;C)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, char par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize12, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;J)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, long par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize13, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;I)V")] - public virtual void serialize(global::java.nio.ByteBuffer par0, int par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - @__env.CallVoidMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize14, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1)); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(BLjava/lang/Object;)Ljava/nio/ByteBuffer;")] - public virtual global::java.nio.ByteBuffer serialize(byte par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serialize15, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/Object;)Ljava/nio/ByteBuffer;")] - public static global::java.nio.ByteBuffer serializeToBuffer(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_serializeToBuffer16, global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;BLjava/lang/Object;)Ljava/nio/ByteBuffer;")] - public virtual global::java.nio.ByteBuffer serializeToBuffer(global::java.nio.ByteBuffer par0, byte par1, global::java.lang.Object par2) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 16)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_serializeToBuffer17, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0), global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par1), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par2))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/io/InputStream;)Ljava/lang/Object;")] - public virtual global::java.lang.Object deserialize(global::java.io.InputStream par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserialize18, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)Ljava/lang/Object;")] - public virtual global::java.lang.Object deserialize(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserialize19, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)Ljava/lang/Object;")] - public virtual global::java.lang.Object deserializeAny(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeAny20, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)Ljava/lang/String;")] - public virtual global::java.lang.String deserializeString(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2CpString(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeString21, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)[B")] - public virtual byte[] deserializeBytes(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayPrimJ2Cbyte(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeBytes22, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)[I")] - public virtual int[] deserializeIntegers(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayPrimJ2Cint(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeIntegers23, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)[F")] - public virtual float[] deserializeFloats(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayPrimJ2Cfloat(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeFloats24, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)[C")] - public virtual char[] deserializeChars(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayPrimJ2Cchar(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeChars25, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)[D")] - public virtual double[] deserializeDoubles(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.ArrayPrimJ2Cdouble(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeDoubles26, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)Z")] - public virtual bool deserializeBoolean(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((bool)(@__env.CallBooleanMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeBoolean27, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)C")] - public virtual char deserializeChar(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((char)(@__env.CallCharMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeChar28, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)I")] - public virtual int deserializeInt(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeInt29, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)Ljava/lang/Float;")] - public virtual global::java.lang.Float deserializeFloat(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.StrongJ2Cp(@__env, @__env.CallObjectMethodPtr(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeFloat30, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)D")] - public virtual double deserializeDouble(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((double)(@__env.CallDoubleMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeDouble31, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)J")] - public virtual long deserializeLong(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((long)(@__env.CallLongMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeLong32, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(BLjava/lang/Object;)I")] - public virtual int sizeOf(byte par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf33, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Lrobocode/Event;)I")] - public virtual int sizeOf(global::java.lang.Object par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf34, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("([B)I")] - public virtual int sizeOf(byte[] par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf35, global::net.sf.jni4net.utils.Convertor.ParArrayPrimC2J(@__env, par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)I")] - public virtual int sizeOf(global::java.lang.String par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = this.Env; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return ((int)(@__env.CallIntMethod(this, global::net.sf.robocode.serialization.RbSerializer.j4n_sizeOf36, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/nio/ByteBuffer;)Ljava/lang/Object;")] - public static global::java.lang.Object deserializeFromBuffer(global::java.nio.ByteBuffer par0) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_deserializeFromBuffer37, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0))); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(BLjava/lang/Object;)Ljava/lang/Object;")] - public static global::java.lang.Object deepCopy(byte par0, global::java.lang.Object par1) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 14)){ - return global::net.sf.jni4net.utils.Convertor.FullJ2C(@__env, @__env.CallStaticObjectMethodPtr(global::net.sf.robocode.serialization.RbSerializer.staticClass, global::net.sf.robocode.serialization.RbSerializer.j4n_deepCopy38, global::net.sf.jni4net.utils.Convertor.ParPrimC2J(par0), global::net.sf.jni4net.utils.Convertor.ParFullC2J(@__env, par1))); - } - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::net.sf.robocode.serialization.RbSerializer(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/AbortedException.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/AbortedException.generated.cs deleted file mode 100644 index 7143de0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/AbortedException.generated.cs +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.exception { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - [global::System.SerializableAttribute()] - public partial class AbortedException : global::java.lang.Error { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorAbortedException0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorAbortedException1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public AbortedException() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.exception.AbortedException.staticClass, global::robocode.exception.AbortedException.j4n__ctorAbortedException0, this); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public AbortedException(global::java.lang.String par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.exception.AbortedException.staticClass, global::robocode.exception.AbortedException.j4n__ctorAbortedException1, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - protected AbortedException(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - protected AbortedException(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : - base(info, context) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.exception.AbortedException.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.exception.AbortedException.staticClass = @__class; - global::robocode.exception.AbortedException.j4n__ctorAbortedException0 = @__env.GetMethodID(global::robocode.exception.AbortedException.staticClass, "", "()V"); - global::robocode.exception.AbortedException.j4n__ctorAbortedException1 = @__env.GetMethodID(global::robocode.exception.AbortedException.staticClass, "", "(Ljava/lang/String;)V"); - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.exception.AbortedException(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DeathException.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DeathException.generated.cs deleted file mode 100644 index 7b57751..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DeathException.generated.cs +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.exception { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - [global::System.SerializableAttribute()] - public partial class DeathException : global::java.lang.Error { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorDeathException0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorDeathException1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public DeathException() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.exception.DeathException.staticClass, global::robocode.exception.DeathException.j4n__ctorDeathException0, this); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public DeathException(global::java.lang.String par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.exception.DeathException.staticClass, global::robocode.exception.DeathException.j4n__ctorDeathException1, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - protected DeathException(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - protected DeathException(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : - base(info, context) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.exception.DeathException.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.exception.DeathException.staticClass = @__class; - global::robocode.exception.DeathException.j4n__ctorDeathException0 = @__env.GetMethodID(global::robocode.exception.DeathException.staticClass, "", "()V"); - global::robocode.exception.DeathException.j4n__ctorDeathException1 = @__env.GetMethodID(global::robocode.exception.DeathException.staticClass, "", "(Ljava/lang/String;)V"); - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.exception.DeathException(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DisabledException.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DisabledException.generated.cs deleted file mode 100644 index 4672eed..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/DisabledException.generated.cs +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.exception { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - [global::System.SerializableAttribute()] - public partial class DisabledException : global::java.lang.Error { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorDisabledException0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorDisabledException1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public DisabledException() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.exception.DisabledException.staticClass, global::robocode.exception.DisabledException.j4n__ctorDisabledException0, this); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public DisabledException(global::java.lang.String par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.exception.DisabledException.staticClass, global::robocode.exception.DisabledException.j4n__ctorDisabledException1, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - protected DisabledException(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - protected DisabledException(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : - base(info, context) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.exception.DisabledException.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.exception.DisabledException.staticClass = @__class; - global::robocode.exception.DisabledException.j4n__ctorDisabledException0 = @__env.GetMethodID(global::robocode.exception.DisabledException.staticClass, "", "()V"); - global::robocode.exception.DisabledException.j4n__ctorDisabledException1 = @__env.GetMethodID(global::robocode.exception.DisabledException.staticClass, "", "(Ljava/lang/String;)V"); - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.exception.DisabledException(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/WinException.generated.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/WinException.generated.cs deleted file mode 100644 index 2787601..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/generated/robocode/exception/WinException.generated.cs +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -//------------------------------------------------------------------------------ -// -// This code was generated by jni4net. See http://jni4net.sourceforge.net/ -// Runtime Version:2.0.50727.8669 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace robocode.exception { - - - #region Component Designer generated code - [global::net.sf.jni4net.attributes.JavaClassAttribute()] - [global::System.SerializableAttribute()] - public partial class WinException : global::java.lang.Error { - - internal new static global::java.lang.Class staticClass; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorWinException0; - - internal static global::net.sf.jni4net.jni.MethodId j4n__ctorWinException1; - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("()V")] - public WinException() : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 10)){ - @__env.NewObject(global::robocode.exception.WinException.staticClass, global::robocode.exception.WinException.j4n__ctorWinException0, this); - } - } - - [global::net.sf.jni4net.attributes.JavaMethodAttribute("(Ljava/lang/String;)V")] - public WinException(global::java.lang.String par0) : - base(((global::net.sf.jni4net.jni.JNIEnv)(null))) { - global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.ThreadEnv; - using(new global::net.sf.jni4net.jni.LocalFrame(@__env, 12)){ - @__env.NewObject(global::robocode.exception.WinException.staticClass, global::robocode.exception.WinException.j4n__ctorWinException1, this, global::net.sf.jni4net.utils.Convertor.ParStrongCp2J(par0)); - } - } - - protected WinException(global::net.sf.jni4net.jni.JNIEnv @__env) : - base(@__env) { - } - - protected WinException(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : - base(info, context) { - } - - public static global::java.lang.Class _class { - get { - return global::robocode.exception.WinException.staticClass; - } - } - - private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { - global::robocode.exception.WinException.staticClass = @__class; - global::robocode.exception.WinException.j4n__ctorWinException0 = @__env.GetMethodID(global::robocode.exception.WinException.staticClass, "", "()V"); - global::robocode.exception.WinException.j4n__ctorWinException1 = @__env.GetMethodID(global::robocode.exception.WinException.staticClass, "", "(Ljava/lang/String;)V"); - } - - new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { - - public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { - return new global::robocode.exception.WinException(@__env); - } - } - } - #endregion -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/DotNetHost.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/DotNetHost.cs deleted file mode 100644 index befcc51..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/DotNetHost.cs +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using net.sf.jni4net; -using net.sf.robocode.dotnet.host.seed; -using net.sf.robocode.dotnet.repository.root; -using net.sf.robocode.host; -using net.sf.robocode.host.proxies; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using net.sf.robocode.security; -using robocode.control; -using Object = java.lang.Object; -using String = java.lang.String; - -namespace net.sf.robocode.dotnet.host -{ - public class DotNetHost : IHost - { - #region IHost Members - - public IHostingRobotProxy createRobotProxy(IHostManager hostManager, Object robotSpecification, IRobotStatics statics, IRobotPeer peer) - { - Object s = HiddenAccess.getFileSpecification(robotSpecification); - var itemSpecification = Bridge.Cast(s); - string file = DllRootHelper.GetDllFileName(itemSpecification); - HostingShell hostingShell = new HostingShell(itemSpecification, hostManager, peer, statics, file); - return hostingShell; - } - - public String[] getReferencedClasses(IRobotItem robotItem) - { - return new String[] {}; - } - - public RobotType getRobotType(IRobotItem robotItem, bool resolve, bool message) - { - return DllRootHelper.GetRobotType(robotItem); - } - - #endregion - - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/ModuleN.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/ModuleN.cs deleted file mode 100644 index af2dc39..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/ModuleN.cs +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Globalization; -using System.Windows.Forms; -using net.sf.jni4net; -using net.sf.robocode.core; -using net.sf.robocode.dotnet.peer; -using net.sf.robocode.host; -using net.sf.robocode.io; -using net.sf.robocode.manager; -using net.sf.robocode.security; -using net.sf.robocode.serialization; -using Robocode; -using robocode.control; - -namespace net.sf.robocode.dotnet.nhost -{ - public class ModuleN - { - public static void InitN() - { - System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; - HiddenAccessN.init(); - LoggerN.IsSafeThread = true; - LoggerN.setLogListener(new Logger(true)); - HiddenAccessN.randomHelper = new RandomFactory(true); - - var versionManager = - Bridge.Cast(ContainerBase.getComponent(IVersionManagerBase_._class)); - int currentVersion = versionManager.getVersionAsInt(); - RbSerializer.Init(currentVersion); - RbSerializerN.Init(currentVersion); - - RbSerializerN.register(typeof (RobotStatus), RbSerializerN.RobotStatus_TYPE); - RbSerializerN.register(typeof (BattleResults), RbSerializerN.BattleResults_TYPE); - RbSerializerN.register(typeof (Bullet), RbSerializerN.Bullet_TYPE); - RbSerializerN.register(typeof (RobotStatics), RbSerializerN.RobotStatics_TYPE); - - // events - RbSerializerN.register(typeof (RoundEndedEvent), RbSerializerN.RoundEndedEvent_TYPE); - RbSerializerN.register(typeof (BattleEndedEvent), RbSerializerN.BattleEndedEvent_TYPE); - RbSerializerN.register(typeof (BulletHitBulletEvent), RbSerializerN.BulletHitBulletEvent_TYPE); - RbSerializerN.register(typeof (BulletHitEvent), RbSerializerN.BulletHitEvent_TYPE); - RbSerializerN.register(typeof (BulletMissedEvent), RbSerializerN.BulletMissedEvent_TYPE); - RbSerializerN.register(typeof (DeathEvent), RbSerializerN.DeathEvent_TYPE); - RbSerializerN.register(typeof (WinEvent), RbSerializerN.WinEvent_TYPE); - RbSerializerN.register(typeof (HitWallEvent), RbSerializerN.HitWallEvent_TYPE); - RbSerializerN.register(typeof (RobotDeathEvent), RbSerializerN.RobotDeathEvent_TYPE); - RbSerializerN.register(typeof (SkippedTurnEvent), RbSerializerN.SkippedTurnEvent_TYPE); - RbSerializerN.register(typeof (ScannedRobotEvent), RbSerializerN.ScannedRobotEvent_TYPE); - RbSerializerN.register(typeof (HitByBulletEvent), RbSerializerN.HitByBulletEvent_TYPE); - RbSerializerN.register(typeof (HitRobotEvent), RbSerializerN.HitRobotEvent_TYPE); - RbSerializerN.register(typeof (KeyPressedEvent), RbSerializerN.KeyPressedEvent_TYPE); - RbSerializerN.register(typeof (KeyReleasedEvent), RbSerializerN.KeyReleasedEvent_TYPE); - RbSerializerN.register(typeof (KeyTypedEvent), RbSerializerN.KeyTypedEvent_TYPE); - RbSerializerN.register(typeof (MouseClickedEvent), RbSerializerN.MouseClickedEvent_TYPE); - RbSerializerN.register(typeof (MouseDraggedEvent), RbSerializerN.MouseDraggedEvent_TYPE); - RbSerializerN.register(typeof (MouseEnteredEvent), RbSerializerN.MouseEnteredEvent_TYPE); - RbSerializerN.register(typeof (MouseExitedEvent), RbSerializerN.MouseExitedEvent_TYPE); - RbSerializerN.register(typeof (MouseMovedEvent), RbSerializerN.MouseMovedEvent_TYPE); - RbSerializerN.register(typeof (MousePressedEvent), RbSerializerN.MousePressedEvent_TYPE); - RbSerializerN.register(typeof (MouseReleasedEvent), RbSerializerN.MouseReleasedEvent_TYPE); - RbSerializerN.register(typeof (MouseWheelMovedEvent), RbSerializerN.MouseWheelMovedEvent_TYPE); - - RbSerializerN.register(typeof (ExecCommands), RbSerializerN.ExecCommands_TYPE); - RbSerializerN.register(typeof (BulletCommand), RbSerializerN.BulletCommand_TYPE); - RbSerializerN.register(typeof (TeamMessage), RbSerializerN.TeamMessage_TYPE); - RbSerializerN.register(typeof (DebugProperty), RbSerializerN.DebugProperty_TYPE); - RbSerializerN.register(typeof (ExecResults), RbSerializerN.ExecResults_TYPE); - RbSerializerN.register(typeof (BulletStatus), RbSerializerN.BulletStatus_TYPE); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/RobotStatics.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/RobotStatics.cs deleted file mode 100644 index 9267e4f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/RobotStatics.cs +++ /dev/null @@ -1,312 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using net.sf.robocode.nio; -using net.sf.robocode.peer; -using net.sf.robocode.security; -using net.sf.robocode.serialization; -using Robocode; - -namespace net.sf.robocode.host -{ - [Serializable] - public class RobotStatics : IRobotStaticsN - { - private readonly string robocodeVersion; - private readonly BattleRules battleRules; - private readonly int contestantIndex; - private readonly string fullClassName; - private readonly int index; - private readonly bool isJuniorRobot; - private readonly bool isAdvancedRobot; - private readonly bool isTeamRobot; - private readonly bool isDroid; - private readonly bool isSentryRobot; - private readonly bool isInteractiveRobot; - private readonly bool isPaintRobot; - private readonly bool isTeamLeader; - private readonly string name; - private readonly string shortClassName; - private readonly string shortName; - private readonly string teamName; - private readonly string[] teammates; - private readonly string veryShortName; - - public RobotStatics(string robocodeVersion, bool isJuniorRobot, bool isInteractiveRobot, bool isPaintRobot, bool isAdvancedRobot, - bool isTeamRobot, bool isTeamLeader, bool isDroid, bool isSentryRobot, string name, string shortName, - string veryShortName, string fullClassName, string shortClassName, BattleRules battleRules, - string[] teammates, string teamName, int index, int contestantIndex) - { - this.robocodeVersion = robocodeVersion; - this.isJuniorRobot = isJuniorRobot; - this.isAdvancedRobot = isAdvancedRobot; - this.isTeamRobot = isTeamRobot; - this.isDroid = isDroid; - this.isSentryRobot = isSentryRobot; - this.isInteractiveRobot = isInteractiveRobot; - this.isPaintRobot = isPaintRobot; - this.isTeamLeader = isTeamLeader; - this.name = name; - this.shortName = shortName; - this.veryShortName = veryShortName; - this.fullClassName = fullClassName; - this.shortClassName = shortClassName; - this.battleRules = battleRules; - this.teammates = teammates; - this.teamName = teamName; - this.index = index; - this.contestantIndex = contestantIndex; - } - - #region IRobotStaticsN Members - - public bool IsInteractiveRobot() - { - return isInteractiveRobot; - } - - public bool IsPaintRobot() - { - return isPaintRobot; - } - - public bool IsAdvancedRobot() - { - return isAdvancedRobot; - } - - public bool IsTeamRobot() - { - return isTeamRobot; - } - - #endregion - - public string getRobocodeVersion() - { - return robocodeVersion; - } - - public bool IsJuniorRobot() - { - return isJuniorRobot; - } - - public bool IsDroid() - { - return isDroid; - } - - public bool IsTeamLeader() - { - return isTeamLeader; - } - - public string getName() - { - return name; - } - - public string getShortName() - { - return shortName; - } - - public string getVeryShortName() - { - return veryShortName; - } - - public string getFullClassName() - { - return fullClassName; - } - - public string getShortClassName() - { - return shortClassName; - } - - public BattleRules getBattleRules() - { - return battleRules; - } - - public string[] getTeammates() - { - if (teammates == null) - { - return null; - } - var copy = new string[teammates.Length]; - Array.Copy(teammates, copy, teammates.Length); - return copy; - } - - public string getTeamName() - { - return teamName; - } - - public int getIndex() - { - return index; - } - - public int getContestIndex() - { - return contestantIndex; - } - - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - #region Nested type: SerializableHelper - - private class SerializableHelper : ISerializableHelperN - { - #region ISerializableHelperN Members - - public int sizeOf(RbSerializerN serializer, object obje) - { - var obj = (RobotStatics) obje; - int size = RbSerializerN.SIZEOF_TYPEINFO - + serializer.sizeOf(obj.robocodeVersion) - + RbSerializerN.SIZEOF_BOOL * 9 - + serializer.sizeOf(obj.name) - + serializer.sizeOf(obj.shortName) - + serializer.sizeOf(obj.veryShortName) - + serializer.sizeOf(obj.fullClassName) - + serializer.sizeOf(obj.shortClassName) - + RbSerializerN.SIZEOF_INT*6 - + RbSerializerN.SIZEOF_DOUBLE - + RbSerializerN.SIZEOF_LONG; - if (obj.teammates != null) - { - foreach (String mate in obj.teammates) - { - size += serializer.sizeOf(mate); - } - } - size += RbSerializerN.SIZEOF_INT; - size += serializer.sizeOf(obj.teamName); - - return size; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, object obje) - { - var obj = (RobotStatics) obje; - - serializer.serialize(buffer, obj.robocodeVersion); - serializer.serialize(buffer, obj.isJuniorRobot); - serializer.serialize(buffer, obj.isInteractiveRobot); - serializer.serialize(buffer, obj.isPaintRobot); - serializer.serialize(buffer, obj.isAdvancedRobot); - serializer.serialize(buffer, obj.isTeamRobot); - serializer.serialize(buffer, obj.isTeamLeader); - serializer.serialize(buffer, obj.isDroid); - serializer.serialize(buffer, obj.isSentryRobot); - serializer.serialize(buffer, obj.name); - serializer.serialize(buffer, obj.shortName); - serializer.serialize(buffer, obj.veryShortName); - serializer.serialize(buffer, obj.fullClassName); - serializer.serialize(buffer, obj.shortClassName); - serializer.serialize(buffer, obj.battleRules.BattlefieldWidth); - serializer.serialize(buffer, obj.battleRules.BattlefieldHeight); - serializer.serialize(buffer, obj.battleRules.NumRounds); - serializer.serialize(buffer, obj.battleRules.GunCoolingRate); - serializer.serialize(buffer, obj.battleRules.InactivityTime); - serializer.serialize(buffer, obj.battleRules.HideEnemyNames); - serializer.serialize(buffer, obj.battleRules.SentryBorderSize); - if (obj.teammates != null) - { - foreach (string mate in obj.teammates) - { - serializer.serialize(buffer, mate); - } - } - buffer.putInt(-1); - serializer.serialize(buffer, obj.teamName); - serializer.serialize(buffer, obj.index); - serializer.serialize(buffer, obj.contestantIndex); - } - - public object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - string robocodeVersion = serializer.deserializeString(buffer); - bool isJuniorRobot = serializer.deserializeBoolean(buffer); - bool isInteractiveRobot = serializer.deserializeBoolean(buffer); - bool isPaintRobot = serializer.deserializeBoolean(buffer); - bool isAdvancedRobot = serializer.deserializeBoolean(buffer); - bool isTeamRobot = serializer.deserializeBoolean(buffer); - bool isTeamLeader = serializer.deserializeBoolean(buffer); - bool isDroid = serializer.deserializeBoolean(buffer); - bool isSentryRobot = serializer.deserializeBoolean(buffer); - string name = serializer.deserializeString(buffer); - string shortName = serializer.deserializeString(buffer); - string veryShortName = serializer.deserializeString(buffer); - string fullClassName = serializer.deserializeString(buffer); - string shortClassName = serializer.deserializeString(buffer); - BattleRules battleRules = HiddenAccessN.createRules( - serializer.deserializeInt(buffer), // BattlefieldWidth - serializer.deserializeInt(buffer), // BattlefieldHeight - serializer.deserializeInt(buffer), // NumRounds - serializer.deserializeDouble(buffer), // GunCoolingRate - serializer.deserializeLong(buffer), // InactivityTime - serializer.deserializeBoolean(buffer), // HideEnemyNames - serializer.deserializeInt(buffer) // SentryBorderSize - ); - - var teammates = new List(); - object item = serializer.deserializeString(buffer); - while (item != null) - { - if (item is string) - { - teammates.Add((string) item); - } - item = serializer.deserializeString(buffer); - } - - string teamName = serializer.deserializeString(buffer); - int index = serializer.deserializeInt(buffer); - int contestantIndex = serializer.deserializeInt(buffer); - - return new RobotStatics( - robocodeVersion, - isJuniorRobot, - isInteractiveRobot, - isPaintRobot, - isAdvancedRobot, - isTeamRobot, - isTeamLeader, - isDroid, - isSentryRobot, - name, - shortName, - veryShortName, - fullClassName, - shortClassName, - battleRules, - teammates.ToArray(), - teamName, - index, - contestantIndex - ); - } - - #endregion - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventManager.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventManager.cs deleted file mode 100644 index 85a9daa..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventManager.cs +++ /dev/null @@ -1,702 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.Security; -using System.Security.Permissions; -using net.sf.robocode.dotnet.host.proxies; -using net.sf.robocode.security; -using Robocode; -using robocode.exception; -using Robocode.Exception; -using Robocode.RobotInterfaces; - -namespace net.sf.robocode.dotnet.host.events -{ - /// - /// This class is used for managing the event queue for a robot. - /// - public sealed class EventManager - { - private const int MAX_PRIORITY = 100; - public const int MAX_EVENT_STACK = 2; - public const int MAX_QUEUE_SIZE = 256; - - private readonly List customEvents = new List(); - private readonly EventQueue eventQueue; - - private readonly bool[] interruptible = new bool[MAX_PRIORITY + 1]; - private Event currentTopEvent; - private int currentTopEventPriority; - private ScannedRobotEvent dummyScannedRobotEvent; - private Dictionary eventNames; - - private IBasicRobot robot; - private BasicRobotProxy robotProxy; - - /// - /// Constructs a new EventManager. - /// - /// the robot proxy that this event manager applies to. - public EventManager(BasicRobotProxy robotProxy) - { - this.robotProxy = robotProxy; - eventQueue = new EventQueue(); - - RegisterEventNames(); - Reset(); - } - - /// - /// Adds an event to the event queue. - /// - /// is the event to add to the event queue. - public void Add(Event evnt) - { - if (!HiddenAccessN.IsCriticalEvent(evnt)) - { - int priority = GetEventPriority(evnt.GetType().Name); - HiddenAccessN.SetEventPriority(evnt, priority); - } - AddImpl(evnt); - } - - /// - /// Internal method for adding an event to the event queue. - /// - /// is the event to add to the event queue. - private void AddImpl(Event evnt) - { - if (eventQueue != null) - { - if (eventQueue.Count > MAX_QUEUE_SIZE) - { - robotProxy.println( - "Not adding to " + robotProxy.getStatics().getName() + "'s queue, exceeded " + MAX_QUEUE_SIZE - + " events in queue."); - } - else - { - HiddenAccessN.SetEventTime(evnt, Time); - eventQueue.Add(evnt); - } - } - } - - /// - /// Adds an custom event to the event queue based on a condition. - /// - /// is the condition that must be met in order to trigger the custom event. - public void AddCustomEvent(Condition condition) - { - customEvents.Add(condition); - } - - /// - /// Removes all events from the event queue. - /// - /// - /// true if system events must be removed as well; - /// false if system events should stay on the event queue. - /// - public void ClearAllEvents(bool includingSystemEvents) - { - eventQueue.clear(includingSystemEvents); - // customEvents.clear(); // Custom event should not be cleared here - } - - /// - /// Cleans up the event queue. - /// - /// - /// This method should be called when the event queue is no longer needed, - /// i.e. before it must be garbage collected. - /// - public void Cleanup() - { - // Remove all events - Reset(); - - // Remove all references to robots - robot = null; - robotProxy = null; - } - - - /// - /// Returns a list containing all events currently in the robot's queue. - /// - public List GetAllEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - events.Add(e); - } - } - return events; - } - - /// - /// Returns a list containing all BulletHitBulletEvents currently in the robot's queue. - /// - public List GetBulletHitBulletEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as BulletHitBulletEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all BulletHitEvents currently in the robot's queue. - /// - public List GetBulletHitEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as BulletHitEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all BulletMissedEvents currently in the robot's queue. - /// - public List GetBulletMissedEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as BulletMissedEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all HitByBulletEvent currently in the robot's queue. - /// - public List GetHitByBulletEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as HitByBulletEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all HitRobotEvent currently in the robot's queue. - /// - public List GetHitRobotEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as HitRobotEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all HitWallEvent currently in the robot's queue. - /// - public List GetHitWallEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as HitWallEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all RobotDeathEvent currently in the robot's queue. - /// - public List GetRobotDeathEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as RobotDeathEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all ScannedRobotEvent currently in the robot's queue. - /// - public List GetScannedRobotEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as ScannedRobotEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all MessageEvent currently in the robot's queue. - /// - public List GetMessageEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as MessageEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Returns a list containing all StatusEvent currently in the robot's queue. - /// - public List GetStatusEvents() - { - var events = new List(); - lock (eventQueue) - { - foreach (Event e in eventQueue) - { - var c = e as StatusEvent; - if (c != null) - { - events.Add(c); - } - } - } - return events; - } - - /// - /// Priority of the current top event. - /// - public int CurrentTopEventPriority - { - get { return currentTopEventPriority; } - } - - /// - /// Current top event. - /// - public Event CurrentTopEvent - { - get { return currentTopEvent; } - } - - /// - /// Checks if events with a specific event priority are interruptible. - /// - /// is the event priority that must be checked. - /// - public bool IsInterruptible(int priority) - { - return interruptible[priority]; - } - - /// - /// Sets the robot that will receive events dispatched from the event queue. - /// - /// is the robot that will receive event dispatched from the event queue. - public void SetRobot(IBasicRobot robot) - { - this.robot = robot; - } - - /// - /// The priority of a ScannedRobotEvent. - /// - public int ScannedRobotEventPriority - { - get { return dummyScannedRobotEvent.Priority; } - } - - /// - /// The current time/turn of the battle round. - /// - public long Time - { - get { return robotProxy.getTimeImpl(); } - } - - /// - /// This is the heart of the event manager, which processes the events for a robot. - /// - public void ProcessEvents() - { - // Remove old events - eventQueue.clear(Time - MAX_EVENT_STACK); - - // Copy list of custom events prior iteration, because user could call RemoveCustomEvent - List eventsCopy = new List(customEvents); - - // Process custom events - foreach (Condition customEvent in eventsCopy) - { - bool conditionSatisfied = CallUserCode(customEvent); - if (conditionSatisfied) - { - AddImpl(new CustomEvent(customEvent)); - } - } - - // Process event queue here - eventQueue.sort(); - - Event currentEvent; - while ((currentEvent = (eventQueue.Count > 0) ? eventQueue[0] : null) != null - && currentEvent.Priority >= currentTopEventPriority) - { - if (currentEvent.Priority == currentTopEventPriority) - { - if (currentTopEventPriority > int.MinValue && IsInterruptible(currentTopEventPriority)) - { - SetInterruptible(currentTopEventPriority, false); // we're going to restart it, so reset. - - // We are already in an event handler, took action, and a new event was generated. - // So we want to break out of the old handler to process it here. - throw new EventInterruptedException(currentEvent.Priority); - } - break; - } - - int oldTopEventPriority = currentTopEventPriority; - - currentTopEventPriority = currentEvent.Priority; - currentTopEvent = currentEvent; - - eventQueue.Remove(currentEvent); - try - { - Dispatch(currentEvent); - - SetInterruptible(currentTopEventPriority, false); - } - catch (EventInterruptedException) - { - currentTopEvent = null; - } - catch (Exception) - { - currentTopEvent = null; - throw; - } - finally - { - currentTopEventPriority = oldTopEventPriority; - } - } - } - - /// - /// Checks if the user's condition for a custom event is satisfied. - /// - /// is the condition to check. - /// - /// true if the condition is satisfied; false otherwise. - /// - [SecurityPermission(SecurityAction.Deny)] - [ReflectionPermission(SecurityAction.Deny)] - [FileIOPermission(SecurityAction.Deny)] - [UIPermission(SecurityAction.Deny)] - private bool CallUserCode(Condition condition) - { - bool conditionSatisfied; - robotProxy.setTestingCondition(true); - try - { - conditionSatisfied = condition.Test(); - } - finally - { - robotProxy.setTestingCondition(false); - } - return conditionSatisfied; - } - - /// - /// Dispatches an event for a robot. - /// - /// - /// Too old events will not be dispatched and a critical event is always dispatched. - /// - /// is the event to dispatch to the robot. - private void Dispatch(Event evnt) - { - if (robot != null && evnt != null) - { - try - { - // skip too old events - if ((evnt.Time > Time - MAX_EVENT_STACK) || HiddenAccessN.IsCriticalEvent(evnt)) - { - HiddenAccessN.Dispatch(evnt, robot, robotProxy.getStatics(), robotProxy.getGraphicsImpl()); - } - } - catch (Exception ex) - { - if (ex is SecurityException) - { - robotProxy.punishSecurityViolation(robotProxy.getStatics().getName() + " " + ex.Message); - } - else if (ex.InnerException is SecurityException) - { - robotProxy.punishSecurityViolation(robotProxy.getStatics().getName() + " " + ex.InnerException + ": " + ex.Message); - } - else if (!(ex is EventInterruptedException || ex is AbortedException || ex is DeathException || ex is DisabledException || ex is WinException)) - { - robotProxy.println("SYSTEM: " + ex.GetType().Name + " occurred on " + evnt.GetType().Name); - robotProxy.GetOut().WriteLine(ex.StackTrace); - } - throw; - } - } - } - - /// - /// Removes the custom event with the specified condition from the event queue. - /// - /// is the condition of the custom event to remove. - public void RemoveCustomEvent(Condition condition) - { - customEvents.Remove(condition); - } - - /// - /// Removes all custom events from the event queue. - /// - public void ResetCustomEvents() - { - customEvents.Clear(); - } - - /// - /// Resets this event manager by removing all events from the event queue. - /// - public void Reset() - { - lock (this) - { - currentTopEventPriority = int.MinValue; - ClearAllEvents(true); - customEvents.Clear(); - } - } - - /// - /// Changes the interruptible flag for events with a specific priority. - /// - /// - /// When an event is interrupted, events with the same priority are allowed to restart the event handler. - /// - /// is the priority of the event to set the interruptible flag for. - /// - /// true if events with the specified priority must be interruptible - /// allowing events with the same priority to restart the event handler. - /// false if events with the specified priority must not be interruptible - /// disallowing events with the same priority to restart the event handler. - /// - public void SetInterruptible(int priority, bool interruptable) - { - if (priority < 0 || priority > 99) - { - return; - } - interruptible[priority] = interruptable; - } - - /// - /// Returns the priority of events belonging to a specific class. - /// - /// - /// is a string with the full class name of the event type to get the priority from. - /// the event priority of the specified event class. - /// - public int GetEventPriority(string eventClass) - { - if (eventClass == null) - { - return -1; - } - Event evnt; - if (!eventNames.TryGetValue(eventClass, out evnt)) - { - return -1; - } - return evnt.Priority; - } - - /// - /// Sets the event priority of events belonging to a specific class. - /// - /// - /// is a string with the full class name of the event type to set the priority for. - /// is the new priority - public void SetEventPriority(string eventClass, int priority) - { - if (eventClass == null) - { - return; - } - Event evnt; - if (!eventNames.TryGetValue(eventClass, out evnt)) - { - robotProxy.println("SYSTEM: Unknown event class: " + eventClass); - return; - } - if (HiddenAccessN.IsCriticalEvent(evnt)) - { - robotProxy.println("SYSTEM: You may not change the priority of a system event."); - } - HiddenAccessN.SetEventPriority(evnt, priority); - } - - /// - /// Registers the full and simple class names of all events used by and - /// and sets the default priority of each event class. - /// - private void RegisterEventNames() - { - eventNames = new Dictionary(); - dummyScannedRobotEvent = new ScannedRobotEvent(null, 0, 0, 0, 0, 0); - registerEventNames(new BattleEndedEvent(false, null)); - registerEventNames(new BulletHitBulletEvent(null, null)); - registerEventNames(new BulletHitEvent(null, 0, null)); - registerEventNames(new BulletMissedEvent(null)); - registerEventNames(new DeathEvent()); - registerEventNames(new HitByBulletEvent(0, null)); - registerEventNames(new HitRobotEvent(null, 0, 0, false)); - registerEventNames(new HitWallEvent(0)); - registerEventNames(new KeyPressedEvent('a', 0, 0, 0, 0, 0)); - registerEventNames(new KeyReleasedEvent('a', 0, 0, 0, 0, 0)); - registerEventNames(new KeyTypedEvent('a', 0, 0, 0, 0, 0)); - registerEventNames(new MessageEvent(null, null)); - registerEventNames(new MouseClickedEvent(0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new MouseDraggedEvent(0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new MouseEnteredEvent(0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new MouseExitedEvent(0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new MouseMovedEvent(0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new MousePressedEvent(0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new MouseReleasedEvent(0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new MouseWheelMovedEvent(0, 0, 0, 0, 0, 0, 0, 0, 0)); - registerEventNames(new PaintEvent()); - registerEventNames(new RobotDeathEvent(null)); - registerEventNames(dummyScannedRobotEvent); - registerEventNames(new SkippedTurnEvent(0)); - registerEventNames(new StatusEvent(null)); - registerEventNames(new WinEvent()); - - // same as any line above but for custom event - var customEvent = new DummyCustomEvent(); - eventNames.Add("robocode.CustomEvent", customEvent); // full name with package name - eventNames.Add("CustomEvent", customEvent); // only the class name - } - - /// - /// Registers the full and simple class name of the specified event and sets the default - /// priority of the event class. - /// - /// an event belonging to the event class to register the class name for etc. - private void registerEventNames(Event evnt) - { - if (!HiddenAccessN.IsCriticalEvent(evnt)) - { - HiddenAccessN.SetDefaultPriority(evnt); - } - Type type = evnt.GetType(); - eventNames.Add(type.FullName, evnt); // full name with package name - eventNames.Add(type.Name, evnt); // only the class name - } - - #region Nested type: DummyCustomEvent - - /// - /// A dummy CustomEvent used only for registering the class name. - /// - private sealed class DummyCustomEvent : CustomEvent - { - public DummyCustomEvent() - : base(null) - { - } - } - - #endregion - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventQueue.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventQueue.cs deleted file mode 100644 index 69d9089..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/events/EventQueue.cs +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Collections.Generic; -using net.sf.robocode.security; -using Robocode; - -namespace net.sf.robocode.dotnet.host.events -{ - internal class EventQueue : List - { - public void clear(bool includingSystemEvents) - { - if (includingSystemEvents) - { - Clear(); - return; - } - - for (int i = 0; i < Count; i++) - { - Event e = this[i]; - - if (!HiddenAccessN.IsCriticalEvent(e)) - { - RemoveAt(i--); - } - } - } - - public void clear(long clearTime) - { - for (int i = 0; i < Count; i++) - { - Event e = this[i]; - - if ((e.Time <= clearTime) && !HiddenAccessN.IsCriticalEvent(e)) - { - RemoveAt(i--); - } - } - } - - public void sort() - { - Sort(); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/AdvancedRobotProxy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/AdvancedRobotProxy.cs deleted file mode 100644 index 8220b51..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/AdvancedRobotProxy.cs +++ /dev/null @@ -1,227 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.IO; -using net.sf.robocode.host; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using Robocode; -using Robocode.RobotInterfaces.Peer; - -namespace net.sf.robocode.dotnet.host.proxies -{ - internal class AdvancedRobotProxy : StandardRobotProxy, IAdvancedRobotPeer - { - public AdvancedRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, - RobotStatics statics) - : base(specification, hostManager, peer, statics) - { - } - - // asynchronous actions - - #region IAdvancedRobotPeer Members - - public void SetResume() - { - SetCall(); - setResumeImpl(); - } - - public void SetStop(bool overwrite) - { - SetCall(); - setStopImpl(overwrite); - } - - public void SetMove(double distance) - { - SetCall(); - setMoveImpl(distance); - } - - public void SetTurnBody(double radians) - { - SetCall(); - setTurnBodyImpl(radians); - } - - public void SetTurnGun(double radians) - { - SetCall(); - setTurnGunImpl(radians); - } - - public void SetTurnRadar(double radians) - { - SetCall(); - setTurnRadarImpl(radians); - } - - // blocking actions - public void WaitFor(Condition condition) - { - waitCondition = condition; - do - { - Execute(); // Always tick at least once - } while (!condition.Test()); - - waitCondition = null; - } - - // fast setters - public void SetMaxTurnRate(double newTurnRate) - { - SetCall(); - if (Double.IsNaN(newTurnRate)) - { - println("You cannot SetMaxTurnRate to: " + newTurnRate); - return; - } - commands.setMaxTurnRate(newTurnRate); - } - - public void SetMaxVelocity(double newVelocity) - { - SetCall(); - if (Double.IsNaN(newVelocity)) - { - println("You cannot SetMaxVelocity to: " + newVelocity); - return; - } - commands.setMaxVelocity(newVelocity); - } - - // events manipulation - public void SetInterruptible(bool interruptable) - { - SetCall(); - eventManager.SetInterruptible(eventManager.CurrentTopEventPriority, interruptable); - } - - public void SetEventPriority(String eventClass, int priority) - { - SetCall(); - eventManager.SetEventPriority(eventClass, priority); - } - - public int GetEventPriority(String eventClass) - { - GetCall(); - return eventManager.GetEventPriority(eventClass); - } - - public void RemoveCustomEvent(Condition condition) - { - SetCall(); - eventManager.RemoveCustomEvent(condition); - } - - public void AddCustomEvent(Condition condition) - { - SetCall(); - eventManager.AddCustomEvent(condition); - } - - public void clearAllEvents() - { - SetCall(); - eventManager.ClearAllEvents(false); - } - - public IList GetAllEvents() - { - GetCall(); - return eventManager.GetAllEvents(); - } - - public IList GetStatusEvents() - { - GetCall(); - return eventManager.GetStatusEvents(); - } - - public IList GetBulletMissedEvents() - { - GetCall(); - return eventManager.GetBulletMissedEvents(); - } - - public IList GetBulletHitBulletEvents() - { - GetCall(); - return eventManager.GetBulletHitBulletEvents(); - } - - public IList GetBulletHitEvents() - { - GetCall(); - return eventManager.GetBulletHitEvents(); - } - - public IList GetHitByBulletEvents() - { - GetCall(); - return eventManager.GetHitByBulletEvents(); - } - - public IList GetHitRobotEvents() - { - GetCall(); - return eventManager.GetHitRobotEvents(); - } - - public IList GetHitWallEvents() - { - GetCall(); - return eventManager.GetHitWallEvents(); - } - - public IList GetRobotDeathEvents() - { - GetCall(); - return eventManager.GetRobotDeathEvents(); - } - - public IList GetScannedRobotEvents() - { - GetCall(); - return eventManager.GetScannedRobotEvents(); - } - - // data - public string GetDataDirectory() - { - GetCall(); - commands.setIORobot(); - return robotFileSystemManager.getWritableDirectory(); - } - - public Stream GetDataFile(string filename) - { - GetCall(); - commands.setIORobot(); - if (filename.Contains("..")) - { - throw new AccessViolationException("no relative path allowed"); - } - - return robotFileSystemManager.getDataFile(filename); - } - - public long GetDataQuotaAvailable() - { - GetCall(); - return robotFileSystemManager.getDataQuotaAvailable(); - } - - #endregion - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/BasicRobotProxy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/BasicRobotProxy.cs deleted file mode 100644 index 125e00c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/BasicRobotProxy.cs +++ /dev/null @@ -1,716 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Threading; -using net.sf.jni4net.nio; -using net.sf.robocode.dotnet.host.events; -using net.sf.robocode.dotnet.peer; -using net.sf.robocode.host; -using net.sf.robocode.io; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using net.sf.robocode.security; -using net.sf.robocode.serialization; -using Robocode; -using robocode.exception; -using Robocode.Exception; -using Robocode.RobotInterfaces.Peer; -using Robocode.Util; -using ByteBuffer = net.sf.robocode.nio.ByteBuffer; -using Thread = System.Threading.Thread; - -namespace net.sf.robocode.dotnet.host.proxies -{ - public class BasicRobotProxy : HostingRobotProxy, IBasicRobotPeer - { - private const long - MAX_SET_CALL_COUNT = 10000, - MAX_GET_CALL_COUNT = 10000; - - private GraphicsProxy graphicsProxy; - - private RobotStatus status; - private bool isDisabled; - protected ExecCommands commands; - private ExecResults execResults; - - private readonly Dictionary bullets = new Dictionary(); - private int bulletCounter; - - private int setCallCount; - private int getCallCount; - - protected Condition waitCondition; - private bool testingCondition; - private double firedEnergy; - private double firedHeat; - - private readonly DirectByteBuffer execJavaBuffer; - private readonly ByteBuffer execNetBuffer; - private readonly RbSerializerN rbSerializerN; - - public BasicRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) - : base(specification, hostManager, peer, statics) - { - eventManager = new EventManager(this); - - graphicsProxy = new GraphicsProxy(); - - // dummy - execResults = new ExecResults(null, null, null, null, null, false, false, false); - - setSetCallCount(0); - setGetCallCount(0); - - var sharedBuffer = new byte[10*1024*100]; - execJavaBuffer = new DirectByteBuffer(sharedBuffer); - execNetBuffer = ByteBuffer.wrap(sharedBuffer); - rbSerializerN = new RbSerializerN(); - this.peer.setupBuffer(execJavaBuffer); - } - - // asynchronous actions - - #region IBasicRobotPeer Members - - public Bullet SetFire(double power) - { - SetCall(); - return setFireImpl(power); - } - - // blocking actions - public void Execute() - { - executeImpl(); - } - - public void Move(double distance) - { - setMoveImpl(distance); - do - { - Execute(); // Always tick at least once - } while (GetDistanceRemaining() != 0); - } - - public void TurnBody(double radians) - { - setTurnBodyImpl(radians); - do - { - Execute(); // Always tick at least once - } while (GetBodyTurnRemaining() != 0); - } - - public void TurnGun(double radians) - { - setTurnGunImpl(radians); - do - { - Execute(); // Always tick at least once - } while (GetGunTurnRemaining() != 0); - } - - public Bullet Fire(double power) - { - Bullet bullet = SetFire(power); - - Execute(); - return bullet; - } - - // fast setters - public void SetBodyColor(Color color) - { - SetCall(); - commands.setBodyColor(color.ToArgb()); - } - - public Color GetBodyColor() - { - GetCall(); - return Color.FromArgb(commands.getBodyColor()); - } - - public void SetGunColor(Color color) - { - SetCall(); - commands.setGunColor(color.ToArgb()); - } - - public Color GetGunColor() - { - GetCall(); - return Color.FromArgb(commands.getGunColor()); - } - - public void SetRadarColor(Color color) - { - SetCall(); - commands.setRadarColor(color.ToArgb()); - } - - public Color GetRadarColor() - { - GetCall(); - return Color.FromArgb(commands.getRadarColor()); - } - - public void SetBulletColor(Color color) - { - SetCall(); - commands.setBulletColor(color.ToArgb()); - } - - public Color GetBulletColor() - { - GetCall(); - return Color.FromArgb(commands.getBulletColor()); - } - - public void SetScanColor(Color color) - { - SetCall(); - commands.setScanColor(color.ToArgb()); - } - - public Color GetScanColor() - { - GetCall(); - return Color.FromArgb(commands.getScanColor()); - } - - // counters - public void SetCall() - { - if (!isDisabled) - { - int res = Interlocked.Increment(ref setCallCount); - - if (res >= MAX_SET_CALL_COUNT) - { - isDisabled = true; - println("SYSTEM: You have made " + res + " calls to setXX methods without calling Execute()"); - throw new DisabledException("Too many calls to setXX methods"); - } - } - } - - public void GetCall() - { - if (!isDisabled) - { - int res = Interlocked.Increment(ref getCallCount); - - if (res >= MAX_GET_CALL_COUNT) - { - isDisabled = true; - println("SYSTEM: You have made " + res + " calls to getXX methods without calling Execute()"); - throw new DisabledException("Too many calls to getXX methods"); - } - } - } - - public double GetDistanceRemaining() - { - GetCall(); - return commands.getDistanceRemaining(); - } - - public double GetRadarTurnRemaining() - { - GetCall(); - return commands.getRadarTurnRemaining(); - } - - public double GetBodyTurnRemaining() - { - GetCall(); - return commands.getBodyTurnRemaining(); - } - - public double GetGunTurnRemaining() - { - GetCall(); - return commands.getGunTurnRemaining(); - } - - public double GetVelocity() - { - GetCall(); - return status.Velocity; - } - - public double GetGunCoolingRate() - { - GetCall(); - return statics.getBattleRules().GunCoolingRate; - } - - public String GetName() - { - GetCall(); - return statics.getName(); - } - - public long GetTime() - { - GetCall(); - return getTimeImpl(); - } - - public double GetBodyHeading() - { - GetCall(); - return status.HeadingRadians; - } - - public double GetGunHeading() - { - GetCall(); - return status.GunHeadingRadians; - } - - public double GetRadarHeading() - { - GetCall(); - return status.RadarHeadingRadians; - } - - public double GetEnergy() - { - GetCall(); - return getEnergyImpl(); - } - - public double GetGunHeat() - { - GetCall(); - return getGunHeatImpl(); - } - - public double GetX() - { - GetCall(); - return status.X; - } - - public double GetY() - { - GetCall(); - return status.Y; - } - - public int GetOthers() - { - GetCall(); - return status.Others; - } - - public int GetNumSentries() - { - GetCall(); - return status.NumSentries; - } - - public double GetBattleFieldHeight() - { - GetCall(); - return statics.getBattleRules().BattlefieldHeight; - } - - public double GetBattleFieldWidth() - { - GetCall(); - return statics.getBattleRules().BattlefieldWidth; - } - - public int GetNumRounds() - { - GetCall(); - return statics.getBattleRules().NumRounds; - } - - public int GetRoundNum() - { - GetCall(); - return status.RoundNum; - } - - public int GetSentryBorderSize() - { - GetCall(); - return statics.getBattleRules().SentryBorderSize; - } - - public IGraphics GetGraphics() - { - GetCall(); - commands.setTryingToPaint(true); - return getGraphicsImpl(); - } - - public void SetDebugProperty(String key, String value) - { - SetCall(); - commands.setDebugProperty(key, value); - } - - public void Rescan() - { - bool reset = false; - bool origInterruptableValue = false; - - if (eventManager.CurrentTopEventPriority == eventManager.ScannedRobotEventPriority) - { - reset = true; - origInterruptableValue = eventManager.IsInterruptible(eventManager.ScannedRobotEventPriority); - eventManager.SetInterruptible(eventManager.ScannedRobotEventPriority, true); - } - - commands.setScan(true); - executeImpl(); - - if (reset) - { - eventManager.SetInterruptible(eventManager.ScannedRobotEventPriority, origInterruptableValue); - } - } - - #endregion - - internal override void initializeRound(ExecCommands commands, RobotStatus status) - { - updateStatus(commands, status); - eventManager.Reset(); - var start = new StatusEvent(status); - - eventManager.Add(start); - setSetCallCount(0); - setGetCallCount(0); - } - - public override void cleanup() - { - base.cleanup(); - - // Cleanup and remove current wait condition - waitCondition = null; - - // Cleanup and remove the event manager - if (eventManager != null) - { - eventManager.Cleanup(); - eventManager = null; - } - - graphicsProxy = null; - execResults = null; - status = null; - commands = null; - } - - // ----------- - // implementations - // ----------- - - public long getTimeImpl() - { - return status.Time; - } - - public IGraphics getGraphicsImpl() - { - return graphicsProxy; - } - - protected override sealed void executeImpl() - { - if (execResults == null) - { - // this is to slow down undead robot after cleanup, from fast exception-loop - Thread.Sleep(1000); - } - - // Entering tick - if (testingCondition) - { - throw new RobotException( - "You cannot take action inside Condition.Test(). You should handle OnCustomEvent instead."); - } - - setSetCallCount(0); - setGetCallCount(0); - - // This stops autoscan from scanning... - if (waitCondition != null && waitCondition.Test()) - { - waitCondition = null; - commands.setScan(true); - } - - commands.setOutputText(GetOutTextAndReset()); - commands.setGraphicsCalls(graphicsProxy.readoutQueuedCalls()); - - // call server - SerializeCommands(); - peer.executeImplSerial(); - DeserializeResults(); - - if (execResults == null) - { - throw new InvalidOperationException(); - } - - updateStatus(execResults.getCommands(), execResults.getStatus()); - - graphicsProxy.setPaintingEnabled(execResults.isPaintEnabled()); - firedEnergy = 0; - firedHeat = 0; - - // add new events - eventManager.Add(new StatusEvent(execResults.getStatus())); - if (statics.IsPaintRobot() && execResults.isPaintEnabled()) - { - // Add paint event, if robot is a paint robot and its painting is enabled - eventManager.Add(new PaintEvent()); - } - - // add other events - if (execResults.getEvents() != null) - { - foreach (Event evnt in execResults.getEvents()) - { - eventManager.Add(evnt); - HiddenAccessN.UpdateBullets(evnt, bullets); - } - } - - if (execResults.getBulletUpdates() != null) - { - foreach (BulletStatus bulletStatus in execResults.getBulletUpdates()) - { - Bullet bullet; - if (bullets.TryGetValue(bulletStatus.bulletId, out bullet)) - { - HiddenAccessN.Update(bullet, bulletStatus.x, bulletStatus.y, bulletStatus.victimName, bulletStatus.isActive); - if (!bulletStatus.isActive) - { - bullets.Remove(bulletStatus.bulletId); - } - } - } - } - - // add new team messages - loadTeamMessages(execResults.getTeamMessages()); - - eventManager.ProcessEvents(); - } - - private string GetOutTextAndReset() - { - string res; - lock (output) - { - output.Flush(); - res = outputSb.ToString(); - outputSb.Length = 0; - } - return res; - } - - - private void SerializeCommands() - { - execNetBuffer.clear(); - rbSerializerN.serializeToBuffer(execNetBuffer, RbSerializerN.ExecCommands_TYPE, commands); - execJavaBuffer.Position(0); - execJavaBuffer.Limit(execNetBuffer.limit()); - } - - private void DeserializeResults() - { - execNetBuffer.position(0); - execNetBuffer.limit(execJavaBuffer.limit()); - execResults = (ExecResults) rbSerializerN.deserialize(execNetBuffer); - } - - protected override sealed void waitForBattleEndImpl() - { - eventManager.ClearAllEvents(false); - graphicsProxy.setPaintingEnabled(false); - do - { - commands.setOutputText(GetOutTextAndReset()); - commands.setGraphicsCalls(graphicsProxy.readoutQueuedCalls()); - - // call server - try - { - SerializeCommands(); - peer.waitForBattleEndImplSerial(); - DeserializeResults(); - } - catch (Exception ex) - { - LoggerN.logMessage(statics.getName() + ": Exception: " + ex); // without stack here - return; - } - - updateStatus(execResults.getCommands(), execResults.getStatus()); - - // add new events - if (execResults.getEvents() != null) - { - foreach (Event evnt in execResults.getEvents()) - { - if (evnt is BattleEndedEvent) - { - eventManager.Add(evnt); - } - } - } - eventManager.ResetCustomEvents(); - - eventManager.ProcessEvents(); - - } while (!execResults.isHalt() && execResults.isShouldWait()); - } - - private void updateStatus(ExecCommands commands, RobotStatus status) - { - this.status = status; - this.commands = commands; - } - - protected virtual void loadTeamMessages(List teamMessages) - { - } - - protected double getEnergyImpl() - { - return status.Energy - firedEnergy; - } - - protected double getGunHeatImpl() - { - return status.GunHeat + firedHeat; - } - - protected void setMoveImpl(double distance) - { - if (getEnergyImpl() == 0) - { - return; - } - commands.setDistanceRemaining(distance); - commands.setMoved(true); - } - - protected Bullet setFireImpl(double power) - { - if (Double.IsNaN(power)) - { - println("SYSTEM: You cannot call Fire(NaN)"); - return null; - } - if (getGunHeatImpl() > 0 || getEnergyImpl() == 0) - { - return null; - } - - power = Math.Min(getEnergyImpl(), Math.Min(Math.Max(power, Rules.MIN_BULLET_POWER), Rules.MAX_BULLET_POWER)); - - Bullet bullet; - BulletCommand wrapper; - Event currentTopEvent = eventManager.CurrentTopEvent; - - bulletCounter++; - - if (currentTopEvent != null && currentTopEvent.Time == status.Time && !statics.IsAdvancedRobot() - && status.GunHeadingRadians == status.RadarHeadingRadians - && typeof (ScannedRobotEvent).IsAssignableFrom(currentTopEvent.GetType())) - { - // this is angle assisted bullet - var e = (ScannedRobotEvent) currentTopEvent; - double fireAssistAngle = Utils.NormalAbsoluteAngle(status.HeadingRadians + e.BearingRadians); - - bullet = new Bullet(fireAssistAngle, GetX(), GetY(), power, statics.getName(), null, true, bulletCounter); - wrapper = new BulletCommand(power, true, fireAssistAngle, bulletCounter); - } - else - { - // this is normal bullet - bullet = new Bullet(status.GunHeadingRadians, GetX(), GetY(), power, statics.getName(), null, true, - bulletCounter); - wrapper = new BulletCommand(power, false, 0, bulletCounter); - } - - firedEnergy += power; - firedHeat += Rules.GetGunHeat(power); - - commands.getBullets().Add(wrapper); - - bullets.Add(bulletCounter, bullet); - - return bullet; - } - - protected void setTurnGunImpl(double radians) - { - commands.setGunTurnRemaining(radians); - } - - protected void setTurnBodyImpl(double radians) - { - if (getEnergyImpl() > 0) - { - commands.setBodyTurnRemaining(radians); - } - } - - protected void setTurnRadarImpl(double radians) - { - commands.setRadarTurnRemaining(radians); - } - - // ----------- - // battle driven methods - // ----------- - - private void setSetCallCount(int setCallCount) - { - this.setCallCount = setCallCount; - } - - private void setGetCallCount(int getCallCount) - { - this.getCallCount = getCallCount; - } - - // ----------- - // for robot thread - // ----------- - - public void setTestingCondition(bool testingCondition) - { - this.testingCondition = testingCondition; - } - - - public override String ToString() - { - return statics.getShortName() + "(" + (int) status.Energy + ") X" + (int) status.X + " Y" - + (int) status.Y; - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/GraphicsProxy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/GraphicsProxy.cs deleted file mode 100644 index b47450a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/GraphicsProxy.cs +++ /dev/null @@ -1,1284 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; -using Robocode; - -namespace net.sf.robocode.dotnet.host.proxies -{ - public class GraphicsProxy : IGraphics - { - private const int INITIAL_BUFFER_SIZE = 2*1024; - private const int MAX_BUFFER_SIZE = 64*1024; - - private readonly bool isDebugging; - private readonly RbSerializerN serializer = new RbSerializerN(); - private ByteBuffer calls; - private bool isPaintingEnabled; - private int unrecoveredBufferOverflowCount; - - public GraphicsProxy() - { - calls = ByteBuffer.allocate(INITIAL_BUFFER_SIZE); - calls.order(ByteOrder.LITTLE_ENDIAN); - calls.put(calls.order() == ByteOrder.BIG_ENDIAN ? (byte) 1 : (byte) 0); - isDebugging = java.lang.System.getProperty("debug", "false") == "true"; - } - - #region IGraphics Members - - public void DrawRectangle(Pen pen, RectangleF rect) - { - DrawRectangle(pen, (int) rect.X, (int) rect.Y, (int) rect.Width, (int) rect.Height); - } - - public void DrawRectangle(Pen pen, Rectangle rect) - { - DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height); - } - - public void DrawRectangle(Pen pen, float x, float y, float width, float height) - { - DrawRectangle(pen, (int) x, (int) y, (int) width, (int) height); - } - - public void DrawRectangle(Pen pen, int x, int y, int width, int height) - { - if (isPaintingEnabled) - { - setColor(pen); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_RECT); - put(x); - put(y); - put(width); - put(height); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - DrawRectangle(pen, x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void FillRectangle(Brush brush, RectangleF rect) - { - FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height); - } - - public void FillRectangle(Brush brush, float x, float y, float width, float height) - { - FillRectangle(brush, (int) x, (int) y, (int) width, (int) height); - } - - public void FillRectangle(Brush brush, Rectangle rect) - { - FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height); - } - - public void FillRectangle(Brush brush, int x, int y, int width, int height) - { - if (isPaintingEnabled) - { - setColor(brush); - calls.mark(); // Mark for rollback - try - { - put(Method.FILL_RECT); - put(x); - put(y); - put(width); - put(height); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - FillRectangle(brush, x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - - public void DrawEllipse(Pen pen, int x, int y, int width, int height) - { - if (isPaintingEnabled) - { - setColor(pen); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_OVAL); - put(x); - put(y); - put(width); - put(height); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - DrawEllipse(pen, x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void DrawEllipse(Pen pen, RectangleF rect) - { - DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height); - } - - public void DrawEllipse(Pen pen, float x, float y, float width, float height) - { - DrawEllipse(pen, (int) x, (int) y, (int) width, (int) height); - } - - public void DrawEllipse(Pen pen, Rectangle rect) - { - DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height); - } - - public void FillEllipse(Brush brush, int x, int y, int width, int height) - { - if (isPaintingEnabled) - { - setColor(brush); - calls.mark(); // Mark for rollback - try - { - put(Method.FILL_OVAL); - put(x); - put(y); - put(width); - put(height); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - FillEllipse(brush, x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void FillEllipse(Brush brush, RectangleF rect) - { - FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height); - } - - public void FillEllipse(Brush brush, float x, float y, float width, float height) - { - FillEllipse(brush, (int) x, (int) y, (int) width, (int) height); - } - - public void FillEllipse(Brush brush, Rectangle rect) - { - FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height); - } - - public void DrawLine(Pen pen, float x1, float y1, float x2, float y2) - { - DrawLine(pen, (int) x1, (int) y1, (int) x2, (int) y2); - } - - public void DrawLine(Pen pen, PointF pt1, PointF pt2) - { - DrawLine(pen, (int) pt1.X, (int) pt1.Y, (int) pt2.X, (int) pt2.Y); - } - - public void DrawLine(Pen pen, Point pt1, Point pt2) - { - DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y); - } - - public void DrawLine(Pen pen, int x1, int y1, int x2, int y2) - { - if (isPaintingEnabled) - { - setColor(pen); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_LINE); - put(x1); - put(y1); - put(x2); - put(y2); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - DrawLine(pen, x1, y1, x2, y2); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void DrawArc(Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle) - { - DrawArc(pen, (int) x, (int) y, (int) width, (int) height, (int) startAngle, (int) sweepAngle); - } - - public void DrawArc(Pen pen, RectangleF rect, float startAngle, float sweepAngle) - { - DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); - } - - public void DrawArc(Pen pen, Rectangle rect, float startAngle, float sweepAngle) - { - DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); - } - - public void DrawArc(Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle) - { - if (isPaintingEnabled) - { - setColor(pen); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_ARC); - put(x); - put(y); - put(width); - put(height); - put(startAngle); - put(sweepAngle); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - DrawArc(pen, x, y, width, height, startAngle, sweepAngle); - // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void DrawPie(Pen pen, RectangleF rect, float startAngle, float sweepAngle) - { - //for now redirected to arc, I wonder if java have Pie as well - DrawArc(pen, rect, startAngle, sweepAngle); - } - - public void DrawPie(Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle) - { - //for now redirected to arc, I wonder if java have Pie as well - DrawArc(pen, x, y, width, height, startAngle, sweepAngle); - } - - public void DrawPie(Pen pen, Rectangle rect, float startAngle, float sweepAngle) - { - //for now redirected to arc, I wonder if java have Pie as well - DrawArc(pen, rect, startAngle, sweepAngle); - } - - public void DrawPie(Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle) - { - //for now redirected to arc, I wonder if java have Pie as well - DrawArc(pen, x, y, width, height, startAngle, sweepAngle); - } - - public void FillPie(Brush brush, Rectangle rect, float startAngle, float sweepAngle) - { - FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); - } - - public void FillPie(Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle) - { - FillPie(brush, (int) x, (int) y, (int) width, (int) height, (int) startAngle, (int) sweepAngle); - } - - public void FillPie(Brush brush, int x, int y, int width, int height, int startAngle, int sweepAngle) - { - if (isPaintingEnabled) - { - setColor(brush); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_ARC); - put(x); - put(y); - put(width); - put(height); - put(startAngle); - put(sweepAngle); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - FillPie(brush, x, y, width, height, startAngle, sweepAngle); - // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void DrawPolygon(Pen pen, PointF[] points) - { - if (isPaintingEnabled) - { - int[] xPoints = new int[points.Length]; - int[] yPoints = new int[points.Length]; - for (int i = 0; i < points.Length; i++) - { - xPoints[i] = (int) points[i].X; - yPoints[i] = (int) points[i].Y; - } - setColor(pen); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_POLYGON); - put(xPoints); - put(yPoints); - put(points.Length); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - DrawPolygon(pen, points); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void DrawPolygon(Pen pen, Point[] points) - { - if (isPaintingEnabled) - { - int[] xPoints = new int[points.Length]; - int[] yPoints = new int[points.Length]; - for (int i = 0; i < points.Length; i++) - { - xPoints[i] = points[i].X; - yPoints[i] = points[i].Y; - } - setColor(pen); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_POLYGON); - put(xPoints); - put(yPoints); - put(points.Length); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - DrawPolygon(pen, points); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - - public void FillPolygon(Brush brush, PointF[] points) - { - if (isPaintingEnabled) - { - int[] xPoints = new int[points.Length]; - int[] yPoints = new int[points.Length]; - for (int i = 0; i < points.Length; i++) - { - xPoints[i] = (int) points[i].X; - yPoints[i] = (int) points[i].Y; - } - setColor(brush); - calls.mark(); // Mark for rollback - try - { - put(Method.FILL_POLYGON); - put(xPoints); - put(yPoints); - put(points.Length); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - FillPolygon(brush, points); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void FillPolygon(Brush brush, Point[] points) - { - if (isPaintingEnabled) - { - int[] xPoints = new int[points.Length]; - int[] yPoints = new int[points.Length]; - for (int i = 0; i < points.Length; i++) - { - xPoints[i] = points[i].X; - yPoints[i] = points[i].Y; - } - setColor(brush); - calls.mark(); // Mark for rollback - try - { - put(Method.FILL_POLYGON); - put(xPoints); - put(yPoints); - put(points.Length); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - FillPolygon(brush, points); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - public void DrawString(string s, Font font, Brush brush, float x, float y) - { - DrawString(s, font, brush, (int) x, (int) y); - } - - public void DrawString(string s, Font font, Brush brush, PointF point) - { - DrawString(s, font, brush, point.X, point.Y); - } - - public void DrawString(string s, Font font, Brush brush, Point point) - { - DrawString(s, font, brush, point.X, point.Y); - } - - public void DrawString(string s, Font font, Brush brush, int x, int y) - { - if (string.IsNullOrEmpty(s)) - { - return; - } - if (isPaintingEnabled) - { - setColor(brush); - calls.mark(); // Mark for rollback - try - { - put(Method.DRAW_STRING_INT); - put(s); - put(x); - put(y); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - DrawString(s, font, brush, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - #endregion - - #region TODO - /* - - public void FillPolygon(Brush brush, PointF[] points, FillMode fillMode) - { - throw new NotImplementedException(); - } - - public void FillPolygon(Brush brush, Point[] points, FillMode fillMode) - { - throw new NotImplementedException(); - } - - public void ResetTransform() - { - throw new NotImplementedException(); - } - - public void MultiplyTransform(Matrix matrix) - { - throw new NotImplementedException(); - } - - public void MultiplyTransform(Matrix matrix, MatrixOrder order) - { - throw new NotImplementedException(); - } - - public void TranslateTransform(float dx, float dy) - { - throw new NotImplementedException(); - } - - public void TranslateTransform(float dx, float dy, MatrixOrder order) - { - throw new NotImplementedException(); - } - - public void ScaleTransform(float sx, float sy) - { - throw new NotImplementedException(); - } - - public void ScaleTransform(float sx, float sy, MatrixOrder order) - { - throw new NotImplementedException(); - } - - public void RotateTransform(float angle) - { - throw new NotImplementedException(); - } - - public void RotateTransform(float angle, MatrixOrder order) - { - throw new NotImplementedException(); - } - - public void TransformPoints(CoordinateSpace destSpace, CoordinateSpace srcSpace, PointF[] pts) - { - throw new NotImplementedException(); - } - - public void TransformPoints(CoordinateSpace destSpace, CoordinateSpace srcSpace, Point[] pts) - { - throw new NotImplementedException(); - } - - public void DrawLines(Pen pen, PointF[] points) - { - throw new NotImplementedException(); - } - - public void DrawLines(Pen pen, Point[] points) - { - throw new NotImplementedException(); - } - - public void DrawRectangles(Pen pen, RectangleF[] rects) - { - throw new NotImplementedException(); - } - - public void DrawRectangles(Pen pen, Rectangle[] rects) - { - throw new NotImplementedException(); - } - - public void DrawPath(Pen pen, GraphicsPath path) - { - throw new NotImplementedException(); - } - - public void DrawCurve(Pen pen, PointF[] points) - { - throw new NotImplementedException(); - } - - public void DrawCurve(Pen pen, PointF[] points, float tension) - { - throw new NotImplementedException(); - } - - public void DrawCurve(Pen pen, PointF[] points, int offset, int numberOfSegments) - { - throw new NotImplementedException(); - } - - public void DrawCurve(Pen pen, PointF[] points, int offset, int numberOfSegments, float tension) - { - throw new NotImplementedException(); - } - - public void DrawCurve(Pen pen, Point[] points) - { - throw new NotImplementedException(); - } - - public void DrawCurve(Pen pen, Point[] points, float tension) - { - throw new NotImplementedException(); - } - - public void DrawCurve(Pen pen, Point[] points, int offset, int numberOfSegments, float tension) - { - throw new NotImplementedException(); - } - - public void DrawClosedCurve(Pen pen, PointF[] points) - { - throw new NotImplementedException(); - } - - public void DrawClosedCurve(Pen pen, PointF[] points, float tension, FillMode fillmode) - { - throw new NotImplementedException(); - } - - public void DrawClosedCurve(Pen pen, Point[] points) - { - throw new NotImplementedException(); - } - - public void DrawClosedCurve(Pen pen, Point[] points, float tension, FillMode fillmode) - { - throw new NotImplementedException(); - } - - public void FillRectangles(Brush brush, RectangleF[] rects) - { - throw new NotImplementedException(); - } - - public void FillRectangles(Brush brush, Rectangle[] rects) - { - throw new NotImplementedException(); - } - - public void FillPath(Brush brush, GraphicsPath path) - { - throw new NotImplementedException(); - } - - public void FillClosedCurve(Brush brush, PointF[] points) - { - throw new NotImplementedException(); - } - - public void FillClosedCurve(Brush brush, PointF[] points, FillMode fillmode) - { - throw new NotImplementedException(); - } - - public void FillClosedCurve(Brush brush, PointF[] points, FillMode fillmode, float tension) - { - throw new NotImplementedException(); - } - - public void FillClosedCurve(Brush brush, Point[] points) - { - throw new NotImplementedException(); - } - - public void FillClosedCurve(Brush brush, Point[] points, FillMode fillmode) - { - throw new NotImplementedException(); - } - - public void FillClosedCurve(Brush brush, Point[] points, FillMode fillmode, float tension) - { - throw new NotImplementedException(); - } - - public void FillRegion(Brush brush, Region region) - { - throw new NotImplementedException(); - } - - public void DrawString(string s, Font font, Brush brush, float x, float y, StringFormat format) - { - throw new NotImplementedException(); - } - - public void DrawString(string s, Font font, Brush brush, PointF point, StringFormat format) - { - throw new NotImplementedException(); - } - - public void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle) - { - throw new NotImplementedException(); - } - - public void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format) - { - throw new NotImplementedException(); - } - - public SizeF MeasureString(string text, Font font, SizeF layoutArea, StringFormat stringFormat, - out int charactersFitted, out int linesFilled) - { - throw new NotImplementedException(); - } - - public SizeF MeasureString(string text, Font font, PointF origin, StringFormat stringFormat) - { - throw new NotImplementedException(); - } - - public SizeF MeasureString(string text, Font font, SizeF layoutArea) - { - throw new NotImplementedException(); - } - - public SizeF MeasureString(string text, Font font, SizeF layoutArea, StringFormat stringFormat) - { - throw new NotImplementedException(); - } - - public SizeF MeasureString(string text, Font font) - { - throw new NotImplementedException(); - } - - public SizeF MeasureString(string text, Font font, int width) - { - throw new NotImplementedException(); - } - - public SizeF MeasureString(string text, Font font, int width, StringFormat format) - { - throw new NotImplementedException(); - } - - public Region[] MeasureCharacterRanges(string text, Font font, RectangleF layoutRect, StringFormat stringFormat) - { - throw new NotImplementedException(); - } - - public void SetClip(Graphics g) - { - throw new NotImplementedException(); - } - - public void SetClip(Graphics g, CombineMode combineMode) - { - throw new NotImplementedException(); - } - - public void SetClip(Rectangle rect) - { - throw new NotImplementedException(); - } - - public void SetClip(Rectangle rect, CombineMode combineMode) - { - throw new NotImplementedException(); - } - - public void SetClip(RectangleF rect) - { - throw new NotImplementedException(); - } - - public void SetClip(RectangleF rect, CombineMode combineMode) - { - throw new NotImplementedException(); - } - - public void SetClip(GraphicsPath path) - { - throw new NotImplementedException(); - } - - public void SetClip(GraphicsPath path, CombineMode combineMode) - { - throw new NotImplementedException(); - } - - public void SetClip(Region region, CombineMode combineMode) - { - throw new NotImplementedException(); - } - - public void IntersectClip(Rectangle rect) - { - throw new NotImplementedException(); - } - - public void IntersectClip(RectangleF rect) - { - throw new NotImplementedException(); - } - - public void IntersectClip(Region region) - { - throw new NotImplementedException(); - } - - public void ExcludeClip(Rectangle rect) - { - throw new NotImplementedException(); - } - - public void ExcludeClip(Region region) - { - throw new NotImplementedException(); - } - - public void ResetClip() - { - throw new NotImplementedException(); - } - - public void TranslateClip(float dx, float dy) - { - throw new NotImplementedException(); - } - - public void TranslateClip(int dx, int dy) - { - throw new NotImplementedException(); - } - - public bool IsVisible(int x, int y) - { - throw new NotImplementedException(); - } - - public bool IsVisible(Point point) - { - throw new NotImplementedException(); - } - - public bool IsVisible(float x, float y) - { - throw new NotImplementedException(); - } - - public bool IsVisible(PointF point) - { - throw new NotImplementedException(); - } - - public bool IsVisible(int x, int y, int width, int height) - { - throw new NotImplementedException(); - } - - public bool IsVisible(Rectangle rect) - { - throw new NotImplementedException(); - } - - public bool IsVisible(float x, float y, float width, float height) - { - throw new NotImplementedException(); - } - - public bool IsVisible(RectangleF rect) - { - throw new NotImplementedException(); - } - - public CompositingMode CompositingMode - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public Point RenderingOrigin - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public CompositingQuality CompositingQuality - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public TextRenderingHint TextRenderingHint - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public int TextContrast - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public SmoothingMode SmoothingMode - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public PixelOffsetMode PixelOffsetMode - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public InterpolationMode InterpolationMode - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public Matrix Transform - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public GraphicsUnit PageUnit - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public float PageScale - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public float DpiX - { - get { throw new NotImplementedException(); } - } - - public float DpiY - { - get { throw new NotImplementedException(); } - } - - public Region Clip - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public RectangleF ClipBounds - { - get { throw new NotImplementedException(); } - } - - public bool IsClipEmpty - { - get { throw new NotImplementedException(); } - } - - public RectangleF VisibleClipBounds - { - get { throw new NotImplementedException(); } - } - - public bool IsVisibleClipEmpty - { - get { throw new NotImplementedException(); } - } - */ - - #endregion - - #region Helpers - - public void setPaintingEnabled(bool value) - { - isPaintingEnabled = value; - } - - public byte[] readoutQueuedCalls() - { - if (calls == null || calls.position() == 0) - { - return null; - } - var res = new byte[calls.position()]; - - calls.flip(); - calls.get(res); - - calls.clear(); - calls.put(calls.order() == ByteOrder.BIG_ENDIAN ? (byte) 1 : (byte) 0); - - return res; - } - - private void setColor(Brush brush) - { - var sb = brush as SolidBrush; - if (sb != null) - { - setColor(sb.Color); - } - } - - private void setColor(Pen p) - { - setColor(p.Color); - } - - private void setColor(Color c) - { - if (isPaintingEnabled) - { - calls.mark(); // Mark for rollback - try - { - put(Method.SET_COLOR); - put(c); - } - catch (BufferOverflowException) - { - if (recoverFromBufferOverflow()) - { - setColor(c); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - - private bool reallocBuffer() - { - int bufferSize; - - if (calls == null) - { - // No buffer -> Use initial buffer size - bufferSize = INITIAL_BUFFER_SIZE; - } - else - { - // Otherwise, double up capacity - bufferSize = 2*calls.capacity(); - } - - // Check if the max. buffer size has been reached - if (!isDebugging && bufferSize > MAX_BUFFER_SIZE) - { - return false; // not reallocated! - } - - // Allocate new buffer - ByteBuffer newBuffer = ByteBuffer.allocate(bufferSize); -// newBuffer.order(ByteOrder.LITTLE_ENDIAN); - - if (calls != null) - { - // Copy all bytes contained in the current buffer to the new buffer - - var copiedBytes = new byte[calls.position()]; - - calls.clear(); - calls.get(copiedBytes); - - newBuffer.put(copiedBytes); - } - - // Switch to the new buffer - calls = newBuffer; - - return true; // buffer was reallocated - } - - private bool recoverFromBufferOverflow() - { - calls.reset(); // Rollback buffer - - bool recovered = reallocBuffer(); - - if (!recovered) - { - if (unrecoveredBufferOverflowCount++ == 1) - { - // Prevent spamming - java.lang.System.@out.println( - "SYSTEM: This robot is painting too much between actions.\n" - + "SYSTEM: Max. buffer capacity (" - + MAX_BUFFER_SIZE + " bytes per turn) has been reached.\n" - + "SYSTEM: Last painting operations are being dropped.\n"); - } - } - return recovered; - } - - private void put(Method m) - { - // FOR-DEBUG calls.putInt(0xBADF00D); - calls.put((byte) m); - // FOR-DEBUG calls.putInt(0xBADF00D); - } - - private void put(String value) - { - serializer.serialize(calls, value); - } - - private void put(bool value) - { - serializer.serialize(calls, value); - } - - private void put(byte value) - { - calls.put(value); - } - - private void put(int value) - { - calls.putInt(value); - } - - private void put(int[] values) - { - serializer.serialize(calls, values); - } - - private void put(byte[] values) - { - serializer.serialize(calls, values); - } - - private void put(char[] values) - { - serializer.serialize(calls, values); - } - - private void put(double[] values) - { - serializer.serialize(calls, values); - } - - private void put(float[] values) - { - serializer.serialize(calls, values); - } - - private void put(double value) - { - calls.putDouble(value); - } - - private void put(float value) - { - calls.putFloat(value); - } - - private void put(Color value) - { - if (value == null) - { - calls.put((byte)0); - } - else - { - calls.put((byte)1); - calls.putInt(value.ToArgb()); - } - } - - private void put(Font font) - { - if (font == null) - { - calls.put((byte)0); - } - else - { - calls.put((byte)1); - serializer.serialize(calls, font.Name); - calls.putInt((int)font.Style); - calls.putInt((int)font.Size); - } - } - - #endregion - - #region Nested type: Method - - private enum Method - { - TRANSLATE_INT, // translate(int, int) - SET_COLOR, // setColor(Color) - SET_PAINT_MODE, // setPaintMode() - SET_XOR_MODE, // setXORMode(Color) - SET_FONT, // setFont(Font) - CLIP_RECT, // clipRect(int, int, int, int) - SET_CLIP, // setClip(int, int, int, int) - SET_CLIP_SHAPE, // setClip(Shape) - COPY_AREA, // copyArea(int, int, int, int, int, int) - DRAW_LINE, // drawLine(int, int, int, int) - FILL_RECT, // fillRect(int, int, int, int) - DRAW_RECT, // drawRect(int, int, int, int) - CLEAR_RECT, // clearRect(int, int, int, int) - DRAW_ROUND_RECT, // drawRoundRect(int, int, int, int, int, int) - FILL_ROUND_RECT, // fillRoundRect(int, int, int, int, int, int) - DRAW_3D_RECT, // draw3DRect(int, int, int, int, boolean) - FILL_3D_RECT, // draw3DRect(int, int, int, int, boolean) - DRAW_OVAL, // drawOval(int, int, int, int) - FILL_OVAL, // fillOval(int, int, int, int) - DRAW_ARC, // drawArc(int, int, int, int, int, int) - FILL_ARC, // fillArc(int, int, int, int, int, int) - DRAW_POLYLINE, // drawPolyline(int[], int[], int) - DRAW_POLYGON, // drawPolygon(int[], int[], int) - FILL_POLYGON, // fillPolygon(int[], int[], int) - DRAW_STRING_INT, // drawString(String, int, int) - DRAW_STRING_ACI_INT, // drawString(AttributedCharacterIterator, int, int) - DRAW_CHARS, // drawChars(char[], int, int, int, int) - DRAW_BYTES, // drawBytes(byte[], int, int, int, int) - DRAW_IMAGE_1, // drawImage(Image, int, int, ImageObserver) - DRAW_IMAGE_2, // drawImage(Image, int, int, int, int, ImageObserver) - DRAW_IMAGE_3, // drawImage(Image, int, int, Color, ImageObserver) - DRAW_IMAGE_4, // drawImage(Image, int, int, int, int, Color, ImageObserver) - DRAW_IMAGE_5, // drawImage(Image, int, int, int, int, int, int, int, int, ImageObserver) - DRAW_IMAGE_6, // drawImage(Image, int, int, int, int, int, int, int, int, Color, ImageObserver) - DRAW_SHAPE, // draw(Shape) - DRAW_IMAGE_7, // drawImage(Image, AffineTransform, ImageObserver) - DRAW_IMAGE_8, // drawImage(BufferedImage, BufferedImageOp, int, int) - DRAW_RENDERED_IMAGE, // drawRenderedImage(RenderedImage, AffineTransform) - DRAW_RENDERABLE_IMAGE, // drawRenderableImage(RenderableImage, AffineTransform) - DRAW_STRING_FLOAT, // drawString(String, float, float) - DRAW_STRING_ACI_FLOAT, // drawString(AttributedCharacterIterator, float, float) - DRAW_GLYPH_VECTOR, // drawGlyphVector(GlyphVector gv, float x, float y) - FILL_SHAPE, // fill(Shape) - SET_COMPOSITE, // setComposite(Composite) - SET_PAINT, // setPaint(Paint) - SET_STROKE, // setStroke(Stroke) - SET_RENDERING_HINT, // setRenderingHint(Key, Object) - SET_RENDERING_HINTS, // setRenderingHints(Map) - ADD_RENDERING_HINTS, // addRenderingHints(Map) - TRANSLATE_DOUBLE, // translate(double, double) - ROTATE, // rotate(double) - ROTATE_XY, // rotate(double, double, double) - SCALE, // scale(double, double) - SHEAR, // shear(double, double) - TRANSFORM, // transform(AffineTransform) - SET_TRANSFORM, // setTransform(AffineTransform Tx) - SET_BACKGROUND, // setBackground(Color) - CLIP, // clip(Shape) - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/HostingRobotProxy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/HostingRobotProxy.cs deleted file mode 100644 index ecbb9a2..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/HostingRobotProxy.cs +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Security; -using System.Security.Permissions; -using java.io; -using java.lang; -using net.sf.robocode.dotnet.host.events; -using net.sf.robocode.dotnet.host.security; -using net.sf.robocode.dotnet.peer; -using net.sf.robocode.host; -using net.sf.robocode.io; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using Robocode; -using robocode.exception; -using Robocode.Exception; -using Robocode.RobotInterfaces; -using Robocode.RobotInterfaces.Peer; -using Exception = System.Exception; -using String = System.String; -using StringBuilder = System.Text.StringBuilder; - -namespace net.sf.robocode.dotnet.host.proxies -{ - public abstract class HostingRobotProxy - { - private readonly IRobotItem robotSpecification; - - protected EventManager eventManager; - protected IHostManager hostManager; - protected RobotFileSystemManager robotFileSystemManager; - - protected IBasicRobot robot; - protected IRobotPeer peer; - private Type robotType; - - protected RobotStatics statics; - protected TextWriter output; - protected StringBuilder outputSb; - - private readonly Hashtable securityViolations = Hashtable.Synchronized(new Hashtable()); - - protected HostingRobotProxy(IRobotItem robotSpecification, IHostManager hostManager, IRobotPeer peer, - RobotStatics statics) - { - this.peer = peer; - this.statics = statics; - this.hostManager = hostManager; - this.robotSpecification = robotSpecification; - - outputSb = new StringBuilder(5000); - output = TextWriter.Synchronized(new StringWriter(outputSb)); - LoggerN.robotOut = output; - - robotFileSystemManager = new RobotFileSystemManager(this, (int) hostManager.getRobotFilesystemQuota(), - robotSpecification.getWritableDirectory(), - robotSpecification.getReadableDirectory()); - } - - public void setRobotType(Type robotType) - { - this.robotType = robotType; - } - - public virtual void cleanup() - { - robot = null; - - // Remove the file system and the manager - robotFileSystemManager.cleanup(); - robotFileSystemManager = null; - } - - public TextWriter GetOut() - { - return output; - } - - public void println(String s) - { - output.WriteLine(s); - } - - public void println(Exception ex) - { - output.WriteLine(ex); - } - - public void println(java.lang.String par0) - { - output.WriteLine(par0); - } - - public RobotStatics getStatics() - { - return statics; - } - - public RobotFileSystemManager getRobotFileSystemManager() - { - return robotFileSystemManager; - } - - public ClassLoader getRobotClassloader() - { - return null; - } - - // ----------- - // battle driven methods - // ----------- - - internal abstract void initializeRound(ExecCommands commands, RobotStatus status); - - [ReflectionPermission(SecurityAction.Assert, Unrestricted = true)] - private bool loadRobotRound() - { - robot = null; - try - { - object instance = Activator.CreateInstance(robotType); - robot = instance as IBasicRobot; - if (robot == null) - { - println("SYSTEM: Skipping robot: " + statics.getName()); - return false; - } - robot.SetOut(output); - robot.SetPeer((IBasicRobotPeer) this); - Console.SetOut(output); - Console.SetError(output); - eventManager.SetRobot(robot); - } - - catch (MissingMethodException e) - { - punishSecurityViolation(statics.getName() + " " + e.Message); - return false; - } - catch (SecurityException e) - { - punishSecurityViolation(statics.getName() + " " + e.Message); - return false; - } - catch (Exception e) - { - if (e.InnerException is SecurityException) - { - - } - println("SYSTEM: An error occurred during initialization of " + statics.getName()); - println("SYSTEM: " + e); - println(e); - robot = null; - LoggerN.logMessage(e); - return false; - } - return true; - } - - protected abstract void executeImpl(); - - public void run() - { - peer.setRunning(true); - - if (robotSpecification.isValid() && loadRobotRound()) - { - try - { - if (robot != null) - { -// peer.setRunning(true); // Does not work with .NET version - - // Process all events for the first turn. - // This is done as the first robot status event must occur before the robot - // has started running. - eventManager.ProcessEvents(); - - // Call user code - CallUserCode(); - } - - // noinspection InfiniteLoopStatement - for (;;) - { - executeImpl(); - } - } - catch (WinException) - { - // Do nothing - } - catch (AbortedException) - { - // Do nothing - } - catch (DeathException) - { - println("SYSTEM: " + statics.getName() + " has died"); - } - catch (DisabledException e) - { - drainEnergy(); - - string msg = e.getMessage(); - if (msg == null) - { - msg = ""; - } - else - { - msg = ": " + msg; - } - println("SYSTEM: Robot disabled: " + msg); - LoggerN.logMessage("Robot disabled: " + statics.getName()); - } - catch (SecurityException e) - { - punishSecurityViolation(statics.getName() + " Exception: " + e); - } - catch (Exception e) - { - if (e.InnerException is SecurityException) - { - punishSecurityViolation(statics.getName() + " " + e.InnerException + " Exception: " + e); - } - else - { - drainEnergy(); - println(e); - LoggerN.logMessage(statics.getName() + ": Exception: " + e); // without stack here - } - } - finally - { - waitForBattleEndImpl(); - } - } - else - { - drainEnergy(); - peer.punishBadBehavior(BadBehavior.CANNOT_START); - waitForBattleEndImpl(); - } - - peer.setRunning(false); - } - - [SecurityPermission(SecurityAction.Deny)] - [ReflectionPermission(SecurityAction.Deny)] - [FileIOPermission(SecurityAction.Deny)] - [UIPermission(SecurityAction.Deny)] - private void CallUserCode() - { - IRunnable runnable = robot.GetRobotRunnable(); - - if (runnable != null) - { - runnable.Run(); - } - } - - protected abstract void waitForBattleEndImpl(); - - public void drainEnergy() - { - peer.drainEnergy(); - } - - public void punishSecurityViolation(java.lang.String message) - { - // Prevent unit tests of failing if multiple threads are calling this method in the same time. - // We only want the a specific type of security violation logged once so we only get one error - // per security violation. - lock (securityViolations) - { - if (!securityViolations.ContainsKey(message)) - { - securityViolations.Add(message, null); - LoggerN.logError(message); - println("SYSTEM: " + message); - - if (securityViolations.Count == 1) - { - peer.drainEnergy(); - peer.punishBadBehavior(BadBehavior.SECURITY_VIOLATION); - } - } - } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/JuniorRobotProxy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/JuniorRobotProxy.cs deleted file mode 100644 index c660779..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/JuniorRobotProxy.cs +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using net.sf.robocode.host; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using Robocode; -using Robocode.RobotInterfaces.Peer; -using Robocode.Util; - -namespace net.sf.robocode.dotnet.host.proxies -{ - internal class JuniorRobotProxy : BasicRobotProxy, IJuniorRobotPeer - { - public JuniorRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, - RobotStatics statics) - : base(specification, hostManager, peer, statics) - { - } - - #region IJuniorRobotPeer Members - - public void TurnAndMove(double distance, double radians) - { - if (distance == 0) - { - TurnBody(radians); - return; - } - - // Save current max. velocity and max. turn rate so they can be restored - double savedMaxVelocity = commands.getMaxVelocity(); - double savedMaxTurnRate = commands.getMaxTurnRate(); - - double absDegrees = Math.Abs(Utils.ToDegrees(radians)); - double absDistance = Math.Abs(distance); - - // -- Calculate max. velocity for moving perfect in a circle -- - - // maxTurnRate = 10 * 0.75 * velocity (Robocode rule), and - // maxTurnRate = velocity * degrees / distance (curve turn rate) - // - // Hence, max. velocity = 10 / (degrees / distance + 0.75) - - double maxVelocity = Math.Min(Rules.MAX_VELOCITY, 10/(absDegrees/absDistance + 0.75)); - - // -- Calculate number of turns for acceleration + deceleration -- - - double accDist = 0; // accumulated distance during acceleration - double decDist = 0; // accumulated distance during deceleration - - int turns = 0; // number of turns to it will take to move the distance - - // Calculate the amount of turn it will take to accelerate + decelerate - // up to the max. velocity, but stop if the distance for used for - // acceleration + deceleration gets bigger than the total distance to move - for (int t = 1; t < maxVelocity; t++) - { - // Add the current velocity to the acceleration distance - accDist += t; - - // Every 2nd time we add the deceleration distance needed to - // get to a velocity of 0 - if (t > 2 && (t%2) > 0) - { - decDist += t - 2; - } - - // Stop if the acceleration + deceleration > total distance to move - if ((accDist + decDist) >= absDistance) - { - break; - } - - // Increment turn for acceleration - turns++; - - // Every 2nd time we increment time for deceleration - if (t > 2 && (t%2) > 0) - { - turns++; - } - } - - // Add number of turns for the remaining distance at max velocity - if ((accDist + decDist) < absDistance) - { - turns += (int) ((absDistance - accDist - decDist)/maxVelocity + 1); - } - - // -- Move and turn in a curve -- - - // Set the calculated max. velocity - commands.setMaxVelocity(maxVelocity); - - // Set the robot to move the specified distance - setMoveImpl(distance); - // Set the robot to turn its body to the specified amount of radians - setTurnBodyImpl(radians); - - // Loop thru the number of turns it will take to move the distance and adjust - // the max. turn rate so it fit the current velocity of the robot - for (int t = turns; t >= 0; t--) - { - commands.setMaxTurnRate(GetVelocity()*radians/absDistance); - Execute(); // Perform next turn - } - - // Restore the saved max. velocity and max. turn rate - commands.setMaxVelocity(savedMaxVelocity); - commands.setMaxTurnRate(savedMaxTurnRate); - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/StandardRobotProxy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/StandardRobotProxy.cs deleted file mode 100644 index 13162aa..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/StandardRobotProxy.cs +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using net.sf.robocode.dotnet.peer; -using net.sf.robocode.host; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using Robocode; -using Robocode.RobotInterfaces.Peer; - -namespace net.sf.robocode.dotnet.host.proxies -{ - internal class StandardRobotProxy : BasicRobotProxy, IStandardRobotPeer - { - private bool isStopped; - private double saveAngleToTurn; - private double saveDistanceToGo; - private double saveGunAngleToTurn; - private double saveRadarAngleToTurn; - - public StandardRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, - RobotStatics statics) - : base(specification, hostManager, peer, statics) - { - } - - - // blocking actions - - #region IStandardRobotPeer Members - - public void Stop(bool overwrite) - { - setStopImpl(overwrite); - Execute(); - } - - public void Resume() - { - setResumeImpl(); - Execute(); - } - - public void TurnRadar(double radians) - { - setTurnRadarImpl(radians); - do - { - Execute(); // Always tick at least once - } while (GetRadarTurnRemaining() != 0); - } - - // fast setters - public void SetAdjustGunForBodyTurn(bool newAdjustGunForBodyTurn) - { - SetCall(); - commands.setAdjustGunForBodyTurn(newAdjustGunForBodyTurn); - } - - public void SetAdjustRadarForGunTurn(bool newAdjustRadarForGunTurn) - { - SetCall(); - commands.setAdjustRadarForGunTurn(newAdjustRadarForGunTurn); - if (!commands.IsAdjustRadarForBodyTurnSet()) - { - commands.setAdjustRadarForBodyTurn(newAdjustRadarForGunTurn); - } - } - - public void SetAdjustRadarForBodyTurn(bool newAdjustRadarForBodyTurn) - { - SetCall(); - commands.setAdjustRadarForBodyTurn(newAdjustRadarForBodyTurn); - commands.setAdjustRadarForBodyTurnSet(true); - } - - public bool IsAdjustGunForBodyTurn() - { - GetCall(); - return commands.IsAdjustGunForBodyTurn(); - } - - public bool IsAdjustRadarForGunTurn() - { - GetCall(); - return commands.IsAdjustRadarForGunTurn(); - } - - public bool IsAdjustRadarForBodyTurn() - { - GetCall(); - return commands.IsAdjustRadarForBodyTurn(); - } - - #endregion - - internal override void initializeRound(ExecCommands commands, RobotStatus status) - { - base.initializeRound(commands, status); - isStopped = true; - } - - protected void setResumeImpl() - { - if (isStopped) - { - isStopped = false; - commands.setDistanceRemaining(saveDistanceToGo); - commands.setBodyTurnRemaining(saveAngleToTurn); - commands.setGunTurnRemaining(saveGunAngleToTurn); - commands.setRadarTurnRemaining(saveRadarAngleToTurn); - } - } - - protected void setStopImpl(bool overwrite) - { - if (!isStopped || overwrite) - { - saveDistanceToGo = GetDistanceRemaining(); - saveAngleToTurn = GetBodyTurnRemaining(); - saveGunAngleToTurn = GetGunTurnRemaining(); - saveRadarAngleToTurn = GetRadarTurnRemaining(); - } - isStopped = true; - - commands.setDistanceRemaining(0); - commands.setBodyTurnRemaining(0); - commands.setGunTurnRemaining(0); - commands.setRadarTurnRemaining(0); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/TeamRobotProxy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/TeamRobotProxy.cs deleted file mode 100644 index 7215118..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/proxies/TeamRobotProxy.cs +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Formatters.Binary; -using System.Security.Permissions; -using net.sf.robocode.dotnet.peer; -using net.sf.robocode.host; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using Robocode; -using Robocode.RobotInterfaces.Peer; - -namespace net.sf.robocode.dotnet.host.proxies -{ - internal class TeamRobotProxy : AdvancedRobotProxy, ITeamRobotPeer - { - private const int MAX_MESSAGE_SIZE = 32768; - - public TeamRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, - RobotStatics statics) - : base(specification, hostManager, peer, statics) - { - } - - // team - - #region ITeamRobotPeer Members - - public string[] GetTeammates() - { - GetCall(); - return statics.getTeammates(); - } - - public bool IsTeammate(String name) - { - GetCall(); - if (name == statics.getName()) - { - return true; - } - String[] teammates = statics.getTeammates(); - - if (teammates != null) - { - foreach (string mate in teammates) - { - if (mate == name) - { - return true; - } - } - } - return false; - } - - public void BroadcastMessage(object message) - { - SendMessage(null, message); - } - - [SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.SerializationFormatter)] - public void SendMessage(String name, object message) - { - SetCall(); - - try - { - if (!statics.IsTeamRobot()) - { - throw new IOException("You are not on a team."); - } - using (var byteStreamWriter = new MemoryStream(MAX_MESSAGE_SIZE)) - { - var bf = new BinaryFormatter(new SerializationGuard(), new StreamingContext()); - bf.Serialize(byteStreamWriter, message); - byte[] bytes = byteStreamWriter.ToArray(); - commands.getTeamMessages().Add(new TeamMessage(GetName(), name, bytes)); - } - } - catch (Exception e) - { - output.WriteLine(e); - throw; - } - } - - // events - public IList GetMessageEvents() - { - GetCall(); - return eventManager.GetMessageEvents(); - } - - #endregion - - [SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.SerializationFormatter)] - protected override sealed void loadTeamMessages(List teamMessages) - { - if (teamMessages == null) - { - return; - } - foreach (TeamMessage teamMessage in teamMessages) - { - try - { - using (var ms = new MemoryStream(teamMessage.message)) - { - var bf = new BinaryFormatter(); - object message = bf.Deserialize(ms); - var evnt = new MessageEvent(teamMessage.sender, message); - - eventManager.Add(evnt); - } - } - catch (Exception e) - { - output.WriteLine(e); - } - } - } - - #region Nested type: SerializationGuard - - private class SerializationGuard : SurrogateSelector - { - public override ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, - out ISurrogateSelector selector) - { - if (typeof (MarshalByRefObject).IsAssignableFrom(type)) - { - throw new AccessViolationException("Messages should not contain MarshalByRefObject objects"); - } - return base.GetSurrogate(type, context, out selector); - } - } - - #endregion - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/QuotaStream.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/QuotaStream.cs deleted file mode 100644 index 96e9df0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/QuotaStream.cs +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.IO; -using System.Runtime.Remoting; -using System.Threading; -using Microsoft.Win32.SafeHandles; - -namespace net.sf.robocode.dotnet.host.security -{ - internal class QuotaStream : FileStream - { - private readonly RobotFileSystemManager manager; - - public QuotaStream(RobotFileSystemManager manager, String path, FileMode mode, FileAccess access, - FileShare share) - : base(path, mode, access, share) - { - this.manager = manager; - } - - [Obsolete] - public override IntPtr Handle - { - get { throw new AccessViolationException(); } - } - - public override SafeFileHandle SafeFileHandle - { - get { throw new AccessViolationException(); } - } - - public override void SetLength(long value) - { - manager.appendQuotaUsed(value - Length); - base.SetLength(value); - } - - public override void WriteByte(byte value) - { - long delta = Position + 1 - Length; - if (delta > 0) - { - manager.appendQuotaUsed(delta); - } - base.WriteByte(value); - } - - public override void Write(byte[] array, int offset, int count) - { - long delta = Position + count - Length; - if (delta > 0) - { - manager.appendQuotaUsed(delta); - } - base.Write(array, offset, count); - } - - public override IAsyncResult BeginWrite(byte[] array, int offset, int numBytes, AsyncCallback userCallback, - object stateObject) - { - long delta = Position + numBytes - Length; - if (delta > 0) - { - manager.appendQuotaUsed(delta); - } - return base.BeginWrite(array, offset, numBytes, userCallback, stateObject); - } - - /*public override long Position - { - get { return base.Position; } - set - { - base.Position = value; - } - } - - public override long Seek(long offset, SeekOrigin origin) - { - return base.Seek(offset, origin); - }*/ - - public override ObjRef CreateObjRef(Type requestedType) - { - throw new AccessViolationException(); - } - - [Obsolete] - protected override WaitHandle CreateWaitHandle() - { - throw new AccessViolationException(); - } - - public override object InitializeLifetimeService() - { - throw new AccessViolationException(); - } - - public override void Lock(long position, long length) - { - throw new AccessViolationException(); - } - - public override void Unlock(long position, long length) - { - throw new AccessViolationException(); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/RobotFileSystemManager.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/RobotFileSystemManager.cs deleted file mode 100644 index 15f456c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/security/RobotFileSystemManager.cs +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Collections.Generic; -using System.IO; -using System.Security.Permissions; -using net.sf.robocode.dotnet.host.proxies; -using net.sf.robocode.io; - -namespace net.sf.robocode.dotnet.host.security -{ - [FileIOPermission(SecurityAction.Assert, Unrestricted = true)] - public class RobotFileSystemManager - { - private long maxQuota; - private string readableRootDirectory; - private List streams = new List(); - private long usedQuota; - private string writableRootDirectory; - private HostingRobotProxy hostingProxy; - - public RobotFileSystemManager(HostingRobotProxy hostingProxy , int maxQuota, string writableRootDirectory, string readableRootDirectory) - { - this.hostingProxy = hostingProxy; - this.maxQuota = maxQuota; - this.writableRootDirectory = Path.GetFullPath(writableRootDirectory); - this.readableRootDirectory = Path.GetFullPath(readableRootDirectory); - - if (Directory.Exists(writableRootDirectory)) - { - var di = new DirectoryInfo(writableRootDirectory); - foreach (FileInfo file in di.GetFiles()) - { - usedQuota += file.Length; - } - } - } - - public long getMaxQuota() - { - return maxQuota; - } - - public long getQuotaUsed() - { - lock (this) - { - return usedQuota; - } - } - - public long appendQuotaUsed(long bytes) - { - lock (this) - { - if (usedQuota + bytes > maxQuota) - { - string message = "You have reached your filesystem quota: " + maxQuota + " bytes per robot."; - if (hostingProxy != null) - { - hostingProxy.punishSecurityViolation(message); - } - throw new AccessViolationException(message); - } - usedQuota += bytes; - return usedQuota; - } - } - - public long getDataQuotaAvailable() - { - return maxQuota - getQuotaUsed(); - } - - public Stream getDataFile(string filename) - { - lock (this) - { - if (Path.IsPathRooted(filename)) - { - filename = Path.GetFullPath(filename); - } - else - { - filename = Path.GetFullPath(Path.Combine(writableRootDirectory, Path.GetFileName(filename))); - } - if (Path.GetDirectoryName(filename).ToLower() != writableRootDirectory.ToLower()) - { - throw new AccessViolationException("Access is allowed only in " + writableRootDirectory + ". Use "); - } - if (!Directory.Exists(writableRootDirectory)) - { - Directory.CreateDirectory(writableRootDirectory); - } - var quotaStream = new QuotaStream(this, filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, - FileShare.ReadWrite); - streams.Add(quotaStream); - return quotaStream; - } - } - - public string getReadableDirectory() - { - return readableRootDirectory; - } - - public string getWritableDirectory() - { - return writableRootDirectory; - } - - public void cleanup() - { - foreach (QuotaStream stream in streams) - { - try - { - stream.Dispose(); - } - catch (Exception ex) - { - LoggerN.logError(ex); - } - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainSeed.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainSeed.cs deleted file mode 100644 index a5030dc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainSeed.cs +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using System.Reflection; -using System.Security; -using System.Security.Permissions; -using java.nio; -using net.sf.jni4net; -using net.sf.jni4net.jni; -using net.sf.jni4net.nio; -using net.sf.jni4net.utils; -using net.sf.robocode.dotnet.utils; -using net.sf.robocode.io; -using net.sf.robocode.repository; -using net.sf.robocode.serialization; -using Buffer = java.nio.Buffer; -using ByteBuffer = java.nio.ByteBuffer; -using Exception = System.Exception; -using StringBuilder = System.Text.StringBuilder; -using robocode.control; - -namespace net.sf.robocode.dotnet.host.seed -{ - [ReflectionPermission(SecurityAction.Assert, Unrestricted = true)] - [FileIOPermission(SecurityAction.Assert, Unrestricted = true)] - public class AppDomainSeed - { - protected static string robotAssemblyFileName; - protected static string robotAssemblyShadowFileName; - protected static AppDomain domain; - - public static void Load(string[] args) - { - try - { - domain = AppDomain.CurrentDomain; - domain.UnhandledException += (domain_UnhandledException); - domain.AssemblyLoad += (domain_AssemblyLoad); - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - static void domain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - LoggerN.logError(e.ExceptionObject.ToString()); - } - - static void domain_AssemblyLoad(object sender, AssemblyLoadEventArgs args) - { - bool knownLocation = args.LoadedAssembly.Location != null && - robotAssemblyShadowFileName != null && - Path.GetFullPath(args.LoadedAssembly.Location).ToLower() == - Path.GetFullPath(robotAssemblyShadowFileName).ToLower(); - if (args.LoadedAssembly != typeof(Bridge).Assembly && - args.LoadedAssembly != typeof(AppDomainSeed).Assembly && - args.LoadedAssembly != typeof(RobocodeEngine).Assembly && - !knownLocation && - !args.LoadedAssembly.GlobalAssemblyCache) - { - string message = "dependent assemblies are not alowed" + args.LoadedAssembly.Location; - LoggerN.logError(message); - throw new SecurityException(message); - } - } - - public static void Open() - { - try - { - robotAssemblyFileName = (string)domain.GetData("robotAssemblyFileName"); - robotAssemblyShadowFileName = (string)domain.GetData("robotAssemblyShadowFileName"); - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - public static void Bind() - { - try - { - bool fullBind = (bool)domain.GetData("fullBind"); - if (fullBind) - { - var setup = new BridgeSetup(false); - setup.BindCoreOnly = true; - setup.BindNative = false; - setup.BindStatic = false; - setup.JavaHome = (string)domain.GetData("JavaHome"); - Bridge.CreateJVM(setup); - JNIEnv env = JNIEnv.ThreadEnv; - Registry.RegisterType(typeof(ByteBuffer), true, env); - Registry.RegisterType(typeof(Buffer), true, env); - Registry.RegisterType(typeof(DirectByteBuffer), true, env); - Registry.RegisterType(typeof(java.lang.System), true, env); - Registry.RegisterType(typeof(ByteOrder), true, env); - Bridge.RegisterAssembly(typeof(RbSerializer).Assembly); - } - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - public static void FindRobots() - { - try - { - var sb = new StringBuilder(); - Assembly assembly = Assembly.LoadFrom(robotAssemblyShadowFileName); - foreach (Type type in assembly.GetTypes()) - { - if (Reflection.CheckInterfaces(type) != RobotTypeN.INVALID) - { - sb.Append("file://"); - sb.Append(robotAssemblyFileName); - sb.Append("!/"); - sb.Append(type.FullName); - sb.Append(";"); - } - } - if (sb.Length > 0) - { - sb.Length--; - } - domain.SetData("robotsFound", sb.ToString()); - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - - public static void GetRobotType() - { - try - { - var robotFullName = (string) domain.GetData("loadRobot"); - Assembly assembly = Assembly.LoadFrom(robotAssemblyShadowFileName); - Reflection.CheckAssembly(assembly); - Type robotType = assembly.GetType(robotFullName, false); - if (robotType != null) - { - domain.SetData("robotLoaded", (int)Reflection.CheckInterfaces(robotType)); - } - } - catch (Exception ex) - { - domain.SetData("robotLoaded", 0); - LoggerN.logError(ex); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainShell.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainShell.cs deleted file mode 100644 index 117db9e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/AppDomainShell.cs +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using System.Reflection; -using System.Security; -using System.Security.Permissions; -using System.Security.Policy; -using net.sf.jni4net; -using net.sf.robocode.dotnet.utils; -using net.sf.robocode.io; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using Robocode; -using robocode.control; - -namespace net.sf.robocode.dotnet.host.seed -{ - public class AppDomainShell : IDisposable - { - private static readonly Assembly robocodeAssembly = typeof (Robot).Assembly; - private static readonly Assembly controlAssembly = typeof (RobocodeEngine).Assembly; - private static readonly Assembly hostAssembly = typeof(AppDomainShell).Assembly; - private static readonly Assembly jniAssembly = typeof(Bridge).Assembly; - protected AppDomain domain; - private string robotAssemblyFileName; - protected IRobotPeer robotPeer; - private string robotShadow; - private string tempDir; - - #region IDisposable Members - - public void Dispose() - { - if (domain != null) - { - try - { - AppDomain.Unload(domain); - domain = null; - GC.Collect(); - } - catch (Exception ex) - { - LoggerN.logError(ex); - if (robotPeer != null) - { - robotPeer.punishBadBehavior(BadBehavior.UNSTOPPABLE); - } - } - } - if (tempDir != null && Directory.Exists(tempDir)) - { - try - { - Directory.Delete(tempDir, true); - } - catch (IOException) - { - //ignore - } - catch (UnauthorizedAccessException) - { - //ignore - } - tempDir = null; - } - } - - #endregion - - public void Init(bool fullBind) - { - string name = Path.GetRandomFileName(); - tempDir = Path.Combine(Path.GetTempPath(), name); - string robocodeShadow = Path.Combine(tempDir, Path.GetFileName(robocodeAssembly.Location)); - string hostShadow = Path.Combine(tempDir, Path.GetFileName(hostAssembly.Location)); - string controlShadow = Path.Combine(tempDir, Path.GetFileName(controlAssembly.Location)); - string jniShadow = Path.Combine(tempDir, Path.GetFileName(jniAssembly.Location)); - - Directory.CreateDirectory(tempDir); - File.Copy(robocodeAssembly.Location, robocodeShadow); - File.Copy(controlAssembly.Location, controlShadow); - File.Copy(hostAssembly.Location, hostShadow); - File.Copy(jniAssembly.Location, jniShadow); - - var trustAssemblies = new[] - { - Reflection.GetStrongName(robocodeAssembly), - Reflection.GetStrongName(controlAssembly), - Reflection.GetStrongName(hostAssembly), - Reflection.GetStrongName(jniAssembly), - }; - var domainSetup = new AppDomainSetup(); - Evidence securityInfo = AppDomain.CurrentDomain.Evidence; - var permissionSet = new PermissionSet(PermissionState.None); - permissionSet.AddPermission( - new SecurityPermission(SecurityPermissionFlag.Execution | SecurityPermissionFlag.Assertion)); - permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, tempDir)); - permissionSet.AddPermission(new UIPermission(PermissionState.None)); - //permissionSet.AddPermission(HostProtection); - - domainSetup.ApplicationBase = tempDir; - - domainSetup.ApplicationName = name; - //domainSetup.SandboxInterop = true; - domainSetup.DisallowBindingRedirects = true; - domainSetup.DisallowCodeDownload = true; - domainSetup.DisallowPublisherPolicy = true; - domainSetup.AppDomainInitializer = AppDomainSeed.Load; - - - domain = AppDomain.CreateDomain(name, securityInfo, domainSetup, permissionSet, trustAssemblies); - domain.SetData("fullBind", fullBind); - domain.SetData("JavaHome", Bridge.Setup.JavaHome); - domain.DoCallBack(AppDomainSeed.Bind); - } - - public void Open(string dllName) - { - robotAssemblyFileName = Path.GetFullPath(dllName); - robotShadow = Path.Combine(tempDir, Path.GetFileName(robotAssemblyFileName)); - if (!File.Exists(robotShadow)) - { - File.Copy(robotAssemblyFileName, robotShadow); - } - domain.SetData("robotAssemblyFileName", robotAssemblyFileName); - domain.SetData("robotAssemblyShadowFileName", robotShadow); - domain.DoCallBack(AppDomainSeed.Open); - } - - - public string[] FindRobots() - { - domain.DoCallBack(AppDomainSeed.FindRobots); - object data = domain.GetData("robotsFound"); - string[] robotsFound = data == null ? new string[] {} : ((string) data).Split(';'); - return robotsFound; - } - - public RobotType GetRobotType(string typeFullName) - { - domain.SetData("loadRobot", typeFullName); - domain.DoCallBack(AppDomainSeed.GetRobotType); - object data = domain.GetData("robotLoaded"); - if (data==null) - { - return RobotType.Invalid; - } - var type = (int) data; - if (type == 0) - { - return RobotType.Invalid; - } - return new RobotType(type); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingSeed.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingSeed.cs deleted file mode 100644 index b4e6c69..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingSeed.cs +++ /dev/null @@ -1,183 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Globalization; -using System.Reflection; -using System.Security.Permissions; -using System.Threading; -using net.sf.jni4net; -using net.sf.jni4net.jni; -using net.sf.jni4net.utils; -using net.sf.robocode.dotnet.host.proxies; -using net.sf.robocode.dotnet.nhost; -using net.sf.robocode.dotnet.peer; -using net.sf.robocode.dotnet.utils; -using net.sf.robocode.host; -using net.sf.robocode.io; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using net.sf.robocode.security; -using Robocode; -using Thread = System.Threading.Thread; - -namespace net.sf.robocode.dotnet.host.seed -{ - [ReflectionPermission(SecurityAction.Assert, Unrestricted = true)] - [FileIOPermission(SecurityAction.Assert, Unrestricted = true)] - [SecurityPermission(SecurityAction.Assert, Unrestricted = true)] - public class HostingSeed : AppDomainSeed - { - private static IHostManager hostManager; - private static IRobotPeer robotPeer; - private static RobotStatics statics; - private static IRobotItem specification; - private static Type robotType; - private static Thread robotThread; - private static HostingRobotProxy robotProxy; - - public static void Construct() - { - try - { - ModuleN.InitN(); - - JNIEnv env = JNIEnv.ThreadEnv; - JniGlobalHandle hmHandle = env.NewGlobalRef((JniHandle)domain.GetData("hostManager")); - JniGlobalHandle peerHandle = env.NewGlobalRef((JniHandle)domain.GetData("peer")); - JniGlobalHandle itemHandle = env.NewGlobalRef((JniHandle)domain.GetData("item")); - hostManager = Bridge.CreateProxy(hmHandle); - robotPeer = Bridge.CreateProxy(peerHandle); - specification = Bridge.CreateProxy(itemHandle); - - statics = ((RobotStatics)domain.GetData("statics")); - CreateProxy(); - - Assembly assembly = Assembly.LoadFrom(robotAssemblyShadowFileName); - Reflection.CheckAssembly(assembly); - string robotFullName = specification.getFullClassName(); - robotType = assembly.GetType(robotFullName, false); - robotProxy.setRobotType(robotType); - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - public static void StartRound() - { - try - { - var commands = (ExecCommands) domain.GetData("commands"); - var status = (RobotStatus) domain.GetData("status"); - - robotProxy.initializeRound(commands, status); - - robotThread = new Thread(RobotMain); - robotThread.CurrentCulture = CultureInfo.InvariantCulture; - robotThread.CurrentUICulture = CultureInfo.InvariantCulture; - robotThread.Start(null); - robotThread.Name = "Robot: "+robotProxy.getStatics().getName(); - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - private static void RobotMain(object param) - { - try - { - robotPeer.setupThread(); - robotProxy.run(); - } - catch(Exception ex) - { - robotProxy.println(ex); - } - finally - { - JNIEnv.ThreadEnv.GetJavaVM().DetachCurrentThread(); - } - } - - public static void ForceStopThread() - { - try - { - LoggerN.logMessage(HiddenAccessN.GetRobotName() + " is not stopping. Forcing a stop."); - robotThread.Priority = ThreadPriority.Lowest; - robotThread.Abort(); - robotThread.Interrupt(); - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - public static void WaitForStopThread() - { - try - { - if (!robotThread.Join(1000)) - { - LoggerN.logError("Unable to stop thread for "+statics.getName()); - robotPeer.punishBadBehavior(BadBehavior.UNSTOPPABLE); - robotPeer.setRunning(false); - } - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - public static void Cleanup() - { - try - { - robotProxy.cleanup(); - } - catch (Exception ex) - { - LoggerN.logError(ex); - throw; - } - } - - private static void CreateProxy() - { - if (specification.isTeamRobot()) - { - robotProxy = new TeamRobotProxy(specification, hostManager, robotPeer, statics); - } - else if (specification.isAdvancedRobot()) - { - robotProxy = new AdvancedRobotProxy(specification, hostManager, robotPeer, statics); - } - else if (specification.isStandardRobot()) - { - robotProxy = new StandardRobotProxy(specification, hostManager, robotPeer, statics); - } - else if (specification.isJuniorRobot()) - { - robotProxy = new JuniorRobotProxy(specification, hostManager, robotPeer, statics); - } - else - { - throw new AccessViolationException("Unknown robot type"); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingShell.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingShell.cs deleted file mode 100644 index 3495893..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/host/seed/HostingShell.cs +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using java.lang; -using net.sf.jni4net.jni; -using net.sf.jni4net.utils; -using net.sf.robocode.dotnet.peer; -using net.sf.robocode.host; -using net.sf.robocode.host.proxies; -using net.sf.robocode.peer; -using net.sf.robocode.repository; -using net.sf.robocode.serialization; -using Robocode; - -namespace net.sf.robocode.dotnet.host.seed -{ - public class HostingShell : AppDomainShell, IHostingRobotProxy - { - private readonly RbSerializer serializer = new RbSerializer(); - - public HostingShell(IRobotItem itemSpecification, - IHostManager hostManager, IRobotPeer peer, - IRobotStatics jstatics, string dllFileName) - { - robotPeer = peer; - - Init(true); - Open(dllFileName); - JniGlobalHandle hmHandle = ((IJvmProxy) hostManager).JvmHandle; - JniGlobalHandle peerhandle = ((IJvmProxy)peer).JvmHandle; - JniGlobalHandle itemHandle = ((IJvmProxy)itemSpecification).JvmHandle; - - domain.SetData("hostManager", hmHandle.DangerousGetHandle()); - domain.SetData("peer", peerhandle.DangerousGetHandle()); - domain.SetData("item", itemHandle.DangerousGetHandle()); - - var statics = serializer.ConvertJ2C(RbSerializerN.RobotStatics_TYPE, (Object) jstatics); - domain.SetData("statics", statics); - domain.SetData("robotName", statics.getName()); - try - { - domain.DoCallBack(HostingSeed.Construct); - } - catch (Exception) - { - robotPeer.punishBadBehavior(BadBehavior.SECURITY_VIOLATION); - } - - hmHandle.HoldThisHandle(); - peerhandle.HoldThisHandle(); - itemHandle.HoldThisHandle(); - } - - #region IHostingRobotProxy Members - - public void startRound(Object aCommands, Object aStatus) - { - var commands = serializer.ConvertJ2C(RbSerializerN.ExecCommands_TYPE, aCommands); - var status = serializer.ConvertJ2C(RbSerializerN.RobotStatus_TYPE, aStatus); - - domain.SetData("commands", commands); - domain.SetData("status", status); - domain.DoCallBack(HostingSeed.StartRound); - } - - public void forceStopThread() - { - domain.DoCallBack(HostingSeed.ForceStopThread); - } - - public void waitForStopThread() - { - domain.DoCallBack(HostingSeed.WaitForStopThread); - } - - public void cleanup() - { - domain.DoCallBack(HostingSeed.Cleanup); - Dispose(); - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/io/Logger.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/io/Logger.cs deleted file mode 100644 index 5e64e0a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/io/Logger.cs +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using java.lang; - -namespace net.sf.robocode.io -{ - partial class Logger : ILoggerN - { - public Logger(bool fakeInstance) - { - } - - #region ILoggerN Members - - public void logMessage(string s, bool newline) - { - logMessage((String) s, newline); - } - - public void logError(string s) - { - logError((String) s); - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/mono/reflection/CILReader.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/mono/reflection/CILReader.cs deleted file mode 100644 index c864bdc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/mono/reflection/CILReader.cs +++ /dev/null @@ -1,419 +0,0 @@ -// -// MethodBaseRocks.cs -// -// Author: -// Jb Evain (jbevain@novell.com) -// -// (C) 2009 Novell, Inc. (http://www.novell.com) -// -// 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. -// - -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Reflection.Emit; - -namespace Mono.Reflection -{ - public sealed class Instruction - { - private readonly int offset; - private OpCode opcode; - private object operand; - - public int Offset - { - get { return offset; } - } - - public OpCode OpCode - { - get { return opcode; } - } - - public object Operand - { - get { return operand; } - internal set { operand = value; } - } - - public Instruction Previous { get; internal set; } - - public Instruction Next { get; internal set; } - - internal Instruction(int offset, OpCode opcode) - { - this.offset = offset; - this.opcode = opcode; - } - - public int GetSize() - { - int size = opcode.Size; - - switch (opcode.OperandType) - { - case OperandType.InlineSwitch: - size += (1 + ((int[]) operand).Length)*4; - break; - case OperandType.InlineI8: - case OperandType.InlineR: - size += 8; - break; - case OperandType.InlineBrTarget: - case OperandType.InlineField: - case OperandType.InlineI: - case OperandType.InlineMethod: - case OperandType.InlineString: - case OperandType.InlineTok: - case OperandType.InlineType: - case OperandType.ShortInlineR: - size += 4; - break; - case OperandType.InlineVar: - size += 2; - break; - case OperandType.ShortInlineBrTarget: - case OperandType.ShortInlineI: - case OperandType.ShortInlineVar: - size += 1; - break; - } - - return size; - } - - public override string ToString() - { - return opcode.Name; - } - } - - internal class MethodBodyReader - { - private static readonly OpCode[] one_byte_opcodes; - private static readonly OpCode[] two_bytes_opcodes; - - static MethodBodyReader() - { - one_byte_opcodes = new OpCode[0xe1]; - two_bytes_opcodes = new OpCode[0x1f]; - - var fields = GetOpCodeFields(); - - foreach (FieldInfo t in fields) - { - var opcode = (OpCode) t.GetValue(null); - if (opcode.OpCodeType == OpCodeType.Nternal) - continue; - - if (opcode.Size == 1) - one_byte_opcodes[opcode.Value] = opcode; - else - two_bytes_opcodes[opcode.Value & 0xff] = opcode; - } - } - - private static IEnumerable GetOpCodeFields() - { - return typeof (OpCodes).GetFields(BindingFlags.Public | BindingFlags.Static); - } - - private class ByteBuffer - { - internal readonly byte[] buffer; - internal int position; - - public ByteBuffer(byte[] buffer) - { - this.buffer = buffer; - } - - public byte ReadByte() - { - CheckCanRead(1); - return buffer[position++]; - } - - private byte[] ReadBytes(int length) - { - CheckCanRead(length); - var value = new byte[length]; - Buffer.BlockCopy(buffer, position, value, 0, length); - position += length; - return value; - } - - public short ReadInt16() - { - CheckCanRead(2); - short value = (short) (buffer[position] - | (buffer[position + 1] << 8)); - position += 2; - return value; - } - - public int ReadInt32() - { - CheckCanRead(4); - int value = buffer[position] - | (buffer[position + 1] << 8) - | (buffer[position + 2] << 16) - | (buffer[position + 3] << 24); - position += 4; - return value; - } - - public long ReadInt64() - { - CheckCanRead(8); - uint low = (uint) (buffer[position] - | (buffer[position + 1] << 8) - | (buffer[position + 2] << 16) - | (buffer[position + 3] << 24)); - - uint high = (uint) (buffer[position + 4] - | (buffer[position + 5] << 8) - | (buffer[position + 6] << 16) - | (buffer[position + 7] << 24)); - - long value = (((long) high) << 32) | low; - position += 8; - return value; - } - - public float ReadSingle() - { - if (!BitConverter.IsLittleEndian) - { - var bytes = ReadBytes(4); - Array.Reverse(bytes); - return BitConverter.ToSingle(bytes, 0); - } - - CheckCanRead(4); - float value = BitConverter.ToSingle(buffer, position); - position += 4; - return value; - } - - public double ReadDouble() - { - if (!BitConverter.IsLittleEndian) - { - var bytes = ReadBytes(8); - Array.Reverse(bytes); - return BitConverter.ToDouble(bytes, 0); - } - - CheckCanRead(8); - double value = BitConverter.ToDouble(buffer, position); - position += 8; - return value; - } - - private void CheckCanRead(int count) - { - if (position + count > buffer.Length) - throw new ArgumentOutOfRangeException(); - } - } - - private readonly MethodBase method; - private readonly MethodBody body; - private readonly Module module; - private readonly Type[] generic_type_arguments; - private readonly Type[] method_arguments; - private readonly ByteBuffer il; - private readonly ParameterInfo[] parameters; - private readonly IList locals; - private readonly List instructions = new List(); - - private MethodBodyReader(MethodBase method, MethodBody mb) - { - this.method = method; - - body = mb; - if (body == null) - throw new ArgumentException(); - - var bytes = body.GetILAsByteArray(); - if (bytes == null) - throw new ArgumentException(); - - if (!(method is ConstructorInfo)) - method_arguments = method.GetGenericArguments(); - - if (method.DeclaringType != null) - generic_type_arguments = method.DeclaringType.GetGenericArguments(); - - parameters = method.GetParameters(); - locals = body.LocalVariables; - module = method.Module; - il = new ByteBuffer(bytes); - } - - private void ReadInstructions() - { - Instruction previous = null; - - while (il.position < il.buffer.Length) - { - var instruction = new Instruction(il.position, ReadOpCode()); - - ReadOperand(instruction); - - if (previous != null) - { - instruction.Previous = previous; - previous.Next = instruction; - } - - instructions.Add(instruction); - previous = instruction; - } - } - - private void ReadOperand(Instruction instruction) - { - switch (instruction.OpCode.OperandType) - { - case OperandType.InlineNone: - break; - case OperandType.InlineSwitch: - int length = il.ReadInt32(); - int[] branches = new int[length]; - int[] offsets = new int[length]; - for (int i = 0; i < length; i++) - offsets[i] = il.ReadInt32(); - for (int i = 0; i < length; i++) - branches[i] = il.position + offsets[i]; - - instruction.Operand = branches; - break; - case OperandType.ShortInlineBrTarget: - instruction.Operand = (sbyte) (il.ReadByte() + il.position); - break; - case OperandType.InlineBrTarget: - instruction.Operand = il.ReadInt32() + il.position; - break; - case OperandType.ShortInlineI: - if (instruction.OpCode == OpCodes.Ldc_I4_S) - instruction.Operand = (sbyte) il.ReadByte(); - else - instruction.Operand = il.ReadByte(); - break; - case OperandType.InlineI: - instruction.Operand = il.ReadInt32(); - break; - case OperandType.ShortInlineR: - instruction.Operand = il.ReadSingle(); - break; - case OperandType.InlineR: - instruction.Operand = il.ReadDouble(); - break; - case OperandType.InlineI8: - instruction.Operand = il.ReadInt64(); - break; - case OperandType.InlineSig: - byte[] resolveSignature = module.ResolveSignature(il.ReadInt32()); - instruction.Operand = resolveSignature; - break; - case OperandType.InlineString: - string resolveString = module.ResolveString(il.ReadInt32()); - instruction.Operand = resolveString; - break; - case OperandType.InlineTok: - MemberInfo resolveMember = module.ResolveMember(il.ReadInt32(), generic_type_arguments, method_arguments); - instruction.Operand = resolveMember; - break; - case OperandType.InlineType: - Type resolveType = module.ResolveType(il.ReadInt32(), generic_type_arguments, method_arguments); - instruction.Operand = resolveType; - break; - case OperandType.InlineMethod: - MethodBase resolveMethod = module.ResolveMethod(il.ReadInt32(), generic_type_arguments, method_arguments); - instruction.Operand = resolveMethod; - break; - case OperandType.InlineField: - FieldInfo resolveField = module.ResolveField(il.ReadInt32(), generic_type_arguments, method_arguments); - instruction.Operand = resolveField; - break; - case OperandType.ShortInlineVar: - object variable = GetVariable(instruction, il.ReadByte()); - instruction.Operand = variable; - break; - case OperandType.InlineVar: - object operand = GetVariable(instruction, il.ReadInt16()); - instruction.Operand = operand; - break; - default: - throw new NotSupportedException(); - } - } - - private object GetVariable(Instruction instruction, int index) - { - if (TargetsLocalVariable(instruction.OpCode)) - return GetLocalVariable(index); - return GetParameter(index); - } - - private static bool TargetsLocalVariable(OpCode opcode) - { - return opcode.Name.Contains("loc"); - } - - private LocalVariableInfo GetLocalVariable(int index) - { - return locals[index]; - } - - private ParameterInfo GetParameter(int index) - { - if (!method.IsStatic) - index--; - - return parameters[index]; - } - - private OpCode ReadOpCode() - { - byte op = il.ReadByte(); - return op != 0xfe - ? one_byte_opcodes[op] - : two_bytes_opcodes[il.ReadByte()]; - } - - public static IList GetInstructions(MethodBase method) - { - var mb = method.GetMethodBody(); - if (mb == null) - { - return new List(); - } - var reader = new MethodBodyReader(method, mb); - reader.ReadInstructions(); - return reader.instructions; - } - - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletCommand.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletCommand.cs deleted file mode 100644 index 5784e15..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletCommand.cs +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; - -namespace net.sf.robocode.dotnet.peer -{ - [Serializable] - public class BulletCommand - { - private readonly int bulletId; - private readonly double fireAssistAngle; - private readonly bool fireAssistValid; - private readonly double power; - - public BulletCommand(double power, bool fireAssistValid, double fireAssistAngle, int bulletId) - { - this.fireAssistValid = fireAssistValid; - this.fireAssistAngle = fireAssistAngle; - this.bulletId = bulletId; - this.power = power; - } - - public bool isFireAssistValid() - { - return fireAssistValid; - } - - public int getBulletId() - { - return bulletId; - } - - public double getPower() - { - return power; - } - - public double getFireAssistAngle() - { - return fireAssistAngle; - } - - // ReSharper disable UnusedMember.Local - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - #region Nested type: SerializableHelper - - private class SerializableHelper : ISerializableHelperN - { - #region ISerializableHelperN Members - - public int sizeOf(RbSerializerN serializer, Object obje) - { - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_DOUBLE + RbSerializerN.SIZEOF_BOOL - + RbSerializerN.SIZEOF_DOUBLE + RbSerializerN.SIZEOF_INT; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, Object obje) - { - var obj = (BulletCommand) obje; - - serializer.serialize(buffer, obj.power); - serializer.serialize(buffer, obj.fireAssistValid); - serializer.serialize(buffer, obj.fireAssistAngle); - serializer.serialize(buffer, obj.bulletId); - } - - public Object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - double power = buffer.getDouble(); - bool fireAssistValid = serializer.deserializeBoolean(buffer); - double fireAssistAngle = buffer.getDouble(); - int bulletId = buffer.getInt(); - - return new BulletCommand(power, fireAssistValid, fireAssistAngle, bulletId); - } - - #endregion - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletStatus.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletStatus.cs deleted file mode 100644 index fa25dd9..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/BulletStatus.cs +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; - -namespace net.sf.robocode.dotnet.peer -{ - public class BulletStatus - { - public readonly int bulletId; - public readonly bool isActive; - public readonly String victimName; - public readonly double x; - public readonly double y; - - public BulletStatus(int bulletId, double x, double y, String victimName, bool isActive) - { - this.bulletId = bulletId; - this.x = x; - this.y = y; - this.isActive = isActive; - this.victimName = victimName; - } - - // ReSharper disable UnusedMember.Local - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - #region Nested type: SerializableHelper - - private class SerializableHelper : ISerializableHelperN - { - #region ISerializableHelperN Members - - public int sizeOf(RbSerializerN serializer, Object obje) - { - var obj = (BulletStatus) obje; - - return RbSerializerN.SIZEOF_TYPEINFO + RbSerializerN.SIZEOF_INT + serializer.sizeOf(obj.victimName) - + RbSerializerN.SIZEOF_BOOL + 2*RbSerializerN.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, Object obje) - { - var obj = (BulletStatus) obje; - - serializer.serialize(buffer, obj.bulletId); - serializer.serialize(buffer, obj.victimName); - serializer.serialize(buffer, obj.isActive); - serializer.serialize(buffer, obj.x); - serializer.serialize(buffer, obj.y); - } - - public Object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - int bulletId = buffer.getInt(); - String victimName = serializer.deserializeString(buffer); - bool isActive = serializer.deserializeBoolean(buffer); - double x = buffer.getDouble(); - double y = buffer.getDouble(); - - return new BulletStatus(bulletId, x, y, victimName, isActive); - } - - #endregion - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/DebugProperty.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/DebugProperty.cs deleted file mode 100644 index 4366913..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/DebugProperty.cs +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; - -namespace net.sf.robocode.dotnet.peer -{ - [Serializable] - public class DebugProperty - { - private String key; - private String value; - - public DebugProperty() - { - } - - public DebugProperty(String key, String value) - { - setKey(key); - setValue(value); - } - - - public String getKey() - { - return key; - } - - public void setKey(String key) - { - this.key = key; - } - - public String getValue() - { - return value; - } - - public void setValue(String value) - { - this.value = value; - } - - // ReSharper disable UnusedMember.Local - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - #region Nested type: SerializableHelper - - private class SerializableHelper : ISerializableHelperN - { - #region ISerializableHelperN Members - - public int sizeOf(RbSerializerN serializer, Object obje) - { - var obj = (DebugProperty) obje; - - return RbSerializerN.SIZEOF_TYPEINFO + serializer.sizeOf(obj.key) + serializer.sizeOf(obj.value); - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, Object obje) - { - var obj = (DebugProperty) obje; - - serializer.serialize(buffer, obj.key); - serializer.serialize(buffer, obj.value); - } - - public Object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - String key = serializer.deserializeString(buffer); - String value = serializer.deserializeString(buffer); - - return new DebugProperty(key, value); - } - - #endregion - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecCommands.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecCommands.cs deleted file mode 100644 index 263357e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecCommands.cs +++ /dev/null @@ -1,490 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; -using Robocode; - -namespace net.sf.robocode.dotnet.peer -{ - [Serializable] - public class ExecCommands - { - public const int defaultBodyColor = 0; //0xFF29298C; - public const int defaultGunColor = 0; //0xFF29298C; - public const int defaultRadarColor = 0; //0xFF29298C; - public const int defaultScanColor = 0; //0xFF0000FF; - public const int defaultBulletColor = 0; //0xFFFFFFFF; - private int bodyColor = defaultBodyColor; - - private double bodyTurnRemaining; - private int bulletColor = defaultBulletColor; - private List bullets = new List(); - private List debugProperties = new List(); - private double distanceRemaining; - [NonSerialized] private byte[] graphicsCalls; - private int gunColor = defaultGunColor; - private double gunTurnRemaining; - - private bool isAdjustGunForBodyTurn; - private bool isAdjustRadarForBodyTurn; - private bool isAdjustRadarForBodyTurnSet; - private bool isAdjustRadarForGunTurn; - private bool isIORobot; - private bool isTryingToPaint; - - private double maxTurnRate; - private double maxVelocity; - - private bool moved; - private String outputText; - private int radarColor = defaultRadarColor; - private double radarTurnRemaining; - private bool scan; - private int scanColor = defaultScanColor; - private List teamMessages = new List(); - - public ExecCommands() - { - setMaxVelocity(Double.MaxValue); - setMaxTurnRate(Double.MaxValue); - } - - public ExecCommands(ExecCommands origin, bool fromRobot) - { - bodyTurnRemaining = origin.bodyTurnRemaining; - radarTurnRemaining = origin.radarTurnRemaining; - gunTurnRemaining = origin.gunTurnRemaining; - distanceRemaining = origin.distanceRemaining; - isAdjustGunForBodyTurn = origin.isAdjustGunForBodyTurn; - isAdjustRadarForGunTurn = origin.isAdjustRadarForGunTurn; - isAdjustRadarForBodyTurn = origin.isAdjustRadarForBodyTurn; - isAdjustRadarForBodyTurnSet = origin.isAdjustRadarForBodyTurnSet; - maxTurnRate = origin.maxTurnRate; - maxVelocity = origin.maxVelocity; - copyColors(origin); - if (fromRobot) - { - debugProperties = origin.debugProperties; - bullets = origin.bullets; - scan = origin.scan; - moved = origin.moved; - graphicsCalls = origin.graphicsCalls; - outputText = origin.outputText; - teamMessages = origin.teamMessages; - isTryingToPaint = origin.isTryingToPaint; - } - } - - public void copyColors(ExecCommands origin) - { - if (origin != null) - { - bodyColor = origin.bodyColor; - gunColor = origin.gunColor; - radarColor = origin.radarColor; - bulletColor = origin.bulletColor; - scanColor = origin.scanColor; - } - } - - public int getBodyColor() - { - return bodyColor; - } - - public int getRadarColor() - { - return radarColor; - } - - public int getGunColor() - { - return gunColor; - } - - public int getBulletColor() - { - return bulletColor; - } - - public int getScanColor() - { - return scanColor; - } - - public void setBodyColor(int color) - { - bodyColor = color; - } - - public void setRadarColor(int color) - { - radarColor = color; - } - - public void setGunColor(int color) - { - gunColor = color; - } - - public void setBulletColor(int color) - { - bulletColor = color; - } - - public void setScanColor(int color) - { - scanColor = color; - } - - public double getBodyTurnRemaining() - { - return bodyTurnRemaining; - } - - public void setBodyTurnRemaining(double bodyTurnRemaining) - { - this.bodyTurnRemaining = bodyTurnRemaining; - } - - public double getRadarTurnRemaining() - { - return radarTurnRemaining; - } - - public void setRadarTurnRemaining(double radarTurnRemaining) - { - this.radarTurnRemaining = radarTurnRemaining; - } - - public double getGunTurnRemaining() - { - return gunTurnRemaining; - } - - public void setGunTurnRemaining(double gunTurnRemaining) - { - this.gunTurnRemaining = gunTurnRemaining; - } - - public double getDistanceRemaining() - { - return distanceRemaining; - } - - public void setDistanceRemaining(double distanceRemaining) - { - this.distanceRemaining = distanceRemaining; - } - - public bool IsAdjustGunForBodyTurn() - { - return isAdjustGunForBodyTurn; - } - - public void setAdjustGunForBodyTurn(bool adjustGunForBodyTurn) - { - isAdjustGunForBodyTurn = adjustGunForBodyTurn; - } - - public bool IsAdjustRadarForGunTurn() - { - return isAdjustRadarForGunTurn; - } - - public void setAdjustRadarForGunTurn(bool adjustRadarForGunTurn) - { - isAdjustRadarForGunTurn = adjustRadarForGunTurn; - } - - public bool IsAdjustRadarForBodyTurn() - { - return isAdjustRadarForBodyTurn; - } - - public void setAdjustRadarForBodyTurn(bool adjustRadarForBodyTurn) - { - isAdjustRadarForBodyTurn = adjustRadarForBodyTurn; - } - - public bool IsAdjustRadarForBodyTurnSet() - { - return isAdjustRadarForBodyTurnSet; - } - - public void setAdjustRadarForBodyTurnSet(bool adjustRadarForBodyTurnSet) - { - isAdjustRadarForBodyTurnSet = adjustRadarForBodyTurnSet; - } - - public double getMaxTurnRate() - { - return maxTurnRate; - } - - public void setMaxTurnRate(double maxTurnRate) - { - this.maxTurnRate = Math.Min(Math.Abs(maxTurnRate), Rules.MAX_TURN_RATE_RADIANS); - } - - public double getMaxVelocity() - { - return maxVelocity; - } - - public void setMaxVelocity(double maxVelocity) - { - this.maxVelocity = Math.Min(Math.Abs(maxVelocity), Rules.MAX_VELOCITY); - } - - public bool isMoved() - { - return moved; - } - - public void setMoved(bool moved) - { - this.moved = moved; - } - - public bool isScan() - { - return scan; - } - - public void setScan(bool scan) - { - this.scan = scan; - } - - public List getBullets() - { - return bullets; - } - - public Object getGraphicsCalls() - { - return graphicsCalls; - } - - public List getDebugProperties() - { - return debugProperties; - } - - public void setGraphicsCalls(byte[] graphicsCalls) - { - this.graphicsCalls = graphicsCalls; - } - - public string getOutputText() - { - return outputText; - } - - public void setOutputText(string output) - { - outputText = string.IsNullOrEmpty(output) ? null : output; - } - - public List getTeamMessages() - { - return teamMessages; - } - - public bool IsIORobot() - { - return isIORobot; - } - - public void setIORobot() - { - isIORobot = true; - } - - public void setDebugProperty(String key, String value) - { - debugProperties.Add(new DebugProperty(key, value)); - } - - public bool IsTryingToPaint() - { - return isTryingToPaint; - } - - public void setTryingToPaint(bool tryingToPaint) - { - isTryingToPaint = tryingToPaint; - } - - // ReSharper disable UnusedMember.Local - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - #region Nested type: SerializableHelper - - private class SerializableHelper : ISerializableHelperN - { - #region ISerializableHelperN Members - - public int sizeOf(RbSerializerN serializer, Object obje) - { - var obj = (ExecCommands) obje; - int size = RbSerializerN.SIZEOF_TYPEINFO + 4*RbSerializerN.SIZEOF_DOUBLE; - - size += 4*RbSerializerN.SIZEOF_BOOL; - size += 5*RbSerializerN.SIZEOF_INT; - size += 2*RbSerializerN.SIZEOF_DOUBLE; - size += 4*RbSerializerN.SIZEOF_BOOL; - size += serializer.sizeOf(obj.outputText); - - size += serializer.sizeOf(obj.graphicsCalls); - - // bullets - size += obj.bullets.Count*serializer.sizeOf(RbSerializerN.BulletCommand_TYPE, null); - size += 1; - - // messages - foreach (TeamMessage m in obj.teamMessages) - { - size += serializer.sizeOf(RbSerializerN.TeamMessage_TYPE, m); - } - size += 1; - - // properties - foreach (DebugProperty d in obj.debugProperties) - { - size += serializer.sizeOf(RbSerializerN.DebugProperty_TYPE, d); - } - size += 1; - - return size; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, Object obje) - { - var obj = (ExecCommands) obje; - - serializer.serialize(buffer, obj.bodyTurnRemaining); - serializer.serialize(buffer, obj.radarTurnRemaining); - serializer.serialize(buffer, obj.gunTurnRemaining); - serializer.serialize(buffer, obj.distanceRemaining); - - serializer.serialize(buffer, obj.isAdjustGunForBodyTurn); - serializer.serialize(buffer, obj.isAdjustRadarForGunTurn); - serializer.serialize(buffer, obj.isAdjustRadarForBodyTurn); - serializer.serialize(buffer, obj.isAdjustRadarForBodyTurnSet); - - serializer.serialize(buffer, obj.bodyColor); - serializer.serialize(buffer, obj.gunColor); - serializer.serialize(buffer, obj.radarColor); - serializer.serialize(buffer, obj.scanColor); - serializer.serialize(buffer, obj.bulletColor); - - serializer.serialize(buffer, obj.maxTurnRate); - serializer.serialize(buffer, obj.maxVelocity); - - serializer.serialize(buffer, obj.moved); - serializer.serialize(buffer, obj.scan); - serializer.serialize(buffer, obj.isIORobot); - serializer.serialize(buffer, obj.isTryingToPaint); - - serializer.serialize(buffer, obj.outputText); - - serializer.serialize(buffer, obj.graphicsCalls); - - foreach (BulletCommand bullet in obj.bullets) - { - serializer.serialize(buffer, RbSerializerN.BulletCommand_TYPE, bullet); - } - buffer.put(RbSerializerN.TERMINATOR_TYPE); - foreach (TeamMessage message in obj.teamMessages) - { - serializer.serialize(buffer, RbSerializerN.TeamMessage_TYPE, message); - } - buffer.put(RbSerializerN.TERMINATOR_TYPE); - foreach (DebugProperty prop in obj.debugProperties) - { - serializer.serialize(buffer, RbSerializerN.DebugProperty_TYPE, prop); - } - buffer.put(RbSerializerN.TERMINATOR_TYPE); - } - - public Object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - var res = new ExecCommands(); - - res.bodyTurnRemaining = buffer.getDouble(); - res.radarTurnRemaining = buffer.getDouble(); - res.gunTurnRemaining = buffer.getDouble(); - res.distanceRemaining = buffer.getDouble(); - - res.isAdjustGunForBodyTurn = serializer.deserializeBoolean(buffer); - res.isAdjustRadarForGunTurn = serializer.deserializeBoolean(buffer); - res.isAdjustRadarForBodyTurn = serializer.deserializeBoolean(buffer); - res.isAdjustRadarForBodyTurnSet = serializer.deserializeBoolean(buffer); - - res.bodyColor = buffer.getInt(); - res.gunColor = buffer.getInt(); - res.radarColor = buffer.getInt(); - res.scanColor = buffer.getInt(); - res.bulletColor = buffer.getInt(); - - res.maxTurnRate = buffer.getDouble(); - res.maxVelocity = buffer.getDouble(); - - res.moved = serializer.deserializeBoolean(buffer); - res.scan = serializer.deserializeBoolean(buffer); - res.isIORobot = serializer.deserializeBoolean(buffer); - res.isTryingToPaint = serializer.deserializeBoolean(buffer); - - res.outputText = serializer.deserializeString(buffer); - - res.graphicsCalls = serializer.deserializeBytes(buffer); - - Object item = serializer.deserializeAny(buffer); - - while (item != null) - { - if (item is BulletCommand) - { - res.bullets.Add((BulletCommand) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) - { - if (item is TeamMessage) - { - res.teamMessages.Add((TeamMessage) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) - { - if (item is DebugProperty) - { - res.debugProperties.Add((DebugProperty) item); - } - item = serializer.deserializeAny(buffer); - } - return res; - } - - #endregion - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecResults.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecResults.cs deleted file mode 100644 index 01bf7f0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/ExecResults.cs +++ /dev/null @@ -1,253 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; -using Robocode; - -namespace net.sf.robocode.dotnet.peer -{ - [Serializable] - public class ExecResults - { - private const long serialVersionUID = 1L; - private List bulletUpdates; - private ExecCommands commands; - private List events; - private bool halt; - private bool paintEnabled; - private bool shouldWait; - private RobotStatus status; - private List teamMessages; - - public ExecResults(ExecCommands commands, RobotStatus status, List events, List teamMessages, - List bulletUpdates, bool halt, bool shouldWait, bool paintEnabled) - { - this.commands = commands; - this.status = status; - this.events = events; - this.teamMessages = teamMessages; - this.bulletUpdates = bulletUpdates; - this.halt = halt; - this.shouldWait = shouldWait; - this.paintEnabled = paintEnabled; - } - - private ExecResults() - { - } - - public static long getSerialVersionUID() - { - return serialVersionUID; - } - - public ExecCommands getCommands() - { - return commands; - } - - public void setCommands(ExecCommands commands) - { - this.commands = commands; - } - - public RobotStatus getStatus() - { - return status; - } - - public void setStatus(RobotStatus status) - { - this.status = status; - } - - public List getEvents() - { - return events; - } - - public void setEvents(List events) - { - this.events = events; - } - - public List getTeamMessages() - { - return teamMessages; - } - - public void setTeamMessages(List teamMessages) - { - this.teamMessages = teamMessages; - } - - public List getBulletUpdates() - { - return bulletUpdates; - } - - public void setBulletUpdates(List bulletUpdates) - { - this.bulletUpdates = bulletUpdates; - } - - public bool isHalt() - { - return halt; - } - - public void setHalt(bool halt) - { - this.halt = halt; - } - - public bool isShouldWait() - { - return shouldWait; - } - - public void setShouldWait(bool shouldWait) - { - this.shouldWait = shouldWait; - } - - public bool isPaintEnabled() - { - return paintEnabled; - } - - public void setPaintEnabled(bool paintEnabled) - { - this.paintEnabled = paintEnabled; - } - - // ReSharper disable UnusedMember.Local - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - #region Nested type: SerializableHelper - - private class SerializableHelper : ISerializableHelperN - { - #region ISerializableHelperN Members - - public int sizeOf(RbSerializerN serializer, Object obje) - { - var obj = (ExecResults) obje; - int size = RbSerializerN.SIZEOF_TYPEINFO + 3*RbSerializerN.SIZEOF_BOOL; - - size += serializer.sizeOf(RbSerializerN.ExecCommands_TYPE, obj.commands); - size += serializer.sizeOf(RbSerializerN.RobotStatus_TYPE, obj.status); - - // events - foreach (Event evnt in obj.events) - { - size += serializer.sizeOf(evnt); - } - size += 1; - - // messages - foreach (TeamMessage m in obj.teamMessages) - { - size += serializer.sizeOf(RbSerializerN.TeamMessage_TYPE, m); - } - size += 1; - - // bullets - foreach (BulletStatus b in obj.bulletUpdates) - { - size += serializer.sizeOf(RbSerializerN.BulletStatus_TYPE, b); - } - size += 1; - - return size; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, Object obje) - { - var obj = (ExecResults) obje; - - serializer.serialize(buffer, obj.halt); - serializer.serialize(buffer, obj.shouldWait); - serializer.serialize(buffer, obj.paintEnabled); - - serializer.serialize(buffer, RbSerializerN.ExecCommands_TYPE, obj.commands); - serializer.serialize(buffer, RbSerializerN.RobotStatus_TYPE, obj.status); - - foreach (Event evnt in obj.events) - { - serializer.serialize(buffer, evnt); - } - buffer.put(RbSerializerN.TERMINATOR_TYPE); - foreach (TeamMessage message in obj.teamMessages) - { - serializer.serialize(buffer, RbSerializerN.TeamMessage_TYPE, message); - } - buffer.put(RbSerializerN.TERMINATOR_TYPE); - foreach (BulletStatus bulletStatus in obj.bulletUpdates) - { - serializer.serialize(buffer, RbSerializerN.BulletStatus_TYPE, bulletStatus); - } - buffer.put(RbSerializerN.TERMINATOR_TYPE); - } - - public Object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - var res = new ExecResults(); - - res.halt = serializer.deserializeBoolean(buffer); - res.shouldWait = serializer.deserializeBoolean(buffer); - res.paintEnabled = serializer.deserializeBoolean(buffer); - - res.commands = (ExecCommands) serializer.deserializeAny(buffer); - res.status = (RobotStatus) serializer.deserializeAny(buffer); - - Object item = serializer.deserializeAny(buffer); - - res.events = new List(); - res.teamMessages = new List(); - res.bulletUpdates = new List(); - while (item != null) - { - if (item is Event) - { - res.events.Add((Event) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) - { - if (item is TeamMessage) - { - res.teamMessages.Add((TeamMessage) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) - { - if (item is BulletStatus) - { - res.bulletUpdates.Add((BulletStatus) item); - } - item = serializer.deserializeAny(buffer); - } - return res; - } - - #endregion - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/TeamMessage.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/TeamMessage.cs deleted file mode 100644 index 2f31f0e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/peer/TeamMessage.cs +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using net.sf.robocode.nio; -using net.sf.robocode.serialization; - -namespace net.sf.robocode.dotnet.peer -{ - [Serializable] - public class TeamMessage - { - public byte[] message; - public String recipient; - public String sender; - - public TeamMessage(String sender, String recipient, byte[] message) - { - this.sender = sender; - this.recipient = recipient; - this.message = message; - } - - // ReSharper disable UnusedMember.Local - private static ISerializableHelperN createHiddenSerializer() - { - return new SerializableHelper(); - } - - #region Nested type: SerializableHelper - - private class SerializableHelper : ISerializableHelperN - { - #region ISerializableHelperN Members - - public int sizeOf(RbSerializerN serializer, Object obje) - { - var obj = (TeamMessage) obje; - int s = serializer.sizeOf(obj.sender); - int r = serializer.sizeOf(obj.recipient); - int m = serializer.sizeOf(obj.message); - - return RbSerializerN.SIZEOF_TYPEINFO + s + r + m; - } - - public void serialize(RbSerializerN serializer, ByteBuffer buffer, Object obje) - { - var obj = (TeamMessage) obje; - - serializer.serialize(buffer, obj.sender); - serializer.serialize(buffer, obj.recipient); - serializer.serialize(buffer, obj.message); - } - - public Object deserialize(RbSerializerN serializer, ByteBuffer buffer) - { - String sender = serializer.deserializeString(buffer); - String recipient = serializer.deserializeString(buffer); - byte[] message = serializer.deserializeBytes(buffer); - - return new TeamMessage(sender, recipient, message); - } - - #endregion - } - - #endregion - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/RobotType.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/RobotType.cs deleted file mode 100644 index 3e68dd0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/RobotType.cs +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; - -namespace net.sf.robocode.repository -{ - [Flags] - public enum RobotTypeN - { - INVALID = 0, - JUNIOR = 1, - STANDARD = 2, - ADVANCED = 4, - TEAM = 8, - DROID = 16, - INTERACTIVE = 32, - PAINTING = 64, - SENTRY = 128 - } - - partial class RobotType - { - private static RobotType _Invalid; - - public static RobotType Invalid - { - get - { - if (_Invalid == null) - { - _Invalid = INVALID; - } - return _Invalid; - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/root/DllRootHelper.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/root/DllRootHelper.cs deleted file mode 100644 index 6b00054..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/repository/root/DllRootHelper.cs +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using System.Threading; -using System.Web; -using net.sf.robocode.dotnet.host.seed; -using net.sf.robocode.repository; - -namespace net.sf.robocode.dotnet.repository.root -{ - public static class DllRootHelper - { - private static AppDomainShell shell; - - public static void Open() - { - if (shell!=null) - { - shell.Dispose(); - } - shell = new AppDomainShell(); - shell.Init(false); - } - - public static void Close() - { - } - - public static string[] findItems(string dllPath) - { - string uriPath = dllPath.Replace("#", "%23"); // All '#' occurrences must be replaced - string file = new Uri(uriPath).LocalPath; - if (!File.Exists(file)) - { - throw new FileNotFoundException("File not found: " + dllPath); - } - - if (shell != null) - { - shell.Open(file); - return shell.FindRobots(); - } - using (AppDomainShell localshell = new AppDomainShell()) - { - localshell.Init(false); - localshell.Open(file); - return localshell.FindRobots(); - } - } - - public static RobotType GetRobotType(IRobotItem robotItem) - { - string file = GetDllFileName(robotItem); - if (!File.Exists(file)) - { - return RobotType.Invalid; - } - if (shell != null) - { - shell.Open(file); - return shell.GetRobotType(robotItem.getFullClassName()); - } - using (AppDomainShell localshell = new AppDomainShell()) - { - localshell.Init(false); - localshell.Open(file); - return localshell.GetRobotType(robotItem.getFullClassName()); - } - } - - public static string GetDllFileName(IRobotItem robotItem) - { - string uriString = robotItem.getClassPathURL().toURI().toString(); - string trim = uriString.Substring(0, uriString.LastIndexOf(".dll!/") + 4); - return new Uri(trim).LocalPath; - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/robocode.dotnet.nhost.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/robocode.dotnet.nhost.csproj deleted file mode 100644 index d9a87e7..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/robocode.dotnet.nhost.csproj +++ /dev/null @@ -1,187 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {674AED55-B9EC-4C7D-8E0B-1B2481C578B2} - Library - net.sf.robocode.dotnet - robocode.dotnet.nhost-1.9.2.4 - v3.5 - 512 - true - ..\..\tools\keys\robocode.snk - - - 3.5 - - - - true - full - false - ..\target\ - ..\target\obj\ - DEBUG;TRACE - prompt - 4 - false - true - - - pdbonly - true - ..\target\ - ..\target\obj\ - - - prompt - 4 - true - - - - False - ..\..\tools\lib\jni4net.n-0.8.7.0.dll - - - - - - - - - - - - generated\AssemblyInfo.cs - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84} - robocode.dotnet.api - - - {674AED55-B9EC-4C7D-8E0B-1B2471C578B2} - robocode.dotnet.control.api - - - - - - if not exist $(OutDir)\build-sources\generated-sources\META-INF mkdir $(OutDir)\build-sources\generated-sources\META-INF\ -echo [assembly: System.Reflection.AssemblyVersion("1.9.2.4")] > $(OutDir)\build-sources\generated-sources\META-INF\AssemblyInfo.cs - - copy "$(TargetPath)" "$(SolutionDir)\robocode.dotnet.host\target" -copy "$(SolutionDir)\tools\lib\*.dll" "$(TargetDir)" -copy "$(SolutionDir)\tools\lib\*.dll" "$(SolutionDir)\robocode.dotnet.host\target" - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/serialization/RbSerializer.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/serialization/RbSerializer.cs deleted file mode 100644 index c176eaf..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/serialization/RbSerializer.cs +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System.IO; -using java.lang; -using net.sf.jni4net.nio; -using ByteBuffer = net.sf.robocode.nio.ByteBuffer; - -namespace net.sf.robocode.serialization -{ - partial class RbSerializer - { - private const int byteOrder = -1059135839; //0xC0DEDEA1 - private static int currentVersion; - - public static void Init(int version) - { - if (currentVersion == 0) - { - currentVersion = version; - } - } - - public DirectByteBuffer serializeN(byte type, Object obj) - { - int length = sizeOf(type, obj); - - // header - int size = RbSerializerN.SIZEOF_INT*3 + length; - var sharedBuffer = new byte[size]; - var buffer = new DirectByteBuffer(sharedBuffer); - - buffer.putInt(byteOrder); - buffer.putInt(currentVersion); - buffer.putInt(length); - - // body - serialize(buffer, type, obj); - if (buffer.remaining() != 0) - { - throw new IOException("Serialization failed: bad size"); - } - return buffer; - } - - public T ConvertJ2C(byte type, Object javaObject) - { - DirectByteBuffer commandBuffer = serializeN(type, javaObject); - ByteBuffer byteBuffer = ByteBuffer.wrap(commandBuffer.GetSharedBuffer()); - return RbSerializerN.deserializeFromBuffer(byteBuffer); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.cs deleted file mode 100644 index 0f7e664..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.cs +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections; -using System.Diagnostics; -using System.Reflection; -using System.Security; -using System.Security.Permissions; -using System.Security.Policy; -using net.sf.robocode.repository; -using Robocode; -using Robocode.RobotInterfaces; - -namespace net.sf.robocode.dotnet.utils -{ - internal partial class Reflection - { - public static PermissionSet GetNamedPermissionSet(string name) - { - IEnumerator policyEnumerator = SecurityManager.PolicyHierarchy(); - - // Move through the policy levels to the machine policy level. - while (policyEnumerator.MoveNext()) - { - var currentLevel = (PolicyLevel) policyEnumerator.Current; - - if (currentLevel.Label == "Machine") - { - return currentLevel.GetNamedPermissionSet(name); - } - } - return null; - } - - public static StrongName GetStrongName(Assembly assembly) - { - if (assembly == null) - throw new ArgumentNullException("assembly"); - - AssemblyName assemblyName = assembly.GetName(); - Debug.Assert(assemblyName != null, "Could not get assembly name"); - - // Get the public key blob. - byte[] publicKey = assemblyName.GetPublicKey(); - if (publicKey == null || publicKey.Length == 0) - throw new InvalidOperationException("Assembly is not strongly named"); - - var keyBlob = new StrongNamePublicKeyBlob(publicKey); - - // Return the strong name. - return new StrongName(keyBlob, assemblyName.Name, assemblyName.Version); - } - - public static RobotTypeN CheckInterfaces(Type robotClass) - { - if (robotClass == null || robotClass.IsAbstract) - { - // this class is not robot - return RobotTypeN.INVALID; - } - bool isJuniorRobot = false; - bool isStandardRobot = false; - bool isInteractiveRobot = false; - bool isPaintRobot = false; - bool isAdvancedRobot = false; - bool isTeamRobot = false; - bool isDroid = false; - bool isSentryRobot = false; - - if (typeof (IDroid).IsAssignableFrom(robotClass)) - { - isDroid = true; - } - - if (typeof(IBorderSentry).IsAssignableFrom(robotClass)) - { - isSentryRobot = true; - } - - if (typeof (ITeamRobot).IsAssignableFrom(robotClass)) - { - isTeamRobot = true; - } - - if (typeof (IAdvancedRobot).IsAssignableFrom(robotClass)) - { - isAdvancedRobot = true; - } - - if (typeof (IInteractiveRobot).IsAssignableFrom(robotClass)) - { - // in this case we make sure that robot don't waste time - if (checkMethodOverride(robotClass, typeof (Robot), "GetInteractiveEventListener") - || checkMethodOverride(robotClass, typeof (Robot), "OnKeyPressed", typeof (KeyEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnKeyReleased", typeof (KeyEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnKeyTyped", typeof (KeyEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnMouseClicked", typeof (MouseEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnMouseEntered", typeof (MouseEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnMouseExited", typeof (MouseEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnMousePressed", typeof (MouseEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnMouseReleased", typeof (MouseEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnMouseMoved", typeof (MouseEvent)) - || checkMethodOverride(robotClass, typeof (Robot), "OnMouseDragged", typeof (MouseEvent)) - || - checkMethodOverride(robotClass, typeof (Robot), "OnMouseWheelMoved", typeof (MouseWheelMovedEvent)) - ) - { - isInteractiveRobot = true; - } - } - - if (typeof (IPaintRobot).IsAssignableFrom(robotClass)) - { - if (checkMethodOverride(robotClass, typeof (Robot), "GetPaintEventListener") - || checkMethodOverride(robotClass, typeof (Robot), "OnPaint", typeof (IGraphics)) - ) - { - isPaintRobot = true; - } - } - - if (typeof (Robot).IsAssignableFrom(robotClass) && !isAdvancedRobot) - { - isStandardRobot = true; - } - - if (typeof (IJuniorRobot).IsAssignableFrom(robotClass)) - { - isJuniorRobot = true; - if (isAdvancedRobot) - { - throw new AccessViolationException(robotClass.Name + - ": Junior robot should not implement IAdvancedRobot interface."); - } - } - - if (typeof (IBasicRobot).IsAssignableFrom(robotClass)) - { - if (!(isAdvancedRobot || isJuniorRobot)) - { - isStandardRobot = true; - } - } - if (!isAdvancedRobot && !isStandardRobot && !isJuniorRobot) - { - return RobotTypeN.INVALID; - } - - RobotTypeN type=0; - - if (isJuniorRobot) type |= RobotTypeN.JUNIOR; - if (isStandardRobot) type |= RobotTypeN.STANDARD; - if (isInteractiveRobot) type |= RobotTypeN.INTERACTIVE; - if (isPaintRobot) type |= RobotTypeN.PAINTING; - if (isAdvancedRobot) type |= RobotTypeN.ADVANCED; - if (isTeamRobot) type |= RobotTypeN.TEAM; - if (isDroid) type |= RobotTypeN.DROID; - if (isSentryRobot) type |= RobotTypeN.SENTRY; - return type; - } - - private static bool checkMethodOverride(Type robotClass, Type knownBase, String name, - params Type[] parameterTypes) - { - if (knownBase.IsAssignableFrom(robotClass)) - { - MethodInfo method; - - method = robotClass.GetMethod(name, parameterTypes); - if (method == null) - { - return false; - } - - - if (method.DeclaringType.Equals(knownBase)) - { - return false; - } - } - return true; - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.security.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.security.cs deleted file mode 100644 index e0a4830..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.nhost/src/utils/Reflection.security.cs +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Reflection; -using System.Security; -using System.Threading; -using Mono.Reflection; - -namespace net.sf.robocode.dotnet.utils -{ - partial class Reflection - { - private const BindingFlags nextedFlags = BindingFlags.NonPublic | BindingFlags.Public; - private const BindingFlags memberFlags = - BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | - BindingFlags.CreateInstance | BindingFlags.GetProperty; - - public static void CheckAssembly(Assembly assembly) - { - foreach (Type type in assembly.GetTypes()) - { - CheckType(type); - } - } - - private static void CheckType(Type type) - { - foreach (MemberInfo member in type.GetMembers(memberFlags)) - { - MethodBase mb = member as MethodBase; - if (mb != null && member.DeclaringType == type) - { - CheckMethodBase(mb); - } - } - CheckUsedType(type.BaseType); - foreach (Type ifc in type.GetInterfaces()) - { - if (ifc.DeclaringType == type) - { - CheckUsedType(ifc); - } - } - foreach (Type nestedType in type.GetNestedTypes(nextedFlags)) - { - CheckType(nestedType); - } - } - - private static void CheckMethodBase(MethodBase methodBase) - { - foreach (Instruction i in MethodBodyReader.GetInstructions(methodBase)) - { - MethodBase mb = i.Operand as MethodBase; - MethodInfo mi = i.Operand as MethodInfo; - FieldInfo fi = i.Operand as FieldInfo; - - if (mb != null) - { - foreach (var parameter in mb.GetParameters()) - { - CheckUsedType(parameter.ParameterType); - } - CheckUsedType(mb.DeclaringType); - } - - if (mi != null) - { - CheckUsedType(mi.ReturnType); - } - - if (fi != null) - { - CheckUsedType(fi.FieldType); - } - - } - } - - private static void CheckUsedType(Type usedType) - { - if (typeof(Thread).IsAssignableFrom(usedType) || - typeof(ThreadPool).IsAssignableFrom(usedType) || - typeof(ThreadPriority).IsAssignableFrom(usedType) - ) - { - throw new SecurityException("System.Threading.Thread usage is banned here! Please use robocode.Thread instead"); - } - } - - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.project deleted file mode 100644 index dc0a099..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.project +++ /dev/null @@ -1,14 +0,0 @@ - - - robocode.dotnet.ntests - .NET ntests for Robocode. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.api - robocode.dotnet.control.api - robocode.dotnet.nhost - robocode.dotnet.robotscs - robocode.dotnet.samples - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 6687c7a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,10 +0,0 @@ -#Tue Nov 27 22:34:11 CET 2012 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 -encoding/src/main/resources=8859_1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/test/resources=8859_1 -encoding/src=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/pom.xml deleted file mode 100644 index bc91d59..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - 4.0.0 - robocode.dotnet.ntests - dotnet:library - Robocode .NET nTests - .NET ntests for Robocode - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - - net.sf.robocode - robocode.dotnet.api - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.control.api - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.nhost - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.robotscs - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.samples - ${project.version} - dotnet:library - - - org.nunit - nunit.framework - 2.4.3.0 - dotnet:library - - - net.sf.jni4net - jni4net.n - 0.8.7.0 - dotnet:library - - - - src - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - - /warn:0 - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/robocode.dotnet.ntests.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/robocode.dotnet.ntests.iml deleted file mode 100644 index 96d01fd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/robocode.dotnet.ntests.iml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/AssemblyLoadTest.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/AssemblyLoadTest.cs deleted file mode 100644 index 6e7fdaa..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/AssemblyLoadTest.cs +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using net.sf.robocode.dotnet.host.seed; -using net.sf.robocode.dotnet.repository.root; -using net.sf.robocode.repository; -using NUnit.Framework; -using SampleCs; -using tested.robotscs; - -namespace net.sf.robocode.dotnet -{ - [TestFixture] - public class AssemblyLoadTest : TestBase - { - [Test] - public void testDomain() - { - string[] strings = DllRootHelper.findItems(@"file:/" + typeof(MyFirstRobot).Assembly.Location); - Assert.GreaterOrEqual(strings.Length, 5); - } - - [Test] - public void testType() - { - var shell = new AppDomainShell(); - shell.Init(false); - shell.Open(typeof(ThreadAttack).Assembly.Location); - RobotType robotType = shell.GetRobotType(typeof(ThreadAttack).FullName); - Assert.IsTrue(robotType.isAdvancedRobot()); - shell.Open(typeof(MyFirstRobot).Assembly.Location); - robotType = shell.GetRobotType(typeof(MyFirstRobot).FullName); - Assert.IsTrue(robotType.isStandardRobot()); - shell.Dispose(); - } - - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/SimpleTest.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/SimpleTest.cs deleted file mode 100644 index e1334fc..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/SimpleTest.cs +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Drawing; -using System.IO; -using System.Reflection; -using net.sf.robocode.dotnet.host.proxies; -using net.sf.robocode.dotnet.host.security; -using NUnit.Framework; - -namespace net.sf.robocode.dotnet -{ - [TestFixture] - public class SimpleTest : TestBase - { - [Test] - public void Graphics() - { - var sg = new GraphicsProxy(); - sg.setPaintingEnabled(true); - /*sg.DrawArc(Pens.Red, new RectangleF(0,0,80,80),-30,10); - - GraphicsPath path = new GraphicsPath(); - path.AddLine(99,98,78,3); - sg.DrawPath(Pens.Blue, path); - sg.DrawRectangle(Pens.Yellow, 20,20,30,50); - - sg.DrawLine(Pens.Black, 99, 3, 78, 3); - sg.DrawRectangle(Pens.Black, 90, 20, 30, 50); - - Brush brush = new HatchBrush(HatchStyle.Vertical, Color.Cyan); - sg.FillRectangle(brush, new RectangleF(20, 70, 30, 50)); - sg.FillEllipse(brush, new RectangleF(70, 70, 30, 50 )); - */ - - sg.DrawEllipse(Pens.Red, (50), (50), 100, 100); - sg.FillEllipse(new SolidBrush(Color.FromArgb(0, 0xFF, 0, 30)), (100 - 60), (100 - 60), 120, - 120); - - - byte[] readoutQueuedCalls = sg.readoutQueuedCalls(); - Assert.Greater(readoutQueuedCalls.Length, 0); - } - - [Test] - [ExpectedException(typeof (AccessViolationException))] - public void StreamBig() - { - string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(tempDir); - var m = new RobotFileSystemManager(null, 100, tempDir, tempDir); - - using (Stream dataFile = m.getDataFile("test.txt")) - { - dataFile.WriteByte(0xFF); - dataFile.Position = 98; - dataFile.WriteByte(0xFF); - dataFile.WriteByte(0xFF); - dataFile.WriteByte(0xFF); - } - } - - [Test] - [ExpectedException(typeof (AccessViolationException))] - public void StreamBig2() - { - string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(tempDir); - var m = new RobotFileSystemManager(null, 100, tempDir, tempDir); - - using (Stream dataFile = m.getDataFile("test.txt")) - { - dataFile.WriteByte(0xFF); - dataFile.Position = 97; - dataFile.WriteByte(0xFF); - using (Stream dataFile2 = m.getDataFile("test.txt")) - { - dataFile2.WriteByte(0xFF); - dataFile2.Position = 98; - dataFile2.WriteByte(0xFF); - } - } - } - - [Test] - [ExpectedException(typeof (AccessViolationException))] - public void StreamBig3() - { - string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(tempDir); - var m = new RobotFileSystemManager(null, 100, tempDir, tempDir); - - using (Stream dataFile = m.getDataFile("test.txt")) - { - dataFile.WriteByte(0xFF); - dataFile.Position = 97; - dataFile.WriteByte(0xFF); - dataFile.Write(new byte[] {0xFF, 0xFF, 0xFF}, 0, 3); - } - } - - [Test] - public void StreamOk() - { - string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(tempDir); - var m = new RobotFileSystemManager(null, 100, tempDir, tempDir); - - using (Stream dataFile = m.getDataFile("test.txt")) - { - dataFile.WriteByte(0xFF); - dataFile.Position = 97; - dataFile.WriteByte(0xFF); - dataFile.Write(new byte[] {0xFF, 0xFF, 0xFF}, 0, 2); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/TestBase.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/TestBase.cs deleted file mode 100644 index 452858c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/TestBase.cs +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System; -using System.Globalization; -using System.Threading; -using net.sf.jni4net; -using net.sf.jni4net.jni; -using net.sf.robocode.dotnet.repository.root; -using NUnit.Framework; - -namespace net.sf.robocode.dotnet -{ - public abstract class TestBase - { - protected JNIEnv env; - - [TestFixtureSetUp] - public virtual void Setup() - { - Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - var setup = new BridgeSetup(false) { Verbose = true, Debug = true }; - string prefix; - if (Environment.CurrentDirectory.EndsWith("target")) - { - prefix = "../../"; - } - else - { - prefix = "../../../"; - } - string userHome = Environment.GetEnvironmentVariable("USERPROFILE"); - string version = typeof (BridgeSetup).Assembly.GetName().Version.ToString(); - setup.AddClassPath(userHome + @"/.m2/repository/org/picocontainer/picocontainer/2.14.2/picocontainer-2.14.2.jar"); - setup.AddClassPath(userHome + @"/.m2/repository/net/sf/jni4net/jni4net.j/" + version + "/jni4net.j-" + - version + ".jar"); - setup.AddClassPath(prefix + "../../robocode.api/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.api/target/classes"); - setup.AddClassPath(prefix + "../../robocode.battle/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.battle/target/classes"); - setup.AddClassPath(prefix + "../../robocode.core/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.core/target/classes"); - setup.AddClassPath(prefix + "../../robocode.host/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.host/target/classes"); - setup.AddClassPath(prefix + "../../robocode.repository/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.repository/target/classes"); - setup.AddClassPath(prefix + "../../robocode.roborumble/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.roborumble/target/classes"); - setup.AddClassPath(prefix + "../../robocode.samples/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.samples/target/classes"); - setup.AddClassPath(prefix + "../../robocode.sound/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.sound/target/classes"); - setup.AddClassPath(prefix + "../../robocode.tests/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.tests/target/classes"); - setup.AddClassPath(prefix + "../../robocode.ui/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.ui/target/classes"); - setup.AddClassPath(prefix + "../../robocode.ui.editor/target/Test-classes"); - setup.AddClassPath(prefix + "../../robocode.ui.editor/target/classes"); - setup.AddClassPath(prefix + "robocode.dotnet.api/target/Test-classes"); - setup.AddClassPath(prefix + "robocode.dotnet.api/target/classes"); - setup.AddClassPath(prefix + "robocode.dotnet.host/target/Test-classes"); - setup.AddClassPath(prefix + "robocode.dotnet.host/target/classes"); - setup.AddClassPath(prefix + "robocode.dotnet.nhost/target/Test-classes"); - setup.AddClassPath(prefix + "robocode.dotnet.nhost/target/classes"); - setup.AddClassPath(prefix + "robocode.dotnet.samples/target/Test-classes"); - setup.AddClassPath(prefix + "robocode.dotnet.samples/target/classes"); - setup.AddClassPath(prefix + "robocode.dotnet.tests/target/Test-classes"); - setup.AddClassPath(prefix + "robocode.dotnet.tests/target/classes"); - env = Bridge.CreateJVM(setup); - Bridge.RegisterAssembly(typeof (TestBase).Assembly); - Bridge.RegisterAssembly(typeof (DllRootHelper).Assembly); - } - - [TestFixtureTearDown] - public void TearDown() - { - //Assert.AreEqual(JNIResult.JNI_OK, vm.DestroyJavaVM()); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/robocode.dotnet.ntests.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/robocode.dotnet.ntests.csproj deleted file mode 100644 index d0f9444..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.ntests/src/robocode.dotnet.ntests.csproj +++ /dev/null @@ -1,108 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {B3487E2D-2737-4C04-AA71-B9A726B3F781} - Library - net.sf.robocode.dotnet - robocode.dotnet.ntests-1.9.2.4 - v3.5 - 512 - false - ..\..\tools\keys\robocode.snk - - - - - 3.5 - - - - true - full - false - ..\target\ - ..\target\obj\ - DEBUG;TRACE - prompt - 4 - false - true - - - pdbonly - true - ..\target\ - ..\target\obj\ - - - prompt - 4 - true - - - - False - ..\..\tools\lib\jni4net.n-0.8.7.0.dll - - - False - ..\..\tools\lib\nunit.framework-2.4.3.0.dll - - - - - - - - - - - - - - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84} - robocode.dotnet.api - - - {674AED55-B9EC-4C7D-8E0B-1B2471C578B2} - robocode.dotnet.control.api - - - {674AED55-B9EC-4C7D-8E0B-1B2481C578B2} - robocode.dotnet.nhost - - - {B3487E2D-2737-4C04-AA71-B9A726B3F787} - robocode.dotnet.robotscs - - - {80857B97-6397-487B-A9F5-B07026DCBB66} - robocode.dotnet.samples - - - - - - - - - - - if not exist $(OutDir)\build-sources\generated-sources\META-INF mkdir $(OutDir)\build-sources\generated-sources\META-INF\ -echo [assembly: System.Reflection.AssemblyVersion("0.0.0.0")] > $(OutDir)\build-sources\generated-sources\META-INF\AssemblyInfo.cs - - copy "$(SolutionDir)\tools\lib\*.dll" "$(TargetDir)" -copy "$(SolutionDir)\tools\lib\*.jar" "$(TargetDir)" - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.project deleted file mode 100644 index 21402e0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.project +++ /dev/null @@ -1,10 +0,0 @@ - - - robocode.dotnet.robotscs - .NET test robots for Robocode. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.api - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 6687c7a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,10 +0,0 @@ -#Tue Nov 27 22:34:11 CET 2012 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 -encoding/src/main/resources=8859_1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/test/resources=8859_1 -encoding/src=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/pom.xml deleted file mode 100644 index ba58d91..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - robocode.dotnet.robotscs - dotnet:library - Robocode .NET Test Robots - .NET test robots for Robocode - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - - net.sf.robocode - robocode.dotnet.api - ${project.version} - dotnet:library - - - - src - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - - /warn:0 - - - - org.jvnet.maven-antrun-extended-plugin - maven-antrun-extended-plugin - - - process-classes - - - - - - - run - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/robocode.dotnet.robotscs.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/robocode.dotnet.robotscs.iml deleted file mode 100644 index 3d67425..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/robocode.dotnet.robotscs.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLongerCs.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLongerCs.cs deleted file mode 100644 index 4f690cf..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLongerCs.cs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -public class NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLongerCs : Robot -{ - public override void Run() - { - while (true) - { - Ahead(1); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(1); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageShortNameCs.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageShortNameCs.cs deleted file mode 100644 index 0d79f89..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/NoPackageShortNameCs.cs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -public class NoPackageShortNameCs : Robot -{ - public override void Run() - { - while (true) - { - Ahead(1); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(1); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.csproj deleted file mode 100644 index 478e6ae..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.csproj +++ /dev/null @@ -1,91 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {80857B97-6397-487B-A9F5-B07026DCB666} - Library - SampleCs - samplescs-1.9.2.4 - v4.0 - 512 - - - 3.5 - - - - true - full - false - .\ - obj\ - DEBUG;TRACE - prompt - 4 - false - false - - - pdbonly - true - .\ - obj\ - - - prompt - 4 - true - - - - False - ..\libs\robocode.dll - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.sln b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.sln deleted file mode 100644 index 66ab900..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/SampleCs.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleCs", "SampleCs.csproj", "{80857B97-6397-487B-A9F5-B07026DCB666}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {80857B97-6397-487B-A9F5-B07026DCB666}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80857B97-6397-487B-A9F5-B07026DCB666}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80857B97-6397-487B-A9F5-B07026DCB666}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80857B97-6397-487B-A9F5-B07026DCB666}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode.dotnet.robotscs.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode.dotnet.robotscs.csproj deleted file mode 100644 index 9405ace..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode.dotnet.robotscs.csproj +++ /dev/null @@ -1,114 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {B3487E2D-2737-4C04-AA71-B9A726B3F787} - Library - net.sf.robocode.dotnet - robocode.dotnet.robotscs-1.9.2.4 - v3.5 - 512 - false - ..\..\tools\keys\robocode.snk - - - 3.5 - - - - true - full - false - ..\target\ - ..\target\obj\ - DEBUG;TRACE - prompt - 4 - false - false - - - pdbonly - true - ..\target\ - ..\target\obj\ - - - prompt - 4 - true - - - - False - ..\..\robocode.dotnet.api\target\robocode.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - if not exist $(OutDir)\build-sources\generated-sources\META-INF mkdir $(OutDir)\build-sources\generated-sources\META-INF\ -echo [assembly: System.Reflection.AssemblyVersion("0.0.0.0")] > $(OutDir)\build-sources\generated-sources\META-INF\AssemblyInfo.cs - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode/BadNamespaceCs.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode/BadNamespaceCs.cs deleted file mode 100644 index 9e3711d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/robocode/BadNamespaceCs.cs +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -namespace Robocode -{ - public class BadNamespaceCs : Robot - { - public override void Run() - { - while (true) - { - Ahead(1); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(1); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Ahead.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Ahead.cs deleted file mode 100644 index e8e1c62..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Ahead.cs +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - /** - * @author Pavel Savara (original) - */ - - public class Ahead : AdvancedRobot - { - public override void Run() - { - Ahead(100); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BadFirePower.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BadFirePower.cs deleted file mode 100644 index ae07ab0..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BadFirePower.cs +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - /** - * @author Pavel Savara (original) - */ - - public class BadFirePower : AdvancedRobot - { - public override void Run() - { - while (true) - { - Bullet bullet = SetFireBullet(Time - 12.0); - - if (bullet != null) - { - Out.WriteLine(Time + " Bullet power: " + bullet.Power); - } - else - { - Out.WriteLine(Time + " No bullet"); - } - Execute(); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleLost.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleLost.cs deleted file mode 100644 index 3fda29b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleLost.cs +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class BattleLost : Robot - { - public override void Run() - { - while (true) - { - Ahead(1); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(1); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - - - public override void OnWin(WinEvent e) - { - Out.WriteLine("Win!"); - } - - public override void OnDeath(DeathEvent e) - { - Out.WriteLine("Death!"); - } - - public override void OnBattleEnded(BattleEndedEvent evnt) - { - Out.WriteLine("BattleEnded!"); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleWin.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleWin.cs deleted file mode 100644 index 64115f4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BattleWin.cs +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class BattleWin : Robot - { - public override void Run() - { - while (true) - { - Ahead(100); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(100); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - - - public override void OnScannedRobot(ScannedRobotEvent e) - { - Fire(1); - } - - - public override void OnHitByBullet(HitByBulletEvent e) - { - TurnLeft(90 - e.Bearing); - } - - - public override void OnWin(WinEvent e) - { - Out.WriteLine("Win!"); - } - - - public override void OnDeath(DeathEvent e) - { - Out.WriteLine("Death!"); - } - - - public override void OnBattleEnded(BattleEndedEvent evnt) - { - Out.WriteLine("BattleEnded!"); - } - - public override void OnRoundEnded(RoundEndedEvent evnt) - { - Out.WriteLine("RoundEnded!"); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BodyTurnRate.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BodyTurnRate.cs deleted file mode 100644 index 1ab0988..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/BodyTurnRate.cs +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; -using Robocode.Util; - -namespace tested.robotscs -{ - /** - * @author Flemming N. Larsen (original) - */ - - public class BodyTurnRate : AdvancedRobot - { - public override void Run() - { - // Test turn rate at all speed moving ahead and turning left - - SetAhead(1000); - SetTurnLeft(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - - // Test turn rate at all speed moving ahead and turning right - - SetAhead(1000); - SetTurnRight(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - - // Test turn rate at all speed moving back and turning right - - SetBack(1000); - SetTurnRight(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - - // Test turn rate at all speed moving back and turning left - - SetBack(1000); - SetTurnLeft(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - } - - private void executeAndDumpTurnRate9turns() - { - for (int i = 0; i < 9; i++) - { - executeAndDumpTurnRate(); - } - } - - private void executeAndDumpTurnRate() - { - double lastHeading = Heading; - double lastVelocity = Velocity; - - Execute(); - - double turnRate = Utils.NormalRelativeAngleDegrees(Heading - lastHeading); - - lastHeading = Heading; - - Out.WriteLine(Time + ": " + lastVelocity + ", " + turnRate); - } - - private void stopMoving() - { - SetAhead(0); - SetTurnLeft(0); - - for (int i = 0; i < 6; i++) - { - executeAndDumpTurnRate(); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/CustomEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/CustomEvents.cs deleted file mode 100644 index 3557f26..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/CustomEvents.cs +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class CustomEvents : AdvancedRobot - { - public override void Run() - { - AddCustomEvent("onTick99", 99, c => true); - AddCustomEvent("onTick30", 30, c => true); - - AddCustomEvent("onLowEnergy98", 98, c => Energy < 20); - - while (true) - { - Ahead(100); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(100); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - - public override void OnCustomEvent(CustomEvent e) - { - Out.WriteLine(Time + " " + e.Condition.Name); - } - - public override void OnScannedRobot(ScannedRobotEvent e) - { - Out.WriteLine(Time + " onScannedRobot10"); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/DieFast.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/DieFast.cs deleted file mode 100644 index d660e5d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/DieFast.cs +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; -using Robocode.Exception; - -namespace tested.robotscs -{ - public class DieFast : Robot - { - public override void Run() - { - throw new RobotException(); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EnvAttack.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EnvAttack.cs deleted file mode 100644 index b7595f5..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EnvAttack.cs +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode; - -namespace tested.robotscs -{ - public class EnvAttack : AdvancedRobot - { - public override void Run() - { - // attack - Environment.SetEnvironmentVariable("NOSECURITY", "true"); - - // noinspection InfiniteLoopStatement - for (;;) - { - TurnLeft(100); - Ahead(10); - TurnLeft(100); - Back(10); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EventPriorityFilter.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EventPriorityFilter.cs deleted file mode 100644 index cc8f570..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/EventPriorityFilter.cs +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class EventPriorityFilter : AdvancedRobot - { - public override void Run() - { - // noinspection InfiniteLoopStatement - for (;;) - { - Ahead(10); // make sure we eventually hits a wall to receive onHitWall - } - } - - - public override void OnScannedRobot(ScannedRobotEvent evnt) - { - Out.WriteLine("Scanned!!!"); // a robot was Scanned -> problem! - } - - - public override void OnHitWall(HitWallEvent e) - { - // when the radar is turned here, at least another robot should be Scanned - // but Event should not be dispatched because we are in handler with higher priority - TurnRadarRight(360); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FairPlay.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FairPlay.cs deleted file mode 100644 index bfceb70..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FairPlay.cs +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; -using Robocode.Util; - -namespace tested.robotscs -{ - public class FairPlay : AdvancedRobot - { - public override void Run() - { - SetTurnRadarRightRadians(1d/0d); - } - - public override void OnScannedRobot(ScannedRobotEvent e) - { - SetTurnRadarLeft(RadarTurnRemaining); - SetTurnGunRightRadians( - Utils.NormalRelativeAngle(e.BearingRadians + HeadingRadians - GunHeadingRadians)); - SetFire(3); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileAttack.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileAttack.cs deleted file mode 100644 index b7ddd28..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileAttack.cs +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using Robocode; - -namespace tested.robotscs -{ - public class FileAttack : AdvancedRobot - { - public override void Run() - { - for (;;) - { - TurnLeft(100); - Ahead(10); - TurnLeft(100); - Back(10); - } - } - - - public override void OnScannedRobot(ScannedRobotEvent evnt) - { - readAttack(); - writeAttack(); - } - - private void readAttack() - { - try - { - FileStream fs = new FileStream(@"C:\MSDOS.SYS", FileMode.OpenOrCreate, FileAccess.Read); - - Out.WriteLine(fs.ReadByte()); - Out.WriteLine(fs.ReadByte()); - Out.WriteLine(fs.ReadByte()); - Out.WriteLine(fs.ReadByte()); - fs.Close(); - } - catch (Exception e) - { - Out.WriteLine(e); - } - } - - private void writeAttack() - { - try - { - FileStream fs = new FileStream(@"C:\MSDOS.SYS", FileMode.OpenOrCreate, FileAccess.ReadWrite); - fs.WriteByte(0xBA); - fs.WriteByte(0xDF); - fs.WriteByte(0x00); - fs.WriteByte(0xD0); - fs.Close(); - } - catch (Exception e) - { - Out.WriteLine(e); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileWriteSize.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileWriteSize.cs deleted file mode 100644 index 79fd89b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FileWriteSize.cs +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using Robocode; - -namespace tested.robotscs -{ - public class FileWriteSize : AdvancedRobot - { - public override void Run() - { - Out.WriteLine("Data quota: " + DataQuotaAvailable); - Out.WriteLine("Data directory: " + GetDataDirectory()); - - using (Stream dataFile = GetDataFile("test.txt")) - { - byte[] buf = new byte[100000]; - for (int i = 0; i < 3; i++) - { - dataFile.Write(buf, 0, buf.Length); - } - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FormsAttack.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FormsAttack.cs deleted file mode 100644 index 90419d4..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/FormsAttack.cs +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.IO; -using System.Windows.Forms; -using Robocode; - -namespace tested.robotscs -{ - public class FormsAttack : AdvancedRobot - { - public override void Run() - { - for (;;) - { - TurnLeft(100); - Ahead(10); - TurnLeft(100); - Back(10); - } - } - - private Form f; - - public override void OnScannedRobot(ScannedRobotEvent evnt) - { - f = new Form(); - f.Show(); - f.Shown += f_Shown; - } - - private void f_Shown(object sender, EventArgs e) - { - f.Invoke(new Action(writeAttack)); - } - - private void writeAttack(int i) - { - try - { - FileStream fs = new FileStream(@"C:\MSDOS.SYS", FileMode.OpenOrCreate, FileAccess.ReadWrite); - fs.WriteByte(0xBA); - fs.WriteByte(0xDF); - fs.WriteByte(0x00); - fs.WriteByte(0xD0); - fs.Close(); - } - catch (Exception e) - { - Out.WriteLine(e); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunHeat.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunHeat.cs deleted file mode 100644 index 05b10c6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunHeat.cs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class GunHeat : AdvancedRobot - { - public override void Run() - { - while (true) - { - SetFireBullet(3.0); - Out.WriteLine(Time + " gunHeat after fire: " + GunHeat); - Execute(); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunTurnRate.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunTurnRate.cs deleted file mode 100644 index 48cbc6c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/GunTurnRate.cs +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode; -using Robocode.Util; - -namespace tested.robotscs -{ - /** - * @author Flemming N. Larsen (original) - */ - - public class GunTurnRate : AdvancedRobot - { - public override void Run() - { - MaxTurnRate = (5); - - SetTurnGunLeft(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - SetTurnGunRight(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - SetTurnLeft(Double.PositiveInfinity); - SetTurnGunLeft(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - SetTurnRight(Double.PositiveInfinity); - SetTurnGunRight(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - MaxTurnRate = (20); - - SetTurnLeft(Double.PositiveInfinity); - SetTurnGunLeft(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - SetTurnRight(Double.PositiveInfinity); - SetTurnGunRight(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - IsAdjustGunForRobotTurn = (false); - - SetTurnRight(Double.PositiveInfinity); - SetTurnGunLeft(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - SetTurnLeft(Double.PositiveInfinity); - SetTurnGunRight(Double.PositiveInfinity); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - } - - private void executeAndDumpTurnRate() - { - double lastHeading = GunHeading; - - Execute(); - - double turnRate = Utils.NormalRelativeAngleDegrees(GunHeading - lastHeading); - - Out.WriteLine(Time + ": " + turnRate); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/HttpAttack.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/HttpAttack.cs deleted file mode 100644 index 18fd910..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/HttpAttack.cs +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Net; -using Robocode; - -namespace tested.robotscs -{ - public class HttpAttack : AdvancedRobot - { - private static string HTTP_ADDR = "http://robocode.sourceforge.net/"; - - public override void Run() - { - WebClient req = new WebClient(); - using (var res = req.OpenRead(HTTP_ADDR)) - { - res.Read(new byte[100000], 0, 100000); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/InteruptibleEvent.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/InteruptibleEvent.cs deleted file mode 100644 index 5c07a3a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/InteruptibleEvent.cs +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class InteruptibleEvent : AdvancedRobot - { - public override void Run() - { - SetEventPriority("HitWallEvent", GetEventPriority("ScannedRobotEvent")); // make same as scan - - // noinspection InfiniteLoopStatement - for (;;) - { - Ahead(10); // make sure we eventually hits a wall to receive onHitWall - } - } - - public override void OnScannedRobot(ScannedRobotEvent evnt) - { - Out.WriteLine("Scanned!!!"); // a robot was Scanned -> success! - } - - public override void OnHitWall(HitWallEvent e) - { - IsInterruptible = (true); // make sure that the Event handler can be interrupted and restarted - TurnRadarRight(360); // when the radar is turned here, at least another robot should be Scanned - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/JuniorEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/JuniorEvents.cs deleted file mode 100644 index 5df75fb..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/JuniorEvents.cs +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using Robocode; -using Robocode.RobotInterfaces; -using Robocode.RobotInterfaces.Peer; -using Robocode.Util; - -namespace tested.robotscs -{ - public class JuniorEvents : IJuniorRobot, IBasicEvents, IRunnable - { - private IBasicRobotPeer peer; - private TextWriter Out; - private readonly Dictionary counts = new Dictionary(); - private Bullet bullet; - - public void Run() - { - // noinspection InfiniteLoopStatement - while (true) - { - peer.Move(100); // Move ahead 100 - peer.TurnGun(Math.PI*2); // Spin gun around - peer.Move(-100); // Move back 100 - peer.TurnGun(Math.PI*2); // Spin gun around - } - } - - public IRunnable GetRobotRunnable() - { - return this; - } - - public IBasicEvents GetBasicEventListener() - { - return this; - } - - public void SetPeer(IBasicRobotPeer peer) - { - this.peer = peer; - } - - public void SetOut(TextWriter output) - { - Out = output; - } - - public void OnStatus(StatusEvent evnt) - { - count(evnt); - IGraphics g = peer.GetGraphics(); - - g.DrawEllipse(Pens.Orange, (int) (peer.GetX() - 55), (int) (peer.GetY() - 55), 110, 110); - } - - public void OnBulletHit(BulletHitEvent evnt) - { - count(evnt); - } - - public void OnBulletHitBullet(BulletHitBulletEvent evnt) - { - count(evnt); - } - - public void OnBulletMissed(BulletMissedEvent evnt) - { - count(evnt); - } - - public void OnDeath(DeathEvent evnt) - { - count(evnt); - } - - public void OnHitByBullet(HitByBulletEvent evnt) - { - count(evnt); - } - - public void OnHitRobot(HitRobotEvent evnt) - { - count(evnt); - } - - public void OnHitWall(HitWallEvent evnt) - { - count(evnt); - } - - public void OnRobotDeath(RobotDeathEvent evnt) - { - count(evnt); - } - - public void OnWin(WinEvent evnt) - { - count(evnt); - - // this is tested output - foreach (KeyValuePair s in counts) - { - Out.WriteLine(s.Key + " " + s.Value); - } - - Out.WriteLine("last bullet heading " + bullet.HeadingRadians.ToString("F5")); - } - - public void OnScannedRobot(ScannedRobotEvent evnt) - { - count(evnt); - - // Turn gun to point at the Scanned robot - peer.TurnGun(Utils.NormalAbsoluteAngle(peer.GetBodyHeading() + evnt.BearingRadians - peer.GetGunHeading())); - // - - // Fire! - const double power = 1; - - Bullet firedBullet = peer.Fire(power); - - if (firedBullet != null) - { - bullet = firedBullet; - } - } - - private void count(Event evnt) - { - String name = evnt.GetType().FullName; - object curr; - - if (!counts.TryGetValue(name, out curr)) - { - curr = 0; - } - counts[name] = ((int) curr) + 1; - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxTurnRate.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxTurnRate.cs deleted file mode 100644 index 80f7e04..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxTurnRate.cs +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode; -using Robocode.Util; - -namespace tested.robotscs -{ - public class MaxTurnRate : AdvancedRobot - { - public override void Run() - { - SetTurnLeft(Double.PositiveInfinity); - - for (int i = 0; i < 13; i++) - { - MaxTurnRate = (i); - executeAndDumpTurnRate(); - } - - SetTurnRight(Double.PositiveInfinity); - - for (int i = 0; i < 13; i++) - { - MaxTurnRate = (i); - executeAndDumpTurnRate(); - } - } - - private void executeAndDumpTurnRate() - { - double lastHeading = Heading; - - Execute(); - - double turnRate = Utils.NormalRelativeAngleDegrees(Heading - lastHeading); - - Out.WriteLine(Time + ": " + Velocity.ToString("F1") + ", " + turnRate.ToString("F1")); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxVelocity.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxVelocity.cs deleted file mode 100644 index 0faa940..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/MaxVelocity.cs +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class MaxVelocity : AdvancedRobot - { - public override void Run() - { - for (;;) - { - int time = (int) Time; - - if (time < 200) - { - Out.WriteLine(time + ": " + Velocity); - } - - switch (time) - { - case 1: - SetAhead(1000); - break; - - case 20: - SetBack(1000); - break; - - case 40: - MaxVelocity = (4.2); - SetAhead(1000); - break; - - case 60: - SetBack(1000); - break; - - case 80: - MaxVelocity = (100); - SetAhead(1000); - break; - - case 100: - SetBack(1000); - break; - - case 120: - MaxVelocity = (-2); - SetAhead(1000); - break; - - case 140: - SetBack(1000); - break; - - case 160: - MaxVelocity = (0); - SetAhead(1000); - break; - - case 180: - SetBack(1000); - break; - } - Execute(); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/PrivateConstructor.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/PrivateConstructor.cs deleted file mode 100644 index 976b31f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/PrivateConstructor.cs +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class PrivateConstructor : Robot - { - private PrivateConstructor() - { - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RadarTurnRateAndSetAdjust.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RadarTurnRateAndSetAdjust.cs deleted file mode 100644 index d9f578d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RadarTurnRateAndSetAdjust.cs +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode; -using Robocode.Util; - -namespace tested.robotscs -{ - public class RadarTurnRateAndIsAdjust : AdvancedRobot - { - public override void Run() - { - // -- Turn 1 -- - SetTurnRadarRight(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. radar turn rate = 45 - - // -- Turn 2 -- - SetTurnGunRight(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. gun + radar turn rate = 20 + 45 = 65 - - // -- Turn 3 -- - SetTurnRight(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun + radar turn rate = 10 + 20 + 45 = 75 - - // -- Turn 4 -- - SetTurnRadarLeft(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun - radar turn rate = 10 + 20 - 45 = -15 - - // -- Turn 5 -- - SetTurnGunLeft(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun - radar turn rate = 10 - 20 - 45 = -55 - - // -- Turn 6 -- - SetTurnLeft(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun - radar turn rate = -10 - 20 - 45 = -75 - - // -- Turn 7 -- - IsAdjustRadarForGunTurn = (false); - SetTurnRight(14); - SetTurnGunRight(15); - SetTurnRadarRight(7); - executeAndDumpTurnRate(); - // Expected turn rate: robot + gun + radar turn rate = 14 + 15 + 7 = 32 - - // -- Turn 8 -- - IsAdjustGunForRobotTurn = (false); - IsAdjustRadarForRobotTurn = (false); - IsAdjustRadarForGunTurn = (true); - SetTurnRight(14); - SetTurnGunLeft(15); - SetTurnRadarRight(7); - executeAndDumpTurnRate(); - // Expected turn rate: robot (max) + radar turn rate (ignoring gun turn rate, but not robot turn rate) = 10 + 7 = 17 - - // -- Turn 9 -- - IsAdjustGunForRobotTurn = (false); - IsAdjustRadarForRobotTurn = (true); - IsAdjustRadarForGunTurn = (true); - SetTurnRight(14); - SetTurnGunLeft(15); - SetTurnRadarRight(35); - executeAndDumpTurnRate(); - // Expected turn rate: robot turn rate (ignoring both gun and body turn rate) = 35 - - // -- Turn 10 -- - IsAdjustGunForRobotTurn = (false); - IsAdjustRadarForRobotTurn = (false); - IsAdjustRadarForGunTurn = (true); - SetTurnRight(14); - SetTurnGunLeft(15); - SetTurnRadarLeft(7); - executeAndDumpTurnRate(); - // Expected turn rate: robot (max) + radar turn rate (ignoring gun turn rate, but not robot turn rate) = 10 - 7 = 3 - - // -- Turn 11 -- - IsAdjustGunForRobotTurn = (false); - IsAdjustRadarForRobotTurn = (true); - IsAdjustRadarForGunTurn = (true); - SetTurnRight(4); - SetTurnGunRight(60); - SetTurnRadarLeft(100); - executeAndDumpTurnRate(); - // Expected turn rate: robot (max) turn rate (ignoring both gun and body turn rate) = -20 - - // -- Turn 12 -- - IsAdjustGunForRobotTurn = (false); - IsAdjustRadarForRobotTurn = (false); - IsAdjustRadarForGunTurn = (true); - SetTurnRight(Double.PositiveInfinity); - SetTurnGunRight(Double.PositiveInfinity); - SetTurnRadarRight(Double.PositiveInfinity); - executeAndDumpTurnRate(); - // Expected turn rate: IsAdjusts are all ignored, max. robot + gun + radar turn rate = 10 + 20 + 45 = 75 - - // -- Turn 13 -- - IsAdjustGunForRobotTurn = (true); - IsAdjustRadarForRobotTurn = (false); - IsAdjustRadarForGunTurn = (true); - SetTurnRight(Double.NegativeInfinity); - SetTurnGunRight(Double.NegativeInfinity); - SetTurnRadarRight(Double.NegativeInfinity); - executeAndDumpTurnRate(); - // Expected turn rate: IsAdjusts are all ignored, max. robot + gun + radar turn rate = -10 - 20 - 45 = -75 - - // -- Turn 14 -- - IsAdjustGunForRobotTurn = (true); - IsAdjustRadarForRobotTurn = (true); - IsAdjustRadarForGunTurn = (true); - SetTurnLeft(Double.NegativeInfinity); - SetTurnGunLeft(Double.NegativeInfinity); - SetTurnRadarLeft(Double.NegativeInfinity); - executeAndDumpTurnRate(); - // Expected turn rate: IsAdjusts are all ignored, max. robot + gun + radar turn rate = -(-10) - (-20) - 45 = -15 - } - - private void executeAndDumpTurnRate() - { - double lastHeading = RadarHeading; - - Execute(); - - double turnRate = Utils.NormalRelativeAngleDegrees(RadarHeading - lastHeading); - - Out.WriteLine(Time + ": " + turnRate); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Random.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Random.cs deleted file mode 100644 index d8bc2d3..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/Random.cs +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; -using Robocode.Util; - -namespace tested.robotscs -{ - public class Random : Robot - { - private readonly System.Random random = Utils.GetRandom(); - - public override void Run() - { - while (true) - { - Ahead(100*random.Next()); - TurnRight(180*random.Next()); - Back(100*random.Next()); - TurnLeft(360*random.Next()); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RateControl.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RateControl.cs deleted file mode 100644 index 1703a4a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RateControl.cs +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class RateControl : RateControlRobot - { - public override void Run() - { - for (int turnNumber = 0; turnNumber < 80; turnNumber++) - { - if (turnNumber == 0) - { - TurnRate = (4.5); - } - else if (turnNumber == 10) - { - TurnRate = (-9); - } - else if (turnNumber == 20) - { - TurnRate = (0); - VelocityRate = (2); - } - else if (turnNumber == 25) - { - VelocityRate = (-8); - } - else if (turnNumber == 35) - { - VelocityRate = (0); - GunRotationRate = (9); - } - else if (turnNumber == 45) - { - GunRotationRate = (-4.5); - } - else if (turnNumber == 55) - { - GunRotationRate = (0); - RadarRotationRate = (9); - } - else if (turnNumber == 65) - { - RadarRotationRate = (-4.5); - } - else if (turnNumber == 75) - { - RadarRotationRate = (0); - } - Execute(); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ReflectionAttack.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ReflectionAttack.cs deleted file mode 100644 index 4ba2594..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ReflectionAttack.cs +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Reflection; -using Robocode; - -namespace tested.robotscs -{ - public class ReflectionAttack : AdvancedRobot - { - public override void Run() - { - FieldInfo fieldInfo = typeof(Console).GetField("_out", BindingFlags.Static | BindingFlags.NonPublic); - object obj = fieldInfo.GetValue(null); - fieldInfo.SetValue(null, null); - - MethodInfo method = obj.GetType().GetMethod("Write", new[] { typeof(string) }); - method.Invoke(obj, new Object[] { "Hello World" }); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RobotDeathEvents.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RobotDeathEvents.cs deleted file mode 100644 index eed772e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/RobotDeathEvents.cs +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; -using Robocode.Exception; - -namespace tested.robotscs -{ - public class RobotDeathEvents : AdvancedRobot - { - private bool dead; - private long enemyCount; - - public override void Run() - { - enemyCount = Others; - while (!dead) - { - if (enemyCount != Others) - { - throw new RobotException("enemyCount != GetOthers()"); - } - Execute(); - } - } - - public override void OnRobotDeath(RobotDeathEvent e) - { - enemyCount--; - } - - public override void OnDeath(DeathEvent e) - { - dead = true; - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/SkipTurns.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/SkipTurns.cs deleted file mode 100644 index 582530b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/SkipTurns.cs +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Threading; -using Robocode; -using Robocode.Exception; -using Thread = Robocode.Thread; - -namespace tested.robotscs -{ - public class SkipTurns : AdvancedRobot - { - private volatile int skipped = 0; - - private const int limit = 5; - - public override void Run() - { - // noinspection InfiniteLoopStatement - for (;;) - { - if (skipped > limit) - { - throw new RobotException("satisfied, end battle please"); - } - TurnLeft(10); - if (skipped > limit) - { - // satisfied, end battle please - throw new RobotException(); - } - Ahead(1); - if (skipped > limit) - { - // satisfied, end battle please - throw new RobotException(); - } - TurnLeft(10); - if (skipped > limit) - { - // satisfied, end battle please - throw new RobotException(); - } - Back(1); - } - } - - - public override void OnStatus(StatusEvent e) - { - Out.WriteLine("live"); - slowResponse(); - } - - - public override void OnSkippedTurn(SkippedTurnEvent evnt) - { - Out.WriteLine("Skipped!!!"); - - skipped++; - } - - private void slowResponse() - { - try - { - if (skipped > 3) - { - Thread.Sleep(3000); - } - else - { - Thread.Sleep(100); - } - } - catch (Exception ex) - { - // eat interrupt - Out.WriteLine(ex); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TestTeam.team b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TestTeam.team deleted file mode 100644 index 69457ad..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TestTeam.team +++ /dev/null @@ -1,7 +0,0 @@ -#Robocode robot CS team -#Sat Oct 25 22:23:58 CEST 2008 -team.members=SampleCsTeam.MyFirstLeader,SampleCsTeam.MyFirstDroid,SampleCs.Fire -team.author.name= -robocode.version=unknown -uuid=8abd63e8-1156-4fb4-a81f-eb10fca9596d -team.description=testteam diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ThreadAttack.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ThreadAttack.cs deleted file mode 100644 index 9cdce98..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/ThreadAttack.cs +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Threading; -using Robocode; -using Thread = Robocode.Thread; - -namespace tested.robotscs -{ - public class ThreadAttack : AdvancedRobot - { - public override void Run() - { - // noinspection InfiniteLoopStatement - for (;;) - { - TurnLeft(100); - Ahead(10); - TurnLeft(100); - Back(10); - } - } - - - public override void OnScannedRobot(ScannedRobotEvent evnt) - { - runAttack(); - } - - private void runAttack() - { - Thread t2 = new Thread(attack); - t2.Start(); - } - - private readonly Semaphore s = new Semaphore(0, 1); - - private int counter; - - public void attack() - { - int id = counter++; - - Out.WriteLine("Running id:" + id); - - try - { - s.WaitOne(); - } - catch (Exception e) - { - Out.WriteLine("Interrupted id:" + id + e.Message); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TooLongNameThisIsReallyTooLongNameCs.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TooLongNameThisIsReallyTooLongNameCs.cs deleted file mode 100644 index 6f30aed..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/TooLongNameThisIsReallyTooLongNameCs.cs +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tested.robotscs -{ - public class TooLongNameThisIsReallyTooLongNameCs : Robot - { - public override void Run() - { - while (true) - { - Ahead(1); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(1); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/UndeadThread.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/UndeadThread.cs deleted file mode 100644 index 4c05a89..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/UndeadThread.cs +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode; - -namespace tested.robotscs -{ - /** - * @author Pavel Savara (original) - */ - - public class UndeadThread : AdvancedRobot - { - public override void Run() - { - Out.WriteLine("I will live forever!"); - // noinspection InfiniteLoopStatement - while (true) - { - body(); - } - } - - private void body() - { - bool normal=false; - try - { - loop(); - } - catch(Exception) - { - Out.WriteLine("that's my time"); - normal = true; - } - finally - { - if (!normal) - { - // spamming the console - Out.WriteLine("Swalowed it, HA HA HA HA HAAAAA !!!!!"); - loop(); - body(); - } - } - } - - private void loop() - { - while (true) - { - TurnLeft(100); - Ahead(10); - TurnLeft(100); - Back(10); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/WatchBullets.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/WatchBullets.cs deleted file mode 100644 index c096e60..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tested/robotscs/WatchBullets.cs +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Globalization; -using Robocode; -using Robocode.Util; - -namespace tested.robotscs -{ - /* - * @author Pavel Savara (original) - */ - - public class WatchBullets : AdvancedRobot - { - public override void Run() - { - while (true) - { - Ahead(100); - TurnGunRight(360); - Back(100); - TurnGunRight(360); - } - } - - private Bullet bullet; - - public override void OnStatus(StatusEvent evnt) - { - dump(); - } - - - public override void OnBulletHit(BulletHitEvent evnt) - { - if (bullet != evnt.Bullet) - { - Out.WriteLine("Failed bullet identity"); - } - } - - - public override void OnScannedRobot(ScannedRobotEvent e) - { - // Calculate exact location of the robot - double absoluteBearing = Heading + e.Bearing; - double bearingFromGun = Utils.NormalRelativeAngle(absoluteBearing - GunHeading); - - // If it's close enough, fire! - if (Math.Abs(bearingFromGun) <= 3) - { - TurnGunRight(bearingFromGun); - // We check gun heat here, because calling Fire() - // uses a turn, which could cause us to lose track - // of the other robot. - if (GunHeat == 0 && bullet == null) - { - Bullet lbullet = FireBullet(Math.Min(3 - Math.Abs(bearingFromGun), Energy - .1)); - - bullet = lbullet; - } - } // otherwise just set the gun to turn. - // Note: This will have no effect until we call Scan() - else - { - TurnGunRight(bearingFromGun); - } - // Generates another scan event if we see a robot. - // We only need to call this if the gun (and therefore radar) - // are not turning. Otherwise, scan is called automatically. - if (bearingFromGun == 0) - { - Scan(); - } - } - - private void dump() - { - if (bullet != null) - { - Out.WriteLine( - Time + " " + bullet.X.ToString("F5", CultureInfo.InvariantCulture) + " " + bullet.Y.ToString("F5", CultureInfo.InvariantCulture) + " " + bullet.Heading.ToString("F5", CultureInfo.InvariantCulture) + " " - + bullet.IsActive); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespaceCs.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespaceCs.cs deleted file mode 100644 index 4279c08..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.robotscs/src/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespaceCs.cs +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace tooLongNamespaceThisIsReallyTooLongNamespace -{ - public class TooLongNamespaceCs : Robot - { - public override void Run() - { - while (true) - { - Ahead(1); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(1); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.project deleted file mode 100644 index 350b981..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.project +++ /dev/null @@ -1,10 +0,0 @@ - - - robocode.dotnet.samples - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.api - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 554237f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -#Tue Nov 27 22:34:11 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/pom.xml deleted file mode 100644 index 31a2de2..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - robocode.dotnet.samples - Robocode .NET Samples - dotnet:library - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - - net.sf.robocode - robocode.dotnet.api - ${project.version} - dotnet:library - - - - samplescs-${project.version} - src - - - org.sonatype.nmaven.plugins - maven-dotnet-compiler-plugin - - /warn:0 - samplescs-${project.version}.dll - - - - - - src - false - - **/*.vb - **/*.cs - **/*.fs - **/*.fsproj - **/*.properties - **/*.team - **/*.html - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/robocode.dotnet.samples.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/robocode.dotnet.samples.iml deleted file mode 100644 index e5ededf..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/robocode.dotnet.samples.iml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.csproj deleted file mode 100644 index 478e6ae..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.csproj +++ /dev/null @@ -1,91 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {80857B97-6397-487B-A9F5-B07026DCB666} - Library - SampleCs - samplescs-1.9.2.4 - v4.0 - 512 - - - 3.5 - - - - true - full - false - .\ - obj\ - DEBUG;TRACE - prompt - 4 - false - false - - - pdbonly - true - .\ - obj\ - - - prompt - 4 - true - - - - False - ..\libs\robocode.dll - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.sln b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.sln deleted file mode 100644 index 66ab900..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleCs", "SampleCs.csproj", "{80857B97-6397-487B-A9F5-B07026DCB666}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {80857B97-6397-487B-A9F5-B07026DCB666}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80857B97-6397-487B-A9F5-B07026DCB666}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80857B97-6397-487B-A9F5-B07026DCB666}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80857B97-6397-487B-A9F5-B07026DCB666}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Corners.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Corners.cs deleted file mode 100644 index f4d4a97..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Corners.cs +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; -using Robocode; -using Robocode.Util; - -namespace SampleCs -{ - /// - /// Corners - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// This robot moves to a corner, then swings the gun back and forth. - /// If it dies, it tries a new corner in the next round. - ///

- public class Corners : Robot - { - private int others; // Number of other robots in the game - private static int corner; // Which corner we are currently using - // static so that it keeps it between rounds. - private bool stopWhenSeeRobot; // See goCorner() - - /// - /// run: Corners' main run function. - /// - public override void Run() - { - // Set colors - BodyColor = (Color.Red); - GunColor = (Color.Black); - RadarColor = (Color.Yellow); - BulletColor = (Color.Green); - ScanColor = (Color.Green); - - // Save # of other bots - others = Others; - - // Move to a corner - goCorner(); - - // Initialize gun turn speed to 3 - int gunIncrement = 3; - - // Spin gun back and forth - while (true) - { - for (int i = 0; i < 30; i++) - { - TurnGunLeft(gunIncrement); - } - gunIncrement *= -1; - } - } - - /// - /// goCorner: A very inefficient way to get to a corner. Can you do better? - /// - public void goCorner() - { - // We don't want to stop when we're just turning... - stopWhenSeeRobot = false; - // turn to face the wall to the "right" of our desired corner. - TurnRight(Utils.NormalRelativeAngleDegrees(corner - Heading)); - // Ok, now we don't want to crash into any robot in our way... - stopWhenSeeRobot = true; - // Move to that wall - Ahead(5000); - // Turn to face the corner - TurnLeft(90); - // Move to the corner - Ahead(5000); - // Turn gun to starting point - TurnGunLeft(90); - } - - /// - /// onScannedRobot: Stop and Fire! - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - // Should we stop, or just Fire? - if (stopWhenSeeRobot) - { - // Stop everything! You can safely call stop multiple times. - Stop(); - // Call our custom firing method - smartFire(e.Distance); - // Look for another robot. - // NOTE: If you call scan() inside onScannedRobot, and it sees a robot, - // the game will interrupt the event handler and start it over - Scan(); - // We won't get here if we saw another robot. - // Okay, we didn't see another robot... start moving or turning again. - Resume(); - } - else - { - smartFire(e.Distance); - } - } - - /// - /// smartFire: Custom Fire method that determines firepower based on distance. - /// - /// - /// the distance to the robot to Fire at - /// - public void smartFire(double robotDistance) - { - if (robotDistance > 200 || Energy < 15) - { - Fire(1); - } - else if (robotDistance > 50) - { - Fire(2); - } - else - { - Fire(3); - } - } - - /// - /// onDeath: We died. Decide whether to try a different corner next game. - /// - public override void OnDeath(DeathEvent e) - { - // Well, others should never be 0, but better safe than sorry. - if (others == 0) - { - return; - } - - // If 75% of the robots are still alive when we die, we'll switch corners. - if ((others - Others)/(double) others < .75) - { - corner += 90; - if (corner == 270) - { - corner = -90; - } - Out.WriteLine("I died and did poorly... switching corner to " + corner); - } - else - { - Out.WriteLine("I died but did well. I will still use corner " + corner); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Crazy.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Crazy.cs deleted file mode 100644 index 69df1b8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Crazy.cs +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; -using Robocode; - -namespace SampleCs -{ - /// - /// Crazy - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - /// This robot moves around in a crazy pattern - /// - public class Crazy : AdvancedRobot - { - private bool movingForward; - - /// - /// run: Crazy's main run function - /// - public override void Run() - { - BodyColor = (Color.FromArgb(0, 200, 0)); - GunColor = (Color.FromArgb(0, 150, 50)); - RadarColor = (Color.FromArgb(0, 100, 100)); - BulletColor = (Color.FromArgb(255, 255, 100)); - ScanColor = (Color.FromArgb(255, 200, 200)); - - // Loop forever - while (true) - { - // Tell the game we will want to move ahead 40000 -- some large number - SetAhead(40000); - movingForward = true; - // Tell the game we will want to turn right 90 - SetTurnRight(90); - // At this point, we have indicated to the game that *when we do something*, - // we will want to move ahead and turn right. That's what "set" means. - // It is important to realize we have not done anything yet! - // In order to actually move, we'll want to call a method that - // takes real time, such as WaitFor. - // WaitFor actually starts the action -- we start moving and turning. - // It will not return until we have finished turning. - WaitFor(new TurnCompleteCondition(this)); - // Note: We are still moving ahead now, but the turn is complete. - // Now we'll turn the other way... - SetTurnLeft(180); - // ... and wait for the turn to finish ... - WaitFor(new TurnCompleteCondition(this)); - // ... then the other way ... - SetTurnRight(180); - // .. and wait for that turn to finish. - WaitFor(new TurnCompleteCondition(this)); - // then back to the top to do it all again - } - } - - /// - /// onHitWall: Handle collision with wall. - /// - public override void OnHitWall(HitWallEvent e) - { - // Bounce off! - reverseDirection(); - } - - /// - /// reverseDirection: Switch from ahead to back & vice versa - /// - public void reverseDirection() - { - if (movingForward) - { - SetBack(40000); - movingForward = false; - } - else - { - SetAhead(40000); - movingForward = true; - } - } - - /// - /// onScannedRobot: Fire! - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - Fire(1); - } - - /// - /// onHitRobot: Back up! - /// - public override void OnHitRobot(HitRobotEvent e) - { - // If we're moving the other robot, reverse! - if (e.IsMyFault) - { - reverseDirection(); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Fire.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Fire.cs deleted file mode 100644 index 205454a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Fire.cs +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; -using Robocode; -using Robocode.Util; - -namespace SampleCs -{ - /// - /// Fire - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - /// Sits still. Spins gun around. Moves when hit. - /// - public class Fire : Robot - { - private int dist = 50; // distance to move when we're hit - - /// - /// run: Fire's main run function - /// - public override void Run() - { - // Set colors - BodyColor = (Color.Orange); - GunColor = (Color.Orange); - RadarColor = (Color.Red); - ScanColor = (Color.Red); - BulletColor = (Color.Red); - - // Spin the gun around slowly... forever - while (true) - { - TurnGunRight(5); - } - } - - /// - /// onScannedRobot: Fire! - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - // If the other robot is close by, and we have plenty of life, - // Fire hard! - if (e.Distance < 50 && Energy > 50) - { - Fire(3); - } // otherwise, Fire 1. - else - { - Fire(1); - } - // Call scan again, before we turn the gun - Scan(); - } - - /// - /// onHitByBullet: Turn perpendicular to the bullet, and move a bit. - /// - public override void OnHitByBullet(HitByBulletEvent e) - { - TurnRight(Utils.NormalRelativeAngleDegrees(90 - (Heading - e.Heading))); - - Ahead(dist); - dist *= -1; - Scan(); - } - - /// - /// onHitRobot: Aim at it. Fire Hard! - /// - public override void OnHitRobot(HitRobotEvent e) - { - double turnGunAmt = Utils.NormalRelativeAngleDegrees(e.Bearing + Heading - GunHeading); - - TurnGunRight(turnGunAmt); - Fire(3); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Interactive.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Interactive.cs deleted file mode 100644 index eaa38ef..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Interactive.cs +++ /dev/null @@ -1,218 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using Robocode; -using Robocode.Util; - -namespace SampleCs -{ - /// - /// Interactive - a sample robot by Flemming N. Larsen. - ///

- /// This is a robot that is controlled using the arrow keys and mouse only. - ///

- /// Keys: - /// - Arrow up: Move forward - /// - Arrow down: Move backward - /// - Arrow right: Turn right - /// - Arrow left: Turn left - /// Mouse: - /// - Moving: Moves the aim, which the gun will follow - /// - Wheel up: Move forward - /// - Wheel down: Move backward - /// - Button 1: Fire a bullet with power = 1 - /// - Button 2: Fire a bullet with power = 2 - /// - Button 3: Fire a bullet with power = 3 - ///

- /// The bullet color depends on the Fire power: - /// - Power = 1: Yellow - /// - Power = 2: Orange - /// - Power = 3: Red - ///

- /// Note that the robot will continue firing as long as the mouse button is - /// pressed down. - ///

- /// By enabling the "Paint" button on the robot console window for this robot, - /// a cross hair will be painted for the robots current aim (controlled by the - /// mouse). - ///

- public class Interactive : AdvancedRobot - { - // Move direction: 1 = move forward, 0 = stand still, -1 = move backward - private int moveDirection; - - // Turn direction: 1 = turn right, 0 = no turning, -1 = turn left - private int turnDirection; - - // Amount of pixels/units to move - private double moveAmount; - - // The coordinate of the aim (x,y) - private int aimX, aimY; - - // Fire power, where 0 = don't Fire - private int firePower; - - // Called when the robot must run - public override void Run() - { - // Sets the colors of the robot - // body = black, gun = white, radar = red - SetColors(Color.Black, Color.White, Color.Red); - - // Loop forever - for (;;) - { - // Sets the robot to move forward, backward or stop moving depending - // on the move direction and amount of pixels to move - SetAhead(moveAmount*moveDirection); - - // Decrement the amount of pixels to move until we reach 0 pixels - // This way the robot will automatically stop if the mouse wheel - // has stopped it's rotation - moveAmount = Math.Max(0, moveAmount - 1); - - // Sets the robot to turn right or turn left (at maximum speed) or - // stop turning depending on the turn direction - SetTurnRight(45*turnDirection); // degrees - - // Turns the gun toward the current aim coordinate (x,y) controlled by - // the current mouse coordinate - double angle = Utils.NormalAbsoluteAngle(Math.Atan2(aimX - X, aimY - Y)); - - SetTurnGunRightRadians(Utils.NormalRelativeAngle(angle - GunHeadingRadians)); - - // Fire the gun with the specified Fire power, unless the Fire power = 0 - if (firePower > 0) - { - SetFire(firePower); - } - - // Execute all pending set-statements - Execute(); - - // Next turn is processed in this loop.. - } - } - - // Called when a key has been pressed - public override void OnKeyPressed(KeyEvent e) - { - switch (e.KeyCode) - { - case Keys.VK_UP: - // Arrow up key: move direction = forward (infinitely) - moveDirection = 1; - moveAmount = Double.PositiveInfinity; - break; - - case Keys.VK_DOWN: - // Arrow down key: move direction = backward (infinitely) - moveDirection = -1; - moveAmount = Double.PositiveInfinity; - break; - - case Keys.VK_RIGHT: - // Arrow right key: turn direction = right - turnDirection = 1; - break; - - case Keys.VK_LEFT: - // Arrow left key: turn direction = left - turnDirection = -1; - break; - } - } - - // Called when a key has been released (after being pressed) - public override void OnKeyReleased(KeyEvent e) - { - switch (e.KeyCode) - { - case Keys.VK_UP: - case Keys.VK_DOWN: - // Arrow up and down keys: move direction = stand still - moveDirection = 0; - moveAmount = 0; - break; - - case Keys.VK_RIGHT: - case Keys.VK_LEFT: - // Arrow right and left keys: turn direction = stop turning - turnDirection = 0; - break; - } - } - - // Called when the mouse wheel is rotated - public override void OnMouseWheelMoved(MouseWheelMovedEvent e) - { - // If the wheel rotation is negative it means that it is moved forward. - // Set move direction = forward, if wheel is moved forward. - // Otherwise, set move direction = backward - moveDirection = (e.WheelRotation < 0) ? 1 : -1; - - // Set the amount to move = absolute wheel rotation amount * 5 (speed) - // Here 5 means 5 pixels per wheel rotation step. The higher value, the - // more speed - moveAmount += Math.Abs(e.WheelRotation)*5; - } - - // Called when the mouse has been moved - public override void OnMouseMoved(MouseEvent e) - { - // Set the aim coordinate = the mouse pointer coordinate - aimX = e.X; - aimY = e.Y; - } - - // Called when a mouse button has been pressed - public override void OnMousePressed(MouseEvent e) - { - if (e.Button == Keys.BUTTON3) - { - // Button 3: Fire power = 3 energy points, bullet color = red - firePower = 3; - BulletColor = (Color.Red); - } - else if (e.Button == Keys.BUTTON2) - { - // Button 2: Fire power = 2 energy points, bullet color = orange - firePower = 2; - BulletColor = (Color.Orange); - } - else - { - // Button 1 or unknown button: - // Fire power = 1 energy points, bullet color = yellow - firePower = 1; - BulletColor = (Color.Yellow); - } - } - - // Called when a mouse button has been released (after being pressed) - public override void OnMouseReleased(MouseEvent e) - { - // Fire power = 0, which means "don't Fire" - firePower = 0; - } - - // Called in order to paint graphics for this robot. - // "Paint" button on the robot console window for this robot must be - // enabled in order to see the paintings. - public override void OnPaint(IGraphics g) - { - // Draw a red cross hair with the center at the current aim - // coordinate (x,y) - g.DrawEllipse(Pens.Red, aimX - 15, aimY - 15, 30, 30); - g.DrawLine(Pens.Red, aimX, aimY - 4, aimX, aimY + 4); - g.DrawLine(Pens.Red, aimX - 4, aimY, aimX + 4, aimY); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstJuniorRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstJuniorRobot.cs deleted file mode 100644 index 2cd6050..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstJuniorRobot.cs +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace SampleCs -{ - /// - /// MyFirstJuniorRobot - a sample robot by Flemming N. Larsen - ///

- /// Moves in a seesaw motion, and spins the gun around at each end - /// when it cannot see any enemy robot. When the robot sees and enemy - /// robot, it will immediately turn the gun and Fire at it. - ///

- public class MyFirstJuniorRobot : JuniorRobot - { - /// - /// MyFirstJuniorRobot's run method - Seesaw as default - /// - public override void Run() - { - // Set robot colors - SetColors(GREEN, BLACK, BLUE); - - // Seesaw forever - while (true) - { - Ahead(100); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(100); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - - /// - /// When we see a robot, turn the gun towards it and Fire - /// - public override void OnScannedRobot() - { - // Turn gun to point at the scanned robot - TurnGunTo(ScannedAngle); - - // Fire! - Fire(1); - } - - /// - /// We were hit! Turn and move perpendicular to the bullet, - /// so our seesaw might avoid a future shot. - /// - public override void OnHitByBullet() - { - // Move ahead 100 and in the same time turn left papendicular to the bullet - TurnAheadLeft(100, 90 - HitByBulletBearing); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstRobot.cs deleted file mode 100644 index a79a791..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/MyFirstRobot.cs +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace SampleCs -{ - /// - /// MyFirstRobot - a sample robot by Mathew Nelson - ///

- /// Moves in a seesaw motion, and spins the gun around at each end - ///

- public class MyFirstRobot : Robot - { - /// - /// MyFirstRobot's run method - Seesaw - /// - public override void Run() - { - while (true) - { - Ahead(100); // Move ahead 100 - TurnGunRight(360); // Spin gun around - Back(100); // Move back 100 - TurnGunRight(360); // Spin gun around - } - } - - /// - /// Fire when we see a robot - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - Fire(1); - } - - /// - /// We were hit! Turn perpendicular to the bullet, - /// so our seesaw might avoid a future shot. - /// - public override void OnHitByBullet(HitByBulletEvent e) - { - TurnLeft(90 - e.Bearing); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PaintingRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PaintingRobot.cs deleted file mode 100644 index c6822ef..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PaintingRobot.cs +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; -using Robocode; - -namespace SampleCs -{ - /// - /// PaintingRobot - a sample robot that demonstrates the OnPaint() and - /// GetGraphics() methods. - /// Also demonstrate feature of debugging properties on RobotDialog - ///

- /// Moves in a seesaw motion, and spins the gun around at each end. - /// When painting is enabled for this robot, a red circle will be painted - /// around this robot. - ///

- public class PaintingRobot : Robot - { - /// - /// PaintingRobot's Run method - Seesaw - /// - public override void Run() - { - while (true) - { - Ahead(100); - TurnGunRight(360); - Back(100); - TurnGunRight(360); - } - } - - /// - /// Fire when we see a robot - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - // demonstrate feature of debugging properties on RobotDialog - DebugProperty["lastScannedRobot"] = e.Name + " at " + e.Bearing + " degrees at time " + Time; - - Fire(1); - } - - /// - /// We were hit! Turn perpendicular to the bullet, - /// so our seesaw might avoid a future shot. - /// In addition, draw orange circles where we were hit. - /// - public override void OnHitByBullet(HitByBulletEvent e) - { - // demonstrate feature of debugging properties on RobotDialog - DebugProperty["lastHitBy"] = e.Name + " with power of bullet " + e.Power + " at time " + Time; - - // show how to remove debugging property - DebugProperty["lastScannedRobot"] = null; - - // gebugging by painting to battle view - IGraphics g = Graphics; - - g.DrawEllipse(Pens.Orange, (int) (X - 55), (int) (Y - 55), 110, 110); - g.DrawEllipse(Pens.Orange, (int) (X - 56), (int) (Y - 56), 112, 112); - g.DrawEllipse(Pens.Orange, (int) (X - 59), (int) (Y - 59), 118, 118); - g.DrawEllipse(Pens.Orange, (int) (X - 60), (int) (Y - 60), 120, 120); - - TurnLeft(90 - e.Bearing); - } - - /// - /// Paint a red circle around our PaintingRobot - /// - public override void OnPaint(IGraphics graphics) - { - var transparentGreen = new SolidBrush(Color.FromArgb(30, 0, 0xFF, 0)); - graphics.FillEllipse(transparentGreen, (int) (X - 60), (int) (Y - 60), 120, 120); - graphics.DrawEllipse(Pens.Red, (int) (X - 50), (int) (Y - 50), 100, 100); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PointD.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PointD.cs deleted file mode 100644 index 433242d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/PointD.cs +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Collections.Generic; -using System.Text; - -namespace SampleCs -{ - [Serializable] - public class PointD - { - public PointD(double x, double y) - { - X = x; - Y = y; - } - - public double X { get; set; } - - public double Y { get; set; } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RamFire.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RamFire.cs deleted file mode 100644 index f847cb9..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RamFire.cs +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; -using Robocode; - -namespace SampleCs -{ - /// - /// RamFire - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Drives at robots trying to ram them. - /// Fires when it hits them. - ///

- public class RamFire : Robot - { - private int turnDirection = 1; // Clockwise or counterclockwise - - /// - /// run: Spin around looking for a target - /// - public override void Run() - { - // Set colors - BodyColor = (Color.LightGray); - GunColor = (Color.Gray); - RadarColor = (Color.DarkGray); - - while (true) - { - TurnRight(5*turnDirection); - } - } - - /// - /// onScannedRobot: We have a target. Go get it. - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - if (e.Bearing >= 0) - { - turnDirection = 1; - } - else - { - turnDirection = -1; - } - - TurnRight(e.Bearing); - Ahead(e.Distance + 5); - Scan(); // Might want to move ahead again! - } - - /// - /// onHitRobot: Turn to face robot, fire hard, and ram him again! - /// - public override void OnHitRobot(HitRobotEvent e) - { - if (e.Bearing >= 0) - { - turnDirection = 1; - } - else - { - turnDirection = -1; - } - TurnRight(e.Bearing); - - // Determine a shot that won't kill the robot... - // We want to ram him instead for bonus points - if (e.Energy > 16) - { - Fire(3); - } - else if (e.Energy > 10) - { - Fire(2); - } - else if (e.Energy > 4) - { - Fire(1); - } - else if (e.Energy > 2) - { - Fire(.5); - } - else if (e.Energy > .4) - { - Fire(.1); - } - Ahead(40); // Ram him again! - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RobotColors.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RobotColors.cs deleted file mode 100644 index 40c1d1d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/RobotColors.cs +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; - -namespace SampleCs -{ - [Serializable] - public class RobotColors - { - public Color bodyColor; - public Color bulletColor; - public Color gunColor; - public Color radarColor; - public Color scanColor; - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SittingDuck.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SittingDuck.cs deleted file mode 100644 index aecf108..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SittingDuck.cs +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using System.IO; -using Robocode; - -namespace SampleCs -{ - /// - /// SittingDuck - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Along with sitting still doing nothing, this robot demonstrates persistency. - ///

- public class SittingDuck : AdvancedRobot - { - private static bool incrementedBattles; - - public override void Run() - { - BodyColor = (Color.Yellow); - GunColor = (Color.Yellow); - - int roundCount = 0; - int battleCount = 0; - - // Read file "count.dat" which contains 2 integers, - try - { - using (Stream count = GetDataFile("count.dat")) - { - if (count.Length != 0) - { - using (TextReader tr = new StreamReader(count)) - { - roundCount = int.Parse(tr.ReadLine()); - battleCount = int.Parse(tr.ReadLine()); - } - } - } - } - catch (Exception) - { - // Something went wrong reading the file, reset to 0. - roundCount = 0; - battleCount = 0; - } - - // Increment the # of rounds - roundCount++; - // If we haven't incremented # of battles already, - // (Note: Because robots are only instantiated once per battle, - // member variables remain valid throughout it. - if (!incrementedBattles) - { - // Increment # of battles - battleCount++; - incrementedBattles = true; - } - - try - { - using (Stream count = GetDataFile("count.dat")) - { - count.SetLength(0); - using (TextWriter tw = new StreamWriter(count)) - { - tw.WriteLine(roundCount); - tw.WriteLine(battleCount); - } - } - } - catch (Exception) - { - Out.WriteLine("I could not write the count!"); - } - - Out.WriteLine("I have been a sitting duck for " + roundCount + " rounds, in " + battleCount + " battles."); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SpinBot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SpinBot.cs deleted file mode 100644 index 0939278..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/SpinBot.cs +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System.Drawing; -using Robocode; - -namespace SampleCs -{ - /// - /// SpinBot - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Moves in a circle, firing hard when an enemy is detected - ///

- public class SpinBot : AdvancedRobot - { - /// - /// SpinBot's run method - Circle - /// - public override void Run() - { - // Set colors - BodyColor = (Color.Blue); - GunColor = (Color.Blue); - RadarColor = (Color.Black); - ScanColor = (Color.Yellow); - - // Loop forever - while (true) - { - // Tell the game that when we take move, - // we'll also want to turn right... a lot. - SetTurnRight(10000); - // Limit our speed to 5 - MaxVelocity = 5; - // Start moving (and turning) - Ahead(10000); - // Repeat. - } - } - - /// - /// onScannedRobot: Fire hard! - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - Fire(3); - } - - /// - /// - /// onHitRobot: If it's our fault, we'll stop turning and moving, - /// so we need to turn again to keep spinning. - /// - public override void OnHitRobot(HitRobotEvent e) - { - if (e.Bearing > -10 && e.Bearing < 10) - { - Fire(3); - } - if (e.IsMyFault) - { - TurnRight(10); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Target.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Target.cs deleted file mode 100644 index 2079950..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Target.cs +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - - -using System.Drawing; -using Robocode; - -namespace SampleCs -{ - /// - /// Target - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Sits still. Moves every time energy drops by 20. - /// This Robot demonstrates custom events. - ///

- public class Target : AdvancedRobot - { - private int trigger; // Keeps track of when to move - - /// - /// TrackFire's run method - /// - public override void Run() - { - // Set colors - BodyColor = (Color.White); - GunColor = (Color.White); - RadarColor = (Color.White); - - // Initially, we'll move when life hits 80 - trigger = 80; - // Add a custom event named "trigger hit", - AddCustomEvent( - new Condition("triggerhit", - (c) => - { - return Energy <= trigger; - })); - } - - /// - /// onCustomEvent handler - /// - public override void OnCustomEvent(CustomEvent e) - { - // If our custom event "triggerhit" went off, - if (e.Condition.Name == "triggerhit") - { - // Adjust the trigger value, or - // else the event will fire again and again and again... - trigger -= 20; - Out.WriteLine("Ouch, down to " + (int) (Energy + .5) + " energy."); - // move around a bit. - TurnLeft(65); - Ahead(100); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/TrackFire.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/TrackFire.cs deleted file mode 100644 index 25ad660..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/TrackFire.cs +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using Robocode; -using Robocode.Util; - -namespace SampleCs -{ - /// - /// TrackFire - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Sits still. Tracks and fires at the nearest robot it sees - ///

- public class TrackFire : Robot - { - /// - /// TrackFire's run method - /// - public override void Run() - { - // Set colors - BodyColor = (Color.Pink); - GunColor = (Color.Pink); - RadarColor = (Color.Pink); - ScanColor = (Color.Pink); - BulletColor = (Color.Pink); - - // Loop forever - while (true) - { - TurnGunRight(10); // Scans automatically - } - } - - /// - /// onScannedRobot: We have a target. Go get it. - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - // Calculate exact location of the robot - double absoluteBearing = Heading + e.Bearing; - double bearingFromGun = Utils.NormalRelativeAngleDegrees(absoluteBearing - GunHeading); - - // If it's close enough, fire! - if (Math.Abs(bearingFromGun) <= 3) - { - TurnGunRight(bearingFromGun); - // We check gun heat here, because calling Fire() - // uses a turn, which could cause us to lose track - // of the other robot. - if (GunHeat == 0) - { - Fire(Math.Min(3 - Math.Abs(bearingFromGun), Energy - .1)); - } - } - else - { - // otherwise just set the gun to turn. - // Note: This will have no effect until we call scan() - TurnGunRight(bearingFromGun); - } - // Generates another scan event if we see a robot. - // We only need to call this if the gun (and therefore radar) - // are not turning. Otherwise, scan is called automatically. - if (bearingFromGun == 0) - { - Scan(); - } - } - - public override void OnWin(WinEvent e) - { - // Victory dance - TurnRight(36000); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Tracker.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Tracker.cs deleted file mode 100644 index 5396b95..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Tracker.cs +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using Robocode; -using Robocode.Util; - -namespace SampleCs -{ - /// - /// Tracker - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Locks onto a robot, moves close, fires when close. - ///

- public class Tracker : Robot - { - private int count; // Keeps track of how long we've - // been searching for our target - private double gunTurnAmt; // How much to turn our gun when searching - private String trackName; // Name of the robot we're currently tracking - - /// - /// run: Tracker's main run function - /// - public override void Run() - { - // Set colors - BodyColor = (Color.FromArgb(128, 128, 50)); - GunColor = (Color.FromArgb(50, 50, 20)); - RadarColor = (Color.FromArgb(200, 200, 70)); - ScanColor = (Color.White); - BulletColor = (Color.Blue); - - // Prepare gun - trackName = null; // Initialize to not tracking anyone - IsAdjustGunForRobotTurn = (true); // Keep the gun still when we turn - gunTurnAmt = 10; // Initialize gunTurn to 10 - - // Loop forever - while (true) - { - // turn the Gun (looks for enemy) - TurnGunRight(gunTurnAmt); - // Keep track of how long we've been looking - count++; - // If we've haven't seen our target for 2 turns, look left - if (count > 2) - { - gunTurnAmt = -10; - } - // If we still haven't seen our target for 5 turns, look right - if (count > 5) - { - gunTurnAmt = 10; - } - // If we *still* haven't seen our target after 10 turns, find another target - if (count > 11) - { - trackName = null; - } - } - } - - /// - /// onScannedRobot: Here's the good stuff - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - // If we have a target, and this isn't it, return immediately - // so we can get more ScannedRobotEvents. - if (trackName != null && e.Name != trackName) - { - return; - } - - // If we don't have a target, well, now we do! - if (trackName == null) - { - trackName = e.Name; - Out.WriteLine("Tracking " + trackName); - } - // This is our target. Reset count (see the run method) - count = 0; - // If our target is too far away, turn and move toward it. - if (e.Distance > 150) - { - gunTurnAmt = Utils.NormalRelativeAngleDegrees(e.Bearing + (Heading - RadarHeading)); - - TurnGunRight(gunTurnAmt); // Try changing these to setTurnGunRight, - TurnRight(e.Bearing); // and see how much Tracker improves... - // (you'll have to make Tracker an AdvancedRobot) - Ahead(e.Distance - 140); - return; - } - - // Our target is close. - gunTurnAmt = Utils.NormalRelativeAngleDegrees(e.Bearing + (Heading - RadarHeading)); - TurnGunRight(gunTurnAmt); - Fire(3); - - // Our target is too close! Back up. - if (e.Distance < 100) - { - if (e.Bearing > -90 && e.Bearing <= 90) - { - Back(40); - } - else - { - Ahead(40); - } - } - Scan(); - } - - /// - /// onHitRobot: Set him as our new target - /// - public override void OnHitRobot(HitRobotEvent e) - { - // Only print if he's not already our target. - if (trackName != null && trackName != e.Name) - { - Out.WriteLine("Tracking " + e.Name + " due to collision"); - } - // Set the target - trackName = e.Name; - // Back up a bit. - // Note: We won't get scan events while we're doing this! - // An AdvancedRobot might use setBack(); Execute(); - gunTurnAmt = Utils.NormalRelativeAngleDegrees(e.Bearing + (Heading - RadarHeading)); - TurnGunRight(gunTurnAmt); - Fire(3); - Back(50); - } - - /// - /// onWin: Do a victory dance - /// - public override void OnWin(WinEvent e) - { - for (int i = 0; i < 50; i++) - { - TurnRight(30); - TurnLeft(30); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/VelociRobot.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/VelociRobot.cs deleted file mode 100644 index e5e70d8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/VelociRobot.cs +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using Robocode; - -namespace SampleCs -{ - /// - /// This is a sample of a robot using the RateControlRobot class by Joshua Galecki - /// - public class VelociRobot : RateControlRobot - { - private int turnCounter; - - public override void Run() - { - turnCounter = 0; - GunRotationRate = (15); - - while (true) - { - if (turnCounter%64 == 0) - { - // Straighten out, if we were hit by a bullet and are turning - TurnRate = 0; - // Go forward with a velocity of 4 - VelocityRate = 4; - } - if (turnCounter%64 == 32) - { - // Go backwards, faster - VelocityRate = -6; - } - turnCounter++; - Execute(); - } - } - - public override void OnScannedRobot(ScannedRobotEvent e) - { - Fire(1); - } - - public override void OnHitByBullet(HitByBulletEvent e) - { - // Turn to confuse the other robot - TurnRate = 5; - } - - public override void OnHitWall(HitWallEvent e) - { - // Move away from the wall - VelocityRate = (-1*VelocityRate); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Walls.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Walls.cs deleted file mode 100644 index 988a5da..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCs/Walls.cs +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using Robocode; - -namespace SampleCs -{ - /// - /// Walls - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Moves around the outer edge with the gun facing in. - ///

- public class Walls : Robot - { - private bool peek; // Don't turn if there's a robot there - private double moveAmount; // How much to move - - /// - /// run: Move around the walls - /// - public override void Run() - { - // Set colors - BodyColor = (Color.Black); - GunColor = (Color.Black); - RadarColor = (Color.Orange); - BulletColor = (Color.Cyan); - ScanColor = (Color.Cyan); - - // Initialize moveAmount to the maximum possible for this battlefield. - moveAmount = Math.Max(BattleFieldWidth, BattleFieldHeight); - // Initialize peek to false - peek = false; - - // turnLeft to face a wall. - // getHeading() % 90 means the remainder of - // getHeading() divided by 90. - TurnLeft(Heading%90); - Ahead(moveAmount); - // Turn the gun to turn right 90 degrees. - peek = true; - TurnGunRight(90); - TurnRight(90); - - while (true) - { - // Look before we turn when ahead() completes. - peek = true; - // Move up the wall - Ahead(moveAmount); - // Don't look now - peek = false; - // Turn to the next wall - TurnRight(90); - } - } - - /// - /// onHitRobot: Move away a bit. - /// - public override void OnHitRobot(HitRobotEvent e) - { - // If he's in front of us, set back up a bit. - if (e.Bearing > -90 && e.Bearing < 90) - { - Back(100); - } // else he's in back of us, so set ahead a bit. - else - { - Ahead(100); - } - } - - /// - /// onScannedRobot: Fire! - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - Fire(2); - // Note that scan is called automatically when the robot is moving. - // By calling it manually here, we make sure we generate another scan event if there's a robot on the next - // wall, so that we do not start moving up it until it's gone. - if (peek) - { - Scan(); - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsSentry/BorderGuard.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsSentry/BorderGuard.cs deleted file mode 100644 index b2cec54..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsSentry/BorderGuard.cs +++ /dev/null @@ -1,763 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using Robocode; -using Robocode.Util; - -namespace SampleCsSentry -{ - /// - /// BorderGuard - is a sample robot that demonstrates how the BorderSentry interface can be used for - /// creating a robot that guards the border area of the battle field, and which is efficient against - /// robots trying to hide at corners and robots sneaking around near the borders. - ///

- /// This robot is somewhat advanced due to:
- /// 1) it uses linear targeting for predicting how to hit robots that moves in straight lines.
- /// 2) it will only fire at a robot, if it figures out that its bullets will do damage to that - /// particular robot, e.g. when the robots predicted future position will be within the sentry border - /// attack range.
- /// 3) it has an efficient scanner that keeps the scan angle as little as possible to get as new - /// scanned data for enemy robots as possible.
- /// 4) it picks a target robot to fire at, which is the nearest robot our robot will be able to - /// damage (by predicting its future position using linear targeting).
- /// 5) it only moves along the borders of the battle field and constantly changes its direction, so - /// it is not an easy target, and it will try to get as close to its target robot as possible.
- ///

- /// Lots of improvements can be made to this robot by copying it - making it even stronger. The - /// intention with of this sample robot is to serve as a more advanced example of how a AdvancedRobot - /// can be made, and how it can be structured as most sample robots are far simpler. - ///

- /// - /// Credits goes to the hard working Robocoders at the RoboWiki. :-) - ///

- /// - /// This robot makes use of the Oldest Scanned melee scanner from the RoboWiki:
- /// http://robowiki.net/wiki/Melee_Radar - ///

- /// - /// In addition, it makes use of the Exact Non-iterative Solution for Linear Targeting from the - /// RoboWiki:
- /// http://robowiki.net/wiki/Linear_Targeting - ///

- /// - /// Author: Flemming N. Larsen - ///

- /// Version: 1.0 - ///

- /// Since 1.9.2.4 - ///

- public class BorderGuard - : AdvancedRobot, IBorderSentry - { - // Constants - const double FIREPOWER = 3; // Max. power => violent as this robot can afford it! - const double HALF_ROBOT_SIZE = 18; // Robot size is 36x36 units, so the half size is 18 units - - // Dictionary containing data for all scanned robots. - // The key to the dictionary is a robot name and the value is an object containing robot data. - IDictionary enemyDictionary; - // List containing robot names where the order of names reflects the when these names was accessed the last time - // within the enemy dictionary. The first in the list is the name of the robot that was accessed the last time, - // and the last in the list is the oldest one. - IList accessedEnemyList; - - // Scanning direction, where the radar turns to the right with positive values, and turns - // to the left with negative values. - double scanDir = 1; - - // Oldest scanned robot. Can be null. - RobotData oldestScanned; - - // Target robot for the gun. Can be null meaning that there is currently no target robot. - RobotData target; - - // Last time when the robot shifted its direction - long lastDirectionShift; - - // Current direction, where 1 means ahead (forward) and -1 means back - int direction = 1; - - /// - /// Constructs this robot. - /// - public BorderGuard() - { - // We initialize a Dictionary containing robot data for each scanned robot, and also a - // List keeping track of the access order for the enemy dictionary. The last accessed robot - // entry is listed first in the List. - // This robot always sweep the radar towards the oldest scanned robot. - enemyDictionary = new Dictionary(); - accessedEnemyList = new List(); - } - - /// - /// Main method that is called by the game when the robot engage in the next round of a battle. - /// - public override void Run() - { - // Do initialization stuff here before the loop - Initialize(); - - // Loop forever. If the robot does not take action, the game will disable our robot! - while (true) - { - // Handle a single turn... - - // Handle the radar that scans enemy robots - HandleRadar(); - // Handle the gun by turning it and fire at our target - HandleGun(); - // Move the robot around on the battlefield - MoveRobot(); - - // Scan for other robots. Note that this method will execute all pending commands for - // the next turn. Hence, scan() ends the turn for our robot. - Scan(); - } - } - - /// - /// This method is called by the game when your robot sees another robot, i.e. when the robot's - /// radar scan "hits" another robot. - /// - /// The scanned robot event containing data about the scanned robot. - public override void OnScannedRobot(ScannedRobotEvent scannedRobotEvent) - { - // Check that the scanned robot is not a sentry robot - if (!scannedRobotEvent.IsSentryRobot) - { - // The scanned robot is not a sentry robot... - - // Update the enemy dictionary - UpdateEnemyDictionary(scannedRobotEvent); - - // Update the scan direction - UpdateScanDirection(scannedRobotEvent); - - // Update enemy target positions - UpdateEnemyTargetPositions(); - } - } - - /// - /// This method is called by the game when another robot dies. - /// - /// The robot death event containing data about the robot that died. - public override void OnRobotDeath(RobotDeathEvent robotDeathEvent) - { - // Gets the name of the robot that died - var deadRobotName = robotDeathEvent.Name; - - // Remove the robot data for the robot that died from the enemy dictionary and access list - enemyDictionary.Remove(deadRobotName); - accessedEnemyList.Remove(deadRobotName); - - // Remove the data entry for the oldest scanned robot, if we have such an entry - if (oldestScanned != null && oldestScanned.name.Equals(deadRobotName)) - { - oldestScanned = null; - } - if (target != null && target.name.Equals(deadRobotName)) - { - target = null; - } - } - - /// - /// This method is called by the every time the robot is painted. - /// - /// - /// In order to see the painting, make sure to enable the Paint button on the robot console for this robot. - /// - /// - /// The graphics context used for painting various shapes like rectangles, circles, lines etc. - /// on top of the battlefield for debugging graphics. - /// - public override void OnPaint(IGraphics g) - { - // Prepare colors for painting the scanned coordinate and target coordinate - var color1 = Color.FromArgb(0x40, 0x00, 0xFF, 0x00); // Green with 25% alpha blending - var color2 = Color.FromArgb(0x40, 0xFF, 0x00, 0x40); // Yellow with 25% alhpa blending - - // Prepare pen with color 1 and a width of 2 pixels - var pen = new Pen(color1, 2); - - // Paint a two circles for each robot in the enemy dictionary. One circle where the robot was - // scanned the last time, and another circle where our robot must point the gun in order to - // hit it (target coordinate). In addition, a line is drawn between these circles. - foreach (RobotData robot in enemyDictionary.Values) - { - // Paint the two circles and a line - FillCircle(g, robot.scannedX, robot.scannedY, color1); // scanned coordinate - FillCircle(g, robot.targetX, robot.targetY, color2); // target coordinate - g.DrawLine(pen, (float)robot.scannedX, (float)robot.scannedY, - (float)robot.targetX, (float)robot.targetY); - } - - // Paint a two circles for the target robot. One circle where the robot was - // scanned the last time, and another circle where our robot must point the gun in order to - // hit it (target coordinate). In addition, a line is drawn between these circles. - if (target != null) - { - // Prepare colors for painting the scanned coordinate and target coordinate - color1 = Color.FromArgb(0x40, 0xFF, 0x7F, 0x00); // Orange with 25% alpha blending - color2 = Color.FromArgb(0x80, 0xFF, 0x00, 0x00); // Red with 50% alpha blending - - // Prepare pen with color 1 and a width of 2 pixels - pen = new Pen(color1, 2); - - // Paint the two circles and a line - FillCircle(g, target.scannedX, target.scannedY, color1); // scanned coordinate - FillCircle(g, target.targetX, target.targetY, color2); // target coordinate - g.DrawLine(pen, (float)target.scannedX, (float)target.scannedY, - (float)target.targetX, (float)target.targetY); - } - } - - /// - /// Initializes this robot before a new round in a battle. - /// - private void Initialize() - { - // Let the robot body, gun, and radar turn independently of each other - IsAdjustRadarForGunTurn = true; - IsAdjustGunForRobotTurn = true; - - // Set robot colors - BodyColor = Color.FromArgb(0x5C, 0x33, 0x17); // Chocolate Brown - GunColor = Color.FromArgb(0x45, 0x8B, 0x74); // Aqua Marine - RadarColor = Color.FromArgb(0xD2, 0x69, 0x1E); // Orange Chocolate - BulletColor = Color.FromArgb(0xFF, 0xD3, 0x9B); // Burly wood - ScanColor = Color.FromArgb(0xCA, 0xFF, 0x70); // Olive Green - } - - /// - /// This method handles the radar that scans for enemy robots. - /// - private void HandleRadar() - { - // Set the radar to turn infinitely to the right if the scan direction is positive; - // otherwise the radar is moved to the left, if the scan direction is negative. - // Notice that onScannedRobot(ScannedRobotEvent) is responsible for determining the scan - // direction. - SetTurnRadarRightRadians(scanDir * Double.PositiveInfinity); - } - - /// - /// Method that handles the gun be turning it and fire at a target. - /// - private void HandleGun() - { - // Update our target robot to fire at - UpdateTarget(); - // Update the gun direction - UpdateGunDirection(); - // Fires the gun, when it is ready - FireGunWhenReady(); - } - - /// - /// Method that moves our robot around the battlefield. - /// - private void MoveRobot() - { - // The movement strategy is to move as close to our target robot as possible. - // Our robot should move along the borders all the time, vertically or horizontally. - // When we get close to our target, or have no where to go, our robot should shift its - // direction from side to side so it does not stand still at any time. - // If the robot stands still, it will be an easy target for enemy robots. - - int newDirection = direction; - - // Get closer to our target if we have a target robot - if (target != null) - { - // Calculate the range from the walls/borders, our robot should keep within - int borderRange = SentryBorderSize - 20; - - // The horizontal and vertical flags are used for determining, if our robot should - // move horizontal or vertical. - bool horizontal = false; - bool vertical = false; - - // Initialize the new heading of the robot to the current heading of the robot - double newHeading = HeadingRadians; - - // Check if our robot is at the upper or lower border and hence should move horizontally - if (X < borderRange || Y > BattleFieldHeight - borderRange) - { - horizontal = true; - } - // Check if our robot is at the left or right border and hence should move vertically - if (X < borderRange || X > BattleFieldWidth - borderRange) - { - vertical = true; - } - - // If we are in one of the corners of the battlefield, we could move both horizontally - // or vertically. - // In this situation, we need to choose one of the two directions. - if (horizontal && vertical) - { - // If the horizontal distance to our target is lesser than the vertical distance, - // then we choose to move vertically, and hence we clear the horizontal flag. - if (Math.Abs(target.targetX - X) <= Math.Abs(target.targetY - Y)) - { - horizontal = false; // Do not move horizontally => move vertically - } - } - // Adjust the heading of our robot with 90 degrees, if it must move horizontally. - // Otherwise the calculated heading is towards moving vertically. - if (horizontal) - { - newHeading -= Math.PI / 2; - } - // Set the robot to turn left the amount of radians we have just calculated - SetTurnLeftRadians(Utils.NormalRelativeAngle(newHeading)); - - // Check if our robot has finished turning, i.e. has less than 1 degrees left to turn - if (Math.Abs(TurnRemaining) < 1 || Math.Abs(Velocity) < 0.01) - { - // If we should move horizontally, the set the robot to move ahead with the - // horizontal distance to the target robot. Otherwise, use the vertical distance. - double delta; // delta is the delta distance to move - if (horizontal) - { - delta = target.targetX - X; - } - else - { - delta = target.targetY - Y; - } - SetAhead(delta); - - // Set the new direction of our robot to 1 (meaning move forward) if the delta - // distance is positive; otherwise it is set to -1 (meaning move backward). - newDirection = delta > 0 ? 1 : -1; - - // Check if more than 10 turns have past since we changed the direction the last - // time - if (Time - lastDirectionShift > 10) - { - // If so, set the new direction to be the reverse direction if the velocity < 1 - if (Math.Abs(Velocity) < 1) - { - newDirection = direction * -1; - } - // Check if the direction really changed - if (newDirection != direction) - { - // If the new direction != current direction, then set the current direction - // to be the new direction and save the current time so we know when we - // changed the direction the last time. - direction = newDirection; - lastDirectionShift = Time; - } - } - } - } - // Set ahead 100 units forward or backward depending on the direction - SetAhead(100 * direction); - } - - /// - /// Method the updates the enemy dictionary based on new scan data for a scanned robot. - /// - /// The scanned robot event containing data about the scanned robot. - private void UpdateEnemyDictionary(ScannedRobotEvent scannedRobotEvent) - { - var name = scannedRobotEvent.Name; - - // Check if data entry exists for the scanned robot - if (enemyDictionary.ContainsKey(name)) - { - // Data entry exists => Update the current entry with new scanned data - RobotData scannedRobot = enemyDictionary[name]; - scannedRobot.Update(scannedRobotEvent, this); - } - else - { - // No data entry exists => Create a new data entry for the scanned robot - RobotData scannedRobot = new RobotData(scannedRobotEvent, this); - // Put the new data entry into the enemy dictionary - enemyDictionary.Add(name, scannedRobot); - } - // Change the access order for the robot name, so the name is moved to, or added as the last entry - if (accessedEnemyList.Contains(name)) - { - accessedEnemyList.Remove(name); - } - accessedEnemyList.Add(name); - } - - /// - /// Method that updates the direction of the radar based on new scan data for a scanned robot. - /// - /// The scanned robot event containing data about the scanned robot. - private void UpdateScanDirection(ScannedRobotEvent scannedRobotEvent) - { - // Gets the name of the scanned robot - var scannedRobotName = scannedRobotEvent.Name; - - // Change the scanning direction if and only if we have no record for the oldest scanned - // robot or the scanned robot IS the oldest scanned robot (based on the name) AND the enemy - // dictionary contains scanned data entries for ALL robots (the size of the enemy dictionary is equal to - // the number of opponent robots found by calling the getOthers() method). - if ((oldestScanned == null || scannedRobotName.Equals(oldestScanned.name)) && accessedEnemyList.Count == Others) - { - // Get the oldest scanned robot data from our LinkedHashMap, where the first value - // contains the oldest accessed entry, which is the robot we need to get. - string oldestScannedName = accessedEnemyList[0]; - RobotData oldestScannedRobot = enemyDictionary[oldestScannedName]; - - // Get the recent scanned position (x,y) of the oldest scanned robot - double x = oldestScannedRobot.scannedX; - double y = oldestScannedRobot.scannedY; - - // Get the heading of our robot - double ourHeading = RadarHeadingRadians; - - // Calculate the bearing to the oldest scanned robot. - // The bearing is the delta angle between the heading of our robot and the other robot, - // which can be a positive or negative angle. - double bearing = BearingTo(ourHeading, x, y); - - // Update the scan direction based on the bearing. - // If the bearing is positive, the radar will be moved to the right. - // If the bearing is negative, the radar will be moved to the left. - scanDir = bearing; - } - } - - /// - /// Updates the target positions for all enemies. The target position is the position our robot - /// must fire at in order to hit the target robot. - /// - /// - /// This robot uses Linear Targeting (Exact Non-iterative Solution) as described on the RoboWiki here: - /// http://robowiki.net/wiki/Linear_Targeting - /// - private void UpdateEnemyTargetPositions() - { - // Go thru all robots in the enemy dictionary - foreach (RobotData enemy in enemyDictionary.Values) - { - // Variables prefixed with e- refer to enemy and b- refer to bullet - double bV = Rules.GetBulletSpeed(FIREPOWER); - double eX = enemy.scannedX; - double eY = enemy.scannedY; - double eV = enemy.scannedVelocity; - double eH = enemy.scannedHeading; - - // These constants make calculating the quadratic coefficients below easier - double A = (eX - X) / bV; - double B = (eY - Y) / bV; - double C = eV / bV * Math.Sin(eH); - double D = eV / bV * Math.Cos(eH); - - // Quadratic coefficients: a*(1/t)^2 + b*(1/t) + c = 0 - double a = A * A + B * B; - double b = 2 * (A * C + B * D); - double c = (C * C + D * D - 1); - - // If the discriminant of the quadratic formula is >= 0, we have a solution meaning that - // at some time, t, the bullet will hit the enemy robot if we fire at it now. - double discrim = b * b - 4 * a * c; - if (discrim >= 0) - { - // Reciprocal of quadratic formula. Calculate the two possible solution for the - // time, t - double t1 = 2 * a / (-b - Math.Sqrt(discrim)); - double t2 = 2 * a / (-b + Math.Sqrt(discrim)); - - // Choose the minimum positive time or select the one closest to 0, if the time is - // negative - double t = Math.Min(t1, t2) >= 0 ? Math.Min(t1, t2) : Math.Max(t1, t2); - - // Calculate the target position (x,y) for the enemy. That is the point that our gun - // should point at in order to hit the enemy at the time, t. - double targetX = eX + eV * t * Math.Sin(eH); - double targetY = eY + eV * t * Math.Cos(eH); - - // Assume enemy stops at walls. Hence, we limit that target position at the walls. - double minX = HALF_ROBOT_SIZE; - double minY = HALF_ROBOT_SIZE; - double maxX = BattleFieldWidth - HALF_ROBOT_SIZE; - double maxY = BattleFieldHeight - HALF_ROBOT_SIZE; - - enemy.targetX = Limit(targetX, minX, maxX); - enemy.targetY = Limit(targetY, minY, maxY); - } - } - } - - /// - /// Updates which enemy robot from the enemy dictionary that should be our current target. - /// - private void UpdateTarget() - { - // Set target to null, meaning that we have no target robot yet - target = null; - - // Create a list over possible target robots that is a copy of robot data from the enemy dictionary - List targets = new List(enemyDictionary.Values); - - // Run thru all the possible target robots and remove those that are outside the attack - // range for this border sentry robot as our robot cannot do harm to robots outside its - // range. - for (int i = targets.Count - 1; i >= 0; i--) // avoids error "Collection was modified" - { - RobotData robot = targets[i]; - if (IsOutsideAttackRange(robot.targetX, robot.targetY)) - { - targets.Remove(robot); - } - } - - // Set the target robot to be the one among all possible target robots that is closest to - // our robot. - double minDist = Double.PositiveInfinity; - foreach (RobotData robot in targets) - { - double dist = DistanceTo(robot.targetX, robot.targetY); - if (dist < minDist) - { - minDist = dist; - target = robot; - } - } - - // If we still haven't got a target robot, then take the first one from our list of target - // robots if the list is not empty. - if (target == null && targets.Count > 0) - { - target = targets[0]; - } - } - - /// - /// Method that updates the gun direction to point at the current target. - /// - private void UpdateGunDirection() - { - // Only update the gun direction, if we have a current target - if (target != null) - { - // Calculate the bearing between the gun and the target, which can be positive or - // negative - double targetBearing = BearingTo(GunHeadingRadians, target.targetX, target.targetY); - // Set the gun to turn right the amount of radians defined by the bearing to the target - SetTurnGunRightRadians(targetBearing); // positive => turn right, negative => turn left - } - } - - /// - /// Method that fires a bullet when the gun is ready to fire. - /// - private void FireGunWhenReady() - { - // We only fire the fun, when we have a target robot - if (target != null) - { - // Only fire when the angle of the gun is pointing at our (virtual) target robot - - // Calculate the distance between between our robot and the target robot - double dist = DistanceTo(target.targetX, target.targetY); - // Angle that "covers" the the target robot from its center to its edge - double angle = Math.Atan(HALF_ROBOT_SIZE / dist); - - // Check if the remaining angle (turn) to move the gun is less than our calculated cover - // angle - if (Math.Abs(GunTurnRemaining) < angle) - { - // If so, our gun should be pointing at our target so we can hit it => fire!! - SetFire(FIREPOWER); - } - } - } - - /// - /// Method that checks if a coordinate (x,y) is outside the Border Sentry's attack range. - /// - /// X coordinate. - /// Y coordinate. - /// true if the coordinate is outside the attack range; false otherwise. - private bool IsOutsideAttackRange(double x, double y) - { - double minBorderX = SentryBorderSize; - double minBorderY = SentryBorderSize; - double maxBorderX = BattleFieldWidth - SentryBorderSize; - double maxBorderY = BattleFieldHeight - SentryBorderSize; - - return (x > minBorderX) && (y > minBorderY) && (x < maxBorderX) && (y < maxBorderY); - } - - /// - /// Method that returns a value that is guaranteed to be within a value range defined by a - /// minimum and maximum value based on an input value.
- /// If the input value is lesser than the minimum value, the returned value will be set to the - /// minimum value.
- /// If the input value is greater than the maximum value, the returned value will be set to the - /// maximum value.
- /// Otherwise the returned value will be equal to the input value. - ///
- /// Input value to limit. - /// Allowed minimum value. - /// Allowed maximum value. - /// - /// The limited input value that is guaranteed to be within the specified minimum and maximum range. - /// - private double Limit(double value, double min, double max) - { - return Math.Min(max, Math.Max(min, value)); - } - - /// - /// Methods that returns the distance to a coordinate (x,y) from our robot. - /// - /// X coordinate. - /// Y coordinate. - /// - /// The distance to the coordinate (x,y). - /// - private double DistanceTo(double x, double y) - { - double dx = X - x; - double dy = Y - y; - return Math.Sqrt(dx * dx + dy * dy); - } - - /// - /// Method that returns the angle to a coordinate (x,y) from our robot. - /// - /// X coordinate. - /// Y coordinate. - /// - /// The angle to the coordinate (x,y). - /// - private double AngleTo(double x, double y) - { - return Math.Atan2(x - X, y - Y); - } - - /// - /// Method that returns the bearing to a coordinate (x,y) from the position and heading of our - /// robot. The bearing is the delta angle between the heading of our robot and the angle of the - /// specified coordinate. - /// - /// X coordinate. - /// Y coordinate. - /// - /// The angle to the coordinate (x,y). - /// - private double BearingTo(double heading, double x, double y) - { - return Utils.NormalRelativeAngle(AngleTo(x, y) - heading); - } - - /// - /// Method that paints a filled circle at the specified coordinate (x,y) and given color. The - /// circle will have a radius of 20 pixels (meaning that the diameter will be 40 pixels). - /// - /// X coordinate. - /// X coordinate for the center of the circle. - /// Y coordinate for the center of the circle. - /// Color of the filled circle. - private void FillCircle(IGraphics gfx, double x, double y, Color color) - { - // Prepare brush - Brush brush = new SolidBrush(color); - // Paint a filled circle (oval) that has a radius of 20 pixels with a center at the input - // coordinates. - gfx.FillEllipse(brush, (float)x - 20, (float)y - 20, 40f, 40f); - } - - /// - /// This class is used for storing data about a robot that has been scanned.
- /// The data is mainly a snapshot of specific scanned data like the scanned position (x,y), - /// velocity and heading, put also the calculated predicted target position of the robot when our - /// robot needs to fire at the scanned robot.
- /// Note that this class calculates the position (x,y) of the scanned robot as our robot moves, - /// and hence data like the angle and distance to the scanned robot will change over time. by - /// using the position, it is easy to calculate a new angle and distance to the robot. - ///
- internal class RobotData - { - internal string name; // name of the scanned robot - internal double scannedX; // x coordinate of the scanned robot based on the last update - internal double scannedY; // y coordinate of the scanned robot based on the last update - internal double scannedVelocity; // velocity of the scanned robot from the last update - internal double scannedHeading; // heading of the scanned robot from the last update - internal double targetX; // predicated x coordinate to aim our gun at, when firing at the robot - internal double targetY; // predicated y coordinate to aim our gun at, when firing at the robot - - /// - /// Creates a new robot data entry based on new scan data for a scanned robot. - /// - /// - /// A ScannedRobotEvent event containing data about a scanned robot. - /// - /// Robot that creates this data entry. - public RobotData(ScannedRobotEvent scannedRobotEvent, AdvancedRobot robot) - { - // Store the name of the scanned robot - name = scannedRobotEvent.Name; - // Updates all scanned facts like position, velocity, and heading - Update(scannedRobotEvent, robot); - // Initialize the coordinates (x,y) to fire at to the updated scanned position - targetX = scannedX; - targetY = scannedY; - } - - /// - /// Updates the scanned data based on new scan data for a scanned robot. - /// - /// - /// A ScannedRobotEvent event containing data about a scanned robot. - /// - /// Robot that calls this method. - public void Update(ScannedRobotEvent scannedRobotEvent, AdvancedRobot robot) - { - // Get the position of the scanned robot based on the ScannedRobotEvent - PointF pos = GetPosition(scannedRobotEvent, robot); - // Store the scanned position (x,y) - scannedX = pos.X; - scannedY = pos.Y; - // Store the scanned velocity and heading - scannedVelocity = scannedRobotEvent.Velocity; - scannedHeading = scannedRobotEvent.HeadingRadians; - } - - /// - /// Returns the position of the scanned robot based on new scan data for a scanned robot. - /// - /// - /// A ScannedRobotEvent event containing data about a scanned robot. - /// - /// Robot that calls this method. - /// The position (x,y) of the scanned robot. - private PointF GetPosition(ScannedRobotEvent scannedRobotEvent, AdvancedRobot robot) - { - // Gets the distance to the scanned robot - double distance = scannedRobotEvent.Distance; - // Calculate the angle to the scanned robot (our robot heading + bearing to scanned robot) - double angle = robot.HeadingRadians + scannedRobotEvent.BearingRadians; - - // Calculate the coordinates (x,y) of the scanned robot - double x = robot.X + Math.Sin(angle) * distance; - double y = robot.Y + Math.Cos(angle) * distance; - - // Return the position as a point (x,y) - return new PointF((float)x, (float)y); - } - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyCsTeam.team b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyCsTeam.team deleted file mode 100644 index 057b59d..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyCsTeam.team +++ /dev/null @@ -1,7 +0,0 @@ -#Robocode robot team -#Sun Aug 20 23:26:53 EST 2006 -team.members=SampleCsTeam.MyFirstLeader,SampleCsTeam.MyFirstDroid,SampleCsTeam.MyFirstDroid,SampleCsTeam.MyFirstDroid,SampleCsTeam.MyFirstDroid -team.author.name=Pavel Savara -robocode.version=1.7.3 -team.webpage= -team.description=\ A sample team.\n MyFirstLeader scans for enemies,\n and orders the 4 droids to fire. diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstDroid.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstDroid.cs deleted file mode 100644 index d92b945..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstDroid.cs +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using Robocode; -using Robocode.Util; -using SampleCs; - -namespace SampleCsTeam -{ - /// - /// SimpleDroid - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Follows orders of team leader - ///

- public class MyFirstDroid : TeamRobot, IDroid - { - /// - /// Droid's default behavior - /// - public override void Run() - { - Out.WriteLine("MyFirstDroid ready."); - } - - /// - /// OnMessageReceived: What to do when our leader sends a message - /// - public override void OnMessageReceived(MessageEvent e) - { - // Fire at a point - if (e.Message is PointD) - { - var p = (PointD)e.Message; - // Calculate x and y to target - double dx = p.X - X; - double dy = p.Y - Y; - // Calculate angle to target - double theta = Utils.ToDegrees(Math.Atan2(dx, dy)); - - // Turn gun to target - TurnGunRight(Utils.NormalRelativeAngleDegrees(theta - GunHeading)); - // Fire hard! - Fire(3); - } - else if (e.Message is RobotColors) - { - // Set our colors - var c = (RobotColors) e.Message; - - BodyColor = c.bodyColor; - GunColor = c.gunColor; - RadarColor = c.radarColor; - ScanColor = c.scanColor; - BulletColor = c.bulletColor; - } - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstLeader.cs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstLeader.cs deleted file mode 100644 index ccbf3f9..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleCsTeam/MyFirstLeader.cs +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -using System; -using System.Drawing; -using Robocode; -using Robocode.Util; -using SampleCs; - -namespace SampleCsTeam -{ - /// - /// MyFirstLeader - a sample team robot by Mathew Nelson, and maintained by Flemming N. Larsen - ///

- /// Looks around for enemies, and orders teammates to Fire - ///

- public class MyFirstLeader : TeamRobot - { - /// - /// Run: Leader's default behavior - /// - public override void Run() - { - // Prepare RobotColors object - var c = new RobotColors(); - - c.bodyColor = Color.Red; - c.gunColor = Color.Red; - c.radarColor = Color.Red; - c.scanColor = Color.Yellow; - c.bulletColor = Color.Yellow; - - // Set the color of this robot containing the RobotColors - BodyColor = c.bodyColor; - GunColor = c.gunColor; - RadarColor = c.radarColor; - ScanColor = c.scanColor; - BulletColor = c.bulletColor; - try - { - // Send RobotColors object to our entire team - BroadcastMessage(c); - } - catch (Exception) - { - } - - // Normal behavior - while (true) - { - SetTurnRadarRight(10000); - Ahead(100); - Back(100); - } - } - - - /// - /// OnScannedRobot: What to do when you see another robot - /// - public override void OnScannedRobot(ScannedRobotEvent e) - { - // Don't Fire on teammates - if (IsTeammate(e.Name)) - { - return; - } - // Calculate enemy bearing - double enemyBearing = Heading + e.Bearing; - // Calculate enemy's position - double enemyX = X + e.Distance*Math.Sin(Utils.ToRadians(enemyBearing)); - double enemyY = Y + e.Distance*Math.Cos(Utils.ToRadians(enemyBearing)); - - try - { - // Send enemy position to teammates - BroadcastMessage(new PointD(enemyX, enemyY)); - } - catch (Exception ex) - { - Out.WriteLine("Unable to send order: "); - Out.WriteLine(ex); - } - } - - /// - /// OnHitByBullet: Turn perpendicular to bullet path - /// - public override void OnHitByBullet(HitByBulletEvent e) - { - TurnLeft(90 - e.Bearing); - } - } -} \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/MyFirstRobot.fs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/MyFirstRobot.fs deleted file mode 100644 index 1ce76a9..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/MyFirstRobot.fs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://robocode.sourceforge.net/license/epl-v10.html - -namespace SampleFs - -open Robocode - -type MyFirstRobot() = - inherit Robot() - - override robot.Run() = - while true do - robot.TurnLeft(40.0) - robot.Ahead(20.0) - - override robot.OnScannedRobot(evnt : ScannedRobotEvent) = - robot.Fire(1.0) - - override robot.OnHitByBullet(evnt : HitByBulletEvent) = - robot.TurnLeft(90.0 - evnt.Bearing) diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/robocode.dotnet.samplesfs.fsproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/robocode.dotnet.samplesfs.fsproj deleted file mode 100644 index 2259662..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/SampleFs/robocode.dotnet.samplesfs.fsproj +++ /dev/null @@ -1,57 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {f9be3471-d2fd-4d58-9991-7ad8ae7bd015} - Library - func - SampleFs - v3.5 - robocode.dotnet.samplesfs - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - bin\Debug\func.XML - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - bin\Release\func.XML - - - - - - - - C:\robocode\libs\robocode.dll - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/robocode.dotnet.samples.csproj b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/robocode.dotnet.samples.csproj deleted file mode 100644 index a2f4302..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.samples/src/robocode.dotnet.samples.csproj +++ /dev/null @@ -1,93 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {80857B97-6397-487B-A9F5-B07026DCBB66} - Library - samplecs - samplescs-1.9.2.4 - v3.5 - 512 - - - 3.5 - - - - true - full - false - ..\target\ - ..\target\obj\ - DEBUG;TRACE - prompt - 4 - false - false - - - pdbonly - true - ..\target\ - ..\target\obj\ - - - prompt - 4 - true - - - - - - - - - - - - - - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84} - robocode.dotnet.api - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.sln b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.sln deleted file mode 100644 index e47c09c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.sln +++ /dev/null @@ -1,50 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robocode.dotnet.nhost", "robocode.dotnet.nhost\src\robocode.dotnet.nhost.csproj", "{674AED55-B9EC-4C7D-8E0B-1B2481C578B2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robocode.dotnet.samples", "robocode.dotnet.samples\src\robocode.dotnet.samples.csproj", "{80857B97-6397-487B-A9F5-B07026DCBB66}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robocode.dotnet.api", "robocode.dotnet.api\src\robocode.dotnet.api.csproj", "{7E0900D3-6E8F-48EB-86DB-AA767AA90B84}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robocode.dotnet.ntests", "robocode.dotnet.ntests\src\robocode.dotnet.ntests.csproj", "{B3487E2D-2737-4C04-AA71-B9A726B3F781}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robocode.dotnet.robotscs", "robocode.dotnet.robotscs\src\robocode.dotnet.robotscs.csproj", "{B3487E2D-2737-4C04-AA71-B9A726B3F787}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robocode.dotnet.control.api", "robocode.dotnet.control.api\src\robocode.dotnet.control.api.csproj", "{674AED55-B9EC-4C7D-8E0B-1B2471C578B2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {674AED55-B9EC-4C7D-8E0B-1B2481C578B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {674AED55-B9EC-4C7D-8E0B-1B2481C578B2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {674AED55-B9EC-4C7D-8E0B-1B2481C578B2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {674AED55-B9EC-4C7D-8E0B-1B2481C578B2}.Release|Any CPU.Build.0 = Release|Any CPU - {80857B97-6397-487B-A9F5-B07026DCBB66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80857B97-6397-487B-A9F5-B07026DCBB66}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80857B97-6397-487B-A9F5-B07026DCBB66}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80857B97-6397-487B-A9F5-B07026DCBB66}.Release|Any CPU.Build.0 = Release|Any CPU - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7E0900D3-6E8F-48EB-86DB-AA767AA90B84}.Release|Any CPU.Build.0 = Release|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F781}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F781}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F781}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F781}.Release|Any CPU.Build.0 = Release|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F787}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F787}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3487E2D-2737-4C04-AA71-B9A726B3F787}.Release|Any CPU.Build.0 = Release|Any CPU - {674AED55-B9EC-4C7D-8E0B-1B2471C578B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {674AED55-B9EC-4C7D-8E0B-1B2471C578B2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {674AED55-B9EC-4C7D-8E0B-1B2471C578B2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {674AED55-B9EC-4C7D-8E0B-1B2471C578B2}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.classpath b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.classpath deleted file mode 100644 index 5dca659..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.classpath +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.project b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.project deleted file mode 100644 index ab0fc6b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.project +++ /dev/null @@ -1,21 +0,0 @@ - - - robocode.dotnet.tests - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.dotnet.host - robocode.dotnet.nhost - robocode.dotnet.api - robocode.dotnet.control.api - robocode.dotnet.samples - robocode.dotnet.robotscs - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 764c3ab..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:34:11 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/test/java=8859_1 -encoding/src/main/resources=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/config/robocode.properties b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/config/robocode.properties deleted file mode 100644 index cfebed7..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/config/robocode.properties +++ /dev/null @@ -1,34 +0,0 @@ -#Robocode Properties -#Mon Aug 17 23:43:36 CEST 2009 -robocode.cpu.constant=9994115 -robocode.options.battle.desiredTPS=30 -robocode.options.common.appendWhenSavingResults=true -robocode.options.common.dontHideRankings=true -robocode.options.common.enableReplayRecording=false -robocode.options.common.showResults=true -robocode.options.development.path=..\\robocode.dotnet.samples\\target; -robocode.options.rendering.antialiasing=0 -robocode.options.rendering.bufferImages=true -robocode.options.rendering.forceBulletColor=false -robocode.options.rendering.method=0 -robocode.options.rendering.noBuffers=2 -robocode.options.rendering.text.antialiasing=0 -robocode.options.sound.enableBulletHit=true -robocode.options.sound.enableGunshot=true -robocode.options.sound.enableMixerPan=true -robocode.options.sound.enableMixerVolume=true -robocode.options.sound.enableRobotCollision=true -robocode.options.sound.enableRobotDeath=true -robocode.options.sound.enableSound=false -robocode.options.sound.enableWallCollision=true -robocode.options.sound.mixer=DirectAudioDevice -robocode.options.view.FPS=true -robocode.options.view.TPS=true -robocode.options.view.explosionDebris=true -robocode.options.view.explosions=true -robocode.options.view.ground=true -robocode.options.view.robotEnergy=true -robocode.options.view.robotNames=true -robocode.options.view.scanArcs=false -robocode.version.lastrun=\ 1.7.1.3 -robocode.versionchecked=08/17/2009 23\:11\:46 diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/pom.xml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/pom.xml deleted file mode 100644 index 80c3e85..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - 4.0.0 - robocode.dotnet.tests - Robocode .NET Tests - - robocode.dotnet - net.sf.robocode - ${robocode.dotnet.version} - - - - net.sf.robocode - robocode.core - ${robocode.version} - - - net.sf.robocode - robocode.host - ${robocode.version} - - - net.sf.robocode - robocode.battle - ${robocode.version} - - - net.sf.robocode - robocode.repository - ${robocode.version} - - - net.sf.robocode - robocode.samples - ${robocode.version} - - - net.sf.robocode - robocode.tests - ${robocode.version} - - - net.sf.robocode - robocode.tests.robots - ${robocode.version} - - - net.sf.robocode - robocode.dotnet.host - ${robocode.version} - - - net.sf.robocode - robocode.dotnet.samples - ${project.version} - dotnet:library - - - net.sf.robocode - robocode.dotnet.robotscs - ${project.version} - dotnet:library - - - junit - junit - 4.11 - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/robocode.dotnet.tests.iml b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/robocode.dotnet.tests.iml deleted file mode 100644 index cf654ee..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/robocode.dotnet.tests.iml +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestCustomEvents.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestCustomEvents.java deleted file mode 100644 index 828188c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestCustomEvents.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import org.junit.Test; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import net.sf.robocode.test.helpers.Assert; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestCustomEvents extends RobocodeTestBed { - - @Test - public void run() { - super.run(); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot gh = event.getTurnSnapshot().getRobots()[1]; - - switch (event.getTurnSnapshot().getTurn()) { - case 130: - test(gh, "130 onTick99\r\n130 onTick30"); - break; - - case 1451: - test(gh, "1451 onTick99\r\n1451 onLowEnergy98\r\n1451 onTick30\r\n1451 onScannedRobot10"); - - break; - - default: - break; - } - } - - private void test(IRobotSnapshot gh, String s) { - Assert.assertTrue("got: " + gh.getOutputStreamSnapshot() + ", expected: " + s, - gh.getOutputStreamSnapshot().contains(s)); - } - - @Override - public String getRobotNames() { - return "SampleCs.Target,tested.robotscs.CustomEvents"; - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestDuplicatesAndScore.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestDuplicatesAndScore.java deleted file mode 100644 index 2713b51..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestDuplicatesAndScore.java +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Ignore; -import robocode.BattleResults; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.RoundStartedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -@Ignore(".NET is little bit slow, so it gives skipped turns for battles with many robots sometimes") -public class TestDuplicatesAndScore extends RobocodeTestBed { - private IRobotSnapshot[] robots; - private BattleResults[] results; - - @Test - public void run() { - super.run(); - } - - @Override - public int getExpectedRobotCount(String list) { - return 8; - } - - @Override - public String getRobotNames() { - return "SampleCs.Fire,tested.robotscs.TestTeam,tested.robotscs.TestTeam,SampleCs.Crazy"; - } - - @Override - public void onRoundStarted(final RoundStartedEvent event) { - super.onRoundStarted(event); - if (event.getRound() == 0) { - robots = event.getStartSnapshot().getRobots(); - Assert.assertEquals(8, robots.length); - - net.sf.robocode.test.helpers.Assert.assertNear(566.2968069, robots[0].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(436.3146436, robots[1].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(317.3362130, robots[2].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(717.6994092, robots[3].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(145.5531935, robots[4].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(734.4305396, robots[5].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(335.7732607, robots[6].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(390.8076498, robots[7].getX()); - - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[0].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(200.000, robots[1].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(120.000, robots[2].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[3].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(200.000, robots[4].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(120.000, robots[5].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[6].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[7].getEnergy()); - } - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - int lastTurn = event.getTurnSnapshot().getTurn(); - - robots = event.getTurnSnapshot().getRobots(); - - if (lastTurn == 1) { - net.sf.robocode.test.helpers.Assert.assertNear(566.2968069, robots[0].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(437.1810299, robots[1].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(317.3362130, robots[2].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(717.6994092, robots[3].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(145.2637220, robots[4].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(734.4305396, robots[5].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(335.7732607, robots[6].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(389.8100070, robots[7].getX()); - } - - if (lastTurn == 1365) { - net.sf.robocode.test.helpers.Assert.assertNear(563.1336824, robots[0].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(572.9500601, robots[1].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(317.3362130, robots[2].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(578.2231942, robots[3].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(120.3355009, robots[4].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(734.4305396, robots[5].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(244.9583274, robots[6].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(333.1785378, robots[7].getX()); - } - - Assert.assertFalse("skipped", robots[0].getOutputStreamSnapshot().contains("skipped")); - Assert.assertFalse("skipped", robots[1].getOutputStreamSnapshot().contains("skipped")); - Assert.assertFalse("skipped", robots[2].getOutputStreamSnapshot().contains("skipped")); - Assert.assertFalse("skipped", robots[3].getOutputStreamSnapshot().contains("skipped")); - Assert.assertFalse("skipped", robots[4].getOutputStreamSnapshot().contains("skipped")); - Assert.assertFalse("skipped", robots[5].getOutputStreamSnapshot().contains("skipped")); - Assert.assertFalse("skipped", robots[6].getOutputStreamSnapshot().contains("skipped")); - Assert.assertFalse("skipped", robots[7].getOutputStreamSnapshot().contains("skipped")); - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - if (event.isAborted()) { - results = null; - } - } - - @Override - public void onBattleCompleted(BattleCompletedEvent event) { - results = event.getSortedResults(); - } - - @Override - protected void runTeardown() { - Assert.assertNotNull(results); - Assert.assertNotNull(robots); - Assert.assertThat(robots[0].getName(), is("SampleCs.Fire (1)")); - Assert.assertThat(robots[1].getName(), is("SampleCsTeam.MyFirstLeader (1)")); - Assert.assertThat(robots[2].getName(), is("SampleCsTeam.MyFirstDroid (1)")); - Assert.assertThat(robots[3].getName(), is("SampleCs.Fire (2)")); - Assert.assertThat(robots[4].getName(), is("SampleCsTeam.MyFirstLeader (2)")); - Assert.assertThat(robots[5].getName(), is("SampleCsTeam.MyFirstDroid (2)")); - Assert.assertThat(robots[6].getName(), is("SampleCs.Fire (3)")); - Assert.assertThat(robots[7].getName(), is("SampleCs.Crazy")); - - // the results are different from Java version because of strictfp in Java Math - // as oposed to FPU driven .NET, which gives better precision. - // difference acumulates to make big difference in results - Assert.assertThat(results[0].getTeamLeaderName(), is("tested.robotscs.TestTeam (2)")); - Assert.assertThat(results[1].getTeamLeaderName(), is("tested.robotscs.TestTeam (1)")); - Assert.assertThat(results[2].getTeamLeaderName(), is("SampleCs.Crazy")); - Assert.assertThat(results[3].getTeamLeaderName(), is("SampleCs.Fire (1)")); - - Assert.assertThat(results[0].getLastSurvivorBonus(), is(0)); - Assert.assertThat(results[1].getLastSurvivorBonus(), is(50)); - Assert.assertThat(results[2].getLastSurvivorBonus(), is(0)); - Assert.assertThat(results[3].getLastSurvivorBonus(), is(0)); - - Assert.assertThat(results[0].getRamDamage(), is(0)); - Assert.assertThat(results[1].getRamDamage(), is(5)); - Assert.assertThat(results[2].getRamDamage(), is(14)); - Assert.assertThat(results[3].getRamDamage(), is(1)); - - Assert.assertThat(results[0].getBulletDamageBonus(), is(55)); - Assert.assertThat(results[1].getBulletDamageBonus(), is(0)); - Assert.assertThat(results[2].getBulletDamageBonus(), is(0)); - Assert.assertThat(results[3].getBulletDamageBonus(), is(0)); - - Assert.assertThat(results[0].getBulletDamage(), is(480)); - Assert.assertThat(results[1].getBulletDamage(), is(124)); - Assert.assertThat(results[2].getBulletDamage(), is(148)); - Assert.assertThat(results[3].getBulletDamage(), is(152)); - - Assert.assertThat(results[0].getScore(), is(1135)); - Assert.assertThat(results[1].getScore(), is(434)); - Assert.assertThat(results[2].getScore(), is(312)); - Assert.assertThat(results[3].getScore(), is(253)); - - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEnvAttack.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEnvAttack.java deleted file mode 100644 index f479d00..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEnvAttack.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -public class TestEnvAttack extends RobocodeTestBed { - boolean messagedAttack; - - @Test - public void run() { - super.run(); - } - - @Override - public String getRobotNames() { - return "tested.robotscs.BattleLost,tested.robotscs.EnvAttack"; - } - - @Override - protected int getExpectedErrors() { - return 1; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("System.Security.Permissions.EnvironmentPermission")) { - messagedAttack = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedAttack); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEventPriorityFilter.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEventPriorityFilter.java deleted file mode 100644 index 578eb12..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestEventPriorityFilter.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -public class TestEventPriorityFilter extends RobocodeTestBed { - boolean messagedScanned; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Scanned!!!")) { - messagedScanned = true; - } - } - - @Override - public String getRobotNames() { - return "tested.robotscs.EventPriorityFilter,tested.robotscs.EventPriorityFilter"; - } - - @Override - protected void runTeardown() { - Assert.assertFalse(messagedScanned); - } -} - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileAttack.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileAttack.java deleted file mode 100644 index 5f45c26..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileAttack.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - -import java.io.File; - - -/** - * @author Pavel Savara (original) - */ -public class TestFileAttack extends RobocodeTestBed { - boolean messaged; - - @Test - public void run() { - super.run(); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("System.Security.SecurityException")) { - messaged = true; - } - } - - @Override - public String getRobotNames() { - return "SampleCs.Fire,tested.robotscs.FileAttack"; - } - - @Override - protected void runSetup() { - File attack = new File("C:\\Robocode.attack"); - - if (attack.exists()) { - Assert.assertTrue(attack.delete()); - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Didn't seen preventing read", messaged); - Assert.assertFalse("Found attack file", new File("C:\\Robocode.attack").exists()); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWrite.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWrite.java deleted file mode 100644 index 27293d6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWrite.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; - - -/** - * @author Pavel Savara (original) - */ -public class TestFileWrite extends RobocodeTestBed { - - @Test - public void run() { - super.run(); - } - File file; - - public String getRobotNames() { - return "SampleCs.Walls,SampleCs.SittingDuck"; - } - - @Override - protected void runSetup() { - file = new File("../../../robocode.tests.robots/target/classes/.data/SampleCs/count.dat"); - if (file.exists()) { - if (!file.delete()) { - Logger.logError("Can't delete" + file); - } - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue(file.exists()); - if (!file.delete()) { - Logger.logError("Can't delete" + file); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWriteSize.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWriteSize.java deleted file mode 100644 index a47500f..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFileWriteSize.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - -import java.io.File; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestFileWriteSize extends RobocodeTestBed { - - boolean messagedDataQuota; - boolean messagedDataDirectory; - boolean messageQuotaReached; - boolean robotTerminated; - - @Test - public void run() { - super.run(); - } - - @Override - public String getRobotNames() { - return "tested.robotscs.FileWriteSize,SampleCs.Target"; - } - - File file; - @Override - protected void runSetup() { - file = new File(robotsPath + "\\target\\classes\\.data\\tested\\robotscs\\test.txt"); - if (file.exists()) { - if (!file.delete()) { - Logger.logError("Can't delete" + file); - } - } - } - - @Override - protected int getExpectedErrors() { - return 1; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("Data quota: 200000\r\n")) { - messagedDataQuota = true; - } - - if (out.contains("Data directory: " + robotsPath + "\\target\\classes\\.data\\tested\\robotscs")) { - messagedDataDirectory = true; - } - - if (out.contains("You have reached your filesystem quota: 200000 bytes per robot")) { - messageQuotaReached = true; - } - - if (event.getTurnSnapshot().getRobots()[0].getEnergy() == 0) { - robotTerminated = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Data quota must be 200000", messagedDataQuota); - Assert.assertTrue("Data directory path is wrong", messagedDataDirectory); - Assert.assertTrue("Error must be output that file quota has been exceeded", messageQuotaReached); - Assert.assertTrue("Game must terminate the robot", robotTerminated); - Assert.assertTrue(file.exists()); - if (!file.delete()) { - Logger.logError("Can't delete" + file); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFormsAttack.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFormsAttack.java deleted file mode 100644 index 58cb00c..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestFormsAttack.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -public class TestFormsAttack extends RobocodeTestBed { - // in case: boolean messagedAttack; - boolean messagedViolation; - - @Test - public void run() { - super.run(); - } - - @Override - public String getRobotNames() { - return "tested.robotscs.BattleLost,tested.robotscs.FormsAttack"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("System.Security.Permissions.UIPermission")) { - messagedViolation = true; - } - } - - @Override - protected int getExpectedErrors() { - return 2; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedViolation); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestHttpAttack.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestHttpAttack.java deleted file mode 100644 index 5b4e7f8..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestHttpAttack.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestHttpAttack extends RobocodeTestBed { - - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robotscs.HttpAttack,SampleCs.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("System.Net.WebPermission")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("HTTP connection is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestInteruptibleEvent.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestInteruptibleEvent.java deleted file mode 100644 index 6527e63..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestInteruptibleEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - - -/** - * Test if onScannedRobot() is called when the radar is turned from within a onHitWall() event. - * - * @author Flemming N. Larsen (original) - */ -public class TestInteruptibleEvent extends RobocodeTestBed { - boolean messagedScanned; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Scanned!!!")) { - messagedScanned = true; - } - } - - @Override - public String getRobotNames() { - return "tested.robotscs.InteruptibleEvent,tested.robotscs.InteruptibleEvent"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedScanned); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestJunior.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestJunior.java deleted file mode 100644 index ff12857..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestJunior.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import org.junit.Assert; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestJunior extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "tested.robotscs.JuniorEvents,SampleCs.SittingDuck"; - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[0]; - - if (event.getTurnSnapshot().getTurn() == 590) { - String out = robot.getOutputStreamSnapshot(); - - test(out, "Robocode.BulletMissedEvent 5"); - test(out, "Robocode.ScannedRobotEvent 100"); - test(out, "Robocode.BulletHitEvent 24"); - test(out, "Robocode.StatusEvent 590"); - test(out, "Robocode.WinEvent 1"); - test(out, "last bullet heading 6.06794"); - } - } - - private void test(String out, String in) { - Assert.assertTrue(in, out.contains(in)); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestLost.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestLost.java deleted file mode 100644 index 557425a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestLost.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestLost extends RobocodeTestBed { - private int lost = 0; - private int end = 0; - - @Test - public void run() { - super.run(); - } - - @Override - public int getNumRounds() { - return 5; - } - - @Override - public String getRobotNames() { - return "SampleCs.Fire,tested.robotscs.BattleLost"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[1]; - final String streamSnapshot = robot.getOutputStreamSnapshot(); - - if (streamSnapshot.contains("Death!")) { - lost++; - } - if (streamSnapshot.contains("BattleEnded!")) { - end++; - } - } - - @Override - protected void runTeardown() { - Assert.assertThat("always should loose", lost, is(getNumRounds())); - Assert.assertThat("should get BattleEnded event", end, is(1)); - } - -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxTurnRate.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxTurnRate.java deleted file mode 100644 index 5507bb1..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxTurnRate.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestMaxTurnRate extends RobocodeTestBed { - - StringBuffer buf = new StringBuffer(); - - @Override - public String getRobotNames() { - return "tested.robotscs.MaxTurnRate,SampleCs.Target"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (150,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - buf.append(event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot()); - - if (event.getTurnSnapshot().getTurn() == 26) { - final String out = buf.toString(); - - Assert.assertTrue(out.contains("1: 0.0, 0.0") || out.contains("1: 0.0, -0.0")); - Assert.assertTrue(out.contains("2: 0.0, -1.0") || out.contains("2: 0.0, -0.999999999")); - Assert.assertTrue(out.contains("3: 0.0, -2.0") || out.contains("3: 0.0, -1.999999999")); - Assert.assertTrue(out.contains("4: 0.0, -3.0") || out.contains("4: 0.0, -2.999999999")); - Assert.assertTrue(out.contains("5: 0.0, -4.0") || out.contains("5: 0.0, -3.999999999")); - Assert.assertTrue(out.contains("6: 0.0, -5.0") || out.contains("6: 0.0, -4.999999999")); - Assert.assertTrue(out.contains("7: 0.0, -6.0") || out.contains("7: 0.0, -5.999999999")); - Assert.assertTrue(out.contains("8: 0.0, -7.0") || out.contains("8: 0.0, -6.999999999")); - Assert.assertTrue(out.contains("9: 0.0, -8.0") || out.contains("9: 0.0, -7.999999999")); - Assert.assertTrue(out.contains("10: 0.0, -9.0") || out.contains("10: 0.0, -8.999999999")); - Assert.assertTrue(out.contains("11: 0.0, -10.0") || out.contains("11: 0.0, -9.999999999")); - Assert.assertTrue(out.contains("12: 0.0, -10.0") || out.contains("12: 0.0, -9.999999999")); - Assert.assertTrue(out.contains("13: 0.0, -10.0") || out.contains("13: 0.0, -9.999999999")); - - Assert.assertTrue(out.contains("14: 0.0, 0.0") || out.contains("14: 0.0, -0.0")); - Assert.assertTrue(out.contains("15: 0.0, 1.0") || out.contains("15: 0.0, 0.999999999")); - Assert.assertTrue(out.contains("16: 0.0, 2.0") || out.contains("16: 0.0, 1.999999999")); - Assert.assertTrue(out.contains("17: 0.0, 3.0") || out.contains("17: 0.0, 2.999999999")); - Assert.assertTrue(out.contains("18: 0.0, 4.0") || out.contains("18: 0.0, 3.999999999")); - Assert.assertTrue(out.contains("19: 0.0, 5.0") || out.contains("19: 0.0, 4.999999999")); - Assert.assertTrue(out.contains("20: 0.0, 6.0") || out.contains("20: 0.0, 5.999999999")); - Assert.assertTrue(out.contains("21: 0.0, 7.0") || out.contains("21: 0.0, 6.999999999")); - Assert.assertTrue(out.contains("22: 0.0, 8.0") || out.contains("22: 0.0, 7.999999999")); - Assert.assertTrue(out.contains("23: 0.0, 9.0") || out.contains("23: 0.0, 8.999999999")); - Assert.assertTrue(out.contains("24: 0.0, 10.0") || out.contains("24: 0.0, 9.999999999")); - Assert.assertTrue(out.contains("25: 0.0, 10.0") || out.contains("25: 0.0, 9.999999999")); - Assert.assertTrue(out.contains("26: 0.0, 10.0") || out.contains("26: 0.0, 9.999999999")); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxVelocity.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxVelocity.java deleted file mode 100644 index c888f57..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxVelocity.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; -import robocode.util.Utils; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestMaxVelocity extends RobocodeTestBed { - - @Override - public String getRobotNames() { - return "tested.robotscs.MaxVelocity,SampleCs.Target"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (600,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final int time = (int) event.getTurnSnapshot().getTurn(); - final double velocity = event.getTurnSnapshot().getRobots()[0].getVelocity(); - - switch (time) { - case 10: - case 20: - case 100: - Assert.assertTrue(Utils.isNear(velocity, 8)); - break; - - case 32: - case 40: - case 120: - Assert.assertTrue(Utils.isNear(velocity, -8)); - break; - - case 50: - case 60: - Assert.assertTrue(Utils.isNear(velocity, 4.2)); - break; - - case 70: - case 80: - Assert.assertTrue(Utils.isNear(velocity, -4.2)); - break; - - case 130: - case 140: - Assert.assertTrue(Utils.isNear(velocity, 2)); - break; - - case 150: - case 160: - Assert.assertTrue(Utils.isNear(velocity, -2)); - break; - - case 170: - case 180: - case 190: - case 199: - Assert.assertTrue(Utils.isNear(velocity, 0)); - break; - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestNames.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestNames.java deleted file mode 100644 index 90978c6..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestNames.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; - - -/** - * @author Pavel Savara (original) - */ -public class TestNames extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - @Override - protected int getExpectedErrors() { - return 4; - } - - @Override - public int getExpectedRobotCount(String list) { - return 2; - } - - @Override - public String getRobotNames() { - return "SampleCs.Fire,robocode.BadNamespace,tested.robotscs.TooLongNameThisIsReallyTooLongName,tooLongNamespaceThisIsReallyTooLongNamespace.TooLongNamespace,NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger,NoPackageShortName"; - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPosition.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPosition.java deleted file mode 100644 index 8cd2571..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPosition.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.RoundStartedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * Repeatable robot possition test - * - * @author Pavel Savara (original) - */ -public class TestPosition extends RobocodeTestBed { - int lastTurn; - - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "SampleCs.Crazy,SampleCs.Target"; - } - - @Override - public void onRoundStarted(final RoundStartedEvent event) { - super.onRoundStarted(event); - if (event.getRound() == 0) { - IRobotSnapshot crazy = event.getStartSnapshot().getRobots()[0]; - IRobotSnapshot target = event.getStartSnapshot().getRobots()[1]; - - Assert.assertNear(568.1445492, crazy.getX()); - Assert.assertNear(163.0032275, crazy.getY()); - Assert.assertNear(436.7181397, target.getX()); - Assert.assertNear(351.5039067, target.getY()); - } - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - lastTurn = event.getTurnSnapshot().getTurn(); - - IRobotSnapshot crazy = event.getTurnSnapshot().getRobots()[0]; - IRobotSnapshot target = event.getTurnSnapshot().getRobots()[1]; - - if (lastTurn == 1) { - Assert.assertNear(567.2831835, crazy.getX()); - Assert.assertNear(162.4952421, crazy.getY()); - Assert.assertNear(436.7181397, target.getX()); - Assert.assertNear(351.5039067, target.getY()); - } - - if (lastTurn == 1700) { - Assert.assertNear(373.9958377, crazy.getX()); - Assert.assertNear(196.1380677, crazy.getY()); - Assert.assertNear(340.3212984, target.getX()); - Assert.assertNear(456.5502002, target.getY()); - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue(lastTurn == 2080 || lastTurn == 2296); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPrivateConstructor.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPrivateConstructor.java deleted file mode 100644 index 2f37039..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestPrivateConstructor.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestPrivateConstructor extends RobocodeTestBed { - boolean messaged; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(final TurnEndedEvent event) { - super.onTurnEnded(event); - final IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[1]; - - if (robot.getOutputStreamSnapshot().contains( - "tested.robotscs.PrivateConstructor No parameterless constructor defined for this object.")) { - messaged = true; - } - Assert.assertNear(0, robot.getEnergy()); - } - - @Override - public String getRobotNames() { - return "SampleCs.Fire,tested.robotscs.PrivateConstructor"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messaged); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} - diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRandom.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRandom.java deleted file mode 100644 index eb22120..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRandom.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * Repeatable random test - * - * @author Pavel Savara (original) - */ -public class TestRandom extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "SampleCs.Fire,tested.robotscs.Random"; - } - - @Override - public boolean isCheckOnBattleStart() { - return true; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - Assert.assertTrue(event.getTurnSnapshot().getTurn() <= 1407); - IRobotSnapshot fire = event.getTurnSnapshot().getRobots()[0]; - IRobotSnapshot random = event.getTurnSnapshot().getRobots()[1]; - - if (event.getTurnSnapshot().getTurn() == 1241) { - Assert.assertNear(213.18621928, fire.getX()); - Assert.assertNear(371.45706118, fire.getY()); - Assert.assertNear(782.0, random.getX()); - Assert.assertNear(230.95479253, random.getY()); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestReflectionAttack.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestReflectionAttack.java deleted file mode 100644 index 06f50e7..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestReflectionAttack.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestReflectionAttack extends RobocodeTestBed { - - private boolean securityException; - private boolean fieldAccessException; - - @Override - public String getRobotNames() { - return "tested.robotscs.ReflectionAttack,SampleCs.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("System.Security.SecurityException")) { - securityException = true; - } else if (out.contains("System.FieldAccessException")) { - fieldAccessException = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Reflection is not allowed", securityException || fieldAccessException); - } - - @Override - protected int getExpectedErrors() { - return securityException ? 1 : 0; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRobotDeathEvents.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRobotDeathEvents.java deleted file mode 100644 index d8bb60e..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestRobotDeathEvents.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestRobotDeathEvents extends RobocodeTestBed { - - @Override - public String getRobotNames() { - return "tested.robotscs.RobotDeathEvents,SampleCs.Crazy,SampleCs.Target,SampleCs.Target,SampleCs.Target"; - } - - @Override - public int getNumRounds() { - return 5; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("enemyCount != getOthers()")) { - Assert.fail("Robot is missing RobotDeathEvent"); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestScoring.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestScoring.java deleted file mode 100644 index f269e0a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestScoring.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.RoundEndedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IScoreSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - - -/** - * This test is used for testing if the current scores and total scores are - * calculated correctly. Current scores are tested at each turn, and the total - * scores are tested per round and per battle. - * - * @author Flemming N. Larsen (original) - */ -public class TestScoring extends RobocodeTestBed { - - ITurnSnapshot lastTurnSnapshot; - - @Override - public String getRobotNames() { - return "SampleCs.Corners,SampleCs.Crazy,SampleCs.Fire,SampleCs.RamFire,SampleCs.SittingDuck,SampleCs.SpinBot,SampleCs.Tracker,SampleCs.TrackFire,SampleCs.Walls"; - } - - @Override - public int getNumRounds() { - return 10; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - lastTurnSnapshot = event.getTurnSnapshot(); - - for (IScoreSnapshot score : lastTurnSnapshot.getSortedTeamScores()) { - // Notice that the is no such thing as a 'current total last - // survivor bonus' - int currentScore = (int) (0.5 + score.getCurrentSurvivalScore() + score.getCurrentBulletDamageScore() - + score.getCurrentBulletKillBonus() + score.getCurrentRammingDamageScore() - + score.getCurrentRammingKillBonus() + score.getCurrentSurvivalBonus()); - - Assert.assertThat(score.getName(), currentScore, is((int) (0.5 + score.getCurrentScore()))); - } - } - - @Override - public void onRoundEnded(RoundEndedEvent event) { - super.onRoundEnded(event); - - for (IScoreSnapshot score : lastTurnSnapshot.getSortedTeamScores()) { - - int totalScore = (int) (0.5 + score.getTotalSurvivalScore() + score.getTotalLastSurvivorBonus() - + score.getTotalBulletDamageScore() + score.getTotalBulletKillBonus() + score.getTotalRammingDamageScore() - + score.getTotalRammingKillBonus()); - - Assert.assertThat(score.getName(), totalScore, is((int) (0.5 + score.getTotalScore()))); - } - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - for (IScoreSnapshot score : lastTurnSnapshot.getSortedTeamScores()) { - - int totalScore = (int) (0.5 + score.getTotalSurvivalScore() + score.getTotalLastSurvivorBonus() - + score.getTotalBulletDamageScore() + score.getTotalBulletKillBonus() + score.getTotalRammingDamageScore() - + score.getTotalRammingKillBonus()); - - Assert.assertThat(totalScore, is((int) (0.5 + score.getTotalScore()))); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestSkippedTurns.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestSkippedTurns.java deleted file mode 100644 index c119173..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestSkippedTurns.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import org.junit.Ignore; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -@Ignore("is very timing sensitive test, so it usually fails on different machines, please run explicitly if you did something to security or timing") -public class TestSkippedTurns extends RobocodeTestBed { - boolean messagedBattle; - boolean messagedEvent; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Skipped!!!")) { - messagedEvent = true; - } - if (out.contains("not performed any actions in a reasonable")) { - messagedBattle = true; - } - } - - @Override - public String getRobotNames() { - return "SampleCs.TrackFire,tested.robotscs.SkipTurns"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedEvent); - Assert.assertTrue(messagedBattle); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestThreadAttack.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestThreadAttack.java deleted file mode 100644 index 80a4368..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestThreadAttack.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -public class TestThreadAttack extends RobocodeTestBed { - boolean messagedMax; - - @Override - public String getRobotNames() { - return "tested.robotscs.ThreadAttack,SampleCs.SittingDuck"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("You may only create 5 threads")) { - messagedMax = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedMax); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestUndeadThread.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestUndeadThread.java deleted file mode 100644 index 4338c2a..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestUndeadThread.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.BattleErrorEvent; - - -/** - * @author Pavel Savara (original) - */ -public class TestUndeadThread extends RobocodeTestBed { - boolean messagedStop; - - @Test - public void run() { - super.run(); - } - - public void onBattleError(BattleErrorEvent event) { - super.onBattleError(event); - final String error = event.getError(); - - if (error.contains("Unable to stop thread")) { - messagedStop = true; - } - } - - @Override - protected int getExpectedErrors() { - return 1; - } - - @Override - public String getRobotNames() { - return "SampleCs.SittingDuck,tested.robotscs.UndeadThread"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedStop); - } - -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWatchBullet.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWatchBullet.java deleted file mode 100644 index f404095..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWatchBullet.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import org.junit.Assert; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestWatchBullet extends RobocodeTestBed { - boolean messagedIdentity; - - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "tested.robotscs.WatchBullets,SampleCs.SittingDuck"; - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[0]; - - final String out = robot.getOutputStreamSnapshot(); - final int time = event.getTurnSnapshot().getTurn(); - - test(out, time, 33, "33 487.43878 119.51132 347.66745 True"); - test(out, time, 45, "45 459.24551 248.46534 347.66745 True"); - test(out, time, 52, "52 442.79943 323.68851 347.66745 True"); - test(out, time, 53, "53 440.44999 334.43468 347.66745 False"); - - if (out.contains("Failed bullet identity")) { - messagedIdentity = true; - } - } - - @Override - protected void runTeardown() { - net.sf.robocode.test.helpers.Assert.assertFalse(messagedIdentity); - } - - private void test(String out, int timecurr, int timeWatch, String in) { - if (timecurr == timeWatch) { - Assert.assertTrue("got: " + out + ", expected: " + in, out.contains(in)); - } - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWin.java b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWin.java deleted file mode 100644 index c736838..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestWin.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robotscs; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import org.junit.Test; -import robocode.BattleResults; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestWin extends RobocodeTestBed { - private int win = 0; - private int end = 0; - private int rend = 0; - private BattleResults[] results; - - @Test - public void run() { - super.run(); - } - - @Override - public int getNumRounds() { - return 5; - } - - @Override - public String getRobotNames() { - return "SampleCs.Target,tested.robotscs.BattleWin"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[1]; - final String streamSnapshot = robot.getOutputStreamSnapshot(); - - if (streamSnapshot.contains("Win!")) { - win++; - } - if (streamSnapshot.contains("BattleEnded!")) { - end++; - } - if (streamSnapshot.contains("RoundEnded!")) { - rend++; - } - } - - public void onBattleCompleted(BattleCompletedEvent event) { - results = event.getSortedResults(); - } - - @Override - protected void runTeardown() { - Assert.assertThat("always should win", win, is(getNumRounds())); - Assert.assertThat("should get BattleEnded event", end, is(1)); - Assert.assertThat("should get RoundEnded event", rend, is(5)); - Assert.assertThat("always should be FIRST", results[0].getTeamLeaderName(), is("tested.robotscs.BattleWin")); - Assert.assertThat("always should get score", results[0].getScore(), is(900)); - } -} diff --git a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/resources/config/robocode.properties b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/resources/config/robocode.properties deleted file mode 100644 index 35ec106..0000000 --- a/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/resources/config/robocode.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Robocode Properties -#Fri Jan 02 00:50:04 CET 2009 -robocode.options.development.path=../../../robocode.samples/target/classes;../robocode.dotnet.samples/target;../robocode.dotnet.robotscs/target -robocode.versionchecked=01/04/2109 23\:46\:20 diff --git a/代码/workspace_robo4/plugins/dotnet/tools/.gitignore b/代码/workspace_robo4/plugins/dotnet/tools/.gitignore deleted file mode 100644 index a65b417..0000000 --- a/代码/workspace_robo4/plugins/dotnet/tools/.gitignore +++ /dev/null @@ -1 +0,0 @@ -lib diff --git a/代码/workspace_robo4/plugins/dotnet/tools/keys/.gitignore b/代码/workspace_robo4/plugins/dotnet/tools/keys/.gitignore deleted file mode 100644 index 4bcc837..0000000 --- a/代码/workspace_robo4/plugins/dotnet/tools/keys/.gitignore +++ /dev/null @@ -1 +0,0 @@ -robocode.snk diff --git a/代码/workspace_robo4/plugins/dotnet/tools/keys/gennetkey.cmd b/代码/workspace_robo4/plugins/dotnet/tools/keys/gennetkey.cmd deleted file mode 100644 index 49c0d6b..0000000 --- a/代码/workspace_robo4/plugins/dotnet/tools/keys/gennetkey.cmd +++ /dev/null @@ -1,9 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\sn.exe" -k robocode.snk \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/dotnet/tools/loadTools.cmd b/代码/workspace_robo4/plugins/dotnet/tools/loadTools.cmd deleted file mode 100644 index c6e3cce..0000000 --- a/代码/workspace_robo4/plugins/dotnet/tools/loadTools.cmd +++ /dev/null @@ -1,23 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -if not exist "%~dp0/lib/" ( - mkdir "%~dp0/lib/" -) - -java -cp "%~dp0/../../../tools/loader" Loader http://robocode.sourceforge.net/mvnrepo/net/sf/jni4net/jni4net.n/0.8.7.0/ "%~dp0/lib/" jni4net.n-0.8.7.0.dll -java -cp "%~dp0/../../../tools/loader" Loader http://robocode.sourceforge.net/mvnrepo/net/sf/jni4net/jni4net.n.w32.v20/0.8.7.0/ "%~dp0/lib/" jni4net.n.w32.v20-0.8.7.0.dll -java -cp "%~dp0/../../../tools/loader" Loader http://robocode.sourceforge.net/mvnrepo/net/sf/jni4net/jni4net.n.w64.v20/0.8.7.0/ "%~dp0/lib/" jni4net.n.w64.v20-0.8.7.0.dll -java -cp "%~dp0/../../../tools/loader" Loader http://robocode.sourceforge.net/mvnrepo/net/sf/jni4net/jni4net.n.w32.v40/0.8.7.0/ "%~dp0/lib/" jni4net.n.w32.v40-0.8.7.0.dll -java -cp "%~dp0/../../../tools/loader" Loader http://robocode.sourceforge.net/mvnrepo/net/sf/jni4net/jni4net.n.w64.v40/0.8.7.0/ "%~dp0/lib/" jni4net.n.w64.v40-0.8.7.0.dll -java -cp "%~dp0/../../../tools/loader" Loader http://robocode.sourceforge.net/mvnrepo/net/sf/jni4net/jni4net.j/0.8.7.0/ "%~dp0/lib/" jni4net.j-0.8.7.0.jar -java -cp "%~dp0/../../../tools/loader" Loader http://robocode.sourceforge.net/mvnrepo/net/sf/jni4net/proxygen/0.8.7.0/ "%~dp0/lib/" proxygen.exe -java -cp "%~dp0/../../../tools/loader" Loader http://jni4net.googlecode.com/svn/mvnrepo/org/nunit/nunit.framework/2.4.3.0/ "%~dp0/lib/" nunit.framework-2.4.3.0.dll - diff --git a/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.control.proxygen.xml b/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.control.proxygen.xml deleted file mode 100644 index f288fcd..0000000 --- a/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.control.proxygen.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - robocode.dotnet.host/src/main/java - robocode.dotnet.control.api/src/generated - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.net.xml b/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.net.xml deleted file mode 100644 index dbdda05..0000000 --- a/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.net.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - robocode.dotnet.host/src/main/java - robocode.dotnet.nhost/src/generated - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.xml b/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.xml deleted file mode 100644 index db99900..0000000 --- a/代码/workspace_robo4/plugins/dotnet/tools/proxygen/robocode.proxygen.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - robocode.dotnet.host/src/main/java - robocode.dotnet.nhost/src/generated - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/.gitignore b/代码/workspace_robo4/plugins/testing/.gitignore deleted file mode 100644 index ef1aab0..0000000 --- a/代码/workspace_robo4/plugins/testing/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tools diff --git a/代码/workspace_robo4/plugins/testing/mvn.cmd b/代码/workspace_robo4/plugins/testing/mvn.cmd deleted file mode 100644 index 0e56a2d..0000000 --- a/代码/workspace_robo4/plugins/testing/mvn.cmd +++ /dev/null @@ -1,19 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -if not exist "%~dp0\tools\lib" ( - mkdir "%~dp0\tools\lib" -) - -if not exist "%~dp0\..\..\tools\lib\maven-*-uber.jar" ( - call "%~dp0\..\..\tools\loadTools.cmd" -) - -call "%~dp0\..\..\mvn" %* \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/mvn.sh b/代码/workspace_robo4/plugins/testing/mvn.sh deleted file mode 100644 index 7a6b177..0000000 --- a/代码/workspace_robo4/plugins/testing/mvn.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -dp0=${0%/*} - -if [ ! -d "$dp0/tools/lib" ]; then - mkdir $dp0/tools/lib -fi - -if [ ! -f $dp0/../../tools/lib/maven-*-uber.jar ]; then - $dp0/../../tools/loadTools.sh -fi - -$dp0/../../mvn.sh $* \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/mvnassembly.cmd b/代码/workspace_robo4/plugins/testing/mvnassembly.cmd deleted file mode 100644 index fb10c4c..0000000 --- a/代码/workspace_robo4/plugins/testing/mvnassembly.cmd +++ /dev/null @@ -1,12 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -mvn clean install ant:ant -DskipTests=false %* -rem mvn eclipse:eclipse \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/mvnassembly.sh b/代码/workspace_robo4/plugins/testing/mvnassembly.sh deleted file mode 100644 index a498a71..0000000 --- a/代码/workspace_robo4/plugins/testing/mvnassembly.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -./mvn.sh clean install ant:ant -DskipTests=false $* -#./mvn.sh eclipse:eclipse \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/pom.xml b/代码/workspace_robo4/plugins/testing/pom.xml deleted file mode 100644 index 6e5adcc..0000000 --- a/代码/workspace_robo4/plugins/testing/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - robocode.testing - Robot Testing Framework - pom - - net.sf.robocode - robocode - ${robocode.version} - ../.. - - - robocode.testing.api - robocode.testing.content - robocode.testing.distribution - robocode.testing.installer - robocode.testing.samples - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/.classpath b/代码/workspace_robo4/plugins/testing/robocode.testing.api/.classpath deleted file mode 100644 index 776135b..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/.project b/代码/workspace_robo4/plugins/testing/robocode.testing.api/.project deleted file mode 100644 index 6cac192..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/.project +++ /dev/null @@ -1,14 +0,0 @@ - - - robocode.testing.api - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/testing/robocode.testing.api/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index ee629d3..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:14:19 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/pom.xml b/代码/workspace_robo4/plugins/testing/robocode.testing.api/pom.xml deleted file mode 100644 index 89cf1b6..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - robocode.testing.api - Robot Testing Framework API - - net.sf.robocode - robocode.testing - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - junit - junit - 4.11 - - - - - - org.apache.maven.plugins - maven-jar-plugin - - robocode.testing - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - package - - javadoc - - - - - Robocode Testing Framework ${project.version} - true - - Robocode Testing Framework ${project.version}]]> - - - http://docs.oracle.com/javase/6/docs/api/ - http://junit.sourceforge.net/javadoc - http://robocode.sourceforge.net/docs/robocode - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/robocode.testing.api.iml b/代码/workspace_robo4/plugins/testing/robocode.testing.api/robocode.testing.api.iml deleted file mode 100644 index 774c095..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/robocode.testing.api.iml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBed.java b/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBed.java deleted file mode 100644 index b88e90a..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBed.java +++ /dev/null @@ -1,329 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.testing; - - -import robocode.control.BattleSpecification; -import robocode.control.BattlefieldSpecification; -import robocode.control.IRobocodeEngine; -import robocode.control.RandomFactory; -import robocode.control.RobocodeEngine; -import robocode.control.RobotSpecification; -import robocode.control.events.BattleAdaptor; -import robocode.control.events.BattleErrorEvent; -import robocode.control.events.BattleMessageEvent; -import robocode.control.events.TurnEndedEvent; -import net.sf.robocode.io.Logger; -import static org.hamcrest.CoreMatchers.is; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import robocode.control.snapshot.IRobotSnapshot; - -import java.io.File; - - -/** - * RobotTestBed provides a superclass that can be extended in order to implement JUnit tests - * for Robocode robots. - *

- * The user must set the system property robocode.home to the location of the robocode installation, - * otherwise we cannot set up the Robocode engine. If robocode.home is not a system property, - * we throw a RuntimeException. - * - * @author Philip Johnson (original) - * @author Pavel Savara (contributor) - */ -public abstract class RobotTestBed extends BattleAdaptor { - - /** - * The Robocode game engine instance used for this test. - */ - protected final IRobocodeEngine engine; - - /** - * The battlefield specification, which is the default. - */ - protected final BattlefieldSpecification battleFieldSpec = new BattlefieldSpecification(); - - /** - * The number of errors generated during this battle so far. - */ - protected int errors = 0; - - /** - * The number of messages generated during this battle so far. - */ - protected int messages = 0; - - /** - * The height of the battle field, initialized at the beginning of the battle. - */ - protected int height = 0; - - /** - * The width of the battle field, initialized at the beginning of the battle. - */ - protected int width = 0; - - /** - * True to specify that the position during each turn should be printed out. - */ - protected boolean isDumpingPositions = false; - - /** - * True to specify that each turn should be printed out. - */ - protected boolean isDumpingTurns = false; - - /** - * True to specify that Robot output should be printed out. - */ - protected boolean isDumpingOutput = false; - - /** - * True to specify that error messages should be printed out. - */ - protected boolean isDumpingErrors = true; - - /** - * True to specify that Robot messages should be printed out. - */ - protected boolean isDumpingMessages = true; - - /** - * Create an instance of RobotTestBed which provides default implementations for some (not all) - * of the IBattleListener methods. Your subclass can provide overridden methods for more - * of the IBattleListener methods, or override any of the methods in this class, in order to - * check for the desired behavior by your robot. - *

- * Also instantiates a Robocode engine for running the test battle. This requires a system - * property called robocode.home to be defined and to provide the path to a Robocode installation - * containing the robots under test. - * - * @throws RuntimeException If robocode.home is not defined or does not point to a robocode - * installation. - */ - public RobotTestBed() { - // Set some system properties for use by the robocode engine. - System.setProperty("EXPERIMENTAL", "true"); - System.setProperty("TESTING", "true"); - - // Check that robocode.home is defined and points to a robocode installation. - String robocodeHome = System.getProperty("robocode.home"); - - if (robocodeHome == null) { - throw new RuntimeException("System property robocode.home is not set."); - } - - File robocodeJar = new File(new File(robocodeHome), "libs/robocode.jar"); - - if (!robocodeJar.exists()) { - throw new RuntimeException("robocode.jar not found. robocode.home: " + robocodeHome); - } - - // Now create the robocode engine. - engine = new RobocodeEngine(new File(robocodeHome)); - } - - /** - * Called after each turn, and implements basic logging information about the turn number and - * the position of each robot. - *

- * Override this method to perform testing at the end of each turn. - * - * @param event The TurnEndedEvent. - */ - public void onTurnEnded(TurnEndedEvent event) { - if (isDumpingTurns) { - Logger.realOut.println("turn " + event.getTurnSnapshot().getTurn()); - } - for (IRobotSnapshot robot : event.getTurnSnapshot().getRobots()) { - if (isDumpingPositions) { - Logger.realOut.print(robot.getVeryShortName()); - Logger.realOut.print(" X:"); - Logger.realOut.print(robot.getX()); - Logger.realOut.print(" Y:"); - Logger.realOut.print(robot.getY()); - Logger.realOut.print(" V:"); - Logger.realOut.print(robot.getVelocity()); - Logger.realOut.println(); - } - if (isDumpingOutput) { - Logger.realOut.print(robot.getOutputStreamSnapshot()); - } - } - } - - /** - * Must return a comma-separated list of fully qualified robot names to be in this battle. - *

- * You must override this event to specify the robots to battle in this test case. - * - * @return The list of robots. - */ - public abstract String getRobotNames(); - - /** - * Provides the number of rounds in this battle. Defaults to 1. - * Override this to change the number of rounds. - * - * @return The number of rounds. - */ - public int getNumRounds() { - return 1; - } - - /** - * Returns a comma or space separated list like: x1,y1,heading1, x2,y2,heading2, which are the - * coordinates and heading of robot #1 and #2. So "0,0,180, 50,80,270" means that robot #1 - * has position (0,0) and heading 180, and robot #2 has position (50,80) and heading 270. - *

- * Override this method to explicitly specify the initial positions. - *

- * Defaults to null, which means that the initial positions are determined randomly. Since - * battles are deterministic by default, the initial positions are randomly chosen but will - * always be the same each time you run the test case. - * - * @return The list of initial positions. - */ - public String getInitialPositions() { - return null; - } - - /** - * Provides the number of robots in this battle. - * - * @param robotList The list of robots. - * @return The number of robots in this battle. - */ - private int getExpectedRobotCount(String robotList) { - return robotList.split("[\\s,;]+").length; - } - - /** - * Defaults to true, indicating that the battle is deterministic and robots will always start - * in the same position each time. - *

- * Override to support random initialization. - * - * @return True if the battle will be deterministic. - */ - public boolean isDeterministic() { - return true; - } - - /** - * The setup method run before each test, which sets up the listener on the engine for testing. - * Don't override this method; instead, override runSetup to add behavior before the test - * battle starts. - */ - @Before - public void setup() { - engine.addBattleListener(this); - if (isDeterministic()) { - RandomFactory.resetDeterministic(0); - } - this.height = battleFieldSpec.getHeight(); - this.width = battleFieldSpec.getWidth(); - errors = 0; - messages = 0; - } - - /** - * After each test is run, the listener is removed. - * Don't override this method; instead, override runTearDown to add behavior after the test - * battle ends. - */ - @After - public void tearDown() { - engine.removeBattleListener(this); - } - - /** - * Runs a test, invoking the runSetup method before the battle starts and the - * runTearDown method after the battle ends. - * Asserts that the expected number of errors for this battle were obtained. - */ - @Test - public void run() { - runSetup(); - runBattle(getRobotNames(), getNumRounds(), getInitialPositions()); - runTeardown(); - RobotTestBedAssert.assertThat(errors, is(getExpectedErrors())); - } - - /** - * Specifies how many errors you expect this battle to generate. - * Defaults to 0. Override this method to change the number of expected errors. - * - * @return The expected number of errors. - */ - protected int getExpectedErrors() { - return 0; - } - - /** - * Invoked before the test battle begins. - * Default behavior is to do nothing. - * Override this method in your test case to add behavior before the battle starts. - */ - protected void runSetup() {// Default does nothing. - } - - /** - * Invoked after the test battle ends. - * Default behavior is to do nothing. - * Override this method in your test case to add behavior after the battle ends. - */ - protected void runTeardown() {// Default does nothing. - } - - /** - * Runs the test battle. - * - * @param robotList The list of robots. - * @param numRounds The number of rounds. - * @param initialPositions The initial positions for the robots. - */ - private void runBattle(String robotList, int numRounds, String initialPositions) { - final RobotSpecification[] robotSpecifications = engine.getLocalRepository(robotList); - - if (getExpectedRobotCount(robotList) > 0) { - RobotTestBedAssert.assertNotNull("Robot not loaded", robotSpecifications); - RobotTestBedAssert.assertEquals("Robot not loaded", getExpectedRobotCount(robotList), - robotSpecifications.length); - engine.runBattle(new BattleSpecification(numRounds, battleFieldSpec, robotSpecifications), initialPositions, - true); - } - } - - /** - * Keep track of the number of messages. Print them if desired. - * - * @param event The BattleMessageEvent. - */ - public void onBattleMessage(BattleMessageEvent event) { - if (isDumpingMessages) { - Logger.realOut.println(event.getMessage()); - } - messages++; - } - - /** - * Keep track of the number of errors. Print them if desired. - * - * @param event The BattleErrorEvent. - */ - public void onBattleError(BattleErrorEvent event) { - if (isDumpingErrors) { - Logger.realErr.println(event.getError()); - } - errors++; - } -} diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBedAssert.java b/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBedAssert.java deleted file mode 100644 index efb7fe8..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/RobotTestBedAssert.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.testing; - - -import robocode.util.Utils; - - -/** - * Provides some additional Assert methods for use in Robocode. - * - * @author Philip Johnson (original) - * @author Pavel Savara (contributor) - */ -public class RobotTestBedAssert extends org.junit.Assert { - - /** - * Asserts that the two values are "sufficiently close". - * Define sufficiently close using Utils.NEAR_DELTA. - * - * @param value1 First value. - * @param value2 Second value. - */ - public static void assertNear(double value1, double value2) { - org.junit.Assert.assertEquals(value1, value2, Utils.NEAR_DELTA); - } -} diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/package.html b/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/package.html deleted file mode 100644 index b0fe82d..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.api/src/main/java/robocode/control/testing/package.html +++ /dev/null @@ -1,12 +0,0 @@ - - -Provides a harness for JUnit testing. - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/.classpath b/代码/workspace_robo4/plugins/testing/robocode.testing.content/.classpath deleted file mode 100644 index 31eaf22..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/.project b/代码/workspace_robo4/plugins/testing/robocode.testing.content/.project deleted file mode 100644 index a5b7468..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/.project +++ /dev/null @@ -1,16 +0,0 @@ - - - robocode.testing.content - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.testing.samples - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/testing/robocode.testing.content/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7040061..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:14:20 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/pom.xml b/代码/workspace_robo4/plugins/testing/robocode.testing.content/pom.xml deleted file mode 100644 index 11e7063..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - robocode.testing.content - Robot Testing Framework Static Content - - net.sf.robocode - robocode.testing - ${robocode.version} - - - - net.sf.robocode - robocode.testing.samples - ${project.version} - - - net.sf.robocode - robocode.testing.api - - - net.sf.robocode - robocode.api - - - junit - junit - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/robocode.testing.content.iml b/代码/workspace_robo4/plugins/testing/robocode.testing.content/robocode.testing.content.iml deleted file mode 100644 index 4203486..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/robocode.testing.content.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/Read.Me.txt b/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/Read.Me.txt deleted file mode 100644 index f856f5f..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/Read.Me.txt +++ /dev/null @@ -1,33 +0,0 @@ -==== - Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://robocode.sourceforge.net/license/epl-v10.html -==== - -This is way how to test your robots with JUnit and Robocode. - -1) Look at robocode/testing/sample/TestWallBehavior.java - - it's behavioral integration test, to proove that samples.Wall robot will visit all 4 corners of battlefield - - it's inherited from robocode.control.testing.RobotTestBed, which is part of robocode.testing extension - -2) RobotTestBed - base class for tests - - provides setup of Robocode engine itself - - expects you to set Java system property robocode.home to path to your robocode installation. For example C:\Robocode - - supports setup of battle by overriding various virtual methods, among others - - getRobotNames() - allows you to specify coma separated list of robos for battle - - getNumRounds() - allows you to specify number of rounds for the battle - - for more see robocode/testing/javadoc/index.html - - implements IBattleListener interface of robocode and it's notified about battle events - - override onTurnEnded() method to be invoked after each turn, with snapshot of current battlefield - - override onBattleCompleted() method to be invoked after battle, with battle resutls and scores - - for more see robocode/testing/javadoc/index.html and robocode/javadoc/index.html - -3) Build the unit test by starting robocode\testing\compile.cmd or do it in your IDE - -4) Run the test with JUnit by starting robocode\testing\test.cmd or do it in your IDE - - note that we pass -Drobocode.home Java property - -5) watch the test result - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/compile.cmd b/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/compile.cmd deleted file mode 100644 index b877710..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/compile.cmd +++ /dev/null @@ -1,10 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off -javac -cp ../libs/junit-4.5.jar;../libs/robocode.jar;../libs/robocode.testing.jar sample/TestWallBehavior.java \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/test.cmd b/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/test.cmd deleted file mode 100644 index 3f14b58..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.content/src/main/resources/testing/test.cmd +++ /dev/null @@ -1,10 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off -java -Drobocode.home=.. -cp ../libs/junit-4.5.jar;../libs/robocode.jar;../libs/robocode.testing.jar;.; org.junit.runner.JUnitCore sample.TestWallBehavior diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.classpath b/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.classpath deleted file mode 100644 index 9e54ea0..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.classpath +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.project b/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.project deleted file mode 100644 index 716aee0..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.project +++ /dev/null @@ -1,19 +0,0 @@ - - - robocode.testing.distribution - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.testing.api - robocode.testing.content - robocode.testing.samples - robocode.testing.installer - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7040061..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:14:20 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/pom.xml b/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/pom.xml deleted file mode 100644 index 93569f0..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/pom.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - 4.0.0 - robocode.testing.distribution - Robot Testing Framework Distribution - - net.sf.robocode - robocode.testing - ${robocode.version} - - - - net.sf.robocode - robocode.testing.api - ${project.version} - jar - - - net.sf.robocode - robocode.testing.content - ${project.version} - jar - - - net.sf.robocode - robocode.testing.installer - ${project.version} - jar - - - net.sf.robocode - robocode.testing.samples - ${project.version} - jar - - - junit - junit - 4.11 - jar - - - - - - maven-assembly-plugin - - ${project.parent.artifactId}-${project.version} - true - - testing-setup.asm.xml - - - - net.sf.robocode.installer.AutoExtract - - - - - - make-assembly - package - - single - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/robocode.testing.distribution.iml b/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/robocode.testing.distribution.iml deleted file mode 100644 index 60e4af3..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/robocode.testing.distribution.iml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/testing-setup.asm.xml b/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/testing-setup.asm.xml deleted file mode 100644 index 54b0fc4..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.distribution/testing-setup.asm.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - setup - - dir - jar - - false - - - - - junit:junit - - libs - false - - - - - net.sf.robocode:robocode.testing.api - - libs - false - robocode.testing.${artifact.extension} - - - - net.sf.robocode:robocode.testing.api:javadoc - - testing/javadoc - true - - - - - net.sf.robocode:robocode.testing.samples - - testing - true - - - **/META-INF/** - **/*.class - - - - - - - net.sf.robocode:robocode.testing.installer - net.sf.robocode:robocode.testing.content - - true - - - **/META-INF/** - - - - - - - ../robocode.testing.api/target/site/apidocs - /testing/javadoc - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.iml b/代码/workspace_robo4/plugins/testing/robocode.testing.iml deleted file mode 100644 index c163c5f..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.iml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.classpath b/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.classpath deleted file mode 100644 index faff71b..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.project b/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.project deleted file mode 100644 index dc2dd6e..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.project +++ /dev/null @@ -1,14 +0,0 @@ - - - robocode.testing.installer - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7040061..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:14:20 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/pom.xml b/代码/workspace_robo4/plugins/testing/robocode.testing.installer/pom.xml deleted file mode 100644 index 5336a18..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - 4.0.0 - robocode.testing.installer - Robot Testing Framework Installer - - net.sf.robocode - robocode.testing - ${robocode.version} - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - net.sf.robocode.installer.AutoExtract - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/robocode.testing.installer.iml b/代码/workspace_robo4/plugins/testing/robocode.testing.installer/robocode.testing.installer.iml deleted file mode 100644 index 93c108a..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/robocode.testing.installer.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java b/代码/workspace_robo4/plugins/testing/robocode.testing.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java deleted file mode 100644 index e993cf8..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java +++ /dev/null @@ -1,389 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.installer; - - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.URL; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.jar.JarInputStream; - - -/** - * Installer for Robocode. - * - * @author Mathew A. Nelsen (original) - * @author Flemming N. Larsen (contributor) - */ -public class AutoExtract implements ActionListener { - private JDialog licenseDialog; - private boolean accepted; - private final String[] spinner = { "-", "\\", "|", "/"}; - private String message = ""; - private static final String javaVersion = System.getProperty("java.version"); - - /** - * AutoExtract constructor. - */ - public AutoExtract() { - super(); - } - - private boolean acceptLicense() { - String licenseText = ""; - - InputStream is; - - try { - JarFile extractJar = new JarFile("extract.jar"); - - is = extractJar.getInputStream(extractJar.getJarEntry("license/cpl-v10.html")); - } catch (IOException e) { - return true; - } - if (is == null) { - return true; - } - - BufferedReader r = new BufferedReader(new InputStreamReader(is)); - - try { - String line = r.readLine(); - - while (line != null) { - licenseText += line; - line = r.readLine(); - } - return acceptReject(licenseText); - - } catch (IOException e) { - System.err.println("Could not read line from license file: " + e); - } - return true; - } - - private boolean acceptReject(String text) { - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - licenseDialog = new JDialog(); - licenseDialog.setTitle("License Agreement"); - licenseDialog.setModal(true); - licenseDialog.setLocation((screenSize.width - 500) / 2, (screenSize.height - 400) / 2); - licenseDialog.setSize(500, 400); - JTextPane t = new JTextPane(); - - t.setContentType("text/html"); - t.setText(text); - t.setFont(new Font("Dialog", Font.PLAIN, 12)); - t.setEditable(false); - - JScrollPane s = new JScrollPane(); - - s.setViewportView(t); - - licenseDialog.getContentPane().setLayout(new BorderLayout()); - licenseDialog.getContentPane().add(s, BorderLayout.CENTER); - - JPanel p = new JPanel(); - - p.setLayout(new BorderLayout()); - JButton b1 = new JButton("Accept"); - JButton b2 = new JButton("Cancel"); - - p.add(b1, BorderLayout.WEST); - p.add(b2, BorderLayout.EAST); - - b1.addActionListener(this); - b2.addActionListener(this); - - licenseDialog.getContentPane().add(p, BorderLayout.SOUTH); - - licenseDialog.setVisible(true); - - return accepted; - } - - public void actionPerformed(ActionEvent e) { - accepted = e.getActionCommand().equals("Accept"); - licenseDialog.dispose(); - licenseDialog = null; - } - - private boolean extract(File dest) { - JDialog statusDialog = new JDialog(); - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - int width = 500; - int height = 100; - - statusDialog.setTitle("Installing"); - statusDialog.setLocation((screenSize.width - width) / 2, (screenSize.height - height) / 2); - statusDialog.setSize(width, height); - JLabel status = new JLabel(); - - statusDialog.getContentPane().setLayout(new BorderLayout()); - statusDialog.getContentPane().add(status, BorderLayout.CENTER); - - statusDialog.setVisible(true); - - FileOutputStream fos; - String entryName; - - byte buf[] = new byte[2048]; - - final String name = AutoExtract.class.getName().replaceAll("\\.", "/") + ".class"; - String urlJar = AutoExtract.class.getClassLoader().getResource(name).toString(); - final String src = urlJar.substring("jar:file:/".length(), urlJar.indexOf("!/")); - - if (src.indexOf('!') > -1) { - final String message = src - + "\nContains an exclamation point. Please move the file to a different directory."; - - JOptionPane.showMessageDialog(null, message); - System.err.println(message); - System.exit(0); - } - JarInputStream jarIS = null; - try { - final URL url = new URL("file:/" + src); - InputStream is = url.openStream(); - jarIS = new JarInputStream(is); - - JarEntry entry = jarIS.getNextJarEntry(); - - while (entry != null) { - int spin = 0; - - entryName = entry.getName(); - if (entry.isDirectory()) { - if (!entryName.startsWith("net")) { - File dir = new File(dest, entry.getName()); - - if (!dir.exists() && !dir.mkdirs()) { - System.out.println("Can't create dir " + dir); - } - } - } else { - if (!entryName.equals(name)) { - status.setText(entryName + " " + spinner[spin++]); - - File out = new File(dest, entry.getName()); - File parentDirectory = new File(out.getParent()); - - if (!parentDirectory.exists() && !parentDirectory.mkdirs()) { - System.out.println("Can't create dir " + parentDirectory); - } - fos = new FileOutputStream(out); - - int index = 0; - int num; - int count = 0; - - while ((num = jarIS.read(buf, 0, 2048)) != -1) { - fos.write(buf, 0, num); - index += num; - count++; - if (count > 80) { - status.setText(entryName + " " + spinner[spin++] + " (" + index + " bytes)"); - if (spin > 3) { - spin = 0; - } - count = 0; - } - } - fos.close(); - - if (entryName.length() > 3 && entryName.substring(entryName.length() - 3).equals(".sh")) { - if (File.separatorChar == '/') { - Runtime.getRuntime().exec("chmod 755 " + out.toString()); - } - } - - status.setText(entryName + " " + spinner[spin] + " (" + index + " bytes)"); - } - } - entry = jarIS.getNextJarEntry(); - } - statusDialog.dispose(); - message = "Installation successful"; - return true; - } catch (IOException e) { - message = "Installation failed" + e; - return false; - } finally { - if (jarIS != null) { - try { - jarIS.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String argv[]) { - // Verify that the Java version is version 6 (1.6.0) or newer - if (javaVersion.startsWith("1.") && javaVersion.charAt(2) < '5') { - final String message = "Robocode requires Java 6 (1.6.0) or newer.\n" - + "Your system is currently running Java " + javaVersion + ".\n" - + "If you have not installed (or activated) at least\n" + "JRE 6 or JDK 6, please do so."; - - JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE); - System.err.println(message); - System.exit(0); - } - - // Set native look and feel - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (RuntimeException t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF - } - - File installDir = null; - File suggestedDir; - - AutoExtract extractor = new AutoExtract(); - - if (extractor.acceptLicense()) { - if (argv.length == 1) { - suggestedDir = new File(argv[0]); - } else if (File.separatorChar == '\\') { - suggestedDir = new File("c:\\robocode\\"); - } else { - suggestedDir = new File(System.getProperty("user.home") + File.separator + "robocode" + File.separator); - } - - boolean done = false; - - while (!done) { - int rc = JOptionPane.showConfirmDialog(null, - "Robocode plugin will be installed in:\n" + suggestedDir + "\nIs this ok?", "Installing Robocode", - JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - - if (rc == JOptionPane.YES_OPTION) { - installDir = suggestedDir; - done = true; - } else if (rc == JOptionPane.NO_OPTION) { - Object r = JOptionPane.showInputDialog(null, "Please type in the installation directory", - "Installation Directory", JOptionPane.PLAIN_MESSAGE, null, null, suggestedDir); - - if (r == null) { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - System.exit(0); - } else { - suggestedDir = new File(((String) r).trim()); - } - } else if (rc == JOptionPane.CANCEL_OPTION) { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - System.exit(0); - } - } - if (!installDir.exists()) { - int rc = JOptionPane.showConfirmDialog(null, - installDir.getPath() + "\ndoes not exist. Would you like to create it?", "Installing Robocode", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - - if (rc == JOptionPane.YES_OPTION) { - if (!installDir.exists() && !installDir.mkdirs()) { - System.out.println("Can't create dir " + installDir); - } - } else { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - System.exit(0); - } - } - boolean rv = extractor.extract(installDir); - - if (!rv) { - JOptionPane.showMessageDialog(null, extractor.message); - } - } else { - JOptionPane.showMessageDialog(null, "Installation cancelled."); - } - - // Delete the class file with the installer and it's parent folders in the robocode home dir - if (installDir != null) { - String installerPath = AutoExtract.class.getName().replaceAll("\\.", "/") + "$1.class"; - - deleteFileAndParentDirsIfEmpty(new File(installDir, installerPath)); - } - - System.exit(0); - } - - private static boolean deleteDir(File dir) { - if (dir.isDirectory()) { - for (File file : dir.listFiles()) { - if (file.isDirectory()) { - // Skip directories ending with ".data" - if (file.getName().endsWith(".data")) { - continue; - } - try { - // Test for symlink and ignore. - // Robocode won't create one, but just in case a user does... - if (file.getCanonicalFile().getParentFile().equals(dir.getCanonicalFile())) { - deleteDir(file); - if (file.exists() && !file.delete()) { - System.err.println("Can't delete: " + file); - } - } else { - System.out.println("Warning: " + file + " may be a symlink. It has been ignored"); - } - } catch (IOException e) { - System.out.println( - "Warning: Cannot determine canonical file for " + file + ". It has been ignored"); - } - } else { - if (file.exists() && !file.delete()) { - System.err.println("Can't delete: " + file); - } - } - } - return dir.delete(); - } - return false; - } - - /** - * Deletes a file and afterwards deletes the parent directories that are empty. - * - * @param file the file or directory to delete - * @return true if success - */ - private static boolean deleteFileAndParentDirsIfEmpty(final File file) { - boolean wasDeleted = false; - - if (file != null && file.exists()) { - if (file.isDirectory()) { - wasDeleted = deleteDir(file); - } else { - wasDeleted = file.delete(); - - File parent = file; - - while (wasDeleted && (parent = parent.getParentFile()) != null) { - // Delete parent directory, but only if it is empty - File[] files = parent.listFiles(); - - if (files != null && files.length == 0) { - wasDeleted = deleteDir(parent); - } else { - wasDeleted = false; - } - } - } - } - return wasDeleted; - } -} diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.ipr b/代码/workspace_robo4/plugins/testing/robocode.testing.ipr deleted file mode 100644 index 55ed2f3..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.ipr +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.iws b/代码/workspace_robo4/plugins/testing/robocode.testing.iws deleted file mode 100644 index 03c854e..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.iws +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.classpath b/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.classpath deleted file mode 100644 index 88b5f19..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.classpath +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.project b/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.project deleted file mode 100644 index 8fa0726..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.project +++ /dev/null @@ -1,16 +0,0 @@ - - - robocode.testing.samples - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.testing.api - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index ee629d3..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:14:19 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/pom.xml b/代码/workspace_robo4/plugins/testing/robocode.testing.samples/pom.xml deleted file mode 100644 index c237b80..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - 4.0.0 - robocode.testing.samples - Robot Testing Framework Samples - - net.sf.robocode - robocode.testing - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.testing.api - ${project.version} - - - net.sf.robocode - robocode.tests - ${project.version} - test - - - junit - junit - 4.11 - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - - robocode.home - ${project.build.directory}/../../../../robocode.tests/target/classes - - - - - - - - src/main/java - false - - **/*.java - - - - src/main/resources - false - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/robocode.testing.samples.iml b/代码/workspace_robo4/plugins/testing/robocode.testing.samples/robocode.testing.samples.iml deleted file mode 100644 index fc33155..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/robocode.testing.samples.iml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/src/main/java/sample/TestWallBehavior.java b/代码/workspace_robo4/plugins/testing/robocode.testing.samples/src/main/java/sample/TestWallBehavior.java deleted file mode 100644 index 1a8bf38..0000000 --- a/代码/workspace_robo4/plugins/testing/robocode.testing.samples/src/main/java/sample/TestWallBehavior.java +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import static org.junit.Assert.assertTrue; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.testing.RobotTestBed; - - -/** - * Tests that sample.Walls moves to all four corners. - * - * @author Philip Johnson (original) - * @author Pavel Savara (contributor) - */ -public class TestWallBehavior extends RobotTestBed { - - /** - * True if the robot visited this corner during the test case. - */ - boolean visitedUpperLeft = false; - - /** - * True if the robot visited this corner during the test case. - */ - boolean visitedUpperRight = false; - - /** - * True if the robot visited this corner during the test case. - */ - boolean visitedLowerLeft = false; - - /** - * True if the robot visited this corner during the test case. - */ - boolean visitedLowerRight = false; - - /** - * Specifies that SittingDuck and DaCruzer are to be matched up in this test case. - * - * @return The comma-delimited list of robots in this match. - */ - @Override - public String getRobotNames() { - return "sample.SittingDuck,sample.Walls"; - } - - /** - * This test runs for 1 round. - * - * @return The number of rounds. - */ - @Override - public int getNumRounds() { - return 1; - } - - /** - * After each turn, check to see if we're at a corner. If so, set the corresponding flag. - * - * @param event Info about the current state of the battle. - */ - @Override - public void onTurnEnded(TurnEndedEvent event) { - IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[1]; - double xPos = robot.getX(); - double yPos = robot.getY(); - - if ((xPos < 40) && (yPos < 40)) { - visitedUpperLeft = true; - } - if ((xPos < 40 && (yPos > (height - 40)))) { - visitedLowerLeft = true; - } - if ((xPos > (width - 40)) && (yPos < 40)) { - visitedUpperRight = true; - } - if ((xPos > (width - 40) && (yPos > (height - 40)))) { - visitedLowerRight = true; - } - } - - /** - * After the battle, check to see that we've visited the corners. - * - * @param event Details about the completed battle. - */ - @Override - public void onBattleCompleted(BattleCompletedEvent - event) { - assertTrue("Check UpperLeft", visitedUpperLeft); - assertTrue("Check LowerLeft", visitedLowerLeft); - assertTrue("Check UpperRight", visitedUpperRight); - assertTrue("Check LowerRight", visitedLowerRight); - } -} diff --git a/代码/workspace_robo4/pom.xml b/代码/workspace_robo4/pom.xml deleted file mode 100644 index c880dfc..0000000 --- a/代码/workspace_robo4/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - 4.0.0 - robocode - Robocode - pom - - super-pom - net.sf.robocode - ${robocode.version} - super-pom - - - robocode.api - robocode.core - robocode.battle - robocode.host - robocode.ui - robocode.ui.editor - robocode.sound - robocode.samples - robocode.roborumble - robocode.tests.robots - robocode.tests - robocode.installer - robocode.repository - robocode.content - robocode.distribution - - - - - com.mycila - license-maven-plugin - 2.6 - -

super-pom/robocode-license-header.txt
- - **/*.properties - **/ReadMe.* - tools/bin/** - tools/licenses/** - LICENSE.txt - **/license/** - **/CILReader.cs - **/roborumble/*.txt - **/pom.xml - - - - - - format - - - - - - - diff --git a/代码/workspace_robo4/robocode.api/.classpath b/代码/workspace_robo4/robocode.api/.classpath deleted file mode 100644 index faff71b..0000000 --- a/代码/workspace_robo4/robocode.api/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.api/.externalToolBuilders/Launch Dir Builder.launch b/代码/workspace_robo4/robocode.api/.externalToolBuilders/Launch Dir Builder.launch deleted file mode 100644 index 1f54b39..0000000 --- a/代码/workspace_robo4/robocode.api/.externalToolBuilders/Launch Dir Builder.launch +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.api/.gitignore b/代码/workspace_robo4/robocode.api/.gitignore deleted file mode 100644 index eb5a316..0000000 --- a/代码/workspace_robo4/robocode.api/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target diff --git a/代码/workspace_robo4/robocode.api/.project b/代码/workspace_robo4/robocode.api/.project deleted file mode 100644 index 3f3e191..0000000 --- a/代码/workspace_robo4/robocode.api/.project +++ /dev/null @@ -1,26 +0,0 @@ - - - robocode.api - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.ui.externaltools.ExternalToolBuilder - - - LaunchConfigHandle - <project>/.externalToolBuilders/Launch Dir Builder.launch - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/代码/workspace_robo4/robocode.api/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.api/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 65f3846..0000000 --- a/代码/workspace_robo4/robocode.api/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:08 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.api/Robocode.launch b/代码/workspace_robo4/robocode.api/Robocode.launch deleted file mode 100644 index c7fb7fe..0000000 --- a/代码/workspace_robo4/robocode.api/Robocode.launch +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.api/pom.xml b/代码/workspace_robo4/robocode.api/pom.xml deleted file mode 100644 index f26680a..0000000 --- a/代码/workspace_robo4/robocode.api/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - robocode.api - Robocode API - - net.sf.robocode - robocode - ${robocode.version} - - - - - org.apache.maven.plugins - maven-jar-plugin - - robocode - - - robocode.Robocode - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - package - - javadoc - - - - - Robocode ${project.version} API - true - - Robocode ${project.version} API]]> - - - http://docs.oracle.com/javase/6/docs/api/ - - false - robocode.exception:net.sf.robocode:gl4java:robocode.robocodeGL - ${javadoc.additionalparam} - - - - org.apache.maven.plugins - maven-deploy-plugin - - false - - - - - diff --git a/代码/workspace_robo4/robocode.api/robocode.api.iml b/代码/workspace_robo4/robocode.api/robocode.api.iml deleted file mode 100644 index 613ddb1..0000000 --- a/代码/workspace_robo4/robocode.api/robocode.api.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFont.java b/代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFont.java deleted file mode 100644 index 5ed7f60..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFont.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package gl4java; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class GLFont {} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFunc.java b/代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFunc.java deleted file mode 100644 index 6f8bc58..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/gl4java/GLFunc.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package gl4java; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class GLFunc {} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/api/Module.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/api/Module.java deleted file mode 100644 index 0936dd9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/api/Module.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.api; - - -import net.sf.robocode.core.IModule; -import net.sf.robocode.serialization.RbSerializer; -import robocode.*; - -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public class Module implements IModule { - public void afterLoaded(List allModules) { - RbSerializer.register(RobotStatus.class, RbSerializer.RobotStatus_TYPE); - RbSerializer.register(BattleResults.class, RbSerializer.BattleResults_TYPE); - RbSerializer.register(Bullet.class, RbSerializer.Bullet_TYPE); - - // events - RbSerializer.register(RoundEndedEvent.class, RbSerializer.RoundEndedEvent_TYPE); - RbSerializer.register(BattleEndedEvent.class, RbSerializer.BattleEndedEvent_TYPE); - RbSerializer.register(BulletHitBulletEvent.class, RbSerializer.BulletHitBulletEvent_TYPE); - RbSerializer.register(BulletHitEvent.class, RbSerializer.BulletHitEvent_TYPE); - RbSerializer.register(BulletMissedEvent.class, RbSerializer.BulletMissedEvent_TYPE); - RbSerializer.register(DeathEvent.class, RbSerializer.DeathEvent_TYPE); - - RbSerializer.register(WinEvent.class, RbSerializer.WinEvent_TYPE); - RbSerializer.register(HitWallEvent.class, RbSerializer.HitWallEvent_TYPE); - RbSerializer.register(RobotDeathEvent.class, RbSerializer.RobotDeathEvent_TYPE); - RbSerializer.register(SkippedTurnEvent.class, RbSerializer.SkippedTurnEvent_TYPE); - RbSerializer.register(ScannedRobotEvent.class, RbSerializer.ScannedRobotEvent_TYPE); - RbSerializer.register(HitByBulletEvent.class, RbSerializer.HitByBulletEvent_TYPE); - RbSerializer.register(HitRobotEvent.class, RbSerializer.HitRobotEvent_TYPE); - RbSerializer.register(KeyPressedEvent.class, RbSerializer.KeyPressedEvent_TYPE); - RbSerializer.register(KeyReleasedEvent.class, RbSerializer.KeyReleasedEvent_TYPE); - RbSerializer.register(KeyTypedEvent.class, RbSerializer.KeyTypedEvent_TYPE); - RbSerializer.register(MouseClickedEvent.class, RbSerializer.MouseClickedEvent_TYPE); - RbSerializer.register(MouseDraggedEvent.class, RbSerializer.MouseDraggedEvent_TYPE); - RbSerializer.register(MouseEnteredEvent.class, RbSerializer.MouseEnteredEvent_TYPE); - RbSerializer.register(MouseExitedEvent.class, RbSerializer.MouseExitedEvent_TYPE); - RbSerializer.register(MouseMovedEvent.class, RbSerializer.MouseMovedEvent_TYPE); - RbSerializer.register(MousePressedEvent.class, RbSerializer.MousePressedEvent_TYPE); - RbSerializer.register(MouseReleasedEvent.class, RbSerializer.MouseReleasedEvent_TYPE); - RbSerializer.register(MouseWheelMovedEvent.class, RbSerializer.MouseWheelMovedEvent_TYPE); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/battle/IBattleManagerBase.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/battle/IBattleManagerBase.java deleted file mode 100644 index f32f146..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/battle/IBattleManagerBase.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import robocode.control.BattleSpecification; -import robocode.control.events.IBattleListener; - - -/** - * @author Pavel Savara (original) - */ -public interface IBattleManagerBase { - void addListener(IBattleListener listener); - - void removeListener(IBattleListener listener); - - void waitTillOver(); - - void stop(boolean waitTillEnd); - - void startNewBattle(BattleSpecification spec, String initialPositions, boolean waitTillOver, boolean enableCLIRecording); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/ContainerBase.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/ContainerBase.java deleted file mode 100644 index 341c6a8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/ContainerBase.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -/** - * @author Pavel Savara (original) - */ -public abstract class ContainerBase { - public static ContainerBase instance; - - protected abstract T getBaseComponent(java.lang.Class tClass); - - public static T getComponent(java.lang.Class tClass) { - return instance == null ? null : instance.getBaseComponent(tClass); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/IModule.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/IModule.java deleted file mode 100644 index 177717e..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/core/IModule.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public interface IModule { - void afterLoaded(List allModules); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/gui/IWindowManagerBase.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/gui/IWindowManagerBase.java deleted file mode 100644 index 815715b..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/gui/IWindowManagerBase.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.gui; - - -/** - * @author Pavel Savara (original) - */ -public interface IWindowManagerBase { - void setVisibleForRobotEngine(boolean visible); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/FileUtil.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/FileUtil.java deleted file mode 100644 index c9994b3..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/FileUtil.java +++ /dev/null @@ -1,352 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.io; - - -import static net.sf.robocode.io.Logger.logError; - -import java.io.*; - - -/** - * This is a class for file utilization. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class FileUtil { - - // Current working directory - private static File cwd; - - // Initializes the current working directory - static { - try { - final String wd = System.getProperty("WORKINGDIRECTORY", ""); - - FileUtil.setCwd(new File(wd)); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * Returns the current working directory. - * - * @return a File for the current working directory - */ - public static File getCwd() { - return cwd; - } - - /** - * Changes the current working directory. - * - * @param cwd a File that is the new working directory - * @throws IOException if an I/O exception occurs - */ - public static void setCwd(File cwd) throws IOException { - FileUtil.cwd = cwd.getCanonicalFile(); - } - - /** - * Returns the file type of a file, i.e. it's extension. - * - * @param file the file - * @return the file type of the file, e.g. ".class", ".jar" or "" if the - * file name does not contain an extension. - */ - public static String getFileType(File file) { - return getFileType(file.getName()); - } - - /** - * Returns the file type of a file name, i.e. it's extension. - * - * @param fileName the file name - * @return the file type of the file name, e.g. ".class", ".jar" or "" if - * the file name does not contain an extension. - */ - public static String getFileType(String fileName) { - int lastdot = fileName.lastIndexOf('.'); - - return (lastdot < 0) ? "" : fileName.substring(lastdot); - } - - /** - * Quotes a file name if it contains white spaces and has not already been - * quoted. - * - * @param filename the file to quote - * @return a quoted version of the specified filename - */ - public static String quoteFileName(String filename) { - if (filename.startsWith("\"") && filename.endsWith("\"")) { - return filename; - } - if (System.getProperty("os.name").toLowerCase().startsWith("windows") && filename.startsWith("file://")) { - filename = filename.substring(7); - } - if (filename.matches(".*\\s+?.*")) { - return '"' + filename + '"'; - } - return filename; - } - - /** - * Copies a file into another file. - * - * @param srcFile the input file to copy - * @param destFile the output file to copy to - * @throws IOException if an I/O exception occurs - */ - public static void copy(File srcFile, File destFile) throws IOException { - if (srcFile.equals(destFile)) { - throw new IOException("You cannot copy a file onto itself"); - } - - byte buf[] = new byte[4096]; - - FileInputStream in = null; - FileOutputStream out = null; - - try { - in = new FileInputStream(srcFile); - out = new FileOutputStream(destFile); - - while (in.available() > 0) { - out.write(buf, 0, in.read(buf, 0, buf.length)); - } - } finally { - if (in != null) { - in.close(); - } - if (out != null) { - out.close(); - } - } - } - - /** - * Deletes a directory. - * - * @param dir the file for the directory to delete - * @return true if success - */ - public static boolean deleteDir(File dir) { - if (dir.isDirectory()) { - for (File file : dir.listFiles()) { - if (file.isDirectory()) { - try { - // Test for symlink and ignore. - // Robocode won't create one, but just in case a user does... - if (file.getCanonicalFile().getParentFile().equals(dir.getCanonicalFile())) { - deleteDir(file); - if (file.exists() && !file.delete()) { - Logger.logError("Cannot delete: " + file); - } - } else { - Logger.logWarning(file + " may be a symlink. Ignoring."); - } - } catch (IOException e) { - Logger.logWarning("Cannot determine canonical file for " + file + ". Ignoring."); - } - } else { - if (file.exists() && !file.delete()) { - Logger.logError("Cannot delete: " + file); - } - } - } - return dir.delete(); - } - return false; - } - - /** - * Creates a directory if it does not exist already - * - * @param dir the File that represents the new directory to create. - * @return the created directory - */ - public static File createDir(File dir) { - if (dir != null && !dir.exists()) { - if (!dir.mkdir()) { - Logger.logError("Cannot create dir: " + dir); - } - } - return dir; - } - - /** - * Returns the class name of the specified filename. - * - * @param fileName the filename to extract the class name from - * @return the class name of the specified filename - */ - public static String getClassName(String fileName) { - int lastdot = fileName.lastIndexOf('.'); - - if (lastdot < 0) { - return fileName; - } - if (fileName.length() - 1 == lastdot) { - return fileName.substring(0, fileName.length() - 1); - } - return fileName.substring(0, lastdot); - } - - /** - * Returns the directory containing the robots. - * - * @return a File that is the directory containing the robots - */ - public static File getRobotsDir() { - String robotPath = System.getProperty("ROBOTPATH"); - File file; - - if (robotPath != null) { - file = new File(robotPath); - } else { - file = new File(cwd, "/robots"); - } - return createDir(file); - } - - /** - * Returns the robot database file. - * - * @return a File that is the directory containing the robot cache. - */ - public static File getRobotDatabaseFile() { - return new File(getRobotsDir(), "/robot.database"); - } - - /** - * Returns the directory containing data files of robots. - * - * @return a File that is the directory containing the robot data. - */ - public static File getRobotsDataDir() { - return createDir(new File(getRobotsDir(), "/.data/")); - } - - /** - * Returns the directory containing the battle files. - * - * @return a File that is the directory containing the battle files - */ - public static File getBattlesDir() { - return createDir(new File(cwd, "/battles")); - } - - /** - * Returns the directory containing the configuration files. - * If the directory does not exist, it will be created automatically. - * - * @return a File that is the directory containing configuration files - */ - public static File getConfigDir() { - return createDir(new File(cwd, "/config")); - } - - /** - * Returns the directory containing the screen shot files. - * If the directory does not exist, it will be created automatically. - * - * @return a File that is the directory containing screen shot files - */ - public static File getScreenshotsDir() { - return createDir(new File(cwd, "/screenshots")); - } - - /** - * Returns the Robocode configuration file. - * - * @return a File that is the Robocode configuration file. - */ - public static File getRobocodeConfigFile() { - return new File(getConfigDir(), "robocode.properties"); - } - - /** - * Returns the window configuration file. - * - * @return a File that is the window configuration file. - */ - public static File getWindowConfigFile() { - return new File(getConfigDir(), "window.properties"); - } - - /** - * Returns the compiler configuration file. - * - * @return a File that is the compiler configuration file. - */ - public static File getCompilerConfigFile() { - return new File(getConfigDir(), "compiler.properties"); - } - - /** - * Returns the source code editor configuration file. - * - * @return a File that is the editor configuration file. - */ - public static File getEditorConfigFile() { - return new File(getConfigDir(), "editor.properties"); - } - - /** - * Returns the editor theme directory. - * - * @return a File that is the directory containing the editor theme files. - */ - public static File getEditorThemeConfigDir() { - return createDir(new File(cwd, "/theme/editor")); - } - - /** - * Cleans up a stream by flushing it and closing it if it is not null. - * - * @param stream the stream to clean up. - */ - public static void cleanupStream(Object stream) { - if (stream == null) { - return; - } - if (stream instanceof Flushable) { - try { - ((Flushable) stream).flush(); - } catch (IOException e) { - logError(e); - } - } - if (stream instanceof Closeable) { - try { - ((Closeable) stream).close(); - } catch (IOException e) { - logError(e); - } - } - } - - /** - * Checks if a filename is valid. - * - * @param file the filename to check. - * @return true if the filename is valid; false otherwise. - */ - public static boolean isFilenameValid(String file) { - File f = new File(file); - try { - f.getCanonicalPath(); - return true; - } catch (IOException e) { - return false; - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/Logger.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/Logger.java deleted file mode 100644 index a903fd8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/Logger.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.io; - - -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.util.StringUtil; -import robocode.control.events.BattleErrorEvent; -import robocode.control.events.BattleMessageEvent; -import robocode.control.events.IBattleListener; - -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; - - -/** - * This is a class used for logging. - * - * @author Flemming N. Larsen (original) - * @author Mathew A. Nelson (original) - */ -public class Logger { - public static final PrintStream realOut = System.out; - public static final PrintStream realErr = System.err; - - private static IBattleListener logListener; - - private final static StringBuffer logBuffer = new StringBuffer(); - - public static void setLogListener(IBattleListener logListener) { - Logger.logListener = logListener; - } - - public static void logMessage(String s) { - logMessage(s, true); - } - - public static void logMessage(String s, boolean newline) { - if (logListener == null) { - if (System.getProperty("logMessages", "true").equalsIgnoreCase("true")) { - s = StringUtil.toBasicLatin(s); - if (newline) { - realOut.println(s); - } else { - realOut.print(s); - realOut.flush(); - } - } - } else { - synchronized (logBuffer) { - if (!HiddenAccess.isSafeThread()) { - // we just queue it, to not let unsafe thread travel thru system - logBuffer.append(s); - logBuffer.append("\n"); - } else if (newline) { - logListener.onBattleMessage(new BattleMessageEvent(logBuffer + s)); - logBuffer.setLength(0); - } else { - logBuffer.append(s); - } - } - } - } - - public static void logWarning(String s) { - logMessage("Warning: " + s, true); - } - - public static void logError(String message, Throwable t) { - logError(message + ":\n" + toStackTraceString(t)); - } - - public static void logError(Throwable t) { - logError(toStackTraceString(t)); - } - - public static void logError(String s) { - if (logListener == null) { - if (System.getProperty("logErrors", "true").equalsIgnoreCase("true")) { - s = StringUtil.toBasicLatin(s); - realErr.println(s); - } - } else { - logListener.onBattleError(new BattleErrorEvent(s)); - } - } - - private static String toStackTraceString(Throwable t) { - if (t == null) { - return ""; - } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream ps = new PrintStream(baos); - - t.printStackTrace(ps); - ps.close(); - return baos.toString(); - } - - public static void printlnToRobotsConsole(String s) { - // this will get redirected to robot's console - System.out.println(s); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/RobocodeProperties.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/RobocodeProperties.java deleted file mode 100644 index d39924f..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/io/RobocodeProperties.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.io; - - -/** - * Utility class for convenient access to Robocode system wide properties. - * - * @author Flemming N. Larsen (original) - */ -public final class RobocodeProperties { - - // These properties can only be set at startup - private static final boolean NO_SECURITY = System.getProperty("NOSECURITY", "false").equals("true"); - private static final boolean DEBUG = System.getProperty("debug", "false").equals("true"); - - private RobocodeProperties() {} - - /** - * Checks if security is off, i.e. that the NOSECURITY property has been set to true. - * @return true if security is disabled; false if security is enabled. - */ - public static boolean isSecurityOff() { - return NO_SECURITY; - } - - /** - * Checks if security is on, i.e. that the NOSECURITY property has been set to false or not defined at all. - * @return true if security is enabled; false if security is disabled. - */ - public static boolean isSecurityOn() { - return !NO_SECURITY; - } - - /** - * Checks if debugging is disabled. - * @return true if debugging is disabled; false is debugging is enabled. - */ - public static boolean isDebuggingOff() { - return !DEBUG; - } - - /** - * Checks if debugging is enabled. - * @return true if debugging is enabled; false is debugging is disabled. - */ - public static boolean isDebuggingOn() { - return DEBUG; - } - - /** - * Sets the testing flag. - * @param enabled true if testing is being enabled; false if testing is being disabled. - */ - public static void setTesting(boolean enabled) { - System.setProperty("TESTING", "" + enabled); - } - - /** - * Checks if testing is disabled. - * @return true if testing is disabled; false is testing is enabled. - */ - public static boolean isTestingOff() { - return !isTestingOn(); - } - - /** - * Checks if testing is enabled. - * @return true if testing is enabled; false is testing is disabled. - */ - public static boolean isTestingOn() { - return System.getProperty("TESTING", "false").equals("true"); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/manager/IVersionManagerBase.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/manager/IVersionManagerBase.java deleted file mode 100644 index f679071..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/manager/IVersionManagerBase.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.manager; - - -/** - * @author Pavel Savara (original) - */ -public interface IVersionManagerBase { - String getVersion(); - String getVersionN(); - int getVersionAsInt(); - boolean isLastRunVersionChanged(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/peer/IRobotStatics.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/peer/IRobotStatics.java deleted file mode 100644 index 3a1646c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/peer/IRobotStatics.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -/** - * @author Pavel Savara (original) - */ -public interface IRobotStatics { - boolean isInteractiveRobot(); - - boolean isPaintRobot(); - - boolean isAdvancedRobot(); - - boolean isTeamRobot(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java deleted file mode 100644 index b1bbdb4..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - - -/** - * Tool used for calculating the code size of a directory or jar file. - * - * @author Flemming N. Larsen (original) - */ -public final class CodeSizeCalculator { - - public static Integer getDirectoryCodeSize(File dir) { - return getCodeSize("processDirectory", dir); - } - - public static Integer getJarFileCodeSize(File jarFile) { - return getCodeSize("processZipFile", jarFile); - } - - private static Integer getCodeSize(String invokeMethod, File jarFile) { - Integer codesize; - try { - // Call the code size utility using reflection - Class classType = Class.forName("codesize.Codesize"); - - Method method = classType.getMethod(invokeMethod, new Class[] { File.class }); - Object item = method.invoke(null/* static method */, jarFile); - - // Calls Codesize.Item.getCodeSize() - method = item.getClass().getMethod("getCodeSize", (Class[]) null); - codesize = (Integer) method.invoke(item, (Object[]) null); - - } catch (IllegalAccessException e) { - codesize = null; - } catch (InvocationTargetException e) { - codesize = null; - } catch (NoSuchMethodException e) { - codesize = null; - } catch (ClassNotFoundException e) { - codesize = null; - } - return codesize; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/IRepositoryManagerBase.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/IRepositoryManagerBase.java deleted file mode 100644 index 5873b6c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/repository/IRepositoryManagerBase.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import robocode.control.RobotSpecification; - - -/** - * @author Pavel Savara (original) - */ -public interface IRepositoryManagerBase { - boolean refresh(); - RobotSpecification[] getSpecifications(); - RobotSpecification[] loadSelectedRobots(String selectedRobots); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/HiddenAccess.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/HiddenAccess.java deleted file mode 100644 index 184001c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/HiddenAccess.java +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import net.sf.robocode.core.ContainerBase; -import net.sf.robocode.io.Logger; -import net.sf.robocode.peer.IRobotStatics; -import robocode.BattleRules; -import robocode.Bullet; -import robocode.Event; -import robocode.RobotStatus; -import robocode.control.RobotSpecification; -import robocode.control.events.IBattleListener; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.io.File; -import java.io.FilenameFilter; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLDecoder; -import java.util.ArrayList; - - -/** - * Helpers for accessing hidden methods on events. - * - * @author Pavel Savara (original) - */ -public class HiddenAccess { - private static IHiddenEventHelper eventHelper; - private static IHiddenBulletHelper bulletHelper; - private static IHiddenSpecificationHelper specificationHelper; - private static IHiddenStatusHelper statusHelper; - private static IHiddenRulesHelper rulesHelper; - private static Method initContainer; - private static Method initContainerRe; - private static Method cleanup; - private static Method robocodeMain; - private static boolean initialized; - private static boolean foundCore = false; - - public static void init() { - if (initialized) { - return; - } - Method method; - - try { - method = Event.class.getDeclaredMethod("createHiddenHelper"); - method.setAccessible(true); - eventHelper = (IHiddenEventHelper) method.invoke(null); - method.setAccessible(false); - - method = Bullet.class.getDeclaredMethod("createHiddenHelper"); - method.setAccessible(true); - bulletHelper = (IHiddenBulletHelper) method.invoke(null); - method.setAccessible(false); - - method = RobotSpecification.class.getDeclaredMethod("createHiddenHelper"); - method.setAccessible(true); - specificationHelper = (IHiddenSpecificationHelper) method.invoke(null); - method.setAccessible(false); - - method = RobotStatus.class.getDeclaredMethod("createHiddenSerializer"); - method.setAccessible(true); - statusHelper = (IHiddenStatusHelper) method.invoke(null); - method.setAccessible(false); - - method = BattleRules.class.getDeclaredMethod("createHiddenHelper"); - method.setAccessible(true); - rulesHelper = (IHiddenRulesHelper) method.invoke(null); - method.setAccessible(false); - - ClassLoader loader = getClassLoader(); - Class main = loader.loadClass("net.sf.robocode.core.RobocodeMainBase"); - - initContainer = main.getDeclaredMethod("initContainer"); - initContainer.setAccessible(true); - - initContainerRe = main.getDeclaredMethod("initContainerForRobocodeEngine", File.class, IBattleListener.class); - initContainerRe.setAccessible(true); - - cleanup = main.getDeclaredMethod("cleanupForRobocodeEngine"); - cleanup.setAccessible(true); - - robocodeMain = main.getDeclaredMethod("robocodeMain", Object.class); - robocodeMain.setAccessible(true); - - initialized = true; - } catch (NoSuchMethodException e) { - Logger.logError(e); - } catch (InvocationTargetException e) { - Logger.logError(e); - } catch (IllegalAccessException e) { - Logger.logError(e); - } catch (ClassNotFoundException e) { - Logger.logError(e); - if (!foundCore) { - Logger.logError("Can't find robocode.core-1.x.jar module near to robocode.jar"); - Logger.logError("Class path: " + System.getProperty("robocode.class.path", null)); - } - System.exit(-1); - } catch (MalformedURLException e) { - Logger.logError(e); - } catch (MyException e) { - Logger.logError(e); - throw e; - } - - } - - private static ClassLoader getClassLoader() throws MalformedURLException { - // if other modules are .jar next to robocode.jar on same path, we will create classloader which will load them - // otherwise we rely on that they are already on classpath - StringBuilder classPath = new StringBuilder(System.getProperty("java.class.path", null)); - ClassLoader loader = ClassLoader.getSystemClassLoader(); - String path = HiddenAccess.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - - try { - path = URLDecoder.decode(path, "UCS2"); - } catch (UnsupportedEncodingException e) { - path = new File(".", "libs/robocode.jar").toString(); - } - final int i = path.lastIndexOf("robocode.jar"); - - if (i > 0) { - loader = createClassLoader(classPath, loader, path.substring(0, i)); - } - System.setProperty("robocode.class.path", classPath.toString()); - return loader; - } - - private static ClassLoader createClassLoader(StringBuilder classPath, ClassLoader loader, String dir) throws MalformedURLException { - - File dirf = new File(dir); - ArrayList urls = new ArrayList(); - - final File[] files = dirf.listFiles(new FilenameFilter() { - public boolean accept(File dir, String name) { - final String test = name.toLowerCase(); - - return test.endsWith(".jar") && !test.endsWith("robocode.jar"); - } - }); - - if (files != null) { - for (File file : files) { - final String name = file.toString().toLowerCase(); - - if (name.contains("robocode.core")) { - foundCore = true; - urls.add(file.toURI().toURL()); - } - if (name.contains("picocontainer")) { - urls.add(file.toURI().toURL()); - } - if (name.contains("codesize")) { - urls.add(file.toURI().toURL()); - } - classPath.append(File.pathSeparator); - classPath.append(file.toString()); - } - } - return new URLClassLoader(urls.toArray(new URL[urls.size()]), loader); - } - - public static boolean isCriticalEvent(Event e) { - return eventHelper.isCriticalEvent(e); - } - - public static void setEventTime(Event e, long newTime) { - eventHelper.setTime(e, newTime); - } - - public static void setEventPriority(Event e, int newPriority) { - eventHelper.setPriority(e, newPriority); - } - - public static void dispatch(Event event, IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - eventHelper.dispatch(event, robot, statics, graphics); - } - - public static void setDefaultPriority(Event e) { - eventHelper.setDefaultPriority(e); - } - - public static byte getSerializationType(Event e) { - return eventHelper.getSerializationType(e); - } - - public static void update(Bullet bullet, double x, double y, String victimName, boolean isActive) { - bulletHelper.update(bullet, x, y, victimName, isActive); - } - - public static RobotSpecification createSpecification(Object fileSpecification, String name, String author, String webpage, String version, String robocodeVersion, String jarFile, String fullClassName, String description) { - return specificationHelper.createSpecification(fileSpecification, name, author, webpage, version, - robocodeVersion, jarFile, fullClassName, description); - } - - public static Object getFileSpecification(RobotSpecification specification) { - return specificationHelper.getFileSpecification(specification); - } - - public static String getRobotTeamName(RobotSpecification specification) { - return specificationHelper.getTeamName(specification); - } - - public static void setTeamId(RobotSpecification specification, String teamName) { - specificationHelper.setTeamName(specification, teamName); - } - - public static RobotStatus createStatus(double energy, double x, double y, double bodyHeading, double gunHeading, double radarHeading, double velocity, - double bodyTurnRemaining, double radarTurnRemaining, double gunTurnRemaining, double distanceRemaining, double gunHeat, int others, - int numSentries, int roundNum, int numRounds, long time) { - return statusHelper.createStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, - bodyTurnRemaining, radarTurnRemaining, gunTurnRemaining, distanceRemaining, gunHeat, others, numSentries, - roundNum, numRounds, time); - } - - public static BattleRules createRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, long inactivityTime, boolean hideEnemyNames, int sentryBorderSize) { - return rulesHelper.createRules(battlefieldWidth, battlefieldHeight, numRounds, gunCoolingRate, inactivityTime, - hideEnemyNames, sentryBorderSize); - } - - public static boolean isSafeThread() { - final IThreadManagerBase threadManager = ContainerBase.getComponent(IThreadManagerBase.class); - - return threadManager != null && threadManager.isSafeThread(); - } - - public static void initContainerForRobotEngine(File robocodeHome, IBattleListener listener) { - init(); - try { - initContainerRe.invoke(null, robocodeHome, listener); - } catch (IllegalAccessException e) { - Logger.logError(e); - } catch (InvocationTargetException e) { - Logger.logError(e.getCause()); - Logger.logError(e); - } - } - - public static void initContainer() { - init(); - try { - initContainer.invoke(null); - } catch (IllegalAccessException e) { - Logger.logError(e); - } catch (InvocationTargetException e) { - Logger.logError(e.getCause()); - Logger.logError(e); - } - } - - public static void cleanup() { - init(); - try { - cleanup.invoke(null); - } catch (IllegalAccessException e) { - Logger.logError(e); - } catch (InvocationTargetException e) { - Logger.logError(e.getCause()); - Logger.logError(e); - } - } - - public static void robocodeMain(final String[] args) { - init(); - try { - robocodeMain.invoke(null, (Object) args); - } catch (IllegalAccessException e) { - Logger.logError(e); - } catch (InvocationTargetException e) { - Logger.logError(e.getCause()); - Logger.logError(e); - } - } - -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenBulletHelper.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenBulletHelper.java deleted file mode 100644 index 08b8b67..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenBulletHelper.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import robocode.Bullet; - - -/** - * @author Pavel Savara (original) - */ -public interface IHiddenBulletHelper { - void update(Bullet bullet, double x, double y, String victimName, boolean isActive); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenEventHelper.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenEventHelper.java deleted file mode 100644 index 8c6d2e0..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenEventHelper.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import net.sf.robocode.peer.IRobotStatics; -import robocode.Event; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; - - -/** - * @author Pavel Savara (original) - */ -public interface IHiddenEventHelper { - void setDefaultPriority(Event event); - void setPriority(Event event, int newPriority); - void setTime(Event event, long newTime); - boolean isCriticalEvent(Event event); - void dispatch(Event event, IBasicRobot robot, IRobotStatics statics, Graphics2D graphics); - byte getSerializationType(Event event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenRulesHelper.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenRulesHelper.java deleted file mode 100644 index 85dec02..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenRulesHelper.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import robocode.BattleRules; - - -/** - * @author Pavel Savara (original) - */ -public interface IHiddenRulesHelper { - BattleRules createRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, long inactivityTime, boolean hideEnemyNames, int sentryBorderSizes); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenSpecificationHelper.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenSpecificationHelper.java deleted file mode 100644 index 05bc943..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenSpecificationHelper.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import robocode.control.RobotSpecification; - - -/** - * @author Pavel Savara (original) - */ -public interface IHiddenSpecificationHelper { - - RobotSpecification createSpecification(Object specification, String name, String author, String webpage, String version, String robocodeVersion, String jarFile, String fullClassName, String description); - Object getFileSpecification(RobotSpecification specification); - void setTeamName(RobotSpecification specification, String teamName); - String getTeamName(RobotSpecification specification); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenStatusHelper.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenStatusHelper.java deleted file mode 100644 index 8bff082..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IHiddenStatusHelper.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import robocode.RobotStatus; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public interface IHiddenStatusHelper { - RobotStatus createStatus(double energy, double x, double y, double bodyHeading, double gunHeading, double radarHeading, - double velocity, double bodyTurnRemaining, double radarTurnRemaining, double gunTurnRemaining, - double distanceRemaining, double gunHeat, int others, int numSentries, int roundNum, int numRounds, long time); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IThreadManagerBase.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IThreadManagerBase.java deleted file mode 100644 index b69d1cd..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/IThreadManagerBase.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import java.io.FileOutputStream; -import java.io.IOException; - - -/** - * @author Pavel Savara (original) - */ -public interface IThreadManagerBase { - boolean isSafeThread(); - FileOutputStream createRobotFileStream(String fileName, boolean append) throws IOException; -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/SafeComponent.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/SafeComponent.java deleted file mode 100644 index 74d96a9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/SafeComponent.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.security; - - -import java.awt.*; - - -/** - * @author Pavel Savara (original) - */ -@SuppressWarnings("serial") -public class SafeComponent extends Component { - // Dummy component used to preventing robots in accessing the real source component - private static Component safeEventComponent; - - public static Component getSafeEventComponent() { - if (safeEventComponent == null) { - safeEventComponent = new SafeComponent(); - } - return safeEventComponent; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/ISerializableHelper.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/ISerializableHelper.java deleted file mode 100644 index 97ef510..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/ISerializableHelper.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -import java.nio.ByteBuffer; - - -/** - * @author Pavel Savara (original) - */ -public interface ISerializableHelper { - int sizeOf(RbSerializer serializer, Object object); - void serialize(RbSerializer serializer, ByteBuffer buffer, Object object); - Object deserialize(RbSerializer serializer, ByteBuffer buffer); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/RbSerializer.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/RbSerializer.java deleted file mode 100644 index 3a01c8e..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/serialization/RbSerializer.java +++ /dev/null @@ -1,539 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -import net.sf.robocode.core.ContainerBase; -import net.sf.robocode.io.Logger; -import net.sf.robocode.manager.IVersionManagerBase; -import net.sf.robocode.security.HiddenAccess; -import robocode.Event; - -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.*; -import java.util.HashMap; -import java.util.Map; - - -/** - * @author Pavel Savara (original) - */ -public final class RbSerializer { - public final static int SIZEOF_TYPEINFO = 1; - public final static int SIZEOF_BYTE = 1; - public final static int SIZEOF_BOOL = 1; - public final static int SIZEOF_CHAR = 2; - public final static int SIZEOF_INT = 4; - public final static int SIZEOF_LONG = 8; - public final static int SIZEOF_DOUBLE = 8; - - public final static byte TERMINATOR_TYPE = -1; - public final static byte ExecCommands_TYPE = 1; - public final static byte BulletCommand_TYPE = 2; - public final static byte TeamMessage_TYPE = 3; - public final static byte DebugProperty_TYPE = 4; - public final static byte ExecResults_TYPE = 5; - public final static byte RobotStatus_TYPE = 6; - public final static byte BulletStatus_TYPE = 7; - public final static byte BattleResults_TYPE = 8; - public final static byte Bullet_TYPE = 9; - public final static byte RobotStatics_TYPE = 10; - - public final static byte BattleEndedEvent_TYPE = 32; - public final static byte BulletHitBulletEvent_TYPE = 33; - public final static byte BulletHitEvent_TYPE = 34; - public final static byte BulletMissedEvent_TYPE = 35; - public final static byte DeathEvent_TYPE = 36; - public final static byte WinEvent_TYPE = 37; - public final static byte HitWallEvent_TYPE = 38; - public final static byte RobotDeathEvent_TYPE = 39; - public final static byte SkippedTurnEvent_TYPE = 40; - public final static byte ScannedRobotEvent_TYPE = 41; - public final static byte HitByBulletEvent_TYPE = 42; - public final static byte HitRobotEvent_TYPE = 43; - public final static byte KeyPressedEvent_TYPE = 44; - public final static byte KeyReleasedEvent_TYPE = 45; - public final static byte KeyTypedEvent_TYPE = 46; - public final static byte MouseClickedEvent_TYPE = 47; - public final static byte MouseDraggedEvent_TYPE = 48; - public final static byte MouseEnteredEvent_TYPE = 49; - public final static byte MouseExitedEvent_TYPE = 50; - public final static byte MouseMovedEvent_TYPE = 51; - public final static byte MousePressedEvent_TYPE = 52; - public final static byte MouseReleasedEvent_TYPE = 53; - public final static byte MouseWheelMovedEvent_TYPE = 54; - public final static byte RoundEndedEvent_TYPE = 55; - - private final static ISerializableHelper[] typeToHelper = new ISerializableHelper[256]; - private static Map, Byte> classToType = new HashMap, Byte>(); - private final static Charset charset; - private final CharsetEncoder encoder; - private final CharsetDecoder decoder; - - private static final int BYTE_ORDER = 0xC0DEDEA1; - private final int currentVersion; - - static { - charset = Charset.forName("UTF8"); // we will use it as UCS-2 - register(null, TERMINATOR_TYPE); // reserved for end of (list) element - } - - public RbSerializer() { - this.currentVersion = ContainerBase.getComponent(IVersionManagerBase.class).getVersionAsInt(); - encoder = charset.newEncoder(); - encoder.onMalformedInput(CodingErrorAction.REPORT); - encoder.onUnmappableCharacter(CodingErrorAction.REPLACE); - // throw away forst bom - ByteBuffer buffer = ByteBuffer.allocate(8); - - encoder.encode(CharBuffer.wrap("BOM"), buffer, false); - - decoder = charset.newDecoder(); - decoder.onMalformedInput(CodingErrorAction.REPORT); - decoder.onUnmappableCharacter(CodingErrorAction.REPLACE); - } - - public void serialize(OutputStream target, byte type, Object object) throws IOException { - int length = sizeOf(type, object); - - // header - ByteBuffer buffer = ByteBuffer.allocate(SIZEOF_INT + SIZEOF_INT + SIZEOF_INT); - - buffer.putInt(BYTE_ORDER); - buffer.putInt(currentVersion); - buffer.putInt(length); - target.write(buffer.array()); - - // body - buffer = ByteBuffer.allocate(length); - serialize(buffer, type, object); - if (buffer.remaining() != 0) { - throw new IOException("Serialization failed: bad size"); - } - target.write(buffer.array()); - } - - public ByteBuffer serialize(byte type, Object object) throws IOException { - int length = sizeOf(type, object); - - // header - ByteBuffer buffer = ByteBuffer.allocateDirect(SIZEOF_INT + SIZEOF_INT + SIZEOF_INT + length); - - buffer.putInt(BYTE_ORDER); - buffer.putInt(currentVersion); - buffer.putInt(length); - - // body - serialize(buffer, type, object); - if (buffer.remaining() != 0) { - throw new IOException("Serialization failed: bad size"); - } - return buffer; - } - - public ByteBuffer serializeToBuffer(ByteBuffer buffer, byte type, Object object) throws IOException { - int length = sizeOf(type, object); - - buffer.limit(SIZEOF_INT + SIZEOF_INT + SIZEOF_INT + length); - - buffer.putInt(BYTE_ORDER); - buffer.putInt(currentVersion); - buffer.putInt(length); - - // body - serialize(buffer, type, object); - if (buffer.remaining() != 0) { - throw new IOException("Serialization failed: bad size"); - } - return buffer; - } - - public Object deserialize(InputStream source) throws IOException { - // header - ByteBuffer buffer = ByteBuffer.allocate(SIZEOF_INT + SIZEOF_INT + SIZEOF_INT); - - fillBuffer(source, buffer); - buffer.flip(); - int bo = buffer.getInt(); - - if (bo != BYTE_ORDER) { - throw new IOException("Different byte order is not supported"); - } - int version = buffer.getInt(); - - if (version != currentVersion) { - throw new IOException("Version of data is not supported. We support only strong match"); - } - int length = buffer.getInt(); - - // body - buffer = ByteBuffer.allocate(length); - fillBuffer(source, buffer); - buffer.flip(); - final Object res = deserializeAny(buffer); - - if (buffer.remaining() != 0) { - throw new IOException("Serialization failed"); - } - return res; - } - - public Object deserialize(final ByteBuffer buffer) throws IOException { - int bo = buffer.getInt(); - - if (bo != BYTE_ORDER) { - throw new IOException("Different byte order is not supported"); - } - - int version = buffer.getInt(); - - if (version != currentVersion) { - throw new IOException("Version of data is not supported. We support only strong match"); - } - int length = buffer.getInt(); - - if (length != buffer.remaining()) { - throw new IOException("Wrong buffer size, " + length + "expected but got " + buffer.remaining()); - } - - // body - final Object res = deserializeAny(buffer); - - if (buffer.remaining() != 0) { - throw new IOException("Serialization failed"); - } - return res; - } - - public void serialize(ByteBuffer buffer, byte type, Object object) { - ISerializableHelper helper = getHelper(type); - - // FOR-DEBUG int expect = sizeOf(type, object) + buffer.position(); - - if (object != null) { - buffer.put(type); - helper.serialize(this, buffer, object); - } else { - buffer.put(TERMINATOR_TYPE); - } - // FOR-DEBUG if (expect != buffer.position()) { - // FOR-DEBUG throw new Error("Bad size"); - // FOR-DEBUG } - } - - public void serialize(ByteBuffer buffer, String data) { - if (data == null) { - buffer.putInt(-1); - } else { - ByteBuffer slice = encode(data); - - buffer.putInt(slice.limit()); - buffer.put(slice); - } - } - - public void serialize(ByteBuffer buffer, byte[] data) { - if (data == null) { - buffer.putInt(-1); - } else { - buffer.putInt(data.length); - buffer.put(data); - } - } - - public void serialize(ByteBuffer buffer, int[] data) { - if (data == null) { - buffer.putInt(-1); - } else { - buffer.putInt(data.length); - for (int aData : data) { - buffer.putInt(aData); - } - } - } - - public void serialize(ByteBuffer buffer, char[] data) { - if (data == null) { - buffer.putInt(-1); - } else { - buffer.putInt(data.length); - for (char aData : data) { - buffer.putChar(aData); - } - } - } - - public void serialize(ByteBuffer buffer, double[] data) { - if (data == null) { - buffer.putInt(-1); - } else { - buffer.putInt(data.length); - for (double aData : data) { - buffer.putDouble(aData); - } - } - } - - public void serialize(ByteBuffer buffer, float[] data) { - if (data == null) { - buffer.putInt(-1); - } else { - buffer.putInt(data.length); - for (float aData : data) { - buffer.putFloat(aData); - } - } - } - - public void serialize(ByteBuffer buffer, boolean value) { - buffer.put((byte) (value ? 1 : 0)); - } - - public void serialize(ByteBuffer buffer, double value) { - buffer.putDouble(value); - } - - public void serialize(ByteBuffer buffer, char value) { - buffer.putChar(value); - } - - public void serialize(ByteBuffer buffer, long value) { - buffer.putLong(value); - } - - public void serialize(ByteBuffer buffer, int value) { - buffer.putInt(value); - } - - public void serialize(ByteBuffer buffer, Event event) { - final byte type = HiddenAccess.getSerializationType(event); - - serialize(buffer, type, event); - } - - public Object deserializeAny(ByteBuffer buffer) { - final byte type = buffer.get(); - - if (type == TERMINATOR_TYPE) { - return null; - } - return getHelper(type).deserialize(this, buffer); - } - - public String deserializeString(ByteBuffer buffer) { - final int bytes = buffer.getInt(); - - if (bytes == -1) { - return null; - } - final ByteBuffer slice = buffer.slice(); - - slice.limit(bytes); - final String res; - - try { - res = decoder.decode(slice).toString(); - } catch (CharacterCodingException e) { - throw new Error("Bad character", e); - } - buffer.position(buffer.position() + bytes); - return res; - } - - public byte[] deserializeBytes(ByteBuffer buffer) { - final int len = buffer.getInt(); - - if (len == -1) { - return null; - } - byte[] res = new byte[len]; - - buffer.get(res); - return res; - } - - public int[] deserializeIntegers(ByteBuffer buffer) { - final int len = buffer.getInt(); - - if (len == -1) { - return null; - } - int[] res = new int[len]; - - for (int i = 0; i < len; i++) { - res[i] = buffer.getInt(); - } - return res; - } - - public float[] deserializeFloats(ByteBuffer buffer) { - final int len = buffer.getInt(); - - if (len == -1) { - return null; - } - float[] res = new float[len]; - - for (int i = 0; i < len; i++) { - res[i] = buffer.getFloat(); - } - return res; - } - - public char[] deserializeChars(ByteBuffer buffer) { - final int len = buffer.getInt(); - - if (len == -1) { - return null; - } - char[] res = new char[len]; - - for (int i = 0; i < len; i++) { - res[i] = buffer.getChar(); - } - return res; - } - - public double[] deserializeDoubles(ByteBuffer buffer) { - final int len = buffer.getInt(); - - if (len == -1) { - return null; - } - double[] res = new double[len]; - - for (int i = 0; i < len; i++) { - res[i] = buffer.getDouble(); - } - return res; - } - - public boolean deserializeBoolean(ByteBuffer buffer) { - return buffer.get() != 0; - } - - public char deserializeChar(ByteBuffer buffer) { - return buffer.getChar(); - } - - public int deserializeInt(ByteBuffer buffer) { - return buffer.getInt(); - } - - public Float deserializeFloat(ByteBuffer buffer) { - return buffer.getFloat(); - } - - public double deserializeDouble(ByteBuffer buffer) { - return buffer.getDouble(); - } - - public long deserializeLong(ByteBuffer buffer) { - return buffer.getLong(); - } - - public int sizeOf(String data) { - return (data == null) ? SIZEOF_INT : SIZEOF_INT + encode(data).limit(); - } - - public int sizeOf(byte[] data) { - return (data == null) ? SIZEOF_INT : SIZEOF_INT + data.length; - } - - public int sizeOf(byte type, Object object) { - return getHelper(type).sizeOf(this, object); - } - - public int sizeOf(Event event) { - return sizeOf(HiddenAccess.getSerializationType(event), event); - } - - private ISerializableHelper getHelper(byte type) { - final ISerializableHelper helper = typeToHelper[type]; - - if (helper == null) { - throw new Error("Unknownd or unsupported data type"); - } - return helper; - } - - private ByteBuffer encode(String data) { - final ByteBuffer slice = ByteBuffer.allocate(data.length() * 3); - - encoder.encode(CharBuffer.wrap(data), slice, false); - slice.flip(); - return slice; - } - - private void fillBuffer(InputStream source, ByteBuffer buffer) throws IOException { - int res; - - do { - res = source.read(buffer.array(), buffer.position(), buffer.remaining()); - if (res == -1) { - throw new IOException("Unexpected EOF"); - } - buffer.position(buffer.position() + res); - } while (buffer.remaining() != 0); - } - - public static void register(Class realClass, byte type) { - try { - if (realClass != null) { - Method method = realClass.getDeclaredMethod("createHiddenSerializer"); - - method.setAccessible(true); - ISerializableHelper helper = (ISerializableHelper) method.invoke(null); - - method.setAccessible(false); - typeToHelper[type] = helper; - classToType.put(realClass, type); - } - } catch (NoSuchMethodException e) { - Logger.logError(e); - } catch (InvocationTargetException e) { - Logger.logError(e); - } catch (IllegalAccessException e) { - Logger.logError(e); - } - } - - public static ByteBuffer serializeToBuffer(Object src) throws IOException { - RbSerializer rbs = new RbSerializer(); - final Byte type = classToType.get(src.getClass()); - - return rbs.serialize(type, src); - } - - @SuppressWarnings({ "unchecked"}) - public static T deserializeFromBuffer(ByteBuffer buffer) throws IOException { - RbSerializer rbs = new RbSerializer(); - final Object res = rbs.deserialize(buffer); - - return (T) res; - } - - public static Object deepCopy(byte type, Object src) { - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - RbSerializer rbs = new RbSerializer(); - - try { - rbs.serialize(out, type, src); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - - return rbs.deserialize(in); - } catch (IOException e) { - Logger.logError(e); - return null; - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/StringUtil.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/StringUtil.java deleted file mode 100644 index 4feb2e3..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/StringUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.util; - - -/** - * Class for utilizing strings. - * - * @author Flemming N. Larsen (original) - */ -public final class StringUtil { - - /** - * Returns a string encoded into Basic Latin, where characters that cannot - * be represented in Basic Latin are represented as encoded unicode characters. - * - * @param sequence - * @return - */ - public static String toBasicLatin(CharSequence sequence) { - StringBuilder out = new StringBuilder(); - - for (int i = 0; i < sequence.length(); i++) { - char ch = sequence.charAt(i); - - if (Character.UnicodeBlock.of(ch) == Character.UnicodeBlock.BASIC_LATIN) { - out.append(ch); - } else { - int codepoint = Character.codePointAt(sequence, i); - - // Handle supplementary range chars - i += Character.charCount(codepoint) - 1; - // Emit entity as a unicode character - out.append(String.format("\\u%1$04X", codepoint)); - } - } - return out.toString(); - } - - /** - * Returns the number of occurrences of a specific character. - * - * @param str is the string containing the character to look for. - * @param chr is the character we look for. - * @return the number of occurrences. - */ - public static int countChar(String str, char chr) { - int count = 0; - for (char c : str.toCharArray()) { - if (c == chr) { - count++; - } - } - return count; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/UrlUtil.java b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/UrlUtil.java deleted file mode 100644 index e2c4372..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/util/UrlUtil.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.util; - - -/** - * Utility class used for working on URLs. - * - * @author Flemming N. Larsen (original) - */ -public class UrlUtil { - - /** - * Removes a file extension from a string containing a file name, e.g. the string "filename.ext" would become using - * this method "filename". - * - * @param fileName is a string containing a file name with an extension to remove. - * @return a new string where the file extension has been removed from the file name. - * If no extension is found, the input file name is returned. - */ - public static String removeFileExtension(String fileName) { - if (fileName != null) { - int index = fileName.lastIndexOf('.'); - if (index > 0 && index < (fileName.length() - 1)) { - return fileName.substring(0, index); - } - } - return fileName; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/AdvancedRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/AdvancedRobot.java deleted file mode 100644 index e391ceb..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/AdvancedRobot.java +++ /dev/null @@ -1,2027 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import robocode.robotinterfaces.IAdvancedEvents; -import robocode.robotinterfaces.IAdvancedRobot; -import robocode.robotinterfaces.peer.IAdvancedRobotPeer; - -import java.io.File; -import java.util.Vector; - - -/** - * A more advanced type of robot than Robot that allows non-blocking calls, - * custom events, and writes to the filesystem. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently moving forwards. Negative values means - * that the robot is currently moving backwards. If the returned value is 0, - * the robot currently stands still. - * - * @return the distance remaining in the robot's current move measured in - * pixels. - * @see #getTurnRemaining() getTurnRemaining() - * @see #getTurnRemainingRadians() getTurnRemainingRadians() - * @see #getGunTurnRemaining() getGunTurnRemaining() - * @see #getGunTurnRemainingRadians() getGunTurnRemainingRadians() - * @see #getRadarTurnRemaining() getRadarTurnRemaining() - * @see #getRadarTurnRemainingRadians() getRadarTurnRemainingRadians() - */ - public double getDistanceRemaining() { - if (peer != null) { - return peer.getDistanceRemaining(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the angle remaining in the robots's turn, in degrees. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently turning to the right. Negative values - * means that the robot is currently turning to the left. If the returned - * value is 0, the robot is currently not turning. - * - * @return the angle remaining in the robots's turn, in degrees - * @see #getTurnRemainingRadians() getTurnRemainingRadians() - * @see #getDistanceRemaining() getDistanceRemaining() - * @see #getGunTurnRemaining() getGunTurnRemaining() - * @see #getGunTurnRemainingRadians() getGunTurnRemainingRadians() - * @see #getRadarTurnRemaining() getRadarTurnRemaining() - * @see #getRadarTurnRemainingRadians() getRadarTurnRemainingRadians() - */ - public double getTurnRemaining() { - if (peer != null) { - return Math.toDegrees(peer.getBodyTurnRemaining()); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the angle remaining in the gun's turn, in degrees. - *

- * This call returns both positive and negative values. Positive values - * means that the gun is currently turning to the right. Negative values - * means that the gun is currently turning to the left. If the returned - * value is 0, the gun is currently not turning. - * - * @return the angle remaining in the gun's turn, in degrees - * @see #getGunTurnRemainingRadians() getGunTurnRemainingRadians() - * @see #getDistanceRemaining() getDistanceRemaining() - * @see #getTurnRemaining() getTurnRemaining() - * @see #getTurnRemainingRadians() getTurnRemainingRadians() - * @see #getRadarTurnRemaining() getRadarTurnRemaining() - * @see #getRadarTurnRemainingRadians() getRadarTurnRemainingRadians() - */ - public double getGunTurnRemaining() { - if (peer != null) { - return Math.toDegrees(peer.getGunTurnRemaining()); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the angle remaining in the radar's turn, in degrees. - *

- * This call returns both positive and negative values. Positive values - * means that the radar is currently turning to the right. Negative values - * means that the radar is currently turning to the left. If the returned - * value is 0, the radar is currently not turning. - * - * @return the angle remaining in the radar's turn, in degrees - * @see #getRadarTurnRemainingRadians() getRadarTurnRemainingRadians() - * @see #getDistanceRemaining() getDistanceRemaining() - * @see #getGunTurnRemaining() getGunTurnRemaining() - * @see #getGunTurnRemainingRadians() getGunTurnRemainingRadians() - * @see #getRadarTurnRemaining() getRadarTurnRemaining() - * @see #getRadarTurnRemainingRadians() getRadarTurnRemainingRadians() - */ - public double getRadarTurnRemaining() { - if (peer != null) { - return Math.toDegrees(peer.getRadarTurnRemaining()); - } - uninitializedException(); - return 0; // never called - } - - /** - * Sets the robot to move ahead (forward) by distance measured in pixels - * when the next execution takes place. - *

- * This call returns immediately, and will not execute until you call - * {@link #execute()} or take an action that executes. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot is set to move ahead, and negative - * values means that the robot is set to move back. If 0 is given as input, - * the robot will stop its movement, but will have to decelerate - * till it stands still, and will thus not be able to stop its movement - * immediately, but eventually. - *

- * Example: - *

-	 *   // Set the robot to move 50 pixels ahead
-	 *   setAhead(50);
-	 *
-	 *   // Set the robot to move 100 pixels back
-	 *   // (overrides the previous order)
-	 *   setAhead(-100);
-	 *
-	 *   ...
-	 *   // Executes the last setAhead()
-	 *   execute();
-	 * 
- * - * @param distance the distance to move measured in pixels. - * If {@code distance} > 0 the robot is set to move ahead. - * If {@code distance} < 0 the robot is set to move back. - * If {@code distance} = 0 the robot is set to stop its movement. - * @see #ahead(double) ahead(double) - * @see #back(double) back(double) - * @see #setBack(double) - */ - public void setAhead(double distance) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setMove(distance); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot to move back by distance measured in pixels when the next - * execution takes place. - *

- * This call returns immediately, and will not execute until you call - * {@link #execute()} or take an action that executes. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot is set to move back, and negative - * values means that the robot is set to move ahead. If 0 is given as input, - * the robot will stop its movement, but will have to decelerate - * till it stands still, and will thus not be able to stop its movement - * immediately, but eventually. - *

- * Example: - *

-	 *   // Set the robot to move 50 pixels back
-	 *   setBack(50);
-	 *
-	 *   // Set the robot to move 100 pixels ahead
-	 *   // (overrides the previous order)
-	 *   setBack(-100);
-	 *
-	 *   ...
-	 *   // Executes the last setBack()
-	 *   execute();
-	 * 
- * - * @param distance the distance to move measured in pixels. - * If {@code distance} > 0 the robot is set to move back. - * If {@code distance} < 0 the robot is set to move ahead. - * If {@code distance} = 0 the robot is set to stop its movement. - * @see #back(double) back(double) - * @see #ahead(double) ahead(double) - * @see #setAhead(double) - */ - public void setBack(double distance) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setMove(-distance); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot's body to turn left by degrees when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Set the robot to turn 180 degrees to the left
-	 *   setTurnLeft(180);
-	 *
-	 *   // Set the robot to turn 90 degrees to the right instead of left
-	 *   // (overrides the previous order)
-	 *   setTurnLeft(-90);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnLeft()
-	 *   execute();
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's body to the left. - * If {@code degrees} > 0 the robot is set to turn left. - * If {@code degrees} < 0 the robot is set to turn right. - * If {@code degrees} = 0 the robot is set to stop turning. - * @see #setTurnLeftRadians(double) setTurnLeftRadians(double) - * @see #turnLeft(double) turnLeft(double) - * @see #turnLeftRadians(double) turnLeftRadians(double) - * @see #turnRight(double) turnRight(double) - * @see #turnRightRadians(double) turnRightRadians(double) - * @see #setTurnRight(double) setTurnRight(double) - * @see #setTurnRightRadians(double) setTurnRightRadians(double) - */ - public void setTurnLeft(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnBody(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot's body to turn right by degrees when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Set the robot to turn 180 degrees to the right
-	 *   setTurnRight(180);
-	 *
-	 *   // Set the robot to turn 90 degrees to the left instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnRight(-90);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRight()
-	 *   execute();
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's body to the right. - * If {@code degrees} > 0 the robot is set to turn right. - * If {@code degrees} < 0 the robot is set to turn left. - * If {@code degrees} = 0 the robot is set to stop turning. - * @see #setTurnRightRadians(double) setTurnRightRadians(double) - * @see #turnRight(double) turnRight(double) - * @see #turnRightRadians(double) turnRightRadians(double) - * @see #turnLeft(double) turnLeft(double) - * @see #turnLeftRadians(double) turnLeftRadians(double) - * @see #setTurnLeft(double) setTurnLeft(double) - * @see #setTurnLeftRadians(double) setTurnLeftRadians(double) - */ - public void setTurnRight(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnBody(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Sets the gun to fire a bullet when the next execution takes place. - * The bullet will travel in the direction the gun is pointing. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * The specified bullet power is an amount of energy that will be taken from - * the robot's energy. Hence, the more power you want to spend on the - * bullet, the more energy is taken from your robot. - *

- * The bullet will do (4 * power) damage if it hits another robot. If power - * is greater than 1, it will do an additional 2 * (power - 1) damage. - * You will get (3 * power) back if you hit the other robot. You can call - * Rules#getBulletDamage(double)} for getting the damage that a - * bullet with a specific bullet power will do. - *

- * The specified bullet power should be between - * {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}. - *

- * Note that the gun cannot fire if the gun is overheated, meaning that - * {@link #getGunHeat()} returns a value > 0. - *

- * An event is generated when the bullet hits a robot, wall, or another - * bullet. - *

- * Example: - *

-	 *   // Fire a bullet with maximum power if the gun is ready
-	 *   if (getGunHeat() == 0) {
-	 *       setFire(Rules.MAX_BULLET_POWER);
-	 *   }
-	 *   ...
-	 *   execute();
-	 * 
- * - * @param power the amount of energy given to the bullet, and subtracted - * from the robot's energy. - * @see #setFireBullet(double) - * @see #fire(double) fire(double) - * @see #fireBullet(double) fireBullet(double) - * @see #getGunHeat() getGunHeat() - * @see #getGunCoolingRate() getGunCoolingRate() - * @see #onBulletHit(BulletHitEvent) onBulletHit(BulletHitEvent) - * @see #onBulletHitBullet(BulletHitBulletEvent) onBulletHitBullet(BulletHitBulletEvent) - * @see #onBulletMissed(BulletMissedEvent) onBulletMissed(BulletMissedEvent) - */ - public void setFire(double power) { - if (peer != null) { - peer.setFire(power); - } else { - uninitializedException(); - } - } - - /** - * Sets the gun to fire a bullet when the next execution takes place. - * The bullet will travel in the direction the gun is pointing. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * The specified bullet power is an amount of energy that will be taken from - * the robot's energy. Hence, the more power you want to spend on the - * bullet, the more energy is taken from your robot. - *

- * The bullet will do (4 * power) damage if it hits another robot. If power - * is greater than 1, it will do an additional 2 * (power - 1) damage. - * You will get (3 * power) back if you hit the other robot. You can call - * {@link Rules#getBulletDamage(double)} for getting the damage that a - * bullet with a specific bullet power will do. - *

- * The specified bullet power should be between - * {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}. - *

- * Note that the gun cannot fire if the gun is overheated, meaning that - * {@link #getGunHeat()} returns a value > 0. - *

- * A event is generated when the bullet hits a robot - * ({@link BulletHitEvent}), wall ({@link BulletMissedEvent}), or another - * bullet ({@link BulletHitBulletEvent}). - *

- * Example: - *

-	 *   Bullet bullet = null;
-	 * 

- * // Fire a bullet with maximum power if the gun is ready - * if (getGunHeat() == 0) { - * bullet = setFireBullet(Rules.MAX_BULLET_POWER); - * } - * ... - * execute(); - * ... - * // Get the velocity of the bullet - * if (bullet != null) { - * double bulletVelocity = bullet.getVelocity(); - * } - *

- * - * @param power the amount of energy given to the bullet, and subtracted - * from the robot's energy. - * @return a {@link Bullet} that contains information about the bullet if it - * was actually fired, which can be used for tracking the bullet after it - * has been fired. If the bullet was not fired, {@code null} is returned. - * @see #setFire(double) - * @see Bullet - * @see #fire(double) fire(double) - * @see #fireBullet(double) fireBullet(double) - * @see #getGunHeat() getGunHeat() - * @see #getGunCoolingRate() getGunCoolingRate() - * @see #onBulletHit(BulletHitEvent) onBulletHit(BulletHitEvent) - * @see #onBulletHitBullet(BulletHitBulletEvent) onBulletHitBullet(BulletHitBulletEvent) - * @see #onBulletMissed(BulletMissedEvent) onBulletMissed(BulletMissedEvent) - */ - public Bullet setFireBullet(double power) { - if (peer != null) { - return peer.setFire(power); - } - uninitializedException(); - return null; - } - - /** - * Registers a custom event to be called when a condition is met. - * When you are finished with your condition or just want to remove it you - * must call {@link #removeCustomEvent(Condition)}. - *

- * Example: - *

-	 *   // Create the condition for our custom event
-	 *   Condition triggerHitCondition = new Condition("triggerhit") {
-	 *       public boolean test() {
-	 *           return (getEnergy() <= trigger);
-	 *       }
-	 *   }
-	 *
-	 *   // Add our custom event based on our condition
-	 *   addCustomEvent(triggerHitCondition);
-	 * 
- * - * @param condition the condition that must be met. - * @throws NullPointerException if the condition parameter has been set to - * {@code null}. - * @see Condition - * @see #removeCustomEvent(Condition) - */ - public void addCustomEvent(Condition condition) { - if (condition == null) { - throw new NullPointerException("the condition cannot be null"); - } - if (peer != null) { - ((IAdvancedRobotPeer) peer).addCustomEvent(condition); - } else { - uninitializedException(); - } - } - - /** - * Removes a custom event that was previously added by calling - * {@link #addCustomEvent(Condition)}. - *

- * Example: - *

-	 *   // Create the condition for our custom event
-	 *   Condition triggerHitCondition = new Condition("triggerhit") {
-	 *       public boolean test() {
-	 *           return (getEnergy() <= trigger);
-	 *       }
-	 *   }
-	 *
-	 *   // Add our custom event based on our condition
-	 *   addCustomEvent(triggerHitCondition);
-	 *   ...
-	 *   do something with your robot
-	 *   ...
-	 *   // Remove the custom event based on our condition
-	 *   removeCustomEvent(triggerHitCondition);
-	 * 
- * - * @param condition the condition that was previous added and that must be - * removed now. - * @throws NullPointerException if the condition parameter has been set to - * {@code null}. - * @see Condition - * @see #addCustomEvent(Condition) - */ - public void removeCustomEvent(Condition condition) { - if (condition == null) { - throw new NullPointerException("the condition cannot be null"); - } - if (peer != null) { - ((IAdvancedRobotPeer) peer).removeCustomEvent(condition); - } else { - uninitializedException(); - } - } - - /** - * Clears out any pending events in the robot's event queue immediately. - * - * @see #getAllEvents() - */ - public void clearAllEvents() { - if (peer != null) { - ((IAdvancedRobotPeer) peer).clearAllEvents(); - } else { - uninitializedException(); - } - } - - /** - * Executes any pending actions, or continues executing actions that are - * in process. This call returns after the actions have been started. - *

- * Note that advanced robots must call this function in order to - * execute pending set* calls like e.g. {@link #setAhead(double)}, - * {@link #setFire(double)}, {@link #setTurnLeft(double)} etc. Otherwise, - * these calls will never get executed. - *

- * In this example the robot will move while turning: - *

-	 *   setTurnRight(90);
-	 *   setAhead(100);
-	 *   execute();
-	 *
-	 *   while (getDistanceRemaining() > 0 && getTurnRemaining() > 0) {
-	 *       execute();
-	 *   }
-	 * 
- */ - public void execute() { - if (peer != null) { - peer.execute(); - } else { - uninitializedException(); - } - } - - /** - * Returns a vector containing all events currently in the robot's queue. - * You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (Event event : getAllEvents()) {
-	 *       if (event instanceof HitRobotEvent) {
-	 *           // do something with the event
-	 *       } else if (event instanceof HitByBulletEvent) {
-	 *           // do something with the event
-	 *       }
-	 *   }
-	 * 
- * - * @return a vector containing all events currently in the robot's queue - * @see Event - * @see #clearAllEvents() - * @see #getStatusEvents() - * @see #getScannedRobotEvents() - * @see #getBulletHitEvents() - * @see #getBulletMissedEvents() - * @see #getBulletHitBulletEvents() - * @see #getRobotDeathEvents() - */ - public Vector getAllEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getAllEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all BulletHitBulletEvents currently in the - * robot's queue. You might, for example, call this while processing another - * event. - *

- * Example: - *

-	 *   for (BulletHitBulletEvent event : getBulletHitBulletEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all BulletHitBulletEvents currently in the - * robot's queue - * @see #onBulletHitBullet(BulletHitBulletEvent) onBulletHitBullet(BulletHitBulletEvent) - * @see BulletHitBulletEvent - * @see #getAllEvents() - */ - public Vector getBulletHitBulletEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getBulletHitBulletEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all BulletHitEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (BulletHitEvent event: getBulletHitEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all BulletHitEvents currently in the robot's - * queue - * @see #onBulletHit(BulletHitEvent) onBulletHit(BulletHitEvent) - * @see BulletHitEvent - * @see #getAllEvents() - */ - public Vector getBulletHitEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getBulletHitEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all BulletMissedEvents currently in the - * robot's queue. You might, for example, call this while processing another - * event. - *

- * Example: - *

-	 *   for (BulletMissedEvent event : getBulletMissedEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all BulletMissedEvents currently in the - * robot's queue - * @see #onBulletMissed(BulletMissedEvent) onBulletMissed(BulletMissedEvent) - * @see BulletMissedEvent - * @see #getAllEvents() - */ - public Vector getBulletMissedEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getBulletMissedEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a file representing a data directory for the robot, which can be - * written to using {@link RobocodeFileOutputStream} or - * {@link RobocodeFileWriter}. - *

- * The system will automatically create the directory for you, so you do not - * need to create it by yourself. - * - * @return a file representing the data directory for your robot - * @see #getDataFile(String) - * @see RobocodeFileOutputStream - * @see RobocodeFileWriter - */ - public File getDataDirectory() { - if (peer != null) { - return ((IAdvancedRobotPeer) peer).getDataDirectory(); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a file in your data directory that you can write to using - * {@link RobocodeFileOutputStream} or {@link RobocodeFileWriter}. - *

- * The system will automatically create the directory for you, so you do not - * need to create it by yourself. - *

- * Please notice that the max. size of your data file is set to 200000 - * (~195 KB). - *

- * See the {@code sample.SittingDuck} to see an example of how to use this - * method. - * - * @param filename the file name of the data file for your robot - * @return a file representing the data file for your robot or null if the data - * file could not be created due to an error. - * @see #getDataDirectory() - * @see RobocodeFileOutputStream - * @see RobocodeFileWriter - */ - public File getDataFile(String filename) { - if (peer != null) { - return ((IAdvancedRobotPeer) peer).getDataFile(filename); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns the data quota available in your data directory, i.e. the amount - * of bytes left in the data directory for the robot. - * - * @return the amount of bytes left in the robot's data directory - * @see #getDataDirectory() - * @see #getDataFile(String) - */ - public long getDataQuotaAvailable() { - if (peer != null) { - return ((IAdvancedRobotPeer) peer).getDataQuotaAvailable(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the current priority of a class of events. - * An event priority is a value from 0 - 99. The higher value, the higher - * priority. - *

- * Example: - *

-	 *   int myHitRobotPriority = getEventPriority("HitRobotEvent");
-	 * 
- *

- * The default priorities are, from highest to lowest: - *

-	 *   {@link RoundEndedEvent}:      100 (reserved)
-	 *   {@link BattleEndedEvent}:     100 (reserved)
-	 *   {@link WinEvent}:             100 (reserved)
-	 *   {@link SkippedTurnEvent}:     100 (reserved)
-	 *   {@link StatusEvent}:           99
-	 *   Key and mouse events:  98
-	 *   {@link CustomEvent}:           80 (default value)
-	 *   {@link MessageEvent}:          75
-	 *   {@link RobotDeathEvent}:       70
-	 *   {@link BulletMissedEvent}:     60
-	 *   {@link BulletHitBulletEvent}:  55
-	 *   {@link BulletHitEvent}:        50
-	 *   {@link HitByBulletEvent}:      40
-	 *   {@link HitWallEvent}:          30
-	 *   {@link HitRobotEvent}:         20
-	 *   {@link ScannedRobotEvent}:     10
-	 *   {@link PaintEvent}:             5
-	 *   {@link DeathEvent}:            -1 (reserved)
-	 * 
- * - * @param eventClass the name of the event class (string) - * @return the current priority of a class of events - * @see #setEventPriority(String, int) - */ - public int getEventPriority(String eventClass) { - if (peer != null) { - return ((IAdvancedRobotPeer) peer).getEventPriority(eventClass); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns a vector containing all HitByBulletEvents currently in the - * robot's queue. You might, for example, call this while processing - * another event. - *

- * Example: - *

-	 *   for (HitByBulletEvent event : getHitByBulletEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all HitByBulletEvents currently in the - * robot's queue - * @see #onHitByBullet(HitByBulletEvent) onHitByBullet(HitByBulletEvent) - * @see HitByBulletEvent - * @see #getAllEvents() - */ - public Vector getHitByBulletEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getHitByBulletEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all HitRobotEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (HitRobotEvent event : getHitRobotEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all HitRobotEvents currently in the robot's - * queue - * @see #onHitRobot(HitRobotEvent) onHitRobot(HitRobotEvent) - * @see HitRobotEvent - * @see #getAllEvents() - */ - public Vector getHitRobotEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getHitRobotEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all HitWallEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (HitWallEvent event : getHitWallEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all HitWallEvents currently in the robot's - * queue - * @see #onHitWall(HitWallEvent) onHitWall(HitWallEvent) - * @see HitWallEvent - * @see #getAllEvents() - */ - public Vector getHitWallEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getHitWallEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all RobotDeathEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (RobotDeathEvent event : getRobotDeathEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all RobotDeathEvents currently in the robot's - * queue - * @see #onRobotDeath(RobotDeathEvent) onRobotDeath(RobotDeathEvent) - * @see RobotDeathEvent - * @see #getAllEvents() - */ - public Vector getRobotDeathEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getRobotDeathEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all ScannedRobotEvents currently in the - * robot's queue. You might, for example, call this while processing another - * event. - *

- * Example: - *

-	 *   for (ScannedRobotEvent event : getScannedRobotEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all ScannedRobotEvents currently in the - * robot's queue - * @see #onScannedRobot(ScannedRobotEvent) onScannedRobot(ScannedRobotEvent) - * @see ScannedRobotEvent - * @see #getAllEvents() - */ - public Vector getScannedRobotEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getScannedRobotEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns a vector containing all StatusEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (StatusEvent event : getStatusEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all StatusEvents currently in the robot's queue - * @see #onStatus(StatusEvent) onStatus(StatusEvent) - * @see StatusEvent - * @see #getAllEvents() - * @since 1.6.1 - */ - public Vector getStatusEvents() { - if (peer != null) { - return new Vector(((IAdvancedRobotPeer) peer).getStatusEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Checks if the gun is set to adjust for the robot turning, i.e. to turn - * independent from the robot's body turn. - *

- * This call returns {@code true} if the gun is set to turn independent of - * the turn of the robot's body. Otherwise, {@code false} is returned, - * meaning that the gun is set to turn with the robot's body turn. - * - * @return {@code true} if the gun is set to turn independent of the robot - * turning; {@code false} if the gun is set to turn with the robot - * turning - * @see #setAdjustGunForRobotTurn(boolean) setAdjustGunForRobotTurn(boolean) - * @see #isAdjustRadarForRobotTurn() - * @see #isAdjustRadarForGunTurn() - */ - public boolean isAdjustGunForRobotTurn() { - if (peer != null) { - return ((IAdvancedRobotPeer) peer).isAdjustGunForBodyTurn(); - } - uninitializedException(); - return false; // never called - } - - /** - * Checks if the radar is set to adjust for the robot turning, i.e. to turn - * independent from the robot's body turn. - *

- * This call returns {@code true} if the radar is set to turn independent of - * the turn of the robot. Otherwise, {@code false} is returned, meaning that - * the radar is set to turn with the robot's turn. - * - * @return {@code true} if the radar is set to turn independent of the robot - * turning; {@code false} if the radar is set to turn with the robot - * turning - * @see #setAdjustRadarForRobotTurn(boolean) setAdjustRadarForRobotTurn(boolean) - * @see #isAdjustGunForRobotTurn() - * @see #isAdjustRadarForGunTurn() - */ - public boolean isAdjustRadarForRobotTurn() { - if (peer != null) { - return ((IAdvancedRobotPeer) peer).isAdjustRadarForBodyTurn(); - } - uninitializedException(); - return false; // never called - } - - /** - * Checks if the radar is set to adjust for the gun turning, i.e. to turn - * independent from the gun's turn. - *

- * This call returns {@code true} if the radar is set to turn independent of - * the turn of the gun. Otherwise, {@code false} is returned, meaning that - * the radar is set to turn with the gun's turn. - * - * @return {@code true} if the radar is set to turn independent of the gun - * turning; {@code false} if the radar is set to turn with the gun - * turning - * @see #setAdjustRadarForGunTurn(boolean) setAdjustRadarForGunTurn(boolean) - * @see #isAdjustGunForRobotTurn() - * @see #isAdjustRadarForRobotTurn() - */ - public boolean isAdjustRadarForGunTurn() { - if (peer != null) { - return ((IAdvancedRobotPeer) peer).isAdjustRadarForGunTurn(); - } - uninitializedException(); - return false; // never called - } - - /** - * {@inheritDoc} - */ - public void onCustomEvent(CustomEvent event) {} - - /** - * Sets the priority of a class of events. - *

- * Events are sent to the onXXX handlers in order of priority. - * Higher priority events can interrupt lower priority events. - * For events with the same priority, newer events are always sent first. - * Valid priorities are 0 - 99, where 100 is reserved and 80 is the default - * priority. - *

- * Example: - *

-	 *   setEventPriority("RobotDeathEvent", 15);
-	 * 
- *

- * The default priorities are, from highest to lowest: - *

-	 * 	 {@link WinEvent}:             100 (reserved)
-	 * 	 {@link SkippedTurnEvent}:     100 (reserved)
-	 *   {@link StatusEvent}:           99
-	 * 	 {@link CustomEvent}:           80
-	 * 	 {@link MessageEvent}:          75
-	 * 	 {@link RobotDeathEvent}:       70
-	 * 	 {@link BulletMissedEvent}:     60
-	 * 	 {@link BulletHitBulletEvent}:  55
-	 * 	 {@link BulletHitEvent}:        50
-	 * 	 {@link HitByBulletEvent}:      40
-	 * 	 {@link HitWallEvent}:          30
-	 * 	 {@link HitRobotEvent}:         20
-	 * 	 {@link ScannedRobotEvent}:     10
-	 *   {@link PaintEvent}:             5
-	 * 	 {@link DeathEvent}:            -1 (reserved)
-	 * 
- *

- * Note that you cannot change the priority for events with the special - * priority value -1 or 100 (reserved) as these event are system events. - * Also note that you cannot change the priority of CustomEvent. - * Instead you must change the priority of the condition(s) for your custom - * event(s). - * - * @param eventClass the name of the event class (string) to set the - * priority for - * @param priority the new priority for that event class - * @see #getEventPriority(String) - * @see #setInterruptible(boolean) - * @since 1.5, the priority of DeathEvent was changed from 100 to -1 in - * order to let robots process pending events on its event queue before - * it dies. When the robot dies, it will not be able to process events. - */ - public void setEventPriority(String eventClass, int priority) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setEventPriority(eventClass, priority); - } else { - uninitializedException(); - } - } - - /** - * Call this during an event handler to allow new events of the same - * priority to restart the event handler. - *

- *

Example: - *

-	 *   public void onScannedRobot(ScannedRobotEvent e) {
-	 *       fire(1);
-	 *       setInterruptible(true);
-	 *       ahead(100); // If you see a robot while moving ahead,
-	 *                   // this handler will start from the top
-	 *                   // Without setInterruptible(true), we wouldn't
-	 *                   // receive scan events at all!
-	 *       // We'll only get here if we don't see a robot during the move.
-	 *       out.println("Ok, I can't see anyone");
-	 *   }
-	 * 
- * - * @param interruptible {@code true} if the event handler should be - * interrupted if new events of the same priority occurs; {@code false} - * otherwise - * @see #setEventPriority(String, int) - * @see Robot#onScannedRobot(ScannedRobotEvent) onScannedRobot(ScannedRobotEvent) - */ - @Override - public void setInterruptible(boolean interruptible) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setInterruptible(interruptible); - } else { - uninitializedException(); - } - } - - /** - * Sets the maximum turn rate of the robot measured in degrees if the robot - * should turn slower than {@link Rules#MAX_TURN_RATE} (10 degress/turn). - * - * @param newMaxTurnRate the new maximum turn rate of the robot measured in - * degrees. Valid values are 0 - {@link Rules#MAX_TURN_RATE} - * @see #turnRight(double) turnRight(double) - * @see #turnLeft(double) turnLeft(double) - * @see #setTurnRight(double) - * @see #setTurnLeft(double) - * @see #setMaxVelocity(double) - */ - public void setMaxTurnRate(double newMaxTurnRate) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setMaxTurnRate(Math.toRadians(newMaxTurnRate)); - } else { - uninitializedException(); - } - } - - /** - * Sets the maximum velocity of the robot measured in pixels/turn if the - * robot should move slower than {@link Rules#MAX_VELOCITY} (8 pixels/turn). - * - * @param newMaxVelocity the new maximum turn rate of the robot measured in - * pixels/turn. Valid values are 0 - {@link Rules#MAX_VELOCITY} - * @see #ahead(double) - * @see #setAhead(double) - * @see #back(double) - * @see #setBack(double) - * @see #setMaxTurnRate(double) - */ - public void setMaxVelocity(double newMaxVelocity) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setMaxVelocity(newMaxVelocity); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot to resume the movement stopped by {@link #stop() stop()} - * or {@link #setStop()}, if any. - *

- * This call returns immediately, and will not execute until you call - * {@link #execute()} or take an action that executes. - * - * @see #resume() resume() - * @see #stop() stop() - * @see #stop(boolean) stop(boolean) - * @see #setStop() - * @see #setStop(boolean) - * @see #execute() - */ - public void setResume() { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setResume(); - } else { - uninitializedException(); - } - } - - /** - * This call is identical to {@link #stop() stop()}, but returns immediately, and - * will not execute until you call {@link #execute()} or take an action that - * executes. - *

- * If there is already movement saved from a previous stop, this will have - * no effect. - *

- * This call is equivalent to calling {@code setStop(false)}; - * - * @see #stop() stop() - * @see #stop(boolean) stop(boolean) - * @see #resume() resume() - * @see #setResume() - * @see #setStop(boolean) - * @see #execute() - */ - public void setStop() { - setStop(false); - } - - /** - * This call is identical to {@link #stop(boolean) stop(boolean)}, but - * returns immediately, and will not execute until you call - * {@link #execute()} or take an action that executes. - *

- * If there is already movement saved from a previous stop, you can - * overwrite it by calling {@code setStop(true)}. - * - * @param overwrite {@code true} if the movement saved from a previous stop - * should be overwritten; {@code false} otherwise. - * @see #stop() stop() - * @see #stop(boolean) stop(boolean) - * @see #resume() resume() - * @see #setResume() - * @see #setStop() - * @see #execute() - */ - public void setStop(boolean overwrite) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setStop(overwrite); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot's gun to turn left by degrees when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Set the gun to turn 180 degrees to the left
-	 *   setTurnGunLeft(180);
-	 *
-	 *   // Set the gun to turn 90 degrees to the right instead of left
-	 *   // (overrides the previous order)
-	 *   setTurnGunLeft(-90);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnGunLeft()
-	 *   execute();
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's gun to the left. - * If {@code degrees} > 0 the robot's gun is set to turn left. - * If {@code degrees} < 0 the robot's gun is set to turn right. - * If {@code degrees} = 0 the robot's gun is set to stop turning. - * @see #setTurnGunLeftRadians(double) setTurnGunLeftRadians(double) - * @see #turnGunLeft(double) turnGunLeft(double) - * @see #turnGunLeftRadians(double) turnGunLeftRadians(double) - * @see #turnGunRight(double) turnGunRight(double) - * @see #turnGunRightRadians(double) turnGunRightRadians(double) - * @see #setTurnGunRight(double) setTurnGunRight(double) - * @see #setTurnGunRightRadians(double) setTurnGunRightRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) setAdjustGunForRobotTurn(boolean) - */ - public void setTurnGunLeft(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnGun(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot's gun to turn right by degrees when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Set the gun to turn 180 degrees to the right
-	 *   setTurnGunRight(180);
-	 *
-	 *   // Set the gun to turn 90 degrees to the left instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnGunRight(-90);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnGunRight()
-	 *   execute();
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's gun to the right. - * If {@code degrees} > 0 the robot's gun is set to turn right. - * If {@code degrees} < 0 the robot's gun is set to turn left. - * If {@code degrees} = 0 the robot's gun is set to stop turning. - * @see #setTurnGunRightRadians(double) setTurnGunRightRadians(double) - * @see #turnGunRight(double) turnGunRight(double) - * @see #turnGunRightRadians(double) turnGunRightRadians(double) - * @see #turnGunLeft(double) turnGunLeft(double) - * @see #turnGunLeftRadians(double) turnGunLeftRadians(double) - * @see #setTurnGunLeft(double) setTurnGunLeft(double) - * @see #setTurnGunLeftRadians(double) setTurnGunLeftRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) setAdjustGunForRobotTurn(boolean) - */ - public void setTurnGunRight(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnGun(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot's radar to turn left by degrees when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Set the radar to turn 180 degrees to the left
-	 *   setTurnRadarLeft(180);
-	 *
-	 *   // Set the radar to turn 90 degrees to the right instead of left
-	 *   // (overrides the previous order)
-	 *   setTurnRadarLeft(-90);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRadarLeft()
-	 *   execute();
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's radar to the left. - * If {@code degrees} > 0 the robot's radar is set to turn left. - * If {@code degrees} < 0 the robot's radar is set to turn right. - * If {@code degrees} = 0 the robot's radar is set to stop turning. - * @see #setTurnRadarLeftRadians(double) setTurnRadarLeftRadians(double) - * @see #turnRadarLeft(double) turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) turnRadarLeftRadians(double) - * @see #turnRadarRight(double) turnRadarRight(double) - * @see #turnRadarRightRadians(double) turnRadarRightRadians(double) - * @see #setTurnRadarRight(double) setTurnRadarRight(double) - * @see #setTurnRadarRightRadians(double) setTurnRadarRightRadians(double) - * @see #setAdjustRadarForRobotTurn(boolean) setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) setAdjustRadarForGunTurn(boolean) - */ - public void setTurnRadarLeft(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnRadar(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Sets the robot's radar to turn right by degrees when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Set the radar to turn 180 degrees to the right
-	 *   setTurnRadarRight(180);
-	 *
-	 *   // Set the radar to turn 90 degrees to the right instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnRadarRight(-90);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRadarRight()
-	 *   execute();
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's radar to the right. - * If {@code degrees} > 0 the robot's radar is set to turn right. - * If {@code degrees} < 0 the robot's radar is set to turn left. - * If {@code degrees} = 0 the robot's radar is set to stop turning. - * @see #setTurnRadarRightRadians(double) setTurnRadarRightRadians(double) - * @see #turnRadarRight(double) turnRadarRight(double) - * @see #turnRadarRightRadians(double) turnRadarRightRadians(double) - * @see #turnRadarLeft(double) turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) turnRadarLeftRadians(double) - * @see #setTurnRadarLeft(double) setTurnRadarLeft(double) - * @see #setTurnRadarLeftRadians(double) setTurnRadarLeftRadians(double) - * @see #setAdjustRadarForRobotTurn(boolean) setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) setAdjustRadarForGunTurn(boolean) - */ - public void setTurnRadarRight(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnRadar(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Does not return until a condition is met, i.e. when a - * {@link Condition#test()} returns {@code true}. - *

- * This call executes immediately. - *

- * See the {@code sample.Crazy} robot for how this method can be used. - * - * @param condition the condition that must be met before this call returns - * @see Condition - * @see Condition#test() - */ - public void waitFor(Condition condition) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).waitFor(condition); - } else { - uninitializedException(); - } - } - - /** - * This method is called if your robot dies. - *

- * You should override it in your robot if you want to be informed of this - * event. Actions will have no effect if called from this section. The - * intent is to allow you to perform calculations or print something out - * when the robot is killed. - * - * @param event the death event set by the game - * @see DeathEvent - * @see Event - */ - @Override - public void onDeath(DeathEvent event) {} - - /** - * {@inheritDoc} - */ - public void onSkippedTurn(SkippedTurnEvent event) {} - - /** - * Returns the direction that the robot's body is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's body is facing, in radians. - * @see #getHeadingDegrees() - * @see #getGunHeadingRadians() - * @see #getRadarHeadingRadians() - */ - public double getHeadingRadians() { - return super.getHeadingRadians(); - } - - /** - * Sets the robot's body to turn left by radians when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Set the robot to turn 180 degrees to the left
-	 *   setTurnLeftRadians(Math.PI);
-	 *
-	 *   // Set the robot to turn 90 degrees to the right instead of left
-	 *   // (overrides the previous order)
-	 *   setTurnLeftRadians(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnLeftRadians()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's body to the left. - * If {@code radians} > 0 the robot is set to turn left. - * If {@code radians} < 0 the robot is set to turn right. - * If {@code radians} = 0 the robot is set to stop turning. - * @see AdvancedRobot#setTurnLeft(double) setTurnLeft(double) - * @see #turnLeft(double) - * @see #turnLeftRadians(double) - * @see #turnRight(double) - * @see #turnRightRadians(double) - * @see AdvancedRobot#setTurnRight(double) setTurnRight(double) - * @see AdvancedRobot#setTurnRightRadians(double) setTurnRightRadians(double) - */ - public void setTurnLeftRadians(double radians) { - super.setTurnLeftRadians(radians); - } - - /** - * Sets the robot's body to turn right by radians when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Set the robot to turn 180 degrees to the right
-	 *   setTurnRightRadians(Math.PI);
-	 *
-	 *   // Set the robot to turn 90 degrees to the left instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnRightRadians(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRightRadians()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's body to the right. - * If {@code radians} > 0 the robot is set to turn right. - * If {@code radians} < 0 the robot is set to turn left. - * If {@code radians} = 0 the robot is set to stop turning. - * @see AdvancedRobot#setTurnRight(double) setTurnRight(double) - * @see #turnRight(double) - * @see #turnRightRadians(double) - * @see #turnLeft(double) - * @see #turnLeftRadians(double) - * @see AdvancedRobot#setTurnLeft(double) setTurnLeft(double) - * @see AdvancedRobot#setTurnLeftRadians(double) setTurnLeftRadians(double) - */ - public void setTurnRightRadians(double radians) { - super.setTurnRightRadians(radians); - } - - /** - * Immediately turns the robot's body to the left by radians. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the robot's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Turn the robot 180 degrees to the left
-	 *   turnLeftRadians(Math.PI);
-	 *
-	 *   // Afterwards, turn the robot 90 degrees to the right
-	 *   turnLeftRadians(-Math.PI / 2);
-	 * 
- * - * @param radians the amount of radians to turn the robot's body to the left. - * If {@code radians} > 0 the robot will turn right. - * If {@code radians} < 0 the robot will turn left. - * If {@code radians} = 0 the robot will not turn, but execute. - * @see #turnLeft(double) - * @see #turnRight(double) - * @see #turnRightRadians(double) - * @see #turnGunLeft(double) - * @see #turnGunLeftRadians(double) - * @see #turnGunRight(double) - * @see #turnGunRightRadians(double) - * @see #turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) - * @see #turnRadarRight(double) - * @see #turnRadarRightRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void turnLeftRadians(double radians) { - super.turnLeftRadians(radians); - } - - /** - * Immediately turns the robot's body to the right by radians. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the robot's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Turn the robot 180 degrees to the right
-	 *   turnRightRadians(Math.PI);
-	 *
-	 *   // Afterwards, turn the robot 90 degrees to the left
-	 *   turnRightRadians(-Math.PI / 2);
-	 * 
- * - * @param radians the amount of radians to turn the robot's body to the right. - * If {@code radians} > 0 the robot will turn right. - * If {@code radians} < 0 the robot will turn left. - * If {@code radians} = 0 the robot will not turn, but execute. - * @see #turnRight(double) - * @see #turnLeft(double) - * @see #turnLeftRadians(double) - * @see #turnGunLeft(double) - * @see #turnGunLeftRadians(double) - * @see #turnGunRight(double) - * @see #turnGunRightRadians(double) - * @see #turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) - * @see #turnRadarRight(double) - * @see #turnRadarRightRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void turnRightRadians(double radians) { - super.turnRightRadians(radians); - } - - /** - * Returns the direction that the robot's gun is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's gun is facing, in radians. - * @see #getGunHeadingDegrees() - * @see #getHeadingRadians() - * @see #getRadarHeadingRadians() - */ - public double getGunHeadingRadians() { - return super.getGunHeadingRadians(); - } - - /** - * Returns the direction that the robot's radar is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's radar is facing, in radians. - * @see #getRadarHeadingDegrees() - * @see #getHeadingRadians() - * @see #getGunHeadingRadians() - */ - public double getRadarHeadingRadians() { - return super.getRadarHeadingRadians(); - } - - /** - * Sets the robot's gun to turn left by radians when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Set the gun to turn 180 degrees to the left
-	 *   setTurnGunLeftRadians(Math.PI);
-	 *
-	 *   // Set the gun to turn 90 degrees to the right instead of left
-	 *   // (overrides the previous order)
-	 *   setTurnGunLeftRadians(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnGunLeftRadians()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's gun to the left. - * If {@code radians} > 0 the robot's gun is set to turn left. - * If {@code radians} < 0 the robot's gun is set to turn right. - * If {@code radians} = 0 the robot's gun is set to stop turning. - * @see AdvancedRobot#setTurnGunLeft(double) setTurnGunLeft(double) - * @see #turnGunLeft(double) - * @see #turnGunLeftRadians(double) - * @see #turnGunRight(double) - * @see #turnGunRightRadians(double) - * @see AdvancedRobot#setTurnGunRight(double) setTurnGunRight(double) - * @see AdvancedRobot#setTurnGunRightRadians(double) setTurnGunRightRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void setTurnGunLeftRadians(double radians) { - super.setTurnGunLeftRadians(radians); - } - - /** - * Sets the robot's gun to turn right by radians when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Set the gun to turn 180 degrees to the right
-	 *   setTurnGunRightRadians(Math.PI);
-	 *
-	 *   // Set the gun to turn 90 degrees to the left instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnGunRightRadians(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnGunRightRadians()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's gun to the right. - * If {@code radians} > 0 the robot's gun is set to turn left. - * If {@code radians} < 0 the robot's gun is set to turn right. - * If {@code radians} = 0 the robot's gun is set to stop turning. - * @see AdvancedRobot#setTurnGunRight(double) setTurnGunRight(double) - * @see #turnGunRight(double) - * @see #turnGunRightRadians(double) - * @see #turnGunLeft(double) - * @see #turnGunLeftRadians(double) - * @see AdvancedRobot#setTurnGunLeft(double) setTurnGunLeft(double) - * @see AdvancedRobot#setTurnGunLeftRadians(double) setTurnGunLeftRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void setTurnGunRightRadians(double radians) { - super.setTurnGunRightRadians(radians); - } - - /** - * Sets the robot's radar to turn left by radians when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Set the radar to turn 180 degrees to the left
-	 *   setTurnRadarLeftRadians(Math.PI);
-	 *
-	 *   // Set the radar to turn 90 degrees to the right instead of left
-	 *   // (overrides the previous order)
-	 *   setTurnRadarLeftRadians(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRadarLeftRadians()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's radar to the left. - * If {@code radians} > 0 the robot's radar is set to turn left. - * If {@code radians} < 0 the robot's radar is set to turn right. - * If {@code radians} = 0 the robot's radar is set to stop turning. - * @see AdvancedRobot#setTurnRadarLeft(double) setTurnRadarLeft(double) - * @see #turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) - * @see #turnRadarRight(double) - * @see #turnRadarRightRadians(double) - * @see AdvancedRobot#setTurnRadarRight(double) setTurnRadarRight(double) - * @see AdvancedRobot#setTurnRadarRightRadians(double) setTurnRadarRightRadians(double) - * @see #setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void setTurnRadarLeftRadians(double radians) { - super.setTurnRadarLeftRadians(radians); - } - - /** - * Sets the robot's radar to turn right by radians when the next execution - * takes place. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Set the radar to turn 180 degrees to the right
-	 *   setTurnRadarRightRadians(Math.PI);
-	 *
-	 *   // Set the radar to turn 90 degrees to the right instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnRadarRightRadians(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRadarRightRadians()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's radar to the right. - * If {@code radians} > 0 the robot's radar is set to turn left. - * If {@code radians} < 0 the robot's radar is set to turn right. - * If {@code radians} = 0 the robot's radar is set to stop turning. - * @see AdvancedRobot#setTurnRadarRight(double) setTurnRadarRight(double) - * @see #turnRadarRight(double) - * @see #turnRadarRightRadians(double) - * @see #turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) - * @see AdvancedRobot#setTurnRadarLeft(double) setTurnRadarLeft(double) - * @see AdvancedRobot#setTurnRadarLeftRadians(double) setTurnRadarLeftRadians(double) - * @see #setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void setTurnRadarRightRadians(double radians) { - super.setTurnRadarRightRadians(radians); - } - - /** - * Immediately turns the robot's gun to the left by radians. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the gun's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Turn the robot's gun 180 degrees to the left
-	 *   turnGunLeftRadians(Math.PI);
-	 *
-	 *   // Afterwards, turn the robot's gun 90 degrees to the right
-	 *   turnGunLeftRadians(-Math.PI / 2);
-	 * 
- * - * @param radians the amount of radians to turn the robot's gun to the left. - * If {@code radians} > 0 the robot's gun will turn left. - * If {@code radians} < 0 the robot's gun will turn right. - * If {@code radians} = 0 the robot's gun will not turn, but execute. - * @see #turnGunLeft(double) - * @see #turnGunRight(double) - * @see #turnGunRightRadians(double) - * @see #turnLeft(double) - * @see #turnLeftRadians(double) - * @see #turnRight(double) - * @see #turnRightRadians(double) - * @see #turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) - * @see #turnRadarRight(double) - * @see #turnRadarRightRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void turnGunLeftRadians(double radians) { - super.turnGunLeftRadians(radians); - } - - /** - * Immediately turns the robot's gun to the right by radians. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the gun's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Turn the robot's gun 180 degrees to the right
-	 *   turnGunRightRadians(Math.PI);
-	 *
-	 *   // Afterwards, turn the robot's gun 90 degrees to the left
-	 *   turnGunRightRadians(-Math.PI / 2);
-	 * 
- * - * @param radians the amount of radians to turn the robot's gun to the right. - * If {@code radians} > 0 the robot's gun will turn right. - * If {@code radians} < 0 the robot's gun will turn left. - * If {@code radians} = 0 the robot's gun will not turn, but execute. - * @see #turnGunRight(double) - * @see #turnGunLeft(double) - * @see #turnGunLeftRadians(double) - * @see #turnLeft(double) - * @see #turnLeftRadians(double) - * @see #turnRight(double) - * @see #turnRightRadians(double) - * @see #turnRadarLeft(double) - * @see #turnRadarLeftRadians(double) - * @see #turnRadarRight(double) - * @see #turnRadarRightRadians(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void turnGunRightRadians(double radians) { - super.turnGunRightRadians(radians); - } - - /** - * Immediately turns the robot's radar to the left by radians. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the radar's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Turn the robot's radar 180 degrees to the left
-	 *   turnRadarLeftRadians(Math.PI);
-	 *
-	 *   // Afterwards, turn the robot's radar 90 degrees to the right
-	 *   turnRadarLeftRadians(-Math.PI / 2);
-	 * 
- * - * @param radians the amount of radians to turn the robot's radar to the left. - * If {@code radians} > 0 the robot's radar will turn left. - * If {@code radians} < 0 the robot's radar will turn right. - * If {@code radians} = 0 the robot's radar will not turn, but execute. - * @see #turnRadarLeft(double) - * @see #turnRadarRight(double) - * @see #turnGunRightRadians(double) - * @see #turnLeft(double) - * @see #turnLeftRadians(double) - * @see #turnRight(double) - * @see #turnRightRadians(double) - * @see #turnGunLeft(double) - * @see #turnGunLeftRadians(double) - * @see #turnGunRight(double) - * @see #turnGunRightRadians(double) - * @see #setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void turnRadarLeftRadians(double radians) { - super.turnRadarLeftRadians(radians); - } - - /** - * Immediately turns the robot's radar to the right by radians. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the radar's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Turn the robot's radar 180 degrees to the right
-	 *   turnRadarRightRadians(Math.PI);
-	 *
-	 *   // Afterwards, turn the robot's radar 90 degrees to the left
-	 *   turnRadarRightRadians(-Math.PI / 2);
-	 * 
- * - * @param radians the amount of radians to turn the robot's radar to the right. - * If {@code radians} > 0 the robot's radar will turn right. - * If {@code radians} < 0 the robot's radar will turn left. - * If {@code radians} = 0 the robot's radar will not turn, but execute. - * @see #turnRadarRight(double) - * @see #turnRadarLeft(double) - * @see #turnGunLeftRadians(double) - * @see #turnLeft(double) - * @see #turnLeftRadians(double) - * @see #turnRight(double) - * @see #turnRightRadians(double) - * @see #turnGunLeft(double) - * @see #turnGunLeftRadians(double) - * @see #turnGunRight(double) - * @see #turnGunRightRadians(double) - * @see #setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void turnRadarRightRadians(double radians) { - super.turnRadarRightRadians(radians); - } - - /** - * Returns the angle remaining in the gun's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the gun is currently turning to the right. Negative values - * means that the gun is currently turning to the left. - * - * @return the angle remaining in the gun's turn, in radians - * @see AdvancedRobot#getGunTurnRemaining() - * @see AdvancedRobot#getTurnRemaining() getTurnRemaining() - * @see #getTurnRemainingRadians() - * @see AdvancedRobot#getRadarTurnRemaining() getRadarTurnRemaining() - * @see #getRadarTurnRemainingRadians() - */ - public double getGunTurnRemainingRadians() { - return super.getGunTurnRemainingRadians(); - } - - /** - * Returns the angle remaining in the radar's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the radar is currently turning to the right. Negative values - * means that the radar is currently turning to the left. - * - * @return the angle remaining in the radar's turn, in radians - * @see AdvancedRobot#getRadarTurnRemaining() - * @see AdvancedRobot#getTurnRemaining() getTurnRemaining() - * @see #getTurnRemainingRadians() - * @see AdvancedRobot#getGunTurnRemaining() getGunTurnRemaining() - * @see #getGunTurnRemainingRadians() - */ - public double getRadarTurnRemainingRadians() { - return super.getRadarTurnRemainingRadians(); - } - - /** - * Returns the angle remaining in the robot's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently turning to the right. Negative values - * means that the robot is currently turning to the left. - * - * @return the angle remaining in the robot's turn, in radians - * @see AdvancedRobot#getTurnRemaining() - * @see AdvancedRobot#getGunTurnRemaining() getGunTurnRemaining() - * @see #getGunTurnRemainingRadians() - * @see AdvancedRobot#getRadarTurnRemaining() getRadarTurnRemaining() - * @see #getRadarTurnRemainingRadians() - */ - public double getTurnRemainingRadians() { - return super.getTurnRemainingRadians(); - } - - /** - * Do not call this method! - *

- * {@inheritDoc} - */ - public final IAdvancedEvents getAdvancedEventListener() { - return this; // this robot is listening - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleEndedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleEndedEvent.java deleted file mode 100644 index de3bd6a..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleEndedEvent.java +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicEvents2; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A BattleEndedEvent is sent to {@link Robot#onBattleEnded(BattleEndedEvent) - * onBattleEnded()} when the battle is ended. - * You can use the information contained in this event to determine if the - * battle was aborted and also get the results of the battle. - * - * @see BattleResults - * @see Robot#onBattleEnded(BattleEndedEvent) - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class BattleEndedEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 100; // System event -> cannot be changed! - - private final boolean aborted; - private final BattleResults results; - - /** - * Called by the game to create a new BattleEndedEvent. - * - * @param aborted {@code true} if the battle was aborted; {@code false} otherwise. - * @param results the battle results - */ - public BattleEndedEvent(boolean aborted, BattleResults results) { - this.aborted = aborted; - this.results = results; - } - - /** - * Checks if this battle was aborted. - * - * @return {@code true} if the battle was aborted; {@code false} otherwise. - */ - public boolean isAborted() { - return aborted; - } - - /** - * Returns the battle results. - * - * @return the battle results. - */ - public BattleResults getResults() { - return results; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - public final int getPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (robot != null) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null && IBasicEvents2.class.isAssignableFrom(listener.getClass())) { - ((IBasicEvents2) listener).onBattleEnded(this); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - final boolean isCriticalEvent() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.BattleEndedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - BattleEndedEvent obj = (BattleEndedEvent) object; - - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_BOOL - + serializer.sizeOf(RbSerializer.BattleResults_TYPE, obj.results); - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - BattleEndedEvent obj = (BattleEndedEvent) object; - - serializer.serialize(buffer, obj.aborted); - serializer.serialize(buffer, RbSerializer.BattleResults_TYPE, obj.results); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - boolean aborted = serializer.deserializeBoolean(buffer); - BattleResults results = (BattleResults) serializer.deserializeAny(buffer); - - return new BattleEndedEvent(aborted, results); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleResults.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleResults.java deleted file mode 100644 index 572d8e6..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleResults.java +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; - -import java.nio.ByteBuffer; - - -/** - * Contains the battle results returned by {@link BattleEndedEvent#getResults()} - * when a battle has ended. - * - * @see BattleEndedEvent#getResults() - * @see Robot#onBattleEnded(BattleEndedEvent) - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public class BattleResults implements java.io.Serializable, Comparable { - protected static final long serialVersionUID = 1L; - - protected String teamLeaderName; - protected int rank; - protected double score; - protected double survival; - protected double lastSurvivorBonus; - protected double bulletDamage; - protected double bulletDamageBonus; - protected double ramDamage; - protected double ramDamageBonus; - protected int firsts; - protected int seconds; - protected int thirds; - - /** - * Constructs this BattleResults object. - * - * @param teamLeaderName the name of the team leader. - * @param rank the rank of the robot in the battle. - * @param score the total score for the robot in the battle. - * @param survival the survival score for the robot in the battle. - * @param lastSurvivorBonus the last survivor bonus for the robot in the battle. - * @param bulletDamage the bullet damage score for the robot in the battle. - * @param bulletDamageBonus the bullet damage bonus for the robot in the battle. - * @param ramDamage the ramming damage for the robot in the battle. - * @param ramDamageBonus the ramming damage bonus for the robot in the battle. - * @param firsts the number of rounds this robot placed first. - * @param seconds the number of rounds this robot placed second. - * @param thirds the number of rounds this robot placed third. - */ - public BattleResults( - String teamLeaderName, - int rank, - double score, - double survival, - double lastSurvivorBonus, - double bulletDamage, - double bulletDamageBonus, - double ramDamage, - double ramDamageBonus, - int firsts, - int seconds, - int thirds - ) { - this.teamLeaderName = teamLeaderName; - this.rank = rank; - this.score = score; - this.survival = survival; - this.lastSurvivorBonus = lastSurvivorBonus; - this.bulletDamage = bulletDamage; - this.bulletDamageBonus = bulletDamageBonus; - this.ramDamage = ramDamage; - this.ramDamageBonus = ramDamageBonus; - this.firsts = firsts; - this.seconds = seconds; - this.thirds = thirds; - } - - /** - * Returns the name of the team leader in the team or the name of the - * robot if the robot is not participating in a team. - * - * @return the name of the team leader in the team or the name of the robot. - */ - public String getTeamLeaderName() { - return teamLeaderName; - } - - /** - * Returns the rank of this robot in the battle results. - * - * @return the rank of this robot in the battle results. - */ - public int getRank() { - return rank; - } - - /** - * Returns the total score of this robot in the battle. - * - * @return the total score of this robot in the battle. - */ - public int getScore() { - return (int) (score + 0.5); - } - - /** - * Returns the survival score of this robot in the battle. - * - * @return the survival score of this robot in the battle. - */ - public int getSurvival() { - return (int) (survival + 0.5); - } - - /** - * Returns the last survivor score of this robot in the battle. - * - * @return the last survivor score of this robot in the battle. - */ - public int getLastSurvivorBonus() { - return (int) (lastSurvivorBonus + 0.5); - } - - /** - * Returns the bullet damage score of this robot in the battle. - * - * @return the bullet damage score of this robot in the battle. - */ - public int getBulletDamage() { - return (int) (bulletDamage + 0.5); - } - - /** - * Returns the bullet damage bonus of this robot in the battle. - * - * @return the bullet damage bonus of this robot in the battle. - */ - public int getBulletDamageBonus() { - return (int) (bulletDamageBonus + 0.5); - } - - /** - * Returns the ram damage score of this robot in the battle. - * - * @return the ram damage score of this robot in the battle. - */ - public int getRamDamage() { - return (int) (ramDamage + 0.5); - } - - /** - * Returns the ram damage bonus of this robot in the battle. - * - * @return the ram damage bonus of this robot in the battle. - */ - public int getRamDamageBonus() { - return (int) (ramDamageBonus + 0.5); - } - - /** - * Returns the number of rounds this robot placed first in the battle. - * - * @return the number of rounds this robot placed first in the battle. - */ - public int getFirsts() { - return firsts; - } - - /** - * Returns the number of rounds this robot placed second in the battle. - * - * @return the number of rounds this robot placed second in the battle. - */ - public int getSeconds() { - return seconds; - } - - /** - * Returns the number of rounds this robot placed third in the battle. - * - * @return the number of rounds this robot placed third in the battle. - */ - public int getThirds() { - return thirds; - } - - /** - * {@inheritDoc} - */ - public int compareTo(BattleResults o) { - return ((Double) score).compareTo(o.score); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - long temp; - - temp = Double.doubleToLongBits(score); - result = prime * result + (int) (temp ^ (temp >>> 32)); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - BattleResults other = (BattleResults) obj; - - if (Double.doubleToLongBits(score) != Double.doubleToLongBits(other.score)) { - return false; - } - return true; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - BattleResults obj = (BattleResults) object; - - return RbSerializer.SIZEOF_TYPEINFO + serializer.sizeOf(obj.teamLeaderName) + 4 * RbSerializer.SIZEOF_INT - + 7 * RbSerializer.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - BattleResults obj = (BattleResults) object; - - serializer.serialize(buffer, obj.teamLeaderName); - serializer.serialize(buffer, obj.rank); - serializer.serialize(buffer, obj.score); - serializer.serialize(buffer, obj.survival); - serializer.serialize(buffer, obj.lastSurvivorBonus); - serializer.serialize(buffer, obj.bulletDamage); - serializer.serialize(buffer, obj.bulletDamageBonus); - serializer.serialize(buffer, obj.ramDamage); - serializer.serialize(buffer, obj.ramDamageBonus); - serializer.serialize(buffer, obj.firsts); - serializer.serialize(buffer, obj.seconds); - serializer.serialize(buffer, obj.thirds); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - String teamLeaderName = serializer.deserializeString(buffer); - int rank = buffer.getInt(); - double score = buffer.getDouble(); - double survival = buffer.getDouble(); - double lastSurvivorBonus = buffer.getDouble(); - double bulletDamage = buffer.getDouble(); - double bulletDamageBonus = buffer.getDouble(); - double ramDamage = buffer.getDouble(); - double ramDamageBonus = buffer.getDouble(); - int firsts = buffer.getInt(); - int seconds = buffer.getInt(); - int thirds = buffer.getInt(); - - return new BattleResults(teamLeaderName, rank, score, survival, lastSurvivorBonus, bulletDamage, - bulletDamageBonus, ramDamage, ramDamageBonus, firsts, seconds, thirds); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleRules.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleRules.java deleted file mode 100644 index af70c8d..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BattleRules.java +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.security.IHiddenRulesHelper; - - -/** - * Contains the battle rules returned by {@link robocode.control.events.BattleStartedEvent#getBattleRules() - * BattleStartedEvent.getBattleRules()} when a battle is started and - * {@link robocode.control.events.BattleCompletedEvent#getBattleRules() BattleCompletedEvent.getBattleRules()} - * when a battle is completed. - * - * @see robocode.control.events.BattleStartedEvent BattleStartedEvent - * @see robocode.control.events.BattleCompletedEvent BattleCompletedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public final class BattleRules implements java.io.Serializable { - private static final long serialVersionUID = 1L; - - private final int battlefieldWidth; - private final int battlefieldHeight; - private final int numRounds; - private final double gunCoolingRate; - private final long inactivityTime; - private final boolean hideEnemyNames; - private final int sentryBorderSize; - - /** - * Returns the battlefield width. - * - * @return the battlefield width. - */ - public int getBattlefieldWidth() { - return battlefieldWidth; - } - - /** - * Returns the battlefield height. - * - * @return the battlefield height. - */ - public int getBattlefieldHeight() { - return battlefieldHeight; - } - - /** - * Returns the number of rounds. - * - * @return the number of rounds. - */ - public int getNumRounds() { - return numRounds; - } - - /** - * Returns the rate at which the gun will cool down, i.e. the amount of heat the gun heat will drop per turn. - *

- * The gun cooling rate is default 0.1 per turn, but can be changed by the battle setup. - * So don't count on the cooling rate being 0.1! - * - * @return the gun cooling rate. - * @see Robot#getGunHeat() - * @see Robot#fire(double) - * @see Robot#fireBullet(double) - */ - public double getGunCoolingRate() { - return gunCoolingRate; - } - - /** - * Returns the allowed inactivity time, where the robot is not taking any action, before will begin to be zapped. - * The inactivity time is measured in turns, and is the allowed time that a robot is allowed to omit taking - * action before being punished by the game by zapping. - *

- * When a robot is zapped by the game, it will loose 0.1 energy points per turn. Eventually the robot will be - * killed by zapping until the robot takes action. When the robot takes action, the inactivity time counter is - * reset. - *

- * The allowed inactivity time is per default 450 turns, but can be changed by the battle setup. - * So don't count on the inactivity time being 450 turns! - * - * @return the allowed inactivity time. - * @see Robot#doNothing() - * @see AdvancedRobot#execute() - */ - public long getInactivityTime() { - return inactivityTime; - } - - /** - * Returns true if the enemy names are hidden, i.e. anonymous; false otherwise. - * - * @Since 1.7.3 - */ - public boolean getHideEnemyNames() { - return hideEnemyNames; - } - - /** - * Returns the sentry border size for a {@link robocode.BorderSentry BorderSentry} that defines the how - * far a BorderSentry is allowed to move from the border edges measured in units.
- * Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that - * BorderSentrys cannot leave (sentry robots robots must stay in the border area), but it also define the - * distance from the border edges where BorderSentrys are allowed/able to make damage to robots entering this - * border area. - * - * @return the border size in units/pixels. - * - * @since 1.9.0.0 - */ - public int getSentryBorderSize() { - return sentryBorderSize; - } - - private BattleRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, - long inactivityTime, boolean hideEnemyNames, int sentryBorderSize) { - this.battlefieldWidth = battlefieldWidth; - this.battlefieldHeight = battlefieldHeight; - this.numRounds = numRounds; - this.gunCoolingRate = gunCoolingRate; - this.inactivityTime = inactivityTime; - this.hideEnemyNames = hideEnemyNames; - this.sentryBorderSize = sentryBorderSize; - } - - static IHiddenRulesHelper createHiddenHelper() { - return new HiddenHelper(); - } - - private static class HiddenHelper implements IHiddenRulesHelper { - - public BattleRules createRules(int battlefieldWidth, int battlefieldHeight, int numRounds, double gunCoolingRate, long inactivityTime, boolean hideEnemyNames, int sentryBorderSize) { - return new BattleRules(battlefieldWidth, battlefieldHeight, numRounds, gunCoolingRate, inactivityTime, - hideEnemyNames, sentryBorderSize); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BorderSentry.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/BorderSentry.java deleted file mode 100644 index ea99cf5..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BorderSentry.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * A robot that implements BorderSentry is a robot type used for keeping other robots away from the borders, - * i.e. guarding the borders in order to prevent "wall crawlers".
- * Robots that implement BorderSentry have 400 extra life/energy (500 in total), but is placed at the border - * of the battlefield when the game is started.
- * Border sentry robots cannot move away from the border area, and they can only make damage to robots that - * are moving into the border area. The size of the border area is determined by the - * {@link BattleRules#getSentryBorderSize() battle rules}.
- * This type of robot is intended for use in battles where robots should be forced away from the borders - * in order to prevent "wall crawlers".
- * Border sentry robots does not get scores, and will not occur in the battle results or rankings. - * - * @see BattleRules#getSentryBorderSize() - * @see JuniorRobot - * @see Robot - * @see AdvancedRobot - * @see TeamRobot - * @see RateControlRobot - * @see Droid - * - * @author Flemming N. Larsen (original) - * - * @since 1.9.0.0 - */ -public interface BorderSentry {} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Bullet.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/Bullet.java deleted file mode 100644 index d0b1e1c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Bullet.java +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.security.IHiddenBulletHelper; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; - -import java.io.Serializable; -import java.nio.ByteBuffer; - - -/** - * Represents a bullet. This is returned from {@link Robot#fireBullet(double)} - * and {@link AdvancedRobot#setFireBullet(double)}, and all the bullet-related - * events. - * - * @see Robot#fireBullet(double) - * @see AdvancedRobot#setFireBullet(double) - * @see BulletHitEvent - * @see BulletMissedEvent - * @see BulletHitBulletEvent - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Bullet implements Serializable { - private static final long serialVersionUID = 1L; - - private final double headingRadians; - private double x; - private double y; - private final double power; - private final String ownerName; - private String victimName; - private boolean isActive; - private final int bulletId; - - /** - * Called by the game to create a new {@code Bullet} object - * - * @param heading the heading of the bullet, in radians. - * @param x the starting X position of the bullet. - * @param y the starting Y position of the bullet. - * @param power the power of the bullet. - * @param ownerName the name of the owner robot that owns the bullet. - * @param victimName the name of the robot hit by the bullet. - * @param isActive {@code true} if the bullet still moves; {@code false} otherwise. - * @param bulletId unique id of bullet for owner robot. - */ - public Bullet(double heading, double x, double y, double power, String ownerName, String victimName, boolean isActive, int bulletId) { - this.headingRadians = heading; - this.x = x; - this.y = y; - this.power = power; - this.ownerName = ownerName; - this.victimName = victimName; - this.isActive = isActive; - this.bulletId = bulletId; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - return bulletId == ((Bullet) obj).bulletId; - } - - @Override - public int hashCode() { - return bulletId; - } - - /** - * Returns the direction the bullet is/was heading, in degrees - * (0 <= getHeading() < 360). This is not relative to the direction you are - * facing. - * - * @return the direction the bullet is/was heading, in degrees - */ - public double getHeading() { - return Math.toDegrees(headingRadians); - } - - /** - * Returns the direction the bullet is/was heading, in radians - * (0 <= getHeadingRadians() < 2 * Math.PI). This is not relative to the - * direction you are facing. - * - * @return the direction the bullet is/was heading, in radians - */ - public double getHeadingRadians() { - return headingRadians; - } - - /** - * Returns the name of the robot that fired this bullet. - * - * @return the name of the robot that fired this bullet - */ - public String getName() { - return ownerName; - } - - /** - * Returns the power of this bullet. - *

- * The bullet will do (4 * power) damage if it hits another robot. - * If power is greater than 1, it will do an additional 2 * (power - 1) - * damage. You will get (3 * power) back if you hit the other robot. - * - * @return the power of the bullet - */ - public double getPower() { - return power; - } - - /** - * Returns the velocity of this bullet. The velocity of the bullet is - * constant once it has been fired. - * - * @return the velocity of the bullet - */ - public double getVelocity() { - return Rules.getBulletSpeed(power); - } - - /** - * Returns the name of the robot that this bullet hit, or {@code null} if - * the bullet has not hit a robot. - * - * @return the name of the robot that this bullet hit, or {@code null} if - * the bullet has not hit a robot. - */ - public String getVictim() { - return victimName; - } - - /** - * Returns the X position of the bullet. - * - * @return the X position of the bullet - */ - public double getX() { - return x; - } - - /** - * Returns the Y position of the bullet. - * - * @return the Y position of the bullet - */ - public double getY() { - return y; - } - - /** - * Checks if this bullet is still active on the battlefield. - * - * @return {@code true} if the bullet is still active on the battlefield; - * {@code false} otherwise - */ - public boolean isActive() { - return isActive; - } - - /** - * Updates this bullet based on the specified bullet status. - * - * @param x the new X position of the bullet . - * @param y the new Y position of the bullet. - * @param victimName the name if the victim that has been hit by this bullet. - * @param isActive {@code true} if the bullet still moves; {@code false} otherwise. - */ - // this method is invisible on RobotAPI - private void update(double x, double y, String victimName, boolean isActive) { - this.x = x; - this.y = y; - this.victimName = victimName; - this.isActive = isActive; - } - - // this method is invisible on RobotAPI - /** - * @return unique id of bullet for owner robot - */ - int getBulletId() { - return bulletId; - } - - /** - * Creates a hidden bullet helper for accessing hidden methods on this object. - * - * @return a hidden bullet helper. - */ - // this method is invisible on RobotAPI - static IHiddenBulletHelper createHiddenHelper() { - return new HiddenBulletHelper(); - } - - /** - * Creates a hidden bullet helper for accessing hidden methods on this object. - * - * @return a hidden bullet helper. - */ - // this class is invisible on RobotAPI - static ISerializableHelper createHiddenSerializer() { - return new HiddenBulletHelper(); - } - - // this class is invisible on RobotAPI - private static class HiddenBulletHelper implements IHiddenBulletHelper, ISerializableHelper { - - public void update(Bullet bullet, double x, double y, String victimName, boolean isActive) { - bullet.update(x, y, victimName, isActive); - } - - public int sizeOf(RbSerializer serializer, Object object) { - Bullet obj = (Bullet) object; - - return RbSerializer.SIZEOF_TYPEINFO + 4 * RbSerializer.SIZEOF_DOUBLE + serializer.sizeOf(obj.ownerName) - + serializer.sizeOf(obj.victimName) + RbSerializer.SIZEOF_BOOL + RbSerializer.SIZEOF_INT; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - Bullet obj = (Bullet) object; - - serializer.serialize(buffer, obj.headingRadians); - serializer.serialize(buffer, obj.x); - serializer.serialize(buffer, obj.y); - serializer.serialize(buffer, obj.power); - serializer.serialize(buffer, obj.ownerName); - serializer.serialize(buffer, obj.victimName); - serializer.serialize(buffer, obj.isActive); - serializer.serialize(buffer, obj.bulletId); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - double headingRadians = buffer.getDouble(); - double x = buffer.getDouble(); - double y = buffer.getDouble(); - double power = buffer.getDouble(); - String ownerName = serializer.deserializeString(buffer); - String victimName = serializer.deserializeString(buffer); - boolean isActive = serializer.deserializeBoolean(buffer); - int bulletId = serializer.deserializeInt(buffer); - - return new Bullet(headingRadians, x, y, power, ownerName, victimName, isActive, bulletId); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitBulletEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitBulletEvent.java deleted file mode 100644 index db738b9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitBulletEvent.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * This event is sent to {@link Robot#onBulletHitBullet(BulletHitBulletEvent) - * onBulletHitBullet} when one of your bullets has hit another bullet. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class BulletHitBulletEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 55; - - private Bullet bullet; - private final Bullet hitBullet; - - /** - * Called by the game to create a new {@code BulletHitEvent}. - * - * @param bullet your bullet that hit another bullet - * @param hitBullet the bullet that was hit by your bullet - */ - public BulletHitBulletEvent(Bullet bullet, Bullet hitBullet) { - super(); - this.bullet = bullet; - this.hitBullet = hitBullet; - } - - /** - * Returns your bullet that hit another bullet. - * - * @return your bullet - */ - public Bullet getBullet() { - return bullet; - } - - /** - * Returns the bullet that was hit by your bullet. - * - * @return the bullet that was hit - */ - public Bullet getHitBullet() { - return hitBullet; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onBulletHitBullet(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.BulletHitBulletEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - BulletHitBulletEvent obj = (BulletHitBulletEvent) object; - - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_INT - + serializer.sizeOf(RbSerializer.Bullet_TYPE, obj.hitBullet); - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - BulletHitBulletEvent obj = (BulletHitBulletEvent) object; - - // no need to transmit whole bullet, rest of it is already known to proxy side - serializer.serialize(buffer, obj.bullet.getBulletId()); - serializer.serialize(buffer, RbSerializer.Bullet_TYPE, obj.hitBullet); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - Bullet bullet = new Bullet(0, 0, 0, 0, null, null, false, buffer.getInt()); - Bullet hitBullet = (Bullet) serializer.deserializeAny(buffer); - - return new BulletHitBulletEvent(bullet, hitBullet); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitEvent.java deleted file mode 100644 index 3e08a88..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletHitEvent.java +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * This event is sent to {@link Robot#onBulletHit(BulletHitEvent) onBulletHit} - * when one of your bullets has hit another robot. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class BulletHitEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 50; - - private final String name; - private final double energy; - private Bullet bullet; - - /** - * Called by the game to create a new {@code BulletHitEvent}. - * - * @param name the name of the robot your bullet hit - * @param energy the remaining energy of the robot that your bullet has hit - * @param bullet the bullet that hit the robot - */ - public BulletHitEvent(String name, double energy, Bullet bullet) { - super(); - this.name = name; - this.energy = energy; - this.bullet = bullet; - } - - /** - * Returns the bullet of yours that hit the robot. - * - * @return the bullet that hit the robot - */ - public Bullet getBullet() { - return bullet; - } - - /** - * Returns the remaining energy of the robot your bullet has hit (after the - * damage done by your bullet). - * - * @return energy the remaining energy of the robot that your bullet has hit - */ - public double getEnergy() { - return energy; - } - - /** - * @return energy the remaining energy of the robot that your bullet has hit - * @deprecated Use {@link #getEnergy()} instead. - */ - @Deprecated - public double getLife() { - return energy; - } - - /** - * Returns the name of the robot your bullet hit. - * - * @return the name of the robot your bullet hit. - */ - public String getName() { - return name; - } - - /** - * @return energy the remaining energy of the robot that your bullet has hit - * @deprecated Use {@link #getEnergy()} instead. - */ - @Deprecated - public double getRobotLife() { - return energy; - } - - /** - * @return the name of the robot your bullet hit. - * @deprecated Use {@link #getName()} instead. - */ - @Deprecated - public String getRobotName() { - return name; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onBulletHit(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.BulletHitEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - BulletHitEvent obj = (BulletHitEvent) object; - - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_INT + serializer.sizeOf(obj.name) - + RbSerializer.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - BulletHitEvent obj = (BulletHitEvent) object; - - serializer.serialize(buffer, obj.bullet.getBulletId()); - serializer.serialize(buffer, obj.name); - serializer.serialize(buffer, obj.energy); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - Bullet bullet = new Bullet(0, 0, 0, 0, null, null, false, buffer.getInt()); - String name = serializer.deserializeString(buffer); - double energy = buffer.getDouble(); - - return new BulletHitEvent(name, energy, bullet); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletMissedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletMissedEvent.java deleted file mode 100644 index 5d0db37..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/BulletMissedEvent.java +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * This event is sent to {@link Robot#onBulletMissed(BulletMissedEvent) - * onBulletMissed} when one of your bullets has missed, i.e. when the bullet has - * reached the border of the battlefield. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class BulletMissedEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 60; - - private Bullet bullet; - - /** - * Called by the game to create a new {@code BulletMissedEvent}. - * - * @param bullet the bullet that missed - */ - public BulletMissedEvent(Bullet bullet) { - this.bullet = bullet; - } - - /** - * Returns the bullet that missed. - * - * @return the bullet that missed - */ - public Bullet getBullet() { - return bullet; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onBulletMissed(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.BulletMissedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_INT; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - BulletMissedEvent obj = (BulletMissedEvent) object; - - serializer.serialize(buffer, obj.bullet.getBulletId()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - Bullet bullet = new Bullet(0, 0, 0, 0, null, null, false, buffer.getInt()); - - return new BulletMissedEvent(bullet); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Condition.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/Condition.java deleted file mode 100644 index 58c6a1b..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Condition.java +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * Condition is used to define custom {@link AdvancedRobot#waitFor(Condition) - * waitFor(Condition)} and custom events for an {@link AdvancedRobot}. The code - * below is taken from the sample robot named {@code sample.Target}. See the - * {@code sample/Target.java} for details. - *

- *   addCustomEvent(
- *       new Condition("triggerhit") {
- *           public boolean test() {
- *               return (getEnergy() <= trigger);
- *           };
- *       }
- *   );
- * 
- * You should note that by extending Condition this way, you are actually - * creating an inner class -- so if you distribute your robot, there will be - * multiple class files. (i.e. {@code Target$1.class}) - * - * @see AdvancedRobot#waitFor(Condition) - * @see AdvancedRobot#addCustomEvent(Condition) - * @see AdvancedRobot#removeCustomEvent(Condition) - * @see AdvancedRobot#onCustomEvent(CustomEvent) - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Nathaniel Troutman (contributor) - */ -public abstract class Condition { - - /** - * The priority of this condition. Defaults to 80. - */ - public int priority = 80; - - /** - * The name of this condition. - */ - public String name; - - /** - * Creates a new, unnamed Condition with the default priority, which is 80. - */ - public Condition() {} - - /** - * Creates a new Condition with the specified name, and default priority, - * which is 80. - * - * @param name the name for the new Condition - */ - public Condition(String name) { - this.name = name; - } - - /** - * Creates a new Condition with the specified name and priority. - * A condition priority is a value from 0 - 99. The higher value, the - * higher priority. The default priority is 80. - * - * @param name the name for the new condition - * @param priority the priority of the new condition - */ - public Condition(String name, int priority) { - this.name = name; - if (priority < 0) { - System.out.println("SYSTEM: Priority must be between 0 and 99."); - System.out.println("SYSTEM: Priority for condition " + name + " will be 0."); - priority = 0; - } else if (priority > 99) { - System.out.println("SYSTEM: Priority must be between 0 and 99."); - System.out.println("SYSTEM: Priority for condition " + name + " will be 99."); - priority = 99; - } - this.priority = priority; - } - - /** - * Returns the name of this condition. - * - * @return the name of this condition - */ - public String getName() { - return (name != null) ? name : getClass().getName(); - } - - /** - * Returns the priority of this condition. - * A condition priority is a value from 0 - 99. The higher value, the - * higher priority. The default priority is 80. - * - * @return the priority of this condition - */ - public final int getPriority() { - return priority; - } - - /** - * Sets the name of this condition. - * - * @param newName the new name of this condition - */ - public void setName(String newName) { - name = newName; - } - - /** - * Sets the priority of this condition. - * A condition priority is a value from 0 - 99. The higher value, the - * higher priority. The default priority is 80. - * - * @param newPriority the new priority of this condition. - */ - public void setPriority(int newPriority) { - priority = newPriority; - } - - /** - * Overriding the test() method is the point of a Condition. - * The game will call your test() function, and take action if it returns - * {@code true}. This is valid for both {@link AdvancedRobot#waitFor} and - * {@link AdvancedRobot#addCustomEvent}. - *

- * You may not take any actions inside of test(). - * - * @return {@code true} if the condition has been met, {@code false} - * otherwise. - */ - public abstract boolean test(); - - /** - * Called by the system in order to clean up references to internal objects. - * - * @since 1.4.3 - */ - public void cleanup() {/* Do nothing: Should be overridden by sub-classes to perform needed - clean up to ensure that there are NO circular references */} -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/CustomEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/CustomEvent.java deleted file mode 100644 index 30be654..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/CustomEvent.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import robocode.robotinterfaces.IAdvancedEvents; -import robocode.robotinterfaces.IAdvancedRobot; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; - - -/** - * This event is sent to {@link AdvancedRobot#onCustomEvent(CustomEvent) - * onCustomEvent()} when a custom condition is met. Be sure to reset or remove - * the custom condition to avoid having it recurring repeatedly (see the - * example for the {@link #getCondition()} method. - * - * @see #getCondition() - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class CustomEvent extends Event { - private static final long serialVersionUID = 1L; - private static final int DEFAULT_PRIORITY = 80; - - private transient final Condition condition; - - /** - * Called by the game to create a new CustomEvent when a condition is met. - * - * @param condition the condition that must be met - */ - public CustomEvent(Condition condition) { - this.condition = condition; - if (condition != null) { - setPriority(condition.getPriority()); - } - } - - /** - * Called by the game to create a new CustomEvent when a condition is met. - * The event will have the given priority. - * An event priority is a value from 0 - 99. The higher value, the higher - * priority. The default priority is 80. - *

- * This is equivalent to calling {@link Condition#setPriority(int)} on the - * Condition. - * - * @param condition the condition that must be met - * @param priority the priority of the condition - */ - public CustomEvent(Condition condition, int priority) { - this.condition = condition; - setPriority(priority); - if (condition != null) { - condition.setPriority(getPriority()); - } - } - - /** - * Returns the condition that fired, causing this event to be generated. - * Use this to determine which condition fired, and to remove the custom - * event. - *

-	 *   public void onCustomEvent(CustomEvent event) {
-	 *       if (event.getCondition().getName().equals("mycondition")) {
-	 *           removeCustomEvent(event.getCondition());
-	 *           // do something else
-	 *       }
-	 *   }
-	 * 
- * - * @return the condition that fired, causing this event to be generated - */ - public Condition getCondition() { - return condition; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isAdvancedRobot()) { - IAdvancedEvents listener = ((IAdvancedRobot) robot).getAdvancedEventListener(); - - if (listener != null) { - listener.onCustomEvent(this); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - // final to disable overrides - public final int compareTo(Event event) { - return super.compareTo(event); - } - - /** - * {@inheritDoc} - */ - @Override - // final to disable overrides - final boolean isCriticalEvent() { - return false; - } - - /** - * {@inheritDoc} - */ - @Override - // final to disable overrides - public final int getPriority() { - return super.getPriority(); - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - throw new Error("Serialization not supported on this event type"); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/DeathEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/DeathEvent.java deleted file mode 100644 index b5f6f0e..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/DeathEvent.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * This event is sent to {@link Robot#onDeath(DeathEvent) onDeath()} when your - * robot dies. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class DeathEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = -1; // System event -> cannot be changed! - - /** - * Called by the game to create a new DeathEvent. - */ - public DeathEvent() { - super(); - } - - /** - * {@inheritDoc} - */ - @Override - public final int getPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onDeath(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - final boolean isCriticalEvent() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.DeathEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) {} - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - return new DeathEvent(); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Droid.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/Droid.java deleted file mode 100644 index 73fffef..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Droid.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * Robots that implement Droid have no scanner, but an extra 20 life/energy. - * This class is intended for use in teams. - * - * @see JuniorRobot - * @see Robot - * @see AdvancedRobot - * @see TeamRobot - * @see RateControlRobot - * @see BorderSentry - * - * @author Mathew A. Nelson (original) - */ -public interface Droid {} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Event.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/Event.java deleted file mode 100644 index ccb128c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Event.java +++ /dev/null @@ -1,266 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.IHiddenEventHelper; -import net.sf.robocode.io.Logger; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.io.Serializable; - - -// XXX Remember to update the .NET version whenever a change is made to this class! - -/** - * The superclass of all Robocode events. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public abstract class Event implements Comparable, Serializable { - private static final long serialVersionUID = 1L; - private static final int DEFAULT_PRIORITY = 80; - - private long time; - private int priority; - - // time is valid only after adding to event manager on proxy side, we do not update it on battle side - private transient boolean addedToQueue; - - /** - * Default constructor used by the game to create a new event. - */ - public Event() { - super(); - } - - /** - * Compares this event to another event regarding precedence. - * The event precedence is first and foremost determined by the event time, - * secondly the event priority, and lastly specific event information. - *

- * This method will first compare the time of each event. If the event time - * is the same for both events, then this method compared the priority of - * each event. If the event priorities are equals, then this method will - * compare the two event based on specific event information. - *

- * This method is called by the game in order to sort the event queue of a - * robot to make sure the events are listed in chronological order. - * - * @param event the event to compare to this event. - * @return a negative value if this event has higher precedence, i.e. must - * be listed before the specified event. A positive value if this event - * has a lower precedence, i.e. must be listed after the specified event. - * 0 means that the precedence of the two events are equal. - */ - public int compareTo(Event event) { - // Compare the time difference which has precedence over priority. - int timeDiff = (int) (time - event.time); - - if (timeDiff != 0) { - return timeDiff; // Time differ - } - - // Same time -> Compare the difference in priority - int priorityDiff = event.getPriority() - getPriority(); - - if (priorityDiff != 0) { - return priorityDiff; // Priority differ - } - - // Same time and priority -> Compare specific event types - // look at overrides in ScannedRobotEvent and HitRobotEvent - - // No difference found - return 0; - } - - /** - * Returns the time when this event occurred. - *

- * Note that the time is equal to the turn of a battle round. - * - * @return the time when this event occurred. - */ - // Note: We rolled back the use of 'final' here due to Bug [2928688], where some old robots do override getTime() - // with their own events that inherits from robocode.Event. - public /* final*/long getTime() { - return time; - } - - /** - * Changes the time when this event occurred. - *

- * Note that the time is equal to the turn of a battle round. - *

- * This method is intended for letting robot developers create their own event types. - * It is not possible to change the time of an event after it has been added to the event - * queue of the robot. - * - * @param newTime the time this event occurred - */ - public void setTime(long newTime) { - if (addedToQueue) { - Logger.printlnToRobotsConsole( - "SYSTEM: The time of an event cannot be changed after it has been added the event queue."); - } else { - time = newTime; - } - } - - /** - * Returns the priority of this event. - *

- * An event priority is a value from 0 - 99. The higher value, the higher priority. - *

- * The default priority is 80, but varies depending on the type of event. - * - * @return the priority of this event. - */ - public int getPriority() { - return priority; - } - - /** - * Changes the priority of this event. - * An event priority is a value from 0 - 99. The higher value, the higher priority. - *

- * The default priority is 80, but varies depending on the type of event. - *

- * This method is intended for letting robot developers create their own event types. - * It is not possible to change the priority of an event after it has been added to the event - * queue of the robot. - * - * @param newPriority the new priority of this event - * @see AdvancedRobot#setEventPriority(String, int) - */ - public final void setPriority(int newPriority) { - if (addedToQueue) { - Logger.printlnToRobotsConsole( - "SYSTEM: The priority of an event cannot be changed after it has been added the event queue."); - } else { - setPriorityHidden(newPriority); - } - } - - /** - * Hidden method for setting the exact time when this event occurred. - *

- * Notice: This method is called by the game engine only. - * - * @param time the time when this event occurred. - */ - // This method must be invisible on Robot API - private void setTimeHidden(long time) { - // we do not replace time which is set by robot to the future - if (this.time < time) { - this.time = time; - } - // when this flag is set, robots are not allowed to change the time or priority of the event anymore - addedToQueue = true; - } - - /** - * Hidden method for setting the priority from the game engine without checking for the 'addedToQueue' flag. - *

- * Notice: This method is called by the game engine only. - * - * @param newPriority the new priority of this event. - */ - // This method must be invisible on Robot API - private void setPriorityHidden(int newPriority) { - if (newPriority < 0) { - Logger.printlnToRobotsConsole("SYSTEM: Priority must be between 0 and 99"); - Logger.printlnToRobotsConsole("SYSTEM: Priority for " + this.getClass().getName() + " will be 0"); - newPriority = 0; - } else if (newPriority > 99) { - Logger.printlnToRobotsConsole("SYSTEM: Priority must be between 0 and 99"); - Logger.printlnToRobotsConsole("SYSTEM: Priority for " + this.getClass().getName() + " will be 99"); - newPriority = 99; - } - priority = newPriority; - } - - /** - * Dispatch this event a the robot, it's statistics, and graphics context. - * - * @param robot the robot to dispatch to. - * @param statics the statistics to dispatch to. - * @param graphics the graphics to dispatch to. - */ - // This method must be invisible on Robot API - void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) {} - - /** - * Returns the default priority of this event class. - */ - // This method must be invisible on Robot API - int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * Checks if this event must be delivered even after timeout. - * - * @return {@code true} when this event must be delivered even after timeout; - * {@code false} otherwise. - */ - // This method must be invisible on Robot API - boolean isCriticalEvent() { - return false; - } - - // This method must be invisible on Robot API - byte getSerializationType() { - throw new Error("Serialization not supported on this event type"); - } - - /** - * Returns a hidden event helper for accessing hidden methods on this object. - */ - // This method must be invisible on Robot API - static IHiddenEventHelper createHiddenHelper() { - return new HiddenEventHelper(); - } - - /** - * Hidden event helper implementation for accessing the internal methods of an event. - *

- * This class is used internally by the game engine. - */ - // This method must be invisible on Robot API - private static class HiddenEventHelper implements IHiddenEventHelper { - - public void setTime(Event event, long newTime) { - event.setTimeHidden(newTime); - } - - public void setDefaultPriority(Event event) { - event.setPriority(event.getDefaultPriority()); - } - - public void setPriority(Event event, int newPriority) { - event.setPriorityHidden(newPriority); - } - - public boolean isCriticalEvent(Event event) { - return event.isCriticalEvent(); - } - - public void dispatch(Event event, IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - event.dispatch(robot, statics, graphics); - } - - public byte getSerializationType(Event event) { - return event.getSerializationType(); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/GunTurnCompleteCondition.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/GunTurnCompleteCondition.java deleted file mode 100644 index 63deee1..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/GunTurnCompleteCondition.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * A prebuilt condition you can use that indicates your gun has finished - * turning. - * - * @see Condition - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Nathaniel Troutman (contributor) - */ -public class GunTurnCompleteCondition extends Condition { - private AdvancedRobot robot = null; - - /** - * Creates a new GunTurnCompleteCondition with default priority. - * The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - */ - public GunTurnCompleteCondition(AdvancedRobot robot) { - super(); - this.robot = robot; - } - - /** - * Creates a new GunTurnCompleteCondition with a specific priority. - * A condition priority is a value from 0 - 99. The higher value, the - * higher priority. The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - * @param priority the priority of this condition - * @see Condition#setPriority(int) - */ - public GunTurnCompleteCondition(AdvancedRobot robot, int priority) { - super(); - this.robot = robot; - this.priority = priority; - } - - /** - * Tests if the gun has stopped turning. - * - * @return {@code true} if the gun has stopped turning; {@code false} - * otherwise - */ - @Override - public boolean test() { - return (robot.getGunTurnRemaining() == 0); - } - - /** - * Called by the system in order to clean up references to internal objects. - * - * @since 1.4.3 - */ - @Override - public final void cleanup() { - robot = null; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitByBulletEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitByBulletEvent.java deleted file mode 100644 index 9d215d4..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitByBulletEvent.java +++ /dev/null @@ -1,205 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A HitByBulletEvent is sent to {@link Robot#onHitByBullet(HitByBulletEvent) - * onHitByBullet()} when your robot has been hit by a bullet. - * You can use the information contained in this event to determine what to do. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class HitByBulletEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 20; - - private final double bearing; - private final Bullet bullet; - - /** - * Called by the game to create a new HitByBulletEvent. - * - * @param bearing the bearing of the bullet that hit your robot, in radians - * @param bullet the bullet that has hit your robot - */ - public HitByBulletEvent(double bearing, Bullet bullet) { - super(); - this.bearing = bearing; - this.bullet = bullet; - } - - /** - * Returns the bearing to the bullet, relative to your robot's heading, - * in degrees (-180 < getBearing() <= 180). - *

- * If you were to turnRight(event.getBearing()), you would be facing the - * direction the bullet came from. The calculation used here is: - * (bullet's heading in degrees + 180) - (your heading in degrees) - * - * @return the bearing to the bullet, in degrees - */ - public double getBearing() { - return bearing * 180.0 / Math.PI; - } - - /** - * Returns the bearing to the bullet, relative to your robot's heading, - * in radians (-Math.PI < getBearingRadians() <= Math.PI). - *

- * If you were to turnRightRadians(event.getBearingRadians()), you would be - * facing the direction the bullet came from. The calculation used here is: - * (bullet's heading in radians + Math.PI) - (your heading in radians) - * - * @return the bearing to the bullet, in radians - */ - public double getBearingRadians() { - return bearing; - } - - /** - * Returns the bullet that hit your robot. - * - * @return the bullet that hit your robot - */ - public Bullet getBullet() { - return bullet; - } - - /** - * Returns the heading of the bullet when it hit you, in degrees - * (0 <= getHeading() < 360). - *

- * Note: This is not relative to the direction you are facing. The robot - * that fired the bullet was in the opposite direction of getHeading() when - * it fired the bullet. - * - * @return the heading of the bullet, in degrees - */ - public double getHeading() { - return bullet.getHeading(); - } - - /** - * @return the heading of the bullet, in degrees - * @deprecated Use {@link #getHeading()} instead. - */ - @Deprecated - public double getHeadingDegrees() { - return getHeading(); - } - - /** - * Returns the heading of the bullet when it hit you, in radians - * (0 <= getHeadingRadians() < 2 * PI). - *

- * Note: This is not relative to the direction you are facing. The robot - * that fired the bullet was in the opposite direction of - * getHeadingRadians() when it fired the bullet. - * - * @return the heading of the bullet, in radians - */ - public double getHeadingRadians() { - return bullet.getHeadingRadians(); - } - - /** - * Returns the name of the robot that fired the bullet. - * - * @return the name of the robot that fired the bullet - */ - public String getName() { - return bullet.getName(); - } - - /** - * Returns the power of this bullet. The damage you take (in fact, already - * took) is 4 * power, plus 2 * (power-1) if power > 1. The robot that fired - * the bullet receives 3 * power back. - * - * @return the power of the bullet - */ - public double getPower() { - return bullet.getPower(); - } - - /** - * Returns the velocity of this bullet. - * - * @return the velocity of the bullet - */ - public double getVelocity() { - return bullet.getVelocity(); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onHitByBullet(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.HitByBulletEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - HitByBulletEvent obj = (HitByBulletEvent) object; - - return RbSerializer.SIZEOF_TYPEINFO + serializer.sizeOf(RbSerializer.Bullet_TYPE, obj.bullet) - + RbSerializer.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - HitByBulletEvent obj = (HitByBulletEvent) object; - - serializer.serialize(buffer, RbSerializer.Bullet_TYPE, obj.bullet); - serializer.serialize(buffer, obj.bearing); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - Bullet bullet = (Bullet) serializer.deserializeAny(buffer); - double bearing = buffer.getDouble(); - - return new HitByBulletEvent(bearing, bullet); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitRobotEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitRobotEvent.java deleted file mode 100644 index 81307c2..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitRobotEvent.java +++ /dev/null @@ -1,209 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A HitRobotEvent is sent to {@link Robot#onHitRobot(HitRobotEvent) onHitRobot()} - * when your robot collides with another robot. - * You can use the information contained in this event to determine what to do. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class HitRobotEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 40; - - private final String robotName; - private final double bearing; - private final double energy; - private final boolean atFault; - - /** - * Called by the game to create a new HitRobotEvent. - * - * @param name the name of the robot you hit - * @param bearing the bearing to the robot that your robot hit, in radians - * @param energy the amount of energy of the robot you hit - * @param atFault {@code true} if your robot was moving toward the other - * robot; {@code false} otherwise - */ - public HitRobotEvent(String name, double bearing, double energy, boolean atFault) { - this.robotName = name; - this.bearing = bearing; - this.energy = energy; - this.atFault = atFault; - } - - /** - * Returns the bearing to the robot you hit, relative to your robot's - * heading, in degrees (-180 <= getBearing() < 180) - * - * @return the bearing to the robot you hit, in degrees - */ - public double getBearing() { - return bearing * 180.0 / Math.PI; - } - - /** - * @return the bearing to the robot you hit, in degrees - * @deprecated Use {@link #getBearing()} instead. - */ - @Deprecated - public double getBearingDegrees() { - return getBearing(); - } - - /** - * Returns the bearing to the robot you hit, relative to your robot's - * heading, in radians (-PI <= getBearingRadians() < PI) - * - * @return the bearing to the robot you hit, in radians - */ - public double getBearingRadians() { - return bearing; - } - - /** - * Returns the amount of energy of the robot you hit. - * - * @return the amount of energy of the robot you hit - */ - public double getEnergy() { - return energy; - } - - /** - * Returns the name of the robot you hit. - * - * @return the name of the robot you hit - */ - public String getName() { - return robotName; - } - - /** - * @return the name of the robot you hit - * @deprecated Use {@link #getName()} instead. - */ - @Deprecated - public String getRobotName() { - return robotName; - } - - /** - * Checks if your robot was moving towards the robot that was hit. - *

- * If {@link #isMyFault()} returns {@code true} then your robot's movement - * (including turning) will have stopped and been marked complete. - *

- * Note: If two robots are moving toward each other and collide, they will - * each receive two HitRobotEvents. The first will be the one if - * {@link #isMyFault()} returns {@code true}. - * - * @return {@code true} if your robot was moving towards the robot that was - * hit; {@code false} otherwise. - */ - public boolean isMyFault() { - return atFault; - } - - /** - * {@inheritDoc} - */ - @Override - public final int compareTo(Event event) { - final int res = super.compareTo(event); - - if (res != 0) { - return res; - } - - // Compare the isMyFault, if the events are HitRobotEvents - // The isMyFault has higher priority when it is set compared to when it is not set - if (event instanceof HitRobotEvent) { - int compare1 = (this).isMyFault() ? -1 : 0; - int compare2 = ((HitRobotEvent) event).isMyFault() ? -1 : 0; - - return compare1 - compare2; - } - - // No difference found - return 0; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onHitRobot(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.HitRobotEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - HitRobotEvent obj = (HitRobotEvent) object; - - return RbSerializer.SIZEOF_TYPEINFO + serializer.sizeOf(obj.robotName) + 2 * RbSerializer.SIZEOF_DOUBLE - + RbSerializer.SIZEOF_BOOL; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - HitRobotEvent obj = (HitRobotEvent) object; - - serializer.serialize(buffer, obj.robotName); - serializer.serialize(buffer, obj.bearing); - serializer.serialize(buffer, obj.energy); - serializer.serialize(buffer, obj.atFault); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - String robotName = serializer.deserializeString(buffer); - double bearing = buffer.getDouble(); - double energy = buffer.getDouble(); - boolean atFault = serializer.deserializeBoolean(buffer); - - return new HitRobotEvent(robotName, bearing, energy, atFault); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitWallEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitWallEvent.java deleted file mode 100644 index 4043070..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/HitWallEvent.java +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A HitWallEvent is sent to {@link Robot#onHitWall(HitWallEvent) onHitWall()} - * when you collide a wall. - * You can use the information contained in this event to determine what to do. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class HitWallEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 30; - - private final double bearing; - - /** - * Called by the game to create a new HitWallEvent. - * - * @param bearing the bearing to the wall that your robot hit, in radians - */ - public HitWallEvent(double bearing) { - this.bearing = bearing; - } - - /** - * Returns the bearing to the wall you hit, relative to your robot's - * heading, in degrees (-180 <= getBearing() < 180) - * - * @return the bearing to the wall you hit, in degrees - */ - public double getBearing() { - return bearing * 180.0 / Math.PI; - } - - /** - * @return the bearing to the wall you hit, in degrees - * @deprecated Use {@link #getBearing()} instead. - */ - @Deprecated - public double getBearingDegrees() { - return getBearing(); - } - - /** - * Returns the bearing to the wall you hit, relative to your robot's - * heading, in radians (-PI <= getBearingRadians() < PI) - * - * @return the bearing to the wall you hit, in radians - */ - public double getBearingRadians() { - return bearing; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onHitWall(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.HitWallEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - HitWallEvent obj = (HitWallEvent) object; - - serializer.serialize(buffer, obj.bearing); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - double bearing = buffer.getDouble(); - - return new HitWallEvent(bearing); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/JuniorRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/JuniorRobot.java deleted file mode 100644 index 8531c7b..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/JuniorRobot.java +++ /dev/null @@ -1,907 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IJuniorRobot; -import robocode.robotinterfaces.peer.IJuniorRobotPeer; -import robocode.util.Utils; - -import java.awt.*; -import static java.lang.Math.toRadians; - - -/** - * This is the simplest robot type, which is simpler than the {@link Robot} and - * {@link AdvancedRobot} classes. The JuniorRobot has a simplified model, in - * purpose of teaching programming skills to inexperienced in programming - * students. The simplified robot model will keep player from overwhelming of - * Robocode's rules, programming syntax and programming concept. - *

- * Instead of using getters and setters, public fields are provided for - * receiving information like the last scanned robot, the coordinate of the - * robot etc. - *

- * All methods on this class are blocking calls, i.e. they do not return before - * their action has been completed and will at least take one turn to execute. - * However, setting colors is executed immediately and does not cost a turn to - * perform. - * - * @see Robot - * @see AdvancedRobot - * @see TeamRobot - * @see RateControlRobot - * @see Droid - * @see BorderSentry - * - * @author Nutch Poovarawan from Cubic Creative (designer) - * @author Flemming N. Larsen (original) - * @author Pavel Savara (contributor) - * - * @since 1.4 - */ -public class JuniorRobot extends _RobotBase implements IJuniorRobot { - - /** - * The color black (0x000000) - */ - public final static int black = 0x000000; - - /** - * The color white (0xFFFFFF) - */ - public final static int white = 0xFFFFFF; - - /** - * The color red (0xFF0000) - */ - public final static int red = 0xFF0000; - - /** - * The color orange (0xFFA500) - */ - public final static int orange = 0xFFA500; - - /** - * The color yellow (0xFFFF00) - */ - public final static int yellow = 0xFFFF00; - - /** - * The color green (0x008000) - */ - public final static int green = 0x008000; - - /** - * The color blue (0x0000FF) - */ - public final static int blue = 0x0000FF; - - /** - * The color purple (0x800080) - */ - public final static int purple = 0x800080; - - /** - * The color brown (0x8B4513) - */ - public final static int brown = 0x8B4513; - - /** - * The color gray (0x808080) - */ - public final static int gray = 0x808080; - - /** - * Contains the width of the battlefield. - * - * @see #fieldWidth - */ - public int fieldWidth; - - /** - * Contains the height of the battlefield. - * - * @see #fieldWidth - */ - public int fieldHeight; - - /** - * Current number of other robots on the battle field. - */ - public int others; - - /** - * Current energy of this robot, where 100 means full energy and 0 means no energy (dead). - */ - public int energy; - - /** - * Current horizontal location of this robot (in pixels). - * - * @see #robotY - */ - public int robotX; - - /** - * Current vertical location of this robot (in pixels). - * - * @see #robotX - */ - public int robotY; - - /** - * Current heading angle of this robot (in degrees). - * - * @see #turnLeft(int) - * @see #turnRight(int) - * @see #turnTo(int) - * @see #turnAheadLeft(int, int) - * @see #turnAheadRight(int, int) - * @see #turnBackLeft(int, int) - * @see #turnBackRight(int, int) - */ - public int heading; - - /** - * Current gun heading angle of this robot (in degrees). - * - * @see #gunBearing - * @see #turnGunLeft(int) - * @see #turnGunRight(int) - * @see #turnGunTo(int) - * @see #bearGunTo(int) - */ - public int gunHeading; - - /** - * Current gun heading angle of this robot compared to its body (in degrees). - * - * @see #gunHeading - * @see #turnGunLeft(int) - * @see #turnGunRight(int) - * @see #turnGunTo(int) - * @see #bearGunTo(int) - */ - public int gunBearing; - - /** - * Flag specifying if the gun is ready to fire, i.e. gun heat <= 0. - * {@code true} means that the gun is able to fire; {@code false} - * means that the gun cannot fire yet as it still needs to cool down. - * - * @see #fire() - * @see #fire(double) - */ - public boolean gunReady; - - /** - * Current distance to the scanned nearest other robot (in pixels). - * If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - * This field will not be updated while {@link #onScannedRobot()} event is active. - * - * @see #onScannedRobot() - * @see #scannedAngle - * @see #scannedBearing - * @see #scannedEnergy - * @see #scannedVelocity - * @see #scannedHeading - */ - public int scannedDistance = -1; - - /** - * Current angle to the scanned nearest other robot (in degrees). - * If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - * This field will not be updated while {@link #onScannedRobot()} event is active. - * - * @see #onScannedRobot() - * @see #scannedDistance - * @see #scannedBearing - * @see #scannedEnergy - * @see #scannedVelocity - * @see #scannedHeading - */ - public int scannedAngle = -1; - - /** - * Current angle to the scanned nearest other robot (in degrees) compared to - * the body of this robot. - * If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - * This field will not be updated while {@link #onScannedRobot()} event is active. - * - * @see #onScannedRobot() - * @see #scannedDistance - * @see #scannedAngle - * @see #scannedEnergy - * @see #scannedVelocity - * @see #scannedHeading - */ - public int scannedBearing = -1; - - /** - * Current velocity of the scanned nearest other robot. - * If there is no robot in the radar's sight, this field will be -99. - * Note that a positive value means that the robot moves forward, a negative - * value means that the robot moved backward, and 0 means that the robot is - * not moving at all. - * This field will not be updated while {@link #onScannedRobot()} event is active. - * - * @see #onScannedRobot() - * @see #scannedDistance - * @see #scannedAngle - * @see #scannedBearing - * @see #scannedEnergy - * @see #scannedHeading - */ - public int scannedVelocity = -99; - - /** - * Current heading of the scanned nearest other robot (in degrees). - * If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - * This field will not be updated while {@link #onScannedRobot()} event is active. - * - * @see #onScannedRobot() - * @see #scannedDistance - * @see #scannedAngle - * @see #scannedBearing - * @see #scannedEnergy - * @see #scannedVelocity - */ - public int scannedHeading = -1; - - /** - * Current energy of scanned nearest other robot. - * If there is no robot in the radar's sight, this field will be less than 0, i.e -1. - * This field will not be updated while {@link #onScannedRobot()} event is active. - * - * @see #onScannedRobot() - * @see #scannedDistance - * @see #scannedAngle - * @see #scannedBearing - * @see #scannedVelocity - */ - public int scannedEnergy = -1; - - /** - * Latest angle from where this robot was hit by a bullet (in degrees). - * If the robot has never been hit, this field will be less than 0, i.e. -1. - * This field will not be updated while {@link #onHitByBullet()} event is active. - * - * @see #onHitByBullet() - * @see #hitByBulletBearing - */ - public int hitByBulletAngle = -1; - - /** - * Latest angle from where this robot was hit by a bullet (in degrees) - * compared to the body of this robot. - * If the robot has never been hit, this field will be less than 0, i.e. -1. - * This field will not be updated while {@link #onHitByBullet()} event is active. - * - * @see #onHitByBullet() - * @see #hitByBulletAngle - */ - public int hitByBulletBearing = -1; - - /** - * Latest angle where this robot has hit another robot (in degrees). - * If this robot has never hit another robot, this field will be less than 0, i.e. -1. - * This field will not be updated while {@link #onHitRobot()} event is active. - * - * @see #onHitRobot() - * @see #hitRobotBearing - */ - public int hitRobotAngle = -1; - - /** - * Latest angle where this robot has hit another robot (in degrees) - * compared to the body of this robot. - * If this robot has never hit another robot, this field will be less than 0, i.e. -1. - * This field will not be updated while {@link #onHitRobot()} event is active. - * - * @see #onHitRobot() - * @see #hitRobotAngle - */ - public int hitRobotBearing = -1; - - /** - * Latest angle where this robot has hit a wall (in degrees). - * If this robot has never hit a wall, this field will be less than 0, i.e. -1. - * This field will not be updated while {@link #onHitWall()} event is active. - * - * @see #onHitWall() - * @see #hitWallBearing - */ - public int hitWallAngle = -1; - - /** - * Latest angle where this robot has hit a wall (in degrees) - * compared to the body of this robot. - * If this robot has never hit a wall, this field will be less than 0, i.e. -1. - * This field will not be updated while {@link #onHitWall()} event is active. - * - * @see #onHitWall() - * @see #hitWallAngle - */ - public int hitWallBearing = -1; - - /** - * The robot event handler for this robot. - */ - private InnerEventHandler innerEventHandler; - - /** - * Moves this robot forward by pixels. - * - * @param distance the amount of pixels to move forward - * @see #back(int) - * @see #robotX - * @see #robotY - */ - public void ahead(int distance) { - if (peer != null) { - peer.move(distance); - } else { - uninitializedException(); - } - } - - /** - * Moves this robot backward by pixels. - * - * @param distance the amount of pixels to move backward - * @see #ahead(int) - * @see #robotX - * @see #robotY - */ - public void back(int distance) { - ahead(-distance); - } - - /** - * Turns the gun to the specified angle (in degrees) relative to body of this robot. - * The gun will turn to the side with the shortest delta angle to the specified angle. - * - * @param angle the angle to turn the gun to relative to the body of this robot - * @see #gunHeading - * @see #gunBearing - * @see #turnGunLeft(int) - * @see #turnGunRight(int) - * @see #turnGunTo(int) - */ - public void bearGunTo(int angle) { - if (peer != null) { - peer.turnGun(Utils.normalRelativeAngle(peer.getBodyHeading() + toRadians(angle) - peer.getGunHeading())); - } else { - uninitializedException(); - } - } - - /** - * Skips a turn. - * - * @see #doNothing(int) - */ - public void doNothing() { - if (peer != null) { - peer.execute(); - } else { - uninitializedException(); - } - } - - /** - * Skips the specified number of turns. - * - * @param turns the number of turns to skip - * @see #doNothing() - */ - public void doNothing(int turns) { - if (turns <= 0) { - return; - } - if (peer != null) { - for (int i = 0; i < turns; i++) { - peer.execute(); - } - } else { - uninitializedException(); - } - } - - /** - * Fires a bullet with the default power of 1. - * If the gun heat is more than 0 and hence cannot fire, this method will - * suspend until the gun is ready to fire, and then fire a bullet. - * - * @see #gunReady - */ - public void fire() { - fire(1); - } - - /** - * Fires a bullet with the specified bullet power, which is between 0.1 and 3 - * where 3 is the maximum bullet power. - * If the gun heat is more than 0 and hence cannot fire, this method will - * suspend until the gun is ready to fire, and then fire a bullet. - * - * @param power between 0.1 and 3 - * @see #gunReady - */ - public void fire(double power) { - if (peer != null) { - getEventHandler().juniorFirePower = power; - peer.execute(); - } else { - uninitializedException(); - } - } - - /** - * Do not call this method! - *

- * {@inheritDoc} - */ - public final IBasicEvents getBasicEventListener() { - return getEventHandler(); - } - - /** - * Do not call this method! - *

- * {@inheritDoc} - */ - public final Runnable getRobotRunnable() { - return getEventHandler(); - } - - /** - * This event methods is called from the game when this robot has been hit - * by another robot's bullet. When this event occurs the - * {@link #hitByBulletAngle} and {@link #hitByBulletBearing} fields values - * are automatically updated. - * - * @see #hitByBulletAngle - * @see #hitByBulletBearing - */ - public void onHitByBullet() {} - - /** - * This event methods is called from the game when a bullet from this robot - * has hit another robot. When this event occurs the {@link #hitRobotAngle} - * and {@link #hitRobotBearing} fields values are automatically updated. - * - * @see #hitRobotAngle - * @see #hitRobotBearing - */ - public void onHitRobot() {} - - /** - * This event methods is called from the game when this robot has hit a wall. - * When this event occurs the {@link #hitWallAngle} and {@link #hitWallBearing} - * fields values are automatically updated. - * - * @see #hitWallAngle - * @see #hitWallBearing - */ - public void onHitWall() {} - - /** - * This event method is called from the game when the radar detects another - * robot. When this event occurs the {@link #scannedDistance}, - * {@link #scannedAngle}, {@link #scannedBearing}, and {@link #scannedEnergy} - * field values are automatically updated. - * - * @see #scannedDistance - * @see #scannedAngle - * @see #scannedBearing - * @see #scannedEnergy - */ - public void onScannedRobot() {} - - /** - * The main method in every robot. You must override this to set up your - * robot's basic behavior. - *

- * Example: - *

-	 *   // A basic robot that moves around in a square
-	 *   public void run() {
-	 *       ahead(100);
-	 *       turnRight(90);
-	 *   }
-	 * 
- * This method is automatically re-called when it has returned. - */ - public void run() {} - - /** - * Sets the colors of the robot. The color values are RGB values. - * You can use the colors that are already defined for this class. - * - * @param bodyColor the RGB color value for the body - * @param gunColor the RGB color value for the gun - * @param radarColor the RGB color value for the radar - * @see #setColors(int, int, int, int, int) - */ - public void setColors(int bodyColor, int gunColor, int radarColor) { - if (peer != null) { - peer.setBodyColor(new Color(bodyColor)); - peer.setGunColor(new Color(gunColor)); - peer.setRadarColor(new Color(radarColor)); - } else { - uninitializedException(); - } - } - - /** - * Sets the colors of the robot. The color values are RGB values. - * You can use the colors that are already defined for this class. - * - * @param bodyColor the RGB color value for the body - * @param gunColor the RGB color value for the gun - * @param radarColor the RGB color value for the radar - * @param bulletColor the RGB color value for the bullets - * @param scanArcColor the RGB color value for the scan arc - * @see #setColors(int, int, int) - */ - public void setColors(int bodyColor, int gunColor, int radarColor, int bulletColor, int scanArcColor) { - if (peer != null) { - peer.setBodyColor(new Color(bodyColor)); - peer.setGunColor(new Color(gunColor)); - peer.setRadarColor(new Color(radarColor)); - peer.setBulletColor(new Color(bulletColor)); - peer.setScanColor(new Color(scanArcColor)); - } else { - uninitializedException(); - } - } - - /** - * Moves this robot forward by pixels and turns this robot left by degrees - * at the same time. The robot will move in a curve that follows a perfect - * circle, and the moving and turning will end at the same time. - *

- * Note that the max. velocity and max. turn rate is automatically adjusted, - * which means that the robot will move slower the sharper the turn is - * compared to the distance. - * - * @param distance the amount of pixels to move forward - * @param degrees the amount of degrees to turn to the left - * @see #heading - * @see #robotX - * @see #robotY - * @see #turnLeft(int) - * @see #turnRight(int) - * @see #turnTo(int) - * @see #turnAheadRight(int, int) - * @see #turnBackLeft(int, int) - * @see #turnBackRight(int, int) - */ - public void turnAheadLeft(int distance, int degrees) { - turnAheadRight(distance, -degrees); - } - - /** - * Moves this robot forward by pixels and turns this robot right by degrees - * at the same time. The robot will move in a curve that follows a perfect - * circle, and the moving and turning will end at the same time. - *

- * Note that the max. velocity and max. turn rate is automatically adjusted, - * which means that the robot will move slower the sharper the turn is - * compared to the distance. - * - * @param distance the amount of pixels to move forward - * @param degrees the amount of degrees to turn to the right - * @see #heading - * @see #robotX - * @see #robotY - * @see #turnLeft(int) - * @see #turnRight(int) - * @see #turnTo(int) - * @see #turnAheadLeft(int, int) - * @see #turnBackLeft(int, int) - * @see #turnBackRight(int, int) - */ - public void turnAheadRight(int distance, int degrees) { - if (peer != null) { - ((IJuniorRobotPeer) peer).turnAndMove(distance, toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Moves this robot backward by pixels and turns this robot left by degrees - * at the same time. The robot will move in a curve that follows a perfect - * circle, and the moving and turning will end at the same time. - *

- * Note that the max. velocity and max. turn rate is automatically adjusted, - * which means that the robot will move slower the sharper the turn is - * compared to the distance. - * - * @param distance the amount of pixels to move backward - * @param degrees the amount of degrees to turn to the left - * @see #heading - * @see #robotX - * @see #robotY - * @see #turnLeft(int) - * @see #turnRight(int) - * @see #turnTo(int) - * @see #turnAheadLeft(int, int) - * @see #turnAheadRight(int, int) - * @see #turnBackRight(int, int) - */ - public void turnBackLeft(int distance, int degrees) { - turnAheadRight(-distance, degrees); - } - - /** - * Moves this robot backward by pixels and turns this robot right by degrees - * at the same time. The robot will move in a curve that follows a perfect - * circle, and the moving and turning will end at the same time. - *

- * Note that the max. velocity and max. turn rate is automatically adjusted, - * which means that the robot will move slower the sharper the turn is - * compared to the distance. - * - * @param distance the amount of pixels to move backward - * @param degrees the amount of degrees to turn to the right - * @see #heading - * @see #robotX - * @see #robotY - * @see #turnLeft(int) - * @see #turnRight(int) - * @see #turnTo(int) - * @see #turnAheadLeft(int, int) - * @see #turnAheadRight(int, int) - * @see #turnBackLeft(int, int) - */ - public void turnBackRight(int distance, int degrees) { - turnAheadRight(-distance, -degrees); - } - - /** - * Turns the gun left by degrees. - * - * @param degrees the amount of degrees to turn the gun to the left - * @see #gunHeading - * @see #gunBearing - * @see #turnGunRight(int) - * @see #turnGunTo(int) - * @see #bearGunTo(int) - */ - public void turnGunLeft(int degrees) { - turnGunRight(-degrees); - } - - /** - * Turns the gun right by degrees. - * - * @param degrees the amount of degrees to turn the gun to the right - * @see #gunHeading - * @see #gunBearing - * @see #turnGunLeft(int) - * @see #turnGunTo(int) - * @see #bearGunTo(int) - */ - public void turnGunRight(int degrees) { - if (peer != null) { - peer.turnGun(toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Turns the gun to the specified angle (in degrees). - * The gun will turn to the side with the shortest delta angle to the - * specified angle. - * - * @param angle the angle to turn the gun to - * @see #gunHeading - * @see #gunBearing - * @see #turnGunLeft(int) - * @see #turnGunRight(int) - * @see #bearGunTo(int) - */ - public void turnGunTo(int angle) { - if (peer != null) { - peer.turnGun(Utils.normalRelativeAngle(toRadians(angle) - peer.getGunHeading())); - } else { - uninitializedException(); - } - } - - /** - * Turns this robot left by degrees. - * - * @param degrees the amount of degrees to turn to the left - * @see #heading - * @see #turnRight(int) - * @see #turnTo(int) - * @see #turnAheadLeft(int, int) - * @see #turnAheadRight(int, int) - * @see #turnBackLeft(int, int) - * @see #turnBackRight(int, int) - */ - public void turnLeft(int degrees) { - turnRight(-degrees); - } - - /** - * Turns this robot right by degrees. - * - * @param degrees the amount of degrees to turn to the right - * @see #heading - * @see #turnLeft(int) - * @see #turnTo(int) - * @see #turnAheadLeft(int, int) - * @see #turnAheadRight(int, int) - * @see #turnBackLeft(int, int) - * @see #turnBackRight(int, int) - */ - public void turnRight(int degrees) { - if (peer != null) { - peer.turnBody(toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Turns this robot to the specified angle (in degrees). - * The robot will turn to the side with the shortest delta angle to the - * specified angle. - * - * @param angle the angle to turn this robot to - * @see #heading - * @see #turnLeft(int) - * @see #turnRight(int) - * @see #turnAheadLeft(int, int) - * @see #turnAheadRight(int, int) - * @see #turnBackLeft(int, int) - * @see #turnBackRight(int, int) - */ - public void turnTo(int angle) { - if (peer != null) { - peer.turnBody(Utils.normalRelativeAngle(toRadians(angle) - peer.getBodyHeading())); - } else { - uninitializedException(); - } - } - - /* - * Returns the event handler of this robot. - */ - private InnerEventHandler getEventHandler() { - if (innerEventHandler == null) { - innerEventHandler = new InnerEventHandler(); - } - return innerEventHandler; - } - - /* - * The JuniorRobot event handler, which implements the basic robot events, - * JuniorRobot event, and Runnable. - */ - private final class InnerEventHandler implements IBasicEvents, Runnable { - - private double juniorFirePower; - private long currentTurn; - - public void onBulletHit(BulletHitEvent event) {} - - public void onBulletHitBullet(BulletHitBulletEvent event) {} - - public void onBulletMissed(BulletMissedEvent event) {} - - public void onDeath(DeathEvent event) {} - - public void onHitByBullet(HitByBulletEvent event) { - double angle = peer.getBodyHeading() + event.getBearingRadians(); - - hitByBulletAngle = (int) (Math.toDegrees(Utils.normalAbsoluteAngle(angle)) + 0.5); - hitByBulletBearing = (int) (event.getBearing() + 0.5); - JuniorRobot.this.onHitByBullet(); - } - - public void onHitRobot(HitRobotEvent event) { - double angle = peer.getBodyHeading() + event.getBearingRadians(); - - hitRobotAngle = (int) (Math.toDegrees(Utils.normalAbsoluteAngle(angle)) + 0.5); - hitRobotBearing = (int) (event.getBearing() + 0.5); - JuniorRobot.this.onHitRobot(); - } - - public void onHitWall(HitWallEvent event) { - double angle = peer.getBodyHeading() + event.getBearingRadians(); - - hitWallAngle = (int) (Math.toDegrees(Utils.normalAbsoluteAngle(angle)) + 0.5); - hitWallBearing = (int) (event.getBearing() + 0.5); - JuniorRobot.this.onHitWall(); - } - - public void onRobotDeath(RobotDeathEvent event) { - others = peer.getOthers(); - } - - public void onScannedRobot(ScannedRobotEvent event) { - scannedDistance = (int) (event.getDistance() + 0.5); - scannedEnergy = Math.max(1, (int) (event.getEnergy() + 0.5)); - scannedAngle = (int) (Math.toDegrees( - Utils.normalAbsoluteAngle(peer.getBodyHeading() + event.getBearingRadians())) - + 0.5); - scannedBearing = (int) (event.getBearing() + 0.5); - scannedHeading = (int) (event.getHeading() + 0.5); - scannedVelocity = (int) (event.getVelocity() + 0.5); - - JuniorRobot.this.onScannedRobot(); - } - - public void onStatus(StatusEvent e) { - final RobotStatus s = e.getStatus(); - - others = peer.getOthers(); - energy = Math.max(1, (int) (s.getEnergy() + 0.5)); - robotX = (int) (s.getX() + 0.5); - robotY = (int) (s.getY() + 0.5); - heading = (int) (s.getHeading() + 0.5); - gunHeading = (int) (s.getGunHeading() + 0.5); - gunBearing = (int) (Utils.normalRelativeAngle(s.getGunHeading() - s.getHeading()) + 0.5); - gunReady = (s.getGunHeat() <= 0); - - currentTurn = e.getTime(); - - // Auto fire - if (juniorFirePower > 0 && gunReady && (peer.getGunTurnRemaining() == 0)) { - if (peer.setFire(juniorFirePower) != null) { - gunReady = false; - juniorFirePower = 0; - } - } - - // Reset event data - scannedDistance = -1; - scannedAngle = -1; - scannedBearing = -1; - scannedVelocity = -99; - scannedHeading = -1; - scannedEnergy = -1; - hitByBulletAngle = -1; - hitByBulletBearing = -1; - hitRobotAngle = -1; - hitRobotBearing = -1; - hitWallAngle = -1; - hitWallBearing = -1; - } - - public void onWin(WinEvent event) {} - - public void run() { - fieldWidth = (int) (peer.getBattleFieldWidth() + 0.5); - fieldHeight = (int) (peer.getBattleFieldHeight() + 0.5); - - // noinspection InfiniteLoopStatement - while (true) { - long lastTurn = currentTurn; // Used for the rescan check - - JuniorRobot.this.run(); // Run the code in the JuniorRobot - - // Make sure that we rescan if the robot did not execute anything this turn. - // When the robot executes the currentTurn will automatically be increased by 1, - // So when the turn stays the same, the robot did not take any action this turn. - if (lastTurn == currentTurn) { - peer.rescan(); // Spend a turn on rescanning - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyEvent.java deleted file mode 100644 index 4189d3e..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * Super class of all events that originates from the keyboard. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public abstract class KeyEvent extends Event { - private static final long serialVersionUID = 1L; - private final java.awt.event.KeyEvent source; - - /** - * Called by the game to create a new KeyEvent. - * - * @param source the source key event originating from the AWT. - */ - public KeyEvent(java.awt.event.KeyEvent source) { - this.source = source; - } - - /** - * Do not call this method! - *

- * This method is used by the game to determine the type of the source key - * event that occurred in the AWT. - * - * @return the source key event that originates from the AWT. - */ - public java.awt.event.KeyEvent getSourceEvent() { - return source; - } - -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyPressedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyPressedEvent.java deleted file mode 100644 index ba8d1f8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyPressedEvent.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A KeyPressedEvent is sent to {@link Robot#onKeyPressed(java.awt.event.KeyEvent) - * onKeyPressed()} when a key has been pressed on the keyboard. - * - * @see KeyReleasedEvent - * @see KeyTypedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class KeyPressedEvent extends KeyEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new KeyPressedEvent. - * - * @param source the source key event originating from the AWT. - */ - public KeyPressedEvent(java.awt.event.KeyEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onKeyPressed(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.KeyPressedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_CHAR + RbSerializer.SIZEOF_INT - + RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG + RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_INT; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - KeyPressedEvent obj = (KeyPressedEvent) object; - java.awt.event.KeyEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getKeyChar()); - serializer.serialize(buffer, src.getKeyCode()); - serializer.serialize(buffer, src.getKeyLocation()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - char keyChar = buffer.getChar(); - int keyCode = buffer.getInt(); - int keyLocation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new KeyPressedEvent( - new java.awt.event.KeyEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, keyCode, keyChar, - keyLocation)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyReleasedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyReleasedEvent.java deleted file mode 100644 index 0c44ab8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyReleasedEvent.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A KeyReleasedEvent is sent to {@link Robot#onKeyReleased(java.awt.event.KeyEvent) - * onKeyReleased()} when a key has been released on the keyboard. - * - * @see KeyPressedEvent - * @see KeyTypedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class KeyReleasedEvent extends KeyEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new KeyReleasedEvent. - * - * @param source the source key event originating from the AWT. - */ - public KeyReleasedEvent(java.awt.event.KeyEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onKeyReleased(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.KeyReleasedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_CHAR + RbSerializer.SIZEOF_INT - + RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG + RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_INT; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - KeyReleasedEvent obj = (KeyReleasedEvent) object; - java.awt.event.KeyEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getKeyChar()); - serializer.serialize(buffer, src.getKeyCode()); - serializer.serialize(buffer, src.getKeyLocation()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - char keyChar = buffer.getChar(); - int keyCode = buffer.getInt(); - int keyLocation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new KeyReleasedEvent( - new java.awt.event.KeyEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, keyCode, keyChar, - keyLocation)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyTypedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyTypedEvent.java deleted file mode 100644 index 271b0f1..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/KeyTypedEvent.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A KeyTypedEvent is sent to {@link Robot#onKeyTyped(java.awt.event.KeyEvent) - * onKeyTyped()} when a key has been typed (pressed and released) on the keyboard. - * - * @see KeyPressedEvent - * @see KeyReleasedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class KeyTypedEvent extends KeyEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new KeyTypedEvent. - * - * @param source the source key event originating from the AWT. - */ - public KeyTypedEvent(java.awt.event.KeyEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onKeyTyped(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.KeyTypedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_CHAR + RbSerializer.SIZEOF_INT - + RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG + RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_INT; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - KeyTypedEvent obj = (KeyTypedEvent) object; - java.awt.event.KeyEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getKeyChar()); - serializer.serialize(buffer, src.getKeyCode()); - serializer.serialize(buffer, src.getKeyLocation()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - char keyChar = buffer.getChar(); - int keyCode = buffer.getInt(); - int keyLocation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new KeyTypedEvent( - new java.awt.event.KeyEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, keyCode, keyChar, - keyLocation)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MessageEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MessageEvent.java deleted file mode 100644 index c9bbf08..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MessageEvent.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.ITeamEvents; -import robocode.robotinterfaces.ITeamRobot; - -import java.awt.*; -import java.io.Serializable; - - -/** - * A MessageEvent is sent to {@link TeamRobot#onMessageReceived(MessageEvent) - * onMessageReceived()} when a teammate sends a message to your robot. - * You can use the information contained in this event to determine what to do. - * - * @author Mathew A. Nelson (original) - */ -public final class MessageEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 75; - - private final String sender; - private final Serializable message; - - /** - * Called by the game to create a new MessageEvent. - * - * @param sender the name of the sending robot - * @param message the message for your robot - */ - public MessageEvent(String sender, Serializable message) { - this.sender = sender; - this.message = message; - } - - /** - * Returns the name of the sending robot. - * - * @return the name of the sending robot - */ - public String getSender() { - return sender; - } - - /** - * Returns the message itself. - * - * @return the message - */ - public Serializable getMessage() { - return message; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isTeamRobot()) { - ITeamEvents listener = ((ITeamRobot) robot).getTeamEventListener(); - - if (listener != null) { - listener.onMessageReceived(this); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - throw new Error("Serialization of event type not supported"); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseClickedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseClickedEvent.java deleted file mode 100644 index 0cda6f9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseClickedEvent.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MouseClickedEvent is sent to {@link Robot#onMouseClicked(java.awt.event.MouseEvent) - * onMouseClicked()} when the mouse is clicked inside the battle view. - * - * @see MousePressedEvent - * @see MouseReleasedEvent - * @see MouseEnteredEvent - * @see MouseExitedEvent - * @see MouseMovedEvent - * @see MouseDraggedEvent - * @see MouseWheelMovedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MouseClickedEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MouseClickedEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseClickedEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMouseClicked(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MouseClickedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 6 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MouseClickedEvent obj = (MouseClickedEvent) object; - java.awt.event.MouseEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getButton()); - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseClickedEvent( - new java.awt.event.MouseEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, button)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseDraggedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseDraggedEvent.java deleted file mode 100644 index 4f57fe8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseDraggedEvent.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MouseDraggedEvent is sent to {@link Robot#onMouseDragged(java.awt.event.MouseEvent) - * onMouseDragged()} when the mouse is dragged inside the battle view. - * - * @see MouseClickedEvent - * @see MousePressedEvent - * @see MouseReleasedEvent - * @see MouseEnteredEvent - * @see MouseExitedEvent - * @see MouseMovedEvent - * @see MouseWheelMovedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MouseDraggedEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MouseDraggedEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseDraggedEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMouseDragged(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MouseDraggedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 6 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MouseDraggedEvent obj = (MouseDraggedEvent) object; - java.awt.event.MouseEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getButton()); - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseDraggedEvent( - new java.awt.event.MouseEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, button)); - } - } - -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEnteredEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEnteredEvent.java deleted file mode 100644 index 18a91f2..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEnteredEvent.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MouseEnteredEvent is sent to {@link Robot#onMouseEntered(java.awt.event.MouseEvent) - * onMouseEntered()} when the mouse has entered the battle view. - * - * @see MouseClickedEvent - * @see MousePressedEvent - * @see MouseReleasedEvent - * @see MouseExitedEvent - * @see MouseMovedEvent - * @see MouseDraggedEvent - * @see MouseWheelMovedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MouseEnteredEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MouseEnteredEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseEnteredEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMouseEntered(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MouseEnteredEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 6 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MouseEnteredEvent obj = (MouseEnteredEvent) object; - java.awt.event.MouseEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getButton()); - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseEnteredEvent( - new java.awt.event.MouseEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, button)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEvent.java deleted file mode 100644 index 62836c8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * Super class of all events that originates from the mouse. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public abstract class MouseEvent extends Event { - private static final long serialVersionUID = 1L; - private final java.awt.event.MouseEvent source; - - /** - * Called by the game to create a new MouseEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseEvent(java.awt.event.MouseEvent source) { - this.source = source; - } - - /** - * Do not call this method! - *

- * This method is used by the game to determine the type of the source mouse - * event that occurred in the AWT. - * - * @return the source mouse event that originates from the AWT. - */ - public java.awt.event.MouseEvent getSourceEvent() { - return source; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseExitedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseExitedEvent.java deleted file mode 100644 index f4e8907..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseExitedEvent.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MouseExitedEvent is sent to {@link Robot#onMouseExited(java.awt.event.MouseEvent) - * onMouseExited()} when the mouse has exited the battle view. - * - * @see MouseClickedEvent - * @see MousePressedEvent - * @see MouseReleasedEvent - * @see MouseEnteredEvent - * @see MouseMovedEvent - * @see MouseDraggedEvent - * @see MouseWheelMovedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MouseExitedEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MouseExitedEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseExitedEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMouseExited(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MouseExitedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 6 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MouseExitedEvent obj = (MouseExitedEvent) object; - java.awt.event.MouseEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getButton()); - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseExitedEvent( - new java.awt.event.MouseEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, button)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseMovedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseMovedEvent.java deleted file mode 100644 index 46cfa56..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseMovedEvent.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MouseMovedEvent is sent to {@link Robot#onMouseMoved(java.awt.event.MouseEvent) - * onMouseMoved()} when the mouse has moved inside the battle view. - * - * @see MouseClickedEvent - * @see MousePressedEvent - * @see MouseReleasedEvent - * @see MouseEnteredEvent - * @see MouseExitedEvent - * @see MouseDraggedEvent - * @see MouseWheelMovedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MouseMovedEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MouseMovedEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseMovedEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMouseMoved(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MouseMovedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 6 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MouseMovedEvent obj = (MouseMovedEvent) object; - java.awt.event.MouseEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getButton()); - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseMovedEvent( - new java.awt.event.MouseEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, button)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MousePressedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MousePressedEvent.java deleted file mode 100644 index 9b0ddb2..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MousePressedEvent.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MousePressedEvent is sent to {@link Robot#onMousePressed(java.awt.event.MouseEvent) - * onMousePressed()} when the mouse is pressed inside the battle view. - * - * @see MouseClickedEvent - * @see MouseReleasedEvent - * @see MouseEnteredEvent - * @see MouseExitedEvent - * @see MouseMovedEvent - * @see MouseDraggedEvent - * @see MouseWheelMovedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MousePressedEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MousePressedEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MousePressedEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMousePressed(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MousePressedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 6 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MousePressedEvent obj = (MousePressedEvent) object; - java.awt.event.MouseEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getButton()); - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MousePressedEvent( - new java.awt.event.MouseEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, button)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseReleasedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseReleasedEvent.java deleted file mode 100644 index 17a4323..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseReleasedEvent.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MouseReleasedEvent is sent to {@link Robot#onMouseReleased(java.awt.event.MouseEvent) - * onMouseReleased()} when the mouse is released inside the battle view. - * - * @see MouseClickedEvent - * @see MousePressedEvent - * @see MouseEnteredEvent - * @see MouseExitedEvent - * @see MouseMovedEvent - * @see MouseDraggedEvent - * @see MouseWheelMovedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MouseReleasedEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MouseReleasedEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseReleasedEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMouseReleased(getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MouseReleasedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 6 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MouseReleasedEvent obj = (MouseReleasedEvent) object; - java.awt.event.MouseEvent src = obj.getSourceEvent(); - - serializer.serialize(buffer, src.getButton()); - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int button = buffer.getInt(); - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseReleasedEvent( - new java.awt.event.MouseEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, button)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseWheelMovedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseWheelMovedEvent.java deleted file mode 100644 index cb6e27b..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MouseWheelMovedEvent.java +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.security.SafeComponent; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.IInteractiveRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A MouseWheelMovedEvent is sent to {@link Robot#onMouseWheelMoved(java.awt.event.MouseWheelEvent e) - * onMouseWheelMoved()} when the mouse wheel is rotated inside the battle view. - * - * @see MouseClickedEvent - * @see MousePressedEvent - * @see MouseReleasedEvent - * @see MouseEnteredEvent - * @see MouseExitedEvent - * @see MouseMovedEvent - * @see MouseDraggedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public final class MouseWheelMovedEvent extends MouseEvent { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 98; - - /** - * Called by the game to create a new MouseWheelMovedEvent. - * - * @param source the source mouse event originating from the AWT. - */ - public MouseWheelMovedEvent(java.awt.event.MouseEvent source) { - super(source); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isInteractiveRobot()) { - IInteractiveEvents listener = ((IInteractiveRobot) robot).getInteractiveEventListener(); - - if (listener != null) { - listener.onMouseWheelMoved((java.awt.event.MouseWheelEvent) getSourceEvent()); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.MouseWheelMovedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 8 * RbSerializer.SIZEOF_INT + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - MouseWheelMovedEvent obj = (MouseWheelMovedEvent) object; - java.awt.event.MouseWheelEvent src = (java.awt.event.MouseWheelEvent) obj.getSourceEvent(); - - serializer.serialize(buffer, src.getClickCount()); - serializer.serialize(buffer, src.getX()); - serializer.serialize(buffer, src.getY()); - serializer.serialize(buffer, src.getScrollType()); - serializer.serialize(buffer, src.getScrollAmount()); - serializer.serialize(buffer, src.getWheelRotation()); - serializer.serialize(buffer, src.getID()); - serializer.serialize(buffer, src.getModifiersEx()); - serializer.serialize(buffer, src.getWhen()); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int clickCount = buffer.getInt(); - int x = buffer.getInt(); - int y = buffer.getInt(); - int scrollType = buffer.getInt(); - int scrollAmount = buffer.getInt(); - int wheelRotation = buffer.getInt(); - int id = buffer.getInt(); - int modifiersEx = buffer.getInt(); - long when = buffer.getLong(); - - return new MouseWheelMovedEvent( - new java.awt.event.MouseWheelEvent(SafeComponent.getSafeEventComponent(), id, when, modifiersEx, x, y, - clickCount, false, scrollType, scrollAmount, wheelRotation)); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MoveCompleteCondition.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/MoveCompleteCondition.java deleted file mode 100644 index 00ea5fc..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/MoveCompleteCondition.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * A prebuilt condition you can use that indicates your robot has finished - * moving. - * - * @see Condition - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Nathaniel Troutman (contributor) - */ -public class MoveCompleteCondition extends Condition { - private AdvancedRobot robot; - - /** - * Creates a new MoveCompleteCondition with default priority. - * The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - */ - public MoveCompleteCondition(AdvancedRobot robot) { - super(); - this.robot = robot; - } - - /** - * Creates a new MoveCompleteCondition with the specified priority. - * A condition priority is a value from 0 - 99. The higher value, the - * higher priority. The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - * @param priority the priority of this condition - * @see Condition#setPriority(int) - */ - public MoveCompleteCondition(AdvancedRobot robot, int priority) { - super(); - this.robot = robot; - this.priority = priority; - } - - /** - * Tests if the robot has stopped moving. - * - * @return {@code true} if the robot has stopped moving; {@code false} - * otherwise - */ - @Override - public boolean test() { - return (robot.getDistanceRemaining() == 0); - } - - /** - * Called by the system in order to clean up references to internal objects. - * - * @since 1.4.3 - */ - @Override - public void cleanup() { - robot = null; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/PaintEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/PaintEvent.java deleted file mode 100644 index e189284..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/PaintEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.IPaintEvents; -import robocode.robotinterfaces.IPaintRobot; - -import java.awt.*; - - -/** - * This event occurs when your robot should paint, where the {@link - * Robot#onPaint(Graphics2D) onPaint()} is called on your robot. - *

- * You can use this event for setting the event priority by calling - * {@link AdvancedRobot#setEventPriority(String, int) - * setEventPriority("PaintEvent", priority)} - * - * @author Flemming N. Larsen (original) - */ -public final class PaintEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 5; - - /** - * Called by the game to create a new PaintEvent. - */ - public PaintEvent() { - super(); - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isPaintRobot()) { - IPaintEvents listener = ((IPaintRobot) robot).getPaintEventListener(); - - if (listener != null) { - listener.onPaint(graphics); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - throw new Error("Serialization of this type is not supported"); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RadarTurnCompleteCondition.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/RadarTurnCompleteCondition.java deleted file mode 100644 index e5fc586..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RadarTurnCompleteCondition.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * A prebuilt condition you can use that indicates your radar has finished - * turning. - * - * @see Condition - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Nathaniel Troutman (contributor) - */ -public class RadarTurnCompleteCondition extends Condition { - private AdvancedRobot robot; - - /** - * Creates a new RadarTurnCompleteCondition with default priority. - * The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - */ - public RadarTurnCompleteCondition(AdvancedRobot robot) { - super(); - this.robot = robot; - } - - /** - * Creates a new RadarTurnCompleteCondition with the specified priority. - * A condition priority is a value from 0 - 99. The higher value, the - * higher priority. The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - * @param priority the priority of this condition - * @see Condition#setPriority(int) - */ - public RadarTurnCompleteCondition(AdvancedRobot robot, int priority) { - super(); - this.robot = robot; - this.priority = priority; - } - - /** - * Tests if the radar has stopped turning. - * - * @return {@code true} if the radar has stopped turning; {@code false} - * otherwise - */ - @Override - public boolean test() { - return (robot.getRadarTurnRemaining() == 0); - } - - /** - * Called by the system in order to clean up references to internal objects. - * - * @since 1.4.3 - */ - @Override - public void cleanup() { - robot = null; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RateControlRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/RateControlRobot.java deleted file mode 100644 index 1cb647d..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RateControlRobot.java +++ /dev/null @@ -1,450 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import static java.lang.Math.toRadians; -import static java.lang.Math.toDegrees; - - -/** - * This advanced robot type allows you to set a rate for each of the robot's movements. - *

- * You can set the rate for:

    - *
  • velocity - pixels per turn
  • - *
  • robot turn - radians per turn
  • - *
  • gun rotation - radians per turn
  • - *
  • radar rotation - radians per turn
  • - *
- * When you set a rate for one of the above movements, the movement will continue the move by - * specified rate for ever, until the rate is changed. In order to move ahead or right, the - * rate must be set to a positive value. If a negative value is used instead, the movement - * will go back or to the left. In order to stop the movement, the rate must be - * set to 0. - *

- * Note: When calling {@code setVelocityRate()}, {@code setTurnRate()}, {@code setGunRotationRate()}, - * {@code setRadarRotationRate()} and variants, Any previous calls to "movement" functions outside of - * {@code RateControlRobot}, such as {@code setAhead()}, {@code setTurnLeft()}, - * {@code setTurnRadarRightRadians()} and similar will be overridden when calling the - * {@link #execute() execute()} on this robot class. - *

- * Look into the source code for the {@code sample.VelociRobot} in order to see how to use this - * robot type. - * - * @see JuniorRobot - * @see Robot - * @see AdvancedRobot - * @see TeamRobot - * @see Droid - * @see BorderSentry - * - * @author Joshua Galecki (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.7.1.3 - */ -public class RateControlRobot extends TeamRobot { - - private double velocityRate; // Pixels per turn - private double turnRate; // Radians per turn - private double gunRotationRate; // Radians per turn - private double radarRotationRate; // Radians per turn - - /** - * Sets the speed the robot will move (forward), in pixels per turn. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot will move backwards - *

- * Example: - *

-	 *   // Set the robot to move forward 2 pixels per turn
-	 *   setVelocityRate(2);
-	 *
-	 *   // Set the robot to move backwards 8 pixels per turn
-	 *   // (overrides the previous order)
-	 *   setVelocityRate(-8);
-	 *
-	 *   ...
-	 *   // Executes the last setVelocityRate()
-	 *   execute();
-	 * 
- * - * Note: This method overrules {@link robocode.AdvancedRobot#setAhead(double)} and - * {@link robocode.AdvancedRobot#setBack(double)}. - * - * @param velocityRate pixels per turn the robot will move. - * - * @see #getVelocityRate() - * @see #setTurnRate(double) - * @see #setGunRotationRate(double) - * @see #setRadarRotationRate(double) - * @see AdvancedRobot#setAhead(double) - * @see AdvancedRobot#setBack(double) - */ - public void setVelocityRate(double velocityRate) { - this.velocityRate = velocityRate; - } - - /** - * Returns the speed the robot will move, in pixels per turn. - * Positive values means that the robot will move forward. - * Negative values means that the robot will move backwards. - * If the value is 0, the robot will stand still. - * - * @return The speed of the robot in pixels per turn - * - * @see #setVelocityRate(double) - */ - public double getVelocityRate() { - return velocityRate; - } - - /** - * Sets the robot's clockwise (right) rotation per turn, in degrees. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot turns counterclockwise (left) - *

- * Example: - *

-	 *   // Set the robot to turn right 10 degrees per turn
-	 *   setTurnRate(10);
-	 *
-	 *   // Set the robot to turn left 4 degrees per turn
-	 *   // (overrides the previous order)
-	 *   setTurnRate(-5);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRate()
-	 *   execute();
-	 * 
- * - * @param turnRate angle of the clockwise rotation, in degrees. - * - * @see #getTurnRate() - * @see #setVelocityRate(double) - * @see #setGunRotationRate(double) - * @see #setRadarRotationRate(double) - * @see AdvancedRobot#setTurnRight(double) - * @see AdvancedRobot#setTurnLeft(double) - */ - public void setTurnRate(double turnRate) { - this.turnRate = toRadians(turnRate); - } - - /** - * Gets the robot's clockwise rotation per turn, in degrees. - * Positive values means that the robot will turn to the right. - * Negative values means that the robot will turn to the left. - * If the value is 0, the robot will not turn. - * - * @return Angle of the clockwise rotation, in degrees. - * - * @see #setTurnRate(double) - */ - public double getTurnRate() { - return toDegrees(turnRate); - } - - /** - * Sets the robot's clockwise (right) rotation per turn, in radians. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot turns counterclockwise (left) - *

- * Example: - *

-	 *   // Set the robot to turn right pi / 32 radians per turn
-	 *   setTurnRateRadians(Math.PI / 32);
-	 *
-	 *   // Set the robot to turn left pi / 20 radians per turn
-	 *   // (overrides the previous order)
-	 *   setTurnRateRadians(-Math.PI / 20);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRateRadians()
-	 *   execute();
-	 * 
- * - * @param turnRate angle of the clockwise rotation, in radians. - * - * @see #getTurnRateRadians()() - * @see #setVelocityRate(double) - * @see #setGunRotationRateRadians(double) - * @see #setRadarRotationRateRadians(double) - * @see AdvancedRobot#setTurnRightRadians(double) - * @see AdvancedRobot#setTurnLeftRadians(double) - */ - public void setTurnRateRadians(double turnRate) { - this.turnRate = turnRate; - } - - /** - * Gets the robot's clockwise rotation per turn, in radians. - * Positive values means that the robot will turn to the right. - * Negative values means that the robot will turn to the left. - * If the value is 0, the robot will not turn. - * - * @return Angle of the clockwise rotation, in radians. - * - * @see #getTurnRateRadians() - */ - public double getTurnRateRadians() { - return turnRate; - } - - /** - * Sets the gun's clockwise (right) rotation per turn, in degrees. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the gun turns counterclockwise (left) - *

- * Example: - *

-	 *   // Set the gun to turn right 15 degrees per turn
-	 *   setGunRotationRate(15);
-	 *
-	 *   // Set the gun to turn left 9 degrees per turn
-	 *   // (overrides the previous order)
-	 *   setGunRotationRate(-9);
-	 *
-	 *   ...
-	 *   // Executes the last setGunRotationRate()
-	 *   execute();
-	 * 
- * - * @param gunRotationRate angle of the clockwise rotation, in degrees. - * - * @see #getGunRotationRate() - * @see #setVelocityRate(double) - * @see #setTurnRate(double) - * @see #setRadarRotationRate(double) - * @see AdvancedRobot#setTurnGunRight(double) - * @see AdvancedRobot#setTurnGunLeft(double) - */ - public void setGunRotationRate(double gunRotationRate) { - this.gunRotationRate = toRadians(gunRotationRate); - } - - /** - * Gets the gun's clockwise rotation per turn, in degrees. - * Positive values means that the gun will turn to the right. - * Negative values means that the gun will turn to the left. - * If the value is 0, the gun will not turn. - * - * @return Angle of the clockwise rotation, in degrees. - * - * @see #setGunRotationRate(double) - */ - public double getGunRotationRate() { - return toDegrees(gunRotationRate); - } - - /** - * Sets the gun's clockwise (right) rotation per turn, in radians. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the gun turns counterclockwise (left) - *

- * Example: - *

-	 *   // Set the gun to turn right pi / 16 radians per turn
-	 *   setGunRotationRateRadians(Math.PI / 16);
-	 *
-	 *   // Set the gun to turn left pi / 12 radians per turn
-	 *   // (overrides the previous order)
-	 *   setGunRotationRateRadians(-Math.PI / 12);
-	 *
-	 *   ...
-	 *   // Executes the last setGunRotationRateRadians()
-	 *   execute();
-	 * 
- * - * @param gunRotationRate angle of the clockwise rotation, in radians. - * - * @see #getGunRotationRateRadians() - * @see #setVelocityRate(double) - * @see #setTurnRateRadians(double) - * @see #setRadarRotationRateRadians(double) - * @see AdvancedRobot#setTurnGunRightRadians(double) - * @see AdvancedRobot#setTurnGunLeftRadians(double) - */ - public void setGunRotationRateRadians(double gunRotationRate) { - this.gunRotationRate = gunRotationRate; - } - - /** - * Gets the gun's clockwise rotation per turn, in radians. - * Positive values means that the gun will turn to the right. - * Negative values means that the gun will turn to the left. - * If the value is 0, the gun will not turn. - * - * @return Angle of the clockwise rotation, in radians. - * - * @see #setGunRotationRateRadians(double) - */ - public double getGunRotationRateRadians() { - return gunRotationRate; - } - - /** - * Sets the radar's clockwise (right) rotation per turn, in degrees. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the radar turns counterclockwise (left) - *

- * Example: - *

-	 *   // Set the radar to turn right 45 degrees per turn
-	 *   setRadarRotationRate(45);
-	 *
-	 *   // Set the radar to turn left 15 degrees per turn
-	 *   // (overrides the previous order)
-	 *   setRadarRotationRate(-15);
-	 *
-	 *   ...
-	 *   // Executes the last setRadarRotationRate()
-	 *   execute();
-	 * 
- * - * @param radarRotationRate angle of the clockwise rotation, in degrees. - * - * @see #getRadarRotationRate() - * @see #setVelocityRate(double) - * @see #setTurnRate(double) - * @see #setGunRotationRate(double) - * @see AdvancedRobot#setTurnRadarRight(double) - * @see AdvancedRobot#setTurnRadarLeft(double) - */ - public void setRadarRotationRate(double radarRotationRate) { - this.radarRotationRate = toRadians(radarRotationRate); - } - - /** - * Gets the radar's clockwise rotation per turn, in degrees. - * Positive values means that the radar will turn to the right. - * Negative values means that the radar will turn to the left. - * If the value is 0, the radar will not turn. - * - * @return Angle of the clockwise rotation, in degrees. - * - * @see #setRadarRotationRate(double) - */ - public double getRadarRotationRate() { - return toDegrees(radarRotationRate); - } - - /** - * Sets the radar's clockwise (right) rotation per turn, in radians. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the radar turns counterclockwise (left) - *

- * Example: - *

-	 *   // Set the radar to turn right pi / 4 radians per turn
-	 *   setRadarRotationRateRadians(Math.PI / 4);
-	 *
-	 *   // Set the radar to turn left pi / 8 radians per turn
-	 *   // (overrides the previous order)
-	 *   setRadarRotationRateRadians(-Math.PI / 8);
-	 *
-	 *   ...
-	 *   // Executes the last setRadarRotationRateRadians()
-	 *   execute();
-	 * 
- * - * @param radarRotationRate angle of the clockwise rotation, in radians. - * - * @see #getRadarRotationRateRadians() - * @see #setVelocityRate(double) - * @see #setTurnRateRadians(double) - * @see #setGunRotationRateRadians(double) - * @see AdvancedRobot#setTurnRadarRightRadians(double) - * @see AdvancedRobot#setTurnRadarLeftRadians(double) - */ - public void setRadarRotationRateRadians(double radarRotationRate) { - this.radarRotationRate = radarRotationRate; - } - - /** - * Gets the radar's clockwise rotation per turn, in radians. - * Positive values means that the radar will turn to the right. - * Negative values means that the radar will turn to the left. - * If the value is 0, the radar will not turn. - * - * @return Angle of the clockwise rotation, in radians. - * - * @see #setRadarRotationRateRadians(double) - */ - public double getRadarRotationRateRadians() { - return radarRotationRate; - } - - /** - * Executes any pending actions, or continues executing actions that are - * in process. This call returns after the actions have been started. - *

- * Note that advanced robots must call this function in order to - * execute pending set* calls like e.g. {@code setVelocityRate()}, {@code setFire()}, - * {@code setTurnRate()} etc. Otherwise, these calls will never get executed. - *

- * Any previous calls to "movement" functions outside of {@code RateControlRobot}, - * such as {@code setAhead()}, {@code setTurnLeft()}, {@code setTurnRadarLeftRadians()} - * etc. will be overridden when this method is called on this robot class. - *

- * In this example the robot will move while turning: - *

-	 *   setVelocityRate(6);
-	 *   setTurnRate(7);
-	 *
-	 *   while (true) {
-	 *       execute();
-	 *   }
-	 * 
- */ - @Override - public void execute() { - setMaxVelocity(velocityRate); - if (velocityRate > 0) { - setAhead(Double.POSITIVE_INFINITY); - } else if (velocityRate < 0) { - setBack(Double.POSITIVE_INFINITY); - } else { - setAhead(0); - } - - setTurnGunRightRadians(gunRotationRate); - setTurnRadarRightRadians(radarRotationRate); - setTurnRightRadians(turnRate); - - super.execute(); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Robocode.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/Robocode.java deleted file mode 100644 index d9fad25..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Robocode.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.security.HiddenAccess; - - -/** - * Robocode - A programming game involving battling AI tanks.
- * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * - * @see
robocode.sourceforge.net - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Pavel Savara (contributor) - */ -public class Robocode { - - public static void main(final String[] args) { - HiddenAccess.robocodeMain(args); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileOutputStream.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileOutputStream.java deleted file mode 100644 index 3972331..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileOutputStream.java +++ /dev/null @@ -1,157 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.core.ContainerBase; -import net.sf.robocode.security.IThreadManagerBase; -import robocode.exception.RobotException; - -import java.io.*; - - -/** - * RobocodeFileOutputStream is similar to a {@link java.io.FileOutputStream} - * and is used for streaming/writing data out to a file, which you got - * previously by calling {@link AdvancedRobot#getDataFile(String) getDataFile()}. - *

- * You should read {@link java.io.FileOutputStream} for documentation of this - * class. - *

- * Please notice that the max. size of your data file is set to 200000 - * (~195 KB). - * - * @see AdvancedRobot#getDataFile(String) - * @see java.io.FileOutputStream - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobocodeFileOutputStream extends OutputStream { - private final FileOutputStream out; - private final String fileName; - - /** - * Constructs a new RobocodeFileOutputStream. - * See {@link java.io.FileOutputStream#FileOutputStream(File)} - * for documentation about this constructor. - * - * @see java.io.FileOutputStream#FileOutputStream(File) - */ - public RobocodeFileOutputStream(File file) throws IOException { - this(file.getPath()); - } - - /** - * Constructs a new RobocodeFileOutputStream. - * See {@link java.io.FileOutputStream#FileOutputStream(FileDescriptor)} - * for documentation about this constructor. - * - * @see java.io.FileOutputStream#FileOutputStream(FileDescriptor) - */ - public RobocodeFileOutputStream(FileDescriptor fdObj) { - throw new RobotException("Creating a RobocodeFileOutputStream with a FileDescriptor is not supported."); - } - - /** - * Constructs a new RobocodeFileOutputStream. - * See {@link java.io.FileOutputStream#FileOutputStream(String)} - * for documentation about this constructor. - * - * @see java.io.FileOutputStream#FileOutputStream(String) - */ - public RobocodeFileOutputStream(String fileName) throws java.io.IOException { - this(fileName, false); - } - - /** - * Constructs a new RobocodeFileOutputStream. - * See {@link java.io.FileOutputStream#FileOutputStream(String, boolean)} - * for documentation about this constructor. - * - * @see java.io.FileOutputStream#FileOutputStream(String, boolean) - */ - public RobocodeFileOutputStream(String fileName, boolean append) throws IOException { - this.fileName = fileName; - - final IThreadManagerBase threadManager = ContainerBase.getComponent(IThreadManagerBase.class); - - if (threadManager == null) { - throw new RobotException("ThreadManager cannot be null!"); - } - - out = threadManager.createRobotFileStream(fileName, append); - } - - /** - * Closes this output stream. See {@link java.io.FileOutputStream#close()} - * for documentation about this method. - * - * @see java.io.FileOutputStream#close() - */ - @Override - public final void close() throws IOException { - out.close(); - } - - /** - * Flushes this output stream. See {@link java.io.FileOutputStream#flush()} - * for documentation about this method. - * - * @see java.io.FileOutputStream#flush() - */ - @Override - public final void flush() throws IOException { - out.flush(); - } - - /** - * Returns the filename of this output stream. - * - * @return the filename of this output stream. - */ - public final String getName() { - return fileName; - } - - /** - * Writes a byte array to this output stream. - * See {@link java.io.FileOutputStream#write(byte[])} for documentation - * about this method. - * - * @see java.io.FileOutputStream#write(byte[]) - */ - @Override - public final void write(byte[] b) throws IOException { - out.write(b); - } - - /** - * Writes a byte array to this output stream. - * See {@link java.io.FileOutputStream#write(byte[], int, int)} for - * documentation about this method. - * - * @see java.io.FileOutputStream#write(byte[], int, int) - */ - @Override - public final void write(byte[] b, int off, int len) throws IOException { - out.write(b, off, len); - } - - /** - * Writes a single byte to this output stream. - * See {@link java.io.FileOutputStream#write(int)} for documentation about - * this method. - * - * @see java.io.FileOutputStream#write(int) - */ - @Override - public final void write(int b) throws IOException { - out.write(b); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileWriter.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileWriter.java deleted file mode 100644 index 98cd0d8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobocodeFileWriter.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import java.io.File; -import java.io.FileDescriptor; -import java.io.IOException; - - -/** - * RobocodeFileWriter is similar to a {@link java.io.FileWriter} and is used for - * writing data out to a file, which you got by calling {@link - * AdvancedRobot#getDataFile(String) getDataFile()}. - *

- * You should read {@link java.io.FileWriter} for documentation of this class. - *

- * Please notice that the max. size of your data file is set to 200000 - * (~195 KB). - * - * @see AdvancedRobot#getDataFile(String) - * @see java.io.FileWriter - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobocodeFileWriter extends java.io.OutputStreamWriter { - - /** - * Constructs a new RobocodeFileWriter. - * See {@link java.io.FileWriter#FileWriter(File)} for documentation about - * this constructor. - * - * @param file the file to write to. - * @throws java.io.IOException if an I/O exception occurs. - * @see java.io.FileWriter#FileWriter(File) - */ - public RobocodeFileWriter(File file) throws IOException { - super(new RobocodeFileOutputStream(file)); - } - - /** - * Constructs a new RobocodeFileWriter. - * See {@link java.io.FileWriter#FileWriter(FileDescriptor)} for - * documentation about this constructor. - * - * @param fd the file descriptor of the file to write to. - * @see java.io.FileWriter#FileWriter(FileDescriptor) - */ - public RobocodeFileWriter(FileDescriptor fd) { - super(new RobocodeFileOutputStream(fd)); - } - - /** - * Constructs a new RobocodeFileWriter. - * See {@link java.io.FileWriter#FileWriter(String)} for documentation about - * this constructor. - * - * @param fileName the filename of the file to write to. - * @throws java.io.IOException if an I/O exception occurs. - * @see java.io.FileWriter#FileWriter(String) - */ - public RobocodeFileWriter(String fileName) throws IOException { - super(new RobocodeFileOutputStream(fileName)); - } - - /** - * Constructs a new RobocodeFileWriter. - * See {@link java.io.FileWriter#FileWriter(String, boolean)} for - * documentation about this constructor. - * - * @param fileName the filename of the file to write to. - * @param append set this to true if the output must be appended to the file. - * @throws java.io.IOException if an I/O exception occurs. - * @see java.io.FileWriter#FileWriter(String, boolean) - */ - public RobocodeFileWriter(String fileName, boolean append) throws IOException { - super(new RobocodeFileOutputStream(fileName, append)); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Robot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/Robot.java deleted file mode 100644 index d289a5d..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Robot.java +++ /dev/null @@ -1,1550 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import robocode.robotinterfaces.*; -import robocode.robotinterfaces.peer.IStandardRobotPeer; - -import java.awt.*; - - -/** - * The basic robot class that you will extend to create your own robots. - *

- *

Please note the following standards will be used: - *
heading - absolute angle in degrees with 0 facing up the screen, - * positive clockwise. 0 <= heading < 360. - *
bearing - relative angle to some object from your robot's heading, - * positive clockwise. -180 < bearing <= 180 - *
All coordinates are expressed as (x,y). - *
All coordinates are positive. - *
The origin (0,0) is at the bottom left of the screen. - *
Positive x is right. - *
Positive y is up. - * - * @see - * robocode.sourceforge.net - * @see - * Building your first robot - * - * @see JuniorRobot - * @see AdvancedRobot - * @see TeamRobot - * @see Droid - * @see RateControlRobot - * @see BorderSentry - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - * @author Stefan Westen (contributor) - * @author Pavel Savara (contributor) - */ -public class Robot extends _Robot implements IInteractiveRobot, IPaintRobot, IBasicEvents3, IInteractiveEvents, IPaintEvents { - - private static final int - WIDTH = 36, - HEIGHT = 36; - - /** - * Constructs a new robot. - */ - public Robot() {} - - /** - * {@inheritDoc}} - */ - public final Runnable getRobotRunnable() { - return this; - } - - /** - * {@inheritDoc}} - */ - public final IBasicEvents getBasicEventListener() { - return this; - } - - /** - * {@inheritDoc}} - */ - public final IInteractiveEvents getInteractiveEventListener() { - return this; - } - - /** - * {@inheritDoc}} - */ - public final IPaintEvents getPaintEventListener() { - return this; - } - - /** - * Immediately moves your robot ahead (forward) by distance measured in - * pixels. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the remaining distance to move is 0. - *

- * If the robot collides with a wall, the move is complete, meaning that the - * robot will not move any further. If the robot collides with another - * robot, the move is complete if you are heading toward the other robot. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot is set to move backward - * instead of forward. - *

- * Example: - *

-	 *   // Move the robot 100 pixels forward
-	 *   ahead(100);
-	 *
-	 *   // Afterwards, move the robot 50 pixels backward
-	 *   ahead(-50);
-	 * 
- * - * @param distance the distance to move ahead measured in pixels. - * If this value is negative, the robot will move back instead of ahead. - * @see #back(double) - * @see #onHitWall(HitWallEvent) - * @see #onHitRobot(HitRobotEvent) - */ - public void ahead(double distance) { - if (peer != null) { - peer.move(distance); - } else { - uninitializedException(); - } - } - - /** - * Immediately moves your robot backward by distance measured in pixels. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the remaining distance to move is 0. - *

- * If the robot collides with a wall, the move is complete, meaning that the - * robot will not move any further. If the robot collides with another - * robot, the move is complete if you are heading toward the other robot. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot is set to move forward instead - * of backward. - *

- * Example: - *

-	 *   // Move the robot 100 pixels backward
-	 *   back(100);
-	 *
-	 *   // Afterwards, move the robot 50 pixels forward
-	 *   back(-50);
-	 * 
- * - * @param distance the distance to move back measured in pixels. - * If this value is negative, the robot will move ahead instead of back. - * @see #ahead(double) - * @see #onHitWall(HitWallEvent) - * @see #onHitRobot(HitRobotEvent) - */ - public void back(double distance) { - if (peer != null) { - peer.move(-distance); - } else { - uninitializedException(); - } - } - - /** - * Returns the width of the current battlefield measured in pixels. - * - * @return the width of the current battlefield measured in pixels. - */ - public double getBattleFieldWidth() { - if (peer != null) { - return peer.getBattleFieldWidth(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the height of the current battlefield measured in pixels. - * - * @return the height of the current battlefield measured in pixels. - */ - public double getBattleFieldHeight() { - if (peer != null) { - return peer.getBattleFieldHeight(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the direction that the robot's body is facing, in degrees. - * The value returned will be between 0 and 360 (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * 90 means East, 180 means South, and 270 means West. - * - * @return the direction that the robot's body is facing, in degrees. - * @see #getGunHeading() - * @see #getRadarHeading() - */ - public double getHeading() { - if (peer != null) { - double rv = 180.0 * peer.getBodyHeading() / Math.PI; - - while (rv < 0) { - rv += 360; - } - while (rv >= 360) { - rv -= 360; - } - return rv; - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the height of the robot measured in pixels. - * - * @return the height of the robot measured in pixels. - * @see #getWidth() - */ - public double getHeight() { - if (peer == null) { - uninitializedException(); - } - return HEIGHT; - } - - /** - * Returns the width of the robot measured in pixels. - * - * @return the width of the robot measured in pixels. - * @see #getHeight() - */ - public double getWidth() { - if (peer == null) { - uninitializedException(); - } - return WIDTH; - } - - /** - * Returns the robot's name. - * - * @return the robot's name. - */ - public String getName() { - if (peer != null) { - return peer.getName(); - } - uninitializedException(); - return null; // never called - } - - /** - * Returns the X position of the robot. (0,0) is at the bottom left of the - * battlefield. - * - * @return the X position of the robot. - * @see #getY() - */ - public double getX() { - if (peer != null) { - return peer.getX(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the Y position of the robot. (0,0) is at the bottom left of the - * battlefield. - * - * @return the Y position of the robot. - * @see #getX() - */ - public double getY() { - if (peer != null) { - return peer.getY(); - } - uninitializedException(); - return 0; // never called - } - - /** - * The main method in every robot. You must override this to set up your - * robot's basic behavior. - *

- * Example: - *

-	 *   // A basic robot that moves around in a square
-	 *   public void run() {
-	 *       while (true) {
-	 *           ahead(100);
-	 *           turnRight(90);
-	 *       }
-	 *   }
-	 * 
- */ - public void run() {} - - /** - * Immediately turns the robot's body to the left by degrees. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the robot's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Turn the robot 180 degrees to the left
-	 *   turnLeft(180);
-	 *
-	 *   // Afterwards, turn the robot 90 degrees to the right
-	 *   turnLeft(-90);
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's body to the left. - * If {@code degrees} > 0 the robot will turn left. - * If {@code degrees} < 0 the robot will turn right. - * If {@code degrees} = 0 the robot will not turn, but execute. - * @see #turnRight(double) - * @see #turnGunLeft(double) - * @see #turnGunRight(double) - * @see #turnRadarLeft(double) - * @see #turnRadarRight(double) - */ - public void turnLeft(double degrees) { - if (peer != null) { - peer.turnBody(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Immediately turns the robot's body to the right by degrees. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the robot's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's body is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Turn the robot 180 degrees to the right
-	 *   turnRight(180);
-	 *
-	 *   // Afterwards, turn the robot 90 degrees to the left
-	 *   turnRight(-90);
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's body to the right. - * If {@code degrees} > 0 the robot will turn right. - * If {@code degrees} < 0 the robot will turn left. - * If {@code degrees} = 0 the robot will not turn, but execute. - * @see #turnLeft(double) - * @see #turnGunLeft(double) - * @see #turnGunRight(double) - * @see #turnRadarLeft(double) - * @see #turnRadarRight(double) - */ - public void turnRight(double degrees) { - if (peer != null) { - peer.turnBody(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Do nothing this turn, meaning that the robot will skip it's turn. - *

- * This call executes immediately, and does not return until the turn is - * over. - */ - public void doNothing() { - if (peer != null) { - peer.execute(); - } else { - uninitializedException(); - } - } - - /** - * Immediately fires a bullet. The bullet will travel in the direction the - * gun is pointing. - *

- * The specified bullet power is an amount of energy that will be taken from - * the robot's energy. Hence, the more power you want to spend on the - * bullet, the more energy is taken from your robot. - *

- * The bullet will do (4 * power) damage if it hits another robot. If power - * is greater than 1, it will do an additional 2 * (power - 1) damage. - * You will get (3 * power) back if you hit the other robot. You can call - * {@link Rules#getBulletDamage(double)} for getting the damage that a - * bullet with a specific bullet power will do. - *

- * The specified bullet power should be between - * {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}. - *

- * Note that the gun cannot fire if the gun is overheated, meaning that - * {@link #getGunHeat()} returns a value > 0. - *

- * A event is generated when the bullet hits a robot - * ({@link BulletHitEvent}), wall ({@link BulletMissedEvent}), or another - * bullet ({@link BulletHitBulletEvent}). - *

- * Example: - *

-	 *   // Fire a bullet with maximum power if the gun is ready
-	 *   if (getGunHeat() == 0) {
-	 *       fire(Rules.MAX_BULLET_POWER);
-	 *   }
-	 * 
- * - * @param power the amount of energy given to the bullet, and subtracted - * from the robot's energy. - * @see #fireBullet(double) - * @see #getGunHeat() - * @see #getGunCoolingRate() - * @see #onBulletHit(BulletHitEvent) - * @see #onBulletHitBullet(BulletHitBulletEvent) - * @see #onBulletMissed(BulletMissedEvent) - */ - public void fire(double power) { - if (peer != null) { - peer.setFire(power); - peer.execute(); - } else { - uninitializedException(); - } - } - - /** - * Immediately fires a bullet. The bullet will travel in the direction the - * gun is pointing. - *

- * The specified bullet power is an amount of energy that will be taken from - * the robot's energy. Hence, the more power you want to spend on the - * bullet, the more energy is taken from your robot. - *

- * The bullet will do (4 * power) damage if it hits another robot. If power - * is greater than 1, it will do an additional 2 * (power - 1) damage. - * You will get (3 * power) back if you hit the other robot. You can call - * {@link Rules#getBulletDamage(double)} for getting the damage that a - * bullet with a specific bullet power will do. - *

- * The specified bullet power should be between - * {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}. - *

- * Note that the gun cannot fire if the gun is overheated, meaning that - * {@link #getGunHeat()} returns a value > 0. - *

- * A event is generated when the bullet hits a robot - * ({@link BulletHitEvent}), wall ({@link BulletMissedEvent}), or another - * bullet ({@link BulletHitBulletEvent}). - *

- * Example: - *

-	 *   // Fire a bullet with maximum power if the gun is ready
-	 *   if (getGunHeat() == 0) {
-	 *       Bullet bullet = fireBullet(Rules.MAX_BULLET_POWER);
-	 *
-	 *       // Get the velocity of the bullet
-	 *       if (bullet != null) {
-	 *           double bulletVelocity = bullet.getVelocity();
-	 *       }
-	 *   }
-	 * 
- * - * @param power the amount of energy given to the bullet, and subtracted - * from the robot's energy. - * @return a {@link Bullet} that contains information about the bullet if it - * was actually fired, which can be used for tracking the bullet after it - * has been fired. If the bullet was not fired, {@code null} is returned. - * @see #fire(double) - * @see Bullet - * @see #getGunHeat() - * @see #getGunCoolingRate() - * @see #onBulletHit(BulletHitEvent) - * @see #onBulletHitBullet(BulletHitBulletEvent) - * @see #onBulletMissed(BulletMissedEvent) - */ - public Bullet fireBullet(double power) { - if (peer != null) { - return peer.fire(power); - } - uninitializedException(); - return null; - } - - /** - * Returns the rate at which the gun will cool down, i.e. the amount of heat - * the gun heat will drop per turn. - *

- * The gun cooling rate is default 0.1 / turn, but can be changed by the - * battle setup. So don't count on the cooling rate being 0.1! - * - * @return the gun cooling rate - * @see #getGunHeat() - * @see #fire(double) - * @see #fireBullet(double) - */ - public double getGunCoolingRate() { - if (peer != null) { - return peer.getGunCoolingRate(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the direction that the robot's gun is facing, in degrees. - * The value returned will be between 0 and 360 (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * 90 means East, 180 means South, and 270 means West. - * - * @return the direction that the robot's gun is facing, in degrees. - * @see #getHeading() - * @see #getRadarHeading() - */ - public double getGunHeading() { - if (peer != null) { - return peer.getGunHeading() * 180.0 / Math.PI; - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the current heat of the gun. The gun cannot fire unless this is - * 0. (Calls to fire will succeed, but will not actually fire unless - * getGunHeat() == 0). - *

- * The amount of gun heat generated when the gun is fired is - * 1 + (firePower / 5). Each turn the gun heat drops by the amount returned - * by {@link #getGunCoolingRate()}, which is a battle setup. - *

- * Note that all guns are "hot" at the start of each round, where the gun - * heat is 3. - * - * @return the current gun heat - * @see #getGunCoolingRate() - * @see #fire(double) - * @see #fireBullet(double) - */ - public double getGunHeat() { - if (peer != null) { - return peer.getGunHeat(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the number of rounds in the current battle. - * - * @return the number of rounds in the current battle - * @see #getRoundNum() - */ - public int getNumRounds() { - if (peer != null) { - return peer.getNumRounds(); - } - uninitializedException(); - return 0; // never called - } - - - public int getSentryBorderSize() { - if (peer != null) { - return peer.getSentryBorderSize(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns how many opponents that are left in the current round. - * - * @return how many opponents that are left in the current round. - */ - public int getOthers() { - if (peer != null) { - return peer.getOthers(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns how many sentry robots that are left in the current round. - * - * @return how many sentry robots that are left in the current round. - * - * @since 1.9.1.0 - */ - public int getNumSentries() { - if (peer != null) { - return peer.getNumSentries(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the direction that the robot's radar is facing, in degrees. - * The value returned will be between 0 and 360 (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * 90 means East, 180 means South, and 270 means West. - * - * @return the direction that the robot's radar is facing, in degrees. - * @see #getHeading() - * @see #getGunHeading() - */ - public double getRadarHeading() { - if (peer != null) { - return peer.getRadarHeading() * 180.0 / Math.PI; - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the current round number (0 to {@link #getNumRounds()} - 1) of - * the battle. - * - * @return the current round number of the battle (zero indexed). - * @see #getNumRounds() - */ - public int getRoundNum() { - if (peer != null) { - return peer.getRoundNum(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the game time of the current round, where the time is equal to - * the current turn in the round. - *

- * A battle consists of multiple rounds. - *

- * Time is reset to 0 at the beginning of every round. - * - * @return the game time/turn of the current round. - */ - public long getTime() { - if (peer != null) { - return peer.getTime(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns the velocity of the robot measured in pixels/turn. - *

- * The maximum velocity of a robot is defined by {@link Rules#MAX_VELOCITY} - * (8 pixels / turn). - * - * @return the velocity of the robot measured in pixels/turn. - * @see Rules#MAX_VELOCITY - */ - public double getVelocity() { - if (peer != null) { - return peer.getVelocity(); - } - uninitializedException(); - return 0; // never called - } - - /** - * {@inheritDoc} - */ - public void onBulletHit(BulletHitEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBulletHitBullet(BulletHitBulletEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBulletMissed(BulletMissedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onDeath(DeathEvent event) {} - - /** - * {@inheritDoc} - */ - public void onHitByBullet(HitByBulletEvent event) {} - - /** - * {@inheritDoc} - */ - public void onHitRobot(HitRobotEvent event) {} - - /** - * {@inheritDoc} - */ - public void onHitWall(HitWallEvent event) {} - - /** - * {@inheritDoc} - */ - public void onRobotDeath(RobotDeathEvent event) {} - - /** - * {@inheritDoc} - */ - public void onScannedRobot(ScannedRobotEvent event) {} - - /** - * {@inheritDoc} - */ - public void onWin(WinEvent event) {} - - /** - * {@inheritDoc} - */ - public void onRoundEnded(RoundEndedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBattleEnded(BattleEndedEvent event) {} - - /** - * Scans for other robots. This method is called automatically by the game, - * as long as the robot is moving, turning its body, turning its gun, or - * turning its radar. - *

- * Scan will cause {@link #onScannedRobot(ScannedRobotEvent) - * onScannedRobot(ScannedRobotEvent)} to be called if you see a robot. - *

- * There are 2 reasons to call {@code scan()} manually: - *

    - *
  1. You want to scan after you stop moving. - *
  2. You want to interrupt the {@code onScannedRobot} event. This is more - * likely. If you are in {@code onScannedRobot} and call {@code scan()}, - * and you still see a robot, then the system will interrupt your - * {@code onScannedRobot} event immediately and start it from the top. - *
- *

- * This call executes immediately. - * - * @see #onScannedRobot(ScannedRobotEvent) - * @see ScannedRobotEvent - */ - public void scan() { - if (peer != null) { - ((IStandardRobotPeer) peer).rescan(); - } else { - uninitializedException(); - } - } - - /** - * Sets the gun to turn independent from the robot's turn. - *

- * Ok, so this needs some explanation: The gun is mounted on the robot's - * body. So, normally, if the robot turns 90 degrees to the right, then the - * gun will turn with it as it is mounted on top of the robot's body. To - * compensate for this, you can call {@code setAdjustGunForRobotTurn(true)}. - * When this is set, the gun will turn independent from the robot's turn, - * i.e. the gun will compensate for the robot's body turn. - *

- * Note: This method is additive until you reach the maximum the gun can - * turn. The "adjust" is added to the amount you set for turning the robot, - * then capped by the physics of the game. If you turn infinite, then the - * adjust is ignored (and hence overridden). - *

- * Example, assuming both the robot and gun start out facing up (0 degrees): - *

-	 *   // Set gun to turn with the robot's turn
-	 *   setAdjustGunForRobotTurn(false); // This is the default
-	 *   turnRight(90);
-	 *   // At this point, both the robot and gun are facing right (90 degrees)
-	 *   turnLeft(90);
-	 *   // Both are back to 0 degrees
-	 *
-	 *   -- or --
-	 *
-	 *   // Set gun to turn independent from the robot's turn
-	 *   setAdjustGunForRobotTurn(true);
-	 *   turnRight(90);
-	 *   // At this point, the robot is facing right (90 degrees), but the gun is still facing up.
-	 *   turnLeft(90);
-	 *   // Both are back to 0 degrees.
-	 * 
- *

- * Note: The gun compensating this way does count as "turning the gun". - * See {@link #setAdjustRadarForGunTurn(boolean)} for details. - * - * @param independent {@code true} if the gun must turn independent from the - * robot's turn; {@code false} if the gun must turn with the robot's turn. - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void setAdjustGunForRobotTurn(boolean independent) { - if (peer != null) { - ((IStandardRobotPeer) peer).setAdjustGunForBodyTurn(independent); - } else { - uninitializedException(); - } - } - - /** - * Sets the radar to turn independent from the robot's turn. - *

- * Ok, so this needs some explanation: The radar is mounted on the gun, and - * the gun is mounted on the robot's body. So, normally, if the robot turns - * 90 degrees to the right, the gun turns, as does the radar. Hence, if the - * robot turns 90 degrees to the right, then the gun and radar will turn - * with it as the radar is mounted on top of the gun. To compensate for - * this, you can call {@code setAdjustRadarForRobotTurn(true)}. When this is - * set, the radar will turn independent from the robot's turn, i.e. the - * radar will compensate for the robot's turn. - *

- * Note: This method is additive until you reach the maximum the radar can - * turn. The "adjust" is added to the amount you set for turning the robot, - * then capped by the physics of the game. If you turn infinite, then the - * adjust is ignored (and hence overridden). - *

- * Example, assuming the robot, gun, and radar all start out facing up (0 - * degrees): - *

-	 *   // Set radar to turn with the robots's turn
-	 *   setAdjustRadarForRobotTurn(false); // This is the default
-	 *   turnRight(90);
-	 *   // At this point, the body, gun, and radar are all facing right (90 degrees);
-	 *
-	 *   -- or --
-	 *
-	 *   // Set radar to turn independent from the robot's turn
-	 *   setAdjustRadarForRobotTurn(true);
-	 *   turnRight(90);
-	 *   // At this point, the robot and gun are facing right (90 degrees), but the radar is still facing up.
-	 * 
- * - * @param independent {@code true} if the radar must turn independent from - * the robots's turn; {@code false} if the radar must turn with the robot's - * turn. - * @see #setAdjustGunForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void setAdjustRadarForRobotTurn(boolean independent) { - if (peer != null) { - ((IStandardRobotPeer) peer).setAdjustRadarForBodyTurn(independent); - } else { - uninitializedException(); - } - } - - /** - * Sets the radar to turn independent from the gun's turn. - *

- * Ok, so this needs some explanation: The radar is mounted on the robot's - * gun. So, normally, if the gun turns 90 degrees to the right, then the - * radar will turn with it as it is mounted on top of the gun. To compensate - * for this, you can call {@code setAdjustRadarForGunTurn(true)}. When this - * is set, the radar will turn independent from the robot's turn, i.e. the - * radar will compensate for the gun's turn. - *

- * Note: This method is additive until you reach the maximum the radar can - * turn. The "adjust" is added to the amount you set for turning the gun, - * then capped by the physics of the game. If you turn infinite, then the - * adjust is ignored (and hence overridden). - *

- * Example, assuming both the gun and radar start out facing up (0 degrees): - *

-	 *   // Set radar to turn with the gun's turn
-	 *   setAdjustRadarForGunTurn(false); // This is the default
-	 *   turnGunRight(90);
-	 *   // At this point, both the radar and gun are facing right (90 degrees);
-	 *
-	 *   -- or --
-	 *
-	 *   // Set radar to turn independent from the gun's turn
-	 *   setAdjustRadarForGunTurn(true);
-	 *   turnGunRight(90);
-	 *   // At this point, the gun is facing right (90 degrees), but the radar is still facing up.
-	 * 
- * Note: Calling {@code setAdjustRadarForGunTurn(boolean)} will - * automatically call {@link #setAdjustRadarForRobotTurn(boolean)} with the - * same value, unless you have already called it earlier. This behavior is - * primarily for backward compatibility with older Robocode robots. - * - * @param independent {@code true} if the radar must turn independent from - * the gun's turn; {@code false} if the radar must turn with the gun's - * turn. - * @see #setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void setAdjustRadarForGunTurn(boolean independent) { - if (peer != null) { - ((IStandardRobotPeer) peer).setAdjustRadarForGunTurn(independent); - } else { - uninitializedException(); - } - } - - /** - * Sets the color of the robot's body, gun, and radar in the same time. - *

- * You may only call this method one time per battle. A {@code null} - * indicates the default (blue) color. - *

- * Example: - *

-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setColors(null, Color.RED, new Color(150, 0, 150));
-	 *       ...
-	 *   }
-	 * 
- * - * @param bodyColor the new body color - * @param gunColor the new gun color - * @param radarColor the new radar color - * @see #setColors(Color, Color, Color, Color, Color) - * @see #setAllColors(Color) - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - */ - public void setColors(Color bodyColor, Color gunColor, Color radarColor) { - if (peer != null) { - peer.setBodyColor(bodyColor); - peer.setGunColor(gunColor); - peer.setRadarColor(radarColor); - } else { - uninitializedException(); - } - } - - /** - * Sets the color of the robot's body, gun, radar, bullet, and scan arc in - * the same time. - *

- * You may only call this method one time per battle. A {@code null} - * indicates the default (blue) color for the body, gun, radar, and scan - * arc, but white for the bullet color. - *

- * Example: - *

-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setColors(null, Color.RED, Color.GREEN, null, new Color(150, 0, 150));
-	 *       ...
-	 *   }
-	 * 
- * - * @param bodyColor the new body color - * @param gunColor the new gun color - * @param radarColor the new radar color - * @param bulletColor the new bullet color - * @param scanArcColor the new scan arc color - * @see #setColors(Color, Color, Color) - * @see #setAllColors(Color) - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.3 - */ - public void setColors(Color bodyColor, Color gunColor, Color radarColor, Color bulletColor, Color scanArcColor) { - if (peer != null) { - peer.setBodyColor(bodyColor); - peer.setGunColor(gunColor); - peer.setRadarColor(radarColor); - peer.setBulletColor(bulletColor); - peer.setScanColor(scanArcColor); - } else { - uninitializedException(); - } - } - - /** - * Sets all the robot's color to the same color in the same time, i.e. the - * color of the body, gun, radar, bullet, and scan arc. - *

- * You may only call this method one time per battle. A {@code null} - * indicates the default (blue) color for the body, gun, radar, and scan - * arc, but white for the bullet color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setAllColors(Color.RED);
-	 *       ...
-	 *   }
-	 * 
- * - * @param color the new color for all the colors of the robot - * @see #setColors(Color, Color, Color) - * @see #setColors(Color, Color, Color, Color, Color) - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.3 - */ - public void setAllColors(Color color) { - if (peer != null) { - peer.setBodyColor(color); - peer.setGunColor(color); - peer.setRadarColor(color); - peer.setBulletColor(color); - peer.setScanColor(color); - } else { - uninitializedException(); - } - } - - /** - * Sets the color of the robot's body. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setBodyColor(Color.BLACK);
-	 *       ...
-	 *   }
-	 * 
- * - * @param color the new body color - * @see #setColors(Color, Color, Color) - * @see #setColors(Color, Color, Color, Color, Color) - * @see #setAllColors(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - public void setBodyColor(Color color) { - if (peer != null) { - peer.setBodyColor(color); - } else { - uninitializedException(); - } - } - - /** - * Sets the color of the robot's gun. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setGunColor(Color.RED);
-	 *       ...
-	 *   }
-	 * 
- * - * @param color the new gun color - * @see #setColors(Color, Color, Color) - * @see #setColors(Color, Color, Color, Color, Color) - * @see #setAllColors(Color) - * @see #setBodyColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - public void setGunColor(Color color) { - if (peer != null) { - peer.setGunColor(color); - } else { - uninitializedException(); - } - } - - /** - * Sets the color of the robot's radar. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setRadarColor(Color.YELLOW);
-	 *       ...
-	 *   }
-	 * 
- * - * @param color the new radar color - * @see #setColors(Color, Color, Color) - * @see #setColors(Color, Color, Color, Color, Color) - * @see #setAllColors(Color) - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - public void setRadarColor(Color color) { - if (peer != null) { - peer.setRadarColor(color); - } else { - uninitializedException(); - } - } - - /** - * Sets the color of the robot's bullets. - *

- * A {@code null} indicates the default white color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setBulletColor(Color.GREEN);
-	 *       ...
-	 *   }
-	 * 
- * - * @param color the new bullet color - * @see #setColors(Color, Color, Color) - * @see #setColors(Color, Color, Color, Color, Color) - * @see #setAllColors(Color) - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - public void setBulletColor(Color color) { - if (peer != null) { - peer.setBulletColor(color); - } else { - uninitializedException(); - } - } - - /** - * Sets the color of the robot's scan arc. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 *
-	 *   public void run() {
-	 *       setScanColor(Color.WHITE);
-	 *       ...
-	 *   }
-	 * 
- * - * @param color the new scan arc color - * @see #setColors(Color, Color, Color) - * @see #setColors(Color, Color, Color, Color, Color) - * @see #setAllColors(Color) - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see Color - * @since 1.1.2 - */ - public void setScanColor(Color color) { - if (peer != null) { - peer.setScanColor(color); - } else { - uninitializedException(); - } - } - - /** - * Immediately stops all movement, and saves it for a call to - * {@link #resume()}. If there is already movement saved from a previous - * stop, this will have no effect. - *

- * This method is equivalent to {@code #stop(false)}. - * - * @see #resume() - * @see #stop(boolean) - */ - public void stop() { - stop(false); - } - - /** - * Immediately stops all movement, and saves it for a call to - * {@link #resume()}. If there is already movement saved from a previous - * stop, you can overwrite it by calling {@code stop(true)}. - * - * @param overwrite If there is already movement saved from a previous stop, - * you can overwrite it by calling {@code stop(true)}. - * @see #resume() - * @see #stop() - */ - public void stop(boolean overwrite) { - if (peer != null) { - ((IStandardRobotPeer) peer).stop(overwrite); - } else { - uninitializedException(); - } - } - - /** - * Immediately resumes the movement you stopped by {@link #stop()}, if any. - *

- * This call executes immediately, and does not return until it is complete. - * - * @see #stop() - * @see #stop(boolean) - */ - public void resume() { - if (peer != null) { - ((IStandardRobotPeer) peer).resume(); - } else { - uninitializedException(); - } - } - - /** - * Immediately turns the robot's gun to the left by degrees. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the gun's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Turn the robot's gun 180 degrees to the left
-	 *   turnGunLeft(180);
-	 *
-	 *   // Afterwards, turn the robot's gun 90 degrees to the right
-	 *   turnGunLeft(-90);
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's gun to the left. - * If {@code degrees} > 0 the robot's gun will turn left. - * If {@code degrees} < 0 the robot's gun will turn right. - * If {@code degrees} = 0 the robot's gun will not turn, but execute. - * @see #turnGunRight(double) - * @see #turnLeft(double) - * @see #turnRight(double) - * @see #turnRadarLeft(double) - * @see #turnRadarRight(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void turnGunLeft(double degrees) { - if (peer != null) { - peer.turnGun(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Immediately turns the robot's gun to the right by degrees. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the gun's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's gun is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Turn the robot's gun 180 degrees to the right
-	 *   turnGunRight(180);
-	 *
-	 *   // Afterwards, turn the robot's gun 90 degrees to the left
-	 *   turnGunRight(-90);
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's gun to the right. - * If {@code degrees} > 0 the robot's gun will turn right. - * If {@code degrees} < 0 the robot's gun will turn left. - * If {@code degrees} = 0 the robot's gun will not turn, but execute. - * @see #turnGunLeft(double) - * @see #turnLeft(double) - * @see #turnRight(double) - * @see #turnRadarLeft(double) - * @see #turnRadarRight(double) - * @see #setAdjustGunForRobotTurn(boolean) - */ - public void turnGunRight(double degrees) { - if (peer != null) { - peer.turnGun(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Immediately turns the robot's radar to the left by degrees. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the radar's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn right - * instead of left. - *

- * Example: - *

-	 *   // Turn the robot's radar 180 degrees to the left
-	 *   turnRadarLeft(180);
-	 *
-	 *   // Afterwards, turn the robot's radar 90 degrees to the right
-	 *   turnRadarLeft(-90);
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's radar to the left. - * If {@code degrees} > 0 the robot's radar will turn left. - * If {@code degrees} < 0 the robot's radar will turn right. - * If {@code degrees} = 0 the robot's radar will not turn, but execute. - * @see #turnRadarRight(double) - * @see #turnLeft(double) - * @see #turnRight(double) - * @see #turnGunLeft(double) - * @see #turnGunRight(double) - * @see #setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void turnRadarLeft(double degrees) { - if (peer != null) { - ((IStandardRobotPeer) peer).turnRadar(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Immediately turns the robot's radar to the right by degrees. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the radar's turn is 0. - *

- * Note that both positive and negative values can be given as input, - * where negative values means that the robot's radar is set to turn left - * instead of right. - *

- * Example: - *

-	 *   // Turn the robot's radar 180 degrees to the right
-	 *   turnRadarRight(180);
-	 *
-	 *   // Afterwards, turn the robot's radar 90 degrees to the left
-	 *   turnRadarRight(-90);
-	 * 
- * - * @param degrees the amount of degrees to turn the robot's radar to the right. - * If {@code degrees} > 0 the robot's radar will turn right. - * If {@code degrees} < 0 the robot's radar will turn left. - * If {@code degrees} = 0 the robot's radar will not turn, but execute. - * @see #turnRadarLeft(double) - * @see #turnLeft(double) - * @see #turnRight(double) - * @see #turnGunLeft(double) - * @see #turnGunRight(double) - * @see #setAdjustRadarForRobotTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - public void turnRadarRight(double degrees) { - if (peer != null) { - ((IStandardRobotPeer) peer).turnRadar(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * Returns the robot's current energy. - * - * @return the robot's current energy. - */ - public double getEnergy() { - if (peer != null) { - return peer.getEnergy(); - } - uninitializedException(); - return 0; // never called - } - - /** - * Returns a graphics context used for painting graphical items for the robot. - *

- * This method is very useful for debugging your robot. - *

- * Note that the robot will only be painted if the "Paint" is enabled on the - * robot's console window; otherwise the robot will never get painted (the - * reason being that all robots might have graphical items that must be - * painted, and then you might not be able to tell what graphical items that - * have been painted for your robot). - *

- * Also note that the coordinate system for the graphical context where you - * paint items fits for the Robocode coordinate system where (0, 0) is at - * the bottom left corner of the battlefield, where X is towards right and Y - * is upwards. - * - * @return a graphics context used for painting graphical items for the robot. - * @see #onPaint(Graphics2D) - * @since 1.6.1 - */ - public Graphics2D getGraphics() { - if (peer != null) { - return peer.getGraphics(); - } - uninitializedException(); - return null; // never called - } - - /** - * Sets the debug property with the specified key to the specified value. - *

- * This method is very useful when debugging or reviewing your robot as you - * will be able to see this property displayed in the robot console for your - * robots under the Debug Properties tab page. - * - * @param key the name/key of the debug property. - * @param value the new value of the debug property, where {@code null} or - * the empty string is used for removing this debug property. - * @since 1.6.2 - */ - public void setDebugProperty(String key, String value) { - if (peer != null) { - peer.setDebugProperty(key, value); - return; - } - uninitializedException(); - } - - /** - * {@inheritDoc} - */ - public void onPaint(Graphics2D g) {} - - /** - * {@inheritDoc} - */ - public void onKeyPressed(java.awt.event.KeyEvent e) {} - - /** - * {@inheritDoc} - */ - public void onKeyReleased(java.awt.event.KeyEvent e) {} - - /** - * {@inheritDoc} - */ - public void onKeyTyped(java.awt.event.KeyEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMouseClicked(java.awt.event.MouseEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMouseEntered(java.awt.event.MouseEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMouseExited(java.awt.event.MouseEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMousePressed(java.awt.event.MouseEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMouseReleased(java.awt.event.MouseEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMouseMoved(java.awt.event.MouseEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMouseDragged(java.awt.event.MouseEvent e) {} - - /** - * {@inheritDoc} - */ - public void onMouseWheelMoved(java.awt.event.MouseWheelEvent e) {} - - /** - * {@inheritDoc} - */ - public void onStatus(StatusEvent e) {} -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotDeathEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotDeathEvent.java deleted file mode 100644 index 8159ac9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotDeathEvent.java +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * This event is sent to {@link Robot#onRobotDeath(RobotDeathEvent) onRobotDeath()} - * when another robot (not your robot) dies. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class RobotDeathEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 70; - - private final String robotName; - - /** - * Called by the game to create a new RobotDeathEvent. - * - * @param robotName the name of the robot that died - */ - public RobotDeathEvent(String robotName) { - super(); - this.robotName = robotName; - } - - /** - * Returns the name of the robot that died. - * - * @return the name of the robot that died - */ - public String getName() { - return robotName; - } - - /** - * @return the name of the robot that died - * @deprecated Use {@link #getName()} instead. - */ - @Deprecated - public String getRobotName() { - return robotName; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onRobotDeath(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.RobotDeathEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - RobotDeathEvent obj = (RobotDeathEvent) object; - - return RbSerializer.SIZEOF_TYPEINFO + serializer.sizeOf(obj.robotName); - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - RobotDeathEvent obj = (RobotDeathEvent) object; - - serializer.serialize(buffer, obj.robotName); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - String name = serializer.deserializeString(buffer); - - return new RobotDeathEvent(name); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotStatus.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotStatus.java deleted file mode 100644 index 849fd96..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RobotStatus.java +++ /dev/null @@ -1,426 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.security.IHiddenStatusHelper; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; - -import java.io.Serializable; -import java.nio.ByteBuffer; - - -/** - * Contains the status of a robot for a specific time/turn returned by - * {@link StatusEvent#getStatus()}. - * - * @author Flemming N. Larsen (original) - * - * @since 1.5 - */ -public final class RobotStatus implements Serializable { - private static final long serialVersionUID = 1L; - - private final double energy; - private final double x; - private final double y; - private final double bodyHeading; - private final double gunHeading; - private final double radarHeading; - private final double velocity; - private final double bodyTurnRemaining; - private final double radarTurnRemaining; - private final double gunTurnRemaining; - private final double distanceRemaining; - private final double gunHeat; - private final int others; - private final int numSentries; - private final int roundNum; - private final int numRounds; - private final long time; - - /** - * Returns the robot's current energy. - * - * @return the robot's current energy - */ - public double getEnergy() { - return energy; - } - - /** - * Returns the X position of the robot. (0,0) is at the bottom left of the - * battlefield. - * - * @return the X position of the robot - * @see #getY() - */ - public double getX() { - return x; - } - - /** - * Returns the Y position of the robot. (0,0) is at the bottom left of the - * battlefield. - * - * @return the Y position of the robot - * @see #getX() - */ - public double getY() { - return y; - } - - /** - * Returns the direction that the robot's body is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's body is facing, in radians. - */ - public double getHeadingRadians() { - return bodyHeading; - } - - /** - * Returns the direction that the robot's body is facing, in degrees. - * The value returned will be between 0 and 360 (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * 90 means East, 180 means South, and 270 means West. - * - * @return the direction that the robot's body is facing, in degrees. - */ - public double getHeading() { - return Math.toDegrees(bodyHeading); - } - - /** - * Returns the direction that the robot's gun is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's gun is facing, in radians. - */ - public double getGunHeadingRadians() { - return gunHeading; - } - - /** - * Returns the direction that the robot's gun is facing, in degrees. - * The value returned will be between 0 and 360 (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * 90 means East, 180 means South, and 270 means West. - * - * @return the direction that the robot's gun is facing, in degrees. - */ - public double getGunHeading() { - return Math.toDegrees(gunHeading); - } - - /** - * Returns the direction that the robot's radar is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's radar is facing, in radians. - */ - public double getRadarHeadingRadians() { - return radarHeading; - } - - /** - * Returns the direction that the robot's radar is facing, in degrees. - * The value returned will be between 0 and 360 (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * 90 means East, 180 means South, and 270 means West. - * - * @return the direction that the robot's radar is facing, in degrees. - */ - public double getRadarHeading() { - return Math.toDegrees(radarHeading); - } - - /** - * Returns the velocity of the robot measured in pixels/turn. - *

- * The maximum velocity of a robot is defined by {@link Rules#MAX_VELOCITY} - * (8 pixels / turn). - * - * @return the velocity of the robot measured in pixels/turn - * @see Rules#MAX_VELOCITY - */ - public double getVelocity() { - return velocity; - } - - /** - * Returns the angle remaining in the robots's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently turning to the right. Negative values - * means that the robot is currently turning to the left. - * - * @return the angle remaining in the robots's turn, in radians - */ - public double getTurnRemainingRadians() { - return bodyTurnRemaining; - } - - /** - * Returns the angle remaining in the robots's turn, in degrees. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently turning to the right. Negative values - * means that the robot is currently turning to the left. - * - * @return the angle remaining in the robots's turn, in degrees - */ - public double getTurnRemaining() { - return Math.toDegrees(bodyTurnRemaining); - } - - /** - * Returns the angle remaining in the radar's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the radar is currently turning to the right. Negative values - * means that the radar is currently turning to the left. - * - * @return the angle remaining in the radar's turn, in radians - */ - public double getRadarTurnRemainingRadians() { - return radarTurnRemaining; - } - - /** - * Returns the angle remaining in the radar's turn, in degrees. - *

- * This call returns both positive and negative values. Positive values - * means that the radar is currently turning to the right. Negative values - * means that the radar is currently turning to the left. - * - * @return the angle remaining in the radar's turn, in degrees - */ - public double getRadarTurnRemaining() { - return Math.toDegrees(radarTurnRemaining); - } - - /** - * Returns the angle remaining in the gun's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the gun is currently turning to the right. Negative values - * means that the gun is currently turning to the left. - * - * @return the angle remaining in the gun's turn, in radians - */ - public double getGunTurnRemainingRadians() { - return gunTurnRemaining; - } - - /** - * Returns the angle remaining in the gun's turn, in degrees. - *

- * This call returns both positive and negative values. Positive values - * means that the gun is currently turning to the right. Negative values - * means that the gun is currently turning to the left. - * - * @return the angle remaining in the gun's turn, in degrees - */ - public double getGunTurnRemaining() { - return Math.toDegrees(gunTurnRemaining); - } - - /** - * Returns the distance remaining in the robot's current move measured in - * pixels. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently moving forwards. Negative values means - * that the robot is currently moving backwards. - * - * @return the distance remaining in the robot's current move measured in - * pixels. - */ - public double getDistanceRemaining() { - return distanceRemaining; - } - - /** - * Returns the current heat of the gun. The gun cannot fire unless this is - * 0. (Calls to fire will succeed, but will not actually fire unless - * getGunHeat() == 0). - *

- * The amount of gun heat generated when the gun is fired is - * 1 + (firePower / 5). Each turn the gun heat drops by the amount returned - * by {@link Robot#getGunCoolingRate()}, which is a battle setup. - *

- * Note that all guns are "hot" at the start of each round, where the gun - * heat is 3. - * - * @return the current gun heat - * @see Robot#getGunCoolingRate() - * @see Robot#fire(double) - * @see Robot#fireBullet(double) - */ - public double getGunHeat() { - return gunHeat; - } - - /** - * Returns how many opponents that are left in the current round. - * - * @return how many opponents that are left in the current round. - * @see #getNumSentries() - * @since 1.6.2 - */ - public int getOthers() { - return others; - } - - /** - * Returns how many sentry robots that are left in the current round. - * - * @return how many sentry robots that are left in the current round. - * @see #getOthers() - * @since 1.9.1.0 - */ - public int getNumSentries() { - return numSentries; - } - - /** - * Returns the number of rounds in the current battle. - * - * @return the number of rounds in the current battle - * @see #getRoundNum() - * @since 1.6.2 - */ - public int getNumRounds() { - return numRounds; - } - - /** - * Returns the current round number (0 to {@link #getNumRounds()} - 1) of - * the battle. - * - * @return the current round number of the battle (zero indexed). - * @see #getNumRounds() - * @since 1.6.2 - */ - public int getRoundNum() { - return roundNum; - } - - /** - * Returns the game time of the round, where the time is equal to the current turn in the round. - * - * @return the game time/turn of the current round. - * @since 1.6.2 - */ - public long getTime() { - return time; - } - - private RobotStatus(double energy, double x, double y, double bodyHeading, double gunHeading, double radarHeading, - double velocity, double bodyTurnRemaining, double radarTurnRemaining, double gunTurnRemaining, - double distanceRemaining, double gunHeat, int others, int numSentries, int roundNum, int numRounds, long time) { - this.energy = energy; - this.x = x; - this.y = y; - this.bodyHeading = bodyHeading; - this.gunHeading = gunHeading; - this.radarHeading = radarHeading; - this.bodyTurnRemaining = bodyTurnRemaining; - this.velocity = velocity; - this.radarTurnRemaining = radarTurnRemaining; - this.gunTurnRemaining = gunTurnRemaining; - this.distanceRemaining = distanceRemaining; - this.gunHeat = gunHeat; - this.others = others; - this.numSentries = numSentries; - this.roundNum = roundNum; - this.numRounds = numRounds; - this.time = time; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper, IHiddenStatusHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 12 * RbSerializer.SIZEOF_DOUBLE + 4 * RbSerializer.SIZEOF_INT - + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - RobotStatus obj = (RobotStatus) object; - - serializer.serialize(buffer, obj.energy); - serializer.serialize(buffer, obj.x); - serializer.serialize(buffer, obj.y); - serializer.serialize(buffer, obj.bodyHeading); - serializer.serialize(buffer, obj.gunHeading); - serializer.serialize(buffer, obj.radarHeading); - serializer.serialize(buffer, obj.velocity); - serializer.serialize(buffer, obj.bodyTurnRemaining); - serializer.serialize(buffer, obj.radarTurnRemaining); - serializer.serialize(buffer, obj.gunTurnRemaining); - serializer.serialize(buffer, obj.distanceRemaining); - serializer.serialize(buffer, obj.gunHeat); - serializer.serialize(buffer, obj.others); - serializer.serialize(buffer, obj.numSentries); - serializer.serialize(buffer, obj.roundNum); - serializer.serialize(buffer, obj.numRounds); - serializer.serialize(buffer, obj.time); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - double energy = buffer.getDouble(); - double x = buffer.getDouble(); - double y = buffer.getDouble(); - double bodyHeading = buffer.getDouble(); - double gunHeading = buffer.getDouble(); - double radarHeading = buffer.getDouble(); - double velocity = buffer.getDouble(); - double bodyTurnRemaining = buffer.getDouble(); - double radarTurnRemaining = buffer.getDouble(); - double gunTurnRemaining = buffer.getDouble(); - double distanceRemaining = buffer.getDouble(); - double gunHeat = buffer.getDouble(); - int others = buffer.getInt(); - int numSentries = buffer.getInt(); - int roundNum = buffer.getInt(); - int numRounds = buffer.getInt(); - long time = buffer.getLong(); - - return new RobotStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, bodyTurnRemaining, - radarTurnRemaining, gunTurnRemaining, distanceRemaining, gunHeat, others, numSentries, roundNum, numRounds, - time); - } - - public RobotStatus createStatus(double energy, double x, double y, double bodyHeading, double gunHeading, double radarHeading, double velocity, - double bodyTurnRemaining, double radarTurnRemaining, double gunTurnRemaining, double distanceRemaining, double gunHeat, int others, - int numSentries, int roundNum, int numRounds, long time) { - return new RobotStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, bodyTurnRemaining, - radarTurnRemaining, gunTurnRemaining, distanceRemaining, gunHeat, others, numSentries, roundNum, numRounds, - time); - } - } - -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RoundEndedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/RoundEndedEvent.java deleted file mode 100644 index e76fb05..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/RoundEndedEvent.java +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicEvents3; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A RoundEndedEvent is sent to {@link Robot#onRoundEnded(RoundEndedEvent) - * onRoundEnded()} when a round has ended. - * You can use the information contained in this event to determine which round that has ended. - * - * @see Robot#onRoundEnded(RoundEndedEvent) - * - * @author Flemming N. Larsen (original) - * - * @since 1.7.2 - */ -public final class RoundEndedEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 110; // System event -> cannot be changed! - - private final int round; - private final int turns; - private final int totalTurns; - - /** - * Called by the game to create a new RoundEndedEvent. - * - * @param round the round that has ended (zero-indexed). - * @param turns the number of turns that this round reached. - * @param totalTurns the total number of turns reached in the battle when this round ended. - */ - public RoundEndedEvent(int round, int turns, int totalTurns) { - this.round = round; - this.turns = turns; - this.totalTurns = totalTurns; - } - - /** - * Returns the round that ended (zero-indexed). - * - * @return the round that ended (zero-indexed). - */ - public int getRound() { - return round; - } - - /** - * Returns the number of turns that this round reached. - * - * @return the number of turns that this round reached. - */ - public int getTurns() { - return turns; - } - - /** - * Returns the total number of turns reached in the battle when this round ended. - * - * @return the total number of turns reached in the battle when this round ended. - */ - public int getTotalTurns() { - return totalTurns; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - public final int getPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (robot != null) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null && IBasicEvents3.class.isAssignableFrom(listener.getClass())) { - ((IBasicEvents3) listener).onRoundEnded(this); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - final boolean isCriticalEvent() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.RoundEndedEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + 3 * RbSerializer.SIZEOF_INT; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - RoundEndedEvent event = (RoundEndedEvent) object; - - serializer.serialize(buffer, event.round); - serializer.serialize(buffer, event.turns); - serializer.serialize(buffer, event.totalTurns); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int round = serializer.deserializeInt(buffer); - int turns = serializer.deserializeInt(buffer); - int totalTurns = serializer.deserializeInt(buffer); - - return new RoundEndedEvent(round, turns, totalTurns); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Rules.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/Rules.java deleted file mode 100644 index 96919fa..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/Rules.java +++ /dev/null @@ -1,229 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import static java.lang.Math.abs; -import static java.lang.Math.max; - - -/** - * Constants and methods that defines the rules of Robocode. - * Constants are used for rules that will not change. - * Methods are provided for rules that can be changed between battles or which depends - * on some other factor. - * - * @author Luis Crespo (original) - * @author Flemming N. Larsen (original) - * - * @since 1.1.4 - */ -public final class Rules { - - // Hide the constructor in the Javadocs as it should not be used - private Rules() {} - - /** - * The acceleration of a robot, i.e. the increase of velocity when the - * robot moves forward, which is 1 pixel/turn. - */ - public static final double ACCELERATION = 1; - - /** - * The deceleration of a robot, i.e. the decrease of velocity when the - * robot moves backwards (or brakes), which is 2 pixels/turn. - */ - public static final double DECELERATION = 2; - - /** - * The maximum velocity of a robot, which is 8 pixels/turn. - */ - public static final double MAX_VELOCITY = 8; - - /** - * The radar scan radius, which is 1200 pixels. - * Robots which is more than 1200 pixels away cannot be seen on the radar. - */ - public static final double RADAR_SCAN_RADIUS = 1200; - - /** - * The minimum bullet power, i.e the amount of energy required for firing a - * bullet, which is 0.1 energy points. - */ - public static final double MIN_BULLET_POWER = 0.1; - - /** - * The maximum bullet power, i.e. the maximum amount of energy that can be - * transferred to a bullet when it is fired, which is 3 energy points. - */ - public static final double MAX_BULLET_POWER = 3; - - /** - * The maximum turning rate of the robot, in degrees, which is - * 10 degress/turn. - * Note, that the turn rate of the robot depends on it's velocity. - * - * @see #MAX_TURN_RATE_RADIANS - * @see #getTurnRate(double) - * @see #getTurnRateRadians(double) - */ - public static final double MAX_TURN_RATE = 10; - - /** - * The maximum turning rate of the robot measured in radians instead of - * degrees. - * - * @see #MAX_TURN_RATE - * @see #getTurnRate(double) - * @see #getTurnRateRadians(double) - */ - public static final double MAX_TURN_RATE_RADIANS = Math.toRadians(MAX_TURN_RATE); - - /** - * The turning rate of the gun measured in degrees, which is - * 20 degrees/turn. - * Note, that if setAdjustGunForRobotTurn(true) has been called, the gun - * turn is independent of the robot turn. - * In this case the gun moves relatively to the screen. If - * setAdjustGunForRobotTurn(false) has been called or - * setAdjustGunForRobotTurn() has not been called at all (this is the - * default), then the gun turn is dependent on the robot turn, and in this - * case the gun moves relatively to the robot body. - * - * @see #GUN_TURN_RATE_RADIANS - * @see Robot#setAdjustGunForRobotTurn(boolean) - */ - public static final double GUN_TURN_RATE = 20; - - /** - * The turning rate of the gun measured in radians instead of degrees. - * - * @see #GUN_TURN_RATE - */ - public static final double GUN_TURN_RATE_RADIANS = Math.toRadians(GUN_TURN_RATE); - - /** - * The turning rate of the radar measured in degrees, which is - * 45 degrees/turn. - * Note, that if setAdjustRadarForRobotTurn(true) and/or - * setAdjustRadarForGunTurn(true) has been called, the radar turn is - * independent of the robot and/or gun turn. If both methods has been set to - * true, the radar moves relatively to the screen. - * If setAdjustRadarForRobotTurn(false) and/or setAdjustRadarForGunTurn(false) - * has been called or not called at all (this is the default), then the - * radar turn is dependent on the robot and/or gun turn, and in this case - * the radar moves relatively to the gun and/or robot body. - * - * @see #RADAR_TURN_RATE_RADIANS - * @see Robot#setAdjustGunForRobotTurn(boolean) - * @see Robot#setAdjustRadarForGunTurn(boolean) - */ - public static final double RADAR_TURN_RATE = 45; - - /** - * The turning rate of the radar measured in radians instead of degrees. - * - * @see #RADAR_TURN_RATE - */ - public static final double RADAR_TURN_RATE_RADIANS = Math.toRadians(RADAR_TURN_RATE); - - /** - * The amount of damage taken when a robot hits or is hit by another robot, - * which is 0.6 energy points. - */ - public static final double ROBOT_HIT_DAMAGE = 0.6; - - /** - * The amount of bonus given when a robot moving forward hits an opponent - * robot (ramming), which is 1.2 energy points. - */ - public static final double ROBOT_HIT_BONUS = 1.2; - - /** - * Returns the turn rate of a robot given a specific velocity measured in - * degrees/turn. - * - * @param velocity the velocity of the robot. - * @return turn rate in degrees/turn. - * @see #getTurnRateRadians(double) - */ - public static double getTurnRate(double velocity) { - return MAX_TURN_RATE - 0.75 * abs(velocity); - } - - /** - * Returns the turn rate of a robot given a specific velocity measured in - * radians/turn. - * - * @param velocity the velocity of the robot. - * @return turn rate in radians/turn. - * @see #getTurnRate(double) - */ - public static double getTurnRateRadians(double velocity) { - return Math.toRadians(getTurnRate(velocity)); - } - - /** - * Returns the amount of damage taken when robot hits a wall with a - * specific velocity. - * - * @param velocity the velocity of the robot. - * @return wall hit damage in energy points. - */ - public static double getWallHitDamage(double velocity) { - return max(abs(velocity) / 2 - 1, 0); - } - - /** - * Returns the amount of damage of a bullet given a specific bullet power. - * - * @param bulletPower the energy power of the bullet. - * @return bullet damage in energy points. - */ - public static double getBulletDamage(double bulletPower) { - double damage = 4 * bulletPower; - - if (bulletPower > 1) { - damage += 2 * (bulletPower - 1); - } - return damage; - } - - /** - * Returns the amount of bonus given when a robot's bullet hits an opponent - * robot given a specific bullet power. - * - * @param bulletPower the energy power of the bullet. - * @return bullet hit bonus in energy points. - */ - public static double getBulletHitBonus(double bulletPower) { - return 3 * bulletPower; - } - - /** - * Returns the speed of a bullet given a specific bullet power measured in pixels/turn. - * - * @param bulletPower the energy power of the bullet. - * @return bullet speed in pixels/turn - */ - public static double getBulletSpeed(double bulletPower) { - bulletPower = Math.min(Math.max(bulletPower, MIN_BULLET_POWER), MAX_BULLET_POWER); - return 20 - 3 * bulletPower; - } - - /** - * Returns the heat produced by firing the gun given a specific bullet - * power. - * - * @param bulletPower the energy power of the bullet. - * @return gun heat - */ - public static double getGunHeat(double bulletPower) { - return 1 + (bulletPower / 5); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/ScannedRobotEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/ScannedRobotEvent.java deleted file mode 100644 index 761f55f..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/ScannedRobotEvent.java +++ /dev/null @@ -1,314 +0,0 @@ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -public class ScannedRobotEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 10; - - private final String name; - private final double energy; - private final double heading; - private final double bearing; - private final double distance; - private final double velocity; - private final boolean isSentryRobot; - - - public ScannedRobotEvent() { - this(null, 0, 0, 0, 0, 0, false); - } - - /** - * Called by the game to create a new ScannedRobotEvent. - * - * @param name the name of the scanned robot - * @param energy the energy of the scanned robot - * @param bearing the bearing of the scanned robot, in radians - * @param distance the distance from your robot to the scanned robot - * @param heading the heading of the scanned robot - * @param velocity the velocity of the scanned robot - * - * @deprecated Use {@link #ScannedRobotEvent(String, double, double, double, double, double, boolean)} instead. - */ - public ScannedRobotEvent(String name, double energy, double bearing, double distance, double heading, double velocity) { - this(name, energy, bearing, distance, heading, velocity, false); - } - - /** - * Called by the game to create a new ScannedRobotEvent. - * - * @param name the name of the scanned robot - * @param energy the energy of the scanned robot - * @param bearing the bearing of the scanned robot, in radians - * @param distance the distance from your robot to the scanned robot - * @param heading the heading of the scanned robot - * @param velocity the velocity of the scanned robot - * @param isSentryRobot flag specifying if the scanned robot is a sentry robot - * - * @since 1.9.0.0 - */ - public ScannedRobotEvent(String name, double energy, double bearing, double distance, double heading, double velocity, boolean isSentryRobot) { - super(); - this.name = name; - this.energy = energy; - this.bearing = bearing; - this.distance = distance; - this.heading = heading; - this.velocity = velocity; - this.isSentryRobot = isSentryRobot; - } - - - public double getBearing() { - return bearing * 180.0 / Math.PI; - } - - public double getBearingRadians() { - return bearing; - } - - /** - * Returns the distance to the robot (your center to his center). - * - * @return the distance to the robot. - */ - public double getDistance() { - return distance; - } - - - public double getEnergy() { - return energy; - } - - - public double getHeading() { - return heading * 180.0 / Math.PI; - } - - /** - * Returns the heading of the robot, in radians (0 <= getHeading() < 2 * PI) - * - * @return the heading of the robot, in radians - */ - public double getHeadingRadians() { - return heading; - } - - /** - * @return the energy of the robot - * @deprecated Use {@link #getEnergy()} instead. - */ - @Deprecated - public double getLife() { - return energy; - } - - /** - * Returns the name of the robot. - * - * @return the name of the robot - */ - public String getName() { - return name; - } - - /** - * @return the bearing to the robot you scanned, in degrees - * @deprecated Use {@link #getBearing()} instead. - */ - @Deprecated - public double getRobotBearing() { - return getBearing(); - } - - /** - * @return the robot bearing in degrees - * @deprecated Use {@link #getBearing()} instead. - */ - @Deprecated - public double getRobotBearingDegrees() { - return getBearing(); - } - - /** - * @return the bearing to the robot you scanned, in radians - * @deprecated Use {@link #getBearingRadians()} instead. - */ - @Deprecated - public double getRobotBearingRadians() { - return getBearingRadians(); - } - - /** - * @return the distance to the robot. - * @deprecated Use {@link #getDistance()} instead. - */ - @Deprecated - public double getRobotDistance() { - return getDistance(); - } - - /** - * @return the heading of the robot, in degrees - * @deprecated Use {@link #getHeading()} instead. - */ - @Deprecated - public double getRobotHeading() { - return getHeading(); - } - - /** - * @return the heading of the robot, in degrees - * @deprecated Use {@link #getHeading()} instead. - */ - @Deprecated - public double getRobotHeadingDegrees() { - return getHeading(); - } - - /** - * @return the heading of the robot, in radians - * @deprecated Use {@link #getHeadingRadians()} instead. - */ - @Deprecated - public double getRobotHeadingRadians() { - return getHeadingRadians(); - } - - /** - * @return the energy of the robot - * @deprecated Use {@link #getEnergy()} instead. - */ - @Deprecated - public double getRobotLife() { - return getEnergy(); - } - - /** - * @return the name of the robot - * @deprecated Use {@link #getName()} instead. - */ - @Deprecated - public String getRobotName() { - return getName(); - } - - /** - * @return the velocity of the robot - * @deprecated Use {@link #getVelocity()} instead. - */ - @Deprecated - public double getRobotVelocity() { - return getVelocity(); - } - - /** - * Returns the velocity of the robot. - * - * @return the velocity of the robot - */ - public double getVelocity() { - return velocity; - } - - /** - * Checks if the scanned robot is a sentry robot. - * @return {@code true} if the scanned robot is a sentry robot; {@code false} otherwise. - * - * @since 1.9.0.0 - */ - public boolean isSentryRobot() { - return isSentryRobot; - } - - /** - * {@inheritDoc} - */ - @Override - public final int compareTo(Event event) { - final int res = super.compareTo(event); - if (res != 0) { - return res; - } - // Compare the distance, if the events are ScannedRobotEvents - // The shorter distance to the robot, the higher priority - if (event instanceof ScannedRobotEvent) { - return (int) (this.getDistance() - ((ScannedRobotEvent) event).getDistance()); - } - // No difference found - return 0; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - if (listener != null) { - listener.onScannedRobot(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.ScannedRobotEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - ScannedRobotEvent obj = (ScannedRobotEvent) object; - return RbSerializer.SIZEOF_TYPEINFO + serializer.sizeOf(obj.name) + 5 * RbSerializer.SIZEOF_DOUBLE - + RbSerializer.SIZEOF_BOOL; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - ScannedRobotEvent obj = (ScannedRobotEvent) object; - serializer.serialize(buffer, obj.name); - serializer.serialize(buffer, obj.energy); - serializer.serialize(buffer, obj.heading); - serializer.serialize(buffer, obj.bearing); - serializer.serialize(buffer, obj.distance); - serializer.serialize(buffer, obj.velocity); - serializer.serialize(buffer, obj.isSentryRobot); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - String name = serializer.deserializeString(buffer); - double energy = buffer.getDouble(); - double heading = buffer.getDouble(); - double bearing = buffer.getDouble(); - double distance = buffer.getDouble(); - double velocity = buffer.getDouble(); - boolean isSentryRobot = serializer.deserializeBoolean(buffer); - - return new ScannedRobotEvent(name, energy, bearing, distance, heading, velocity, isSentryRobot); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/SkippedTurnEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/SkippedTurnEvent.java deleted file mode 100644 index 2e1d7ba..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/SkippedTurnEvent.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IAdvancedEvents; -import robocode.robotinterfaces.IAdvancedRobot; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * A SkippedTurnEvent is sent to {@link AdvancedRobot#onSkippedTurn(SkippedTurnEvent) - * onSkippedTurn()} when your robot is forced to skipping a turn. - * You must take an action every turn in order to participate in the game. - * For example, - *

- *    try {
- *        Thread.sleep(1000);
- *    } catch (InterruptedException e) {
- *        // Immediately reasserts the exception by interrupting the caller thread
- *        // itself.
- *        Thread.currentThread().interrupt();
- *    }
- * 
- * will cause many SkippedTurnEvents, because you are not responding to the game. - * If you receive 30 SkippedTurnEvents, you will be removed from the round. - *

- * Instead, you should do something such as: - *

- *     for (int i = 0; i < 30; i++) {
- *         doNothing(); // or perhaps scan();
- *     }
- * 
- *

- * This event may also be generated if you are simply doing too much processing - * between actions, that is using too much processing power for the calculations - * etc. in your robot. - * - * @see AdvancedRobot#onSkippedTurn(SkippedTurnEvent) - * @see SkippedTurnEvent - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class SkippedTurnEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 100; // System event -> cannot be changed!; - - private final long skippedTurn; - - /** - * Called by the game to create a new SkippedTurnEvent. - * - * @param skippedTurn the skipped turn - */ - public SkippedTurnEvent(long skippedTurn) { - super(); - this.skippedTurn = skippedTurn; - } - - /** - * Returns the turn that was skipped. - * - * @return the turn that was skipped. - * - * @since 1.7.2.0 - */ - public long getSkippedTurn() { - return skippedTurn; - } - - /** - * {@inheritDoc} - */ - @Override - public final int getPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - if (statics.isAdvancedRobot()) { - IAdvancedEvents listener = ((IAdvancedRobot) robot).getAdvancedEventListener(); - - if (listener != null) { - listener.onSkippedTurn(this); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - final boolean isCriticalEvent() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.SkippedTurnEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_LONG; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - SkippedTurnEvent obj = (SkippedTurnEvent) object; - - serializer.serialize(buffer, obj.skippedTurn); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - long skippedTurn = buffer.getLong(); - - return new SkippedTurnEvent(skippedTurn); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/StatusEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/StatusEvent.java deleted file mode 100644 index 3ef4c80..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/StatusEvent.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; - - -/** - * This event is sent to {@link Robot#onStatus(StatusEvent) onStatus()} every - * turn in a battle to provide the status of the robot. - * - * @author Flemming N. Larsen (original) - * - * @since 1.5 - */ -public final class StatusEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 99; - - private final RobotStatus status; - - /** - * This constructor is called internally from the game in order to create - * a new {@link RobotStatus}. - * - * @param status the current states - */ - public StatusEvent(RobotStatus status) { - super(); - - this.status = status; - } - - /** - * Returns the {@link RobotStatus} at the time defined by {@link Robot#getTime()}. - * - * @return the {@link RobotStatus} at the time defined by {@link Robot#getTime()}. - * @see #getTime() - */ - public RobotStatus getStatus() { - return status; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onStatus(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - throw new Error("Serialization of this type is not supported"); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/TeamRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/TeamRobot.java deleted file mode 100644 index bd29ea7..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/TeamRobot.java +++ /dev/null @@ -1,73 +0,0 @@ -package robocode; - - -import robocode.robotinterfaces.ITeamEvents; -import robocode.robotinterfaces.ITeamRobot; -import robocode.robotinterfaces.peer.ITeamRobotPeer; - -import java.io.IOException; -import java.io.Serializable; -import java.util.Vector; - - - -public class TeamRobot extends AdvancedRobot implements ITeamRobot, ITeamEvents { - - - public void broadcastMessage(Serializable message) throws IOException { - if (peer != null) { - ((ITeamRobotPeer) peer).broadcastMessage(message); - } else { - uninitializedException(); - } - } - - - public Vector getMessageEvents() { - if (peer != null) { - return new Vector(((ITeamRobotPeer) peer).getMessageEvents()); - } - uninitializedException(); - return null; // never called - } - - /** - * Do not call this method! - *

- * {@inheritDoc} - */ - public final ITeamEvents getTeamEventListener() { - return this; // this robot is listening - } - - - public String[] getTeammates() { - if (peer != null) { - return ((ITeamRobotPeer) peer).getTeammates(); - } - uninitializedException(); - return null; - } - - - public boolean isTeammate(String name) { - if (peer != null) { - return ((ITeamRobotPeer) peer).isTeammate(name); - } - uninitializedException(); - return false; - } - - /** - * {@inheritDoc} - */ - public void onMessageReceived(MessageEvent event) {} - - public void sendMessage(String name, Serializable message) throws IOException { - if (peer != null) { - ((ITeamRobotPeer) peer).sendMessage(name, message); - } else { - uninitializedException(); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/TurnCompleteCondition.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/TurnCompleteCondition.java deleted file mode 100644 index 9e25dbb..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/TurnCompleteCondition.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * A prebuilt condition you can use that indicates your robot has finished - * turning. - * - * @see Condition - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Nathaniel Troutman (contributor) - */ -public class TurnCompleteCondition extends Condition { - private AdvancedRobot robot; - - /** - * Creates a new TurnCompleteCondition with default priority. - * The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - */ - public TurnCompleteCondition(AdvancedRobot robot) { - super(); - this.robot = robot; - } - - /** - * Creates a new TurnCompleteCondition with the specified priority. - * A condition priority is a value from 0 - 99. The higher value, the - * higher priority. The default priority is 80. - * - * @param robot your robot, which must be a {@link AdvancedRobot} - * @param priority the priority of this condition - * @see Condition#setPriority(int) - */ - public TurnCompleteCondition(AdvancedRobot robot, int priority) { - super(); - this.robot = robot; - this.priority = priority; - } - - /** - * Tests if the robot has finished turning. - * - * @return {@code true} if the robot has stopped turning; {@code false} - * otherwise - */ - @Override - public boolean test() { - return (robot.getTurnRemaining() == 0); - } - - /** - * Called by the system in order to clean up references to internal objects. - * - * @since 1.4.3 - */ - @Override - public void cleanup() { - robot = null; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/WinEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/WinEvent.java deleted file mode 100644 index 6d79462..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/WinEvent.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; - -import java.awt.*; -import java.nio.ByteBuffer; - - -/** - * This event is sent to {@link Robot#onWin(WinEvent) onWin()} when your robot - * wins the round in a battle. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public final class WinEvent extends Event { - private static final long serialVersionUID = 1L; - private final static int DEFAULT_PRIORITY = 100; // System event -> cannot be changed! - - /** - * Called by the game to create a new WinEvent. - */ - public WinEvent() { - super(); - } - - /** - * {@inheritDoc} - */ - @Override - public final int getPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final int getDefaultPriority() { - return DEFAULT_PRIORITY; - } - - /** - * {@inheritDoc} - */ - @Override - final void dispatch(IBasicRobot robot, IRobotStatics statics, Graphics2D graphics) { - IBasicEvents listener = robot.getBasicEventListener(); - - if (listener != null) { - listener.onWin(this); - } - } - - /** - * {@inheritDoc} - */ - @Override - final boolean isCriticalEvent() { - return true; - } - - /** - * {@inheritDoc} - */ - @Override - byte getSerializationType() { - return RbSerializer.WinEvent_TYPE; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) {} - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - return new WinEvent(); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRadiansRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRadiansRobot.java deleted file mode 100644 index 32dddbb..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRadiansRobot.java +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import robocode.robotinterfaces.peer.IAdvancedRobotPeer; - - -/** - * This class is used by the system as a placeholder for all *Radians calls in - * {@link AdvancedRobot}. You may refer to this class for documentation only. - *

- * You should create a {@link AdvancedRobot} instead. - *

- * (The Radians methods themselves will continue work, however). - * - * @see Robot - * @see JuniorRobot - * @see AdvancedRobot - * @see TeamRobot - * @see RateControlRobot - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Pavel Savara (contributor) - */ -public class _AdvancedRadiansRobot extends _AdvancedRobot { - - _AdvancedRadiansRobot() {} - - public double getHeadingRadians() { - if (peer != null) { - return peer.getBodyHeading(); - } - uninitializedException(); - return 0; // never called - } - - public void setTurnLeftRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnBody(-radians); - } else { - uninitializedException(); - } - } - - public void setTurnRightRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnBody(radians); - } else { - uninitializedException(); - } - } - - public void turnLeftRadians(double radians) { - if (peer != null) { - peer.turnBody(-radians); - } else { - uninitializedException(); - } - } - - public void turnRightRadians(double radians) { - if (peer != null) { - peer.turnBody(radians); - } else { - uninitializedException(); - } - } - - public double getGunHeadingRadians() { - if (peer != null) { - return peer.getGunHeading(); - } - uninitializedException(); - return 0; // never called - } - - public double getRadarHeadingRadians() { - if (peer != null) { - return peer.getRadarHeading(); - } - uninitializedException(); - return 0; // never called - } - - public void setTurnGunLeftRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnGun(-radians); - } else { - uninitializedException(); - } - } - - public void setTurnGunRightRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnGun(radians); - } else { - uninitializedException(); - } - } - - public void setTurnRadarLeftRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnRadar(-radians); - } else { - uninitializedException(); - } - } - - public void setTurnRadarRightRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnRadar(radians); - } else { - uninitializedException(); - } - } - - public void turnGunLeftRadians(double radians) { - if (peer != null) { - peer.turnGun(-radians); - } else { - uninitializedException(); - } - } - - public void turnGunRightRadians(double radians) { - if (peer != null) { - peer.turnGun(radians); - } else { - uninitializedException(); - } - } - - public void turnRadarLeftRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).turnRadar(-radians); - } else { - uninitializedException(); - } - } - - public void turnRadarRightRadians(double radians) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).turnRadar(radians); - } else { - uninitializedException(); - } - } - - public double getGunTurnRemainingRadians() { - if (peer != null) { - return peer.getGunTurnRemaining(); - } - uninitializedException(); - return 0; // never called - } - - public double getRadarTurnRemainingRadians() { - if (peer != null) { - return peer.getRadarTurnRemaining(); - } - uninitializedException(); - return 0; // never called - } - - public double getTurnRemainingRadians() { - if (peer != null) { - return peer.getBodyTurnRemaining(); - } - uninitializedException(); - return 0; // never called - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRobot.java deleted file mode 100644 index 0090040..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_AdvancedRobot.java +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import robocode.robotinterfaces.peer.IAdvancedRobotPeer; - - -/** - * This class is used by the system, as well as being a placeholder for all deprecated - * (meaning, you should not use them) calls for {@link AdvancedRobot}. - *

- * You should create a {@link AdvancedRobot} instead. - * - * @see Robot - * @see JuniorRobot - * @see AdvancedRobot - * @see TeamRobot - * @see RateControlRobot - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Pavel Savara (contributor) - */ -public class _AdvancedRobot extends Robot { - - _AdvancedRobot() {} - - /** - * @param degrees the amount of degrees to turn the robot's gun to the left. - * If {@code degrees} > 0 the robot's gun is set to turn left. - * If {@code degrees} < 0 the robot's gun is set to turn right. - * If {@code degrees} = 0 the robot's gun is set to stop turning. - * @deprecated Use {@link AdvancedRobot#setTurnGunLeft(double) - * setTurnGunLeft} instead. - */ - @Deprecated - public void setTurnGunLeftDegrees(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnGun(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * @param degrees the amount of degrees to turn the robot's gun to the right. - * If {@code degrees} > 0 the robot's gun is set to turn right. - * If {@code degrees} < 0 the robot's gun is set to turn left. - * If {@code degrees} = 0 the robot's gun is set to stop turning. - * @deprecated Use {@link AdvancedRobot#setTurnGunRight(double) - * setTurnGunRight} instead. - */ - @Deprecated - public void setTurnGunRightDegrees(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnGun(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * @param degrees the amount of degrees to turn the robot's radar to the right. - * If {@code degrees} > 0 the robot's radar will turn right. - * If {@code degrees} < 0 the robot's radar will turn left. - * If {@code degrees} = 0 the robot's radar will not turn, but execute. - * @deprecated Use {@link Robot#turnRadarRight(double) turnRadarRight} - * instead. - */ - @Deprecated - public void turnRadarRightDegrees(double degrees) { - turnRadarRight(degrees); - } - - /** - * @param degrees the amount of degrees to turn the robot's body to the right. - * If {@code degrees} > 0 the robot is set to turn right. - * If {@code degrees} < 0 the robot is set to turn left. - * If {@code degrees} = 0 the robot is set to stop turning. - * @deprecated Use {@link AdvancedRobot#setTurnRight(double) - * setTurnRight(double)} instead. - */ - @Deprecated - public void setTurnRightDegrees(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnBody(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * @param degrees the amount of degrees to turn the robot's radar to the left. - * If {@code degrees} > 0 the robot's radar is set to turn left. - * If {@code degrees} < 0 the robot's radar is set to turn right. - * If {@code degrees} = 0 the robot's radar is set to stop turning. - * @deprecated Use {@link AdvancedRobot#setTurnRadarLeft(double) - * setTurnRadarLeft(double)} instead. - */ - @Deprecated - public void setTurnRadarLeftDegrees(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnRadar(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * @param degrees the amount of degrees to turn the robot's body to the left. - * If {@code degrees} > 0 the robot is set to turn left. - * If {@code degrees} < 0 the robot is set to turn right. - * If {@code degrees} = 0 the robot is set to stop turning. - * @deprecated Use {@link AdvancedRobot#setTurnLeft(double) - * setTurnLeft(double)} instead. - */ - @Deprecated - public void setTurnLeftDegrees(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnBody(-Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * @return the direction that the robot's body is facing, in degrees. - * @deprecated Use {@link Robot#getHeading() getHeading()} instead. - */ - @Deprecated - public double getHeadingDegrees() { - return getHeading(); - } - - /** - * @param degrees the amount of degrees to turn the robot's body to the left. - * If {@code degrees} > 0 the robot will turn left. - * If {@code degrees} < 0 the robot will turn right. - * If {@code degrees} = 0 the robot will not turn, but execute. - * @deprecated Use {@link Robot#turnLeft(double) turnLeft(double)} instead. - */ - @Deprecated - public void turnLeftDegrees(double degrees) { - turnLeft(degrees); - } - - /** - * @param degrees the amount of degrees to turn the robot's body to the right. - * If {@code degrees} > 0 the robot will turn right. - * If {@code degrees} < 0 the robot will turn left. - * If {@code degrees} = 0 the robot will not turn, but execute. - * @deprecated Use {@link Robot#turnRight(double) turnRight(double)} instead. - */ - @Deprecated - public void turnRightDegrees(double degrees) { - turnRight(degrees); - } - - /** - * @deprecated Use {@link AdvancedRobot#execute() execute} instead. - */ - @Deprecated - public void endTurn() { - if (peer != null) { - peer.execute(); - } else { - uninitializedException(); - } - } - - /** - * @return the direction that the robot's gun is facing, in degrees. - * @deprecated Use {@link Robot#getGunHeading() getGunHeading()} instead. - */ - @Deprecated - public double getGunHeadingDegrees() { - return getGunHeading(); - } - - /** - * @return the direction that the robot's radar is facing, in degrees. - * @deprecated Use {@link Robot#getRadarHeading() getRadarHeading()} instead. - */ - @Deprecated - public double getRadarHeadingDegrees() { - return getRadarHeading(); - } - - /** - * @return allways {@code 0} as this method is no longer functional. - * @deprecated This method is no longer functional. - * Use {@link AdvancedRobot#onSkippedTurn(SkippedTurnEvent)} instead. - */ - @Deprecated - public int getWaitCount() { - if (peer != null) { - peer.getCall(); - } - return 0; - } - - /** - * @param degrees the amount of degrees to turn the robot's radar to the right. - * If {@code degrees} > 0 the robot's radar is set to turn right. - * If {@code degrees} < 0 the robot's radar is set to turn left. - * If {@code degrees} = 0 the robot's radar is set to stop turning. - * @deprecated Use {@link AdvancedRobot#setTurnRadarRight(double) - * setTurnRadarRight} instead. - */ - @Deprecated - public void setTurnRadarRightDegrees(double degrees) { - if (peer != null) { - ((IAdvancedRobotPeer) peer).setTurnRadar(Math.toRadians(degrees)); - } else { - uninitializedException(); - } - } - - /** - * @param degrees the amount of degrees to turn the robot's gun to the left. - * If {@code degrees} > 0 the robot's gun will turn left. - * If {@code degrees} < 0 the robot's gun will turn right. - * If {@code degrees} = 0 the robot's gun will not turn, but execute. - * @deprecated Use {@link Robot#turnGunLeft(double) turnGunLeft} instead. - */ - @Deprecated - public void turnGunLeftDegrees(double degrees) { - turnGunLeft(degrees); - } - - /** - * @param degrees the amount of degrees to turn the robot's gun to the right. - * If {@code degrees} > 0 the robot's gun will turn right. - * If {@code degrees} < 0 the robot's gun will turn left. - * If {@code degrees} = 0 the robot's gun will not turn, but execute. - * @deprecated Use {@link Robot#turnGunRight(double) turnGunRight} instead. - */ - @Deprecated - public void turnGunRightDegrees(double degrees) { - turnGunRight(degrees); - } - - /** - * @param degrees the amount of degrees to turn the robot's radar to the left. - * If {@code degrees} > 0 the robot's radar will turn left. - * If {@code degrees} < 0 the robot's radar will turn right. - * If {@code degrees} = 0 the robot's radar will not turn, but execute. - * @deprecated Use {@link Robot#turnRadarLeft(double) turnRadarLeft} instead. - */ - @Deprecated - public void turnRadarLeftDegrees(double degrees) { - turnRadarLeft(degrees); - } - - /** - * @return allways {@code 0} as this method is no longer functional. - * @deprecated This method is no longer functional. - * Use {@link AdvancedRobot#onSkippedTurn(SkippedTurnEvent)} instead. - */ - @Deprecated - public int getMaxWaitCount() { - if (peer != null) { - peer.getCall(); - } - return 0; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_Robot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/_Robot.java deleted file mode 100644 index 3ff146c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_Robot.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * This class is used by the system, as well as being a placeholder for all deprecated - * (meaning, you should not use them) calls for {@link Robot}. - *

- * You should create a {@link Robot} instead. - * - * @see Robot - * @see JuniorRobot - * @see AdvancedRobot - * @see TeamRobot - * @see RateControlRobot - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Pavel Savara (contributor) - */ -public abstract class _Robot extends _RobotBase { - private String robotImageName; - private String gunImageName; - private String radarImageName; - - _Robot() {} - - /** - * @return 5 - {@link robocode.Robot#getGunHeat() getGunHeat()}. - * @deprecated Use {@link Robot#getGunHeat() getGunHeat()} instead. - */ - @Deprecated - public double getGunCharge() { - if (peer != null) { - return 5 - peer.getGunHeat(); - } - uninitializedException(); - return 0; // never called - } - - /** - * @return the robot's current life/energy. - * @deprecated Use {@link Robot#getEnergy() getEnergy()} instead. - */ - @Deprecated - public double getLife() { - if (peer != null) { - return peer.getEnergy(); - } - uninitializedException(); - return 0; // never called - } - - /** - * @return the number of rounds in the current battle - * @deprecated Use {@link Robot#getNumRounds() getNumRounds()} instead. - */ - @Deprecated - public int getNumBattles() { - if (peer != null) { - return peer.getNumRounds(); - } - uninitializedException(); - return 0; // never called - } - - /** - * @return the current round number of the battle (zero indexed). - * @deprecated Use {@link Robot#getRoundNum() getRoundNum()} instead. - */ - @Deprecated - public int getBattleNum() { - if (peer != null) { - return peer.getRoundNum(); - } - uninitializedException(); - return 0; // never called - } - - /** - * This call has moved to {@link AdvancedRobot}, and will no longer function in - * the {@link Robot} class. - * - * @param interruptible {@code true} if the event handler should be - * interrupted if new events of the same priority occurs; {@code false} - * otherwise - */ - public void setInterruptible(boolean interruptible) {} - - /** - * @return the name of the gun image - * @deprecated This call is not used. - */ - @Deprecated - public String getGunImageName() { - return gunImageName; - } - - /** - * @param newGunImageName the name of the new gun image - * @deprecated This call is not used. - */ - @Deprecated - public void setGunImageName(String newGunImageName) { - gunImageName = newGunImageName; - } - - /** - * @param newRadarImageName the name of the new radar image - * @deprecated This call is not used. - */ - @Deprecated - public void setRadarImageName(String newRadarImageName) { - radarImageName = newRadarImageName; - } - - /** - * @param newRobotImageName the name of the new robot body image - * @deprecated This call is not used. - */ - @Deprecated - public void setRobotImageName(String newRobotImageName) { - robotImageName = newRobotImageName; - } - - /** - * @return the name of the radar image - * @deprecated This call is not used. - */ - @Deprecated - public String getRadarImageName() { - return radarImageName; - } - - /** - * @return the name of the robot image - * @deprecated This call is not used. - */ - @Deprecated - public String getRobotImageName() { - return robotImageName; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_RobotBase.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/_RobotBase.java deleted file mode 100644 index b760340..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/_RobotBase.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -import robocode.exception.RobotException; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.peer.IBasicRobotPeer; - - -/** - * This is the base class of all robots used by the system. - * You should not inherit your robot on this class. - *

- * You should create a robot that is derived from the {@link Robot}, {@link AdvancedRobot}, - * {@link JuniorRobot}, {@link TeamRobot}, or {@link RateControlRobot} class instead. - * - * @see Robot - * @see JuniorRobot - * @see AdvancedRobot - * @see TeamRobot - * @see RateControlRobot - * - * @author Flemming N. Larsen (original) - * @author Pavel Savara (contributor) - * - * @since 1.4 - */ -public abstract class _RobotBase implements IBasicRobot, Runnable { - - // Internal for this package - _RobotBase() {} - - IBasicRobotPeer peer; - - /** - * The output stream your robot should use to print. - *

- * You can view the print-outs by clicking the button for your robot in the - * right side of the battle window. - *

- * Example: - *

-	 *   // Print out a line each time my robot hits another robot
-	 *   public void onHitRobot(HitRobotEvent e) {
-	 *       out.println("I hit a robot!  My energy: " + getEnergy() + " his energy: " + e.getEnergy());
-	 *   }
-	 * 
- */ - public java.io.PrintStream out; - - /** - * Called by the system to 'clean up' after your robot. - * You may not override this method. - */ - @Override - protected final void finalize() throws Throwable { // This method must be final so it cannot be overridden! - super.finalize(); - } - - /** - * {@inheritDoc} - */ - public final void setOut(java.io.PrintStream out) { - this.out = out; - } - - /** - * {@inheritDoc} - */ - public final void setPeer(IBasicRobotPeer peer) { - this.peer = peer; - } - - /** - * Throws a RobotException. This method should be called when the robot's peer - * is uninitialized. - */ - static void uninitializedException() { - StackTraceElement[] trace = Thread.currentThread().getStackTrace(); - String methodName = trace[2].getMethodName(); - - throw new RobotException( - "You cannot call the " + methodName - + "() method before your run() method is called, or you are using a Robot object that the game doesn't know about."); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/SafeStatic.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/SafeStatic.java deleted file mode 100644 index fdebf04..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/SafeStatic.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.annotation; - - -import java.lang.annotation.*; - - -/** - * Annotation used for marking a static field as being safe so that Robocode should - * not print out warnings at runtime when this annotation is being used. - * For example, Robocode will print out warnings if a static field to a robot is found. - * But not when the @SafeStatic is declared for the static field. - * - * @author Flemming N. Larsen (original) - * - * @since 1.7.2.1 - */ -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -public @interface SafeStatic {} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/package-info.java deleted file mode 100644 index 65daba2..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/annotation/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Contains annotations that can be used with Robocode. - */ -package robocode.annotation; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattleSpecification.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattleSpecification.java deleted file mode 100644 index ceba0fb..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattleSpecification.java +++ /dev/null @@ -1,234 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -/** - * A BattleSpecification defines a battle configuration used by the {@link RobocodeEngine}. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class BattleSpecification implements java.io.Serializable { - - private static final long serialVersionUID = 1L; - - private final int battlefieldWidth; - private final int battlefieldHeight; - private final int numRounds; - private final double gunCoolingRate; - private final long inactivityTime; - private final boolean hideEnemyNames; - private final int sentryBorderSize; - private final RobotSpecification[] robots; - private final RobotSetup[] initialSetups; - - /** - * Creates a new BattleSpecification with the given number of rounds, battlefield size, and robots. - * Inactivity time for the robots defaults to 450, and the gun cooling rate defaults to 0.1. - * - * @param numRounds is the number of rounds in this battle. - * @param battlefieldSize is the battlefield size. - * @param robots is the robots participating in this battle. - */ - public BattleSpecification(int numRounds, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) { - this(numRounds, 450, 0.1, battlefieldSize, robots); - } - - /** - * Creates a new BattleSpecification with the given settings. - * - * @param numRounds is the number of rounds in this battle. - * @param inactivityTime is the inactivity time allowed for the robots before they will loose energy. - * @param gunCoolingRate is the gun cooling rate for the robots. - * @param battlefieldSize is the battlefield size. - * @param robots is the robots participating in this battle. - */ - public BattleSpecification(int numRounds, long inactivityTime, double gunCoolingRate, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) { - this(numRounds, inactivityTime, gunCoolingRate, false, battlefieldSize, robots); - } - - /** - * Creates a new BattleSpecification with the given settings. - * - * @param numRounds is the number of rounds in this battle. - * @param inactivityTime is the inactivity time allowed for the robots before they will loose energy. - * @param gunCoolingRate is the gun cooling rate for the robots. - * @param hideEnemyNames flag specifying if enemy names are hidden from robots. - * @param battlefieldSize is the battlefield size. - * @param robots is the robots participating in this battle. - * - * @since 1.7.3 - */ - public BattleSpecification(int numRounds, long inactivityTime, double gunCoolingRate, boolean hideEnemyNames, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) { - this(battlefieldSize, numRounds, inactivityTime, gunCoolingRate, 100, hideEnemyNames, robots); - } - - /** - * Creates a new BattleSpecification with the given settings. - * - * @param battlefieldSize is the battlefield size. - * @param numRounds is the number of rounds in this battle. - * @param inactivityTime is the inactivity time allowed for the robots before they will loose energy. - * @param gunCoolingRate is the gun cooling rate for the robots. - * @param sentryBorderSize is the sentry border size for a {@link robocode.BorderSentry BorderSentry}. - * @param hideEnemyNames flag specifying if enemy names are hidden from robots. - * @param robots is the robots participating in this battle. - * - * @since 1.9.0.0 - */ - public BattleSpecification(BattlefieldSpecification battlefieldSize, int numRounds, long inactivityTime, double gunCoolingRate, int sentryBorderSize, boolean hideEnemyNames, RobotSpecification[] robots) { - this(battlefieldSize, numRounds, inactivityTime, gunCoolingRate, 100, hideEnemyNames, robots, null); - } - - /** - * Creates a new BattleSpecification with the given settings. - * - * @param battlefieldSize is the battlefield size. - * @param numRounds is the number of rounds in this battle. - * @param inactivityTime is the inactivity time allowed for the robots before they will loose energy. - * @param gunCoolingRate is the gun cooling rate for the robots. - * @param sentryBorderSize is the sentry border size for a {@link robocode.BorderSentry BorderSentry}. - * @param hideEnemyNames flag specifying if enemy names are hidden from robots. - * @param robots is the robots participating in this battle. - * @param initialSetup is the initial position and heading of the robots, where the indices matches the indices from the {@code robots} parameter. - * - * @since 1.9.2.0 - */ - public BattleSpecification(BattlefieldSpecification battlefieldSize, int numRounds, long inactivityTime, double gunCoolingRate, int sentryBorderSize, boolean hideEnemyNames, RobotSpecification[] robots, RobotSetup[] initialSetups) { - if (battlefieldSize == null) { - throw new IllegalArgumentException("battlefieldSize cannot be null"); - } - if (robots == null) { - throw new IllegalArgumentException("robots cannot be null"); - } - if (robots.length < 1) { - throw new IllegalArgumentException("robots.length must be > 0"); - } - if (initialSetups != null && initialSetups.length != robots.length) { - throw new IllegalArgumentException("initialSetups.length must be == robots.length"); - } - if (numRounds < 1) { - throw new IllegalArgumentException("numRounds must be >= 1"); - } - if (inactivityTime < 1) { - throw new IllegalArgumentException("inactivityTime must be >= 1"); - } - if (gunCoolingRate < 0.1) { - throw new IllegalArgumentException("inactivityTime must be >= 0.1"); - } - if (sentryBorderSize < 50) { - throw new IllegalArgumentException("sentryBorderSize must be >= 50"); - } - this.battlefieldWidth = battlefieldSize.getWidth(); - this.battlefieldHeight = battlefieldSize.getHeight(); - this.numRounds = numRounds; - this.inactivityTime = inactivityTime; - this.gunCoolingRate = gunCoolingRate; - this.sentryBorderSize = sentryBorderSize; - this.hideEnemyNames = hideEnemyNames; - this.robots = robots; - this.initialSetups = initialSetups; - } - - /** - * Returns the allowed inactivity time for the robots in this battle. - * - * @return the allowed inactivity time for the robots in this battle. - */ - public long getInactivityTime() { - return inactivityTime; - } - - /** - * Returns the gun cooling rate of the robots in this battle. - * - * @return the gun cooling rate of the robots in this battle. - */ - public double getGunCoolingRate() { - return gunCoolingRate; - } - - /** - * Returns the battlefield size for this battle. - * - * @return the battlefield size for this battle. - */ - public BattlefieldSpecification getBattlefield() { - return new BattlefieldSpecification(battlefieldWidth, battlefieldHeight); - } - - /** - * Returns the number of rounds in this battle. - * - * @return the number of rounds in this battle. - */ - public int getNumRounds() { - return numRounds; - } - - /** - * Returns the flag specifying if the enemy names must be hidden from events sent to robots. - * - * @return {@code true} if the enemy names must be hidden; {@code false} otherwise. - * - * @since 1.7.3 - */ - public boolean getHideEnemyNames() { - return hideEnemyNames; - } - - /** - * Returns the sentry border size for a {@link robocode.BorderSentry BorderSentry} that defines the how - * far a BorderSentry is allowed to move from the border edges measured in units.
- * Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that - * border sentry robots cannot leave (they must stay in the border area), but it also define the - * distance from the border edges where border sentry robots are allowed/able to make damage to robots entering this - * border area. - * - * @return the border size in units/pixels that border sentry robots are restricted to. - * - * @since 1.9.0.0 - */ - public int getSentryBorderSize() { - return sentryBorderSize; - } - - /** - * Returns the specifications of the robots participating in this battle. - * - * @return an array of {@link RobotSpecification} instances - one entry for each robot. - * - * @see #getInitialSetups() - */ - public RobotSpecification[] getRobots() { - if (robots == null) { - return null; - } - RobotSpecification[] robotsCopy = new RobotSpecification[robots.length]; - System.arraycopy(robots, 0, robotsCopy, 0, robots.length); - return robotsCopy; - } - - /** - * Returns the initial position and heading of each robot participating in this battle. - * - * @return an array of {@link RobotSetup} instances - one entry for each robot. - * The the indices of this array matches the array indices from the robot specifications (see {@link #getRobots()}). - * - * @see #getRobots() - */ - public RobotSetup[] getInitialSetups() { - if (initialSetups == null) { - return null; - } - RobotSetup[] setupsCopy = new RobotSetup[initialSetups.length]; - System.arraycopy(initialSetups, 0, setupsCopy, 0, initialSetups.length); - return setupsCopy; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattlefieldSpecification.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattlefieldSpecification.java deleted file mode 100644 index abbc012..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/BattlefieldSpecification.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -/** - * Defines the size of a battlefield, which is a part of the {@link BattleSpecification}. - * - * @see BattleSpecification#BattleSpecification(int, BattlefieldSpecification, RobotSpecification[]) - * @see BattleSpecification#BattleSpecification(int, long, double, BattlefieldSpecification, RobotSpecification[]) - * @see BattleSpecification#getBattlefield() - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class BattlefieldSpecification implements java.io.Serializable { - - private static final long serialVersionUID = 1L; - - private final int width; - private final int height; - - /** - * Creates a standard 800 x 600 battlefield. - */ - public BattlefieldSpecification() { - this(800, 600); - } - - /** - * Creates a battlefield of the specified width and height. - * - * @param width the width of the battlefield, where 400 <= width <= 5000. - * @param height the height of the battlefield, where 400 <= height <= 5000. - * @throws IllegalArgumentException if the width or height < 400 or > 5000. - */ - public BattlefieldSpecification(int width, int height) { - if (width < 400 || width > 5000) { - throw new IllegalArgumentException("width must be: 400 <= width <= 5000"); - } - if (height < 400 || height > 5000) { - throw new IllegalArgumentException("height must be: 400 <= height <= 5000"); - } - - this.width = width; - this.height = height; - } - - /** - * Returns the width of this battlefield. - * - * @return the width of this battlefield. - */ - public int getWidth() { - return width; - } - - /** - * Returns the height of this battlefield. - * - * @return the height of this battlefield. - */ - public int getHeight() { - return height; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/IRobocodeEngine.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/IRobocodeEngine.java deleted file mode 100644 index 9b85382..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/IRobocodeEngine.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -import robocode.control.events.IBattleListener; - - -/** - * Interface for the RobocodeEngine. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public interface IRobocodeEngine { - - /** - * Adds a battle listener that must receive events occurring in battles. - * - * @param listener the battle listener that must retrieve the event from - * the battles. - * @see #removeBattleListener(robocode.control.events.IBattleListener) - * @since 1.6.2 - */ - void addBattleListener(IBattleListener listener); - - /** - * Removes a battle listener that has previously been added to this object. - * - * @param listener the battle listener that must be removed. - * @see #addBattleListener(robocode.control.events.IBattleListener) - * @since 1.6.2 - */ - void removeBattleListener(IBattleListener listener); - - /** - * Closes the RobocodeEngine and releases any allocated resources it holds. - * You should call this when you have finished using the RobocodeEngine. - * This method automatically disposes the Robocode window if it open. - */ - void close(); - - /** - * Returns the installed version of Robocode controlled by this RobocodeEngine. - * - * @return the installed version of Robocode controlled by this RobocodeEngine. - */ - String getVersion(); - - /** - * Shows or hides the Robocode window. - * - * @param visible {@code true} if the Robocode window must be set visible; - * {@code false} otherwise. - */ - void setVisible(boolean visible); - - /** - * Returns all robots available from the local robot repository of Robocode. - * These robots must exists in the /robocode/robots directory, and must be - * compiled in advance, before these robot are returned with this method. - * - * @return an array of all available robots from the local robot repository. - * @see robocode.control.RobotSpecification - * @see #getLocalRepository(String) - */ - RobotSpecification[] getLocalRepository(); - - /** - * Returns a selection of robots available from the local robot repository - * of Robocode. These robots must exists in the /robocode/robots directory, - * and must be compiled in advance, before these robot are returned with this method. - *

- * Notice: If a specified robot cannot be found in the repository, it will - * not be returned in the array of robots returned by this method. - * - * @param selectedRobotList a comma or space separated list of robots to - * return. The full class name must be used for - * specifying the individual robot, e.g. - * "sample.Corners, sample.Crazy". - * @return an array containing the available robots from the local robot - * repository based on the selected robots specified with the - * {@code selectedRobotList} parameter. - * @see robocode.control.RobotSpecification - * @see #getLocalRepository() - * @since 1.6.2 - */ - RobotSpecification[] getLocalRepository(String selectedRobotList); - - /** - * Runs the specified battle. - * - * @param battleSpecification the specification of the battle to run including the - * participation robots. - * @see #runBattle(robocode.control.BattleSpecification, boolean) - * @see robocode.control.BattleSpecification - * @see #getLocalRepository() - */ - void runBattle(BattleSpecification battleSpecification); - - /** - * Runs the specified battle. - * - * @param battleSpecification the specification of the battle to run including the - * participating robots. - * @param waitTillOver will block caller till end of battle if set - * @see #runBattle(robocode.control.BattleSpecification) - * @see robocode.control.BattleSpecification - * @see #getLocalRepository() - * @since 1.6.2 - */ - void runBattle(BattleSpecification battleSpecification, boolean waitTillOver); - - /** - * Runs the specified battle. - * - * @param battleSpecification the specification of the battle to run including the - * participating robots. - * @param initialPositions a comma or space separated list like: x1,y1,heading1, - * x2,y2,heading2, which are the coordinates and heading of robot #1 and #2. - * So e.g. 0,0,180, 50,80,270 means that robot #1 has position (0,0) and - * heading 180, and robot #2 has position (50,80) and heading 270. - * @param waitTillOver will block caller till end of battle if set - * @see #runBattle(BattleSpecification) - * @see BattleSpecification - * @see #getLocalRepository() - * @since 1.7.1.2 - */ - void runBattle(BattleSpecification battleSpecification, String initialPositions, boolean waitTillOver); - - /** - * Will block caller until current battle is over. - * @see #runBattle(robocode.control.BattleSpecification) - * @see #runBattle(robocode.control.BattleSpecification, boolean) - * @since 1.6.2 - */ - void waitTillBattleOver(); - - /** - * Aborts the current battle if it is running. - * - * @see #runBattle(robocode.control.BattleSpecification) - */ - void abortCurrentBattle(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RandomFactory.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RandomFactory.java deleted file mode 100644 index 28833f0..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RandomFactory.java +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logWarning; - -import java.lang.reflect.Field; -import java.util.Random; - - -/** - * The RandomFactory is used for controlling the generation of random numbers, - * and supports generating random numbers that are deterministic, which is - * useful for testing purposes. - * - * @author Pavel Savara (original) - * - * @since 1.6.1 - */ -public class RandomFactory { - private static Random randomNumberGenerator; - - private static boolean warningNotSupportedLogged; - private static boolean isDeterministic; - - static { - randomNumberGenerator = new Random(); - } - - public boolean isDeterministic() { - return isDeterministic; - } - - /** - * Returns the random number generator used for generating a stream of - * random numbers. - * - * @return a {@link java.util.Random} instance. - * @see java.util.Random - */ - public static Random getRandom() { - if (randomNumberGenerator == null) { - try { - Math.random(); - final Field field = Math.class.getDeclaredField("randomNumberGenerator"); - final boolean savedFieldAccessible = field.isAccessible(); - - field.setAccessible(true); - randomNumberGenerator = (Random) field.get(null); - field.setAccessible(savedFieldAccessible); - } catch (NoSuchFieldException e) { - logWarningNotSupported(); - randomNumberGenerator = new Random(); - } catch (IllegalAccessException e) { - logError(e); - randomNumberGenerator = new Random(); - } - } - return randomNumberGenerator; - } - - /** - * Sets the random number generator instance used for generating a - * stream of random numbers. - * - * @param random a {@link java.util.Random} instance. - * @see java.util.Random - */ - public static void setRandom(Random random) { - randomNumberGenerator = random; - try { - Math.random(); - final Field field = Math.class.getDeclaredField("randomNumberGenerator"); - final boolean savedFieldAccessible = field.isAccessible(); - - field.setAccessible(true); - field.set(null, randomNumberGenerator); - field.setAccessible(savedFieldAccessible); - } catch (NoSuchFieldException e) { - logWarningNotSupported(); - } catch (IllegalAccessException e) { - logError(e); - } - - // TODO ZAMO using Robot classloader inject seed also for all instances being created by robots - } - - /** - * Resets the random number generator instance to be deterministic when - * generating random numbers. - * - * @param seed the seed to use for the new deterministic random generator. - */ - public static void resetDeterministic(long seed) { - setRandom(new Random(seed)); - isDeterministic = true; - } - - /** - * Logs a warning that the deterministic random feature is not supported by the JVM. - */ - private static void logWarningNotSupported() { - if (!(warningNotSupportedLogged || System.getProperty("RANDOMSEED", "none").equals("none"))) { - logWarning( - "The deterministic random generator feature is not supported by this JVM:\n" - + System.getProperty("java.vm.vendor") + " " + System.getProperty("java.vm.name") + " " - + System.getProperty("java.vm.version")); - - warningNotSupportedLogged = true; - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeEngine.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeEngine.java deleted file mode 100644 index 9166b33..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeEngine.java +++ /dev/null @@ -1,364 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -import net.sf.robocode.battle.IBattleManagerBase; -import net.sf.robocode.core.ContainerBase; -import net.sf.robocode.gui.IWindowManagerBase; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.manager.IVersionManagerBase; -import net.sf.robocode.repository.IRepositoryManagerBase; -import net.sf.robocode.security.HiddenAccess; -import robocode.control.events.*; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - - -/** - * The RobocodeEngine is the interface provided for external applications - * in order to let these applications run battles within the Robocode application, - * and to get the results from these battles. - *

- * This class in the main entry class of the {@code robocode.control} package. - *

- * The RobocodeEngine is used by e.g. RoboRumble@Home client, which is integrated in - * Robocode. In addition, the RobocodeEngine is also used by the test units for - * testing the Robocode application itself. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - * @author Nathaniel Troutman (contributor) - * @author Joachim Hofer (contributor) - * @author Pavel Savara (contributor) - */ -public class RobocodeEngine implements IRobocodeEngine { - - private BattleObserver battleObserver; - private BattleSpecification battleSpecification; - private List listeners = new ArrayList(); - - /** - * Creates a new RobocodeEngine for controlling Robocode. - * In order for this constructor to work, the current working directory must be the - * home directory directory of Robocode, e.g. C:\Robocode - * - * @see #RobocodeEngine(File) - * @see #close() - * @since 1.6.2 - */ - public RobocodeEngine() { - init(null, (IBattleListener) null); - } - - /** - * Creates a new RobocodeEngine for controlling Robocode. - * - * @param robocodeHome the home directory of Robocode, e.g. C:\Robocode. - * @see #RobocodeEngine() - * @see #close() - * @since 1.6.2 - */ - public RobocodeEngine(File robocodeHome) { - init(robocodeHome, (IBattleListener) null); - } - - /** - * @deprecated Since 1.6.2. Use {@link #RobocodeEngine(File)} and - * {@link #addBattleListener(IBattleListener) addBattleListener()} instead. - *

- * Creates a new RobocodeEngine for controlling Robocode. - * - * @param robocodeHome the root directory of Robocode, e.g. C:\Robocode. - * @param listener the listener that must receive the callbacks from this - * RobocodeEngine. - * @see #RobocodeEngine() - * @see #RobocodeEngine(File) - * @see #close() - */ - @Deprecated - public RobocodeEngine(File robocodeHome, RobocodeListener listener) { - init(robocodeHome, listener); - } - - /** - * @deprecated Since 1.6.2. Use {@link #RobocodeEngine()} and - * {@link #addBattleListener(IBattleListener) addBattleListener()} instead. - *

- * Creates a new RobocodeEngine for controlling Robocode. The JAR file of - * Robocode is used to determine the root directory of Robocode. - * - * @param listener the listener that must receive the callbacks from this - * RobocodeEngine. - * @see #RobocodeEngine() - * @see #RobocodeEngine(File) - * @see #close() - */ - @Deprecated - public RobocodeEngine(RobocodeListener listener) { - init(null, listener); - } - - public RobocodeEngine(IBattleListener listener) { - init(null, listener); - } - - /** - * {@inheritDoc} - */ - @Override - protected void finalize() throws Throwable { - try { - // Make sure close() is called to prevent memory leaks - close(); - } finally { - super.finalize(); - } - } - - @SuppressWarnings("deprecation") // We must still support deprecated RobocodeListener - private void init(File robocodeHome, RobocodeListener listener) { - if (listener != null) { - battleObserver = new BattleObserver(); - battleObserver.listener = listener; - } - HiddenAccess.initContainerForRobotEngine(robocodeHome, battleObserver); - } - - private void init(File robocodeHome, IBattleListener listener) { - HiddenAccess.initContainerForRobotEngine(robocodeHome, listener); - } - - /** - * {@inheritDoc} - */ - public void addBattleListener(IBattleListener listener) { - listeners.add(listener); - ContainerBase.getComponent(IBattleManagerBase.class).addListener(listener); - } - - /** - * {@inheritDoc} - */ - public void removeBattleListener(IBattleListener listener) { - listeners.remove(listener); - ContainerBase.getComponent(IBattleManagerBase.class).removeListener(listener); - } - - /** - * {@inheritDoc} - */ - public void close() { - setVisible(false); - if (battleObserver != null) { - ContainerBase.getComponent(IBattleManagerBase.class).removeListener(battleObserver); - } - for (IBattleListener listener : listeners) { - ContainerBase.getComponent(IBattleManagerBase.class).removeListener(listener); - } - listeners.clear(); - HiddenAccess.cleanup(); - } - - /** - * {@inheritDoc} - */ - public String getVersion() { - return ContainerBase.getComponent(IVersionManagerBase.class).getVersion(); - } - - /** - * Returns the current working directory. - * - * @return a File for the current working directory. - * - * @since 1.7.1 - */ - public static File getCurrentWorkingDir() { - return FileUtil.getCwd(); - } - - /** - * Returns the directory containing the robots. - * - * @return a File for the robot directory containing all robots. - * - * @since 1.7.1 - */ - public static File getRobotsDir() { - return FileUtil.getRobotsDir(); - } - - /** - * {@inheritDoc} - */ - public void setVisible(boolean visible) { - IWindowManagerBase windowManager = ContainerBase.getComponent(IWindowManagerBase.class); - if (windowManager != null) { - windowManager.setVisibleForRobotEngine(visible); - } else { - Logger.logError( - "setVisible: No window manager was found.\n" - + "Perhaps you are missing the robocode.ui-1.x.x.x-jar file or the GUI has been disabled?"); - } - } - - /** - * {@inheritDoc} - */ - public RobotSpecification[] getLocalRepository() { - final IRepositoryManagerBase repository = ContainerBase.getComponent(IRepositoryManagerBase.class); - - repository.refresh(); // Bug fix [2972932] - return repository.getSpecifications(); - } - - /** - * {@inheritDoc} - */ - public RobotSpecification[] getLocalRepository(String selectedRobots) { - final IRepositoryManagerBase repository = ContainerBase.getComponent(IRepositoryManagerBase.class); - - repository.refresh(); // Bug fix [2972932] - return repository.loadSelectedRobots(selectedRobots); - } - - /** - * {@inheritDoc} - */ - public void runBattle(BattleSpecification battleSpecification) { - runBattle(battleSpecification, null, false); - } - - /** - * {@inheritDoc} - */ - public void runBattle(BattleSpecification battleSpecification, boolean waitTillOver) { - runBattle(battleSpecification, null, waitTillOver); - } - - /** - * {@inheritDoc} - */ - public void runBattle(BattleSpecification battleSpecification, String initialPositions, boolean waitTillOver) { - this.battleSpecification = battleSpecification; - ContainerBase.getComponent(IBattleManagerBase.class).startNewBattle(battleSpecification, initialPositions, - waitTillOver, false); - } - - /** - * {@inheritDoc} - */ - public void waitTillBattleOver() { - ContainerBase.getComponent(IBattleManagerBase.class).waitTillOver(); - } - - /** - * {@inheritDoc} - */ - public void abortCurrentBattle() { - ContainerBase.getComponent(IBattleManagerBase.class).stop(true); - } - - /** - * Prints out all running threads to standard system out. - * - * @since 1.6.2 - */ - public static void printRunningThreads() { - ThreadGroup currentGroup = Thread.currentThread().getThreadGroup(); - - if (currentGroup == null) { - return; - } - - while (currentGroup.getParent() != null) { - currentGroup = currentGroup.getParent(); - } - - ThreadGroup groups[] = new ThreadGroup[256]; - Thread threads[] = new Thread[256]; - - int numGroups = currentGroup.enumerate(groups, true); - - for (int i = 0; i < numGroups; i++) { - currentGroup = groups[i]; - if (currentGroup.isDaemon()) { - Logger.realOut.print(" "); - } else { - Logger.realOut.print("* "); - } - Logger.realOut.println("In group: " + currentGroup.getName()); - int numThreads = currentGroup.enumerate(threads); - - for (int j = 0; j < numThreads; j++) { - if (threads[j].isDaemon()) { - Logger.realOut.print(" "); - } else { - Logger.realOut.print("* "); - } - Logger.realOut.println(threads[j].getName()); - } - Logger.realOut.println("---------------"); - } - } - - /** - * Enables or disables messages and warnings logged to {@link System#out}. - * - * @param enable true if log messages must be enabled; false if log messages must be disabled. - * @see #setLogErrorsEnabled(boolean) - * @since 1.8.0.0 - */ - public static void setLogMessagesEnabled(boolean enable) { - System.setProperty("logMessages", "" + enable); - } - - /** - * Enables or disables errors logged to {@link System#err}. - * - * @param enable true if log errors must be enabled; false if log errors must be disabled. - * @see #setLogMessagesEnabled(boolean) - * @since 1.8.0.0 - */ - public static void setLogErrorsEnabled(boolean enable) { - System.setProperty("logErrors", "" + enable); - } - - /** - * Registered only if listener in not null. - */ - private class BattleObserver extends BattleAdaptor { - @SuppressWarnings("deprecation") // We must still support deprecated RobocodeListener - private RobocodeListener listener; - - @SuppressWarnings("deprecation") // We must still support deprecated RobocodeListener - @Override - public void onBattleFinished(BattleFinishedEvent event) { - if (event.isAborted()) { - listener.battleAborted(battleSpecification); - } - } - - @SuppressWarnings("deprecation") // We must still support deprecated RobocodeListener - @Override - public void onBattleCompleted(BattleCompletedEvent event) { - listener.battleComplete(battleSpecification, RobotResults.convertResults(event.getSortedResults())); - } - - @SuppressWarnings("deprecation") // We must still support deprecated RobocodeListener - @Override - public void onBattleMessage(BattleMessageEvent event) { - listener.battleMessage(event.getMessage()); - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeListener.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeListener.java deleted file mode 100644 index 8b6e5d3..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobocodeListener.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -import robocode.control.events.IBattleListener; - - -/** - * @deprecated Since 1.6.2. Use the {@link IBattleListener} instead. - *

- * A listener interface for receiving callbacks from the {@link RobocodeEngine}. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * - * @see IBattleListener - */ -@Deprecated -public interface RobocodeListener { - - /** - * @deprecated Since 1.6.2. Use the - * {@link IBattleListener#onBattleCompleted(robocode.control.events.BattleCompletedEvent) - * IBattleListener.onBattleCompleted()} instead. - *

- * This method is called when a battle completes successfully. - * - * @param battle information about the battle that completed - * @param results an array containing the results for the individual robot - */ - @Deprecated - void battleComplete(BattleSpecification battle, RobotResults[] results); - - /** - * @deprecated Since 1.6.2. Use the - * {@link IBattleListener#onBattleFinished(robocode.control.events.BattleFinishedEvent) - * IBattleListener.onBattleFinished()} instead. - *

- * This method is called when a battle has been aborted. - * - * @param battle information about the battle that was aborted - */ - @Deprecated - void battleAborted(BattleSpecification battle); - - /** - * @deprecated Since 1.6.2. Use the - * {@link IBattleListener#onBattleMessage(robocode.control.events.BattleMessageEvent) - * IBattleListener.onBattleMessage()} instead. - *

- * This method is called when the game logs messages that is normally - * written out to the console. - * - * @param message the message logged by the game - */ - @Deprecated - void battleMessage(String message); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotResults.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotResults.java deleted file mode 100644 index 2d315cf..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotResults.java +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -import robocode.BattleResults; - - -/** - * Contains the battle results for an individual robot - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobotResults extends BattleResults { - - private static final long serialVersionUID = 2L; - - private final RobotSpecification robot; - - /** - * Constructs a new RobotResults. - * - * @param robot is the robot these results are for - * @param teamLeaderName is the team name - * @param rank is the rank of the robot in the battle - * @param score is the total score for the robot in the battle - * @param survival is the survival score for the robot in the battle - * @param lastSurvivorBonus is the last survivor bonus for the robot in the battle - * @param bulletDamage is the bullet damage score for the robot in the battle - * @param bulletDamageBonus is the bullet damage bonus for the robot in the battle - * @param ramDamage is the ramming damage for the robot in the battle - * @param ramDamageBonus is the ramming damage bonus for the robot in the battle - * @param firsts is the number of rounds this robot placed first - * @param seconds is the number of rounds this robot placed second - * @param thirds is the number of rounds this robot placed third - */ - public RobotResults( - RobotSpecification robot, - String teamLeaderName, - int rank, - double score, - double survival, - double lastSurvivorBonus, - double bulletDamage, - double bulletDamageBonus, - double ramDamage, - double ramDamageBonus, - int firsts, - int seconds, - int thirds - ) { - super(teamLeaderName, rank, score, survival, lastSurvivorBonus, bulletDamage, bulletDamageBonus, ramDamage, - ramDamageBonus, firsts, seconds, thirds); - this.robot = robot; - } - - /** - * Constructs new RobotResults based on a {@link RobotSpecification} and {@link robocode.BattleResults - * BattleResults}. - * - * @param robot the robot these results are for - * @param results the battle results for the robot - */ - public RobotResults( - RobotSpecification robot, - BattleResults results) { - super(results.getTeamLeaderName(), results.getRank(), results.getScore(), results.getSurvival(), - results.getLastSurvivorBonus(), results.getBulletDamage(), results.getBulletDamageBonus(), - results.getRamDamage(), results.getRamDamageBonus(), results.getFirsts(), results.getSeconds(), - results.getThirds()); - this.robot = robot; - } - - /** - * Returns the robot these results are meant for. - * - * @return the robot these results are meant for. - */ - public RobotSpecification getRobot() { - return robot; - } - - /** - * Converts an array of {@link BattleResults} into an array of {@link RobotResults}. - * - * @param results an array of BattleResults to convert. - * @return an array of RobotResults converted from BattleResults. - * @since 1.6.2 - */ - public static RobotResults[] convertResults(BattleResults[] results) { - RobotResults[] resultsConv = new RobotResults[results.length]; - - for (int i = 0; i < results.length; i++) { - resultsConv[i] = (RobotResults) results[i]; - } - return resultsConv; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - long temp; - - temp = Double.doubleToLongBits(bulletDamage); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(bulletDamageBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + firsts; - temp = Double.doubleToLongBits(lastSurvivorBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(ramDamage); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(ramDamageBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + rank; - temp = Double.doubleToLongBits(score); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + seconds; - temp = Double.doubleToLongBits(survival); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + ((teamLeaderName == null) ? 0 : teamLeaderName.hashCode()); - result = prime * result + thirds; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - RobotResults other = (RobotResults) obj; - - if (Double.doubleToLongBits(bulletDamage) != Double.doubleToLongBits(other.bulletDamage)) { - return false; - } - if (Double.doubleToLongBits(bulletDamageBonus) != Double.doubleToLongBits(other.bulletDamageBonus)) { - return false; - } - if (firsts != other.firsts) { - return false; - } - if (Double.doubleToLongBits(lastSurvivorBonus) != Double.doubleToLongBits(other.lastSurvivorBonus)) { - return false; - } - if (Double.doubleToLongBits(ramDamage) != Double.doubleToLongBits(other.ramDamage)) { - return false; - } - if (Double.doubleToLongBits(ramDamageBonus) != Double.doubleToLongBits(other.ramDamageBonus)) { - return false; - } - if (rank != other.rank) { - return false; - } - if (Double.doubleToLongBits(score) != Double.doubleToLongBits(other.score)) { - return false; - } - if (seconds != other.seconds) { - return false; - } - if (Double.doubleToLongBits(survival) != Double.doubleToLongBits(other.survival)) { - return false; - } - if (teamLeaderName == null) { - if (other.teamLeaderName != null) { - return false; - } - } else if (!teamLeaderName.equals(other.teamLeaderName)) { - return false; - } - if (thirds != other.thirds) { - return false; - } - return true; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSetup.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSetup.java deleted file mode 100644 index 05c7b81..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSetup.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -/** - * Contains the initial position and heading for a robot. - * - * @author Flemming N. Larsen (original) - * - * @since 1.9.2.0 - */ -public class RobotSetup implements java.io.Serializable { - - private static final long serialVersionUID = 1L; - - private final Double x; - private final Double y; - private final Double heading; - - /** - * Constructs a new RobotSetup. - * - * @param x is the x coordinate, where {@code null} means random. - * @param y is the y coordinate, where {@code null} means random. - * @param heading is the heading in degrees of the body, gun, and radar, where {@code null} means random. - */ - public RobotSetup(Double x, Double y, Double heading) { - this.x = x; - this.y = y; - this.heading = heading; - } - - /** - * Returns the x coordinate. - * @return the x coordinate, where {@code null} means unspecified (random). - */ - public Double getX() { - return x; - } - - /** - * Returns the y coordinate. - * @return the y coordinate, where {@code null} means unspecified (random). - */ - public Double getY() { - return y; - } - - /** - * Returns the body, gun, and radar heading (in degrees). - * @return the heading (in degrees), where {@code null} means unspecified (random). - */ - public Double getHeading() { - return heading; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSpecification.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSpecification.java deleted file mode 100644 index 77aa4a9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/RobotSpecification.java +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control; - - -import java.io.File; - -import net.sf.robocode.security.IHiddenSpecificationHelper; - - -/** - * Defines the properties of a robot, which is returned from - * {@link RobocodeEngine#getLocalRepository()}. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobotSpecification implements java.io.Serializable { - - private static final long serialVersionUID = 1L; - - private final Object fileSpecification; - private final String name; - private final String author; - private final String webpage; - private final String version; - private final String robocodeVersion; - private final String jarFile; - private final String fullClassName; - private final String description; - private String teamId; - - private RobotSpecification(Object fileSpecification, String name, String author, String webpage, String version, String robocodeVersion, String jarFile, String fullClassName, String description) { - this.fileSpecification = fileSpecification; - this.name = name; - this.author = author; - this.webpage = webpage; - this.version = version; - this.robocodeVersion = robocodeVersion; - this.jarFile = jarFile; - this.fullClassName = fullClassName; - this.description = description; - } - - /** - * Returns the name of this robot or team. - * - * @return the name of this robot or team. - * @see #getVersion() - * @see #getNameAndVersion() - */ - public String getName() { - return name; - } - - /** - * Returns the version of this robot or team. - * - * @return the version of this robot or team. - * @see #getName() - * @see #getNameAndVersion() - */ - public String getVersion() { - return version; - } - - /** - * Returns the name and version of this robot or team. - * - * @return the name and version of this robot or team. - * @see #getName() - * @see #getVersion() - * @since 1.3 - */ - public String getNameAndVersion() { - String nameAndVersion = getName(); - String version = getVersion(); - - if (version != null && version.trim().length() > 0) { - nameAndVersion += ' ' + version.trim(); - } - return nameAndVersion; - } - - /** - * Returns the full class name of this robot or team. - * - * @return the full class name of this robot or team. - */ - public String getClassName() { - return fullClassName; - } - - /** - * Returns the JAR file containing this robot or team, or {@code null} if it - * does not come from a JAR file (could be class files instead). - * - * @return the JAR file containing this robot or team, or {@code null} if it - * does not come from a JAR file (could be class files instead). - */ - public File getJarFile() { - return new File(jarFile); - } - - /** - * Returns the description provided by the author of this robot or team. - * - * @return the description provided by the author of this robot or team. - */ - public String getDescription() { - return description; - } - - /** - * Returns the version of Robocode this robot or team was build with. - * - * @return the version of Robocode this robot or team was build with. - */ - public String getRobocodeVersion() { - return robocodeVersion; - } - - /** - * Returns the link to the web page for this robot or team. - * - * @return the link to the web page for this robot or team. - */ - public String getWebpage() { - return webpage; - } - - /** - * Returns the name of the author of this robot or team. - * - * @return the name of the author of this robot or team. - */ - public String getAuthorName() { - return author; - } - - /** - * Returns id of the team in current battle. - * - * @return id of the team in current battle. - */ - public String getTeamId() { - return teamId != null ? teamId : getNameAndVersion(); - } - - static IHiddenSpecificationHelper createHiddenHelper() { - return new HiddenHelper(); - } - - private static class HiddenHelper implements IHiddenSpecificationHelper { - - public RobotSpecification createSpecification(Object fileSpecification, String name, String author, String webpage, String version, String robocodeVersion, String jarFile, String fullClassName, String description) { - return new RobotSpecification(fileSpecification, name, author, webpage, version, robocodeVersion, jarFile, - fullClassName, description); - } - - public Object getFileSpecification(RobotSpecification specification) { - return specification.fileSpecification; - } - - public void setTeamName(RobotSpecification specification, String teamName) { - specification.teamId = teamName; - } - - public String getTeamName(RobotSpecification specification) { - return specification.teamId; - } - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleAdaptor.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleAdaptor.java deleted file mode 100644 index 0588e0d..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleAdaptor.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * An abstract adapter class for receiving battle events by implementing the {@link IBattleListener}. - * The methods in this class are empty. This class exists as convenience for creating listener objects. - *

- * This is handy class to use when implementing the IBattleListener. - * It saves you from implementing empty handlers for battle events you are not interested in handling. - *

- * Example: - *

- *   private class BattleObserver extends BattleAdaptor {
- *       boolean isReplay;
- *
- *       public void onBattleStarted(BattleStartedEvent event) {
- *           isReplay = event.isReplay();
- *       }
- *
- *       public void onBattleCompleted(BattleCompletedEvent event) {
- *       if (!isReplay) {
- *           printResultsData(event);
- *       }
- *   }
- * 
- * - * @see IBattleListener - * - * @author Flemming N. Larsen (original) - * - * @since 1.6.2 - */ -public abstract class BattleAdaptor implements IBattleListener { - - /** - * Creates a BattleAdaptor. - */ - public BattleAdaptor() {} - - /** - * {@inheritDoc} - */ - public void onBattleStarted(final BattleStartedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBattleFinished(final BattleFinishedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBattleCompleted(final BattleCompletedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBattlePaused(final BattlePausedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBattleResumed(final BattleResumedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onRoundStarted(final RoundStartedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onRoundEnded(final RoundEndedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onTurnStarted(final TurnStartedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onTurnEnded(final TurnEndedEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBattleMessage(final BattleMessageEvent event) {} - - /** - * {@inheritDoc} - */ - public void onBattleError(final BattleErrorEvent event) {} -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleCompletedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleCompletedEvent.java deleted file mode 100644 index e21a614..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleCompletedEvent.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -import robocode.BattleResults; -import robocode.BattleRules; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - - -/** - * A BattleCompletedEvent is sent to {@link IBattleListener#onBattleCompleted(BattleCompletedEvent) - * onBattleCompleted()} when the battle is completed successfully and results are available. This event - * will not occur if the battle is terminated or aborted by the user before the battle is completed. - * - * @see IBattleListener - * @see IBattleListener#onBattleCompleted(BattleCompletedEvent) - * @see BattleStartedEvent - * @see BattleFinishedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class BattleCompletedEvent extends BattleEvent { - private final BattleRules battleRules; - private final BattleResults[] results; - - /** - * Called by the game to create a new BattleCompletedEvent. - * Please don't use this constructor as it might change. - * - * @param battleRules the rules that was used in the battle. - * @param results the indexed results of the battle. These are unsorted, but using robot indexes. - */ - public BattleCompletedEvent(BattleRules battleRules, BattleResults[] results) { - super(); - this.battleRules = battleRules; - this.results = results; - } - - /** - * Returns the rules used in the battle. - * - * @return the rules used in the battle. - */ - public BattleRules getBattleRules() { - return battleRules; - } - - /** - * Returns the battle results sorted on score. - * Note that the robot index cannot be used to determine the score with the sorted results. - * - * @return an array of sorted BattleResults, where the results with the bigger score are placed first in the list. - * @see #getIndexedResults() - */ - public BattleResults[] getSortedResults() { - List copy = new ArrayList(Arrays.asList(results)); - - Collections.sort(copy); - Collections.reverse(copy); - return copy.toArray(new BattleResults[copy.size()]); - } - - /** - * Returns the battle results that can be used to determine the score for the individual robot based - * on the robot index. - * - * @return an array of indexed BattleResults, where each index matches an index of a specific robot. - * @see #getSortedResults() - */ - public BattleResults[] getIndexedResults() { - BattleResults[] copy = new BattleResults[results.length]; - - System.arraycopy(results, 0, copy, 0, results.length); - return copy; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleErrorEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleErrorEvent.java deleted file mode 100644 index bce294a..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleErrorEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * A BattleErrorEvent is sent to {@link IBattleListener#onBattleError(BattleErrorEvent) - * onBattleError()} when an error message is sent from the game in the during the battle. - * - * @see IBattleListener - * @see BattleMessageEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class BattleErrorEvent extends BattleEvent { - private final String error; - - /** - * Called by the game to create a new BattleErrorEvent. - * Please don't use this constructor as it might change. - * - * @param error the error message from the game. - */ - public BattleErrorEvent(String error) { - super(); - this.error = error; - } - - /** - * Returns the error message. - * - * @return the error message that was sent from the game during the battle. - */ - public String getError() { - return error; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleEvent.java deleted file mode 100644 index 68fc7eb..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * This is the base class of all battle events. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public abstract class BattleEvent { - - /** - * Creates a new BattleEvent. - */ - public BattleEvent() { - super(); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleFinishedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleFinishedEvent.java deleted file mode 100644 index d9e3985..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleFinishedEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * A BattleFinishedEvent is sent to {@link IBattleListener#onBattleFinished(BattleFinishedEvent) - * onBattleFinished()} when the battle is finished. This event is always sent as the last battle event, - * both when the battle is completed successfully, terminated due to an error, or aborted by the user. - * Hence, this events is well-suited for cleanup after the battle. - * - * @see IBattleListener - * @see BattleStartedEvent - * @see BattleCompletedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class BattleFinishedEvent extends BattleEvent { - private final boolean isAborted; - - /** - * Called by the game to create a new BattleFinishedEvent. - * Please don't use this constructor as it might change. - * - * @param isAborted a flag specifying if the battle was aborted: - * {@code true} if the battle was aborted; {@code false} otherwise. - */ - public BattleFinishedEvent(boolean isAborted) { - super(); - this.isAborted = isAborted; - } - - /** - * Checks if the battle was aborted. - * - * @return {@code true} if the battle was aborted; {@code false} otherwise. - */ - public boolean isAborted() { - return isAborted; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleMessageEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleMessageEvent.java deleted file mode 100644 index 58d7e34..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleMessageEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * A BattleMessageEvent is sent to {@link IBattleListener#onBattleMessage(BattleMessageEvent) - * onBattleMessage()} when an informal message is sent from the game in the during the battle. - * - * @see IBattleListener - * @see BattleErrorEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class BattleMessageEvent extends BattleEvent { - private final String message; - - /** - * Called by the game to create a new BattleMessageEvent. - * Please don't use this constructor as it might change. - * - * @param message the informal message from the game. - */ - public BattleMessageEvent(String message) { - super(); - this.message = message; - } - - /** - * Returns the informal message. - * - * @return the informal message that was sent from the game during the battle. - */ - public String getMessage() { - return message; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattlePausedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattlePausedEvent.java deleted file mode 100644 index deefdaf..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattlePausedEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * A BattlePausedEvent is sent to {@link IBattleListener#onBattlePaused(BattlePausedEvent) - * onBattlePaused()} when a battle has been paused. - * - * @see IBattleListener - * @see BattleResumedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class BattlePausedEvent extends BattleEvent { - - /** - * Called by the game to create a new BattlePausedEvent. - * Please don't use this constructor as it might change. - */ - public BattlePausedEvent() { - super(); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleResumedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleResumedEvent.java deleted file mode 100644 index 2ca10a7..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleResumedEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * A BattleResumedEvent is sent to {@link IBattleListener#onBattleResumed(BattleResumedEvent) - * onBattleResumed()} when a battle has been resumed (after having been paused). - * - * @see IBattleListener - * @see BattlePausedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class BattleResumedEvent extends BattleEvent { - - /** - * Called by the game to create a new BattleResumedEvent. - * Please don't use this constructor as it might change. - */ - public BattleResumedEvent() { - super(); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleStartedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleStartedEvent.java deleted file mode 100644 index a7ca33b..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/BattleStartedEvent.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -import robocode.BattleRules; - - -/** - * A BattleStartedEvent is sent to {@link IBattleListener#onBattleStarted(BattleStartedEvent) - * onBattleStarted()} when a new battle is started. - * - * @see IBattleListener - * @see BattleCompletedEvent - * @see BattleFinishedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class BattleStartedEvent extends BattleEvent { - private final BattleRules battleRules; - private final boolean isReplay; - private final int robotsCount; - - /** - * Called by the game to create a new BattleStartedEvent. - * Please don't use this constructor as it might change. - * - * @param battleRules the rules that will be used in the battle. - * @param robotsCount the number of robots participating in the battle. - * @param isReplay a flag specifying if this battle is a replay or real battle: - * {@code true} if the battle is a replay; {@code false} otherwise. - */ - public BattleStartedEvent(BattleRules battleRules, int robotsCount, boolean isReplay) { - super(); - this.battleRules = battleRules; - this.isReplay = isReplay; - this.robotsCount = robotsCount; - } - - /** - * Returns the rules that will be used in the battle. - * - * @return the rules that will be used in the battle. - */ - public BattleRules getBattleRules() { - return battleRules; - } - - /** - * Returns the number of robots participating in the battle. - * - * @return the number of robots participating in the battle. - */ - public int getRobotsCount() { - return robotsCount; - } - - /** - * Checks if this battle is a replay or a new battle. - * - * @return {@code true} if the battle is a replay; {@code false} otherwise. - */ - public boolean isReplay() { - return isReplay; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/IBattleListener.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/IBattleListener.java deleted file mode 100644 index dd19597..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/IBattleListener.java +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * The listener interface for receiving "interesting" battle events from the game, e.g. when a battle, - * round or turn is started or ended. - *

- * When implementing this battle listener you should implement the {@link BattleAdaptor} in order to - * only implement the event handler methods you are interested in. - * - * @see BattleAdaptor - * - * @author Flemming N. Larsen (original) - * - * @since 1.6.2 - */ -public interface IBattleListener { - - /** - * This method is called when a new battle has started. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see BattleStartedEvent - * @see #onBattleCompleted(BattleCompletedEvent) - * @see #onBattleFinished(BattleFinishedEvent) - * - * @param event the event details. - */ - void onBattleStarted(final BattleStartedEvent event); - - /** - * This method is called when the battle has finished. This event is always sent as the last battle event, - * both when the battle is completed successfully, terminated due to an error, or aborted by the user. - * Hence, this events is well-suited for cleanup after the battle. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see BattleFinishedEvent - * @see #onBattleStarted(BattleStartedEvent) - * @see #onBattleCompleted(BattleCompletedEvent) - * - * @param event the event details. - */ - void onBattleFinished(final BattleFinishedEvent event); - - /** - * This method is called when the battle has completed successfully and results are available. - * This event will not occur if the battle is terminated or aborted by the user before the battle is completed. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see BattleCompletedEvent - * @see #onBattleStarted(BattleStartedEvent) - * @see #onBattleFinished(BattleFinishedEvent) - * - * @param event the event details. - */ - void onBattleCompleted(final BattleCompletedEvent event); - - /** - * This method is called when the battle has been paused, either by the user or the game. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see BattlePausedEvent - * @see #onBattleResumed(BattleResumedEvent) - * - * @param event the event details. - */ - void onBattlePaused(final BattlePausedEvent event); - - /** - * This method is called when the battle has been resumed (after having been paused). - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see BattleResumedEvent - * @see #onBattlePaused(BattlePausedEvent) - * - * @param event the event details. - */ - void onBattleResumed(final BattleResumedEvent event); - - /** - * This method is called when a new round in a battle has started. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see RoundEndedEvent - * @see #onRoundEnded(RoundEndedEvent) - * - * @param event the event details. - */ - void onRoundStarted(final RoundStartedEvent event); - - /** - * This method is called when the current round of a battle has ended. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see RoundEndedEvent - * @see #onRoundStarted(RoundStartedEvent) - * - * @param event the event details. - */ - void onRoundEnded(final RoundEndedEvent event); - - /** - * This method is called when a new turn in a battle round has started. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see TurnStartedEvent - * @see #onTurnEnded(TurnEndedEvent) - * - * @param event the event details. - */ - void onTurnStarted(final TurnStartedEvent event); - - /** - * This method is called when the current turn in a battle round is ended. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see TurnEndedEvent - * @see #onTurnStarted(TurnStartedEvent) - * - * @param event the event details. - */ - void onTurnEnded(final TurnEndedEvent event); - - /** - * This method is called when the game has sent a new information message. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see BattleMessageEvent - * @see #onBattleError(BattleErrorEvent) - * - * @param event the event details. - */ - void onBattleMessage(final BattleMessageEvent event); - - /** - * This method is called when the game has sent an error message. - *

- * You must override this method in order to get informed about this event and receive the event details. - * - * @see BattleErrorEvent - * @see #onBattleMessage(BattleMessageEvent) - * - * @param event the event details. - */ - void onBattleError(final BattleErrorEvent event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundEndedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundEndedEvent.java deleted file mode 100644 index 90a43fd..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundEndedEvent.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * A RoundEndedEvent is sent to {@link IBattleListener#onRoundEnded(RoundEndedEvent) - * onRoundEnded()} when the current round of a battle has ended. - * - * @see IBattleListener - * @see RoundStartedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class RoundEndedEvent extends BattleEvent { - private final int round; - private final int turns; - private final int totalTurns; - - /** - * Called by the game to create a new RoundEndedEvent. - * Please don't use this constructor as it might change. - * - * @param round the round number that was ended (zero indexed). - * @param turns the number of turns that this round reached. - * @param totalTurns the total number of turns reached in the battle when this round ended. - */ - public RoundEndedEvent(int round, int turns, int totalTurns) { - super(); - this.round = round; - this.turns = turns; - this.totalTurns = totalTurns; - } - - /** - * Returns the round number that has ended. - * - * @return the round number that has ended, which is zero indexed. - */ - public int getRound() { - return round; - } - - /** - * Returns the number of turns that this round reached. - * - * @return the number of turns that this round reached. - * - * @see #getTotalTurns() - */ - public int getTurns() { - return turns; - } - - /** - * Returns the total number of turns reached in the battle when this round ended. - * - * @return the total number of turns reached in the battle when this round ended. - * - * @see #getTurns() - * - * @since 1.7.2 - */ - public int getTotalTurns() { - return totalTurns; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundStartedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundStartedEvent.java deleted file mode 100644 index 41ad245..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/RoundStartedEvent.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -import robocode.control.snapshot.ITurnSnapshot; - - -/** - * A RoundStartedEvent is sent to {@link IBattleListener#onRoundStarted(RoundStartedEvent) - * onRoundStarted()} when a new round in a battle is started. - * - * @see IBattleListener - * @see RoundEndedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class RoundStartedEvent extends BattleEvent { - private final ITurnSnapshot startSnapshot; - private final int round; - - /** - * Called by the game to create a new RoundStartedEvent. - * Please don't use this constructor as it might change. - * - * @param startSnapshot the start snapshot of the participating robots, initial starting positions etc. - * @param round the round number (zero indexed). - */ - public RoundStartedEvent(ITurnSnapshot startSnapshot, int round) { - super(); - this.startSnapshot = startSnapshot; - this.round = round; - } - - /** - * Returns the start snapshot of the participating robots, initial starting positions etc. - * - * @return a {@link robocode.control.snapshot.ITurnSnapshot} that serves as the start snapshot of - * the round. - */ - public ITurnSnapshot getStartSnapshot() { - return startSnapshot; - } - - /** - * Returns the round number. - * - * @return the round number, which is zero indexed. - */ - public int getRound() { - return round; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnEndedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnEndedEvent.java deleted file mode 100644 index eb4c906..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnEndedEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -import robocode.control.snapshot.ITurnSnapshot; - - -/** - * A TurnEndedEvent is sent to {@link IBattleListener#onTurnEnded(TurnEndedEvent) - * onTurnEnded()} when the current turn in a battle round is ended. - * - * @see IBattleListener - * @see TurnStartedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class TurnEndedEvent extends BattleEvent { - private final ITurnSnapshot turnSnapshot; - - /** - * Called by the game to create a new TurnEndedEvent. - * Please don't use this constructor as it might change. - * - * @param turnSnapshot a snapshot of the turn that has ended. - */ - public TurnEndedEvent(ITurnSnapshot turnSnapshot) { - super(); - this.turnSnapshot = turnSnapshot; - } - - /** - * Returns a snapshot of the turn that has ended. - * - * @return a snapshot of the turn that has ended. - */ - public ITurnSnapshot getTurnSnapshot() { - return turnSnapshot; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnStartedEvent.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnStartedEvent.java deleted file mode 100644 index 534b252..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/TurnStartedEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.events; - - -/** - * A TurnStartedEvent is sent to {@link IBattleListener#onTurnStarted(TurnStartedEvent) - * onTurnStarted()} when a new turn in a battle round is started. - * - * @see IBattleListener - * @see TurnEndedEvent - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public class TurnStartedEvent extends BattleEvent { - - /** - * Called by the game to create a new TurnStartedEvent. - * Please don't use this constructor as it might change. - */ - public TurnStartedEvent() { - super(); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/package-info.java deleted file mode 100644 index ecd91d9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/events/package-info.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Battle events that occurs during a game, and which are used for the - * robocode.control.IBattleListener class. - */ -package robocode.control.events; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/package-info.java deleted file mode 100644 index 09b1006..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/package-info.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * The Robocode Control API is used for controlling the Robocode - * application from another external application. Basically, it is possible - * to run battles between selected robots and retrieve the results. However, - * it is also possible to get detailed information as snapshots during the - * battles regarding e.g. the positions and headings of the individual robots - * and bullets at a specific time during a battle. - *

- * The main entry class is the Robocode.Control.RobocodeEngine class, which - * must be instantiated by the application controlling Robocode. With the - * RobocodeEngine, a battle specification must be provided in order to run a - * battle. The battle specification specify the size of the battlefield, and - * which rules that must be used. In addition, the participant robots must be - * selected, which must exist in the robot directory of Robocode in - * advantage. - * - *

Example

- *

- * Here is a simple application that runs a battle in Robocode for 5 rounds - * on the default battlefield of 800x600 pixels. The robots selected for the - * battle are sample.RamFire and sample.Corners. - * - *

- * import robocode.control.*;
- * import robocode.control.events.*;
- * 
- * //
- * // Application that demonstrates how to run two sample robots in Robocode using the
- * // RobocodeEngine from the robocode.control package.
- * //
- * // @author Flemming N. Larsen
- * //
- * public class BattleRunner {
- * 
- *     public static void main(String[] args) {
- * 
- *         // Disable log messages from Robocode
- *         RobocodeEngine.setLogMessagesEnabled(false);
- *
- *         // Create the RobocodeEngine
- *         //   RobocodeEngine engine = new RobocodeEngine(); // Run from current working directory
- *         RobocodeEngine engine = new RobocodeEngine(new java.io.File("C:/Robocode")); // Run from C:/Robocode
- * 
- *         // Add our own battle listener to the RobocodeEngine 
- *         engine.addBattleListener(new BattleObserver());
- * 
- *         // Show the Robocode battle view
- *         engine.setVisible(true);
- * 
- *         // Setup the battle specification
- * 
- *         int numberOfRounds = 5;
- *         BattlefieldSpecification battlefield = new BattlefieldSpecification(800, 600); // 800x600
- *         RobotSpecification[] selectedRobots = engine.getLocalRepository("sample.RamFire,sample.Corners");
- * 
- *         BattleSpecification battleSpec = new BattleSpecification(numberOfRounds, battlefield, selectedRobots);
- * 
- *         // Run our specified battle and let it run till it is over
- *         engine.runBattle(battleSpec, true); // waits till the battle finishes
- * 
- *         // Cleanup our RobocodeEngine
- *         engine.close();
- * 
- *         // Make sure that the Java VM is shut down properly
- *         System.exit(0);
- *     }
- * }
- * 
- * //
- * // Our private battle listener for handling the battle event we are interested in.
- * //
- * class BattleObserver extends BattleAdaptor {
- * 
- *     // Called when the battle is completed successfully with battle results
- *     public void onBattleCompleted(BattleCompletedEvent e) {
- *         System.out.println("-- Battle has completed --");
- *         
- *         // Print out the sorted results with the robot names
- *         System.out.println("Battle results:");
- *         for (robocode.BattleResults result : e.getSortedResults()) {
- *             System.out.println("  " + result.getTeamLeaderName() + ": " + result.getScore());
- *         }
- *     }
- * 
- *     // Called when the game sends out an information message during the battle
- *     public void onBattleMessage(BattleMessageEvent e) {
- *         System.out.println("Msg> " + e.getMessage());
- *     }
- * 
- *     // Called when the game sends out an error message during the battle
- *     public void onBattleError(BattleErrorEvent e) {
- *         System.out.println("Err> " + e.getError());
- *     }
- * }
- * 
- */ -package robocode.control; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/BulletState.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/BulletState.java deleted file mode 100644 index 3443573..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/BulletState.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.snapshot; - - -/** - * Defines a bullet state, which can be: just fired, moving somewhere, hitting a victim, - * hitting another bullet, hitting the wall, exploded, or inactive. - * - * @author Flemming N. Larsen (original) - * - * @since 1.6.2 - */ -public enum BulletState { - - /** The bullet has just been fired this turn and hence just been created. This state only last one turn. */ - FIRED(0), - - /** The bullet is now moving across the battlefield, but has not hit anything yet. */ - MOVING(1), - - /** The bullet has hit a robot victim. */ - HIT_VICTIM(2), - - /** The bullet has hit another bullet. */ - HIT_BULLET(3), - - /** The bullet has hit the wall, i.e. one of the four borders of the battlefield. */ - HIT_WALL(4), - - /** The bullet currently represents a robot explosion, i.e. a robot death. */ - EXPLODED(5), - - /** The bullet is currently inactive. Hence, it is not active or visible on the battlefield. */ - INACTIVE(6); - - private final int value; - - private BulletState(int value) { - this.value = value; - } - - /** - * Returns the state as an integer value. - * - * @return an integer value representing this state. - * - * @see #toState(int) - */ - public int getValue() { - return value; - } - - /** - * Returns a BulletState based on an integer value that represents a BulletState. - * - * @param value the integer value that represents a specific BulletState. - * @return a BulletState that corresponds to the specific integer value. - * - * @see #getValue() - * - * @throws IllegalArgumentException if the specified value does not correspond - * to a BulletState and hence is invalid. - */ - public static BulletState toState(int value) { - switch (value) { - case 0: - return FIRED; - - case 1: - return MOVING; - - case 2: - return HIT_VICTIM; - - case 3: - return HIT_BULLET; - - case 4: - return HIT_WALL; - - case 5: - return EXPLODED; - - case 6: - return INACTIVE; - - default: - throw new IllegalArgumentException("unknown value"); - } - } - - public boolean isActive() { - return this == FIRED || this == MOVING; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IBulletSnapshot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IBulletSnapshot.java deleted file mode 100644 index 874ddd6..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IBulletSnapshot.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.snapshot; - - -/** - * Interface of a bullet snapshot at a specific time in a battle. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public interface IBulletSnapshot { - - /** - * Returns the bullet state. - * - * @return the bullet state. - */ - BulletState getState(); - - /** - * Returns the bullet power. - * - * @return the bullet power. - */ - double getPower(); - - /** - * Returns the X position of the bullet. - * - * @return the X position of the bullet. - */ - double getX(); - - /** - * Returns the Y position of the bullet. - * - * @return the Y position of the bullet. - */ - double getY(); - - /** - * Returns the X painting position of the bullet. - * Note that this is not necessarily equal to the X position of the bullet, even though - * it will be in most cases. The painting position of the bullet is needed as the bullet - * will "stick" to its victim when it has been hit, but only visually. - * - * @return the X painting position of the bullet. - */ - double getPaintX(); - - /** - * Returns the Y painting position of the bullet. - * Note that this is not necessarily equal to the Y position of the bullet, even though - * it will be in most cases. The painting position of the bullet is needed as the bullet - * will "stick" to its victim when it has been hit, but only visually. - * - * @return the Y painting position of the bullet. - */ - double getPaintY(); - - /** - * Returns the color of the bullet. - * - * @return an ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - * - * @see java.awt.Color#getRGB() - */ - int getColor(); - - /** - * Returns the current frame number to display, i.e. when the bullet explodes. - * - * @return the current frame number. - * - * @see #isExplosion() - * @see #getExplosionImageIndex() - */ - int getFrame(); - - /** - * Checks if the bullet has become an explosion, i.e. when it a robot or bullet has been hit. - * - * @return {@code true} if the bullet is an explosion; {@code false} otherwise. - * - * @see #getFrame() - * @see #getExplosionImageIndex() - */ - boolean isExplosion(); - - /** - * Returns the explosion image index, which is different depending on the type of explosion. - * E.g. if it is a small explosion on a robot that has been hit by this bullet, - * or a big explosion when a robot dies. - * - * @return the explosion image index. - * - * @see #isExplosion() - * @see #getExplosionImageIndex() - */ - int getExplosionImageIndex(); - - /** - * Returns the ID of the bullet used for identifying the bullet in a collection of bullets. - * - * @return the ID of the bullet. - */ - int getBulletId(); - - /** - * @return heading of the bullet - */ - double getHeading(); - - /** - * @return contestantIndex of the victim, or -1 if still in air - */ - int getVictimIndex(); - - /** - * @return contestantIndex of the owner - */ - int getOwnerIndex(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IDebugProperty.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IDebugProperty.java deleted file mode 100644 index ed0a6fa..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IDebugProperty.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.snapshot; - - -/** - * Interface of a debug property, which is a key-value pair. - * - * @author Pavel Savara (original) - * - * @since 1.6.2 - */ -public interface IDebugProperty { - - /** - * Returns the key of the property. - * - * @return the key of the property. - */ - String getKey(); - - /** - * Returns the value of the property. - * - * @return the value of the property. - */ - String getValue(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IRobotSnapshot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IRobotSnapshot.java deleted file mode 100644 index a10ff4a..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IRobotSnapshot.java +++ /dev/null @@ -1,242 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.snapshot; - - -/** - * Interface of a robot snapshot at a specific time in a battle. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public interface IRobotSnapshot { - - /** - * Returns the name of the robot. - * - * @return the name of the robot. - */ - String getName(); - - /** - * Returns the short name of the robot. - * - * @return the short name of the robot. - */ - String getShortName(); - - /** - * Returns the very short name of the robot. - * - * @return the very short name of the robot. - */ - String getVeryShortName(); - - /** - * Returns the name of the team, which can be the name of a robot if the contestant is not a team, but a robot. - * - * @return the name of the team. - */ - String getTeamName(); - - /** - * Returns the index of the robot, which is unique for the specific robot and constant during a battle. - * - * @return the robot index. - * - * @since 1.7.4 - * - * @see #getTeamIndex() - */ - int getRobotIndex(); - - /** - * Returns the index of the team that this robot is a member of, which is unique for the specific team and constant - * during a battle. - * - * @return the team index or -1 if the robot is not a member of a team. - * - * @since 1.7.4 - * - * @see #getRobotIndex() - */ - int getTeamIndex(); - - /** - * Returns the contestant index, which is unique for each robot or team participating in a battle. - * Note: If a team of robots is participating in a battle, this method will return the team index (see - * {@link #getTeamIndex()}); otherwise the robot index (see {@link #getRobotIndex()}) is used instead. - * This method is used for the battle results as scores are calculated for either a team of robots or individual - * robot. - * - * @return the contestant index of the robot or team. - * - * @see #getRobotIndex() - * @see #getTeamIndex() - */ - int getContestantIndex(); - - /** - * Returns the robot state. - * - * @return the robot state. - */ - RobotState getState(); - - /** - * Returns the energy level of the robot. - * - * @return the energy level of the robot. - */ - double getEnergy(); - - /** - * Returns the velocity of the robot. - * - * @return the velocity of the robot. - */ - double getVelocity(); - - /** - * Returns the body heading of the robot in radians. - * - * @return the body heading of the robot in radians. - */ - double getBodyHeading(); - - /** - * Returns the gun heading of the robot in radians. - * - * @return the gun heading of the robot in radians. - */ - double getGunHeading(); - - /** - * Returns the radar heading of the robot in radians. - * - * @return the radar heading of the robot in radians. - */ - double getRadarHeading(); - - /** - * Returns the gun heat of the robot. - * - * @return the gun heat of the robot. - */ - double getGunHeat(); - - /** - * Returns the X position of the robot. - * - * @return the X position of the robot. - */ - double getX(); - - /** - * Returns the Y position of the robot. - * - * @return the Y position of the robot. - */ - double getY(); - - /** - * Returns the color of the body. - * - * @return an ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - * - * @see java.awt.Color#getRGB() - */ - int getBodyColor(); - - /** - * Returns the color of the gun. - * - * @return an ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - * - * @see java.awt.Color#getRGB() - */ - int getGunColor(); - - /** - * Returns the color of the radar. - * - * @return an ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - * - * @see java.awt.Color#getRGB() - */ - int getRadarColor(); - - /** - * Returns the color of the scan arc. - * - * @return an ARGB color value. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue) - * - * @see java.awt.Color#getRGB() - */ - int getScanColor(); - - /** - * Checks if this robot is a {@link robocode.Droid Droid}. - * - * @return {@code true} if this robot is a Droid; {@code false} otherwise. - */ - boolean isDroid(); - - /** - * Checks if this robot is a {@link robocode.BorderSentry BorderSentry}. - * - * @return {@code true} if this robot is a BorderSentry; {@code false} otherwise. - * - * @since 1.9.0.0 - */ - boolean isSentryRobot(); - - /** - * Checks if this robot is a {@link robocode.robotinterfaces.IPaintRobot IPaintRobot} or is invoking getGraphics() - * - * @return {@code true} if this robot is a painting; {@code false} otherwise. - */ - boolean isPaintRobot(); - - /** - * Checks if painting is enabled for this robot. - * - * @return {@code true} if painting is enabled for this robot; {@code false} otherwise. - */ - boolean isPaintEnabled(); - - /** - * Checks if RobocodeSG painting (the point (0,0) is in the upper left corner) is enabled for this robot. - * - * @return {@code true} if RobocodeSG painting is enabled for this robot; {@code false} otherwise. - */ - boolean isSGPaintEnabled(); - - /** - * Returns a snapshot of debug properties. - * - * @return a snapshot of debug properties. - */ - IDebugProperty[] getDebugProperties(); - - /** - * Returns a snapshot of the output print stream for this robot. - * - * @return a string containing the snapshot of the output print stream. - */ - String getOutputStreamSnapshot(); - - /** - * Returns a snapshot of the current score for this robot. - * - * @return a snapshot of the current score for this robot. - */ - IScoreSnapshot getScoreSnapshot(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IScoreSnapshot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IScoreSnapshot.java deleted file mode 100644 index 00ca3a4..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/IScoreSnapshot.java +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.snapshot; - - -/** - * Interface of a score snapshot at a specific time in a battle. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public interface IScoreSnapshot extends Comparable { - - /** - * Returns the name of the contestant, i.e. a robot or team. - * - * @return the name of the contestant, i.e. a robot or team. - */ - String getName(); - - /** - * Returns the total score. - * - * @return the total score. - */ - double getTotalScore(); - - /** - * Returns the total survival score. - * - * @return the total survival score. - */ - double getTotalSurvivalScore(); - - /** - * Returns the total last survivor score. - * - * @return the total last survivor score. - */ - double getTotalLastSurvivorBonus(); - - /** - * Returns the total bullet damage score. - * - * @return the total bullet damage score. - */ - double getTotalBulletDamageScore(); - - /** - * Returns the total bullet kill bonus. - * - * @return the total bullet kill bonus. - */ - double getTotalBulletKillBonus(); - - /** - * Returns the total ramming damage score. - * - * @return the total ramming damage score. - */ - double getTotalRammingDamageScore(); - - /** - * Returns the total ramming kill bonus. - * - * @return the total ramming kill bonus. - */ - double getTotalRammingKillBonus(); - - /** - * Returns the total number of first places. - * - * @return the total number of first places. - */ - int getTotalFirsts(); - - /** - * Returns the total number of second places. - * - * @return the total number of second places. - */ - int getTotalSeconds(); - - /** - * Returns the total number of third places. - * - * @return the total number of third places. - */ - int getTotalThirds(); - - /** - * Returns the current score. - * - * @return the current score. - */ - double getCurrentScore(); - - /** - * Returns the current survival score. - * - * @return the current survival score. - */ - double getCurrentSurvivalScore(); - - /** - * Returns the current survival bonus. - * - * @return the current survival bonus. - */ - double getCurrentSurvivalBonus(); - - /** - * Returns the current bullet damage score. - * - * @return the current bullet damage score. - */ - double getCurrentBulletDamageScore(); - - /** - * Returns the current bullet kill bonus. - * - * @return the current bullet kill bonus. - */ - double getCurrentBulletKillBonus(); - - /** - * Returns the current ramming damage score. - * - * @return the current ramming damage score. - */ - double getCurrentRammingDamageScore(); - - /** - * Returns the current ramming kill bonus. - * - * @return the current ramming kill bonus. - */ - double getCurrentRammingKillBonus(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/ITurnSnapshot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/ITurnSnapshot.java deleted file mode 100644 index abe369c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/ITurnSnapshot.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.snapshot; - - -/** - * Interface of a battle turn snapshot at a specific time in a battle. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.2 - */ -public interface ITurnSnapshot { - - /** - * Returns a list of snapshots for the robots participating in the battle. - * - * @return a list of snapshots for the robots participating in the battle. - */ - IRobotSnapshot[] getRobots(); - - /** - * Returns a list of snapshots for the bullets that are currently on the battlefield. - * - * @return a list of snapshots for the bullets that are currently on the battlefield. - */ - IBulletSnapshot[] getBullets(); - - /** - * Returns the current TPS (turns per second) rate. - * - * @return the current TPS (turns per second) rate. - */ - int getTPS(); - - /** - * Returns the current round of the battle. - * - * @return the current round of the battle. - */ - int getRound(); - - /** - * Returns the current turn in the battle round. - * - * @return the current turn in the battle round. - */ - int getTurn(); - - /** - * Returns an array of sorted scores grouped by teams, ordered by position. - * Note that the team index cannot be used to determine the score with the sorted scores. - * - * @return an array of sorted IScoreSnapshots, where the bigger scores are placed first in the list. - * - * @see #getIndexedTeamScores() - */ - IScoreSnapshot[] getSortedTeamScores(); - - /** - * Returns an array of indexed scores grouped by teams that can be used to determine the score - * for the individual team based on the team index. - * - * @return an array of indexed IScoreSnapshots, where each index matches an index of a specific team. - * - * @see #getSortedTeamScores() - */ - IScoreSnapshot[] getIndexedTeamScores(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/RobotState.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/RobotState.java deleted file mode 100644 index 887cf69..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/RobotState.java +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.control.snapshot; - - -/** - * Defines a robot state, which can be: active on the battlefield, hitting a wall or robot this turn, or dead. - * - * @author Flemming N. Larsen (original) - * - * @since 1.6.2 - */ -public enum RobotState { - - /** The robot is active on the battlefield and has not hit the wall or a robot at this turn. */ - ACTIVE(0), - - /** The robot has hit a wall, i.e. one of the four borders, at this turn. This state only last one turn. */ - HIT_WALL(1), - - /** The robot has hit another robot at this turn. This state only last one turn. */ - HIT_ROBOT(2), - - /** The robot is dead. */ - DEAD(3); - - private final int value; - - private RobotState(int value) { - this.value = value; - } - - /** - * Returns the state as an integer value. - * - * @return an integer value representing this state. - * - * @see #toState(int) - */ - public int getValue() { - return value; - } - - /** - * Returns a RobotState based on an integer value that represents a RobotState. - * - * @param value the integer value that represents a specific RobotState. - * @return a RobotState that corresponds to the specific integer value. - * - * @see #getValue() - * - * @throws IllegalArgumentException if the specified value does not correspond - * to a RobotState and hence is invalid. - */ - public static RobotState toState(int value) { - switch (value) { - case 0: - return ACTIVE; - - case 1: - return HIT_WALL; - - case 2: - return HIT_ROBOT; - - case 3: - return DEAD; - - default: - throw new IllegalArgumentException("unknown value"); - } - } - - /** - * Checks if the robot is alive. - * - * @return {@code true} if the robot is alive; {@code false} otherwise. - * - * @see #isDead() - */ - public boolean isAlive() { - return this != DEAD; - } - - /** - * Checks if the robot is dead. - * - * @return {@code true} if the robot is dead; {@code false} otherwise. - * - * @see #isAlive() - */ - public boolean isDead() { - return this == DEAD; - } - - /** - * Checks if the robot has hit another robot. - * - * @return {@code true} if the robot has hit a robot; {@code false} otherwise. - * - * @see #isHitWall() - */ - public boolean isHitRobot() { - return this == HIT_ROBOT; - } - - /** - * Checks if the robot has hit the wall, i.e. one of the four borders. - * - * @return {@code true} if the robot has hit the wall; {@code false} otherwise. - * - * @see #isHitRobot() - */ - public boolean isHitWall() { - return this == HIT_WALL; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/package-info.java deleted file mode 100644 index ea5ebb5..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/control/snapshot/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Snapshots of the battle turns, robots, bullets, scores etc. - */ -package robocode.control.snapshot; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/AbortedException.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/AbortedException.java deleted file mode 100644 index 3531ca8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/AbortedException.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.exception; - - -/** - * @author Pavel Savara (original) - * - * @since 1.6.1 - */ -public class AbortedException extends Error { // Must be an Error! - // From viewpoint of the Robot, an Error is a JVM error: - // Robot died, their CPU exploded, the JVM for the robot's brain has an error. - private static final long serialVersionUID = 1L; - - public AbortedException() { - super(); - } - - public AbortedException(String message) { - super(message); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DeathException.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DeathException.java deleted file mode 100644 index 5f18f0e..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DeathException.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.exception; - - -/** - * @author Mathew A. Nelson (original) - */ -public class DeathException extends Error { // Must be an Error! - // From viewpoint of the Robot, an Error is a JVM error: - // Robot died, their CPU exploded, the JVM for the robot's brain has an error. - private static final long serialVersionUID = 1L; - - public DeathException() { - super(); - } - - public DeathException(String message) { - super(message); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DisabledException.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DisabledException.java deleted file mode 100644 index 24435f1..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/DisabledException.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.exception; - - -/** - * @author Mathew A. Nelson (original) - */ -public class DisabledException extends Error { // Must be an Error! - private static final long serialVersionUID = 1L; - - public DisabledException() { - super(); - } - - public DisabledException(String s) { - super(s); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/EventInterruptedException.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/EventInterruptedException.java deleted file mode 100644 index 0d7ccd0..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/EventInterruptedException.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.exception; - - -/** - * @author Mathew A. Nelson (original) - */ -public class EventInterruptedException extends Error { // Must be an Error! - private static final long serialVersionUID = 1L; - - private int priority = Integer.MIN_VALUE; - - public EventInterruptedException(int priority) { - this.priority = priority; - } - - public int getPriority() { - return priority; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/RobotException.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/RobotException.java deleted file mode 100644 index 93e331f..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/RobotException.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.exception; - - -/** - * @author Mathew A. Nelson (original) - */ -public class RobotException extends Error { // Must be an Error! - private static final long serialVersionUID = 1L; - - public RobotException() { - super(); - } - - public RobotException(String s) { - super(s); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/WinException.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/WinException.java deleted file mode 100644 index 478f165..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/WinException.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.exception; - - -/** - * @author Mathew A. Nelson (original) - */ -public class WinException extends Error { // Must be an Error! - private static final long serialVersionUID = 1L; - - public WinException() { - super(); - } - - public WinException(String s) { - super(s); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/package-info.java deleted file mode 100644 index cc56bbd..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/exception/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Contains exceptions that occur inside a robot thrown by the game. - */ -package robocode.exception; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/package-info.java deleted file mode 100644 index deb1c88..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Robot API used for writing robots for Robocode. - */ -package robocode; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/EllipseGL.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/EllipseGL.java deleted file mode 100644 index 550f5fd..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/EllipseGL.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robocodeGL; - - -import java.awt.Color; - -import gl4java.GLFunc; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class EllipseGL extends RenderElement { - - public EllipseGL() {} - - public EllipseGL(double x, double y, double width, double height) {} - - public EllipseGL(double x, double y, double width, double height, Color color, double lineWidth) {} - - public void setFrame(double x, double y, double width, double height) {} - - public void setLineWidth(double lineWidth) {} - - public void setFilled(boolean filled) {} - - public void setColor(Color c) {} - - public void setLocation(double x, double y) {} - - public void setSize(double width, double height) {} - - public void draw(GLFunc gl) {} - - public float getStringX() { - return 0f; - } - - public float getStringY() { - return 0f; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LabelGL.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LabelGL.java deleted file mode 100644 index 09d4ad5..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LabelGL.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robocodeGL; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class LabelGL { - - public LabelGL(String s) {} - - public synchronized void setString(String s) {} - - public synchronized String toString() { - return ""; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LineGL.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LineGL.java deleted file mode 100644 index 217cf72..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/LineGL.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robocodeGL; - - -import java.awt.Color; - -import gl4java.GLFunc; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class LineGL extends RenderElement { - - public LineGL() {} - - public LineGL(double x1, double y1, double x2, double y2) {} - - public void setLine(double x1, double y1, double x2, double y2) {} - - public void setWidth(double lineWidth) {} - - public void setColor(Color c) {} - - public void draw(GLFunc gl) {} - - public float getStringX() { - return 0f; - } - - public float getStringY() { - return 0f; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/PointGL.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/PointGL.java deleted file mode 100644 index d7a543a..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/PointGL.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robocodeGL; - - -import gl4java.GLFunc; -import java.awt.Color; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class PointGL extends RenderElement { - - public void setSize(float size) {} - - public synchronized void setPosition(double x, double y) {} - - public void setColor(Color c) {} - - public float getStringX() { - return 0f; - } - - public float getStringY() { - return 0f; - } - - public void draw(GLFunc gl) {} -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RectangleGL.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RectangleGL.java deleted file mode 100644 index 8def061..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RectangleGL.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robocodeGL; - - -import gl4java.GLFunc; -import java.awt.Color; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class RectangleGL extends RenderElement { - - public RectangleGL() {} - - public RectangleGL(double x, double y, double width, double height) {} - - public RectangleGL(double x, double y, double width, double height, Color c, double lineWidth) {} - - public void setBounds(double x, double y, double width, double height) {} - - public void setLineWidth(double lineWidth) {} - - public void setColor(Color color) {} - - public void setFilled(boolean filled) {} - - public void setLocation(double x, double y) {} - - public void setSize(double width, double height) {} - - public void draw(GLFunc gl) {} - - public float getStringX() { - return 0f; - } - - public float getStringY() { - return 0f; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RenderElement.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RenderElement.java deleted file mode 100644 index 17be2d8..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/RenderElement.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robocodeGL; - - -import gl4java.GLFont; -import gl4java.GLFunc; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public abstract class RenderElement { - - public static void init(GLFont glf) {} - - public RenderElement() {} - - public synchronized void addLabel(LabelGL l) {} - - public synchronized void removeLabel(LabelGL l) {} - - public synchronized void remove() {} - - public synchronized boolean isRemoved() { - return false; - } - - public synchronized void drawStrings(GLFunc gl) {} - - public abstract void draw(GLFunc gl); - - public float getStringX() { - return 0f; - } - - public float getStringY() { - return 0f; - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/system/GLRenderer.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/system/GLRenderer.java deleted file mode 100644 index 30be5ee..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robocodeGL/system/GLRenderer.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robocodeGL.system; - - -import robocode.robocodeGL.RenderElement; - - -/** - * Dummy class that stub out RobocodeGL 0.1.4 functionality. - * - * Original author is David Alves for RobocodeGL. - */ -public class GLRenderer { - - public static GLRenderer getInstance() { - return new GLRenderer(); - } - - public void addRenderElement(RenderElement e) {} -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedEvents.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedEvents.java deleted file mode 100644 index 2ee2574..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedEvents.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -import robocode.CustomEvent; -import robocode.SkippedTurnEvent; - - -/** - * An event interface for receiving advanced robot events with an - * {@link IAdvancedRobot}. - * - * @see IAdvancedRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IAdvancedEvents { - - /** - * This method is called if the robot is using too much time between - * actions. When this event occur, the robot's turn is skipped, meaning that - * it cannot take action anymore in this turn. - *

- * If you receive 30 skipped turn event, your robot will be removed from the - * round and loose the round. - *

- * You will only receive this event after taking an action. So a robot in an - * infinite loop will not receive any events, and will simply be stopped. - *

- * No correctly working, reasonable robot should ever receive this event - * unless it is using too many CPU cycles. - * - * @param event the skipped turn event set by the game - * @see robocode.SkippedTurnEvent - * @see robocode.Event - */ - void onSkippedTurn(SkippedTurnEvent event); - - /** - * This method is called when a custom condition is met. - *

- * See the sample robots for examples of use, e.g. the {@code sample.Target} - * robot. - * - * @param event the custom event that occurred - * @see robocode.AdvancedRobot#addCustomEvent - * @see robocode.CustomEvent - * @see robocode.Event - */ - void onCustomEvent(CustomEvent event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedRobot.java deleted file mode 100644 index 39c6c90..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IAdvancedRobot.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -/** - * A robot interface for creating a more advanced type of robot like - * {@link robocode.AdvancedRobot} that is able to handle advanced robot events. - * An advanced robot allows non-blocking calls, custom events, get notifications - * about skipped turns, and also allow writes to the file system. - * - * @see robocode.AdvancedRobot - * @see IBasicRobot - * @see IJuniorRobot - * @see IInteractiveRobot - * @see ITeamRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IAdvancedRobot extends IBasicRobot { - - /** - * This method is called by the game to notify this robot about advanced - * robot event. Hence, this method must be implemented so it returns your - * {@link IAdvancedEvents} listener. - * - * @return listener to advanced events or {@code null} if this robot should - * not receive the notifications. - * @since 1.6 - */ - IAdvancedEvents getAdvancedEventListener(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents.java deleted file mode 100644 index 3e9a2ce..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents.java +++ /dev/null @@ -1,278 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -import robocode.*; - - -/** - * An event interface for receiving basic robot events with an - * {@link IBasicRobot}. - * - * @see IBasicRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IBasicEvents { - - /** - * This method is called every turn in a battle round in order to provide - * the robot status as a complete snapshot of the robot's current state at - * that specific time. - *

- * The main benefit of this method is that you'll automatically receive all - * current data values of the robot like e.g. the x and y coordinate, - * heading, gun heat etc., which are grouped into the exact same time/turn. - *

- * This is the only way to map the robots data values to a specific time. - * For example, it is not possible to determine the exact time of the - * robot's heading by calling first calling {@link Robot#getTime()} and then - * {@link Robot#getHeading()} afterwards, as the time might change - * after between the {@link Robot#getTime()} and {@link Robot#getHeading()} - * call. - * - * @param event the event containing the robot status at the time it occurred. - * @see StatusEvent - * @see Event - * @since 1.5 - */ - void onStatus(StatusEvent event); - - /** - * This method is called when one of your bullets hits another robot. - * You should override it in your robot if you want to be informed of this - * event. - *

- * Example: - *

-	 *   public void onBulletHit(BulletHitEvent event) {
-	 *       out.println("I hit " + event.getName() + "!");
-	 *   }
-	 * 
- * - * @param event the bullet-hit event set by the game - * @see BulletHitEvent - * @see Event - */ - void onBulletHit(BulletHitEvent event); - - /** - * This method is called when one of your bullets hits another bullet. - * You should override it in your robot if you want to be informed of this - * event. - *

- * Example: - *

-	 *   public void onBulletHitBullet(BulletHitBulletEvent event) {
-	 *       out.println("I hit a bullet fired by " + event.getBullet().getName() + "!");
-	 *   }
-	 * 
- * - * @param event the bullet-hit-bullet event set by the game - * @see BulletHitBulletEvent - * @see Event - */ - void onBulletHitBullet(BulletHitBulletEvent event); - - /** - * This method is called when one of your bullets misses, i.e. hits a wall. - * You should override it in your robot if you want to be informed of this - * event. - *

- * Example: - *

-	 *   public void onBulletMissed(BulletMissedEvent event) {
-	 *       out.println("Drat, I missed.");
-	 *   }
-	 * 
- * - * @param event the bullet-missed event set by the game - * @see BulletMissedEvent - * @see Event - */ - void onBulletMissed(BulletMissedEvent event); - - /** - * This method is called if your robot dies. - *

- * You should override it in your robot if you want to be informed of this - * event. Actions will have no effect if called from this section. The - * intent is to allow you to perform calculations or print something out - * when the robot is killed. - * - * @param event the death event set by the game - * @see DeathEvent - * @see WinEvent - * @see RoundEndedEvent - * @see BattleEndedEvent - * @see Event - */ - public void onDeath(DeathEvent event); - - /** - * This method is called when your robot is hit by a bullet. - * You should override it in your robot if you want to be informed of this - * event. - *

- * Example: - *

-	 *   void onHitByBullet(HitByBulletEvent event) {
-	 *       out.println(event.getRobotName() + " hit me!");
-	 *   }
-	 * 
- * - * @param event the hit-by-bullet event set by the game - * @see HitByBulletEvent - * @see Event - */ - void onHitByBullet(HitByBulletEvent event); - - /** - * This method is called when your robot collides with another robot. - * You should override it in your robot if you want to be informed of this - * event. - *

- * Example: - *

-	 *   void onHitRobot(HitRobotEvent event) {
-	 *       if (event.getBearing() > -90 && event.getBearing() <= 90) {
-	 *           back(100);
-	 *       } else {
-	 *           ahead(100);
-	 *       }
-	 *   }
-	 * 

- * -- or perhaps, for a more advanced robot -- - *

- * public void onHitRobot(HitRobotEvent event) { - * if (event.getBearing() > -90 && event.getBearing() <= 90) { - * setBack(100); - * } else { - * setAhead(100); - * } - * } - *

- *

- * The angle is relative to your robot's facing. So 0 is straight ahead of - * you. - *

- * This event can be generated if another robot hits you, in which case - * {@link HitRobotEvent#isMyFault() event.isMyFault()} will return - * {@code false}. In this case, you will not be automatically stopped by the - * game -- but if you continue moving toward the robot you will hit it (and - * generate another event). If you are moving away, then you won't hit it. - * - * @param event the hit-robot event set by the game - * @see HitRobotEvent - * @see Event - */ - void onHitRobot(HitRobotEvent event); - - /** - * This method is called when your robot collides with a wall. - * You should override it in your robot if you want to be informed of this - * event. - *

- * The wall at the top of the screen is 0 degrees, right is 90 degrees, - * bottom is 180 degrees, left is 270 degrees. But this event is relative to - * your heading, so: The bearing is such that {@link Robot#turnRight(double) - * turnRight} {@link HitWallEvent#getBearing() (event.getBearing())} will - * point you perpendicular to the wall. - *

- * Example: - *

-	 *   void onHitWall(HitWallEvent event) {
-	 *       out.println("Ouch, I hit a wall bearing " + event.getBearing() + " degrees.");
-	 *   }
-	 * 
- * - * @param event the hit-wall event set by the game - * @see HitWallEvent - * @see Event - */ - void onHitWall(HitWallEvent event); - - /** - * This method is called when your robot sees another robot, i.e. when the - * robot's radar scan "hits" another robot. - * You should override it in your robot if you want to be informed of this - * event. (Almost all robots should override this!) - *

- * This event is automatically called if there is a robot in range of your - * radar. - *

- * Note that the robot's radar can only see robot within the range defined - * by {@link Rules#RADAR_SCAN_RADIUS} (1200 pixels). - *

- * Also not that the bearing of the scanned robot is relative to your - * robot's heading. - *

- * Example: - *

-	 *   void onScannedRobot(ScannedRobotEvent event) {
-	 *       // Assuming radar and gun are aligned...
-	 *       if (event.getDistance() < 100) {
-	 *           fire(3);
-	 *       } else {
-	 *           fire(1);
-	 *       }
-	 *   }
-	 * 
- *

- * Note:
- * The game assists Robots in firing, as follows: - *

    - *
  • If the gun and radar are aligned (and were aligned last turn), - *
  • and the event is current, - *
  • and you call fire() before taking any other actions, {@link - * Robot#fire(double) fire()} will fire directly at the robot. - *
- *

- * In essence, this means that if you can see a robot, and it doesn't move, - * then fire will hit it. - *

- * AdvancedRobots will NOT be assisted in this manner, and are expected to - * examine the event to determine if {@link Robot#fire(double) fire()} would - * hit. (i.e. you are spinning your gun around, but by the time you get the - * event, your gun is 5 degrees past the robot). - * - * @param event the scanned-robot event set by the game - * @see ScannedRobotEvent - * @see Event - * @see Rules#RADAR_SCAN_RADIUS - */ - void onScannedRobot(ScannedRobotEvent event); - - /** - * This method is called when another robot dies. - * You should override it in your robot if you want to be informed of this - * event. - * - * @param event The robot-death event set by the game - * @see RobotDeathEvent - * @see Event - */ - void onRobotDeath(RobotDeathEvent event); - - /** - * This method is called if your robot wins a battle. - *

- * Your robot could perform a victory dance here! :-) - * - * @param event the win event set by the game - * @see DeathEvent - * @see RoundEndedEvent - * @see BattleEndedEvent - * @see Event - */ - void onWin(WinEvent event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents2.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents2.java deleted file mode 100644 index e737569..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents2.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -import robocode.BattleEndedEvent; -import robocode.RoundEndedEvent; - - -/** - * First extended version of the {@link IBasicEvents} interface. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -public interface IBasicEvents2 extends IBasicEvents { - - /** - * This method is called after the end of the battle, even when the battle is aborted. - * You should override it in your robot if you want to be informed of this event. - *

- * Example: - *

-	 *   public void onBattleEnded(BattleEndedEvent event) {
-	 *       out.println("The battle has ended");
-	 *   }
-	 * 
- * - * @param event the BattleEndedEvent set by the game - * @see BattleEndedEvent - * @see IBasicEvents3#onRoundEnded(RoundEndedEvent) - * @see robocode.WinEvent - * @see robocode.DeathEvent - * @see robocode.Event - * - * @since 1.6.1 - */ - void onBattleEnded(BattleEndedEvent event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents3.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents3.java deleted file mode 100644 index 6396c1e..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicEvents3.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -import robocode.BattleEndedEvent; -import robocode.RoundEndedEvent; - - -/** - * Second extended version of the {@link IBasicEvents} interface. - * - * @author Flemming N. Larsen (original) - * - * @since 1.7.2 - */ -public interface IBasicEvents3 extends IBasicEvents2 { - - /** - * This method is called after the end of a round. - * You should override it in your robot if you want to be informed of this event. - *

- * Example: - *

-	 *   public void onRoundEnded(RoundEndedEvent event) {
-	 *       out.println("The round has ended");
-	 *   }
-	 * 
- * - * @param event the RoundEndedEvent event set by the game - * @see RoundEndedEvent - * @see #onBattleEnded(BattleEndedEvent) - * @see robocode.WinEvent - * @see robocode.DeathEvent - * @see robocode.Event - * - * @since 1.7.2 - */ - void onRoundEnded(RoundEndedEvent event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicRobot.java deleted file mode 100644 index d61ddfb..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IBasicRobot.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -import robocode.robotinterfaces.peer.IBasicRobotPeer; - - -/** - * A robot interface for creating a basic type of robot like {@link robocode.Robot} - * that is able to receive common robot events, but not interactive events as - * with the {@link robocode.Robot} class. - * A basic robot allows blocking calls only and cannot handle custom events nor - * writes to the file system like an advanced robot. - * - * @see robocode.Robot - * @see IJuniorRobot - * @see IInteractiveRobot - * @see IAdvancedRobot - * @see ITeamRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IBasicRobot { - - /** - * This method is called by the game to invoke the - * {@link java.lang.Runnable#run() run()} method of your robot, where the program - * of your robot is implemented. - * - * @return a runnable implementation - * @see java.lang.Runnable#run() - * @since 1.6 - */ - Runnable getRobotRunnable(); - - /** - * This method is called by the game to notify this robot about basic - * robot event. Hence, this method must be implemented so it returns your - * {@link IBasicEvents} listener. - * - * @return listener to basic events or {@code null} if this robot should - * not receive the notifications. - * @since 1.6 - */ - IBasicEvents getBasicEventListener(); - - /** - * Do not call this method! Your robot will simply stop interacting with - * the game. - *

- * This method is called by the game. A robot peer is the object that deals - * with game mechanics and rules, and makes sure your robot abides by them. - * - * @param peer the robot peer supplied by the game - */ - void setPeer(IBasicRobotPeer peer); - - /** - * Do not call this method! - *

- * This method is called by the game when setting the output stream for your - * robot. - * - * @param out the new output print stream for this robot - * @since 1.6 - */ - void setOut(java.io.PrintStream out); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveEvents.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveEvents.java deleted file mode 100644 index f249dc9..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveEvents.java +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; - - -/** - * An event interface for receiving interactive events with an - * {@link IInteractiveRobot}. - * - * @see IInteractiveRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IInteractiveEvents { - - /** - * This method is called when a key has been pressed. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * key events. - * - * @param event holds details about current event - * @see java.awt.event.KeyListener#keyPressed(KeyEvent) - * @see #onKeyReleased(KeyEvent) - * @see #onKeyTyped(KeyEvent) - * @since 1.3.4 - */ - void onKeyPressed(KeyEvent event); - - /** - * This method is called when a key has been released. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * key events. - * - * @param event holds details about current event - * @see java.awt.event.KeyListener#keyReleased(KeyEvent) - * @see #onKeyPressed(KeyEvent) - * @see #onKeyTyped(KeyEvent) - * @since 1.3.4 - */ - void onKeyReleased(KeyEvent event); - - /** - * This method is called when a key has been typed (pressed and released). - *

- * See the {@code sample.Interactive} robot for an example of how to use - * key events. - * - * @param event holds details about current event - * @see java.awt.event.KeyListener#keyTyped(KeyEvent) - * @see #onKeyPressed(KeyEvent) - * @see #onKeyReleased(KeyEvent) - * @since 1.3.4 - */ - void onKeyTyped(KeyEvent event); - - /** - * This method is called when a mouse button has been clicked (pressed and - * released). - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseListener#mouseClicked(MouseEvent) - * @see #onMouseMoved(MouseEvent) - * @see #onMousePressed(MouseEvent) - * @see #onMouseReleased(MouseEvent) - * @see #onMouseEntered(MouseEvent) - * @see #onMouseExited(MouseEvent) - * @see #onMouseDragged(MouseEvent) - * @see #onMouseWheelMoved(MouseWheelEvent) - * @since 1.3.4 - */ - void onMouseClicked(MouseEvent event); - - /** - * This method is called when the mouse has entered the battle view. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseListener#mouseEntered(MouseEvent) - * @see #onMouseMoved(MouseEvent) - * @see #onMousePressed(MouseEvent) - * @see #onMouseReleased(MouseEvent) - * @see #onMouseClicked(MouseEvent) - * @see #onMouseExited(MouseEvent) - * @see #onMouseDragged(MouseEvent) - * @see #onMouseWheelMoved(MouseWheelEvent) - * @since 1.3.4 - */ - void onMouseEntered(MouseEvent event); - - /** - * This method is called when the mouse has exited the battle view. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseListener#mouseExited(MouseEvent) - * @see #onMouseMoved(MouseEvent) - * @see #onMousePressed(MouseEvent) - * @see #onMouseReleased(MouseEvent) - * @see #onMouseClicked(MouseEvent) - * @see #onMouseEntered(MouseEvent) - * @see #onMouseDragged(MouseEvent) - * @see #onMouseWheelMoved(MouseWheelEvent) - * @since 1.3.4 - */ - void onMouseExited(MouseEvent event); - - /** - * This method is called when a mouse button has been pressed. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseListener#mousePressed(MouseEvent) - * @see #onMouseMoved(MouseEvent) - * @see #onMouseReleased(MouseEvent) - * @see #onMouseClicked(MouseEvent) - * @see #onMouseEntered(MouseEvent) - * @see #onMouseExited(MouseEvent) - * @see #onMouseDragged(MouseEvent) - * @see #onMouseWheelMoved(MouseWheelEvent) - * @since 1.3.4 - */ - void onMousePressed(MouseEvent event); - - /** - * This method is called when a mouse button has been released. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseListener#mouseReleased(MouseEvent) - * @see #onMouseMoved(MouseEvent) - * @see #onMousePressed(MouseEvent) - * @see #onMouseClicked(MouseEvent) - * @see #onMouseEntered(MouseEvent) - * @see #onMouseExited(MouseEvent) - * @see #onMouseDragged(MouseEvent) - * @see #onMouseWheelMoved(MouseWheelEvent) - * @since 1.3.4 - */ - void onMouseReleased(MouseEvent event); - - /** - * This method is called when the mouse has been moved. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseMotionListener#mouseMoved(MouseEvent) - * @see #onMousePressed(MouseEvent) - * @see #onMouseReleased(MouseEvent) - * @see #onMouseClicked(MouseEvent) - * @see #onMouseEntered(MouseEvent) - * @see #onMouseExited(MouseEvent) - * @see #onMouseDragged(MouseEvent) - * @see #onMouseWheelMoved(MouseWheelEvent) - * @since 1.3.4 - */ - void onMouseMoved(MouseEvent event); - - /** - * This method is called when a mouse button has been pressed and then - * dragged. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseMotionListener#mouseDragged(MouseEvent) - * @see #onMouseMoved(MouseEvent) - * @see #onMousePressed(MouseEvent) - * @see #onMouseReleased(MouseEvent) - * @see #onMouseClicked(MouseEvent) - * @see #onMouseEntered(MouseEvent) - * @see #onMouseExited(MouseEvent) - * @see #onMouseWheelMoved(MouseWheelEvent) - * @since 1.3.4 - */ - void onMouseDragged(MouseEvent event); - - /** - * This method is called when the mouse wheel has been rotated. - *

- * See the {@code sample.Interactive} robot for an example of how to use - * mouse events. - * - * @param event holds details about current event - * @see java.awt.event.MouseWheelListener#mouseWheelMoved(MouseWheelEvent) - * @see #onMouseMoved(MouseEvent) - * @see #onMousePressed(MouseEvent) - * @see #onMouseReleased(MouseEvent) - * @see #onMouseClicked(MouseEvent) - * @see #onMouseEntered(MouseEvent) - * @see #onMouseExited(MouseEvent) - * @see #onMouseDragged(MouseEvent) - */ - void onMouseWheelMoved(MouseWheelEvent event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveRobot.java deleted file mode 100644 index 3ed501b..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IInteractiveRobot.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -/** - * A robot interface for creating an interactive type of robot like - * {@link robocode.Robot} and {@link robocode.AdvancedRobot} that is able to - * receive interactive events from the keyboard or mouse. - * If a robot is directly inherited from this class it will behave as similar to - * a {@link IBasicRobot}. If you need it to behave similar to a - * {@link IAdvancedRobot} or {@link ITeamRobot}, you should inherit from these - * interfaces instead, as these are inherited from this interface. - * - * @see robocode.Robot - * @see robocode.AdvancedRobot - * @see IBasicRobot - * @see IJuniorRobot - * @see IAdvancedRobot - * @see ITeamRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (javadoc) - * - * @since 1.6 - */ -public interface IInteractiveRobot extends IBasicRobot { - - /** - * This method is called by the game to notify this robot about interactive - * events, i.e. keyboard and mouse events. Hence, this method must be - * implemented so it returns your {@link IInteractiveEvents} listener. - * - * @return listener to interactive events or {@code null} if this robot - * should not receive the notifications. - * @since 1.6 - */ - IInteractiveEvents getInteractiveEventListener(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IJuniorRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IJuniorRobot.java deleted file mode 100644 index 892b8c7..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IJuniorRobot.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -/** - * A robot interface for creating the most primitive robot type, which is a - * {@link robocode.JuniorRobot}. A junior robot is simpler than the - * {@link robocode.Robot} class. - *

- * A junior robot has a simplified model, in purpose of teaching programming - * skills to inexperienced in programming students. - * The simplified robot model will keep player from overwhelming of Robocode's - * rules, programming syntax and programming concept. - *

- * Instead of using getters and setters, public fields are provided for - * receiving information like the last scanned robot, the coordinate of the - * robot etc. - *

- * All methods on a junior robot are blocking calls, i.e. they do not return - * before their action has been completed and will at least take one turn to - * execute. - * - * @see robocode.JuniorRobot - * @see IBasicRobot - * @see IAdvancedRobot - * @see IInteractiveRobot - * @see ITeamRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IJuniorRobot extends IBasicRobot {} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintEvents.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintEvents.java deleted file mode 100644 index 2df2662..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintEvents.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -import java.awt.*; - - -/** - * An event interface for receiving paint events with an - * {@link robocode.robotinterfaces.IPaintRobot}. - * - * @see robocode.robotinterfaces.IPaintRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IPaintEvents { - - /** - * This method is called every time the robot is painted. You should - * override this method if you want to draw items for your robot on the - * battle field, e.g. targets, virtual bullets etc. - *

- * This method is very useful for debugging your robot. - *

- * Note that the robot will only be painted if the "Paint" is enabled on the - * robot's console window; otherwise the robot will never get painted (the - * reason being that all robots might have graphical items that must be - * painted, and then you might not be able to tell what graphical items that - * have been painted for your robot). - *

- * Also note that the coordinate system for the graphical context where you - * paint items fits for the Robocode coordinate system where (0, 0) is at - * the bottom left corner of the battlefield, where X is towards right and Y - * is upwards. - * - * @param g the graphics context to use for painting graphical items for the - * robot. - * - * @see java.awt.Graphics2D - * - * @since 1.1 - */ - void onPaint(Graphics2D g); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintRobot.java deleted file mode 100644 index 03c5db1..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/IPaintRobot.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -/** - * A robot interface that makes it possible for a robot to receive paint events. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IPaintRobot extends IBasicRobot { - - /** - * This method is called by the game to notify this robot about painting - * events. Hence, this method must be implemented so it returns your - * {@link IPaintEvents} listener. - * - * @return listener to paint events or {@code null} if this robot should - * not receive the notifications. - * @since 1.6 - */ - IPaintEvents getPaintEventListener(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamEvents.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamEvents.java deleted file mode 100644 index bf2ff3a..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamEvents.java +++ /dev/null @@ -1,27 +0,0 @@ -package robocode.robotinterfaces; - - -import robocode.MessageEvent; - - - -public interface ITeamEvents { - - /** - * This method is called when your robot receives a message from a teammate. - * You should override it in your robot if you want to be informed of this - * event. - *

- * Example: - *

-	 *   public void onMessageReceived(MessageEvent event) {
-	 *       out.println(event.getSender() + " sent me: " + event.getMessage());
-	 *   }
-	 * 
- * - * @param event the message event sent by the game - * @see robocode.MessageEvent - * @see robocode.Event - */ - void onMessageReceived(MessageEvent event); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamRobot.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamRobot.java deleted file mode 100644 index e1ebf8f..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/ITeamRobot.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces; - - -/** - * A robot interface for creating a team robot like {@link robocode.TeamRobot} - * that is able to receive team events. - * A team robot is an advanced type of robot that supports sending messages - * between teammates that participates in a team. - * - * @see robocode.TeamRobot - * @see IBasicRobot - * @see IJuniorRobot - * @see IInteractiveRobot - * @see IAdvancedRobot - * @see ITeamRobot - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface ITeamRobot extends IAdvancedRobot { - - /** - * This method is called by the game to notify this robot about team events. - * Hence, this method must be implemented so it returns your - * {@link ITeamEvents} listener. - * - * @return listener to team events or {@code null} if this robot should - * not receive the notifications. - */ - ITeamEvents getTeamEventListener(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/package-info.java deleted file mode 100644 index 9d4aa43..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Robot Interfaces used for creating new robot types, e.g. with other programming languages. - */ -package robocode.robotinterfaces; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IAdvancedRobotPeer.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IAdvancedRobotPeer.java deleted file mode 100644 index 1dcb879..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IAdvancedRobotPeer.java +++ /dev/null @@ -1,751 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces.peer; - - -import robocode.*; - -import java.io.File; -import java.util.List; - - -/** - * The advanced robot peer for advanced robot types like - * {@link robocode.AdvancedRobot} and {@link robocode.TeamRobot}. - *

- * A robot peer is the object that deals with game mechanics and rules, and - * makes sure your robot abides by them. - * - * @see IBasicRobotPeer - * @see IStandardRobotPeer - * @see ITeamRobotPeer - * @see IJuniorRobotPeer - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IAdvancedRobotPeer extends IStandardRobotPeer { - - /** - * Checks if the gun is set to adjust for the robot turning, i.e. to turn - * independent from the robot's body turn. - *

- * This call returns {@code true} if the gun is set to turn independent of - * the turn of the robot's body. Otherwise, {@code false} is returned, - * meaning that the gun is set to turn with the robot's body turn. - * - * @return {@code true} if the gun is set to turn independent of the robot - * turning; {@code false} if the gun is set to turn with the robot - * turning - * @see #setAdjustGunForBodyTurn(boolean) setAdjustGunForBodyTurn(boolean) - * @see #isAdjustRadarForBodyTurn() - * @see #isAdjustRadarForGunTurn() - */ - boolean isAdjustGunForBodyTurn(); - - /** - * Checks if the radar is set to adjust for the robot turning, i.e. to turn - * independent from the robot's body turn. - *

- * This call returns {@code true} if the radar is set to turn independent of - * the turn of the robot. Otherwise, {@code false} is returned, meaning that - * the radar is set to turn with the robot's turn. - * - * @return {@code true} if the radar is set to turn independent of the robot - * turning; {@code false} if the radar is set to turn with the robot - * turning - * @see #setAdjustRadarForBodyTurn(boolean) setAdjustRadarForBodyTurn(boolean) - * @see #isAdjustGunForBodyTurn() - * @see #isAdjustRadarForGunTurn() - */ - boolean isAdjustRadarForGunTurn(); - - /** - * Checks if the radar is set to adjust for the gun turning, i.e. to turn - * independent from the gun's turn. - *

- * This call returns {@code true} if the radar is set to turn independent of - * the turn of the gun. Otherwise, {@code false} is returned, meaning that - * the radar is set to turn with the gun's turn. - * - * @return {@code true} if the radar is set to turn independent of the gun - * turning; {@code false} if the radar is set to turn with the gun - * turning - * @see #setAdjustRadarForGunTurn(boolean) setAdjustRadarForGunTurn(boolean) - * @see #isAdjustGunForBodyTurn() - * @see #isAdjustRadarForBodyTurn() - */ - boolean isAdjustRadarForBodyTurn(); - - /** - * This call is identical to {@link IStandardRobotPeer#stop(boolean) - * stop(boolean)}, but returns immediately, and will not execute until you - * call {@link IBasicRobotPeer#execute() execute()} or take an action that executes. - *

- * If there is already movement saved from a previous stop, you can - * overwrite it by calling {@code setStop(true)}. - * - * @param overwrite {@code true} if the movement saved from a previous stop - * should be overwritten; {@code false} otherwise. - * @see IStandardRobotPeer#stop(boolean) stop(boolean) - * @see IStandardRobotPeer#resume() resume() - * @see #setResume() - * @see IBasicRobotPeer#execute() execute() - */ - void setStop(boolean overwrite); - - /** - * Sets the robot to resume the movement stopped by - * {@link IStandardRobotPeer#stop(boolean) stop(boolean)} or - * {@link #setStop(boolean)}, if any. - *

- * This call returns immediately, and will not execute until you call - * {@link IBasicRobotPeer#execute() execute()} or take an action that executes. - * - * @see IStandardRobotPeer#resume() resume() - * @see IStandardRobotPeer#stop(boolean) stop(boolean) - * @see #setStop(boolean) - * @see IBasicRobotPeer#execute() execute() - */ - void setResume(); - - /** - * Sets the robot to move forward or backward by distance measured in pixels - * when the next execution takes place. - *

- * This call returns immediately, and will not execute until you call - * {@link IBasicRobotPeer#execute() execute()} or take an action that executes. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot is set to move forward, and negative - * values means that the robot is set to move backward. If 0 is given as - * input, the robot will stop its movement, but will have to decelerate - * till it stands still, and will thus not be able to stop its movement - * immediately, but eventually. - *

- * Example: - *

-	 *   // Set the robot to move 50 pixels forward
-	 *   setMove(50);
-	 *
-	 *   // Set the robot to move 100 pixels backward
-	 *   // (overrides the previous order)
-	 *   setMove(-100);
-	 *
-	 *   ...
-	 *   // Executes the last setMove()
-	 *   execute();
-	 * 
- * - * @param distance the distance to move measured in pixels. - * If {@code distance} > 0 the robot is set to move forward. - * If {@code distance} < 0 the robot is set to move backward. - * If {@code distance} = 0 the robot is set to stop its movement. - * @see IBasicRobotPeer#move(double) move(double) - * @see #setMaxVelocity(double) - * @see #setTurnBody(double) - * @see #setTurnGun(double) - * @see #setTurnRadar(double) - */ - void setMove(double distance); - - /** - * Sets the robot's body to turn right or left by radians when the next - * execution takes place. - *

- * This call returns immediately, and will not execute until you call - * {@link IBasicRobotPeer#execute() execute()} or take an action that - * executes. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot's body is set to turn right, and - * negative values means that the robot's body is set to turn left. - * If 0 is given as input, the robot's body will stop turning. - *

- * Example: - *

-	 *   // Set the robot's body to turn 180 degrees to the right
-	 *   setTurnBody(Math.PI);
-	 *
-	 *   // Set the robot's body to turn 90 degrees to the left instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnBody(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnBody()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's body. - * If {@code radians} > 0 the robot's body is set to turn right. - * If {@code radians} < 0 the robot's body is set to turn left. - * If {@code radians} = 0 the robot's body is set to stop turning. - * @see IBasicRobotPeer#turnBody(double) turnBody(double) - * @see #setTurnGun(double) - * @see #setTurnRadar(double) - * @see #setMaxTurnRate(double) - * @see #setMove(double) - */ - void setTurnBody(double radians); - - /** - * Sets the robot's gun to turn right or left by radians when the next - * execution takes place. - *

- * This call returns immediately, and will not execute until you call - * {@link IBasicRobotPeer#execute() execute()} or take an action that - * executes. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot's gun is set to turn right, and - * negative values means that the robot's gun is set to turn left. - * If 0 is given as input, the robot's gun will stop turning. - *

- * Example: - *

-	 *   // Set the robot's gun to turn 180 degrees to the right
-	 *   setTurnGun(Math.PI);
-	 *
-	 *   // Set the robot's gun to turn 90 degrees to the left instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnGun(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnFun()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's gun. - * If {@code radians} > 0 the robot's gun is set to turn right. - * If {@code radians} < 0 the robot's gun is set to turn left. - * If {@code radians} = 0 the robot's gun is set to stop turning. - * @see IBasicRobotPeer#turnGun(double) turnGun(double) - * @see #setTurnBody(double) - * @see #setTurnRadar(double) - * @see #setMove(double) - */ - void setTurnGun(double radians); - - /** - * Sets the robot's radar to turn right or left by radians when the next - * execution takes place. - *

- * This call returns immediately, and will not execute until you call - * {@link IBasicRobotPeer#execute() execute()} or take an action that - * executes. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot's radar is set to turn right, and - * negative values means that the robot's radar is set to turn left. - * If 0 is given as input, the robot's radar will stop turning. - *

- * Example: - *

-	 *   // Set the robot's radar to turn 180 degrees to the right
-	 *   setTurnRadar(Math.PI);
-	 *
-	 *   // Set the robot's radar to turn 90 degrees to the left instead of right
-	 *   // (overrides the previous order)
-	 *   setTurnRadar(-Math.PI / 2);
-	 *
-	 *   ...
-	 *   // Executes the last setTurnRadar()
-	 *   execute();
-	 * 
- * - * @param radians the amount of radians to turn the robot's radar. - * If {@code radians} > 0 the robot's radar is set to turn right. - * If {@code radians} < 0 the robot's radar is set to turn left. - * If {@code radians} = 0 the robot's radar is set to stop turning. - * @see IStandardRobotPeer#turnRadar(double) turnRadar(double) - * @see #setTurnBody(double) - * @see #setTurnGun(double) - * @see #setMove(double) - */ - void setTurnRadar(double radians); - - /** - * Sets the maximum turn rate of the robot measured in degrees if the robot - * should turn slower than {@link Rules#MAX_TURN_RATE} (10 degress/turn). - * - * @param newMaxTurnRate the new maximum turn rate of the robot measured in - * degrees. Valid values are 0 - {@link Rules#MAX_TURN_RATE} - * @see IBasicRobotPeer#turnBody(double) turnBody(double) - * @see #setTurnBody(double) - * @see #setMaxVelocity(double) - */ - void setMaxTurnRate(double newMaxTurnRate); - - /** - * Sets the maximum velocity of the robot measured in pixels/turn if the - * robot should move slower than {@link Rules#MAX_VELOCITY} (8 pixels/turn). - * - * @param newMaxVelocity the new maximum turn rate of the robot measured in - * pixels/turn. Valid values are 0 - {@link Rules#MAX_VELOCITY} - * @see IBasicRobotPeer#move(double) move(double) - * @see #setMove(double) - * @see #setMaxTurnRate(double) - */ - void setMaxVelocity(double newMaxVelocity); - - /** - * Does not return until a condition is met, i.e. when a - * {@link Condition#test()} returns {@code true}. - *

- * This call executes immediately. - *

- * See the {@code sample.Crazy} robot for how this method can be used. - * - * @param condition the condition that must be met before this call returns - * @see Condition - * @see Condition#test() - */ - void waitFor(Condition condition); - - /** - * Call this during an event handler to allow new events of the same - * priority to restart the event handler. - *

- *

Example: - *

-	 *   public void onScannedRobot(ScannedRobotEvent e) {
-	 *       fire(1);
-	 *       setInterruptible(true);
-	 *       move(100);  // If you see a robot while moving ahead,
-	 *                   // this handler will start from the top
-	 *                   // Without setInterruptible(true), we wouldn't
-	 *                   // receive scan events at all!
-	 *       // We'll only get here if we don't see a robot during the move.
-	 *       getOut().println("Ok, I can't see anyone");
-	 *   }
-	 * 
- * - * @param interruptible {@code true} if the event handler should be - * interrupted if new events of the same priority occurs; {@code false} - * otherwise - * @see #setEventPriority(String, int) - * @see robocode.robotinterfaces.IBasicEvents#onScannedRobot(ScannedRobotEvent) - * onScannedRobot(ScannedRobotEvent) - */ - void setInterruptible(boolean interruptible); - - /** - * Sets the priority of a class of events. - *

- * Events are sent to the onXXX handlers in order of priority. - * Higher priority events can interrupt lower priority events. - * For events with the same priority, newer events are always sent first. - * Valid priorities are 0 - 99, where 100 is reserved and 80 is the default - * priority. - *

- * Example: - *

-	 *   setEventPriority("RobotDeathEvent", 15);
-	 * 
- *

- * The default priorities are, from highest to lowest: - *

-	 *   {@link RoundEndedEvent}:      100 (reserved)
-	 *   {@link BattleEndedEvent}:     100 (reserved)
-	 *   {@link WinEvent}:             100 (reserved)
-	 *   {@link SkippedTurnEvent}:     100 (reserved)
-	 *   {@link StatusEvent}:           99
-	 *   Key and mouse events:  98
-	 *   {@link CustomEvent}:           80 (default value)
-	 *   {@link MessageEvent}:          75
-	 *   {@link RobotDeathEvent}:       70
-	 *   {@link BulletMissedEvent}:     60
-	 *   {@link BulletHitBulletEvent}:  55
-	 *   {@link BulletHitEvent}:        50
-	 *   {@link HitByBulletEvent}:      40
-	 *   {@link HitWallEvent}:          30
-	 *   {@link HitRobotEvent}:         20
-	 *   {@link ScannedRobotEvent}:     10
-	 *   {@link PaintEvent}:             5
-	 *   {@link DeathEvent}:            -1 (reserved)
-	 * 
- *

- * Note that you cannot change the priority for events with the special - * priority value -1 or 100 (reserved) as these event are system events. - * Also note that you cannot change the priority of CustomEvent. - * Instead you must change the priority of the condition(s) for your custom - * event(s). - * - * @param eventClass the name of the event class (string) to set the - * priority for - * @param priority the new priority for that event class - * @see #getEventPriority(String) - * @see #setInterruptible(boolean) - * @since 1.5, the priority of DeathEvent was changed from 100 to -1 in - * order to let robots process pending events on its event queue before - * it dies. When the robot dies, it will not be able to process events. - */ - void setEventPriority(String eventClass, int priority); - - /** - * Returns the current priority of a class of events. - * An event priority is a value from 0 - 99. The higher value, the higher - * priority. - *

- * Example: - *

-	 *   int myHitRobotPriority = getEventPriority("HitRobotEvent");
-	 * 
- *

- * The default priorities are, from highest to lowest: - *

-	 *   {@link RoundEndedEvent}:      100 (reserved)
-	 *   {@link BattleEndedEvent}:     100 (reserved)
-	 *   {@link WinEvent}:             100 (reserved)
-	 *   {@link SkippedTurnEvent}:     100 (reserved)
-	 *   {@link StatusEvent}:           99
-	 *   Key and mouse events:  98
-	 *   {@link CustomEvent}:           80 (default value)
-	 *   {@link MessageEvent}:          75
-	 *   {@link RobotDeathEvent}:       70
-	 *   {@link BulletMissedEvent}:     60
-	 *   {@link BulletHitBulletEvent}:  55
-	 *   {@link BulletHitEvent}:        50
-	 *   {@link HitByBulletEvent}:      40
-	 *   {@link HitWallEvent}:          30
-	 *   {@link HitRobotEvent}:         20
-	 *   {@link ScannedRobotEvent}:     10
-	 *   {@link PaintEvent}:             5
-	 *   {@link DeathEvent}:            -1 (reserved)
-	 * 
- * - * @param eventClass the name of the event class (string) - * @return the current priority of a class of events - * @see #setEventPriority(String, int) - */ - int getEventPriority(String eventClass); - - /** - * Registers a custom event to be called when a condition is met. - * When you are finished with your condition or just want to remove it you - * must call {@link #removeCustomEvent(Condition)}. - *

- * Example: - *

-	 *   // Create the condition for our custom event
-	 *   Condition triggerHitCondition = new Condition("triggerhit") {
-	 *       public boolean test() {
-	 *           return (getEnergy() <= trigger);
-	 *       };
-	 *   }
-	 *
-	 *   // Add our custom event based on our condition
-	 *   addCustomEvent(triggerHitCondition);
-	 * 
- * - * @param condition the condition that must be met. - * @throws NullPointerException if the condition parameter has been set to - * {@code null}. - * @see Condition - * @see #removeCustomEvent(Condition) - */ - void addCustomEvent(Condition condition); - - /** - * Removes a custom event that was previously added by calling - * {@link #addCustomEvent(Condition)}. - *

- * Example: - *

-	 *   // Create the condition for our custom event
-	 *   Condition triggerHitCondition = new Condition("triggerhit") {
-	 *       public boolean test() {
-	 *           return (getEnergy() <= trigger);
-	 *       };
-	 *   }
-	 *
-	 *   // Add our custom event based on our condition
-	 *   addCustomEvent(triggerHitCondition);
-	 *   ...
-	 *   do something with your robot
-	 *   ...
-	 *   // Remove the custom event based on our condition
-	 *   removeCustomEvent(triggerHitCondition);
-	 * 
- * - * @param condition the condition that was previous added and that must be - * removed now. - * @throws NullPointerException if the condition parameter has been set to - * {@code null}. - * @see Condition - * @see #addCustomEvent(Condition) - */ - void removeCustomEvent(Condition condition); - - /** - * Clears out any pending events in the robot's event queue immediately. - * - * @see #getAllEvents() - */ - void clearAllEvents(); - - /** - * Returns a vector containing all events currently in the robot's queue. - * You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (Event event : getAllEvents()) {
-	 *       if (event instanceof HitRobotEvent) {
-	 *           // do something with the event
-	 *       } else if (event instanceof HitByBulletEvent) {
-	 *           // do something with the event
-	 *       }
-	 *   }
-	 * 
- * - * @return a vector containing all events currently in the robot's queue - * @see Event - * @see #clearAllEvents() - * @see #getStatusEvents() - * @see #getScannedRobotEvents() - * @see #getBulletHitEvents() - * @see #getBulletMissedEvents() - * @see #getBulletHitBulletEvents() - * @see #getRobotDeathEvents() - */ - java.util.List getAllEvents(); - - /** - * Returns a vector containing all StatusEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (StatusEvent event : getStatusEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all StatusEvents currently in the robot's - * queue - * @see robocode.robotinterfaces.IBasicEvents#onStatus(StatusEvent) - * onStatus(StatusEvent) - * @see StatusEvent - * @see #getAllEvents() - * @since 1.6.1 - */ - List getStatusEvents(); - - /** - * Returns a vector containing all BulletMissedEvents currently in the - * robot's queue. You might, for example, call this while processing another - * event. - *

- * Example: - *

-	 *   for (BulletMissedEvent event : getBulletMissedEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all BulletMissedEvents currently in the - * robot's queue - * @see robocode.robotinterfaces.IBasicEvents#onBulletMissed(BulletMissedEvent) - * onBulletMissed(BulletMissedEvent) - * @see BulletMissedEvent - * @see #getAllEvents() - */ - List getBulletMissedEvents(); - - /** - * Returns a vector containing all BulletHitBulletEvents currently in the - * robot's queue. You might, for example, call this while processing another - * event. - *

- * Example: - *

-	 *   for (BulletHitBulletEvent event : getBulletHitBulletEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all BulletHitBulletEvents currently in the - * robot's queue - * @see robocode.robotinterfaces.IBasicEvents#onBulletHitBullet(BulletHitBulletEvent) - * onBulletHitBullet(BulletHitBulletEvent) - * @see BulletHitBulletEvent - * @see #getAllEvents() - */ - List getBulletHitBulletEvents(); - - /** - * Returns a vector containing all BulletHitEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (BulletHitEvent event: getBulletHitEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all BulletHitEvents currently in the robot's - * queue - * @see robocode.robotinterfaces.IBasicEvents#onBulletHit(BulletHitEvent) - * onBulletHit(BulletHitEvent) - * @see BulletHitEvent - * @see #getAllEvents() - */ - List getBulletHitEvents(); - - /** - * Returns a vector containing all HitByBulletEvents currently in the - * robot's queue. You might, for example, call this while processing - * another event. - *

- * Example: - *

-	 *   for (HitByBulletEvent event : getHitByBulletEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all HitByBulletEvents currently in the - * robot's queue - * @see robocode.robotinterfaces.IBasicEvents#onHitByBullet(HitByBulletEvent) - * onHitByBullet(HitByBulletEvent) - * @see HitByBulletEvent - * @see #getAllEvents() - */ - List getHitByBulletEvents(); - - /** - * Returns a vector containing all HitRobotEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (HitRobotEvent event : getHitRobotEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all HitRobotEvents currently in the robot's - * queue - * @see robocode.robotinterfaces.IBasicEvents#onHitRobot(HitRobotEvent) - * onHitRobot(HitRobotEvent) - * @see HitRobotEvent - * @see #getAllEvents() - */ - List getHitRobotEvents(); - - /** - * Returns a vector containing all HitWallEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (HitWallEvent event : getHitWallEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all HitWallEvents currently in the robot's - * queue - * @see robocode.robotinterfaces.IBasicEvents#onHitWall(HitWallEvent) - * onHitWall(HitWallEvent) - * @see HitWallEvent - * @see #getAllEvents() - */ - List getHitWallEvents(); - - /** - * Returns a vector containing all RobotDeathEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (RobotDeathEvent event : getRobotDeathEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all RobotDeathEvents currently in the robot's - * queue - * @see robocode.robotinterfaces.IBasicEvents#onRobotDeath(RobotDeathEvent) - * onRobotDeath(RobotDeathEvent) - * @see RobotDeathEvent - * @see #getAllEvents() - */ - List getRobotDeathEvents(); - - /** - * Returns a vector containing all ScannedRobotEvents currently in the - * robot's queue. You might, for example, call this while processing another - * event. - *

- * Example: - *

-	 *   for (ScannedRobotEvent event : getScannedRobotEvents()) {
-	 *       // do something with the event
-	 *   }
-	 * 
- * - * @return a vector containing all ScannedRobotEvents currently in the - * robot's queue - * @see robocode.robotinterfaces.IBasicEvents#onScannedRobot(ScannedRobotEvent) - * onScannedRobot(ScannedRobotEvent) - * @see ScannedRobotEvent - * @see #getAllEvents() - */ - List getScannedRobotEvents(); - - /** - * Returns a file representing a data directory for the robot, which can be - * written to using {@link RobocodeFileOutputStream} or - * {@link RobocodeFileWriter}. - *

- * The system will automatically create the directory for you, so you do not - * need to create it by yourself. - * - * @return a file representing the data directory for your robot - * @see #getDataFile(String) - * @see RobocodeFileOutputStream - * @see RobocodeFileWriter - */ - File getDataDirectory(); - - /** - * Returns a file in your data directory that you can write to using - * {@link RobocodeFileOutputStream} or {@link RobocodeFileWriter}. - *

- * The system will automatically create the directory for you, so you do not - * need to create it by yourself. - *

- * Please notice that the max. size of your data file is set to 200000 - * (~195 KB). - *

- * See the {@code sample.SittingDuck} to see an example of how to use this - * method. - * - * @param filename the file name of the data file for your robot - * @return a file representing the data file for your robot - * @see #getDataDirectory() - * @see RobocodeFileOutputStream - * @see RobocodeFileWriter - */ - File getDataFile(String filename); - - /** - * Returns the data quota available in your data directory, i.e. the amount - * of bytes left in the data directory for the robot. - * - * @return the amount of bytes left in the robot's data directory - * @see #getDataDirectory() - * @see #getDataFile(String) - */ - long getDataQuotaAvailable(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IBasicRobotPeer.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IBasicRobotPeer.java deleted file mode 100644 index 103945f..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IBasicRobotPeer.java +++ /dev/null @@ -1,738 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces.peer; - - -import robocode.*; -import robocode.robotinterfaces.IBasicEvents; - -import java.awt.*; - - -/** - * The basic robot peer for all robot types.

- * - * NOTE: This is private interface. You should build any external component (or robot) - * based on it's current methods because it will change in the future.

- * - * A robot peer is the object that deals with game mechanics and rules, and - * makes sure your robot abides by them. - * - * @see IStandardRobotPeer - * @see IAdvancedRobotPeer - * @see ITeamRobotPeer - * @see IJuniorRobotPeer - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IBasicRobotPeer { - - /** - * Returns the robot's name. - * - * @return the robot's name. - */ - String getName(); - - /** - * Returns the game time of the current round, where the time is equal to - * the current turn in the round. - *

- * A battle consists of multiple rounds. - *

- * Time is reset to 0 at the beginning of every round. - * - * @return the game time/turn of the current round. - */ - long getTime(); - - /** - * Returns the robot's current energy. - * - * @return the robot's current energy. - */ - double getEnergy(); - - /** - * Returns the X position of the robot. (0,0) is at the bottom left of the - * battlefield. - * - * @return the X position of the robot. - * @see #getY() - */ - double getX(); - - /** - * Returns the Y position of the robot. (0,0) is at the bottom left of the - * battlefield. - * - * @return the Y position of the robot. - * @see #getX() - */ - double getY(); - - /** - * Returns the velocity of the robot measured in pixels/turn. - *

- * The maximum velocity of a robot is defined by - * {@link Rules#MAX_VELOCITY} (8 pixels / turn). - * - * @return the velocity of the robot measured in pixels/turn. - * @see Rules#MAX_VELOCITY - */ - double getVelocity(); - - /** - * Returns the direction that the robot's body is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's body is facing, in radians. - * @see #getGunHeading() - * @see #getRadarHeading() - */ - double getBodyHeading(); - - /** - * Returns the direction that the robot's gun is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's gun is facing, in radians. - * @see #getBodyHeading() - * @see #getRadarHeading() - */ - double getGunHeading(); - - /** - * Returns the direction that the robot's radar is facing, in radians. - * The value returned will be between 0 and 2 * PI (is excluded). - *

- * Note that the heading in Robocode is like a compass, where 0 means North, - * PI / 2 means East, PI means South, and 3 * PI / 2 means West. - * - * @return the direction that the robot's radar is facing, in radians. - * @see #getBodyHeading() - * @see #getGunHeading() - */ - double getRadarHeading(); - - /** - * Returns the current heat of the gun. The gun cannot fire unless this is - * 0. (Calls to fire will succeed, but will not actually fire unless - * getGunHeat() == 0). - *

- * The amount of gun heat generated when the gun is fired is - * 1 + (firePower / 5). Each turn the gun heat drops by the amount returned - * by {@link #getGunCoolingRate()}, which is a battle setup. - *

- * Note that all guns are "hot" at the start of each round, where the gun - * heat is 3. - * - * @return the current gun heat - * @see #getGunCoolingRate() - * @see #setFire(double) - */ - double getGunHeat(); - - /** - * Returns the width of the current battlefield measured in pixels. - * - * @return the width of the current battlefield measured in pixels. - */ - double getBattleFieldWidth(); - - /** - * Returns the height of the current battlefield measured in pixels. - * - * @return the height of the current battlefield measured in pixels. - */ - double getBattleFieldHeight(); - - /** - * Returns how many opponents that are left in the current round. - * - * @return how many opponents that are left in the current round. - * @see #getNumSentries() - */ - int getOthers(); - - /** - * Returns how many sentry robots that are left in the current round. - * - * @return how many sentry robots that are left in the current round. - * @see #getOthers() - * @since 1.9.1.0 - */ - int getNumSentries(); - - /** - * Returns the number of rounds in the current battle. - * - * @return the number of rounds in the current battle. - * @see #getRoundNum() - */ - int getNumRounds(); - - /** - * Returns the number of the current round (0 to {@link #getNumRounds()} - 1) - * in the battle. - * - * @return the number of the current round in the battle (zero indexed). - * @see #getNumRounds() - */ - int getRoundNum(); - - /** - * Returns the sentry border size for a {@link robocode.BorderSentry BorderSentry} that defines the how - * far a BorderSentry is allowed to move from the border edges measured in units.
- * Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that - * BorderSentrys cannot leave (sentry robots robots must stay in the border area), but it also define the - * distance from the border edges where BorderSentrys are allowed/able to make damage to robots entering this - * border area. - * - * @return the border size in units/pixels. - * - * @since 1.9.0.0 - */ - int getSentryBorderSize(); - - /** - * Returns the rate at which the gun will cool down, i.e. the amount of heat - * the gun heat will drop per turn. - *

- * The gun cooling rate is default 0.1 / turn, but can be changed by the - * battle setup. So don't count on the cooling rate being 0.1! - * - * @return the gun cooling rate - * @see #getGunHeat() - * @see #setFire(double) - */ - double getGunCoolingRate(); - - /** - * Returns the distance remaining in the robot's current move measured in - * pixels. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently moving forwards. Negative values means - * that the robot is currently moving backwards. If the returned value is 0, - * the robot currently stands still. - * - * @return the distance remaining in the robot's current move measured in - * pixels. - * @see #getBodyTurnRemaining() - * @see #getGunTurnRemaining() - * @see #getRadarTurnRemaining() - */ - double getDistanceRemaining(); - - /** - * Returns the angle remaining in the robot's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the robot is currently turning to the right. Negative values - * means that the robot is currently turning to the left. - * - * @return the angle remaining in the robot's turn, in radians - * @see #getDistanceRemaining() - * @see #getGunTurnRemaining() - * @see #getRadarTurnRemaining() - */ - double getBodyTurnRemaining(); - - /** - * Returns the angle remaining in the gun's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the gun is currently turning to the right. Negative values - * means that the gun is currently turning to the left. - * - * @return the angle remaining in the gun's turn, in radians - * @see #getDistanceRemaining() - * @see #getBodyTurnRemaining() - * @see #getRadarTurnRemaining() - */ - double getGunTurnRemaining(); - - /** - * Returns the angle remaining in the radar's turn, in radians. - *

- * This call returns both positive and negative values. Positive values - * means that the radar is currently turning to the right. Negative values - * means that the radar is currently turning to the left. - * - * @return the angle remaining in the radar's turn, in radians - * @see #getDistanceRemaining() - * @see #getBodyTurnRemaining() - * @see #getGunTurnRemaining() - */ - double getRadarTurnRemaining(); - - /** - * Executes any pending actions, or continues executing actions that are - * in process. This call returns after the actions have been started. - *

- * Note that advanced robots must call this function in order to - * execute pending set* calls like e.g. {@link - * IAdvancedRobotPeer#setMove(double) setMove(double)}, - * {@link IAdvancedRobotPeer#setFire(double) setFire(double)}, {@link - * IAdvancedRobotPeer#setTurnBody(double) setTurnBody(double)} etc. - * Otherwise, these calls will never get executed. - *

- * In this example the robot will move while turning: - *

-	 *   setTurnBody(90);
-	 *   setMove(100);
-	 *   execute();
-	 * 

- * while (getDistanceRemaining() > 0 && getTurnRemaining() > 0) { - * execute(); - * } - *

- */ - void execute(); - - /** - * Immediately moves your robot forward or backward by distance measured in - * pixels. - *

- * This call executes immediately, and does not return until it is complete, - * i.e. when the remaining distance to move is 0. - *

- * If the robot collides with a wall, the move is complete, meaning that the - * robot will not move any further. If the robot collides with another - * robot, the move is complete if you are heading toward the other robot. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot is set to move forward, and negative - * values means that the robot is set to move backward. - *

- * Example: - *

-	 *   // Move the robot 100 pixels forward
-	 *   ahead(100);
-	 * 

- * // Afterwards, move the robot 50 pixels backward - * ahead(-50); - *

- * - * @param distance the distance to move measured in pixels. - * If {@code distance} > 0 the robot is set to move forward. - * If {@code distance} < 0 the robot is set to move backward. - * If {@code distance} = 0 the robot will not move anywhere, but just - * finish its turn. - * @see robocode.robotinterfaces.IBasicEvents#onHitWall(robocode.HitWallEvent) - * @see robocode.robotinterfaces.IBasicEvents#onHitRobot(robocode.HitRobotEvent) - */ - void move(double distance); - - /** - * Immediately turns the robot's body to the right or left by radians. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the body's turn is 0. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot's body is set to turn right, and - * negative values means that the robot's body is set to turn left. - * If 0 is given as input, the robot's body will stop turning. - *

- * Example: - *

-	 *   // Turn the robot's body 180 degrees to the right
-	 *   turnBody(Math.PI);
-	 * 

- * // Afterwards, turn the robot's body 90 degrees to the left - * turnBody(-Math.PI / 2); - *

- * - * @param radians the amount of radians to turn the robot's body. - * If {@code radians} > 0 the robot's body is set to turn right. - * If {@code radians} < 0 the robot's body is set to turn left. - * If {@code radians} = 0 the robot's body is set to stop turning. - * @see #turnGun(double) - * @see IStandardRobotPeer#turnRadar(double) turnRadar(double) - * @see #move(double) - */ - void turnBody(double radians); - - /** - * Immediately turns the robot's gun to the right or left by radians. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the gun's turn is 0. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot's gun is set to turn right, and - * negative values means that the robot's gun is set to turn left. - * If 0 is given as input, the robot's gun will stop turning. - *

- * Example: - *

-	 *   // Turn the robot's gun 180 degrees to the right
-	 *   turnGun(Math.PI);
-	 * 

- * // Afterwards, turn the robot's gun 90 degrees to the left - * turnGun(-Math.PI / 2); - *

- * - * @param radians the amount of radians to turn the robot's gun. - * If {@code radians} > 0 the robot's gun is set to turn right. - * If {@code radians} < 0 the robot's gun is set to turn left. - * If {@code radians} = 0 the robot's gun is set to stop turning. - * @see #turnBody(double) - * @see IStandardRobotPeer#turnRadar(double) turnRadar(double) - * @see #move(double) - */ - void turnGun(double radians); - - /** - * Immediately fires a bullet. The bullet will travel in the direction the - * gun is pointing. - *

- * The specified bullet power is an amount of energy that will be taken from - * the robot's energy. Hence, the more power you want to spend on the - * bullet, the more energy is taken from your robot. - *

- * The bullet will do (4 * power) damage if it hits another robot. If power - * is greater than 1, it will do an additional 2 * (power - 1) damage. - * You will get (3 * power) back if you hit the other robot. You can call - * {@link Rules#getBulletDamage(double)} for getting the damage that a - * bullet with a specific bullet power will do. - *

- * The specified bullet power should be between - * {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}. - *

- * Note that the gun cannot fire if the gun is overheated, meaning that - * {@link #getGunHeat()} returns a value > 0. - *

- * A event is generated when the bullet hits a robot - * ({@link BulletHitEvent}), wall ({@link BulletMissedEvent}), or another - * bullet ({@link BulletHitBulletEvent}). - *

- * Example: - *

-	 *   // Fire a bullet with maximum power if the gun is ready
-	 *   if (getGunHeat() == 0) {
-	 *       Bullet bullet = fire(Rules.MAX_BULLET_POWER);
-	 * 

- * // Get the velocity of the bullet - * if (bullet != null) { - * double bulletVelocity = bullet.getVelocity(); - * } - * } - *

- * - * @param power the amount of energy given to the bullet, and subtracted - * from the robot's energy. - * @return a {@link Bullet} that contains information about the bullet if it - * was actually fired, which can be used for tracking the bullet after it - * has been fired. If the bullet was not fired, {@code null} is returned. - * @see #setFire(double) - * @see Bullet - * @see #getGunHeat() - * @see #getGunCoolingRate() - * @see robocode.robotinterfaces.IBasicEvents#onBulletHit(BulletHitEvent) - * onBulletHit(BulletHitEvent) - * @see robocode.robotinterfaces.IBasicEvents#onBulletHitBullet(BulletHitBulletEvent) - * onBulletHitBullet(BulletHitBulletEvent) - * @see robocode.robotinterfaces.IBasicEvents#onBulletMissed(BulletMissedEvent) - * onBulletMissed(BulletMissedEvent) - */ - Bullet fire(double power); - - /** - * Sets the gun to fire a bullet when the next execution takes place. - * The bullet will travel in the direction the gun is pointing. - *

- * This call returns immediately, and will not execute until you call - * execute() or take an action that executes. - *

- * The specified bullet power is an amount of energy that will be taken from - * the robot's energy. Hence, the more power you want to spend on the - * bullet, the more energy is taken from your robot. - *

- * The bullet will do (4 * power) damage if it hits another robot. If power - * is greater than 1, it will do an additional 2 * (power - 1) damage. - * You will get (3 * power) back if you hit the other robot. You can call - * {@link Rules#getBulletDamage(double)} for getting the damage that a - * bullet with a specific bullet power will do. - *

- * The specified bullet power should be between - * {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}. - *

- * Note that the gun cannot fire if the gun is overheated, meaning that - * {@link #getGunHeat()} returns a value > 0. - *

- * A event is generated when the bullet hits a robot - * ({@link BulletHitEvent}), wall ({@link BulletMissedEvent}), or another - * bullet ({@link BulletHitBulletEvent}). - *

- * Example: - *

-	 *   Bullet bullet = null;
-	 * 

- * // Fire a bullet with maximum power if the gun is ready - * if (getGunHeat() == 0) { - * bullet = setFireBullet(Rules.MAX_BULLET_POWER); - * } - * ... - * execute(); - * ... - * // Get the velocity of the bullet - * if (bullet != null) { - * double bulletVelocity = bullet.getVelocity(); - * } - *

- * - * @param power the amount of energy given to the bullet, and subtracted - * from the robot's energy. - * @return a {@link Bullet} that contains information about the bullet if it - * was actually fired, which can be used for tracking the bullet after it - * has been fired. If the bullet was not fired, {@code null} is returned. - * @see #fire(double) - * @see Bullet - * @see #getGunHeat() - * @see #getGunCoolingRate() - * @see robocode.robotinterfaces.IBasicEvents#onBulletHit(BulletHitEvent) - * onBulletHit(BulletHitEvent) - * @see robocode.robotinterfaces.IBasicEvents#onBulletHitBullet(BulletHitBulletEvent) - * onBulletHitBullet(BulletHitBulletEvent) - * @see robocode.robotinterfaces.IBasicEvents#onBulletMissed(BulletMissedEvent) - * onBulletMissed(BulletMissedEvent) - */ - Bullet setFire(double power); - - /** - * Sets the color of the robot's body. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 * 

- * public void run() { - * setBodyColor(Color.BLACK); - * ... - * } - *

- * - * @param color the new body color - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - void setBodyColor(Color color); - - /** - * Sets the color of the robot's gun. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 * 

- * public void run() { - * setGunColor(Color.RED); - * ... - * } - *

- * - * @param color the new gun color - * @see #setBodyColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - void setGunColor(Color color); - - /** - * Sets the color of the robot's radar. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 * 

- * public void run() { - * setRadarColor(Color.YELLOW); - * ... - * } - *

- * - * @param color the new radar color - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setBulletColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - void setRadarColor(Color color); - - /** - * Sets the color of the robot's bullets. - *

- * A {@code null} indicates the default white color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 * 

- * public void run() { - * setBulletColor(Color.GREEN); - * ... - * } - *

- * - * @param color the new bullet color - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setScanColor(Color) - * @see Color - * @since 1.1.2 - */ - void setBulletColor(Color color); - - /** - * Sets the color of the robot's scan arc. - *

- * A {@code null} indicates the default (blue) color. - *

- *

-	 * Example:
-	 *   // Don't forget to import java.awt.Color at the top...
-	 *   import java.awt.Color;
-	 *   ...
-	 * 

- * public void run() { - * setScanColor(Color.WHITE); - * ... - * } - *

- * - * @param color the new scan arc color - * @see #setBodyColor(Color) - * @see #setGunColor(Color) - * @see #setRadarColor(Color) - * @see #setBulletColor(Color) - * @see Color - * @since 1.1.2 - */ - void setScanColor(Color color); - - /** - * This call must be made from a robot call to inform the game - * that the robot made a {@code get*} call like e.g. {@link #getX()} or - * {@link #getVelocity()}. - *

- * This method is used by the game to determine if the robot is inactive or - * not. Note: You should only make this call once in a {@code get*} method! - * - * @see #setCall() - */ - void getCall(); - - /** - * This call must be made from a robot call to inform the game - * that the robot made a {@code set*} call like e.g. {@link - * #setFire(double)} or {@link #setBodyColor(Color)}. - *

- * This method is used by the game to determine if the robot is inactive or - * not. Note: You should only make this call once in a {@code set*} method! - * - * @see #getCall() - */ - void setCall(); - - /** - * Returns a graphics context used for painting graphical items for the robot. - *

- * This method is very useful for debugging your robot. - *

- * Note that the robot will only be painted if the "Paint" is enabled on the - * robot's console window; otherwise the robot will never get painted (the - * reason being that all robots might have graphical items that must be - * painted, and then you might not be able to tell what graphical items that - * have been painted for your robot). - *

- * Also note that the coordinate system for the graphical context where you - * paint items fits for the Robocode coordinate system where (0, 0) is at - * the bottom left corner of the battlefield, where X is towards right and Y - * is upwards. - * - * @return a graphics context used for painting graphical items for the robot. - * @see robocode.robotinterfaces.IPaintEvents#onPaint(Graphics2D) - * @since 1.6.1 - */ - Graphics2D getGraphics(); - - /** - * Sets the debug property with the specified key to the specified value. - *

- * This method is very useful when debugging or reviewing your robot as you - * will be able to see this property displayed in the robot console for your - * robots under the Debug Properties tab page. - * - * @param key the name/key of the debug property. - * @param value the new value of the debug property, where {@code null} or - * the empty string is used for removing this debug property. - * @since 1.6.2 - */ - void setDebugProperty(String key, String value); - - /** - * Rescan for other robots. This method is called automatically by the game, - * as long as the robot is moving, turning its body, turning its gun, or - * turning its radar. - *

- * Rescan will cause {@link IBasicEvents#onScannedRobot(ScannedRobotEvent) - * onScannedRobot(ScannedRobotEvent)} to be called if you see a robot. - *

- * There are 2 reasons to call {@code rescan()} manually: - *

    - *
  1. You want to scan after you stop moving. - *
  2. You want to interrupt the {@code onScannedRobot} event. This is more - * likely. If you are in {@code onScannedRobot} and call {@code scan()}, - * and you still see a robot, then the system will interrupt your - * {@code onScannedRobot} event immediately and start it from the top. - *
- *

- * This call executes immediately. - * - * @see IBasicEvents#onScannedRobot(ScannedRobotEvent) - * onScannedRobot(ScannedRobotEvent) - * @see ScannedRobotEvent - * - * @since 1.7.2 - */ - void rescan(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IJuniorRobotPeer.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IJuniorRobotPeer.java deleted file mode 100644 index 300ece1..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IJuniorRobotPeer.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces.peer; - - -/** - * The junior robot peer for junior robot types like {@link robocode.JuniorRobot}. - *

- * A robot peer is the object that deals with game mechanics and rules, and - * makes sure your robot abides by them. - * - * @see IBasicRobotPeer - * @see IStandardRobotPeer - * @see IAdvancedRobotPeer - * @see ITeamRobotPeer - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IJuniorRobotPeer extends IBasicRobotPeer { - - /** - * Moves this robot forward or backwards by pixels and turns this robot - * right or left by degrees at the same time. The robot will move in a curve - * that follows a perfect circle, and the moving and turning will end at - * exactly the same time. - *

- * Note that the max. velocity and max. turn rate is automatically adjusted, - * which means that the robot will move slower the sharper the turn is - * compared to the distance. - *

- * Note that both positive and negative values can be given as input: - *

    - *
  • If the {@code distance} parameter is set to a positive value, it - * means that the robot is set to move forward, and a negative value means - * that the robot is set to move backward. If set to 0, the robot will not - * move, but will be able to turn. - *
  • If the {@code radians} parameter is set to a positive value, it means - * that the robot is set to turn to the right, and a negative value means - * that the robot is set to turn to the left. If set to 0, the robot will - * not turn, but will be able to move. - *
- * - * @param distance the distance to move measured in pixels. - * If {@code distance} > 0 the robot is set to move forward. - * If {@code distance} < 0 the robot is set to move backward. - * If {@code distance} = 0 the robot will not move anywhere, but just - * finish its turn. - * @param radians the amount of radians to turn the robot's body. - * If {@code radians} > 0 the robot's body is set to turn right. - * If {@code radians} < 0 the robot's body is set to turn left. - * If {@code radians} = 0 the robot's body is set to stop turning. - * @see IBasicRobotPeer#move(double) move(double) - * @see IBasicRobotPeer#turnBody(double) turnBody(double) - * @see IBasicRobotPeer#getBodyHeading() getBodyHeading() - * @see IBasicRobotPeer#getX() getX() - * @see IBasicRobotPeer#getY() getY() - */ - void turnAndMove(double distance, double radians); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IStandardRobotPeer.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IStandardRobotPeer.java deleted file mode 100644 index dd29d3c..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/IStandardRobotPeer.java +++ /dev/null @@ -1,205 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces.peer; - - -/** - * The standard robot peer for standard robot types like {@link robocode.Robot}, - * {@link robocode.AdvancedRobot}, and {@link robocode.TeamRobot}. - *

- * A robot peer is the object that deals with game mechanics and rules, and - * makes sure your robot abides by them. - * - * @see IBasicRobotPeer - * @see IAdvancedRobotPeer - * @see ITeamRobotPeer - * @see IJuniorRobotPeer - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6 - */ -public interface IStandardRobotPeer extends IBasicRobotPeer { - - /** - * Immediately stops all movement, and saves it for a call to - * {@link #resume()}. If there is already movement saved from a previous - * stop, you can overwrite it by calling {@code stop(true)}. - * - * @param overwrite If there is already movement saved from a previous stop, - * you can overwrite it by calling {@code stop(true)}. - * @see #resume() - */ - void stop(boolean overwrite); - - /** - * Immediately resumes the movement you stopped by {@link #stop(boolean)}, - * if any. - *

- * This call executes immediately, and does not return until it is complete. - * - * @see #stop(boolean) - */ - void resume(); - - /** - * Immediately turns the robot's radar to the right or left by radians. - * This call executes immediately, and does not return until it is complete, - * i.e. when the angle remaining in the radar's turn is 0. - *

- * Note that both positive and negative values can be given as input, where - * positive values means that the robot's radar is set to turn right, and - * negative values means that the robot's radar is set to turn left. - * If 0 is given as input, the robot's radar will stop turning. - *

- * Example: - *

-	 *   // Turn the robot's radar 180 degrees to the right
-	 *   turnRadar(Math.PI);
-	 *
-	 *   // Afterwards, turn the robot's radar 90 degrees to the left
-	 *   turnRadar(-Math.PI / 2);
-	 * 
- * - * @param radians the amount of radians to turn the robot's radar. - * If {@code radians} > 0 the robot's radar is set to turn right. - * If {@code radians} < 0 the robot's radar is set to turn left. - * If {@code radians} = 0 the robot's radar is set to stop turning. - * @see #turnBody(double) - * @see #turnGun(double) - * @see #move(double) - */ - void turnRadar(double radians); - - /** - * Sets the gun to turn independent from the robot's turn. - *

- * Ok, so this needs some explanation: The gun is mounted on the robot's - * body. So, normally, if the robot turns 90 degrees to the right, then the - * gun will turn with it as it is mounted on top of the robot's body. To - * compensate for this, you can call {@code setAdjustGunForBodyTurn(true)}. - * When this is set, the gun will turn independent from the robot's turn, - * i.e. the gun will compensate for the robot's body turn. - *

- * Note: This method is additive until you reach the maximum the gun can - * turn. The "adjust" is added to the amount you set for turning the robot, - * then capped by the physics of the game. If you turn infinite, then the - * adjust is ignored (and hence overridden). - *

- * Example, assuming both the robot and gun start out facing up (0 degrees): - *

-	 *   // Set gun to turn with the robot's turn
-	 *   setAdjustGunForBodyTurn(false); // This is the default
-	 *   turnBodyRight(Math.PI / 2);
-	 *   // At this point, both the robot and gun are facing right (90 degrees)
-	 *   turnBodyLeft(Math.PI / 2);
-	 *   // Both are back to 0 degrees
-	 *
-	 *   -- or --
-	 *
-	 *   // Set gun to turn independent from the robot's turn
-	 *   setAdjustGunForBodyTurn(true);
-	 *   turnBodyRight(Math.PI / 2);
-	 *   // At this point, the robot is facing right (90 degrees), but the gun is still facing up.
-	 *   turnBodyLeft(Math.PI / 2);
-	 *   // Both are back to 0 degrees.
-	 * 
- *

- * Note: The gun compensating this way does count as "turning the gun". - * See {@link #setAdjustRadarForGunTurn(boolean)} for details. - * - * @param independent {@code true} if the gun must turn independent from the - * robot's turn; {@code false} if the gun must turn with the robot's turn. - * @see #setAdjustRadarForGunTurn(boolean) - */ - void setAdjustGunForBodyTurn(boolean independent); - - /** - * Sets the radar to turn independent from the gun's turn. - *

- * Ok, so this needs some explanation: The radar is mounted on the robot's - * gun. So, normally, if the gun turns 90 degrees to the right, then the - * radar will turn with it as it is mounted on top of the gun. To compensate - * for this, you can call {@code setAdjustRadarForGunTurn(true)}. When this - * is set, the radar will turn independent from the robot's turn, i.e. the - * radar will compensate for the gun's turn. - *

- * Note: This method is additive until you reach the maximum the radar can - * turn. The "adjust" is added to the amount you set for turning the robot, - * then capped by the physics of the game. If you turn infinite, then the - * adjust is ignored (and hence overridden). - *

- * Example, assuming both the gun and radar start out facing up (0 degrees): - *

-	 *   // Set radar to turn with the gun's turn
-	 *   setAdjustRadarForGunTurn(false); // This is the default
-	 *   turnGunRight(Math.PI / 2);
-	 *   // At this point, both the radar and gun are facing right (90 degrees);
-	 *
-	 *   -- or --
-	 *
-	 *   // Set radar to turn independent from the gun's turn
-	 *   setAdjustRadarForGunTurn(true);
-	 *   turnGunRight(Math.PI / 2);
-	 *   // At this point, the gun is facing right (90 degrees), but the radar is still facing up.
-	 * 
- * Note: Calling {@code setAdjustRadarForGunTurn(boolean)} will - * automatically call {@link #setAdjustRadarForBodyTurn(boolean)} with the - * same value, unless you have already called it earlier. This behavior is - * primarily for backward compatibility with older Robocode robots. - * - * @param independent {@code true} if the radar must turn independent from - * the gun's turn; {@code false} if the radar must turn with the gun's - * turn. - * @see #setAdjustRadarForBodyTurn(boolean) - * @see #setAdjustGunForBodyTurn(boolean) - */ - void setAdjustRadarForGunTurn(boolean independent); - - /** - * Sets the radar to turn independent from the robot's turn. - *

- * Ok, so this needs some explanation: The radar is mounted on the gun, and - * the gun is mounted on the robot's body. So, normally, if the robot turns - * 90 degrees to the right, the gun turns, as does the radar. Hence, if the - * robot turns 90 degrees to the right, then the gun and radar will turn - * with it as the radar is mounted on top of the gun. To compensate for - * this, you can call {@code setAdjustRadarForBodyTurn(true)}. When this is - * set, the radar will turn independent from the robot's turn, i.e. the - * radar will compensate for the robot's turn. - *

- * Note: This method is additive until you reach the maximum the radar can - * turn. The "adjust" is added to the amount you set for turning the gun, - * then capped by the physics of the game. If you turn infinite, then the - * adjust is ignored (and hence overridden). - *

- * Example, assuming the robot, gun, and radar all start out facing up (0 - * degrees): - *

-	 *   // Set radar to turn with the robots's turn
-	 *   setAdjustRadarForBodyTurn(false); // This is the default
-	 *   turnRight(Math.PI / 2);
-	 *   // At this point, the body, gun, and radar are all facing right (90 degrees);
-	 *
-	 *   -- or --
-	 *
-	 *   // Set radar to turn independent from the robot's turn
-	 *   setAdjustRadarForBodyTurn(true);
-	 *   turnRight(Math.PI / 2);
-	 *   // At this point, the robot and gun are facing right (90 degrees), but the radar is still facing up.
-	 * 
- * - * @param independent {@code true} if the radar must turn independent from - * the robots's turn; {@code false} if the radar must turn with the robot's - * turn. - * @see #setAdjustGunForBodyTurn(boolean) - * @see #setAdjustRadarForGunTurn(boolean) - */ - void setAdjustRadarForBodyTurn(boolean independent); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/ITeamRobotPeer.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/ITeamRobotPeer.java deleted file mode 100644 index ddbb2ba..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/ITeamRobotPeer.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.robotinterfaces.peer; - - -import robocode.MessageEvent; - -import java.io.IOException; -import java.io.Serializable; -import java.util.List; - - -public interface ITeamRobotPeer extends IAdvancedRobotPeer { - - - String[] getTeammates(); - boolean isTeammate(String name); - - void broadcastMessage(Serializable message) throws IOException; - - void sendMessage(String name, Serializable message) throws IOException; - - /** - * Returns a vector containing all MessageEvents currently in the robot's - * queue. You might, for example, call this while processing another event. - *

- * Example: - *

-	 *   for (MessageEvent e : getMessageEvents()) {
-	 *      // do something with e
-	 *   }
-	 * 
- * - * @return a vector containing all MessageEvents currently in the robot's - * queue - * @see robocode.robotinterfaces.ITeamEvents#onMessageReceived(MessageEvent) - * onMessageReceived(MessageEvent) - * @see MessageEvent - * @since 1.2.6 - */ - List getMessageEvents(); -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/package-info.java deleted file mode 100644 index a0d2b8f..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/robotinterfaces/peer/package-info.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Robot peers available for implementing new robot types based on the Robot Interfaces. - */ -package robocode.robotinterfaces.peer; diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/util/Utils.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/util/Utils.java deleted file mode 100644 index 2b0f87a..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/util/Utils.java +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode.util; - - -import robocode.control.RandomFactory; - -import static java.lang.Math.PI; -import java.util.Random; - - -/** - * Utility class that provide methods for normalizing angles. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Utils { - - private final static double TWO_PI = 2 * PI; - private final static double THREE_PI_OVER_TWO = 3 * PI / 2; - private final static double PI_OVER_TWO = PI / 2; - public static final double NEAR_DELTA = .00001; - - // Hide the default constructor as this class only provides static method - private Utils() {} - - /** - * Normalizes an angle to an absolute angle. - * The normalized angle will be in the range from 0 to 2*PI, where 2*PI - * itself is not included. - * - * @param angle the angle to normalize - * @return the normalized angle that will be in the range of [0,2*PI[ - */ - public static double normalAbsoluteAngle(double angle) { - return (angle %= TWO_PI) >= 0 ? angle : (angle + TWO_PI); - } - - /** - * Normalizes an angle to an absolute angle. - * The normalized angle will be in the range from 0 to 360, where 360 - * itself is not included. - * - * @param angle the angle to normalize - * @return the normalized angle that will be in the range of [0,360[ - */ - public static double normalAbsoluteAngleDegrees(double angle) { - return (angle %= 360) >= 0 ? angle : (angle + 360); - } - - /** - * Normalizes an angle to a relative angle. - * The normalized angle will be in the range from -PI to PI, where PI - * itself is not included. - * - * @param angle the angle to normalize - * @return the normalized angle that will be in the range of [-PI,PI[ - */ - public static double normalRelativeAngle(double angle) { - return (angle %= TWO_PI) >= 0 ? (angle < PI) ? angle : angle - TWO_PI : (angle >= -PI) ? angle : angle + TWO_PI; - } - - /** - * Normalizes an angle to a relative angle. - * The normalized angle will be in the range from -180 to 180, where 180 - * itself is not included. - * - * @param angle the angle to normalize - * @return the normalized angle that will be in the range of [-180,180[ - */ - public static double normalRelativeAngleDegrees(double angle) { - return (angle %= 360) >= 0 ? (angle < 180) ? angle : angle - 360 : (angle >= -180) ? angle : angle + 360; - } - - /** - * Normalizes an angle to be near an absolute angle. - * The normalized angle will be in the range from 0 to 360, where 360 - * itself is not included. - * If the normalized angle is near to 0, 90, 180, 270 or 360, that - * angle will be returned. The {@link #isNear(double, double) isNear} - * method is used for defining when the angle is near one of angles listed - * above. - * - * @param angle the angle to normalize - * @return the normalized angle that will be in the range of [0,360[ - * @see #normalAbsoluteAngle(double) - * @see #isNear(double, double) - */ - public static double normalNearAbsoluteAngleDegrees(double angle) { - angle = (angle %= 360) >= 0 ? angle : (angle + 360); - - if (isNear(angle, 180)) { - return 180; - } else if (angle < 180) { - if (isNear(angle, 0)) { - return 0; - } else if (isNear(angle, 90)) { - return 90; - } - } else { - if (isNear(angle, 270)) { - return 270; - } else if (isNear(angle, 360)) { - return 0; - } - } - return angle; - } - - /** - * Normalizes an angle to be near an absolute angle. - * The normalized angle will be in the range from 0 to 2*PI, where 2*PI - * itself is not included. - * If the normalized angle is near to 0, PI/2, PI, 3*PI/2 or 2*PI, that - * angle will be returned. The {@link #isNear(double, double) isNear} - * method is used for defining when the angle is near one of angles listed - * above. - * - * @param angle the angle to normalize - * @return the normalized angle that will be in the range of [0,2*PI[ - * @see #normalAbsoluteAngle(double) - * @see #isNear(double, double) - */ - public static double normalNearAbsoluteAngle(double angle) { - angle = (angle %= TWO_PI) >= 0 ? angle : (angle + TWO_PI); - - if (isNear(angle, PI)) { - return PI; - } else if (angle < PI) { - if (isNear(angle, 0)) { - return 0; - } else if (isNear(angle, PI_OVER_TWO)) { - return PI_OVER_TWO; - } - } else { - if (isNear(angle, THREE_PI_OVER_TWO)) { - return THREE_PI_OVER_TWO; - } else if (isNear(angle, TWO_PI)) { - return 0; - } - } - return angle; - } - - /** - * Tests if the two {@code double} values are near to each other. - * It is recommended to use this method instead of testing if the two - * doubles are equal using an this expression: {@code value1 == value2}. - * The reason being, that this expression might never become - * {@code true} due to the precision of double values. - * Whether or not the specified doubles are near to each other is defined by - * the following expression: - * {@code (Math.abs(value1 - value2) < .00001)} - * - * @param value1 the first double value - * @param value2 the second double value - * @return {@code true} if the two doubles are near to each other; - * {@code false} otherwise. - */ - public static boolean isNear(double value1, double value2) { - return (Math.abs(value1 - value2) < NEAR_DELTA); - } - - /** - * Returns random number generator. It might be configured for repeatable behavior by setting -DRANDOMSEED option. - * - * @return random number generator - */ - public static Random getRandom() { - return RandomFactory.getRandom(); - } -} diff --git a/代码/workspace_robo4/robocode.api/src/main/java/robocode/util/package-info.java b/代码/workspace_robo4/robocode.api/src/main/java/robocode/util/package-info.java deleted file mode 100644 index 03e6838..0000000 --- a/代码/workspace_robo4/robocode.api/src/main/java/robocode/util/package-info.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ - -/** - * Utility classes that can be used when writing robots. - * Kept for compatibility with legacy robots. - */ -package robocode.util; diff --git a/代码/workspace_robo4/robocode.battle/.classpath b/代码/workspace_robo4/robocode.battle/.classpath deleted file mode 100644 index 3ae3e5a..0000000 --- a/代码/workspace_robo4/robocode.battle/.classpath +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.battle/.project b/代码/workspace_robo4/robocode.battle/.project deleted file mode 100644 index ef333f5..0000000 --- a/代码/workspace_robo4/robocode.battle/.project +++ /dev/null @@ -1,19 +0,0 @@ - - - robocode.battle - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.core - robocode.host - robocode.repository - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.battle/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.battle/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.battle/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.battle/pom.xml b/代码/workspace_robo4/robocode.battle/pom.xml deleted file mode 100644 index d0df636..0000000 --- a/代码/workspace_robo4/robocode.battle/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - robocode.battle - Robocode Battle - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.core - ${project.version} - - - net.sf.robocode - robocode.host - ${project.version} - - - net.sf.robocode - robocode.repository - ${project.version} - runtime - - - diff --git a/代码/workspace_robo4/robocode.battle/robocode.battle.iml b/代码/workspace_robo4/robocode.battle/robocode.battle.iml deleted file mode 100644 index 5fa5b24..0000000 --- a/代码/workspace_robo4/robocode.battle/robocode.battle.iml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BaseBattle.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BaseBattle.java deleted file mode 100644 index eded632..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BaseBattle.java +++ /dev/null @@ -1,475 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.URLJarCollector; -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logMessage; -import net.sf.robocode.settings.ISettingsManager; -import robocode.BattleRules; -import robocode.control.events.BattlePausedEvent; -import robocode.control.events.BattleResumedEvent; - -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - - -/** - * @author Pavel Savara (original) - */ -public abstract class BaseBattle implements IBattle, Runnable { - - private final static int MAX_TPS = 10000; - - // Maximum turns to display the battle when battle ended - protected final static int TURNS_DISPLAYED_AFTER_ENDING = 30; - - // Objects we use - private Thread battleThread; - IBattleManager battleManager; - protected final BattleEventDispatcher eventDispatcher; - private final ISettingsManager properties; - - // rules - protected BattleRules battleRules; - - // Current round items - private int roundNum; - protected int currentTime; - protected int totalTurns; - - protected int endTimer; - - // TPS (turns per second) calculation stuff - private int tps; - private long turnStartTime; - private long measuredTurnStartTime; - private int measuredTurnCounter; - - // Battle state - private final AtomicBoolean isRunning = new AtomicBoolean(false); - protected boolean isAborted; - - // Battle control - protected boolean isPaused; - private int stepCount; - private boolean runBackward; - private boolean roundOver; - private final Queue pendingCommands = new ConcurrentLinkedQueue(); - - protected BaseBattle(ISettingsManager properties, IBattleManager battleManager, BattleEventDispatcher eventDispatcher) { - stepCount = 0; - - this.properties = properties; - this.eventDispatcher = eventDispatcher; - - this.battleManager = battleManager; - } - - public void setBattleThread(Thread newBattleThread) { - battleThread = newBattleThread; - } - - /** - * Sets the roundNum. - * - * @param roundNum The roundNum to set - */ - public void setRoundNum(int roundNum) { - this.roundNum = roundNum; - } - - /** - * Gets the roundNum. - * - * @return Returns a int - */ - public int getRoundNum() { - return roundNum; - } - - public int getNumRounds() { - return battleRules.getNumRounds(); - } - - public Thread getBattleThread() { - return battleThread; - } - - public int getTime() { - return currentTime; - } - - public int getTotalTurns() { - return totalTurns; - } - - public boolean isLastRound() { - return (roundNum + 1 == getNumRounds()); - } - - public int getTPS() { - return tps; - } - - /** - * Informs on whether the battle is running or not. - * - * @return true if the battle is running, false otherwise - */ - public boolean isRunning() { - return isRunning.get(); - } - - /** - * Informs on whether the battle is aborted or not. - * - * @return true if the battle is aborted, false otherwise - */ - public boolean isAborted() { - return isAborted; - } - - public void cleanup() { - battleRules = null; - if (pendingCommands != null) { - pendingCommands.clear(); - // don't pendingCommands = null; - } - URLJarCollector.enableGc(true); - URLJarCollector.gc(); - } - - public void waitTillStarted() { - synchronized (isRunning) { - while (!isRunning.get()) { - try { - isRunning.wait(); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - return; // Break out - } - } - } - } - - public void waitTillOver() { - synchronized (isRunning) { - while (isRunning.get()) { - try { - isRunning.wait(); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - return; // Break out - } - } - } - } - - /** - * When an object implementing interface {@code Runnable} is used - * to create a thread, starting the thread causes the object's - * {@code run()} method to be called in that separately executing - * thread. - *

- * The general contract of the method {@code run()} is that it may - * take any action whatsoever. - * - * @see java.lang.Thread#run() - */ - public void run() { - try { - initializeBattle(); - - while (!isAborted && roundNum < getNumRounds()) { - try { - preloadRound(); - initializeRound(); - runRound(); - } catch (Exception e) { - logError("Exception running a battle round", e); - isAborted = true; - } finally { - finalizeRound(); - cleanupRound(); - } - roundNum++; - } - } finally { - finalizeBattle(); - cleanup(); - } - } - - protected void initializeBattle() { - URLJarCollector.enableGc(false); - roundNum = 0; - totalTurns = 0; - - // Notify that the battle is now running - synchronized (isRunning) { - isRunning.set(true); - isRunning.notifyAll(); - } - } - - protected void finalizeBattle() { - // Notify that the battle is over - synchronized (isRunning) { - isRunning.set(false); - isRunning.notifyAll(); - } - } - - protected void preloadRound() { - logMessage("----------------------"); - Logger.logMessage("Round " + (roundNum + 1) + " initializing..", false); - } - - protected void initializeRound() { - logMessage(""); - logMessage("Let the games begin!"); - - roundOver = false; - endTimer = 0; - currentTime = 0; - } - - private void runRound() { - - while (!roundOver) { - processCommand(); - - if (shouldPause() && !shouldStep()) { - shortSleep(); - continue; - } - - initializeTurn(); - - runTurn(); - - roundOver = isRoundOver(); - - finalizeTurn(); - } - } - - protected boolean isRoundOver() { - return (endTimer > 5 * TURNS_DISPLAYED_AFTER_ENDING); - } - - protected void finalizeRound() {} - - private void cleanupRound() { - logMessage("Round " + (roundNum + 1) + " cleaning up."); - } - - protected void initializeTurn() { - turnStartTime = System.nanoTime(); - } - - protected void runTurn() { - if (runBackward) { - currentTime--; - totalTurns--; - if (currentTime == 0 && !isPaused) { - pauseImpl(); - } - } else { - currentTime++; - totalTurns++; - } - } - - protected void shutdownTurn() { - endTimer++; - } - - protected void finalizeTurn() { - synchronizeTPS(); - calculateTPS(); - } - - private void synchronizeTPS() { - // Let the battle sleep is the GUI is enabled and is not minimized - // in order to keep the desired TPS - - if (battleManager.isManagedTPS()) { - long delay = 0; - - if (!isAborted() && endTimer < TURNS_DISPLAYED_AFTER_ENDING) { - int desiredTPS = properties.getOptionsBattleDesiredTPS(); - - if (desiredTPS < MAX_TPS) { - long deltaTime = System.nanoTime() - turnStartTime; - - delay = Math.max(1000000000 / desiredTPS - deltaTime, 0); - } - } - if (delay > 500000) { // sleep granularity is worse than 500000 - try { - Thread.sleep(delay / 1000000, (int) (delay % 1000000)); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - } - } - } - - private void calculateTPS() { - // Calculate the current turns per second (TPS) - - if (measuredTurnCounter++ == 0) { - measuredTurnStartTime = turnStartTime; - } - - long deltaTime = System.nanoTime() - measuredTurnStartTime; - - if (deltaTime / 500000000 >= 1) { - tps = (int) (measuredTurnCounter * 1000000000L / deltaTime); - measuredTurnCounter = 0; - } - } - - private boolean shouldPause() { - return (isPaused && !isAborted); - } - - private boolean shouldStep() { - if (stepCount > 0) { - stepCount--; - return true; - } - return false; - } - - // -------------------------------------------------------------------------- - // Processing and maintaining robot and battle controls - // -------------------------------------------------------------------------- - - protected void sendCommand(Command command) { - pendingCommands.add(command); - } - - private void processCommand() { - Command command = pendingCommands.poll(); - - while (command != null) { - try { - command.execute(); - } catch (Exception e) { - logError(e); - } - command = pendingCommands.poll(); - } - } - - public void stop(boolean waitTillEnd) { - sendCommand(new AbortCommand()); - - if (waitTillEnd) { - waitTillOver(); - } - } - - public void pause() { - sendCommand(new PauseCommand()); - } - - public void resume() { - sendCommand(new ResumeCommand()); - } - - public void step() { - sendCommand(new StepCommand()); - } - - protected void stepBack() { - sendCommand(new StepBackCommand()); - } - - private class PauseCommand extends Command { - public void execute() { - pauseImpl(); - } - - } - - private void pauseImpl() { - isPaused = true; - stepCount = 0; - eventDispatcher.onBattlePaused(new BattlePausedEvent()); - } - - private class ResumeCommand extends Command { - public void execute() { - isPaused = false; - stepCount = 0; - eventDispatcher.onBattleResumed(new BattleResumedEvent()); - } - } - - - private class StepCommand extends Command { - public void execute() { - runBackward = false; - if (isPaused) { - stepCount++; - } - } - } - - - private class StepBackCommand extends Command { - public void execute() { - runBackward = true; - if (isPaused) { - stepCount++; - } - } - } - - - private class AbortCommand extends Command { - public void execute() { - isAborted = true; - } - } - - - protected class RobotCommand extends Command { - protected final int robotIndex; - - protected RobotCommand(int robotIndex) { - this.robotIndex = robotIndex; - } - } - - // - // Utility - // - - private void shortSleep() { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Battle.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Battle.java deleted file mode 100644 index c70727a..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Battle.java +++ /dev/null @@ -1,886 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.battle.peer.BulletPeer; -import net.sf.robocode.battle.peer.ContestantPeer; -import net.sf.robocode.battle.peer.RobotPeer; -import net.sf.robocode.battle.peer.TeamPeer; -import net.sf.robocode.battle.snapshot.TurnSnapshot; -import net.sf.robocode.host.ICpuManager; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.settings.ISettingsManager; -import robocode.*; -import robocode.control.RandomFactory; -import robocode.control.RobotResults; -import robocode.control.RobotSetup; -import robocode.control.RobotSpecification; -import robocode.control.events.*; -import robocode.control.events.RoundEndedEvent; -import robocode.control.snapshot.BulletState; -import robocode.control.snapshot.ITurnSnapshot; - -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -/** - * The {@code Battle} class is used for controlling a battle. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Luis Crespo (contributor) - * @author Robert D. Maupin (contributor) - * @author Titus Chen (contributor) - * @author Nathaniel Troutman (contributor) - * @author Julian Kent (contributor) - * @author Pavel Savara (contributor) - */ -public final class Battle extends BaseBattle { - - private static final int DEBUG_TURN_WAIT_MILLIS = 10 * 60 * 1000; // 10 seconds - - private final IHostManager hostManager; - private final long cpuConstant; - - // Inactivity related items - private int inactiveTurnCount; - private double inactivityEnergy; - - // Turn skip related items - private boolean parallelOn; - private long millisWait; - private int nanoWait; - - // Objects in the battle - private int robotsCount; - private List robots = new ArrayList(); - private List contestants = new ArrayList(); - private final List bullets = new CopyOnWriteArrayList(); - - // Robot counters - private int activeParticipants; - private int activeSentries; - - // Death events - private final List deathRobots = new CopyOnWriteArrayList(); - - // Initial robot setups (if any) - private RobotSetup[] initialRobotSetups; - - public Battle(ISettingsManager properties, IBattleManager battleManager, IHostManager hostManager, ICpuManager cpuManager, BattleEventDispatcher eventDispatcher) { // NO_UCD (unused code) - super( - properties, battleManager, eventDispatcher); - this.hostManager = hostManager; - this.cpuConstant = cpuManager.getCpuConstant(); - } - - void setup(RobotSpecification[] battlingRobotsList, BattleProperties battleProps, boolean paused) { - isPaused = paused; - battleRules = HiddenAccess.createRules(battleProps.getBattlefieldWidth(), battleProps.getBattlefieldHeight(), - battleProps.getNumRounds(), battleProps.getGunCoolingRate(), battleProps.getInactivityTime(), - battleProps.getHideEnemyNames(), battleProps.getSentryBorderSize()); - robotsCount = battlingRobotsList.length; - computeInitialPositions(battleProps.getInitialPositions()); - createPeers(battlingRobotsList); - } - - private void createPeers(RobotSpecification[] battlingRobotsList) { - // create teams - Map countedNames = new HashMap(); - List teams = new ArrayList(); - List teamDuplicates = new ArrayList(); - List robotDuplicates = new ArrayList(); - - // count duplicate robots, enumerate teams, enumerate team members - for (RobotSpecification specification : battlingRobotsList) { - final String name = ((IRobotItem) HiddenAccess.getFileSpecification(specification)).getUniqueFullClassNameWithVersion(); - - if (countedNames.containsKey(name)) { - int value = countedNames.get(name); - - countedNames.put(name, value == 1 ? 3 : value + 1); - } else { - countedNames.put(name, 1); - } - - String teamFullName = HiddenAccess.getRobotTeamName(specification); - - if (teamFullName != null) { - if (!teams.contains(teamFullName)) { - teams.add(teamFullName); - String teamName = teamFullName.substring(0, teamFullName.length() - 6); - - if (countedNames.containsKey(teamName)) { - int value = countedNames.get(teamName); - - countedNames.put(teamName, value == 1 ? 3 : value + 1); - } else { - countedNames.put(teamName, 1); - } - } - } - } - - Map> teamMembers = new HashMap>(); - - // name teams - for (int i = teams.size() - 1; i >= 0; i--) { - String teamFullName = teams.get(i); - String name = teamFullName.substring(0, teamFullName.length() - 6); - Integer order = countedNames.get(name); - String newTeamName = name; - - if (order > 1) { - newTeamName = name + " (" + (order - 1) + ")"; - } - teamDuplicates.add(0, newTeamName); - teamMembers.put(teamFullName, new ArrayList()); - countedNames.put(name, order - 1); - } - - // name robots - for (int i = battlingRobotsList.length - 1; i >= 0; i--) { - RobotSpecification specification = battlingRobotsList[i]; - String name = ((IRobotItem) HiddenAccess.getFileSpecification(specification)).getUniqueFullClassNameWithVersion(); - Integer order = countedNames.get(name); - int duplicate = -1; - - String newName = name; - - if (order > 1) { - duplicate = (order - 2); - newName = name + " (" + (order - 1) + ")"; - } - countedNames.put(name, (order - 1)); - robotDuplicates.add(0, duplicate); - - String teamFullName = HiddenAccess.getRobotTeamName(specification); - - if (teamFullName != null) { - List members = teamMembers.get(teamFullName); - - members.add(newName); - } - } - - // create teams - Map namedTeams = new HashMap(); - - // create robots - for (int i = 0; i < battlingRobotsList.length; i++) { - RobotSpecification specification = battlingRobotsList[i]; - TeamPeer team = null; - - String teamFullName = HiddenAccess.getRobotTeamName(specification); - - // The team index and robot index depends on current sizes of the contestant list and robot list - int teamIndex = contestants.size(); - int robotIndex = robots.size(); - - if (teamFullName != null) { - if (!namedTeams.containsKey(teamFullName)) { - String newTeamName = teamDuplicates.get(teams.indexOf(teamFullName)); - - team = new TeamPeer(newTeamName, teamMembers.get(teamFullName), teamIndex); - - namedTeams.put(teamFullName, team); - contestants.add(team); - - } else { - team = namedTeams.get(teamFullName); - if (team != null) { - teamIndex = team.getTeamIndex(); - } - } - } - Integer duplicate = robotDuplicates.get(i); - RobotPeer robotPeer = new RobotPeer(this, hostManager, specification, duplicate, team, robotIndex); - - robots.add(robotPeer); - if (team == null) { - contestants.add(robotPeer); - } - } - } - - public void registerDeathRobot(RobotPeer r) { - deathRobots.add(r); - } - - public BattleRules getBattleRules() { - return battleRules; - } - - public int getRobotsCount() { - return robotsCount; - } - - public boolean isDebugging() { - return RobocodeProperties.isDebuggingOn(); - } - - public void addBullet(BulletPeer bullet) { - bullets.add(bullet); - } - - public void resetInactiveTurnCount(double energyLoss) { - if (energyLoss < 0) { - return; - } - inactivityEnergy += energyLoss; - while (inactivityEnergy >= 10) { - inactivityEnergy -= 10; - inactiveTurnCount = 0; - } - } - - /** - * Returns the number of active participants. - * - * @return the number of active participants. - */ - public int countActiveParticipants() { - return activeParticipants; - } - - /** - * Returns the number of active sentry robots. - * - * @return the number of active sentry robots. - */ - public int countActiveSentries() { - return activeSentries; - } - - @Override - public void cleanup() { - - if (contestants != null) { - contestants.clear(); - contestants = null; - } - - if (robots != null) { - robots.clear(); - robots = null; - } - - super.cleanup(); - - battleManager = null; - - // Request garbage collecting - for (int i = 4; i >= 0; i--) { // Make sure it is run - System.gc(); - } - } - - @Override - protected void initializeBattle() { - super.initializeBattle(); - - parallelOn = System.getProperty("PARALLEL", "false").equals("true"); - if (parallelOn) { - // how could robots share CPUs ? - double parallelConstant = robots.size() / Runtime.getRuntime().availableProcessors(); - - // four CPUs can't run two single threaded robot faster than two CPUs - if (parallelConstant < 1) { - parallelConstant = 1; - } - final long waitTime = (long) (cpuConstant * parallelConstant); - - millisWait = waitTime / 1000000; - nanoWait = (int) (waitTime % 1000000); - } else { - millisWait = cpuConstant / 1000000; - nanoWait = (int) (cpuConstant % 1000000); - } - if (nanoWait == 0) { - nanoWait = 1; - } - } - - @Override - protected void finalizeBattle() { - eventDispatcher.onBattleFinished(new BattleFinishedEvent(isAborted())); - - if (!isAborted()) { - eventDispatcher.onBattleCompleted(new BattleCompletedEvent(battleRules, computeBattleResults())); - } - - for (RobotPeer robotPeer : robots) { - robotPeer.cleanup(); - } - hostManager.resetThreadManager(); - - super.finalizeBattle(); - } - - @Override - protected void preloadRound() { - super.preloadRound(); - - computeActiveRobots(); // Used for robotPeer.initializeRound() - - // At this point the unsafe loader thread will now set itself to wait for a notify - - for (RobotPeer robotPeer : robots) { - robotPeer.initializeRound(robots, initialRobotSetups); - robotPeer.println("========================="); - robotPeer.println("Round " + (getRoundNum() + 1) + " of " + getNumRounds()); - robotPeer.println("========================="); - } - - if (getRoundNum() == 0) { - eventDispatcher.onBattleStarted(new BattleStartedEvent(battleRules, robots.size(), false)); - if (isPaused) { - eventDispatcher.onBattlePaused(new BattlePausedEvent()); - } - } - - computeActiveRobots(); // Used for RoundEnded check hostManager.resetThreadManager(); - } - - @Override - protected void initializeRound() { - super.initializeRound(); - - inactiveTurnCount = 0; - - // Start robots - - long waitMillis; - int waitNanos; - - if (isDebugging()) { - waitMillis = DEBUG_TURN_WAIT_MILLIS; - waitNanos = 0; - } else { - long waitTime = Math.min(300 * cpuConstant, 10000000000L); - - waitMillis = waitTime / 1000000; - waitNanos = (int) (waitTime % 1000000); - } - - for (RobotPeer robotPeer : getRobotsAtRandom()) { - robotPeer.startRound(waitMillis, waitNanos); - } - - Logger.logMessage(""); // puts in a new-line in the log message - - final ITurnSnapshot snapshot = new TurnSnapshot(this, robots, bullets, false); - - eventDispatcher.onRoundStarted(new RoundStartedEvent(snapshot, getRoundNum())); - } - - @Override - protected void finalizeRound() { - super.finalizeRound(); - - for (RobotPeer robotPeer : robots) { - robotPeer.waitForStop(); - } - bullets.clear(); - - eventDispatcher.onRoundEnded(new RoundEndedEvent(getRoundNum(), currentTime, totalTurns)); - } - - @Override - protected void initializeTurn() { - super.initializeTurn(); - - eventDispatcher.onTurnStarted(new TurnStartedEvent()); - } - - @Override - protected void runTurn() { - super.runTurn(); - - loadCommands(); - - updateBullets(); - - updateRobots(); - - handleDeadRobots(); - - if (isAborted() || oneTeamRemaining()) { - shutdownTurn(); - } - - inactiveTurnCount++; - - computeActiveRobots(); - - publishStatuses(); - - // Robot time! - wakeupRobots(); - } - - @Override - protected void shutdownTurn() { - if (endTimer == 0) { - if (isAborted()) { - for (RobotPeer robotPeer : getRobotsAtRandom()) { - if (robotPeer.isAlive()) { - robotPeer.println("SYSTEM: game aborted."); - } - } - } else if (oneTeamRemaining()) { - boolean leaderFirsts = false; - TeamPeer winningTeam = null; - - robocode.RoundEndedEvent roundEndedEvent = new robocode.RoundEndedEvent(getRoundNum(), currentTime, - totalTurns); - - for (RobotPeer robotPeer : getRobotsAtRandom()) { - robotPeer.addEvent(roundEndedEvent); - if (robotPeer.isAlive() && !robotPeer.isWinner() && !robotPeer.isSentryRobot()) { - robotPeer.getRobotStatistics().scoreLastSurvivor(); - robotPeer.setWinner(true); - robotPeer.println("SYSTEM: " + robotPeer.getNameForEvent(robotPeer) + " wins the round."); - robotPeer.addEvent(new WinEvent()); - if (robotPeer.getTeamPeer() != null) { - if (robotPeer.isTeamLeader()) { - leaderFirsts = true; - } else { - winningTeam = robotPeer.getTeamPeer(); - } - } - } - // Generate totals as round has ended, but first when the last scores has been calculated - robotPeer.getRobotStatistics().generateTotals(); - } - if (!leaderFirsts && winningTeam != null) { - winningTeam.getTeamLeader().getRobotStatistics().scoreFirsts(); - } - } - if (isAborted() || isLastRound()) { - List orderedRobots = new ArrayList(robots); - Collections.sort(orderedRobots); - Collections.reverse(orderedRobots); - - for (int rank = 0; rank < robots.size(); rank++) { - RobotPeer robotPeer = orderedRobots.get(rank); - robotPeer.getStatistics().setRank(rank + 1); - BattleResults battleResults = robotPeer.getStatistics().getFinalResults(); - robotPeer.addEvent(new BattleEndedEvent(isAborted(), battleResults)); - } - } - } - - if (endTimer > 4 * TURNS_DISPLAYED_AFTER_ENDING) { - for (RobotPeer robotPeer : robots) { - robotPeer.setHalt(true); - } - } - - super.shutdownTurn(); - } - - @Override - protected void finalizeTurn() { - eventDispatcher.onTurnEnded(new TurnEndedEvent(new TurnSnapshot(this, robots, bullets, true))); - - super.finalizeTurn(); - } - - private BattleResults[] computeBattleResults() { - ArrayList results = new ArrayList(); - for (int i = 0; i < contestants.size(); i++) { - results.add(null); - } - for (int rank = 0; rank < contestants.size(); rank++) { - ContestantPeer contestant = contestants.get(rank); - contestant.getStatistics().setRank(rank + 1); - BattleResults battleResults = contestant.getStatistics().getFinalResults(); - - RobotSpecification robotSpec = null; - if (contestant instanceof RobotPeer) { - robotSpec = ((RobotPeer) contestant).getRobotSpecification(); - } else if (contestant instanceof TeamPeer) { - robotSpec = ((TeamPeer) contestant).getTeamLeader().getRobotSpecification(); - } - results.set(rank, new RobotResults(robotSpec, battleResults)); - } - return results.toArray(new BattleResults[results.size()]); - } - - /** - * Returns a list of all robots in random order. This method is used to gain fair play in Robocode, - * so that a robot placed before another robot in the list will not gain any benefit when the game - * checks if a robot has won, is dead, etc. - * This method was introduced as two equal robots like sample.RamFire got different scores even - * though the code was exactly the same. - * - * @return a list of robot peers. - */ - private List getRobotsAtRandom() { - List shuffledList = new ArrayList(robots); - - Collections.shuffle(shuffledList, RandomFactory.getRandom()); - return shuffledList; - } - - /** - * Returns a list of all bullets in random order. This method is used to gain fair play in Robocode. - * - * @return a list of bullet peers. - */ - private List getBulletsAtRandom() { - List shuffledList = new ArrayList(bullets); - - Collections.shuffle(shuffledList, RandomFactory.getRandom()); - return shuffledList; - } - - /** - * Returns a list of all death robots in random order. This method is used to gain fair play in Robocode. - * - * @return a list of robot peers. - */ - private List getDeathRobotsAtRandom() { - List shuffledList = new ArrayList(deathRobots); - - Collections.shuffle(shuffledList, RandomFactory.getRandom()); - return shuffledList; - } - - private void loadCommands() { - // this will load commands, including bullets from last turn - for (RobotPeer robotPeer : robots) { - robotPeer.performLoadCommands(); - } - } - - private void updateBullets() { - for (BulletPeer bullet : getBulletsAtRandom()) { - bullet.update(getRobotsAtRandom(), getBulletsAtRandom()); - if (bullet.getState() == BulletState.INACTIVE) { - bullets.remove(bullet); - } - } - } - - private void updateRobots() { - boolean zap = (inactiveTurnCount > battleRules.getInactivityTime()); - - final double zapEnergy = isAborted() ? 5 : zap ? .1 : 0; - - // Move all bots - for (RobotPeer robotPeer : getRobotsAtRandom()) { - robotPeer.performMove(getRobotsAtRandom(), zapEnergy); - } - - // Scan after moved all - for (RobotPeer robotPeer : getRobotsAtRandom()) { - robotPeer.performScan(getRobotsAtRandom()); - } - } - - private void handleDeadRobots() { - - for (RobotPeer deadRobot : getDeathRobotsAtRandom()) { - // Compute scores for dead robots - if (deadRobot.getTeamPeer() == null) { - deadRobot.getRobotStatistics().scoreRobotDeath(getActiveContestantCount(deadRobot)); - } else { - boolean teammatesalive = false; - - for (RobotPeer tm : robots) { - if (tm.getTeamPeer() == deadRobot.getTeamPeer() && tm.isAlive()) { - teammatesalive = true; - break; - } - } - if (!teammatesalive) { - deadRobot.getRobotStatistics().scoreRobotDeath(getActiveContestantCount(deadRobot)); - } - } - - // Publish death to live robots - for (RobotPeer robotPeer : getRobotsAtRandom()) { - if (robotPeer.isAlive()) { - robotPeer.addEvent(new RobotDeathEvent(robotPeer.getNameForEvent(deadRobot))); - - if (robotPeer.getTeamPeer() == null || robotPeer.getTeamPeer() != deadRobot.getTeamPeer()) { - robotPeer.getRobotStatistics().scoreSurvival(); - } - } - } - } - - deathRobots.clear(); - } - - private void publishStatuses() { - for (RobotPeer robotPeer : robots) { - robotPeer.publishStatus(currentTime); - } - } - - private void computeActiveRobots() { - int countActiveParticipants = 0; - int countActiveSentries = 0; - - for (RobotPeer robot : robots) { - if (robot.isAlive()) { // robot must be alive in order to be active - if (robot.isSentryRobot()) { - countActiveSentries++; - } else { - countActiveParticipants++; - } - } - } - this.activeParticipants = countActiveParticipants; - this.activeSentries = countActiveSentries; - } - - private void wakeupRobots() { - // Wake up all robot threads - final List robotsAtRandom = getRobotsAtRandom(); - - if (parallelOn) { - wakeupParallel(robotsAtRandom); - } else { - wakeupSerial(robotsAtRandom); - } - } - - private void wakeupSerial(List robotsAtRandom) { - for (RobotPeer robotPeer : robotsAtRandom) { - if (robotPeer.isRunning()) { - // This call blocks until the robot's thread actually wakes up. - robotPeer.waitWakeup(); - - if (robotPeer.isAlive()) { - if (isDebugging() || robotPeer.isPaintEnabled()) { - robotPeer.waitSleeping(DEBUG_TURN_WAIT_MILLIS, 1); - } else if (currentTime == 1) { - robotPeer.waitSleeping(millisWait * 10, 1); - } else { - robotPeer.waitSleeping(millisWait, nanoWait); - } - } - } - } - } - - private void wakeupParallel(List robotsAtRandom) { - for (RobotPeer robotPeer : robotsAtRandom) { - if (robotPeer.isRunning()) { - // This call blocks until the robot's thread actually wakes up. - robotPeer.waitWakeup(); - } - } - for (RobotPeer robotPeer : robotsAtRandom) { - if (robotPeer.isRunning() && robotPeer.isAlive()) { - if (isDebugging() || robotPeer.isPaintEnabled()) { - robotPeer.waitSleeping(DEBUG_TURN_WAIT_MILLIS, 1); - } else if (currentTime == 1) { - robotPeer.waitSleeping(millisWait * 10, 1); - } else { - robotPeer.waitSleeping(millisWait, nanoWait); - } - } - } - } - - private int getActiveContestantCount(RobotPeer peer) { - int count = 0; - - for (ContestantPeer c : contestants) { - if (c instanceof RobotPeer) { - RobotPeer robot = (RobotPeer) c; - if (!robot.isSentryRobot() && robot.isAlive()) { - count++; - } - } else if (c instanceof TeamPeer && c != peer.getTeamPeer()) { - for (RobotPeer robot: (TeamPeer) c) { - if (!robot.isSentryRobot() && robot.isAlive()) { - count++; - break; - } - } - } - } - return count; - } - - private void computeInitialPositions(String initialPositions) { - initialRobotSetups = null; - - if (initialPositions == null || initialPositions.trim().length() == 0) { - return; - } - - List positions = new ArrayList(); - - Pattern pattern = Pattern.compile("([^,(]*[(][^)]*[)])?[^,]*,?"); - Matcher matcher = pattern.matcher(initialPositions); - - while (matcher.find()) { - String pos = matcher.group(); - if (pos.length() > 0) { - positions.add(pos); - } - } - if (positions.size() == 0) { - return; - } - - initialRobotSetups = new RobotSetup[positions.size()]; - - String[] coords; - double x, y, heading; - - for (int i = 0; i < positions.size(); i++) { - coords = positions.get(i).split(","); - - Random random = RandomFactory.getRandom(); - - x = RobotPeer.WIDTH + random.nextDouble() * (battleRules.getBattlefieldWidth() - 2 * RobotPeer.WIDTH); - y = RobotPeer.HEIGHT + random.nextDouble() * (battleRules.getBattlefieldHeight() - 2 * RobotPeer.HEIGHT); - heading = 2 * Math.PI * random.nextDouble(); - - int len = coords.length; - - if (len >= 1 && coords[0].trim().length() > 0) { - try { - x = Double.parseDouble(coords[0].replaceAll("[^0-9.]", "")); - } catch (NumberFormatException ignore) {// Could be the '?', which is fine - } - if (len >= 2 && coords[1].trim().length() > 0) { - try { - y = Double.parseDouble(coords[1].replaceAll("[^0-9.]", "")); - } catch (NumberFormatException ignore) {// Could be the '?', which is fine - } - if (len >= 3 && coords[2].trim().length() > 0) { - try { - heading = Math.toRadians(Double.parseDouble(coords[2].replaceAll("[^0-9.]", ""))); - } catch (NumberFormatException ignore) {// Could be the '?', which is fine - } - } - } - } - initialRobotSetups[i] = new RobotSetup(x, y, heading); - } - } - - private boolean oneTeamRemaining() { - if (countActiveParticipants() <= 1) { - return true; - } - - boolean found = false; - TeamPeer currentTeam = null; - - for (RobotPeer currentRobot : robots) { - if (currentRobot.isAlive()) { - if (!found) { - found = true; - currentTeam = currentRobot.getTeamPeer(); - } else { - if (currentTeam == null && currentRobot.getTeamPeer() == null) { - return false; - } - if (currentTeam != currentRobot.getTeamPeer()) { - return false; - } - } - } - } - return true; - } - - // -------------------------------------------------------------------------- - // Processing and maintaining robot and battle controls - // -------------------------------------------------------------------------- - - void killRobot(int robotIndex) { - sendCommand(new KillRobotCommand(robotIndex)); - } - - public void setPaintEnabled(int robotIndex, boolean enable) { - sendCommand(new EnableRobotPaintCommand(robotIndex, enable)); - } - - void setSGPaintEnabled(int robotIndex, boolean enable) { - sendCommand(new EnableRobotSGPaintCommand(robotIndex, enable)); - } - - void sendInteractiveEvent(Event e) { - sendCommand(new SendInteractiveEventCommand(e)); - } - - private class KillRobotCommand extends RobotCommand { - KillRobotCommand(int robotIndex) { - super(robotIndex); - } - - public void execute() { - robots.get(robotIndex).kill(); - } - } - - - private class EnableRobotPaintCommand extends RobotCommand { - final boolean enablePaint; - - EnableRobotPaintCommand(int robotIndex, boolean enablePaint) { - super(robotIndex); - this.enablePaint = enablePaint; - } - - public void execute() { - robots.get(robotIndex).setPaintEnabled(enablePaint); - } - } - - - private class EnableRobotSGPaintCommand extends RobotCommand { - final boolean enableSGPaint; - - EnableRobotSGPaintCommand(int robotIndex, boolean enableSGPaint) { - super(robotIndex); - this.enableSGPaint = enableSGPaint; - } - - public void execute() { - robots.get(robotIndex).setSGPaintEnabled(enableSGPaint); - } - } - - - private class SendInteractiveEventCommand extends Command { - public final Event event; - - SendInteractiveEventCommand(Event event) { - this.event = event; - } - - public void execute() { - for (RobotPeer robotPeer : robots) { - if (robotPeer.isInteractiveRobot()) { - robotPeer.addEvent(event); - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BattleManager.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BattleManager.java deleted file mode 100644 index 413c0ac..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BattleManager.java +++ /dev/null @@ -1,404 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.core.Container; -import net.sf.robocode.host.ICpuManager; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logMessage; -import net.sf.robocode.recording.BattlePlayer; -import net.sf.robocode.recording.IRecordManager; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.settings.ISettingsManager; -import robocode.Event; -import robocode.control.BattleSpecification; -import robocode.control.RandomFactory; -import robocode.control.RobotSetup; -import robocode.control.RobotSpecification; -import robocode.control.events.BattlePausedEvent; -import robocode.control.events.BattleResumedEvent; -import robocode.control.events.IBattleListener; - -import java.io.*; -import java.util.concurrent.atomic.AtomicBoolean; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Luis Crespo (contributor) - * @author Robert D. Maupin (contributor) - * @author Nathaniel Troutman (contributor) - * @author Pavel Savara (contributor) - */ -public class BattleManager implements IBattleManager { - private final ISettingsManager properties; - private final IHostManager hostManager; - private final ICpuManager cpuManager; - private final IRecordManager recordManager; - private final IRepositoryManager repositoryManager; - - private volatile IBattle battle; - private Thread battleThread; - private BattleProperties battleProperties = new BattleProperties(); - - private final BattleEventDispatcher battleEventDispatcher; - - private String battleFilename; - private String battlePath; - - private int pauseCount = 0; - private final AtomicBoolean isManagedTPS = new AtomicBoolean(false); - - public BattleManager(ISettingsManager properties, IRepositoryManager repositoryManager, IHostManager hostManager, ICpuManager cpuManager, BattleEventDispatcher battleEventDispatcher, IRecordManager recordManager) { // NO_UCD (unused code) - this.properties = properties; - this.recordManager = recordManager; - this.repositoryManager = repositoryManager; - this.cpuManager = cpuManager; - this.hostManager = hostManager; - this.battleEventDispatcher = battleEventDispatcher; - Logger.setLogListener(battleEventDispatcher); - } - - public synchronized void cleanup() { - if (battle != null) { - battle.waitTillOver(); - battle.cleanup(); - } - battle = null; - } - - // Called when starting a new battle from GUI - public void startNewBattle(BattleProperties battleProperties, boolean waitTillOver, boolean enableCLIRecording) { - this.battleProperties = battleProperties; - final RobotSpecification[] robots = repositoryManager.loadSelectedRobots(battleProperties.getSelectedRobots()); - - startNewBattleImpl(robots, waitTillOver, enableCLIRecording); - } - - // Called from the RobocodeEngine - public void startNewBattle(BattleSpecification spec, String initialPositions, boolean waitTillOver, boolean enableCLIRecording) { - battleProperties = new BattleProperties(); - battleProperties.setBattlefieldWidth(spec.getBattlefield().getWidth()); - battleProperties.setBattlefieldHeight(spec.getBattlefield().getHeight()); - battleProperties.setGunCoolingRate(spec.getGunCoolingRate()); - battleProperties.setInactivityTime(spec.getInactivityTime()); - battleProperties.setNumRounds(spec.getNumRounds()); - battleProperties.setHideEnemyNames(spec.getHideEnemyNames()); - battleProperties.setSentryBorderSize(spec.getSentryBorderSize()); - battleProperties.setSelectedRobots(spec.getRobots()); - - final RobotSetup[] initialSetups = spec.getInitialSetups(); - if (initialSetups != null) { - battleProperties.setInitialPositions(initialSetups); - } else { - battleProperties.setInitialPositions(initialPositions); - } - - final RobotSpecification[] robots = repositoryManager.loadSelectedRobots(spec.getRobots()); - - startNewBattleImpl(robots, waitTillOver, enableCLIRecording); - } - - private void startNewBattleImpl(RobotSpecification[] battlingRobotsList, boolean waitTillOver, boolean enableCLIRecording) { - stop(true); - - logMessage("Preparing battle..."); - - final boolean recording = (properties.getOptionsCommonEnableReplayRecording() - && System.getProperty("TESTING", "none").equals("none")) - || enableCLIRecording; - - if (recording) { - recordManager.attachRecorder(battleEventDispatcher); - } else { - recordManager.detachRecorder(); - } - - // resets seed for deterministic behavior of Random - final String seed = System.getProperty("RANDOMSEED", "none"); - - if (!seed.equals("none")) { - // init soon as it reads random - cpuManager.getCpuConstant(); - - RandomFactory.resetDeterministic(Long.valueOf(seed)); - } - - Battle realBattle = Container.createComponent(Battle.class); - realBattle.setup(battlingRobotsList, battleProperties, isPaused()); - - battle = realBattle; - - battleThread = new Thread(Thread.currentThread().getThreadGroup(), realBattle); - battleThread.setPriority(Thread.NORM_PRIORITY); - battleThread.setName("Battle Thread"); - realBattle.setBattleThread(battleThread); - - if (RobocodeProperties.isSecurityOn()) { - hostManager.addSafeThread(battleThread); - } - - // Start the realBattle thread - battleThread.start(); - - // Wait until the realBattle is running and ended. - // This must be done as a new realBattle could be started immediately after this one causing - // multiple realBattle threads to run at the same time, which must be prevented! - realBattle.waitTillStarted(); - if (waitTillOver) { - realBattle.waitTillOver(); - } - } - - public void waitTillOver() { - if (battle != null) { - battle.waitTillOver(); - } - } - - private void replayBattle() { - if (!recordManager.hasRecord()) { - return; - } - logMessage("Preparing replay..."); - - if (battle != null && battle.isRunning()) { - battle.stop(true); - } - - Logger.setLogListener(battleEventDispatcher); - - recordManager.detachRecorder(); - battle = Container.createComponent(BattlePlayer.class); - - Thread battleThread = new Thread(Thread.currentThread().getThreadGroup(), battle); - - battleThread.setPriority(Thread.NORM_PRIORITY); - battleThread.setName("BattlePlayer Thread"); - - // Start the battlePlayer thread - battleThread.start(); - } - - public String getBattleFilename() { - return battleFilename; - } - - public void setBattleFilename(String newBattleFilename) { - if (newBattleFilename != null) { - battleFilename = newBattleFilename.replace((File.separatorChar == '/') ? '\\' : '/', File.separatorChar); - - if (battleFilename.indexOf(File.separatorChar) < 0) { - try { - battleFilename = FileUtil.getBattlesDir().getCanonicalPath() + File.separatorChar + battleFilename; - } catch (IOException ignore) {} - } - if (!battleFilename.endsWith(".battle")) { - battleFilename += ".battle"; - } - } - } - - public String getBattlePath() { - if (battlePath == null) { - battlePath = System.getProperty("BATTLEPATH"); - if (battlePath == null) { - battlePath = "battles"; - } - battlePath = new File(FileUtil.getCwd(), battlePath).getAbsolutePath(); - } - return battlePath; - } - - public void saveBattleProperties() { - if (battleProperties == null) { - logError("Cannot save null battle properties"); - return; - } - if (battleFilename == null) { - logError("Cannot save battle to null path, use setBattleFilename()"); - return; - } - FileOutputStream out = null; - - try { - out = new FileOutputStream(battleFilename); - - battleProperties.store(out, "Battle Properties"); - } catch (IOException e) { - logError("IO Exception saving battle properties: " + e); - } finally { - FileUtil.cleanupStream(out); - } - } - - public BattleProperties loadBattleProperties() { - BattleProperties res = new BattleProperties(); - FileInputStream in = null; - try { - in = new FileInputStream(getBattleFilename()); - res.load(in); - } catch (FileNotFoundException e) { - logError("No file " + battleFilename + " found, using defaults."); - } catch (IOException e) { - logError("Error while reading " + getBattleFilename() + ": " + e); - } finally { - FileUtil.cleanupStream(in); - } - return res; - } - - public BattleProperties getBattleProperties() { - if (battleProperties == null) { - battleProperties = new BattleProperties(); - } - return battleProperties; - } - - public void setDefaultBattleProperties() { - battleProperties = new BattleProperties(); - } - - public boolean isManagedTPS() { - return isManagedTPS.get(); - } - - public void setManagedTPS(boolean value) { - isManagedTPS.set(value); - } - - public synchronized void addListener(IBattleListener listener) { - battleEventDispatcher.addListener(listener); - } - - public synchronized void removeListener(IBattleListener listener) { - battleEventDispatcher.removeListener(listener); - } - - public synchronized void stop(boolean waitTillEnd) { - if (battle != null && battle.isRunning()) { - battle.stop(waitTillEnd); - } - if (hostManager != null && battleThread != null) { - hostManager.removeSafeThread(battleThread); - } - battleThread = null; - } - - public synchronized void restart() { - // Start new battle. The old battle is automatically stopped - startNewBattle(battleProperties, false, false); - } - - public synchronized void replay() { - replayBattle(); - } - - private boolean isPaused() { - return (pauseCount != 0); - } - - public synchronized void togglePauseResumeBattle() { - if (isPaused()) { - resumeBattle(); - } else { - pauseBattle(); - } - } - - public synchronized void pauseBattle() { - if (++pauseCount == 1) { - if (battle != null && battle.isRunning()) { - battle.pause(); - } else { - battleEventDispatcher.onBattlePaused(new BattlePausedEvent()); - } - } - } - - public synchronized void pauseIfResumedBattle() { - if (pauseCount == 0) { - pauseCount++; - if (battle != null && battle.isRunning()) { - battle.pause(); - } else { - battleEventDispatcher.onBattlePaused(new BattlePausedEvent()); - } - } - } - - public synchronized void resumeIfPausedBattle() { - if (pauseCount == 1) { - pauseCount--; - if (battle != null && battle.isRunning()) { - battle.resume(); - } else { - battleEventDispatcher.onBattleResumed(new BattleResumedEvent()); - } - } - } - - public synchronized void resumeBattle() { - if (--pauseCount < 0) { - pauseCount = 0; - logError("SYSTEM: pause game bug!"); - } else if (pauseCount == 0) { - if (battle != null && battle.isRunning()) { - battle.resume(); - } else { - battleEventDispatcher.onBattleResumed(new BattleResumedEvent()); - } - } - } - - /** - * Steps for a single turn, then goes back to paused - */ - public synchronized void nextTurn() { - if (battle != null && battle.isRunning()) { - battle.step(); - } - } - - public synchronized void prevTurn() { - if (battle != null && battle.isRunning() && battle instanceof BattlePlayer) { - ((BattlePlayer) battle).stepBack(); - } - } - - public synchronized void killRobot(int robotIndex) { - if (battle != null && battle.isRunning() && battle instanceof Battle) { - ((Battle) battle).killRobot(robotIndex); - } - } - - public synchronized void setPaintEnabled(int robotIndex, boolean enable) { - if (battle != null && battle.isRunning()) { - battle.setPaintEnabled(robotIndex, enable); - } - } - - public synchronized void setSGPaintEnabled(int robotIndex, boolean enable) { - if (battle != null && battle.isRunning() && battle instanceof Battle) { - ((Battle) battle).setSGPaintEnabled(robotIndex, enable); - } - } - - public synchronized void sendInteractiveEvent(Event event) { - if (battle != null && battle.isRunning() && !isPaused() && battle instanceof Battle) { - ((Battle) battle).sendInteractiveEvent(event); - } - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BoundingRectangle.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BoundingRectangle.java deleted file mode 100644 index 5257252..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/BoundingRectangle.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -/* - * Class exists to fix two bugs, both related to bug# 4320890 referenced below - * 1. intersectsLine can cause an infinite loop in Java 1.3 - * -- This is why the outcode() method is here, below - * 2. The problem still exists with Rectangle2D.Double as of Java 1.4, - * -- This is why we're using Rectangle2D.Float - * - * @author Mathew A. Nelson (original) - */ -@SuppressWarnings("serial") -public class BoundingRectangle extends java.awt.geom.Rectangle2D.Float { - - public BoundingRectangle() { - super(); - } - - public BoundingRectangle(double x, double y, double w, double h) { - super((float) x, (float) y, (float) w, (float) h); - } - - @Override - public int outcode(double x, double y) { - - /* - * Note on casts to double below. If the arithmetic of - * x+w or y+h is done in float, then some bits may be - * lost if the binary exponents of x/y and w/h are not - * similar. By converting to double before the addition - * we force the addition to be carried out in double to - * avoid rounding error in the comparison. - * - * See bug 4320890 for problems that this inaccuracy causes. - */ - int out = 0; - - if (this.width <= 0) { - out |= OUT_LEFT | OUT_RIGHT; - } else if (x < this.x) { - out |= OUT_LEFT; - } else if (x > this.x + (double) this.width) { - out |= OUT_RIGHT; - } - if (this.height <= 0) { - out |= OUT_TOP | OUT_BOTTOM; - } else if (y < this.y) { - out |= OUT_TOP; - } else if (y > this.y + (double) this.height) { - out |= OUT_BOTTOM; - } - return out; - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Command.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Command.java deleted file mode 100644 index 054c152..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Command.java +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -abstract class Command { - - public void execute() {} -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/IBattle.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/IBattle.java deleted file mode 100644 index 8a35a86..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/IBattle.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -/** - * @author Pavel Savara (original) - */ -interface IBattle extends Runnable { - void cleanup(); - - boolean isRunning(); - - void stop(boolean waitTillEnd); - - void pause(); - - void resume(); - - void step(); - - void waitTillStarted(); - - void waitTillOver(); - - void setPaintEnabled(int robotIndex, boolean enable); -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Module.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Module.java deleted file mode 100644 index bc78da0..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/Module.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.core.Container; -import net.sf.robocode.recording.BattlePlayer; -import net.sf.robocode.recording.IRecordManager; -import net.sf.robocode.recording.RecordManager; - - -/** - * @author Pavel Savara (original) - */ -public class Module { - static { - Container.cache.addComponent(IBattleManager.class, BattleManager.class); - Container.cache.addComponent(BattleEventDispatcher.class); - Container.cache.addComponent(IRecordManager.class, RecordManager.class); - - Container.factory.addComponent(Battle.class); - Container.factory.addComponent(BattlePlayer.class); - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/BulletPeer.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/BulletPeer.java deleted file mode 100644 index 462dfe6..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/BulletPeer.java +++ /dev/null @@ -1,364 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import net.sf.robocode.peer.BulletStatus; -import robocode.*; -import robocode.control.snapshot.BulletState; - -import java.awt.geom.Line2D; -import static java.lang.Math.cos; -import static java.lang.Math.sin; -import java.util.List; - - -public class BulletPeer { - - private static final int EXPLOSION_LENGTH = 17; - - private static final int RADIUS = 3; - - protected final RobotPeer owner; - - private final BattleRules battleRules; - private final int bulletId; - - protected RobotPeer victim; - - protected BulletState state; - - private double heading; - - protected double x; - protected double y; - - private double lastX; - private double lastY; - - protected double power; - - private double deltaX; - private double deltaY; - - private final Line2D.Double boundingLine = new Line2D.Double(); - - protected int frame; // Do not set to -1 - - private final int color; - - protected int explosionImageIndex; // Do not set to -1 - - BulletPeer(RobotPeer owner, BattleRules battleRules, int bulletId) { - super(); - this.owner = owner; - this.battleRules = battleRules; - this.bulletId = bulletId; - state = BulletState.FIRED; - color = owner.getBulletColor(); // Store current bullet color set on robot - } - - private void checkBulletCollision(List bullets) { - for (BulletPeer b : bullets) { - if (b != null && b != this && b.isActive() && intersect(b.boundingLine)) { - // Check if one of the bullets belongs to a sentry robot and is within the safe zone - if (owner.isSentryRobot() || b.getOwner().isSentryRobot()) { - int sentryBorderSize = battleRules.getSentryBorderSize(); - if (x > sentryBorderSize && x < (battleRules.getBattlefieldWidth() - sentryBorderSize) - && y > sentryBorderSize && y < (battleRules.getBattlefieldHeight() - sentryBorderSize)) { - - continue; // Continue, as the sentry should not interfere with bullets in the safe zone - } - } - - state = BulletState.HIT_BULLET; - frame = 0; - x = lastX; - y = lastY; - - b.state = BulletState.HIT_BULLET; - b.frame = 0; - b.x = b.lastX; - b.y = b.lastY; - - // Bugfix #366 - owner.addEvent(new BulletHitBulletEvent(createBullet(false), b.createBullet(true))); - b.owner.addEvent(new BulletHitBulletEvent(b.createBullet(false), createBullet(true))); - break; - } - } - } - - private Bullet createBullet(boolean hideOwnerName) { - String ownerName = (owner == null) ? null : (hideOwnerName ? getNameForEvent(owner) : owner.getName()); - String victimName = (victim == null) ? null : (hideOwnerName ? victim.getName() : getNameForEvent(victim)); - - return new Bullet(heading, x, y, power, ownerName, victimName, isActive(), bulletId); - } - - private BulletStatus createStatus() { - return new BulletStatus(bulletId, x, y, victim == null ? null : getNameForEvent(victim), isActive()); - } - - private String getNameForEvent(RobotPeer otherRobot) { - if (battleRules.getHideEnemyNames() && !owner.isTeamMate(otherRobot)) { - return otherRobot.getAnnonymousName(); - } - return otherRobot.getName(); - } - - // Workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6457965 - private boolean intersect(Line2D.Double line) { - double x1 = line.x1, x2 = line.x2, x3 = boundingLine.x1, x4 = boundingLine.x2; - double y1 = line.y1, y2 = line.y2, y3 = boundingLine.y1, y4 = boundingLine.y2; - - double dx13 = (x1 - x3), dx21 = (x2 - x1), dx43 = (x4 - x3); - double dy13 = (y1 - y3), dy21 = (y2 - y1), dy43 = (y4 - y3); - - double dn = dy43 * dx21 - dx43 * dy21; - - double ua = (dx43 * dy13 - dy43 * dx13) / dn; - double ub = (dx21 * dy13 - dy21 * dx13) / dn; - - return (ua >= 0 && ua <= 1) && (ub >= 0 && ub <= 1); - } - - private void checkRobotCollision(List robots) { - for (RobotPeer otherRobot : robots) { - if (!(otherRobot == null || otherRobot == owner || otherRobot.isDead()) - && otherRobot.getBoundingBox().intersectsLine(boundingLine)) { - - state = BulletState.HIT_VICTIM; - frame = 0; - victim = otherRobot; - - double damage = Rules.getBulletDamage(power); - - if (owner.isSentryRobot()) { - if (victim.isSentryRobot()) { - damage = 0; - } else { - int range = battleRules.getSentryBorderSize(); - if (x > range && x < (battleRules.getBattlefieldWidth() - range) && y > range - && y < (battleRules.getBattlefieldHeight() - range)) { - damage = 0; - } - } - } - - double score = damage; - if (score > otherRobot.getEnergy()) { - score = otherRobot.getEnergy(); - } - otherRobot.updateEnergy(-damage); - - boolean teamFire = (owner.getTeamPeer() != null && owner.getTeamPeer() == otherRobot.getTeamPeer()); - - if (!teamFire && !otherRobot.isSentryRobot()) { - owner.getRobotStatistics().scoreBulletDamage(otherRobot.getName(), score); - } - - if (otherRobot.getEnergy() <= 0 && otherRobot.isAlive()) { - otherRobot.kill(); - if (!teamFire && !otherRobot.isSentryRobot()) { - double bonus = owner.getRobotStatistics().scoreBulletKill(otherRobot.getName()); - if (bonus > 0) { - owner.println( - "SYSTEM: Bonus for killing " - + (owner.getNameForEvent(otherRobot) + ": " + (int) (bonus + .5))); - } - } - } - - if (!victim.isSentryRobot()) { - owner.updateEnergy(Rules.getBulletHitBonus(power)); - } - - otherRobot.addEvent( - new HitByBulletEvent( - robocode.util.Utils.normalRelativeAngle(heading + Math.PI - otherRobot.getBodyHeading()), - createBullet(true))); // Bugfix #366 - - owner.addEvent( - new BulletHitEvent(owner.getNameForEvent(otherRobot), otherRobot.getEnergy(), createBullet(false))); // Bugfix #366 - - double newX, newY; - - if (otherRobot.getBoundingBox().contains(lastX, lastY)) { - newX = lastX; - newY = lastY; - - setX(newX); - setY(newY); - } else { - newX = x; - newY = y; - } - - deltaX = newX - otherRobot.getX(); - deltaY = newY - otherRobot.getY(); - - break; - } - } - } - - private void checkWallCollision() { - if ((x - RADIUS <= 0) || (y - RADIUS <= 0) || (x + RADIUS >= battleRules.getBattlefieldWidth()) - || (y + RADIUS >= battleRules.getBattlefieldHeight())) { - state = BulletState.HIT_WALL; - frame = 0; - owner.addEvent(new BulletMissedEvent(createBullet(false))); // Bugfix #366 - } - } - - public int getBulletId() { - return bulletId; - } - - public int getFrame() { - return frame; - } - - public double getHeading() { - return heading; - } - - public RobotPeer getOwner() { - return owner; - } - - public double getPower() { - return power; - } - - public double getVelocity() { - return Rules.getBulletSpeed(power); - } - - public RobotPeer getVictim() { - return victim; - } - - public double getX() { - return x; - } - - public double getY() { - return y; - } - - public double getPaintX() { - return (state == BulletState.HIT_VICTIM && victim != null) ? victim.getX() + deltaX : x; - } - - public double getPaintY() { - return (state == BulletState.HIT_VICTIM && victim != null) ? victim.getY() + deltaY : y; - } - - public boolean isActive() { - return state.isActive(); - } - - public BulletState getState() { - return state; - } - - public int getColor() { - return color; - } - - public void setHeading(double newHeading) { - heading = newHeading; - } - - public void setPower(double newPower) { - power = newPower; - } - - public void setVictim(RobotPeer newVictim) { - victim = newVictim; - } - - public void setX(double newX) { - x = lastX = newX; - } - - public void setY(double newY) { - y = lastY = newY; - } - - public void setState(BulletState newState) { - state = newState; - } - - public void update(List robots, List bullets) { - frame++; - if (isActive()) { - updateMovement(); - checkWallCollision(); - if (isActive()) { - checkRobotCollision(robots); - } - if (isActive() && bullets != null) { - checkBulletCollision(bullets); - } - } - updateBulletState(); - owner.addBulletStatus(createStatus()); - } - - protected void updateBulletState() { - switch (state) { - case FIRED: - // Note that the bullet must be in the FIRED state before it goes to the MOVING state - if (frame > 0) { - state = BulletState.MOVING; - } - break; - - case HIT_BULLET: - case HIT_VICTIM: - case HIT_WALL: - case EXPLODED: - // Note that the bullet explosion must be ended before it goes into the INACTIVE state - if (frame >= getExplosionLength()) { - state = BulletState.INACTIVE; - } - break; - - default: - } - } - - private void updateMovement() { - lastX = x; - lastY = y; - - double v = getVelocity(); - - x += v * sin(heading); - y += v * cos(heading); - - boundingLine.setLine(lastX, lastY, x, y); - } - - public int getExplosionImageIndex() { - return explosionImageIndex; - } - - protected int getExplosionLength() { - return EXPLOSION_LENGTH; - } - - @Override - public String toString() { - return getOwner().getName() + " V" + getVelocity() + " *" + (int) power + " X" + (int) x + " Y" + (int) y + " H" - + heading + " " + state.toString(); - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantPeer.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantPeer.java deleted file mode 100644 index 8030135..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantPeer.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public interface ContestantPeer extends Comparable { - String getName(); - - int getRobotIndex(); - int getTeamIndex(); - - ContestantStatistics getStatistics(); - - String toString(); -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantStatistics.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantStatistics.java deleted file mode 100644 index 73d61e0..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ContestantStatistics.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import robocode.BattleResults; - - -/** - * @author Mathew A. Nelson (original) - * @author Luis Crespo (contributor) - * @author Flemming N. Larsen (contributor) - */ -public interface ContestantStatistics { // NO_UCD (use default) - double getTotalScore(); - - double getTotalSurvivalScore(); - - double getTotalLastSurvivorBonus(); - - double getTotalBulletDamageScore(); - - double getTotalBulletKillBonus(); - - double getTotalRammingDamageScore(); - - double getTotalRammingKillBonus(); - - int getTotalFirsts(); - - int getTotalSeconds(); - - int getTotalThirds(); - - double getCurrentScore(); - - double getCurrentSurvivalScore(); - - double getCurrentSurvivalBonus(); - - double getCurrentBulletDamageScore(); - - double getCurrentBulletKillBonus(); - - double getCurrentRammingDamageScore(); - - double getCurrentRammingKillBonus(); - - BattleResults getFinalResults(); - - void setRank(int rank); -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ExplosionPeer.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ExplosionPeer.java deleted file mode 100644 index e2c470c..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/ExplosionPeer.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import robocode.BattleRules; -import robocode.control.snapshot.BulletState; - -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Luis Crespo (contributor) - * @author Flemming N. Larsen (contributor) - * @author Titus Chen (contributor) - */ -public class ExplosionPeer extends BulletPeer { - - private static final int EXPLOSION_LENGTH = 71; - - ExplosionPeer(RobotPeer owner, BattleRules battleRules) { - super(owner, battleRules, 0); - frame = 0; - x = owner.getX(); - y = owner.getY(); - victim = owner; - power = 1; - state = BulletState.EXPLODED; - explosionImageIndex = 1; - } - - @Override - public final void update(List robots, List bullets) { - frame++; - - x = owner.getX(); - y = owner.getY(); - - updateBulletState(); - } - - @Override - protected int getExplosionLength() { - return EXPLOSION_LENGTH; - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/IRobotPeerBattle.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/IRobotPeerBattle.java deleted file mode 100644 index 18a9d85..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/IRobotPeerBattle.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import robocode.Event; -import robocode.control.RobotSetup; - -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -interface IRobotPeerBattle extends ContestantPeer { - void setSGPaintEnabled(boolean enabled); - - RobotStatistics getRobotStatistics(); - - TeamPeer getTeamPeer(); - - void publishStatus(long currentTurn); - - void addEvent(Event event); - - void setPaintEnabled(boolean enabled); - - void kill(); - - void cleanup(); - - boolean isDead(); - - boolean isAlive(); - - boolean isRunning(); - - boolean isWinner(); - - boolean isTeamLeader(); - - void setHalt(boolean value); - - void println(String s); - - void waitWakeup(); - - void waitSleeping(long millisWait, int nanosWait); - - void waitForStop(); - - void setWinner(boolean newWinner); - - void initializeRound(List robots, RobotSetup[] initialRobotPositions); - - void startRound(long millisWait, int nanosWait); - - void checkSkippedTurn(); - - void performLoadCommands(); - - void performMove(List robots, double zapEnergy); - - void performScan(List robots); -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotPeer.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotPeer.java deleted file mode 100644 index c41d9fe..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotPeer.java +++ /dev/null @@ -1,1764 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import static net.sf.robocode.io.Logger.logMessage; -import net.sf.robocode.battle.Battle; -import net.sf.robocode.battle.BoundingRectangle; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.host.RobotStatics; -import net.sf.robocode.host.events.EventManager; -import net.sf.robocode.host.events.EventQueue; -import net.sf.robocode.host.proxies.IHostingRobotProxy; -import net.sf.robocode.io.Logger; -import net.sf.robocode.peer.*; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.serialization.RbSerializer; -import robocode.*; -import robocode.control.RandomFactory; -import robocode.control.RobotSetup; -import robocode.control.RobotSpecification; -import robocode.control.snapshot.BulletState; -import robocode.control.snapshot.RobotState; -import robocode.exception.AbortedException; -import robocode.exception.DeathException; -import robocode.exception.WinException; -import static robocode.util.Utils.*; - -import java.awt.geom.Arc2D; -import java.awt.geom.Rectangle2D; -import java.io.IOException; - -import static java.lang.Math.*; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; - - -/** - * RobotPeer is an object that deals with game mechanics and rules, and makes - * sure that robots abides the rules. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Luis Crespo (contributor) - * @author Titus Chen (contributor) - * @author Robert D. Maupin (contributor) - * @author Nathaniel Troutman (contributor) - * @author Pavel Savara (contributor) - * @author Patrick Cupka (contributor) - * @author Julian Kent (contributor) - * @author "Positive" (contributor) - * @author "BD123" (contributor) - */ -public final class RobotPeer implements IRobotPeerBattle, IRobotPeer { - - public static final int - WIDTH = 36, - HEIGHT = 36; - - private static final int - HALF_WIDTH_OFFSET = WIDTH / 2, - HALF_HEIGHT_OFFSET = HEIGHT / 2; - - private static final int MAX_SKIPPED_TURNS = 30; - private static final int MAX_SKIPPED_TURNS_WITH_IO = 240; - - private Battle battle; - private RobotStatistics statistics; - private final TeamPeer teamPeer; - private final RobotSpecification robotSpecification; - - private IHostingRobotProxy robotProxy; - private AtomicReference status = new AtomicReference(); - private AtomicReference commands = new AtomicReference(); - private AtomicReference events = new AtomicReference(new EventQueue()); - private AtomicReference> teamMessages = new AtomicReference>( - new ArrayList()); - private AtomicReference> bulletUpdates = new AtomicReference>( - new ArrayList()); - - // thread is running - private final AtomicBoolean isRunning = new AtomicBoolean(false); - - private final StringBuilder battleText = new StringBuilder(1024); - private final StringBuilder proxyText = new StringBuilder(1024); - private RobotStatics statics; - private BattleRules battleRules; - - // for battle thread, during robots processing - private ExecCommands currentCommands; - private double lastHeading; - private double lastGunHeading; - private double lastRadarHeading; - - private double energy; - private double velocity; - private double bodyHeading; - private double radarHeading; - private double gunHeading; - private double gunHeat; - private double x; - private double y; - - private boolean scan; - private boolean turnedRadarWithGun; // last round - - private boolean isIORobot; - private boolean isPaintEnabled; - private boolean sgPaintEnabled; - - // waiting for next tick - private final AtomicBoolean isSleeping = new AtomicBoolean(false); - private final AtomicBoolean halt = new AtomicBoolean(false); - - // last and current execution time and detecting skipped turns - private int lastExecutionTime = -1; - private int currentExecutionTime; - - private boolean isExecFinishedAndDisabled; - private boolean isEnergyDrained; - private boolean isWinner; - private boolean inCollision; - private boolean isOverDriving; - - private RobotState state; - private final Arc2D scanArc; - private final BoundingRectangle boundingBox; - private final RbSerializer rbSerializer; - - public RobotPeer(Battle battle, IHostManager hostManager, RobotSpecification robotSpecification, int duplicate, TeamPeer team, int robotIndex) { - super(); - - this.battle = battle; - this.robotSpecification = robotSpecification; - - this.rbSerializer = new RbSerializer(); - - this.boundingBox = new BoundingRectangle(); - this.scanArc = new Arc2D.Double(); - this.teamPeer = team; - this.state = RobotState.ACTIVE; - this.battleRules = battle.getBattleRules(); - - if (team != null) { - team.add(this); - } - String teamName; - List teamMembers; - boolean isTeamLeader; - int teamIndex; - - if (teamPeer == null) { - teamName = null; - teamMembers = null; - isTeamLeader = false; - teamIndex = -1; // Must be set to -1 when robot is not in a team - } else { - teamName = team.getName(); - teamMembers = team.getMemberNames(); - isTeamLeader = team.size() == 1; // That is current team size, more might follow later. First robot is leader - teamIndex = team.getTeamIndex(); - } - - this.statics = new RobotStatics(robotSpecification, duplicate, isTeamLeader, battleRules, teamName, teamMembers, - robotIndex, teamIndex); - this.statistics = new RobotStatistics(this, battle.getRobotsCount()); - - this.robotProxy = (IHostingRobotProxy) hostManager.createRobotProxy(robotSpecification, statics, this); - } - - public void println(String s) { - synchronized (proxyText) { - battleText.append(s); - battleText.append("\n"); - } - } - - private void print(String s) { - synchronized (proxyText) { - proxyText.append(s); - } - } - - public String readOutText() { - synchronized (proxyText) { - final String robotText = battleText.toString() + proxyText.toString(); - - battleText.setLength(0); - proxyText.setLength(0); - return robotText; - } - } - - public RobotStatistics getRobotStatistics() { - return statistics; - } - - public ContestantStatistics getStatistics() { - return statistics; - } - - public RobotSpecification getRobotSpecification() { - return robotSpecification; - } - - // ------------------- - // statics - // ------------------- - - public boolean isJuniorRobot() { - return statics.isJuniorRobot(); - } - - public boolean isAdvancedRobot() { - return statics.isAdvancedRobot(); - } - - public boolean isTeamRobot() { - return statics.isTeamRobot(); - } - - public boolean isDroid() { - return statics.isDroid(); - } - - public boolean isSentryRobot() { - return statics.isSentryRobot(); - } - - public boolean isInteractiveRobot() { - return statics.isInteractiveRobot(); - } - - public boolean isPaintRobot() { - return statics.isPaintRobot(); - } - - public String getName() { - return statics.getName(); - } - - public String getAnnonymousName() { - return statics.getAnnonymousName(); - } - - public String getShortName() { - return statics.getShortName(); - } - - public String getVeryShortName() { - return statics.getVeryShortName(); - } - - public int getRobotIndex() { - return statics.getRobotIndex(); - } - - public int getTeamIndex() { - return statics.getTeamIndex(); - } - - public int getContestantIndex() { - return getTeamIndex() >= 0 ? getTeamIndex() : getRobotIndex(); - } - - // ------------------- - // status - // ------------------- - - public void setPaintEnabled(boolean enabled) { - isPaintEnabled = enabled; - } - - public boolean isPaintEnabled() { - return isPaintEnabled; - } - - public void setSGPaintEnabled(boolean enabled) { - sgPaintEnabled = enabled; - } - - public boolean isSGPaintEnabled() { - return sgPaintEnabled; - } - - public RobotState getState() { - return state; - } - - public void setState(RobotState state) { - this.state = state; - } - - public boolean isDead() { - return state == RobotState.DEAD; - } - - public boolean isAlive() { - return state != RobotState.DEAD; - } - - public boolean isWinner() { - return isWinner; - } - - public boolean isRunning() { - return isRunning.get(); - } - - public boolean isSleeping() { - return isSleeping.get(); - } - - public boolean isHalt() { - return halt.get(); - } - - public void setHalt(boolean value) { - halt.set(value); - } - - public BoundingRectangle getBoundingBox() { - return boundingBox; - } - - public Arc2D getScanArc() { - return scanArc; - } - - // ------------------- - // robot space - // ------------------- - - public double getGunHeading() { - return gunHeading; - } - - public double getBodyHeading() { - return bodyHeading; - } - - public double getRadarHeading() { - return radarHeading; - } - - public double getVelocity() { - return velocity; - } - - public double getX() { - return x; - } - - public double getY() { - return y; - } - - public double getEnergy() { - return energy; - } - - public double getGunHeat() { - return gunHeat; - } - - public int getBodyColor() { - return commands.get().getBodyColor(); - } - - public int getRadarColor() { - return commands.get().getRadarColor(); - } - - public int getGunColor() { - return commands.get().getGunColor(); - } - - public int getBulletColor() { - return commands.get().getBulletColor(); - } - - public int getScanColor() { - return commands.get().getScanColor(); - } - - // ------------ - // team - // ------------ - - public TeamPeer getTeamPeer() { - return teamPeer; - } - - public String getTeamName() { - return statics.getTeamName(); - } - - public boolean isTeamLeader() { - return statics.isTeamLeader(); - } - - boolean isTeamMate(RobotPeer otherRobot) { - if (getTeamPeer() != null) { - for (RobotPeer mate : getTeamPeer()) { - if (otherRobot == mate) { - return true; - } - } - } - return false; - } - - // ----------- - // execute - // ----------- - - private ByteBuffer bidirectionalBuffer; - - public void setupBuffer(ByteBuffer bidirectionalBuffer) { - this.bidirectionalBuffer = bidirectionalBuffer; - } - - public void setupThread() { - Thread.currentThread().setName(getName()); - } - - public void executeImplSerial() throws IOException { - ExecCommands commands = (ExecCommands) rbSerializer.deserialize(bidirectionalBuffer); - - final ExecResults results = executeImpl(commands); - - bidirectionalBuffer.clear(); - rbSerializer.serializeToBuffer(bidirectionalBuffer, RbSerializer.ExecResults_TYPE, results); - } - - public void waitForBattleEndImplSerial() throws IOException { - ExecCommands commands = (ExecCommands) rbSerializer.deserialize(bidirectionalBuffer); - - final ExecResults results = waitForBattleEndImpl(commands); - - bidirectionalBuffer.clear(); - rbSerializer.serializeToBuffer(bidirectionalBuffer, RbSerializer.ExecResults_TYPE, results); - } - - public final ExecResults executeImpl(ExecCommands newCommands) { - validateCommands(newCommands); - - if (!isExecFinishedAndDisabled) { - // from robot to battle - commands.set(new ExecCommands(newCommands, true)); - print(newCommands.getOutputText()); - } else { - // slow down spammer - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - - // If we are stopping, yet the robot took action (in onWin or onDeath), stop now. - if (battle.isAborted()) { - isExecFinishedAndDisabled = true; - throw new AbortedException(); - } - if (isDead()) { - isExecFinishedAndDisabled = true; - throw new DeathException(); - } - if (isHalt()) { - isExecFinishedAndDisabled = true; - if (isWinner) { - throw new WinException(); - } else { - throw new AbortedException(); - } - } - - waitForNextTurn(); - - checkSkippedTurn(); - - // from battle to robot - final ExecCommands resCommands = new ExecCommands(this.commands.get(), false); - final RobotStatus resStatus = status.get(); - - final boolean shouldWait = battle.isAborted() || (battle.isLastRound() && isWinner()); - - return new ExecResults(resCommands, resStatus, readoutEvents(), readoutTeamMessages(), readoutBullets(), - isHalt(), shouldWait, isPaintEnabled()); - } - - public final ExecResults waitForBattleEndImpl(ExecCommands newCommands) { - if (!isHalt()) { - // from robot to battle - commands.set(new ExecCommands(newCommands, true)); - print(newCommands.getOutputText()); - - waitForNextTurn(); - } - // from battle to robot - final ExecCommands resCommands = new ExecCommands(this.commands.get(), false); - final RobotStatus resStatus = status.get(); - - final boolean shouldWait = battle.isAborted() || (battle.isLastRound() && !isWinner()); - - readoutTeamMessages(); // throw away - - return new ExecResults(resCommands, resStatus, readoutEvents(), new ArrayList(), readoutBullets(), - isHalt(), shouldWait, false); - } - - private void validateCommands(ExecCommands newCommands) { - if (Double.isNaN(newCommands.getMaxTurnRate())) { - println("You cannot setMaxTurnRate to: " + newCommands.getMaxTurnRate()); - } - newCommands.setMaxTurnRate(Math.min(abs(newCommands.getMaxTurnRate()), Rules.MAX_TURN_RATE_RADIANS)); - - if (Double.isNaN(newCommands.getMaxVelocity())) { - println("You cannot setMaxVelocity to: " + newCommands.getMaxVelocity()); - } - newCommands.setMaxVelocity(Math.min(abs(newCommands.getMaxVelocity()), Rules.MAX_VELOCITY)); - } - - private List readoutEvents() { - return events.getAndSet(new EventQueue()); - } - - private List readoutTeamMessages() { - return teamMessages.getAndSet(new ArrayList()); - } - - private List readoutBullets() { - return bulletUpdates.getAndSet(new ArrayList()); - } - - private void waitForNextTurn() { - synchronized (isSleeping) { - // Notify the battle that we are now asleep. - // This ends any pending wait() call in battle.runRound(). - // Should not actually take place until we release the lock in wait(), below. - isSleeping.set(true); - isSleeping.notifyAll(); - // Notifying battle that we're asleep - // Sleeping and waiting for battle to wake us up. - try { - isSleeping.wait(); - } catch (InterruptedException e) { - // We are expecting this to happen when a round is ended! - - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - isSleeping.set(false); - // Notify battle thread, which is waiting in - // our wakeup() call, to return. - // It's quite possible, by the way, that we'll be back in sleep (above) - // before the battle thread actually wakes up - isSleeping.notifyAll(); - } - } - - // ----------- - // called on battle thread - // ----------- - - public void waitWakeup() { - synchronized (isSleeping) { - if (isSleeping()) { - // Wake up the thread - isSleeping.notifyAll(); - try { - isSleeping.wait(10000); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - } - } - } - - private void waitWakeupNoWait() { - synchronized (isSleeping) { - if (isSleeping()) { - // Wake up the thread - isSleeping.notifyAll(); - } - } - } - - public void waitSleeping(long millisWait, int nanosWait) { - synchronized (isSleeping) { - // It's quite possible for simple robots to - // complete their processing before we get here, - // so we test if the robot is already asleep. - - if (!isSleeping()) { - try { - for (long i = millisWait; i > 0 && !isSleeping() && isRunning(); i--) { - isSleeping.wait(0, 999999); - } - if (!isSleeping() && isRunning()) { - isSleeping.wait(0, nanosWait); - } - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - logMessage("Wait for " + getName() + " interrupted."); - } - } - } - } - - public void checkSkippedTurn() { - // Store last and current execution time for detecting skipped turns - lastExecutionTime = currentExecutionTime; - currentExecutionTime = battle.getTime(); - - int numSkippedTurns = (currentExecutionTime - lastExecutionTime) - 1; - if (numSkippedTurns >= 1) { - events.get().clear(false); - - if (isAlive()) { - for (int skippedTurn = lastExecutionTime + 1; skippedTurn < currentExecutionTime; skippedTurn++) { - addEvent(new SkippedTurnEvent(skippedTurn)); - println("SYSTEM: " + getShortName() + " skipped turn " + skippedTurn); - } - } - - if ((!isIORobot && (numSkippedTurns > MAX_SKIPPED_TURNS)) - || (isIORobot && (numSkippedTurns > MAX_SKIPPED_TURNS_WITH_IO))) { - println("SYSTEM: " + getShortName() + " has not performed any actions in a reasonable amount of time."); - println("SYSTEM: No score will be generated."); - setHalt(true); - waitWakeupNoWait(); - punishBadBehavior(BadBehavior.SKIPPED_TOO_MANY_TURNS); - robotProxy.forceStopThread(); - } - } - } - - public void initializeRound(List robots, RobotSetup[] initialRobotSetups) { - boolean valid = false; - - if (initialRobotSetups != null) { - int robotIndex = statics.getRobotIndex(); - - if (robotIndex >= 0 && robotIndex < initialRobotSetups.length) { - RobotSetup setup = initialRobotSetups[robotIndex]; - if (setup != null) { - x = setup.getX(); - y = setup.getY(); - bodyHeading = gunHeading = radarHeading = setup.getHeading(); - - updateBoundingBox(); - valid = validSpot(robots); - } - } - } - - if (!valid) { - final Random random = RandomFactory.getRandom(); - - double maxWidth = battleRules.getBattlefieldWidth() - RobotPeer.WIDTH; - double maxHeight = battleRules.getBattlefieldHeight() - RobotPeer.HEIGHT; - - double halfRobotWidth = RobotPeer.WIDTH / 2; - double halfRobotHeight = RobotPeer.HEIGHT / 2; - - int sentryBorderSize = battle.getBattleRules().getSentryBorderSize(); - int sentryBorderMoveWidth = sentryBorderSize - RobotPeer.WIDTH; - int sentryBorderMoveHeight = sentryBorderSize - RobotPeer.HEIGHT; - - for (int j = 0; j < 1000; j++) { - double rndX = random.nextDouble(); - double rndY = random.nextDouble(); - - if (isSentryRobot()) { - boolean placeOnHorizontalBar = random.nextDouble() - <= ((double) battleRules.getBattlefieldWidth() - / (battleRules.getBattlefieldWidth() + battleRules.getBattlefieldHeight())); - - if (placeOnHorizontalBar) { - x = halfRobotWidth + rndX * maxWidth; - y = halfRobotHeight + (sentryBorderMoveHeight * (rndY * 2.0 - 1.0) + maxHeight) % maxHeight; - } else { - y = halfRobotHeight + rndY * maxHeight; - x = halfRobotWidth + (sentryBorderMoveWidth * (rndX * 2.0 - 1.0) + maxWidth) % maxWidth; - } - } else { - if (battle.countActiveSentries() > 0) { - int safeZoneWidth = battleRules.getBattlefieldWidth() - 2 * sentryBorderSize; - int safeZoneHeight = battleRules.getBattlefieldHeight() - 2 * sentryBorderSize; - - x = sentryBorderSize + RobotPeer.WIDTH + rndX * (safeZoneWidth - 2 * RobotPeer.WIDTH); - y = sentryBorderSize + RobotPeer.HEIGHT + rndY * (safeZoneHeight - 2 * RobotPeer.HEIGHT); - } else { - x = RobotPeer.WIDTH + rndX * (battleRules.getBattlefieldWidth() - 2 * RobotPeer.WIDTH); - y = RobotPeer.HEIGHT + rndY * (battleRules.getBattlefieldHeight() - 2 * RobotPeer.HEIGHT); - } - } - - bodyHeading = 2 * Math.PI * random.nextDouble(); - gunHeading = radarHeading = bodyHeading; - updateBoundingBox(); - - if (validSpot(robots)) { - break; - } - } - } - - setState(RobotState.ACTIVE); - - isWinner = false; - velocity = 0; - - energy = 100; - if (statics.isSentryRobot()) { - energy += 400; - } - if (statics.isTeamLeader()) { - energy += 100; - } - if (statics.isDroid()) { - energy += 20; - } - - gunHeat = 3; - - setHalt(false); - isExecFinishedAndDisabled = false; - isEnergyDrained = false; - - scan = false; - - inCollision = false; - - scanArc.setAngleStart(0); - scanArc.setAngleExtent(0); - scanArc.setFrame(-100, -100, 1, 1); - - lastExecutionTime = -1; - - status = new AtomicReference(); - - readoutEvents(); - readoutTeamMessages(); - readoutBullets(); - - battleText.setLength(0); - proxyText.setLength(0); - - // Prepare new execution commands, but copy the colors from the last commands. - // Bugfix [2628217] - Robot Colors don't stick between rounds. - ExecCommands newExecCommands = new ExecCommands(); - - newExecCommands.copyColors(commands.get()); - commands = new AtomicReference(newExecCommands); - } - - private boolean validSpot(List robots) { - for (RobotPeer otherRobot : robots) { - if (otherRobot != null && otherRobot != this) { - if (getBoundingBox().intersects(otherRobot.getBoundingBox())) { - return false; - } - } - } - return true; - } - - public void startRound(long waitMillis, int waitNanos) { - Logger.logMessage(".", false); - - statistics.reset(); - - ExecCommands newExecCommands = new ExecCommands(); - - // Copy the colors from the last commands. - // Bugfix [2628217] - Robot Colors don't stick between rounds. - newExecCommands.copyColors(commands.get()); - - currentCommands = newExecCommands; - - int others = battle.countActiveParticipants() - (isAlive() ? 1 : 0); - int numSentries = battle.countActiveSentries(); - - RobotStatus stat = HiddenAccess.createStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, - currentCommands.getBodyTurnRemaining(), currentCommands.getRadarTurnRemaining(), - currentCommands.getGunTurnRemaining(), currentCommands.getDistanceRemaining(), gunHeat, others, numSentries, - battle.getRoundNum(), battle.getNumRounds(), battle.getTime()); - - status.set(stat); - robotProxy.startRound(currentCommands, stat); - - synchronized (isSleeping) { - try { - // Wait for the robot to go to sleep (take action) - isSleeping.wait(waitMillis, waitNanos); - } catch (InterruptedException e) { - logMessage("Wait for " + getName() + " interrupted."); - - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - } - if (!isSleeping() && !battle.isDebugging()) { - logMessage("\n" + getName() + " still has not started after " + waitMillis + " ms... giving up."); - } - } - - public void performLoadCommands() { - currentCommands = commands.get(); - - fireBullets(currentCommands.getBullets()); - - if (currentCommands.isScan()) { - scan = true; - } - - if (currentCommands.isIORobot()) { - isIORobot = true; - } - - if (currentCommands.isMoved()) { - currentCommands.setMoved(false); - } - } - - private void fireBullets(List bulletCommands) { - BulletPeer newBullet = null; - - for (BulletCommand bulletCmd : bulletCommands) { - if (Double.isNaN(bulletCmd.getPower())) { - println("SYSTEM: You cannot call fire(NaN)"); - continue; - } - if (gunHeat > 0 || energy == 0) { - return; - } - - double firePower = min(energy, - min(max(bulletCmd.getPower(), Rules.MIN_BULLET_POWER), Rules.MAX_BULLET_POWER)); - - updateEnergy(-firePower); - - gunHeat += Rules.getGunHeat(firePower); - - newBullet = new BulletPeer(this, battleRules, bulletCmd.getBulletId()); - - newBullet.setPower(firePower); - if (!turnedRadarWithGun || !bulletCmd.isFireAssistValid() || statics.isAdvancedRobot()) { - newBullet.setHeading(gunHeading); - } else { - newBullet.setHeading(bulletCmd.getFireAssistAngle()); - } - newBullet.setX(x); - newBullet.setY(y); - } - // there is only last bullet in one turn - if (newBullet != null) { - // newBullet.update(robots, bullets); - battle.addBullet(newBullet); - } - } - - public final void performMove(List robots, double zapEnergy) { - - // Reset robot state to active if it is not dead - if (isDead()) { - return; - } - - setState(RobotState.ACTIVE); - - updateGunHeat(); - - lastHeading = bodyHeading; - lastGunHeading = gunHeading; - lastRadarHeading = radarHeading; - final double lastX = x; - final double lastY = y; - - if (!inCollision) { - updateHeading(); - } - - updateGunHeading(); - updateRadarHeading(); - updateMovement(); - - // At this point, robot has turned then moved. - // We could be touching a wall or another bot... - - // First and foremost, we can never go through a wall: - checkWallCollision(); - - // If this robot is a border sentry robot then check if it hits its "range border" - if (isSentryRobot()) { - checkSentryOutsideBorder(); - } - - // Now check for robot collision - checkRobotCollision(robots); - - // Scan false means robot did not call scan() manually. - // But if we're moving, scan - if (!scan) { - scan = (lastHeading != bodyHeading || lastGunHeading != gunHeading || lastRadarHeading != radarHeading - || lastX != x || lastY != y); - } - - if (isDead()) { - return; - } - - // zap - if (zapEnergy != 0) { - zap(zapEnergy); - } - } - - public void performScan(List robots) { - if (isDead()) { - return; - } - - turnedRadarWithGun = false; - // scan - if (scan) { - scan(lastRadarHeading, robots); - turnedRadarWithGun = (lastGunHeading == lastRadarHeading) && (gunHeading == radarHeading); - scan = false; - } - - // dispatch messages - if (statics.isTeamRobot() && teamPeer != null) { - for (TeamMessage teamMessage : currentCommands.getTeamMessages()) { - for (RobotPeer member : teamPeer) { - if (checkDispatchToMember(member, teamMessage.recipient)) { - member.addTeamMessage(teamMessage); - } - } - } - } - currentCommands = null; - lastHeading = -1; - lastGunHeading = -1; - lastRadarHeading = -1; - } - - private void addTeamMessage(TeamMessage message) { - final List queue = teamMessages.get(); - - queue.add(message); - } - - private boolean checkDispatchToMember(RobotPeer member, String recipient) { - if (member.isAlive()) { - if (recipient == null) { - if (member != this) { - return true; - } - } else { - final int nl = recipient.length(); - final String currentName = member.statics.getName(); - - if ((currentName.length() >= nl && currentName.substring(0, nl).equals(recipient))) { - return true; - } - - final String currentClassName = member.statics.getFullClassName(); - - if ((currentClassName.length() >= nl && currentClassName.substring(0, nl).equals(recipient))) { - return true; - } - - } - } - return false; - } - - public String getNameForEvent(RobotPeer otherRobot) { - if (battleRules.getHideEnemyNames() && !isTeamMate(otherRobot)) { - return otherRobot.getAnnonymousName(); - } - return otherRobot.getName(); - } - - private void checkRobotCollision(List robots) { - inCollision = false; - - for (RobotPeer otherRobot : robots) { - if (!(otherRobot == null || otherRobot == this || otherRobot.isDead()) - && boundingBox.intersects(otherRobot.boundingBox)) { - // Bounce back - double angle = atan2(otherRobot.x - x, otherRobot.y - y); - - double movedx = velocity * sin(bodyHeading); - double movedy = velocity * cos(bodyHeading); - - boolean atFault; - double bearing = normalRelativeAngle(angle - bodyHeading); - - if ((velocity > 0 && bearing > -PI / 2 && bearing < PI / 2) - || (velocity < 0 && (bearing < -PI / 2 || bearing > PI / 2))) { - - inCollision = true; - atFault = true; - velocity = 0; - currentCommands.setDistanceRemaining(0); - x -= movedx; - y -= movedy; - - boolean teamFire = (teamPeer != null && teamPeer == otherRobot.teamPeer); - - if (!teamFire && !otherRobot.isSentryRobot()) { - statistics.scoreRammingDamage(otherRobot.getName()); - } - - this.updateEnergy(-Rules.ROBOT_HIT_DAMAGE); - otherRobot.updateEnergy(-Rules.ROBOT_HIT_DAMAGE); - - if (otherRobot.energy == 0) { - if (otherRobot.isAlive()) { - otherRobot.kill(); - if (!teamFire && !otherRobot.isSentryRobot()) { - final double bonus = statistics.scoreRammingKill(otherRobot.getName()); - - if (bonus > 0) { - println( - "SYSTEM: Ram bonus for killing " + this.getNameForEvent(otherRobot) + ": " - + (int) (bonus + .5)); - } - } - } - } - addEvent( - new HitRobotEvent(getNameForEvent(otherRobot), normalRelativeAngle(angle - bodyHeading), - otherRobot.energy, atFault)); - otherRobot.addEvent( - new HitRobotEvent(getNameForEvent(this), - normalRelativeAngle(PI + angle - otherRobot.getBodyHeading()), energy, false)); - } - } - } - if (inCollision) { - setState(RobotState.HIT_ROBOT); - } - } - - private void checkWallCollision() { - int minX = 0 + HALF_WIDTH_OFFSET; - int minY = 0 + HALF_HEIGHT_OFFSET; - int maxX = (int) getBattleFieldWidth() - HALF_WIDTH_OFFSET; - int maxY = (int) getBattleFieldHeight() - HALF_HEIGHT_OFFSET; - - boolean hitWall = false; - double adjustX = 0, adjustY = 0; - double angle = 0; - - if (x < minX) { - hitWall = true; - adjustX = minX - x; - angle = normalRelativeAngle(3 * PI / 2 - bodyHeading); - - } else if (x > maxX) { - hitWall = true; - adjustX = maxX - x; - angle = normalRelativeAngle(PI / 2 - bodyHeading); - - } else if (y < minY) { - hitWall = true; - adjustY = minY - y; - angle = normalRelativeAngle(PI - bodyHeading); - - } else if (y > maxY) { - hitWall = true; - adjustY = maxY - y; - angle = normalRelativeAngle(-bodyHeading); - } - - if (hitWall) { - addEvent(new HitWallEvent(angle)); - - // only fix both x and y values if hitting wall at an angle - if ((bodyHeading % (Math.PI / 2)) != 0) { - double tanHeading = tan(bodyHeading); - - // if it hits bottom or top wall - if (adjustX == 0) { - adjustX = adjustY * tanHeading; - } // if it hits a side wall - else if (adjustY == 0) { - adjustY = adjustX / tanHeading; - } // if the robot hits 2 walls at the same time (rare, but just in case) - else if (abs(adjustX / tanHeading) > abs(adjustY)) { - adjustY = adjustX / tanHeading; - } else if (abs(adjustY * tanHeading) > abs(adjustX)) { - adjustX = adjustY * tanHeading; - } - } - x += adjustX; - y += adjustY; - - if (x < minX) { - x = minX; - } else if (x > maxX) { - x = maxX; - } - if (y < minY) { - y = minY; - } else if (y > maxY) { - y = maxY; - } - - // Update energy, but do not reset inactiveTurnCount - if (statics.isAdvancedRobot()) { - setEnergy(energy - Rules.getWallHitDamage(velocity), false); - } - - updateBoundingBox(); - - currentCommands.setDistanceRemaining(0); - velocity = 0; - - setState(RobotState.HIT_WALL); - } - } - - private void checkSentryOutsideBorder() { - int range = battle.getBattleRules().getSentryBorderSize(); - - int minX = range - HALF_WIDTH_OFFSET; - int minY = range - HALF_HEIGHT_OFFSET; - int maxX = (int) getBattleFieldWidth() - range + HALF_WIDTH_OFFSET; - int maxY = (int) getBattleFieldHeight() - range + HALF_HEIGHT_OFFSET; - - boolean hitWall = false; - double adjustX = 0, adjustY = 0; - double angle = 0; - - boolean isOutsideBorder = x > minX && x < maxX && y > minY && y < maxY; - - if (isOutsideBorder) { - if ((x - minX) <= Rules.MAX_VELOCITY) { - hitWall = true; - adjustX = minX - x; - angle = normalRelativeAngle(PI / 2 - bodyHeading); - - } else if ((maxX - x) <= Rules.MAX_VELOCITY) { - hitWall = true; - adjustX = maxX - x; - angle = normalRelativeAngle(3 * PI / 2 - bodyHeading); - - } else if ((y - minY) <= Rules.MAX_VELOCITY) { - hitWall = true; - adjustY = minY - y; - angle = normalRelativeAngle(-bodyHeading); - - } else if ((maxY - y) <= Rules.MAX_VELOCITY) { - hitWall = true; - adjustY = maxY - y; - angle = normalRelativeAngle(PI - bodyHeading); - } - } - - if (hitWall) { - addEvent(new HitWallEvent(angle)); - - // only fix both x and y values if hitting wall at an angle - if ((bodyHeading % (Math.PI / 2)) != 0) { - double tanHeading = tan(bodyHeading); - - // if it hits bottom or top wall - if (adjustX == 0) { - adjustX = adjustY * tanHeading; - } // if it hits a side wall - else if (adjustY == 0) { - adjustY = adjustX / tanHeading; - } // if the robot hits 2 walls at the same time (rare, but just in case) - else if (abs(adjustX / tanHeading) > abs(adjustY)) { - adjustY = adjustX / tanHeading; - } else if (abs(adjustY * tanHeading) > abs(adjustX)) { - adjustX = adjustY * tanHeading; - } - } - - x += adjustX; - y += adjustY; - - if (isOutsideBorder) { - if ((x - minX) <= Rules.MAX_VELOCITY) { - x = minX; - } else if ((maxX - x) <= Rules.MAX_VELOCITY) { - x = maxX; - } - if ((y - minY) <= Rules.MAX_VELOCITY) { - y = minY; - } else if ((maxY - y) <= Rules.MAX_VELOCITY) { - y = maxY; - } - } - - // Update energy, but do not reset inactiveTurnCount - if (statics.isAdvancedRobot()) { - setEnergy(energy - Rules.getWallHitDamage(velocity), false); - } - - updateBoundingBox(); - - currentCommands.setDistanceRemaining(0); - velocity = 0; - - setState(RobotState.HIT_WALL); - } - } - - private double getBattleFieldHeight() { - return battleRules.getBattlefieldHeight(); - } - - private double getBattleFieldWidth() { - return battleRules.getBattlefieldWidth(); - } - - private void updateBoundingBox() { - boundingBox.setRect(x - HALF_WIDTH_OFFSET, y - HALF_HEIGHT_OFFSET, WIDTH, HEIGHT); - } - - // TODO: Only add events to robots that are alive? + Remove checks if the Robot is alive before adding the event? - public void addEvent(Event event) { - if (isRunning()) { - final EventQueue queue = events.get(); - - if ((queue.size() > EventManager.MAX_QUEUE_SIZE) - && !(event instanceof DeathEvent || event instanceof WinEvent || event instanceof SkippedTurnEvent)) { - println( - "Not adding to " + statics.getShortName() + "'s queue, exceeded " + EventManager.MAX_QUEUE_SIZE - + " events in queue."); - // clean up old stuff - queue.clear(battle.getTime() - EventManager.MAX_EVENT_STACK); - } else { - queue.add(event); - } - } - } - - private void updateGunHeading() { - if (currentCommands.getGunTurnRemaining() > 0) { - if (currentCommands.getGunTurnRemaining() < Rules.GUN_TURN_RATE_RADIANS) { - gunHeading += currentCommands.getGunTurnRemaining(); - radarHeading += currentCommands.getGunTurnRemaining(); - if (currentCommands.isAdjustRadarForGunTurn()) { - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() - currentCommands.getGunTurnRemaining()); - } - currentCommands.setGunTurnRemaining(0); - } else { - gunHeading += Rules.GUN_TURN_RATE_RADIANS; - radarHeading += Rules.GUN_TURN_RATE_RADIANS; - currentCommands.setGunTurnRemaining(currentCommands.getGunTurnRemaining() - Rules.GUN_TURN_RATE_RADIANS); - if (currentCommands.isAdjustRadarForGunTurn()) { - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() - Rules.GUN_TURN_RATE_RADIANS); - } - } - } else if (currentCommands.getGunTurnRemaining() < 0) { - if (currentCommands.getGunTurnRemaining() > -Rules.GUN_TURN_RATE_RADIANS) { - gunHeading += currentCommands.getGunTurnRemaining(); - radarHeading += currentCommands.getGunTurnRemaining(); - if (currentCommands.isAdjustRadarForGunTurn()) { - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() - currentCommands.getGunTurnRemaining()); - } - currentCommands.setGunTurnRemaining(0); - } else { - gunHeading -= Rules.GUN_TURN_RATE_RADIANS; - radarHeading -= Rules.GUN_TURN_RATE_RADIANS; - currentCommands.setGunTurnRemaining(currentCommands.getGunTurnRemaining() + Rules.GUN_TURN_RATE_RADIANS); - if (currentCommands.isAdjustRadarForGunTurn()) { - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() + Rules.GUN_TURN_RATE_RADIANS); - } - } - } - gunHeading = normalAbsoluteAngle(gunHeading); - } - - private void updateHeading() { - boolean normalizeHeading = true; - - double turnRate = min(currentCommands.getMaxTurnRate(), - (.4 + .6 * (1 - (abs(velocity) / Rules.MAX_VELOCITY))) * Rules.MAX_TURN_RATE_RADIANS); - - if (currentCommands.getBodyTurnRemaining() > 0) { - if (currentCommands.getBodyTurnRemaining() < turnRate) { - bodyHeading += currentCommands.getBodyTurnRemaining(); - gunHeading += currentCommands.getBodyTurnRemaining(); - radarHeading += currentCommands.getBodyTurnRemaining(); - if (currentCommands.isAdjustGunForBodyTurn()) { - currentCommands.setGunTurnRemaining( - currentCommands.getGunTurnRemaining() - currentCommands.getBodyTurnRemaining()); - } - if (currentCommands.isAdjustRadarForBodyTurn()) { - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() - currentCommands.getBodyTurnRemaining()); - } - currentCommands.setBodyTurnRemaining(0); - } else { - bodyHeading += turnRate; - gunHeading += turnRate; - radarHeading += turnRate; - currentCommands.setBodyTurnRemaining(currentCommands.getBodyTurnRemaining() - turnRate); - if (currentCommands.isAdjustGunForBodyTurn()) { - currentCommands.setGunTurnRemaining(currentCommands.getGunTurnRemaining() - turnRate); - } - if (currentCommands.isAdjustRadarForBodyTurn()) { - currentCommands.setRadarTurnRemaining(currentCommands.getRadarTurnRemaining() - turnRate); - } - } - } else if (currentCommands.getBodyTurnRemaining() < 0) { - if (currentCommands.getBodyTurnRemaining() > -turnRate) { - bodyHeading += currentCommands.getBodyTurnRemaining(); - gunHeading += currentCommands.getBodyTurnRemaining(); - radarHeading += currentCommands.getBodyTurnRemaining(); - if (currentCommands.isAdjustGunForBodyTurn()) { - currentCommands.setGunTurnRemaining( - currentCommands.getGunTurnRemaining() - currentCommands.getBodyTurnRemaining()); - } - if (currentCommands.isAdjustRadarForBodyTurn()) { - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() - currentCommands.getBodyTurnRemaining()); - } - currentCommands.setBodyTurnRemaining(0); - } else { - bodyHeading -= turnRate; - gunHeading -= turnRate; - radarHeading -= turnRate; - currentCommands.setBodyTurnRemaining(currentCommands.getBodyTurnRemaining() + turnRate); - if (currentCommands.isAdjustGunForBodyTurn()) { - currentCommands.setGunTurnRemaining(currentCommands.getGunTurnRemaining() + turnRate); - } - if (currentCommands.isAdjustRadarForBodyTurn()) { - currentCommands.setRadarTurnRemaining(currentCommands.getRadarTurnRemaining() + turnRate); - } - } - } else { - normalizeHeading = false; - } - - if (normalizeHeading) { - if (currentCommands.getBodyTurnRemaining() == 0) { - bodyHeading = normalNearAbsoluteAngle(bodyHeading); - } else { - bodyHeading = normalAbsoluteAngle(bodyHeading); - } - } - if (Double.isNaN(bodyHeading)) { - Logger.realErr.println("HOW IS HEADING NAN HERE"); - } - } - - private void updateRadarHeading() { - if (currentCommands.getRadarTurnRemaining() > 0) { - if (currentCommands.getRadarTurnRemaining() < Rules.RADAR_TURN_RATE_RADIANS) { - radarHeading += currentCommands.getRadarTurnRemaining(); - currentCommands.setRadarTurnRemaining(0); - } else { - radarHeading += Rules.RADAR_TURN_RATE_RADIANS; - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() - Rules.RADAR_TURN_RATE_RADIANS); - } - } else if (currentCommands.getRadarTurnRemaining() < 0) { - if (currentCommands.getRadarTurnRemaining() > -Rules.RADAR_TURN_RATE_RADIANS) { - radarHeading += currentCommands.getRadarTurnRemaining(); - currentCommands.setRadarTurnRemaining(0); - } else { - radarHeading -= Rules.RADAR_TURN_RATE_RADIANS; - currentCommands.setRadarTurnRemaining( - currentCommands.getRadarTurnRemaining() + Rules.RADAR_TURN_RATE_RADIANS); - } - } - - radarHeading = normalAbsoluteAngle(radarHeading); - } - - /** - * Updates the robots movement. - * - * This is Nat Pavasants method described here: - * http://robowiki.net/wiki/User:Positive/Optimal_Velocity#Nat.27s_updateMovement - */ - private void updateMovement() { - double distance = currentCommands.getDistanceRemaining(); - - if (Double.isNaN(distance)) { - distance = 0; - } - - velocity = getNewVelocity(velocity, distance); - - // If we are over-driving our distance and we are now at velocity=0 - // then we stopped. - if (isNear(velocity, 0) && isOverDriving) { - currentCommands.setDistanceRemaining(0); - distance = 0; - isOverDriving = false; - } - - // If we are moving normally and the breaking distance is more - // than remaining distance, enabled the overdrive flag. - if (Math.signum(distance * velocity) != -1) { - if (getDistanceTraveledUntilStop(velocity) > Math.abs(distance)) { - isOverDriving = true; - } else { - isOverDriving = false; - } - } - - currentCommands.setDistanceRemaining(distance - velocity); - - if (velocity != 0) { - x += velocity * sin(bodyHeading); - y += velocity * cos(bodyHeading); - updateBoundingBox(); - } - } - - private double getDistanceTraveledUntilStop(double velocity) { - double distance = 0; - - velocity = Math.abs(velocity); - while (velocity > 0) { - distance += (velocity = getNewVelocity(velocity, 0)); - } - return distance; - } - - /** - * Returns the new velocity based on the current velocity and distance to move. - * - * @param velocity the current velocity - * @param distance the distance to move - * @return the new velocity based on the current velocity and distance to move - * - * This is Patrick Cupka (aka Voidious), Julian Kent (aka Skilgannon), and Positive's method described here: - * http://robowiki.net/wiki/User:Voidious/Optimal_Velocity#Hijack_2 - */ - private double getNewVelocity(double velocity, double distance) { - if (distance < 0) { - // If the distance is negative, then change it to be positive - // and change the sign of the input velocity and the result - return -getNewVelocity(-velocity, -distance); - } - - final double goalVel; - - if (distance == Double.POSITIVE_INFINITY) { - goalVel = currentCommands.getMaxVelocity(); - } else { - goalVel = Math.min(getMaxVelocity(distance), currentCommands.getMaxVelocity()); - } - - if (velocity >= 0) { - return Math.max(velocity - Rules.DECELERATION, Math.min(goalVel, velocity + Rules.ACCELERATION)); - } - // else - return Math.max(velocity - Rules.ACCELERATION, Math.min(goalVel, velocity + maxDecel(-velocity))); - } - - private final static double getMaxVelocity(double distance) { - final double decelTime = Math.max(1, Math.ceil(// sum of 0... decelTime, solving for decelTime using quadratic formula - (Math.sqrt((4 * 2 / Rules.DECELERATION) * distance + 1) - 1) / 2)); - - if (decelTime == Double.POSITIVE_INFINITY) { - return Rules.MAX_VELOCITY; - } - - final double decelDist = (decelTime / 2.0) * (decelTime - 1) // sum of 0..(decelTime-1) - * Rules.DECELERATION; - - return ((decelTime - 1) * Rules.DECELERATION) + ((distance - decelDist) / decelTime); - } - - private static double maxDecel(double speed) { - double decelTime = speed / Rules.DECELERATION; - double accelTime = (1 - decelTime); - - return Math.min(1, decelTime) * Rules.DECELERATION + Math.max(0, accelTime) * Rules.ACCELERATION; - } - - private void updateGunHeat() { - gunHeat -= battleRules.getGunCoolingRate(); - if (gunHeat < 0) { - gunHeat = 0; - } - } - - private void scan(double lastRadarHeading, List robots) { - if (statics.isDroid()) { - return; - } - - double startAngle = lastRadarHeading; - double scanRadians = getRadarHeading() - startAngle; - - // Check if we passed through 360 - if (scanRadians < -PI) { - scanRadians = 2 * PI + scanRadians; - } else if (scanRadians > PI) { - scanRadians = scanRadians - 2 * PI; - } - - // In our coords, we are scanning clockwise, with +y up - // In java coords, we are scanning counterclockwise, with +y down - // All we need to do is adjust our angle by -90 for this to work. - startAngle -= PI / 2; - - startAngle = normalAbsoluteAngle(startAngle); - - scanArc.setArc(x - Rules.RADAR_SCAN_RADIUS, y - Rules.RADAR_SCAN_RADIUS, 2 * Rules.RADAR_SCAN_RADIUS, - 2 * Rules.RADAR_SCAN_RADIUS, 180.0 * startAngle / PI, 180.0 * scanRadians / PI, Arc2D.PIE); - - for (RobotPeer otherRobot : robots) { - if (!(otherRobot == null || otherRobot == this || otherRobot.isDead()) - && intersects(scanArc, otherRobot.boundingBox)) { - double dx = otherRobot.x - x; - double dy = otherRobot.y - y; - double angle = atan2(dx, dy); - double dist = Math.hypot(dx, dy); - - final ScannedRobotEvent event = new ScannedRobotEvent(getNameForEvent(otherRobot), otherRobot.energy, - normalRelativeAngle(angle - getBodyHeading()), dist, otherRobot.getBodyHeading(), - otherRobot.getVelocity(), otherRobot.isSentryRobot()); - - addEvent(event); - } - } - } - - private boolean intersects(Arc2D arc, Rectangle2D rect) { - return (rect.intersectsLine(arc.getCenterX(), arc.getCenterY(), arc.getStartPoint().getX(), - arc.getStartPoint().getY())) - || arc.intersects(rect); - } - - private void zap(double zapAmount) { - if (energy == 0) { - kill(); - return; - } - energy -= abs(zapAmount); - if (energy < .1) { - energy = 0; - currentCommands.setDistanceRemaining(0); - currentCommands.setBodyTurnRemaining(0); - } - } - - public void setRunning(boolean value) { - isRunning.set(value); - } - - public void drainEnergy() { - setEnergy(0, true); - isEnergyDrained = true; - } - - public void punishBadBehavior(BadBehavior badBehavior) { - kill(); // Bug fix [2828479] - Missed onRobotDeath events - - statistics.setInactive(); - - final IRobotItem repositoryItem = (IRobotItem) HiddenAccess.getFileSpecification(robotSpecification); - - StringBuffer message = new StringBuffer(getName()).append(' '); - - boolean disableInRepository = false; // Per default, robots are not disabled in the repository - - switch (badBehavior) { - case CANNOT_START: - message.append("could not be started or loaded."); - disableInRepository = true; // Disable in repository when it cannot be started anyways - break; - - case UNSTOPPABLE: - message.append("cannot be stopped."); - break; - - case SKIPPED_TOO_MANY_TURNS: - message.append("has skipped too many turns."); - break; - - case SECURITY_VIOLATION: - message.append("has caused a security violation."); - disableInRepository = true; // No mercy here! - break; - } - - if (disableInRepository) { - repositoryItem.setValid(false); - message.append(" This ").append(repositoryItem.isTeam() ? "team" : "robot").append( - " has been banned and will not be allowed to participate in battles."); - } - - logMessage(message.toString()); - } - - void updateEnergy(double delta) { - if ((!isExecFinishedAndDisabled && !isEnergyDrained) || delta < 0) { - setEnergy(energy + delta, true); - } - } - - private void setEnergy(double newEnergy, boolean resetInactiveTurnCount) { - if (resetInactiveTurnCount && (energy != newEnergy)) { - battle.resetInactiveTurnCount(energy - newEnergy); - } - energy = newEnergy; - if (energy < .01) { - energy = 0; - ExecCommands localCommands = commands.get(); - - localCommands.setDistanceRemaining(0); - localCommands.setBodyTurnRemaining(0); - } - } - - public void setWinner(boolean newWinner) { - isWinner = newWinner; - } - - public void kill() { - battle.resetInactiveTurnCount(10.0); - if (isAlive()) { - addEvent(new DeathEvent()); - if (statics.isTeamLeader()) { - for (RobotPeer teammate : teamPeer) { - if (teammate.isAlive() && teammate != this) { - teammate.updateEnergy(-30); - - BulletPeer sBullet = new BulletPeer(this, battleRules, 0); - sBullet.setState(BulletState.HIT_VICTIM); - sBullet.setX(teammate.x); - sBullet.setY(teammate.y); - sBullet.setVictim(teammate); - sBullet.setPower(4); - battle.addBullet(sBullet); - } - } - } - battle.registerDeathRobot(this); - - // 'fake' bullet for explosion on self - final ExplosionPeer fake = new ExplosionPeer(this, battleRules); - - battle.addBullet(fake); - } - updateEnergy(-energy); - - setState(RobotState.DEAD); - } - - public void waitForStop() { - robotProxy.waitForStopThread(); - } - - /** - * Clean things up removing all references to the robot. - */ - public void cleanup() { - battle = null; - - if (robotProxy != null) { - robotProxy.cleanup(); - robotProxy = null; - } - - if (statistics != null) { - statistics.cleanup(); - statistics = null; - } - - status = null; - commands = null; - events = null; - teamMessages = null; - bulletUpdates = null; - battleText.setLength(0); - proxyText.setLength(0); - statics = null; - battleRules = null; - } - - public Object getGraphicsCalls() { - return commands.get().getGraphicsCalls(); - } - - public boolean isTryingToPaint() { - return commands.get().isTryingToPaint(); - } - - public List getDebugProperties() { - return commands.get().getDebugProperties(); - } - - public void publishStatus(long currentTurn) { - - final ExecCommands currentCommands = commands.get(); - - int others = battle.countActiveParticipants() - (isDead() || isSentryRobot() ? 0 : 1); - int numSentries = battle.countActiveSentries(); - - RobotStatus stat = HiddenAccess.createStatus(energy, x, y, bodyHeading, gunHeading, radarHeading, velocity, - currentCommands.getBodyTurnRemaining(), currentCommands.getRadarTurnRemaining(), - currentCommands.getGunTurnRemaining(), currentCommands.getDistanceRemaining(), gunHeat, others, numSentries, - battle.getRoundNum(), battle.getNumRounds(), battle.getTime()); - - status.set(stat); - } - - void addBulletStatus(BulletStatus bulletStatus) { - if (isAlive()) { - bulletUpdates.get().add(bulletStatus); - } - } - - public int compareTo(ContestantPeer cp) { - double myScore = statistics.getTotalScore(); - double hisScore = cp.getStatistics().getTotalScore(); - - if (statistics.isInRound()) { - myScore += statistics.getCurrentScore(); - hisScore += cp.getStatistics().getCurrentScore(); - } - if (myScore < hisScore) { - return -1; - } - if (myScore > hisScore) { - return 1; - } - return 0; - } - - @Override - public String toString() { - return statics.getShortName() + "(" + (int) energy + ") X" + (int) x + " Y" + (int) y + " " + state.toString() - + (isSleeping() ? " sleeping " : "") + (isRunning() ? " running" : "") + (isHalt() ? " halted" : ""); - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotStatistics.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotStatistics.java deleted file mode 100644 index 0cb9c3f..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/RobotStatistics.java +++ /dev/null @@ -1,298 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import robocode.BattleResults; -import java.util.Map; -import java.util.HashMap; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Luis Crespo (contributor) - * @author Titus Chen (contributor) - * @author Robert D. Maupin (contributor) - * @author Nathaniel Troutman (contributor) - */ -public class RobotStatistics implements ContestantStatistics { - - private final RobotPeer robotPeer; - private int rank; - private final int numberOfRobots; - private boolean isActive; - private boolean isInRound; - - private double survivalScore; - private double lastSurvivorBonus; - private double bulletDamageScore; - private double bulletKillBonus; - private double rammingDamageScore; - private double rammingKillBonus; - - private Map robotDamageMap; - - private double totalScore; - private double totalSurvivalScore; - private double totalLastSurvivorBonus; - private double totalBulletDamageScore; - private double totalBulletKillBonus; - private double totalRammingDamageScore; - private double totalRammingKillBonus; - - private int totalFirsts; - private int totalSeconds; - private int totalThirds; - - RobotStatistics(RobotPeer robotPeer, int numberOfRobots) { - super(); - this.robotPeer = robotPeer; - this.numberOfRobots = numberOfRobots; - } - - public void setRank(int rank) { - this.rank = rank; - } - - void reset() { - resetScores(); - - isActive = true; - isInRound = true; - } - - private void resetScores() { - robotDamageMap = null; - survivalScore = 0; - lastSurvivorBonus = 0; - bulletDamageScore = 0; - bulletKillBonus = 0; - rammingDamageScore = 0; - rammingKillBonus = 0; - } - - public void generateTotals() { - totalSurvivalScore += survivalScore; - totalLastSurvivorBonus += lastSurvivorBonus; - totalBulletDamageScore += bulletDamageScore; - totalBulletKillBonus += bulletKillBonus; - totalRammingDamageScore += rammingDamageScore; - totalRammingKillBonus += rammingKillBonus; - - totalScore = robotPeer.isSentryRobot() - ? 0 - : totalBulletDamageScore + totalRammingDamageScore + totalSurvivalScore + totalRammingKillBonus - + totalBulletKillBonus + totalLastSurvivorBonus; - - isInRound = false; - } - - public double getTotalScore() { - return totalScore; - } - - public double getTotalSurvivalScore() { - return totalSurvivalScore; - } - - public double getTotalLastSurvivorBonus() { - return totalLastSurvivorBonus; - } - - public double getTotalBulletDamageScore() { - return totalBulletDamageScore; - } - - public double getTotalBulletKillBonus() { - return totalBulletKillBonus; - } - - public double getTotalRammingDamageScore() { - return totalRammingDamageScore; - } - - public double getTotalRammingKillBonus() { - return totalRammingKillBonus; - } - - public int getTotalFirsts() { - return totalFirsts; - } - - public int getTotalSeconds() { - return totalSeconds; - } - - public int getTotalThirds() { - return totalThirds; - } - - public double getCurrentScore() { - return robotPeer.isSentryRobot() - ? 0 - : (bulletDamageScore + rammingDamageScore + survivalScore + rammingKillBonus + bulletKillBonus - + lastSurvivorBonus); - } - - public double getCurrentSurvivalScore() { - return survivalScore; - } - - public double getCurrentSurvivalBonus() { - return lastSurvivorBonus; - } - - public double getCurrentBulletDamageScore() { - return bulletDamageScore; - } - - public double getCurrentBulletKillBonus() { - return bulletKillBonus; - } - - public double getCurrentRammingDamageScore() { - return rammingDamageScore; - } - - public double getCurrentRammingKillBonus() { - return rammingKillBonus; - } - - public void scoreSurvival() { - if (isActive && !robotPeer.isSentryRobot()) { - survivalScore += 50; - } - } - - public void scoreLastSurvivor() { - if (isActive && !robotPeer.isSentryRobot()) { - int enemyCount = numberOfRobots - 1; - - if (robotPeer.getTeamPeer() != null) { - enemyCount -= (robotPeer.getTeamPeer().size() - 1); - } - - lastSurvivorBonus += 10 * enemyCount; - - if ((robotPeer.getTeamPeer() == null || robotPeer.isTeamLeader())) { - totalFirsts++; - } - } - } - - void scoreBulletDamage(String robot, double damage) { - if (isActive) { - incrementRobotDamage(robot, damage); - bulletDamageScore += damage; - } - } - - double scoreBulletKill(String robot) { - if (isActive) { - double bonus; - - if (robotPeer.getTeamPeer() == null) { - bonus = getRobotDamage(robot) * 0.20; - } else { - bonus = 0; - for (RobotPeer teammate : robotPeer.getTeamPeer()) { - bonus += teammate.getRobotStatistics().getRobotDamage(robot) * 0.20; - } - } - - bulletKillBonus += bonus; - return bonus; - } - return 0; - } - - void scoreRammingDamage(String robot) { - if (isActive) { - incrementRobotDamage(robot, robocode.Rules.ROBOT_HIT_DAMAGE); - rammingDamageScore += robocode.Rules.ROBOT_HIT_BONUS; - } - } - - double scoreRammingKill(String robot) { - if (isActive) { - double bonus; - - if (robotPeer.getTeamPeer() == null) { - bonus = getRobotDamage(robot) * 0.30; - } else { - bonus = 0; - for (RobotPeer teammate : robotPeer.getTeamPeer()) { - bonus += teammate.getRobotStatistics().getRobotDamage(robot) * 0.30; - } - } - rammingKillBonus += bonus; - return bonus; - } - return 0; - } - - public void scoreRobotDeath(int enemiesRemaining) { - if (!robotPeer.isSentryRobot()) { - switch (enemiesRemaining) { - case 0: - if (!robotPeer.isWinner()) { - totalFirsts++; - } - break; - - case 1: - totalSeconds++; - break; - - case 2: - totalThirds++; - break; - } - } - } - - public void scoreFirsts() { - if (isActive && !robotPeer.isSentryRobot()) { - totalFirsts++; - } - } - - void setInactive() { - resetScores(); - isActive = false; - } - - public BattleResults getFinalResults() { - return new BattleResults(robotPeer.getTeamName(), rank, totalScore, totalSurvivalScore, totalLastSurvivorBonus, - totalBulletDamageScore, totalBulletKillBonus, totalRammingDamageScore, totalRammingKillBonus, totalFirsts, - totalSeconds, totalThirds); - } - - private double getRobotDamage(String robot) { - if (robotDamageMap == null) { - robotDamageMap = new HashMap(); - } - Double damage = robotDamageMap.get(robot); - - return (damage != null) ? damage : 0; - } - - private void incrementRobotDamage(String robot, double damage) { - double newDamage = getRobotDamage(robot) + damage; - - robotDamageMap.put(robot, newDamage); - } - - void cleanup() {// Do nothing, for now - } - - public boolean isInRound() { - return isInRound; - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamPeer.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamPeer.java deleted file mode 100644 index 7e384bb..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamPeer.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import java.util.ArrayList; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - * @author Pavel Savara (contributor) - */ -@SuppressWarnings("serial") -public class TeamPeer extends ArrayList implements ContestantPeer { - - private final List memberNames; - private final String name; - private final int teamIndex; - private RobotPeer teamLeader; - private final TeamStatistics teamStatistics; - - public TeamPeer(String name, List memberNames, int teamIndex) { - this.name = name; - this.teamIndex = teamIndex; - this.memberNames = memberNames; - this.teamStatistics = new TeamStatistics(this); - } - - public int compareTo(ContestantPeer cp) { - double myScore = teamStatistics.getTotalScore(); - double hisScore = cp.getStatistics().getTotalScore(); - - if (teamLeader != null && teamLeader.getRobotStatistics().isInRound()) { - myScore += teamStatistics.getCurrentScore(); - hisScore += cp.getStatistics().getCurrentScore(); - } - if (myScore < hisScore) { - return -1; - } - if (myScore > hisScore) { - return 1; - } - return 0; - } - - public ContestantStatistics getStatistics() { - return teamStatistics; - } - - public String getName() { - return name; - } - - public int getRobotIndex() { - return -1; - } - - public int getTeamIndex() { - return teamIndex; - } - - public int getContestantIndex() { - return teamIndex; // This contestant is always a team for this TeamPeer - } - - public List getMemberNames() { - return memberNames; - } - - public RobotPeer getTeamLeader() { - return teamLeader; - } - - @Override - public boolean add(RobotPeer r) { - if (teamLeader == null) { - teamLeader = r; - } - return super.add(r); - } - - @Override - public String toString() { - return " [" + size() + "] " + getName(); - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamStatistics.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamStatistics.java deleted file mode 100644 index 18316bf..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/peer/TeamStatistics.java +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.peer; - - -import robocode.BattleResults; - - -/** - * @author Mathew A. Nelson (original) - * @author Luis Crespo (contributor) - * @author Flemming N. Larsen (contributor) - */ -class TeamStatistics implements ContestantStatistics { - - private final TeamPeer teamPeer; - private int rank; - - TeamStatistics(TeamPeer teamPeer) { - this.teamPeer = teamPeer; - } - - public void setRank(int rank) { - this.rank = rank; - } - - public double getTotalScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalScore(); - } - return d; - } - - public double getTotalSurvivalScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalSurvivalScore(); - } - return d; - } - - public double getTotalLastSurvivorBonus() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalLastSurvivorBonus(); - } - return d; - } - - public double getTotalBulletDamageScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalBulletDamageScore(); - } - return d; - } - - public double getTotalBulletKillBonus() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalBulletKillBonus(); - } - return d; - } - - public double getTotalRammingDamageScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalRammingDamageScore(); - } - return d; - } - - public double getTotalRammingKillBonus() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalRammingKillBonus(); - } - return d; - } - - public int getTotalFirsts() { - int d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalFirsts(); - } - return d; - } - - public int getTotalSeconds() { - int d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalSeconds(); - } - return d; - } - - public int getTotalThirds() { - int d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getTotalThirds(); - } - return d; - } - - public double getCurrentScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getCurrentScore(); - } - return d; - } - - public double getCurrentSurvivalScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getCurrentSurvivalScore(); - } - return d; - } - - public double getCurrentSurvivalBonus() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getCurrentSurvivalBonus(); - } - return d; - } - - public double getCurrentBulletDamageScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getCurrentBulletDamageScore(); - } - return d; - } - - public double getCurrentBulletKillBonus() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getCurrentBulletKillBonus(); - } - return d; - } - - public double getCurrentRammingDamageScore() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getCurrentRammingDamageScore(); - } - return d; - } - - public double getCurrentRammingKillBonus() { - double d = 0; - - for (RobotPeer teammate : teamPeer) { - d += teammate.getRobotStatistics().getCurrentRammingKillBonus(); - } - return d; - } - - public BattleResults getFinalResults() { - return new BattleResults(teamPeer.getName(), rank, getTotalScore(), getTotalSurvivalScore(), - getTotalLastSurvivorBonus(), getTotalBulletDamageScore(), getTotalBulletKillBonus(), - getTotalRammingDamageScore(), getTotalRammingKillBonus(), getTotalFirsts(), getTotalSeconds(), - getTotalThirds()); - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/BulletSnapshot.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/BulletSnapshot.java deleted file mode 100644 index 14fcfa9..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/BulletSnapshot.java +++ /dev/null @@ -1,360 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.snapshot; - - -import net.sf.robocode.battle.peer.BulletPeer; -import net.sf.robocode.battle.peer.ExplosionPeer; -import net.sf.robocode.battle.peer.RobotPeer; -import net.sf.robocode.peer.ExecCommands; -import net.sf.robocode.serialization.IXmlSerializable; -import net.sf.robocode.serialization.XmlReader; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.serialization.XmlWriter; -import robocode.control.snapshot.BulletState; -import robocode.control.snapshot.IBulletSnapshot; - -import java.io.IOException; - - -/** - * A snapshot of a bullet at a specific time instant in a battle. - * The snapshot contains a snapshot of the bullet data at that specific time. - * - * @author Flemming N. Larsen (original) - * @author Pavel Savara (contributor) - * - * @since 1.6.1 - */ -final class BulletSnapshot implements java.io.Serializable, IXmlSerializable, IBulletSnapshot { - - private static final long serialVersionUID = 2L; - - /** The bullet state */ - private BulletState state; - - /** The bullet power */ - private double power; - - /** The x position */ - private double x; - - /** The y position */ - private double y; - - /** The x painting position (due to offset on robot when bullet hits a robot) */ - private double paintX; - - /** The y painting position (due to offset on robot when bullet hits a robot) */ - private double paintY; - - /** The ARGB color of the bullet */ - private int color = ExecCommands.defaultBulletColor; - - /** The current frame number to display, i.e. when the bullet explodes */ - private int frame; - - /** Flag specifying if this bullet has turned into an explosion */ - private boolean isExplosion; - - /** Index to which explosion image that must be rendered */ - private int explosionImageIndex; - - private int bulletId; - - private int victimIndex = -1; - - private int ownerIndex; - - private double heading; - - /** - * Creates a snapshot of a bullet that must be filled out with data later. - */ - public BulletSnapshot() { - state = BulletState.INACTIVE; - ownerIndex = -1; - victimIndex = -1; - explosionImageIndex = -1; - heading = Double.NaN; - power = Double.NaN; - } - - /** - * Creates a snapshot of a bullet. - * - * @param bullet the bullet to make a snapshot of. - */ - BulletSnapshot(BulletPeer bullet) { - state = bullet.getState(); - - power = bullet.getPower(); - - x = bullet.getX(); - y = bullet.getY(); - - paintX = bullet.getPaintX(); - paintY = bullet.getPaintY(); - - color = bullet.getColor(); - - frame = bullet.getFrame(); - - isExplosion = (bullet instanceof ExplosionPeer); - explosionImageIndex = bullet.getExplosionImageIndex(); - - bulletId = bullet.getBulletId(); - - final RobotPeer victim = bullet.getVictim(); - - if (victim != null) { - victimIndex = victim.getRobotIndex(); - } - - ownerIndex = bullet.getOwner().getRobotIndex(); - - heading = bullet.getHeading(); - } - - @Override - public String toString() { - return ownerIndex + "-" + bulletId + " (" + (int) power + ") X" + (int) x + " Y" + (int) y + " " - + state.toString(); - } - - /** - * {@inheritDoc} - */ - public int getBulletId() { - return bulletId; - } - - /** - * {@inheritDoc} - */ - public BulletState getState() { - return state; - } - - /** - * {@inheritDoc} - */ - public double getPower() { - return power; - } - - /** - * {@inheritDoc} - */ - public double getX() { - return x; - } - - /** - * {@inheritDoc} - */ - public double getY() { - return y; - } - - /** - * {@inheritDoc} - */ - public double getPaintX() { - return paintX; - } - - /** - * {@inheritDoc} - */ - public double getPaintY() { - return paintY; - } - - /** - * {@inheritDoc} - */ - public int getColor() { - return color; - } - - /** - * {@inheritDoc} - */ - public int getFrame() { - return frame; - } - - /** - * {@inheritDoc} - */ - public boolean isExplosion() { - return isExplosion; - } - - /** - * {@inheritDoc} - */ - public int getExplosionImageIndex() { - return explosionImageIndex; - } - - /** - * {@inheritDoc} - */ - public double getHeading() { - return heading; - } - - /** - * {@inheritDoc} - */ - public int getVictimIndex() { - return victimIndex; - } - - /** - * {@inheritDoc} - */ - public int getOwnerIndex() { - return ownerIndex; - } - - /** - * {@inheritDoc} - */ - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException { - writer.startElement(options.shortAttributes ? "b" : "bullet"); { - writer.writeAttribute("id", ownerIndex + "-" + bulletId); - if (!options.skipExploded || state != BulletState.MOVING) { - writer.writeAttribute(options.shortAttributes ? "s" : "state", state.toString()); - writer.writeAttribute(options.shortAttributes ? "p" : "power", power, options.trimPrecision); - } - if (state == BulletState.HIT_VICTIM) { - writer.writeAttribute(options.shortAttributes ? "v" : "victim", victimIndex); - } - if (state == BulletState.FIRED) { - writer.writeAttribute(options.shortAttributes ? "o" : "owner", ownerIndex); - writer.writeAttribute(options.shortAttributes ? "h" : "heading", heading, options.trimPrecision); - } - writer.writeAttribute("x", paintX, options.trimPrecision); - writer.writeAttribute("y", paintY, options.trimPrecision); - if (!options.skipNames) { - if (color != ExecCommands.defaultBulletColor) { - writer.writeAttribute(options.shortAttributes ? "c" : "color", - Integer.toHexString(color).toUpperCase()); - } - } - if (!options.skipExploded) { - if (frame != 0) { - writer.writeAttribute("frame", frame); - } - if (isExplosion) { - writer.writeAttribute("isExplosion", true); - writer.writeAttribute("explosion", explosionImageIndex); - } - } - if (!options.skipVersion) { - writer.writeAttribute("ver", serialVersionUID); - } - } - writer.endElement(); - } - - /** - * {@inheritDoc} - */ - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("bullet", "b", new XmlReader.Element() { - public IXmlSerializable read(XmlReader reader) { - final BulletSnapshot snapshot = new BulletSnapshot(); - - reader.expect("id", new XmlReader.Attribute() { - public void read(String value) { - String[] parts = value.split("-"); - - snapshot.ownerIndex = Integer.parseInt(parts[0]); - snapshot.bulletId = Integer.parseInt(parts[1]); - } - }); - - reader.expect("state", "s", new XmlReader.Attribute() { - public void read(String value) { - snapshot.state = BulletState.valueOf(value); - } - }); - - reader.expect("power", "p", new XmlReader.Attribute() { - public void read(String value) { - snapshot.power = Double.parseDouble(value); - } - }); - - reader.expect("heading", "h", new XmlReader.Attribute() { - public void read(String value) { - snapshot.heading = Double.parseDouble(value); - } - }); - - reader.expect("victim", "v", new XmlReader.Attribute() { - public void read(String value) { - snapshot.victimIndex = Integer.parseInt(value); - } - }); - - reader.expect("owner", "o", new XmlReader.Attribute() { - public void read(String value) { - snapshot.ownerIndex = Integer.parseInt(value); - } - }); - - reader.expect("x", new XmlReader.Attribute() { - public void read(String value) { - snapshot.x = Double.parseDouble(value); - snapshot.paintX = snapshot.x; - } - }); - - reader.expect("y", new XmlReader.Attribute() { - public void read(String value) { - snapshot.y = Double.parseDouble(value); - snapshot.paintY = snapshot.y; - } - }); - - reader.expect("color", "c", new XmlReader.Attribute() { - public void read(String value) { - snapshot.color = Long.valueOf(value.toUpperCase(), 16).intValue(); - } - }); - - reader.expect("isExplosion", new XmlReader.Attribute() { - public void read(String value) { - snapshot.isExplosion = Boolean.parseBoolean(value); - if (snapshot.isExplosion && snapshot.state == null) { - snapshot.state = BulletState.EXPLODED; - } - } - }); - - reader.expect("explosion", new XmlReader.Attribute() { - public void read(String value) { - snapshot.explosionImageIndex = Integer.parseInt(value); - } - }); - - reader.expect("frame", new XmlReader.Attribute() { - public void read(String value) { - snapshot.frame = Integer.parseInt(value); - } - }); - return snapshot; - } - }); - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/RobotSnapshot.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/RobotSnapshot.java deleted file mode 100644 index c83404d..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/RobotSnapshot.java +++ /dev/null @@ -1,729 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.snapshot; - - -import net.sf.robocode.battle.peer.RobotPeer; -import net.sf.robocode.peer.DebugProperty; -import net.sf.robocode.peer.ExecCommands; -import net.sf.robocode.serialization.IXmlSerializable; -import net.sf.robocode.serialization.XmlReader; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.serialization.XmlWriter; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.IScoreSnapshot; -import robocode.control.snapshot.RobotState; - -import java.awt.geom.Arc2D; -import java.io.IOException; -import java.io.Serializable; -import java.util.List; -import java.util.Map; - - -/** - * A snapshot of a robot at a specific time instant in a battle. - * The snapshot contains a snapshot of the robot data at that specific time. - * - * @author Flemming N. Larsen (original) - * @author Pavel Savara (contributor) - * - * @since 1.6.1 - */ -public final class RobotSnapshot implements Serializable, IXmlSerializable, IRobotSnapshot { - - private static final long serialVersionUID = 2L; - - /** The name of the robot */ - private String name; - - /** The short name of the robot */ - private String shortName; - - /** Very short name of the robot */ - private String veryShortName; - - /** Very short name of the team leader robot (might be null) */ - private String teamName; - - /** The unique robot index */ - private int robotIndex; - - /** The team index for the robot */ - private int teamIndex; - - /** The robot state */ - private RobotState state; - - /** The energy level of the robot */ - private double energy; - - /** The velocity of the robot */ - private double velocity; - - /** The gun heat level of the robot */ - private double gunHeat; - - /** The body heading in radians */ - private double bodyHeading; - - /** The gun heading in radians */ - private double gunHeading; - - /** The radar heading in radians */ - private double radarHeading; - - /** The X position */ - private double x; - - /** The Y position */ - private double y; - - /** The ARGB color of the body */ - private int bodyColor = ExecCommands.defaultBodyColor; - - /** The ARGB color of the gun */ - private int gunColor = ExecCommands.defaultGunColor; - - /** The ARGB color of the radar */ - private int radarColor = ExecCommands.defaultRadarColor; - - /** The ARGB color of the scan arc */ - private int scanColor = ExecCommands.defaultScanColor; - - /** Flag specifying if this robot is a Droid */ - private boolean isDroid; - - /** Flag specifying if this robot is a SentryRobot */ - private boolean isSentryRobot; - - /** Flag specifying if this robot is a IPaintRobot or is invoking getGraphics() */ - private boolean isPaintRobot; - - /** Flag specifying if painting is enabled for this robot */ - private boolean isPaintEnabled; - - /** Flag specifying if RobocodeSG painting is enabled for this robot */ - private boolean isSGPaintEnabled; - - /** Snapshot of the scan arc */ - private SerializableArc scanArc; - - /** Snapshot of the object with queued calls for Graphics object */ - private Object graphicsCalls; - - /** Snapshot of debug properties */ - private DebugProperty[] debugProperties; - - /** Snapshot of the output print stream for this robot */ - private String outputStreamSnapshot; - - /** Snapshot of score of the robot */ - private IScoreSnapshot robotScoreSnapshot; - - /** - * Creates a snapshot of a robot that must be filled out with data later. - */ - public RobotSnapshot() { - state = RobotState.ACTIVE; - } - - /** - * Creates a snapshot of a robot. - * - * @param robot the robot to make a snapshot of. - * @param readoutText {@code true} if the output text from the robot must be included in the snapshot; - * {@code false} otherwise. - */ - RobotSnapshot(RobotPeer robot, boolean readoutText) { - name = robot.getName(); - shortName = robot.getShortName(); - veryShortName = robot.getVeryShortName(); - teamName = robot.getTeamName(); - - robotIndex = robot.getRobotIndex(); - teamIndex = robot.getTeamIndex(); - - state = robot.getState(); - - energy = robot.getEnergy(); - velocity = robot.getVelocity(); - gunHeat = robot.getGunHeat(); - - bodyHeading = robot.getBodyHeading(); - gunHeading = robot.getGunHeading(); - radarHeading = robot.getRadarHeading(); - - x = robot.getX(); - y = robot.getY(); - - bodyColor = robot.getBodyColor(); - gunColor = robot.getGunColor(); - radarColor = robot.getRadarColor(); - scanColor = robot.getScanColor(); - - isDroid = robot.isDroid(); - isPaintRobot = robot.isPaintRobot() || robot.isTryingToPaint(); - isPaintEnabled = robot.isPaintEnabled(); - isSGPaintEnabled = robot.isSGPaintEnabled(); - - scanArc = robot.getScanArc() != null ? new SerializableArc((Arc2D.Double) robot.getScanArc()) : null; - - graphicsCalls = robot.getGraphicsCalls(); - - final List dp = robot.getDebugProperties(); - - debugProperties = dp != null ? dp.toArray(new DebugProperty[dp.size()]) : null; - - if (readoutText) { - outputStreamSnapshot = robot.readOutText(); - } - - robotScoreSnapshot = new ScoreSnapshot(robot.getName(), robot.getRobotStatistics()); - } - - @Override - public String toString() { - return shortName + " (" + (int) energy + ") X" + (int) x + " Y" + (int) y + " " + state.toString(); - } - - /** - * {@inheritDoc} - */ - // Used to identify buttons - // TODO: Fix this so that getRobotIndex() is used instead - public String getName() { - return name; - } - - /** - * {@inheritDoc} - */ - // Used for text on buttons - public String getShortName() { - return shortName; - } - - /** - * {@inheritDoc} - */ - // Used for drawing the name of the robot on the battle view - public String getVeryShortName() { - return veryShortName; - } - - /** - * {@inheritDoc} - */ - public String getTeamName() { - return teamName; - } - - /** - * {@inheritDoc} - */ - public int getContestantIndex() { - return teamIndex >= 0 ? teamIndex : robotIndex; - } - - /** - * {@inheritDoc} - */ - public int getRobotIndex() { - return robotIndex; - } - - /** - * {@inheritDoc} - */ - public int getTeamIndex() { - return teamIndex; - } - - /** - * {@inheritDoc} - */ - public RobotState getState() { - return state; - } - - /** - * {@inheritDoc} - */ - public double getEnergy() { - return energy; - } - - /** - * {@inheritDoc} - */ - public double getVelocity() { - return velocity; - } - - /** - * {@inheritDoc} - */ - public double getBodyHeading() { - return bodyHeading; - } - - /** - * {@inheritDoc} - */ - public double getGunHeading() { - return gunHeading; - } - - /** - * {@inheritDoc} - */ - public double getRadarHeading() { - return radarHeading; - } - - /** - * {@inheritDoc} - */ - public double getGunHeat() { - return gunHeat; - } - - /** - * {@inheritDoc} - */ - public double getX() { - return x; - } - - /** - * {@inheritDoc} - */ - public double getY() { - return y; - } - - /** - * {@inheritDoc} - */ - public int getBodyColor() { - return bodyColor; - } - - /** - * {@inheritDoc} - */ - public int getGunColor() { - return gunColor; - } - - /** - * {@inheritDoc} - */ - public int getRadarColor() { - return radarColor; - } - - /** - * {@inheritDoc} - */ - public int getScanColor() { - return scanColor; - } - - /** - * {@inheritDoc} - */ - public boolean isDroid() { - return isDroid; - } - - /** - * {@inheritDoc} - */ - public boolean isSentryRobot() { - return isSentryRobot; - } - - /** - * {@inheritDoc} - */ - public boolean isPaintRobot() { - return isPaintRobot; - } - - /** - * {@inheritDoc} - */ - public boolean isPaintEnabled() { - return isPaintEnabled; - } - - /** - * Sets the flag specifying if painting is enabled for the robot. - * - * @param isPaintEnabled {@code true} if painting must be enabled; - * {@code false} otherwise. - */ - public void setPaintEnabled(boolean isPaintEnabled) { - this.isPaintEnabled = isPaintEnabled; - } - - /** - * {@inheritDoc} - */ - public boolean isSGPaintEnabled() { - return isSGPaintEnabled; - } - - /** - * {@inheritDoc} - */ - public DebugProperty[] getDebugProperties() { - return debugProperties; - } - - /** - * {@inheritDoc} - */ - public String getOutputStreamSnapshot() { - return outputStreamSnapshot; - } - - /** - * Sets the snapshot of the output print stream for this robot. - * - * @param outputStreamSnapshot new output print stream snapshot. - */ - public void setOutputStreamSnapshot(String outputStreamSnapshot) { - this.outputStreamSnapshot = outputStreamSnapshot; - } - - void stripDetails(SerializableOptions options) { - if (options.skipDebug) { - graphicsCalls = null; - debugProperties = null; - outputStreamSnapshot = null; - isPaintEnabled = false; - isSGPaintEnabled = false; - } - if (options.skipNames) { - name = veryShortName; - shortName = veryShortName; - teamName = veryShortName; - } - } - - /** - * {@inheritDoc} - */ - public IScoreSnapshot getScoreSnapshot() { - return robotScoreSnapshot; - } - - /** - * Returns the scan arc snapshot for the robot. - * - * @return the scan arc snapshot for the robot. - */ - public Arc2D getScanArc() { - return scanArc != null ? scanArc.create() : null; - } - - /** - * Returns the object with queued calls for Graphics object. - * - * @return the object with queued calls for Graphics object. - */ - public Object getGraphicsCalls() { - return graphicsCalls; - } - - /** - * {@inheritDoc} - */ - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException { - writer.startElement(options.shortAttributes ? "r" : "robot"); { - writer.writeAttribute("id", robotIndex); - if (!options.skipNames) { - writer.writeAttribute("vsName", veryShortName); - } - if (!options.skipExploded || state != RobotState.ACTIVE) { - writer.writeAttribute(options.shortAttributes ? "s" : "state", state.toString()); - } - writer.writeAttribute(options.shortAttributes ? "e" : "energy", energy, options.trimPrecision); - writer.writeAttribute("x", x, options.trimPrecision); - writer.writeAttribute("y", y, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "b" : "bodyHeading", bodyHeading, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "g" : "gunHeading", gunHeading, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "r" : "radarHeading", radarHeading, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "h" : "gunHeat", gunHeat, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "v" : "velocity", velocity, options.trimPrecision); - if (!options.skipNames) { - writer.writeAttribute("teamName", teamName); - writer.writeAttribute("name", name); - writer.writeAttribute("sName", shortName); - if (isDroid) { - writer.writeAttribute("isDroid", true); - } - if (bodyColor != ExecCommands.defaultBodyColor) { - writer.writeAttribute("bodyColor", Integer.toHexString(bodyColor).toUpperCase()); - } - if (gunColor != ExecCommands.defaultGunColor) { - writer.writeAttribute("gunColor", Integer.toHexString(gunColor).toUpperCase()); - } - if (radarColor != ExecCommands.defaultRadarColor) { - writer.writeAttribute("radarColor", Integer.toHexString(radarColor).toUpperCase()); - } - if (scanColor != ExecCommands.defaultScanColor) { - writer.writeAttribute("scanColor", Integer.toHexString(scanColor).toUpperCase()); - } - } - if (!options.skipVersion) { - writer.writeAttribute("ver", serialVersionUID); - } - if (!options.skipDebug) { - if (outputStreamSnapshot != null && outputStreamSnapshot.length() != 0) { - writer.writeAttribute("out", outputStreamSnapshot); - } - if (debugProperties != null) { - writer.startElement("debugProperties"); { - for (DebugProperty prop : debugProperties) { - prop.writeXml(writer, options); - } - } - writer.endElement(); - } - } - - ((ScoreSnapshot) robotScoreSnapshot).writeXml(writer, options); - } - writer.endElement(); - - } - - // allows loading of minimalistic XML - RobotSnapshot(String robotName, int robotIndex, RobotState state) { - this.robotIndex = robotIndex; - this.state = state; - this.name = robotName; - this.teamName = robotName; - this.shortName = robotName; - this.veryShortName = robotName; - this.robotScoreSnapshot = new ScoreSnapshot(robotName); - } - - /** - * {@inheritDoc} - */ - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("robot", "r", new XmlReader.Element() { - public IXmlSerializable read(final XmlReader reader) { - final RobotSnapshot snapshot = new RobotSnapshot(); - - reader.expect("id", new XmlReader.Attribute() { - public void read(String value) { - snapshot.robotIndex = Integer.parseInt(value); - - // allows loading of minimalistic XML, which robot names for subsequent turns - Map context = reader.getContext(); - - if (context.containsKey(value)) { - String n = (String) context.get(value); - - if (snapshot.shortName == null) { - snapshot.name = n; - } - if (snapshot.shortName == null) { - snapshot.shortName = n; - } - if (snapshot.teamName == null) { - snapshot.teamName = n; - } - if (snapshot.veryShortName == null) { - snapshot.veryShortName = n; - } - } - } - }); - - reader.expect("name", new XmlReader.Attribute() { - public void read(String value) { - snapshot.name = value; - Map context = reader.getContext(); - - context.put(Integer.toString(snapshot.robotIndex), value); - if (snapshot.shortName == null) { - snapshot.shortName = value; - } - if (snapshot.teamName == null) { - snapshot.teamName = value; - } - if (snapshot.veryShortName == null) { - snapshot.veryShortName = value; - } - } - }); - - reader.expect("sName", new XmlReader.Attribute() { - public void read(String value) { - snapshot.shortName = value; - } - }); - - reader.expect("vsName", new XmlReader.Attribute() { - public void read(String value) { - snapshot.veryShortName = value; - } - }); - - reader.expect("teamName", new XmlReader.Attribute() { - public void read(String value) { - snapshot.teamName = value; - } - }); - - reader.expect("state", "s", new XmlReader.Attribute() { - public void read(String value) { - snapshot.state = RobotState.valueOf(value); - } - }); - - reader.expect("isDroid", new XmlReader.Attribute() { - public void read(String value) { - snapshot.isDroid = Boolean.valueOf(value); - } - }); - - reader.expect("bodyColor", new XmlReader.Attribute() { - public void read(String value) { - snapshot.bodyColor = (Long.valueOf(value.toUpperCase(), 16).intValue()); - } - }); - - reader.expect("gunColor", new XmlReader.Attribute() { - public void read(String value) { - snapshot.gunColor = Long.valueOf(value.toUpperCase(), 16).intValue(); - } - }); - - reader.expect("radarColor", new XmlReader.Attribute() { - public void read(String value) { - snapshot.radarColor = Long.valueOf(value.toUpperCase(), 16).intValue(); - } - }); - - reader.expect("scanColor", new XmlReader.Attribute() { - public void read(String value) { - snapshot.scanColor = Long.valueOf(value.toUpperCase(), 16).intValue(); - } - }); - - reader.expect("energy", "e", new XmlReader.Attribute() { - public void read(String value) { - snapshot.energy = Double.parseDouble(value); - } - }); - - reader.expect("velocity", "v", new XmlReader.Attribute() { - public void read(String value) { - snapshot.velocity = Double.parseDouble(value); - } - }); - - reader.expect("gunHeat", "h", new XmlReader.Attribute() { - public void read(String value) { - snapshot.gunHeat = Double.parseDouble(value); - } - }); - - reader.expect("bodyHeading", "b", new XmlReader.Attribute() { - public void read(String value) { - snapshot.bodyHeading = Double.parseDouble(value); - } - }); - - reader.expect("gunHeading", "g", new XmlReader.Attribute() { - public void read(String value) { - snapshot.gunHeading = Double.parseDouble(value); - } - }); - - reader.expect("radarHeading", "r", new XmlReader.Attribute() { - public void read(String value) { - snapshot.radarHeading = Double.parseDouble(value); - } - }); - - reader.expect("x", new XmlReader.Attribute() { - public void read(String value) { - snapshot.x = Double.parseDouble(value); - } - }); - - reader.expect("y", new XmlReader.Attribute() { - public void read(String value) { - snapshot.y = Double.parseDouble(value); - } - }); - - reader.expect("out", new XmlReader.Attribute() { - public void read(String value) { - if (value != null && value.length() != 0) { - snapshot.outputStreamSnapshot = value; - } - } - }); - - final XmlReader.Element element = (new ScoreSnapshot()).readXml(reader); - - reader.expect("score", "sc", new XmlReader.Element() { - public IXmlSerializable read(XmlReader reader) { - snapshot.robotScoreSnapshot = (IScoreSnapshot) element.read(reader); - return (ScoreSnapshot) snapshot.robotScoreSnapshot; - } - }); - - return snapshot; - } - }); - } - - /** - * Class used for serializing an Arc2D.double. - * The purpose of this class is to overcome various serialization problems with Arc2D to cope with bug in Java 6: - * Bug ID: 6522514. - * - * @author Pavel Savara - */ - private static class SerializableArc implements Serializable { - private static final long serialVersionUID = 1L; - - public final double x; - public final double y; - public final double w; - public final double h; - public final double start; - public final double extent; - public final int type; - - public SerializableArc(Arc2D.Double arc) { - x = arc.getX(); - y = arc.getY(); - w = arc.getWidth(); - h = arc.getHeight(); - start = arc.getAngleStart(); - extent = arc.getAngleExtent(); - type = arc.getArcType(); - } - - public Arc2D create() { - return new Arc2D.Double(x, y, w, h, start, extent, type); - } - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/ScoreSnapshot.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/ScoreSnapshot.java deleted file mode 100644 index 77c65bb..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/ScoreSnapshot.java +++ /dev/null @@ -1,562 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.snapshot; - - -import net.sf.robocode.battle.peer.RobotStatistics; -import net.sf.robocode.serialization.IXmlSerializable; -import net.sf.robocode.serialization.XmlReader; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.serialization.XmlWriter; -import robocode.control.snapshot.IScoreSnapshot; - -import java.io.IOException; -import java.io.Serializable; - - -/** - * A snapshot of a score at a specific time instant in a battle. - * The snapshot contains a snapshot of the score data at that specific time. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - * - * @since 1.6.1 - */ -final class ScoreSnapshot implements Serializable, IXmlSerializable, IScoreSnapshot { - - private static final long serialVersionUID = 1L; - - /** The name of the contestant, i.e. a robot or team */ - private String name; - - /** The total score */ - private double totalScore; - - /** The total survival score */ - private double totalSurvivalScore; - - /** The total last survivor score */ - private double totalLastSurvivorBonus; - - /** The total bullet damage score */ - private double totalBulletDamageScore; - - /** The total bullet kill bonus */ - private double totalBulletKillBonus; - - /** The total ramming damage score */ - private double totalRammingDamageScore; - - /** The total ramming kill bonus */ - private double totalRammingKillBonus; - - /** The total number of first places */ - private int totalFirsts; - - /** The total number of second places */ - private int totalSeconds; - - /** The total number of third places */ - private int totalThirds; - - /** The current score */ - private double currentScore; - - /** The current survival score */ - private double currentSurvivalScore; - - /** The current survival bonus */ - private double currentSurvivalBonus; - - /** The current bullet damage score */ - private double currentBulletDamageScore; - - /** The current bullet kill bonus */ - private double currentBulletKillBonus; - - /** The current ramming damage score */ - private double currentRammingDamageScore; - - /** The current ramming kill bonus */ - private double currentRammingKillBonus; - - /** - * Creates a snapshot of a score that must be filled out with data later. - */ - public ScoreSnapshot() {} - - /** - * Creates a snapshot of a score. - * - * @param score the contestant's score to take a snapshot of. - * @param contestantName the name of the contestant. - */ - ScoreSnapshot(String contestantName, RobotStatistics score) { - this.name = contestantName; - totalScore = score.getTotalScore(); - totalSurvivalScore = score.getTotalSurvivalScore(); - totalLastSurvivorBonus = score.getTotalLastSurvivorBonus(); - totalBulletDamageScore = score.getTotalBulletDamageScore(); - totalBulletKillBonus = score.getTotalBulletKillBonus(); - totalRammingDamageScore = score.getTotalRammingDamageScore(); - totalRammingKillBonus = score.getTotalRammingKillBonus(); - totalFirsts = score.getTotalFirsts(); - totalSeconds = score.getTotalSeconds(); - totalThirds = score.getTotalThirds(); - currentScore = score.getCurrentScore(); - currentBulletDamageScore = score.getCurrentBulletDamageScore(); - currentSurvivalScore = score.getCurrentSurvivalScore(); - currentSurvivalBonus = score.getCurrentSurvivalBonus(); - currentBulletKillBonus = score.getCurrentBulletKillBonus(); - currentRammingDamageScore = score.getCurrentRammingDamageScore(); - currentRammingKillBonus = score.getCurrentRammingKillBonus(); - } - - /** - * Creates a snapshot of a score based on two sets of scores that are added together. - * - * @param contestantName the name of the contestant. - * @param score1 the contestant's first set of scores to base this snapshot on. - * @param score2 the contestant's second set of scores that must be added to the first set of scores. - */ - ScoreSnapshot(String contestantName, IScoreSnapshot score1, IScoreSnapshot score2) { - this.name = contestantName; - totalScore = score1.getTotalScore() + score2.getTotalScore(); - totalSurvivalScore = score1.getTotalSurvivalScore() + score2.getTotalSurvivalScore(); - totalLastSurvivorBonus = score1.getTotalLastSurvivorBonus() + score2.getTotalLastSurvivorBonus(); - totalBulletDamageScore = score1.getTotalBulletDamageScore() + score2.getTotalBulletDamageScore(); - totalBulletKillBonus = score1.getTotalBulletKillBonus() + score2.getTotalBulletKillBonus(); - totalRammingDamageScore = score1.getTotalRammingDamageScore() + score2.getTotalRammingDamageScore(); - totalRammingKillBonus = score1.getTotalRammingKillBonus() + score2.getTotalRammingKillBonus(); - totalFirsts = score1.getTotalFirsts() + score2.getTotalFirsts(); - totalSeconds = score1.getTotalSeconds() + score2.getTotalSeconds(); - totalThirds = score1.getTotalThirds() + score2.getTotalThirds(); - currentScore = score1.getCurrentScore() + score2.getCurrentScore(); - currentSurvivalScore = score1.getCurrentSurvivalScore() + score2.getCurrentSurvivalScore(); - currentBulletDamageScore = score1.getCurrentBulletDamageScore() + score2.getCurrentBulletDamageScore(); - currentBulletKillBonus = score1.getCurrentBulletKillBonus() + score2.getCurrentBulletKillBonus(); - currentRammingDamageScore = score1.getCurrentRammingDamageScore() + score2.getCurrentRammingDamageScore(); - currentRammingKillBonus = score1.getCurrentBulletKillBonus() + score2.getCurrentBulletKillBonus(); - } - - @Override - public String toString() { - return this.totalScore + "/" + this.currentScore; - } - - /** - * {@inheritDoc} - */ - public String getName() { - return name; - } - - /** - * {@inheritDoc} - */ - public double getTotalScore() { - return totalScore; - } - - /** - * {@inheritDoc} - */ - public double getTotalSurvivalScore() { - return totalSurvivalScore; - } - - /** - * {@inheritDoc} - */ - public double getTotalLastSurvivorBonus() { - return totalLastSurvivorBonus; - } - - /** - * {@inheritDoc} - */ - public double getTotalBulletDamageScore() { - return totalBulletDamageScore; - } - - /** - * {@inheritDoc} - */ - public double getTotalBulletKillBonus() { - return totalBulletKillBonus; - } - - /** - * {@inheritDoc} - */ - public double getTotalRammingDamageScore() { - return totalRammingDamageScore; - } - - /** - * {@inheritDoc} - */ - public double getTotalRammingKillBonus() { - return totalRammingKillBonus; - } - - /** - * {@inheritDoc} - */ - public int getTotalFirsts() { - return totalFirsts; - } - - /** - * {@inheritDoc} - */ - public int getTotalSeconds() { - return totalSeconds; - } - - /** - * {@inheritDoc} - */ - public int getTotalThirds() { - return totalThirds; - } - - /** - * {@inheritDoc} - */ - public double getCurrentScore() { - return currentScore; - } - - /** - * {@inheritDoc} - */ - public double getCurrentSurvivalScore() { - return currentSurvivalScore; - } - - /** - * {@inheritDoc} - */ - public double getCurrentSurvivalBonus() { - return currentSurvivalBonus; - } - - /** - * {@inheritDoc} - */ - public double getCurrentBulletDamageScore() { - return currentBulletDamageScore; - } - - /** - * {@inheritDoc} - */ - public double getCurrentBulletKillBonus() { - return currentBulletKillBonus; - } - - /** - * {@inheritDoc} - */ - public double getCurrentRammingDamageScore() { - return currentRammingDamageScore; - } - - /** - * {@inheritDoc} - */ - public double getCurrentRammingKillBonus() { - return currentRammingKillBonus; - } - - /** - * {@inheritDoc} - */ - public int compareTo(Object obj) { - if (obj instanceof IScoreSnapshot) { - IScoreSnapshot scoreSnapshot = (IScoreSnapshot) obj; - - double myScore = getTotalScore() + getCurrentScore(); - double hisScore = scoreSnapshot.getTotalScore() + scoreSnapshot.getCurrentScore(); - - if (myScore < hisScore) { - return -1; - } - if (myScore > hisScore) { - return 1; - } - } - return 0; - } - - /** - * {@inheritDoc} - */ - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException { - writer.startElement(options.shortAttributes ? "sc" : "score"); { - if (!options.skipNames) { - writer.writeAttribute("name", name); - } - if (!options.skipTotal) { - writer.writeAttribute(options.shortAttributes ? "t" : "totalScore", totalScore, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "tss" : "totalSurvivalScore", totalSurvivalScore, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "tls" : "totalLastSurvivorBonus", totalLastSurvivorBonus, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "tbd" : "totalBulletDamageScore", totalBulletDamageScore, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "tbk" : "totalBulletKillBonus", totalBulletKillBonus, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "trd" : "totalRammingDamageScore", - totalRammingDamageScore, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "trk" : "totalRammingKillBonus", totalRammingKillBonus, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "t1" : "totalFirsts", totalFirsts); - writer.writeAttribute(options.shortAttributes ? "t2" : "totalSeconds", totalSeconds); - writer.writeAttribute(options.shortAttributes ? "t3" : "totalThirds", totalThirds); - } - writer.writeAttribute(options.shortAttributes ? "c" : "currentScore", currentScore, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "ss" : "currentSurvivalScore", currentSurvivalScore, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "bd" : "currentBulletDamageScore", currentBulletDamageScore, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "bk" : "currentBulletKillBonus", currentBulletKillBonus, - options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "rd" : "currentRammingDamageScore", - currentRammingDamageScore, options.trimPrecision); - writer.writeAttribute(options.shortAttributes ? "rk" : "currentRammingKillBonus", currentRammingKillBonus, - options.trimPrecision); - if (!options.skipVersion) { - writer.writeAttribute("ver", serialVersionUID); - } - - } - writer.endElement(); - } - - // allows loading of minimalistic XML - ScoreSnapshot(String contestantName) { - this.name = contestantName; - } - - /** - * {@inheritDoc} - */ - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("score", "sc", new XmlReader.Element() { - public IXmlSerializable read(XmlReader reader) { - final ScoreSnapshot snapshot = new ScoreSnapshot(); - - reader.expect("name", new XmlReader.Attribute() { - public void read(String value) { - snapshot.name = value; - } - }); - reader.expect("totalScore", "t", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalScore = Double.parseDouble(value); - } - }); - reader.expect("totalSurvivalScore", "tss", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalSurvivalScore = Double.parseDouble(value); - } - }); - reader.expect("totalLastSurvivorBonus", "tls", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalLastSurvivorBonus = Double.parseDouble(value); - } - }); - reader.expect("totalBulletDamageScore", "tbd", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalBulletDamageScore = Double.parseDouble(value); - } - }); - reader.expect("totalBulletKillBonus", "tbk", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalBulletKillBonus = Double.parseDouble(value); - } - }); - reader.expect("totalRammingDamageScore", "trd", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalRammingDamageScore = Double.parseDouble(value); - } - }); - reader.expect("totalRammingKillBonus", "trk", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalRammingKillBonus = Double.parseDouble(value); - } - }); - reader.expect("totalFirsts", "t1", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalFirsts = Integer.parseInt(value); - } - }); - reader.expect("totalSeconds", "t2", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalSeconds = Integer.parseInt(value); - } - }); - reader.expect("totalThirds", "t3", new XmlReader.Attribute() { - public void read(String value) { - snapshot.totalThirds = Integer.parseInt(value); - } - }); - reader.expect("currentScore", "c", new XmlReader.Attribute() { - public void read(String value) { - snapshot.currentScore = Double.parseDouble(value); - } - }); - reader.expect("currentSurvivalScore", "ss", new XmlReader.Attribute() { - public void read(String value) { - snapshot.currentSurvivalScore = Double.parseDouble(value); - } - }); - reader.expect("currentBulletDamageScore", "bd", new XmlReader.Attribute() { - public void read(String value) { - snapshot.currentBulletDamageScore = Double.parseDouble(value); - } - }); - reader.expect("currentBulletKillBonus", "bk", new XmlReader.Attribute() { - public void read(String value) { - snapshot.currentBulletKillBonus = Double.parseDouble(value); - } - }); - reader.expect("currentRammingDamageScore", "rd", new XmlReader.Attribute() { - public void read(String value) { - snapshot.currentRammingDamageScore = Double.parseDouble(value); - } - }); - reader.expect("currentRammingKillBonus", "rk", new XmlReader.Attribute() { - public void read(String value) { - snapshot.currentRammingKillBonus = Double.parseDouble(value); - } - }); - return snapshot; - } - }); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - long temp; - - temp = Double.doubleToLongBits(currentBulletDamageScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(currentBulletKillBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(currentRammingDamageScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(currentRammingKillBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(currentScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(currentSurvivalBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(currentSurvivalScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - temp = Double.doubleToLongBits(totalBulletDamageScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(totalBulletKillBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + totalFirsts; - temp = Double.doubleToLongBits(totalLastSurvivorBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(totalRammingDamageScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(totalRammingKillBonus); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(totalScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + totalSeconds; - temp = Double.doubleToLongBits(totalSurvivalScore); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + totalThirds; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - ScoreSnapshot other = (ScoreSnapshot) obj; - - if (Double.doubleToLongBits(currentBulletDamageScore) != Double.doubleToLongBits(other.currentBulletDamageScore)) { - return false; - } - if (Double.doubleToLongBits(currentBulletKillBonus) != Double.doubleToLongBits(other.currentBulletKillBonus)) { - return false; - } - if (Double.doubleToLongBits(currentRammingDamageScore) - != Double.doubleToLongBits(other.currentRammingDamageScore)) { - return false; - } - if (Double.doubleToLongBits(currentRammingKillBonus) != Double.doubleToLongBits(other.currentRammingKillBonus)) { - return false; - } - if (Double.doubleToLongBits(currentScore) != Double.doubleToLongBits(other.currentScore)) { - return false; - } - if (Double.doubleToLongBits(currentSurvivalBonus) != Double.doubleToLongBits(other.currentSurvivalBonus)) { - return false; - } - if (Double.doubleToLongBits(currentSurvivalScore) != Double.doubleToLongBits(other.currentSurvivalScore)) { - return false; - } - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - if (Double.doubleToLongBits(totalBulletDamageScore) != Double.doubleToLongBits(other.totalBulletDamageScore)) { - return false; - } - if (Double.doubleToLongBits(totalBulletKillBonus) != Double.doubleToLongBits(other.totalBulletKillBonus)) { - return false; - } - if (totalFirsts != other.totalFirsts) { - return false; - } - if (Double.doubleToLongBits(totalLastSurvivorBonus) != Double.doubleToLongBits(other.totalLastSurvivorBonus)) { - return false; - } - if (Double.doubleToLongBits(totalRammingDamageScore) != Double.doubleToLongBits(other.totalRammingDamageScore)) { - return false; - } - if (Double.doubleToLongBits(totalRammingKillBonus) != Double.doubleToLongBits(other.totalRammingKillBonus)) { - return false; - } - if (Double.doubleToLongBits(totalScore) != Double.doubleToLongBits(other.totalScore)) { - return false; - } - if (totalSeconds != other.totalSeconds) { - return false; - } - if (Double.doubleToLongBits(totalSurvivalScore) != Double.doubleToLongBits(other.totalSurvivalScore)) { - return false; - } - if (totalThirds != other.totalThirds) { - return false; - } - return true; - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/TurnSnapshot.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/TurnSnapshot.java deleted file mode 100644 index bba2b48..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/battle/snapshot/TurnSnapshot.java +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.snapshot; - - -import net.sf.robocode.battle.Battle; -import net.sf.robocode.battle.peer.BulletPeer; -import net.sf.robocode.battle.peer.RobotPeer; -import net.sf.robocode.serialization.IXmlSerializable; -import net.sf.robocode.serialization.XmlReader; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.serialization.XmlWriter; -import robocode.control.snapshot.*; - -import java.io.IOException; -import java.util.*; - - -/** - * A snapshot of a battle turn at a specific time instant in a battle. - * The snapshot contains a snapshot of the battle turn data at that specific time. - * - * @author Flemming N. Larsen (original) - * @author Pavel Savara (contributor) - * - * @since 1.6.1 - */ -public final class TurnSnapshot implements java.io.Serializable, IXmlSerializable, ITurnSnapshot { - - private static final long serialVersionUID = 1L; - - /** List of snapshots for the robots participating in the battle */ - private List robots; - - /** List of snapshots for the bullets that are currently on the battlefield */ - private List bullets; - - /** Current TPS (turns per second) */ - private int tps; - - /** Current round in the battle */ - private int round; - - /** Current turn in the battle round */ - private int turn; - - /** - * Creates a snapshot of a battle turn that must be filled out with data later. - */ - public TurnSnapshot() {} - - /** - * Creates a snapshot of a battle turn. - * - * @param battle the battle to make a snapshot of. - * @param battleRobots the robots participating in the battle. - * @param battleBullets the current bullet on the battlefield. - * @param readoutText {@code true} if the output text from the robots must be included in the snapshot; - * {@code false} otherwise. - */ - public TurnSnapshot(Battle battle, List battleRobots, List battleBullets, boolean readoutText) { - robots = new ArrayList(); - bullets = new ArrayList(); - - for (RobotPeer robotPeer : battleRobots) { - robots.add(new RobotSnapshot(robotPeer, readoutText)); - } - - for (BulletPeer bulletPeer : battleBullets) { - bullets.add(new BulletSnapshot(bulletPeer)); - } - - tps = battle.getTPS(); - turn = battle.getTime(); - round = battle.getRoundNum(); - } - - @Override - public String toString() { - return this.round + "/" + turn + " (" + this.robots.size() + ")"; - } - - /** - * {@inheritDoc} - */ - public IRobotSnapshot[] getRobots() { - return robots.toArray(new IRobotSnapshot[robots.size()]); - } - - /** - * {@inheritDoc} - */ - public IBulletSnapshot[] getBullets() { - return bullets.toArray(new IBulletSnapshot[bullets.size()]); - } - - /** - * {@inheritDoc} - */ - public int getTPS() { - return tps; - } - - /** - * {@inheritDoc} - */ - public int getRound() { - return round; - } - - /** - * {@inheritDoc} - */ - public int getTurn() { - return turn; - } - - /** - * {@inheritDoc} - */ - public IScoreSnapshot[] getSortedTeamScores() { - List copy = new ArrayList(Arrays.asList(getIndexedTeamScores())); - - Collections.sort(copy); - Collections.reverse(copy); - return copy.toArray(new IScoreSnapshot[copy.size()]); - } - - /** - * {@inheritDoc} - */ - public IScoreSnapshot[] getIndexedTeamScores() { - // team scores are computed on demand from team scores to not duplicate data in the snapshot - - List results = new ArrayList(); - - // noinspection ForLoopReplaceableByForEach - for (int i = 0; i < robots.size(); i++) { - results.add(null); - } - for (IRobotSnapshot robot : robots) { - final int contestantIndex = robot.getContestantIndex(); - final IScoreSnapshot snapshot = results.get(contestantIndex); - - IScoreSnapshot score = (snapshot == null) - ? robot.getScoreSnapshot() - : new ScoreSnapshot(robot.getTeamName(), snapshot, robot.getScoreSnapshot()); - - results.set(contestantIndex, score); - } - List scores = new ArrayList(); - - for (IScoreSnapshot scoreSnapshot : results) { - if (scoreSnapshot != null) { - scores.add(scoreSnapshot); - } - } - - return scores.toArray(new IScoreSnapshot[scores.size()]); - } - - public void stripDetails(SerializableOptions options) { - for (IRobotSnapshot r : getRobots()) { - ((RobotSnapshot) r).stripDetails(options); - } - } - - /** - * {@inheritDoc} - */ - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException { - writer.startElement(options.shortAttributes ? "t" : "turn"); { - writer.writeAttribute(options.shortAttributes ? "ro" : "round", round); - writer.writeAttribute(options.shortAttributes ? "tu" : "turn", turn); - if (!options.skipVersion) { - writer.writeAttribute("ver", serialVersionUID); - } - - writer.startElement(options.shortAttributes ? "rs" : "robots"); { - SerializableOptions op = options; - - if (turn == 0) { - op = new SerializableOptions(options); - op.skipNames = false; - } - for (IRobotSnapshot r : robots) { - final RobotSnapshot rs = (RobotSnapshot) r; - - if (!options.skipExploded || rs.getState() != RobotState.DEAD) { - rs.writeXml(writer, op); - } else { - boolean writeFirstExplosionFrame = false; - - for (IBulletSnapshot b : bullets) { - if (b.isExplosion() && b.getFrame() == 0 && b.getVictimIndex() == r.getRobotIndex()) { - writeFirstExplosionFrame = true; - break; - } - } - if (writeFirstExplosionFrame) { - rs.writeXml(writer, op); - } - } - } - } - writer.endElement(); - - writer.startElement(options.shortAttributes ? "bs" : "bullets"); { - for (IBulletSnapshot b : bullets) { - final BulletSnapshot bs = (BulletSnapshot) b; - final BulletState state = bs.getState(); - - if (!options.skipExploded - || (state != BulletState.EXPLODED && state != BulletState.INACTIVE - && (bs.getFrame() == 0 || state == BulletState.MOVING))) { - bs.writeXml(writer, options); - } - } - } - writer.endElement(); - } - writer.endElement(); - } - - /** - * {@inheritDoc} - */ - public XmlReader.Element readXml(final XmlReader reader) { - return reader.expect("turn", "t", new XmlReader.Element() { - public IXmlSerializable read(final XmlReader reader) { - final TurnSnapshot snapshot = new TurnSnapshot(); - - reader.expect("turn", "tu", new XmlReader.Attribute() { - public void read(String value) { - snapshot.turn = Integer.parseInt(value); - } - }); - reader.expect("round", "ro", new XmlReader.Attribute() { - public void read(String value) { - snapshot.round = Integer.parseInt(value); - } - }); - - reader.expect("robots", "rs", new XmlReader.ListElement() { - public IXmlSerializable read(XmlReader reader) { - snapshot.robots = new ArrayList(); - // prototype - return new RobotSnapshot(); - } - - public void add(IXmlSerializable child) { - snapshot.robots.add((RobotSnapshot) child); - } - - public void close() { - // allows loading of minimalistic XML, which skips dead robots, but GUI expects them - Map context = reader.getContext(); - Integer robotCount = (Integer) context.get("robots"); - boolean[] present = new boolean[robotCount]; - - for (IRobotSnapshot robot : snapshot.robots) { - present[robot.getRobotIndex()] = true; - } - for (int i = 0; i < robotCount; i++) { - if (!present[i]) { - String name = (String) context.get(Integer.toString(i)); - - snapshot.robots.add(new RobotSnapshot(name, i, RobotState.DEAD)); - } - } - } - }); - - reader.expect("bullets", "bs", new XmlReader.ListElement() { - public IXmlSerializable read(XmlReader reader) { - snapshot.bullets = new ArrayList(); - // prototype - return new BulletSnapshot(); - } - - public void add(IXmlSerializable child) { - snapshot.bullets.add((BulletSnapshot) child); - } - - public void close() {} - }); - - return snapshot; - } - }); - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattlePlayer.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattlePlayer.java deleted file mode 100644 index 3872b12..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattlePlayer.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.recording; - - -import net.sf.robocode.battle.BaseBattle; -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.battle.snapshot.RobotSnapshot; -import net.sf.robocode.settings.ISettingsManager; -import robocode.BattleResults; -import robocode.control.events.*; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - -import java.util.List; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (original) - */ -public final class BattlePlayer extends BaseBattle { - - private final RecordManager recordManager; - private boolean[] paint; - - public BattlePlayer(ISettingsManager properties, IBattleManager battleManager, RecordManager recordManager, BattleEventDispatcher eventDispatcher) { // NO_UCD (unused code) - super( - properties, battleManager, eventDispatcher); - this.recordManager = recordManager; - } - - @Override - protected void initializeBattle() { - super.initializeBattle(); - - recordManager.prepareInputStream(); - - battleRules = recordManager.recordInfo.battleRules; - paint = new boolean[recordManager.recordInfo.robotCount]; - eventDispatcher.onBattleStarted(new BattleStartedEvent(battleRules, recordManager.recordInfo.robotCount, true)); - if (isPaused) { - eventDispatcher.onBattlePaused(new BattlePausedEvent()); - } - } - - @Override - protected void finalizeBattle() { - boolean aborted = recordManager.recordInfo.results == null || isAborted(); - - eventDispatcher.onBattleFinished(new BattleFinishedEvent(aborted)); - - if (!aborted) { - final List res = recordManager.recordInfo.results; - - eventDispatcher.onBattleCompleted( - new BattleCompletedEvent(battleRules, res.toArray(new BattleResults[res.size()]))); - } - - super.finalizeBattle(); - - cleanup(); - } - - @Override - protected void initializeRound() { - super.initializeRound(); - - final ITurnSnapshot snapshot = recordManager.readSnapshot(currentTime); - - if (snapshot != null) { - eventDispatcher.onRoundStarted(new RoundStartedEvent(snapshot, getRoundNum())); - } - } - - @Override - protected void finalizeRound() { - super.finalizeRound(); - - eventDispatcher.onRoundEnded(new RoundEndedEvent(getRoundNum(), getTime(), totalTurns)); - } - - @Override - protected void initializeTurn() { - super.initializeTurn(); - - eventDispatcher.onTurnStarted(new TurnStartedEvent()); - } - - @Override - protected void finalizeTurn() { - final ITurnSnapshot snapshot = recordManager.readSnapshot(currentTime); - - if (snapshot != null) { - final IRobotSnapshot[] robots = snapshot.getRobots(); - - for (int i = 0; i < robots.length; i++) { - RobotSnapshot robot = (RobotSnapshot) robots[i]; - - robot.setPaintEnabled(paint[i]); - } - eventDispatcher.onTurnEnded(new TurnEndedEvent(snapshot)); - } - - super.finalizeTurn(); - } - - @Override - protected boolean isRoundOver() { - final boolean end = getTime() >= recordManager.recordInfo.turnsInRounds[getRoundNum()] - 1; - - if (end) { - if (recordManager.recordInfo.turnsInRounds.length > getRoundNum() - && recordManager.recordInfo.turnsInRounds[getRoundNum()] == 0) { - isAborted = true; - } - } - return (isAborted || end); - } - - @Override - public void cleanup() { - super.cleanup(); - recordManager.cleanupStreams(); - } - - public void setPaintEnabled(int robotIndex, boolean enable) { - sendCommand(new EnableRobotPaintCommand(robotIndex, enable)); - } - - private class EnableRobotPaintCommand extends RobotCommand { - final boolean enablePaint; - - EnableRobotPaintCommand(int robotIndex, boolean enablePaint) { - super(robotIndex); - this.enablePaint = enablePaint; - } - - public void execute() { - paint[robotIndex] = enablePaint; - } - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecordInfo.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecordInfo.java deleted file mode 100644 index 9bab5c2..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecordInfo.java +++ /dev/null @@ -1,330 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.recording; - - -import net.sf.robocode.battle.BattleProperties; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.serialization.IXmlSerializable; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.serialization.XmlReader; -import net.sf.robocode.serialization.XmlWriter; -import robocode.BattleResults; -import robocode.BattleRules; - -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (original) - */ -class BattleRecordInfo implements Serializable, IXmlSerializable { - private static final long serialVersionUID = 1L; - - int robotCount; - int roundsCount; - BattleRules battleRules; - Integer[] turnsInRounds; - List results; - - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException { - writer.startElement("recordInfo"); { - writer.writeAttribute("robotCount", robotCount); - writer.writeAttribute("roundsCount", roundsCount); - if (!options.skipVersion) { - writer.writeAttribute("ver", serialVersionUID); - } - writer.startElement("rules"); { - writer.writeAttribute("battlefieldWidth", battleRules.getBattlefieldWidth()); - writer.writeAttribute("battlefieldHeight", battleRules.getBattlefieldHeight()); - writer.writeAttribute("numRounds", battleRules.getNumRounds()); - writer.writeAttribute("gunCoolingRate", battleRules.getGunCoolingRate(), options.trimPrecision); - writer.writeAttribute("inactivityTime", battleRules.getInactivityTime()); - writer.writeAttribute("ver", serialVersionUID); - } - writer.endElement(); - - writer.startElement("rounds"); { - for (int n : turnsInRounds) { - writer.startElement("turns"); { - writer.writeAttribute("value", Integer.toString(n)); - } - writer.endElement(); - } - } - writer.endElement(); - - if (results != null) { - writer.startElement("results"); { - for (BattleResults result : results) { - new BattleResultsWrapper(result).writeXml(writer, options); - } - } - writer.endElement(); - } - } - writer.endElement(); - } - - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("recordInfo", new XmlReader.Element() { - public IXmlSerializable read(XmlReader reader) { - final BattleRecordInfo recordInfo = new BattleRecordInfo(); - - reader.expect("robotCount", new XmlReader.Attribute() { - public void read(String value) { - recordInfo.robotCount = Integer.parseInt(value); - } - }); - reader.expect("roundsCount", new XmlReader.Attribute() { - public void read(String value) { - recordInfo.roundsCount = Integer.parseInt(value); - } - }); - - new BattleRulesWrapper(recordInfo).readXml(reader); - - reader.expect("rounds", new XmlReader.ListElement() { - final ArrayList ints = new ArrayList(); - - public IXmlSerializable read(XmlReader reader) { - // prototype - return new IntValue("turns"); - } - - public void add(IXmlSerializable child) { - ints.add(((IntValue) child).intValue); - } - - public void close() { - recordInfo.turnsInRounds = new Integer[ints.size()]; - ints.toArray(recordInfo.turnsInRounds); - } - }); - - reader.expect("results", new XmlReader.ListElement() { - - public IXmlSerializable read(XmlReader reader) { - recordInfo.results = new ArrayList(); - // prototype - return new BattleResultsWrapper(); - } - - public void add(IXmlSerializable child) { - recordInfo.results.add((BattleResults) child); - } - - public void close() {} - }); - return recordInfo; - } - }); - } - - private class IntValue implements IXmlSerializable { - private IntValue(String name) { - this.name = name; - } - private final String name; - private int intValue; - - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException {} - - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect(name, new XmlReader.Element() { - public IXmlSerializable read(XmlReader reader) { - final IntValue recordInfo = new IntValue(name); - - reader.expect("value", new XmlReader.Attribute() { - public void read(String value) { - recordInfo.intValue = Integer.parseInt(value); - } - }); - return recordInfo; - } - }); - } - } - - - /** - * This class is used for wrapping a robocode.BattleResults object and provides - * methods for XML serialization that are hidden from the BattleResults class, - * which is a part of the public Robot API for Robocode. - * - * @author Flemming N. Larsen (original) - */ - private class BattleResultsWrapper extends BattleResults implements IXmlSerializable { - - private static final long serialVersionUID = BattleResults.serialVersionUID; - - public BattleResultsWrapper() { - super(null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - } - - private BattleResultsWrapper(BattleResults results) { - super(results.getTeamLeaderName(), results.getRank(), results.getScore(), results.getSurvival(), - results.getLastSurvivorBonus(), results.getBulletDamage(), results.getBulletDamageBonus(), - results.getRamDamage(), results.getRamDamageBonus(), results.getFirsts(), results.getSeconds(), - results.getThirds()); - } - - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException { - writer.startElement("result"); { - writer.writeAttribute("teamLeaderName", teamLeaderName); - writer.writeAttribute("rank", rank); - writer.writeAttribute("score", score, options.trimPrecision); - writer.writeAttribute("survival", survival, options.trimPrecision); - writer.writeAttribute("lastSurvivorBonus", lastSurvivorBonus, options.trimPrecision); - writer.writeAttribute("bulletDamage", bulletDamage, options.trimPrecision); - writer.writeAttribute("bulletDamageBonus", bulletDamageBonus, options.trimPrecision); - writer.writeAttribute("ramDamage", ramDamage, options.trimPrecision); - writer.writeAttribute("ramDamageBonus", ramDamageBonus, options.trimPrecision); - writer.writeAttribute("firsts", firsts); - writer.writeAttribute("seconds", seconds); - writer.writeAttribute("thirds", thirds); - if (!options.skipVersion) { - writer.writeAttribute("ver", serialVersionUID); - } - } - writer.endElement(); - } - - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("result", new XmlReader.Element() { - public IXmlSerializable read(XmlReader reader) { - final BattleResultsWrapper rules = new BattleResultsWrapper(); - - reader.expect("teamLeaderName", new XmlReader.Attribute() { - public void read(String value) { - rules.teamLeaderName = value; - } - }); - - reader.expect("rank", new XmlReader.Attribute() { - public void read(String value) { - rules.rank = Integer.parseInt(value); - } - }); - reader.expect("score", new XmlReader.Attribute() { - public void read(String value) { - rules.score = Double.parseDouble(value); - } - }); - reader.expect("survival", new XmlReader.Attribute() { - public void read(String value) { - rules.survival = Double.parseDouble(value); - } - }); - reader.expect("lastSurvivorBonus", new XmlReader.Attribute() { - public void read(String value) { - rules.lastSurvivorBonus = Double.parseDouble(value); - } - }); - reader.expect("bulletDamage", new XmlReader.Attribute() { - public void read(String value) { - rules.bulletDamage = Double.parseDouble(value); - } - }); - reader.expect("bulletDamageBonus", new XmlReader.Attribute() { - public void read(String value) { - rules.bulletDamageBonus = Double.parseDouble(value); - } - }); - reader.expect("ramDamage", new XmlReader.Attribute() { - public void read(String value) { - rules.ramDamage = Double.parseDouble(value); - } - }); - reader.expect("ramDamageBonus", new XmlReader.Attribute() { - public void read(String value) { - rules.ramDamageBonus = Double.parseDouble(value); - } - }); - reader.expect("firsts", new XmlReader.Attribute() { - public void read(String value) { - rules.firsts = Integer.parseInt(value); - } - }); - reader.expect("seconds", new XmlReader.Attribute() { - public void read(String value) { - rules.seconds = Integer.parseInt(value); - } - }); - reader.expect("thirds", new XmlReader.Attribute() { - public void read(String value) { - rules.thirds = Integer.parseInt(value); - } - }); - - return rules; - } - }); - } - } - - - private static class BattleRulesWrapper implements IXmlSerializable { - BattleRulesWrapper(BattleRecordInfo recinfo) { - this.recinfo = recinfo; - } - - final BattleProperties props = new BattleProperties(); - final BattleRecordInfo recinfo; - - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException {} - - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("rules", - new XmlReader.ElementClose() { - public IXmlSerializable read(XmlReader reader) { - - reader.expect("battlefieldWidth", new XmlReader.Attribute() { - public void read(String value) { - props.setBattlefieldWidth(Integer.parseInt(value)); - } - }); - reader.expect("battlefieldHeight", new XmlReader.Attribute() { - public void read(String value) { - props.setBattlefieldHeight(Integer.parseInt(value)); - } - }); - - reader.expect("numRounds", new XmlReader.Attribute() { - public void read(String value) { - props.setNumRounds(Integer.parseInt(value)); - } - }); - reader.expect("inactivityTime", new XmlReader.Attribute() { - public void read(String value) { - props.setInactivityTime(Integer.parseInt(value)); - } - }); - reader.expect("gunCoolingRate", new XmlReader.Attribute() { - public void read(String value) { - props.setGunCoolingRate(Double.parseDouble(value)); - } - }); - - return BattleRulesWrapper.this; - } - - public void close() { - recinfo.battleRules = HiddenAccess.createRules(props.getBattlefieldWidth(), - props.getBattlefieldHeight(), props.getNumRounds(), props.getGunCoolingRate(), - props.getInactivityTime(), props.getHideEnemyNames(), props.getSentryBorderSize()); - } - }); - } - } - -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecorder.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecorder.java deleted file mode 100644 index f7ad6cc..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/BattleRecorder.java +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.recording; - - -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.settings.ISettingsManager; -import robocode.BattleResults; -import robocode.control.events.*; - -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Calendar; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (original) - */ -class BattleRecorder { - private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss"); - - private final RecordManager recordmanager; - private final ISettingsManager properties; - private BattleObserver battleObserver; - - BattleRecorder(RecordManager recordmanager, ISettingsManager properties) { - this.recordmanager = recordmanager; - this.properties = properties; - } - - void attachRecorder(BattleEventDispatcher battleEventDispatcher) { - if (battleObserver != null) { - battleObserver.dispose(); - } - battleObserver = new BattleObserver(battleEventDispatcher); - } - - void detachRecorder() { - if (battleObserver != null) { - battleObserver.dispose(); - } - } - - private class BattleObserver extends BattleAdaptor { - private final BattleEventDispatcher dispatcher; - - private int currentTurn; - private int currentRound; - - public BattleObserver(BattleEventDispatcher dispatcher) { - this.dispatcher = dispatcher; - dispatcher.addListener(this); - } - - public void dispose() { - dispatcher.removeListener(this); - recordmanager.cleanupStreams(); - } - - @Override - public void onBattleStarted(BattleStartedEvent event) { - recordmanager.cleanupStreams(); - recordmanager.createRecordInfo(event.getBattleRules(), event.getRobotsCount()); - - currentRound = 0; - currentTurn = 0; - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - recordmanager.cleanupStreams(); - } - - @Override - public void onBattleCompleted(BattleCompletedEvent event) { - recordmanager.updateRecordInfoResults(Arrays.asList(event.getIndexedResults())); - - if (properties.getOptionsCommonEnableAutoRecording()) { - writeAutoRecord(event); - } - } - - @Override - public void onRoundStarted(RoundStartedEvent event) { - currentRound = event.getRound(); - currentTurn = 0; - recordmanager.writeTurn(event.getStartSnapshot(), currentRound, currentTurn); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - currentTurn = event.getTurnSnapshot().getTurn(); - recordmanager.writeTurn(event.getTurnSnapshot(), currentRound, currentTurn); - } - - private void writeAutoRecord(BattleCompletedEvent event) { - try { - final BattleResults[] results = event.getIndexedResults(); - StringBuilder name = new StringBuilder(); - - name.append(FileUtil.getBattlesDir().getCanonicalPath()); - name.append(File.separator); - - Calendar calendar = Calendar.getInstance(); - - name.append(dateFormat.format(calendar.getTime())); - name.append('-'); - for (BattleResults r : results) { - String teamLeaderName = r.getTeamLeaderName(); - - if (teamLeaderName.contains("*")) { // Development version of robot indicated with * in name - teamLeaderName = teamLeaderName.replace("*", ""); // Remove the star (*) - } - name.append(teamLeaderName); - name.append('-'); - } - name.setLength(name.length() - 1); - if (properties.getOptionsCommonAutoRecordingXML()) { - name.append(".xml.zip"); - recordmanager.saveRecord(name.toString(), BattleRecordFormat.XML_ZIP, new SerializableOptions(true)); - } else { - name.append(".zip.br"); - recordmanager.saveRecord(name.toString(), BattleRecordFormat.BINARY_ZIP, - new SerializableOptions(true)); - } - } catch (IOException e) { - Logger.logError(e); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java b/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java deleted file mode 100644 index 82afc32..0000000 --- a/代码/workspace_robo4/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java +++ /dev/null @@ -1,448 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.recording; - - -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.battle.snapshot.TurnSnapshot; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import static net.sf.robocode.io.Logger.logError; -import net.sf.robocode.serialization.IXmlSerializable; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.serialization.XmlReader; -import net.sf.robocode.serialization.XmlWriter; -import net.sf.robocode.settings.ISettingsManager; -import robocode.BattleResults; -import robocode.BattleRules; -import robocode.control.snapshot.ITurnSnapshot; - -import java.io.*; -import java.nio.charset.Charset; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - - -/** - * @author Pavel Savara (original) - */ -public class RecordManager implements IRecordManager { - private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss"); - - private final ISettingsManager properties; - - private File tempFile; - private BattleRecorder recorder; - - BattleRecordInfo recordInfo; - private FileOutputStream fileWriteStream; - private BufferedOutputStream bufferedWriteStream; - private ObjectOutputStream objectWriteStream; - - private FileInputStream fileReadStream; - private BufferedInputStream bufferedReadStream; - private ObjectInputStream objectReadStream; - - public RecordManager(ISettingsManager properties) { // NO_UCD (unused code) - this.properties = properties; - recorder = new BattleRecorder(this, properties); - } - - protected void finalize() throws Throwable { - try { - cleanup(); - } finally { - super.finalize(); - } - } - - private void cleanup() { - cleanupStreams(); - if (tempFile != null && tempFile.exists()) { - if (tempFile.delete() == false) { - Logger.logError("Could not delete temp file"); - } - tempFile = null; - } - recordInfo = null; - } - - void cleanupStreams() { - FileUtil.cleanupStream(objectWriteStream); - objectWriteStream = null; - FileUtil.cleanupStream(bufferedWriteStream); - bufferedWriteStream = null; - FileUtil.cleanupStream(fileWriteStream); - fileWriteStream = null; - - FileUtil.cleanupStream(objectReadStream); - objectReadStream = null; - FileUtil.cleanupStream(bufferedReadStream); - bufferedReadStream = null; - FileUtil.cleanupStream(fileReadStream); - fileReadStream = null; - } - - public void attachRecorder(BattleEventDispatcher battleEventDispatcher) { - recorder.attachRecorder(battleEventDispatcher); - } - - public void detachRecorder() { - recorder.detachRecorder(); - } - - private void createTempFile() { - try { - if (tempFile == null) { - tempFile = File.createTempFile("robocode-battle-records", ".tmp"); - tempFile.deleteOnExit(); - } else { - if (!tempFile.delete()) { - Logger.logError("Could not delete temp file"); - } - if (!tempFile.createNewFile()) { - throw new Error("Temp file creation failed"); - } - } - } catch (IOException e) { - logError(e); - throw new Error("Temp file creation failed", e); - } - } - - void prepareInputStream() { - try { - fileReadStream = new FileInputStream(tempFile); - bufferedReadStream = new BufferedInputStream(fileReadStream); - objectReadStream = new ObjectInputStream(bufferedReadStream); - } catch (FileNotFoundException e) { - logError(e); - fileReadStream = null; - bufferedReadStream = null; - objectReadStream = null; - } catch (IOException e) { - logError(e); - fileReadStream = null; - bufferedReadStream = null; - objectReadStream = null; - } - } - - ITurnSnapshot readSnapshot(int currentTime) { - if (objectReadStream == null) { - return null; - } - try { - // TODO implement seek to currentTime, warn you. turns don't have same size in bytes - return (ITurnSnapshot) objectReadStream.readObject(); - } catch (EOFException e) { - logError(e); - return null; - } catch (Exception e) { - logError(e); - return null; - } - } - - public void loadRecord(String recordFilename, BattleRecordFormat format) { - FileInputStream fis = null; - BufferedInputStream bis = null; - ZipInputStream zis = null; - ObjectInputStream ois = null; - InputStream xis = null; - - FileOutputStream fos = null; - BufferedOutputStream bos = null; - ObjectOutputStream oos = null; - - try { - createTempFile(); - fis = new FileInputStream(recordFilename); - bis = new BufferedInputStream(fis, 1024 * 1024); - - if (format == BattleRecordFormat.BINARY) { - ois = new ObjectInputStream(bis); - } else if (format == BattleRecordFormat.BINARY_ZIP) { - zis = new ZipInputStream(bis); - zis.getNextEntry(); - ois = new ObjectInputStream(zis); - } else if (format == BattleRecordFormat.XML_ZIP) { - zis = new ZipInputStream(bis); - zis.getNextEntry(); - xis = zis; - } else if (format == BattleRecordFormat.XML) { - xis = bis; - } - if (format == BattleRecordFormat.BINARY || format == BattleRecordFormat.BINARY_ZIP) { - recordInfo = (BattleRecordInfo) ois.readObject(); - if (recordInfo.turnsInRounds != null) { - fos = new FileOutputStream(tempFile); - bos = new BufferedOutputStream(fos, 1024 * 1024); - oos = new ObjectOutputStream(bos); - - for (int i = 0; i < recordInfo.turnsInRounds.length; i++) { - for (int j = recordInfo.turnsInRounds[i] - 1; j >= 0; j--) { - try { - ITurnSnapshot turn = (ITurnSnapshot) ois.readObject(); - - oos.writeObject(turn); - } catch (ClassNotFoundException e) { - logError(e); - } - } - } - } - } else { - final RecordRoot root = new RecordRoot(); - - fos = new FileOutputStream(tempFile); - bos = new BufferedOutputStream(fos, 1024 * 1024); - root.oos = new ObjectOutputStream(bos); - XmlReader.deserialize(xis, root); - if (root.lastException != null) { - logError(root.lastException); - } - recordInfo = root.recordInfo; - } - } catch (IOException e) { - logError(e); - createTempFile(); - recordInfo = null; - } catch (ClassNotFoundException e) { - if (e.getMessage().contains("robocode.recording.BattleRecordInfo")) { - Logger.logError("Sorry, backward compatibility with record from version 1.6 is not provided."); - } else { - logError(e); - } - createTempFile(); - recordInfo = null; - } finally { - FileUtil.cleanupStream(oos); - FileUtil.cleanupStream(bos); - FileUtil.cleanupStream(fos); - FileUtil.cleanupStream(ois); - FileUtil.cleanupStream(zis); - FileUtil.cleanupStream(bis); - FileUtil.cleanupStream(fis); - } - } - - private static class RecordRoot implements IXmlSerializable { - - public RecordRoot() { - me = this; - } - - public ObjectOutputStream oos; - public IOException lastException; - public final RecordRoot me; - public BattleRecordInfo recordInfo; - - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException {} - - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("record", new XmlReader.Element() { - public IXmlSerializable read(final XmlReader reader) { - - final XmlReader.Element element = (new BattleRecordInfo()).readXml(reader); - - reader.expect("recordInfo", new XmlReader.ElementClose() { - public IXmlSerializable read(XmlReader reader) { - recordInfo = (BattleRecordInfo) element.read(reader); - return recordInfo; - } - - public void close() { - reader.getContext().put("robots", recordInfo.robotCount); - } - }); - - reader.expect("turns", new XmlReader.ListElement() { - public IXmlSerializable read(XmlReader reader) { - // prototype - return new TurnSnapshot(); - } - - public void add(IXmlSerializable child) { - try { - me.oos.writeObject(child); - } catch (IOException e) { - me.lastException = e; - } - } - - public void close() {} - }); - - return me; - } - }); - } - } - - public void saveRecord(String recordFilename, BattleRecordFormat format, SerializableOptions options) { - FileOutputStream fos = null; - BufferedOutputStream bos = null; - ZipOutputStream zos = null; - ObjectOutputStream oos = null; - OutputStreamWriter osw = null; - XmlWriter xwr = null; - - FileInputStream fis = null; - BufferedInputStream bis = null; - ObjectInputStream ois = null; - - final boolean isbin = format == BattleRecordFormat.BINARY || format == BattleRecordFormat.BINARY_ZIP; - final boolean isxml = format == BattleRecordFormat.XML || format == BattleRecordFormat.XML_ZIP; - Calendar calendar = Calendar.getInstance(); - - try { - fos = new FileOutputStream(recordFilename); - bos = new BufferedOutputStream(fos, 1024 * 1024); - - if (format == BattleRecordFormat.BINARY) { - oos = new ObjectOutputStream(bos); - } else if (format == BattleRecordFormat.BINARY_ZIP) { - zos = new ZipOutputStream(bos); - zos.putNextEntry(new ZipEntry(dateFormat.format(calendar.getTime()) + "-robocode.br")); - oos = new ObjectOutputStream(zos); - } else if (format == BattleRecordFormat.XML) { - final Charset utf8 = Charset.forName("UTF-8"); - - osw = new OutputStreamWriter(bos, utf8); - xwr = new XmlWriter(osw, true); - } else if (format == BattleRecordFormat.XML_ZIP) { - final Charset utf8 = Charset.forName("UTF-8"); - - zos = new ZipOutputStream(bos); - zos.putNextEntry(new ZipEntry(dateFormat.format(calendar.getTime()) + "-robocode.xml")); - - osw = new OutputStreamWriter(zos, utf8); - xwr = new XmlWriter(osw, false); - } - - if (isbin) { - oos.writeObject(recordInfo); - } else if (isxml) { - xwr.startDocument(); - xwr.startElement("record"); - xwr.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); - if (options.shortAttributes) { - xwr.writeAttribute("xsi:noNamespaceSchemaLocation", "battleRecordS.xsd"); - } else { - xwr.writeAttribute("xsi:noNamespaceSchemaLocation", "battleRecord.xsd"); - } - recordInfo.writeXml(xwr, options); - xwr.startElement("turns"); - } - - if (recordInfo.turnsInRounds != null) { - fis = new FileInputStream(tempFile); - bis = new BufferedInputStream(fis, 1024 * 1024); - ois = new ObjectInputStream(bis); - - for (int i = 0; i < recordInfo.turnsInRounds.length; i++) { - if (recordInfo.turnsInRounds[i] > 0) { - for (int j = 0; j <= recordInfo.turnsInRounds[i] - 1; j++) { - try { - TurnSnapshot turn = (TurnSnapshot) ois.readObject(); - - if (j != turn.getTurn()) { - throw new Error("Something rotten"); - } - - if (isbin) { - turn.stripDetails(options); - oos.writeObject(turn); - } else if (isxml) { - turn.writeXml(xwr, options); - } - } catch (ClassNotFoundException e) { - logError(e); - } - } - if (isbin) { - oos.flush(); - } else if (isxml) { - osw.flush(); - } - bos.flush(); - fos.flush(); - } - } - if (isxml) { - xwr.endElement(); // turns - xwr.endElement(); // record - osw.flush(); - } - } - - } catch (IOException e) { - logError(e); - recorder = new BattleRecorder(this, properties); - createTempFile(); - } finally { - FileUtil.cleanupStream(ois); - FileUtil.cleanupStream(bis); - FileUtil.cleanupStream(fis); - FileUtil.cleanupStream(oos); - FileUtil.cleanupStream(zos); - FileUtil.cleanupStream(bos); - FileUtil.cleanupStream(fos); - FileUtil.cleanupStream(osw); - } - } - - public boolean hasRecord() { - return recordInfo != null; - } - - void createRecordInfo(BattleRules rules, int numRobots) { - try { - createTempFile(); - - fileWriteStream = new FileOutputStream(tempFile); - bufferedWriteStream = new BufferedOutputStream(fileWriteStream, 1024 * 1024); - objectWriteStream = new ObjectOutputStream(bufferedWriteStream); - } catch (IOException e) { - logError(e); - } - - recordInfo = new BattleRecordInfo(); - recordInfo.robotCount = numRobots; - recordInfo.battleRules = rules; - recordInfo.turnsInRounds = new Integer[rules.getNumRounds()]; - for (int i = 0; i < rules.getNumRounds(); i++) { - recordInfo.turnsInRounds[i] = 0; - } - } - - void updateRecordInfoResults(List results) { - recordInfo.results = results; - } - - void writeTurn(ITurnSnapshot turn, int round, int time) { - try { - if (time != recordInfo.turnsInRounds[round]) { - throw new Error("Something rotten"); - } - if (time == 0) { - objectWriteStream.reset(); - } - recordInfo.turnsInRounds[round]++; - recordInfo.roundsCount = round + 1; - objectWriteStream.writeObject(turn); - } catch (IOException e) { - logError(e); - } - } -} diff --git a/代码/workspace_robo4/robocode.content/.classpath b/代码/workspace_robo4/robocode.content/.classpath deleted file mode 100644 index 5da7d76..0000000 --- a/代码/workspace_robo4/robocode.content/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/.project b/代码/workspace_robo4/robocode.content/.project deleted file mode 100644 index ce0efca..0000000 --- a/代码/workspace_robo4/robocode.content/.project +++ /dev/null @@ -1,18 +0,0 @@ - - - robocode.content - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.samples - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/代码/workspace_robo4/robocode.content/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.content/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.content/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.content/pom.xml b/代码/workspace_robo4/robocode.content/pom.xml deleted file mode 100644 index 911d916..0000000 --- a/代码/workspace_robo4/robocode.content/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - robocode.content - Robocode Content - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.samples - ${project.version} - - - net.sf.robocode - robocode.api - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy - prepare-package - - copy - - - - - org.eclipse.jdt.core.compiler - ecj - 4.4 - jar - false - ${project.build.directory}/classes/compilers - ecj.jar - - - false - false - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - diff --git a/代码/workspace_robo4/robocode.content/robocode.content.iml b/代码/workspace_robo4/robocode.content/robocode.content.iml deleted file mode 100644 index ecbc7a1..0000000 --- a/代码/workspace_robo4/robocode.content/robocode.content.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.html b/代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.html deleted file mode 100644 index 347ead6..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - - - -

ReadMe for Robocode

-

Updated 06-Mar-2013 by Flemming N. Larsen

-

Robocode Home Page: http://robocode.sourceforge.net/

-

TABLE OF CONTENTS

-
    -
  1. What is Robocode?
  2. -
  3. History of Robocode
  4. -
  5. System Requirements
  6. -
  7. Getting Started
  8. -
  9. Robocode API
  10. -
  11. Robocode Repository
  12. -
  13. Community
  14. -
  15. Challenges
  16. -
  17. Competition
  18. -
  19. Command Line
  20. -
  21. Links
  22. -
  23. Reporting Defects
  24. -
  25. Feature Requests
  26. -
  27. Versions
  28. -
  29. News
  30. -
  31. How to contribute
  32. -
-

1. WHAT IS ROBOCODE?

-

Robocode is a programming game where the goal is to code a robot battle tank to compete against other robots in a battle arena. So the name Robocode is a short for "Robot code". The player is the programmer of the robot, who will have no direct influence on the game. Instead, the player must write the AI of the robot telling it how to behave and react on events occurring in the battle arena. Battles are running in real-time and on-screen.

-

The motto of Robocode is: Build the best, destroy the rest!

-

Besides being a programming game, Robocode is used for learning how to program, primarily in the Java language, but other languages like C# and Scala are becoming popular as well.

-

Schools and universities are using Robocode as part of teaching how to program, but also for studying artificial intelligence (AI). The concept of Robocode is easy to understand, and a fun way to learn how to program.

-

Robocode offers complete development environment, and comes with its own installer, built-in robot editor and Java compiler. Robocode only pre-requires that a JVM (Java Virtual Machine) to exist already on the system where Robocode is going to be installed. Hence, everything a robot developer needs to get started is provided with the main Robocode distribution file (robocode-xxx-setup.jar). Robocode also supports developing robots using external IDEs like e.g. Eclipse, IntelliJ IDEA, NetBeans, Visual Studio etc., which supports the developer much better than the robot editor in Robocode.

-

The fact that Robocode runs on the Java platform makes it possible to run it on any operating system with Java pre-installed, meaning that it will be able to run on Windows, Linux, Mac OS, but also UNIX and variants of UNIX. Note that Java 6 or newer must be installed on the system before Robocode is able to run. See the System Requirements for more information.

-

Be aware that many users of Robocode (aka Robocoders) find Robocode to be very fun, but also very addictive. :-)

-

Robocode comes free of charge and is being developed as a spare-time project where no money is involved. The developers of Robocode are developing on Robocode because they think it is fun, and because they improve themselves as developers this way.

-

Robocode is an Open Source project, which means that all sources are open to everybody. In addition, Robocode is provided under the terms of EPL (Eclipse Public License).

-

2. HISTORY OF ROBOCODE

-

The Robocode game was originally started by Mathew A. Nelson as a personal endeavor in late 2000 and became a professional one when he brought it to IBM, in the form of an AlphaWorks download, in July 2001.

-

IBM was interested in Robocode, as they saw an opportunity to promote Robocode as a fun way to get started with learning how to program in Java. IBM wrote lots of articles about Robocode, e.g. like Rock 'em, sock 'em Robocode! from AlphaWorks / developerWorks at IBM, a series of articles like Secrets from the Robocode masters, and "Robocode Rumble / RoboLeague".

-

The inspiration for creating Robocode came from Robot Battle, a programming game written by Brad Schick in 1992, which should still be alive. Robot Battle was, in turn, inspired by RobotWar, an Apple II+ game from the early 1980s.

-

The articles from IBM and the Robocode community behind the RoboWiki made Robocode very popular as programming game, and for many years Robocode has been used for education and research at schools and universities all over the world.

-

In the beginning of 2005, Mathew convinced IBM to release Robocode as Open Source on SourceForge. At this point, the development of Robocode had somewhat stopped. The community around Robocode began to develop their own versions of Robocode with bug fixes and new features, e.g. the OpenSourceRobocode/Contributions and later on the two projects, RobocodeNG and Robocode 2006, by Flemming N. Larsen.

-

Eventually, Flemming took over the Robocode project at SourceForge as administrator and developer in July 2006 to continue the original Robocode game. The RobocodeNG project was dropped, but Robocode 2006 was merged into the official Robocode version 1.1 containing lots of improvements. Since then, lots of new versions of Robocode have been released with more and more features and contributions from the community.

-

In May 2007, the RoboRumble client got built into Robocode. RoboRumble is widely used by the Robocode community for creating up-to-date robot ranking lists for the 1-to-1, Melee, Team, and Twin Dual competitions.

-

Since May 2010 a .NET plugin is provided for Robocode using a .NET / Java bridge, which makes it possible to develop robots for .NET beside developing robots in Java. This part was made by Pavel Savara, who is a major Robocode contributor.

-

3. SYSTEM REQUIREMENTS

-

In order to run Robocode, Java 6 Standard Edition (SE) or a newer version of Java must be installed on your system. Both the Java Runtime Environment (JRE) and the Java Developer Kit (JDK) can be used. Note that the JRE does not include the standard Java compiler (javac), but the JDK does. However, Robocode comes with a built-in compiler (ECJ). Hence, it is sufficient running Robocode on the JRE.

-

Also note that it is important that these environment variables have been set up prior to running Robocode:

-
    -
  • JAVA_HOME must be setup to point at the home directory for Java (JDK or JRE).
    Windows example: JAVA_HOME=C:\Program Files\Java\jdk1.6.0_41
    UNIX, Linux, Mac OS example: JAVA_HOME=/usr/local/jdk1.6.0_41

  • -
  • PATH must include the path to the bin of the Java home directory (JAVA_HOME) that includes java.exe for starting the Java virtual Machine (JVM).
    Windows example: PATH=%PATH%;%JAVA_HOME%
    UNIX, Linux, Mac OS example: PATH=${PATH}:${JAVA_HOME}/bin

  • -
-

You can read more details from here:

- -

If you want to program robots in .NET or control Robocode from a .NET application, you need to install the Robocode .NET API plug-in on top of Robocode. The plug-in is installed by double-clicking the robocode.dotnet-xxx-setup.jar the same way as Robocode itself is installed.

-

4. GETTING STARTED

-

Most documentation about Robocode is provided thru the RoboWiki, which contains the official documentation about Robocode, but which also hosts the community around Robocode. It is highly recommended to read the articles on the RoboWiki for getting started with Robocode. These articles are provided from here:

- -

You should read about the anatomy of a robot, the game physics, scoring etc.

-

To learn more about developing robots for .NET, these articles are a good starting point:

- -

5. ROBOCODE API

-

The Robocode API is provided as HTML pages for both the Java and .NET platform.

- -

The Robocode API actually consists of 3 different APIs.

-
    -
  • Robot API: Within the Java package robocode and .NET namespace Robocode.
    The Robot API is used for developing robots, and is the only part of the API that robots are allowed to access.

  • -
  • Robot Interfaces: Within the Java package robocode.robotinterfaces and .NET namespace Robocode.RobotInterfaces.
    The Robot Interfaces are used for developing new robot types with a different API that the standard Robot API.
    Note: The game rules and robot behaviors cannot be changed.

  • -
  • Control API: Within the Java package robocode.control and .NET namespace Robocode.Control.
    The Control API is used for letting another application start up battles with selected robots in Robocode and retrieve the results. It is also possible to get snapshots of robots and bullets (like position, heading, energy level etc.) at a specific time in a battle.

  • -
-

6. ROBOCODE REPOSITORY

-

If you want to try out new robots than the sample robots that come with Robocode, you should visit the Robocode Repository.

-

Robots are available under the Bots section of the repository.

-

The Robocode Repository is developed and maintained by David Lynn as a project independently of the Robocode project.

-

7. COMMUNITY

-

The community around Robocode is using the RoboWiki as communication channel. At the RoboWiki, people share new ideas, code snippets, algorithms, strategies, and lots of other stuff about Robocode. New official documentation from the developers of Robocode will be put at the RoboWiki as well.

-

On the RoboWiki, these strategies are provided:

- -

The code snippets are also provided on the RoboWiki:

- -

8. CHALLENGES

-

A good way to improve you self as a robot developer is to try out some real challenges. On the RoboWiki, two famous challenges exist for testing/studying a robots movement, targeting, and gun abilities:

- -

9. COMPETITION

-

If you want to challenge your robot(s) and yourself as robot developer, the RoboRumble@Home is the best way to do it. RoboRumble is the ultimate collaborative effort to have a live, up-to-date ranking of Robocode bots. It uses the power of available Robocoders' computers to distribute the effort of running battles and building the rankings.

-

RoboRumble is actually 3 different rumbles:

-
    -
  • RoboRumble (aka 1v1): One robot versus another robot - both picked at random. These two robots a alone on the battle field.
  • -
  • MeleeRumble: Ten robots picked at random all battle against each other..
  • -
  • TeamRumble: One team versus another team - both picked at random. Each team consists of five or less robots.
  • -
-

In order to get started with RoboRumble, you should read this page:

- -

Note that the RoboRumble@Home client is built into Robocode and can be started using the batch/shell/command files:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WindowsUNIX / LinuxMac OS
RoboRumbleroborumble.batroborumble.shroborumble.command
MeleeRumblemeleerumble.batmeleerumble.shmeleerumble.command
TeamRumbleteamrumble.batteamrumble.shteamrumble.command
-

Two other competitions exists which are:

-
    -
  • Twin Duel: Two teams battle on an 800x800 field. Each team consists of two robots (twins).
  • -
  • Hat League: Two teams not knowing each other are paired together at random (like drawing names from a hat). Each team consists of two robots. These two teams must work together and defeat two other teams that have also been picked at random.
  • -
-

10. COMMAND LINE

-

It is possible to specify options and predefined properties from the command-line when running Robocode. The usage of these can be listed by writing this from a command prompt or shell:

-
robocode -help
-

For example, it is possible to:

-
    -
  • disable the graphical user interface (GUI).
  • -
  • disable security that is specific to Robocode (but does not override the security that comes with the JVM).
  • -
  • enable/disable the debugging mode, useful when debugging robots.
  • -
  • play a battle based on an existing Robocode .battle file.
  • -
  • replay a recorded battle visually.
  • -
  • save the results of battles in a comma-separated file.
  • -
-

You can read more details here:

- - -

Links relevant to Robocode are provided on the home page of Robocode:

- -

Other links are provided from the RoboWiki - especially for challenges and competitions:

- -

The is also a Wikipedia page available about Robocode, which provides good links to movement and targeting strategies, competitions, and other sites about Robocode:

- -

12. REPORTING DEFECTS

-

If you discover a defect (bug) in Robocode you are encouraged to report the issue as soon as you discover it - the sooner the better.

-

A bug report should be reported on the Bugs page on the SourceForge site for Robocode. Each bug report will be prioritized among other bug reports depending on its impact on the game.

-

It will be a great help if you describe how to see or which steps to do in order to reproduce the defect. You are very welcome to provide a screen shot, source code or anything else that will show the bug. It is also a very good idea to write which system and version of Robocode and Java you are using.

-

If you are a registered user at SourceForge (register here) you will be able to add a "monitor" on your bug report. This way you will be able to receive notifications when someone add comments to your report, but will also be able to better track the current status of the bug, e.g. when the bug is fixed and with which version of Robocode the fix is available.

-

If you are a developer yourself, and have a good idea of how the bug could be fixed, you are more than welcome to do so. By fixing the bug, you will become a contributor of Robocode yourself. You can learn more about how to contribute here. Note that we accept bug fixes under the terms of EPL.

-

13. FEATURE REQUESTS

-

If you got an idea for a new feature or improvement for Robocode, you are very welcome to share your idea by summiting a feature request.

-

A feature request should be put on the Feature Requests on the SourceForge site for Robocode. Each feature request will be prioritized among other feature requests.

-

It will be a great help if you describe your idea in detail, and how you think it could be implemented into Robocode. For example, will it be possible to extend an existing feature with your idea?

-

If you are a registered user at SourceForge (register here) you will be able to add a "monitor" on your request. This way you will be able to receive notifications when someone add comments to your request entry, but will also be able to better track the current status of your entry, e.g. when the feature has been implemented and with which version of Robocode it will be available.

-

If you are a developer yourself, and have a good idea of how the feature could be implemented, you are more than welcome to do so if the feature is being accepted. By implementing the feature, you will become a contributor of Robocode yourself. You can learn more about how to contribute here. Note that we accept implementations under the terms of EPL.

-

14. VERSIONS

-

Robocode is continuously under development, and you should be aware that three different release types exist for Robocode:

-
    -
  • Alpha version is an unofficial "snapshot" version of Robocode that is under development and not feature complete yet. It is normally provided for the person that has put a bug report or feature request on the tracker for Robocode, which needs to be verified. Alpha versions are not meant to be redistributed at all.

  • -
  • Beta version is an official release that is considered feature complete, and which intended for everybody to try out and test regarding all new features and changes, but which is also considered "unstable", and might contain some unwanted side-effects due to the changes made to this version compared to the last final version of Robocode. Defects or undesired behaviors should be reported as soon as they are discovered so the issues can be fixed before the final release. Everybody is encouraged to take part in the testing Beta versions of Robocode.

  • -
  • Final version is (as it says) the final version of a specific and official release of Robocode, and where new features and bug fixes have been tested. Note, that the release will not state "final" on the distribution files for Robocode like it is the case for Alpha and Beta versions.

  • -
-

15. NEWS

-

News about Robocode is put on the blog spot for Robocode. Here it is possible subscribe to a RSS feed to receive news about Robocode.

- -

You can also follow Robocode on Twitter and Facebook here:

- -

The RoboWiki can be followed on Twitter as well:

- -

16. HOW TO CONTRIBUTE

-

If you want to contribute to Robocode with e.g. a new feature or bug fix, you should read the Developers Guide for building Robocode.

-

Note that we accept code changes under the terms of EPL.

-

There exist no or little documentation about the internals of Robocode, and the code base will need to be examined by a contributor in order to get an insight of how Robocode is implemented. Thus, it required a skilled Java developer to figure out how Robocode is put together.

-

Robocode is divided into several modules. You can read Pavel Savara's blog to get a good overview of Robocode here:

- -

Help for Robocode internals can be provided through the Robocode Developers Discussion Group where you can register yourself, and start up a new topic. This is the best way of getting information and asking about details for the internals in Robocode.

-

If a contribution is a somewhat small change to involves under 10 files, then the preferred way is to provide the contribution as a patch file that can be applied to the existing Robocode sources. Otherwise, you can be granted a Subversion branch for your work, where you can commit your changes. Later, this branch needs to be merged into the trunk be the administrators of Robocode and tested carefully. Additional work might be done by other Robocode developers to finalize the work.

- - diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.txt b/代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.txt deleted file mode 100644 index 1fe94cc..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/ReadMe.txt +++ /dev/null @@ -1,471 +0,0 @@ -## ReadMe for Robocode - -Updated 06-Mar-2013 by Flemming N. Larsen - -Robocode Home Page: -[http://robocode.sourceforge.net/](http://robocode.sourceforge.net/) - -### TABLE OF CONTENTS - -1. [What is Robocode?](#what-is-robocode) -2. [History of Robocode](#history-of-robocode) -3. [System Requirements](#system-requirements) -4. [Getting Started](#getting-started) -5. [Robocode API](#robocode-api) -6. [Robocode Repository](#robocode-repository) -7. [Community](#community) -8. [Challenges](#challenges) -9. [Competition](#competition) -10. [Command Line](#command-line) -11. [Links](#links) -12. [Reporting Defects](#reporting-defects) -13. [Feature Requests](#feature-requests) -14. [Versions](#versions) -15. [News](#news) -16. [How to contribute](#how-to-contribute) - -### 1. WHAT IS ROBOCODE? - -Robocode is a programming game where the goal is to code a robot battle -tank to compete against other robots in a battle arena. So the name -Robocode is a short for "Robot code". The player is the programmer of -the robot, who will have no direct influence on the game. Instead, the -player must write the AI of the robot telling it how to behave and -react on events occurring in the battle arena. Battles are running in -real-time and on-screen. - -**The motto of Robocode is: Build the best, destroy the rest!** - -Besides being a programming game, Robocode is used for learning how to -program, primarily in the Java language, but other languages like C# -and Scala are becoming popular as well. - -Schools and universities are using Robocode as part of teaching how to -program, but also for studying artificial intelligence (AI). The -concept of Robocode is easy to understand, and a fun way to learn how -to program. - -Robocode offers complete development environment, and comes with its -own installer, built-in robot editor and Java compiler. Robocode only -pre-requires that a JVM (Java Virtual Machine) to exist already on the -system where Robocode is going to be installed. Hence, everything a -robot developer needs to get started is provided with the main Robocode -distribution file (`robocode-xxx-setup.jar`). Robocode also supports -developing robots using external IDEs like e.g. -[Eclipse](http://www.eclipse.org/downloads/), -[IntelliJ IDEA](http://www.jetbrains.com/idea/), -[NetBeans](http://netbeans.org/), -[Visual Studio](http://msdn.microsoft.com/en-gb/vstudio/) etc., which -supports the developer much better than the robot editor in Robocode. - -The fact that Robocode runs on the Java platform makes it possible to -run it on any operating system with Java pre-installed, meaning that it -will be able to run on Windows, Linux, Mac OS, but also UNIX and -variants of UNIX. Note that Java 6 or newer must be installed on the -system before Robocode is able to run. See the [System -Requirements](#system-requirements) for more information. - -Be aware that many users of Robocode (aka Robocoders) find Robocode to -be very fun, but also very addictive. :-) - -Robocode comes free of charge and is being developed as a spare-time -project where no money is involved. The developers of Robocode are -developing on Robocode because they think it is fun, and because they -improve themselves as developers this way. - -Robocode is an Open Source project, which means that all sources are -open to everybody. In addition, Robocode is provided under the terms of -[EPL](http://www.eclipse.org/legal/epl-v10.html) (Eclipse Public -License). - -### 2. HISTORY OF ROBOCODE - -The Robocode game was originally started by **Mathew A. Nelson** as a -personal endeavor in late 2000 and became a professional one when he -brought it to IBM, in the form of an AlphaWorks download, in July 2001. - -IBM was interested in Robocode, as they saw an opportunity to promote -Robocode as a fun way to get started with learning how to program in -Java. IBM wrote lots of articles about Robocode, e.g. like -[Rock 'em, sock 'em Robocode!](http://www.ibm.com/developerworks/java/library/j-robocode/) -from AlphaWorks / developerWorks at IBM, a series of articles like -[Secrets from the Robocode masters](http://www.ibm.com/developerworks/java/library/j-robotips/), -and "Robocode Rumble / RoboLeague". - -The inspiration for creating Robocode came from -[Robot Battle](http://www.robotbattle.com/history.php), a programming -game written by Brad Schick in 1992, which should still be alive. Robot -Battle was, in turn, inspired by -[RobotWar](http://www.robotbattle.com/history.php), an Apple II+ game -from the early 1980s. - -The articles from IBM and the Robocode community behind the RoboWiki made -Robocode very popular as programming game, and for many years Robocode has been -used for education and research at schools and universities all over the world. - -In the beginning of 2005, Mathew convinced IBM to release Robocode as -**Open Source** on SourceForge. At this point, the development of Robocode had -somewhat stopped. The community around Robocode began to develop their own -versions of Robocode with bug fixes and new features, e.g. the -[OpenSourceRobocode/Contributions](http://old.robowiki.net/robowiki?OpenSourceRobocode/Contributions) -and later on the two projects, -[RobocodeNG and Robocode 2006](http://old.robowiki.net/robowiki?RobocodeNG/Archive), by **Flemming N. Larsen**. - -Eventually, Flemming took over the Robocode project at SourceForge as -administrator and developer in July 2006 to continue the original Robocode game. -The RobocodeNG project was dropped, but Robocode 2006 was merged into the -official Robocode version 1.1 containing lots of improvements. Since then, -lots of new versions of Robocode have been released with more and more features -and contributions from the community. - -In May 2007, the [RoboRumble](http://robowiki.net/wiki/RoboRumble) client got -built into Robocode. RoboRumble is widely used by the Robocode community for -creating up-to-date robot ranking lists for the 1-to-1, Melee, Team, and -Twin Dual competitions. - -Since May 2010 a **.NET plugin** is provided for Robocode using a .NET / Java -bridge, which makes it possible to develop robots for .NET beside developing -robots in Java. This part was made by **Pavel Savara**, who is a major Robocode -contributor. - -### 3. SYSTEM REQUIREMENTS - -In order to run Robocode, Java 6 Standard Edition (SE) or a newer -version of Java must be installed on your system. Both the Java Runtime -Environment (JRE) and the Java Developer Kit (JDK) can be used. Note -that the JRE does not include the standard Java compiler (javac), but -the JDK does. However, Robocode comes with a built-in compiler (ECJ). -Hence, it is sufficient running Robocode on the JRE. - -Also note that it is important that these environment variables have -been set up prior to running Robocode: - -- `JAVA_HOME` must be setup to point at the home directory for Java - (JDK or JRE). - Windows example: `JAVA_HOME=C:\Program Files\Java\jdk1.6.0_41` - UNIX, Linux, Mac OS example: `JAVA_HOME=/usr/local/jdk1.6.0_41` - -- `PATH` must include the path to the `bin` of the Java home - directory (`JAVA_HOME`) that includes `java.exe` for starting the - Java virtual Machine (JVM). - Windows example: `PATH=%PATH%;%JAVA_HOME%` - UNIX, Linux, Mac OS example: `PATH=${PATH}:${JAVA_HOME}/bin` - -You can read more details from here: - -- [System Requirements](http://robowiki.net/wiki/Robocode/System_Requirements) - -If you want to program robots in .NET or control Robocode from a .NET -application, you need to install the Robocode .NET API plug-in on top of -Robocode. The plug-in is installed by double-clicking the -`robocode.dotnet-xxx-setup.jar` the same way as Robocode itself is -installed. - -### 4. GETTING STARTED - -Most documentation about Robocode is provided thru the -[RoboWiki](http://robowiki.net), which contains the official -documentation about Robocode, but which also hosts the community around -Robocode. It is highly recommended to read the articles on the RoboWiki -for getting started with Robocode. These articles are provided from -here: - -- [Getting Started](http://robowiki.net/wiki/Robocode/Getting_Started) - -You should read about the anatomy of a robot, the game physics, scoring -etc. - -To learn more about developing robots for .NET, these articles are a -good starting point: - -- [Create a .NET robot with Visual Studio](http://robowiki.net/wiki/Robocode/.NET/Create_a_.NET_robot_with_Visual_Studio) -- [Debug a .NET robot with Visual Studio](http://robowiki.net/wiki/Robocode/.NET/Debug_a_.NET_robot_in_Visual_Studio) - -### 5. ROBOCODE API - -The Robocode API is provided as HTML pages for both the Java and .NET -platform. - -- [Java Robot API](http://robocode.sourceforge.net/docs/robocode/) -- [Java Control API](http://robocode.sourceforge.net/docs/robocode/index.html?robocode/control/package-summary.html) -- [.NET Robot API](http://robocode.sourceforge.net/docs/robocode.dotnet/Index.html) -- [.NET Control API](http://robocode.sourceforge.net/docs/robocode.dotnet.control/Index.html) - -The Robocode API actually consists of 3 different APIs. - -- **Robot API**: Within the Java package `robocode` and .NET namespace - `Robocode`. - The Robot API is used for developing robots, and is the only part of - the API that robots are allowed to access. - -- **Robot Interfaces**: Within the Java package - `robocode.robotinterfaces` and .NET namespace - `Robocode.RobotInterfaces`. - The Robot Interfaces are used for developing new robot types with a - different API that the standard Robot API. - **Note:** *The game rules and robot behaviors cannot be changed.* - -- **Control API**: Within the Java package `robocode.control` and .NET - namespace `Robocode.Control`. - The Control API is used for letting another application start up - battles with selected robots in Robocode and retrieve the results. - It is also possible to get snapshots of robots and bullets (like - position, heading, energy level etc.) at a specific time in a battle. - -### 6. ROBOCODE REPOSITORY - -If you want to try out new robots than the sample robots that come with -Robocode, you should visit the [Robocode -Repository](http://robocoderepository.com/). - -Robots are available under the -[Bots](http://robocoderepository.com/Categories.jsp) section of the -repository. - -The Robocode Repository is developed and maintained by David Lynn as a -project independently of the Robocode project. - -### 7. COMMUNITY - -The community around Robocode is using the RoboWiki as communication -channel. At the RoboWiki, people share new ideas, code snippets, -algorithms, strategies, and lots of other stuff about Robocode. New -official documentation from the developers of Robocode will be put at -the RoboWiki as well. - -On the RoboWiki, these strategies are provided: - -- [Radar](http://robowiki.net/wiki/Radar) -- [Movement](http://robowiki.net/wiki/Category:Movement) -- [Targeting](http://robowiki.net/wiki/Category:Targeting) - -The code snippets are also provided on the RoboWiki: - -- [Code Snippets](http://robowiki.net/wiki/Category:Code_Snippets) - -### 8. CHALLENGES - -A good way to improve you self as a robot developer is to try out some -real challenges. On the RoboWiki, two famous challenges exist for -testing/studying a robots movement, targeting, and gun abilities: - -- [Movement Challenge](http://robowiki.net/wiki/Movement_Challenge_(original)) -- [Targeting Challenge](http://robowiki.net/wiki/Targeting_Challenge_(original)) -- [RoboRumble Gun Challenge](hhttp://robowiki.net/wiki/RoboRumble_Gun_Challenge) - -### 9. COMPETITION - -If you want to challenge your robot(s) and yourself as robot developer, -the [RoboRumble@Home](http://robowiki.net/wiki/RoboRumble) is the best -way to do it. RoboRumble is the ultimate collaborative effort to have a -live, up-to-date ranking of Robocode bots. It uses the power of -available Robocoders' computers to distribute the effort of running -battles and building the rankings. - -RoboRumble is actually 3 different rumbles: - -- **RoboRumble** (aka 1v1): One robot versus another robot - both - picked at random. These two robots a alone on the battle field. -- **MeleeRumble**: Ten robots picked at random all battle against - each other.. -- **TeamRumble**: One team versus another team - both picked at - random. Each team consists of five or less robots. - -In order to get started with RoboRumble, you should read this page: - -- [Starting With RoboRumble](http://robowiki.net/wiki/RoboRumble/Starting_With_RoboRumble) - -Note that the RoboRumble@Home client is built into Robocode and can -be started using the batch/shell/command files: - -| | Windows | UNIX / Linux | Mac OS | -|-----------------+-------------------+------------------+-----------------------| -| **RoboRumble** | `roborumble.bat` | `roborumble.sh` | `roborumble.command` | -| **MeleeRumble** | `meleerumble.bat` | `meleerumble.sh` | `meleerumble.command` | -| **TeamRumble** | `teamrumble.bat` | `teamrumble.sh` | `teamrumble.command` | - -Two other competitions exists which are: - -- [Twin Duel](http://robowiki.net/wiki/Twin_Duel): Two teams - battle on an 800x800 field. Each team consists of two robots - (twins). -- [Hat League](http://robowiki.net/wiki/Hat_League): Two teams not - knowing each other are paired together at random (like drawing - names from a hat). Each team consists of two robots. These two - teams must work together and defeat two other teams that have also - been picked at random. - -### 10. COMMAND LINE - -It is possible to specify options and predefined properties from the -command-line when running Robocode. The usage of these can be listed by -writing this from a command prompt or shell: - - robocode -help - -For example, it is possible to: - -- disable the graphical user interface (GUI). -- disable security that is specific to Robocode (but does not - override the security that comes with the JVM). -- enable/disable the debugging mode, useful when debugging robots. -- play a battle based on an existing Robocode .battle file. -- replay a recorded battle visually. -- save the results of battles in a comma-separated file. - -You can read more details here: - -- [Console Usage](http://robowiki.net/w/index.php?title=Robocode/Console_Usage) - -### 11. LINKS - -Links relevant to Robocode are provided on the home page of Robocode: - -- [Home Page of Robocode](http://robocode.sourceforge.net/) - -Other links are provided from the RoboWiki - especially for challenges -and competitions: - -- [RoboWiki](http://robowiki.net/) - -The is also a Wikipedia page available about Robocode, which provides -good links to movement and targeting strategies, competitions, and other -sites about Robocode: - -- [Robocode on Wikipedia](http://en.wikipedia.org/wiki/Robocode) - -### 12. REPORTING DEFECTS - -If you discover a defect (bug) in Robocode you are encouraged to report -the issue as soon as you discover it - the sooner the better. - -A bug report should be reported on the [Bugs](http://http://sourceforge.net/p/robocode/bugs//p/robocode/bugs/) -page on the SourceForge site for Robocode. Each bug report will be -prioritized among other bug reports depending on its impact on the game. - -It will be a great help if you describe how to see or which steps to do -in order to reproduce the defect. You are very welcome to provide a -screen shot, source code or anything else that will show the bug. It is -also a very good idea to write which system and version of Robocode and -Java you are using. - -If you are a registered user at SourceForge (register -[here](http://sourceforge.net/account/registration/)) you will be able -to add a "monitor" on your bug report. This way you will be able to -receive notifications when someone add comments to your report, but will -also be able to better track the current status of the bug, e.g. when -the bug is fixed and with which version of Robocode the fix is -available. - -If you are a developer yourself, and have a good idea of how the bug -could be fixed, you are more than welcome to do so. By fixing the bug, -you will become a contributor of Robocode yourself. You can learn more -about how to contribute [here](#how-to-contribute). Note that we accept -bug fixes under the terms of -[EPL](http://www.eclipse.org/legal/epl-v10.html). - -### 13. FEATURE REQUESTS - -If you got an idea for a new feature or improvement for Robocode, you -are very welcome to share your idea by summiting a feature request. - -A feature request should be put on the -[Feature Requests](http://sourceforge.net/p/robocode/feature-requests/) -on the SourceForge site for Robocode. Each feature request will be -prioritized among other feature requests. - -It will be a great help if you describe your idea in detail, and how you -think it could be implemented into Robocode. For example, will it be -possible to extend an existing feature with your idea? - -If you are a registered user at SourceForge (register -[here](http://sourceforge.net/account/registration/)) you will be able -to add a "monitor" on your request. This way you will be able to receive -notifications when someone add comments to your request entry, but will -also be able to better track the current status of your entry, e.g. when -the feature has been implemented and with which version of Robocode it -will be available. - -If you are a developer yourself, and have a good idea of how the feature -could be implemented, you are more than welcome to do so if the feature -is being accepted. By implementing the feature, you will become a -contributor of Robocode yourself. You can learn more about how to -contribute [here](#how-to-contribute). Note that we accept -implementations under the terms of -[EPL](http://www.eclipse.org/legal/epl-v10.html). - -### 14. VERSIONS - -Robocode is continuously under development, and you should be aware that -three different release types exist for Robocode: - -- **Alpha** version is an unofficial "snapshot" version of Robocode - that is under development and not feature complete yet. It is - normally provided for the person that has put a bug report or - feature request on the tracker for Robocode, which needs to be - verified. Alpha versions are not meant to be redistributed at all. - -- **Beta** version is an official release that is considered feature - complete, and which intended for everybody to try out and test - regarding all new features and changes, but which is also - considered "unstable", and might contain some unwanted side-effects - due to the changes made to this version compared to the last final - version of Robocode. Defects or undesired behaviors should be - reported as soon as they are discovered so the issues can be fixed - before the final release. Everybody is encouraged to take part in - the testing Beta versions of Robocode. - -- **Final** version is (as it says) the final version of a specific - and official release of Robocode, and where new features and bug - fixes have been tested. Note, that the release will not state - "final" on the distribution files for Robocode like it is the case - for Alpha and Beta versions. - -### 15. NEWS - -News about Robocode is put on the blog spot for Robocode. Here it -is possible subscribe to a RSS feed to receive news about Robocode. - -- [Robocode News](http://robo-code.blogspot.com/) - -You can also follow Robocode on Twitter and Facebook here: - -- [Twitter for Robocode](http://twitter.com/robocode) -- [Robocode on Facebook](http://www.facebook.com/group.php?gid=129627130234) - -The RoboWiki can be followed on Twitter as well: - -- [Twitter for RoboRumble](http://twitter.com/robowiki) - -### 16. HOW TO CONTRIBUTE - -If you want to contribute to Robocode with e.g. a new feature or bug -fix, you should read the [Developers Guide for building -Robocode.](http://robowiki.net/wiki/Robocode/Developers_Guide_for_building_Robocode) - -Note that we accept code changes under the terms of -[EPL](http://www.eclipse.org/legal/epl-v10.html). - -There exist no or little documentation about the internals of Robocode, -and the code base will need to be examined by a contributor in order to -get an insight of how Robocode is implemented. Thus, it required a -skilled Java developer to figure out how Robocode is put together. - -Robocode is divided into several modules. You can read Pavel Savara's -blog to get a good overview of Robocode here: - -- [Robocode modules](http://zamboch.blogspot.com/2009/06/robocode-modules-as-in-version-17.html) - -Help for Robocode internals can be provided through the [Robocode -Developers Discussion Group](https://groups.google.com/forum/?fromgroups#!forum/robocode-developers) -where you can register yourself, and start up a new topic. This is the best -way of getting information and asking about details for the internals in -Robocode. - -If a contribution is a somewhat small change to involves under 10 files, -then the preferred way is to provide the contribution as a patch file -that can be applied to the existing Robocode sources. Otherwise, you can -be granted a Subversion branch for your work, where you can commit your -changes. Later, this branch needs to be merged into the trunk be the -administrators of Robocode and tested carefully. Additional work might -be done by other Robocode developers to finalize the work. \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/battles/intro.battle b/代码/workspace_robo4/robocode.content/src/main/resources/battles/intro.battle deleted file mode 100644 index 8bcded0..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/battles/intro.battle +++ /dev/null @@ -1,8 +0,0 @@ -#Battle Properties -robocode.battleField.width=800 -robocode.battleField.height=600 -robocode.battle.numRounds=1 -robocode.battle.gunCoolingRate=0.1 -robocode.battle.rules.inactivityTime=450 -robocode.battle.selectedRobots=sample.Tracker,sample.SittingDuck -robocode.battle.initialPositions=(50,50,0),(?,?,?) \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/battles/sample.battle b/代码/workspace_robo4/robocode.content/src/main/resources/battles/sample.battle deleted file mode 100644 index 2be49ab..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/battles/sample.battle +++ /dev/null @@ -1,8 +0,0 @@ -#Battle Properties -robocode.battleField.width=800 -robocode.battleField.height=600 -robocode.battle.numRounds=10 -robocode.battle.gunCoolingRate=0.1 -robocode.battle.rules.inactivityTime=450 -robocode.battle.hideEnemyNames=true -robocode.battle.selectedRobots=sample.Corners,sample.Fire,sample.MyFirstRobot,sample.SittingDuck,sample.Walls diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/compilers/CompilerTest.java b/代码/workspace_robo4/robocode.content/src/main/resources/compilers/CompilerTest.java deleted file mode 100644 index 057737d..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/compilers/CompilerTest.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -public class CompilerTest { - public static void main(String args[]) { - System.out.println("Compiler operational"); - } -} diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocode.png b/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocode.png deleted file mode 100644 index 99b0d5b7a52090568d08ba99242da7281f175746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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 diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeMeleeRumble.desktop b/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeMeleeRumble.desktop deleted file mode 100644 index 2b6a8cf..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeMeleeRumble.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=Robocode MeleeRumble -GenericName=Ranking system of Robocode bots -Comment=Run MeleeRumble battles for the LiteRumble -Icon=roborumble -Exec=robocode-MeleeRumble -Categories=Game;StrategyGame; \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRoboRumble.desktop b/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRoboRumble.desktop deleted file mode 100644 index f366fdf..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRoboRumble.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=Robocode RoboRumble -GenericName=Ranking system of Robocode bots -Comment=Run RoboRumble battles for the LiteRumble -Icon=roborumble -Exec=robocode-RoboRumble -Categories=Game;StrategyGame; diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRobocode.desktop b/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRobocode.desktop deleted file mode 100644 index 89c34f6..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeRobocode.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=Robocode -GenericName=Tank AI programming game for Java and .NET -Comment=Build the best - destroy the rest! -Icon=robocode -Exec=robocode-Robocode -Categories=Game;StrategyGame; diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTeamRumble.desktop b/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTeamRumble.desktop deleted file mode 100644 index d0f1e25..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTeamRumble.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=Robocode TeamRumble -GenericName=Ranking system of Robocode bots -Comment=Run TeamRumble battles for the LiteRumble -Icon=roborumble -Exec=robocode-TeamRumble -Categories=Game;StrategyGame; \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTwinDuel.desktop b/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTwinDuel.desktop deleted file mode 100644 index 564090b..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/robocodeTwinDuel.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=Robocode TwinDuel -GenericName=Ranking system of Robocode bots -Comment=Run TwinDuel battles for the LiteRumble -Icon=roborumble -Exec=robocode-TwinDuel -Categories=Game;StrategyGame; \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/desktop/roborumble.png b/代码/workspace_robo4/robocode.content/src/main/resources/desktop/roborumble.png deleted file mode 100644 index f1560d15acaa753cf5b06cc5c58bf4d9295c6c4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3401 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 - -Eclipse Public License - Version 1.0 - - - - - -

Eclipse Public License - v 1.0

-

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

-

1. DEFINITIONS

-

"Contribution" means:

-

a) in the case of the initial Contributor, the initial code and -documentation distributed under this Agreement, and

-

b) in the case of each subsequent Contributor:

-

i) changes to the Program, and

-

ii) additions to the Program;

-

where such changes and/or additions to the Program originate from -and are distributed by that particular Contributor. A Contribution 'originates' -from a Contributor if it was added to the Program by such Contributor itself or -anyone acting on such Contributor's behalf. Contributions do not include -additions to the Program which: (i) are separate modules of software distributed -in conjunction with the Program under their own license agreement, and (ii) are -not derivative works of the Program.

-

"Contributor" means any person or entity that distributes the Program.

-

"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program.

-

"Program" means the Contributions distributed in accordance with this -Agreement.

-

"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors.

-

2. GRANT OF RIGHTS

-

a) Subject to the terms of this Agreement, each Contributor hereby -grants Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and such -derivative works, in source code and object code form.

-

b) Subject to the terms of this Agreement, each Contributor hereby -grants Recipient a non-exclusive, worldwide, royalty-free patent license under -Licensed Patents to make, use, sell, offer to sell, import and otherwise -transfer the Contribution of such Contributor, if any, in source code and object -code form. This patent license shall apply to the combination of the -Contribution and the Program if, at the time the Contribution is added by the -Contributor, such addition of the Contribution causes such combination to be -covered by the Licensed Patents. The patent license shall not apply to any other -combinations which include the Contribution. No hardware per se is licensed -hereunder.

-

c) Recipient understands that although each Contributor grants the -licenses to its Contributions set forth herein, no assurances are provided by -any Contributor that the Program does not infringe the patent or other -intellectual property rights of any other entity. Each Contributor disclaims any -liability to Recipient for claims brought by any other entity based on -infringement of intellectual property rights or otherwise. As a condition to -exercising the rights and licenses granted hereunder, each Recipient hereby -assumes sole responsibility to secure any other intellectual property rights -needed, if any. For example, if a third party patent license is required to -allow Recipient to distribute the Program, it is Recipient's responsibility to -acquire that license before distributing the Program.

-

d) Each Contributor represents that to its knowledge it has -sufficient copyright rights in its Contribution, if any, to grant the copyright -license set forth in this Agreement.

-

3. REQUIREMENTS

-

A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that:

-

a) it complies with the terms and conditions of this Agreement; -and

-

b) its license agreement:

-

i) effectively disclaims on behalf of all Contributors all -warranties and conditions, express and implied, including warranties or -conditions of title and non-infringement, and implied warranties or conditions -of merchantability and fitness for a particular purpose;

-

ii) effectively excludes on behalf of all Contributors all -liability for damages, including direct, indirect, special, incidental and -consequential damages, such as lost profits;

-

iii) states that any provisions which differ from this Agreement -are offered by that Contributor alone and not by any other party; and

-

iv) states that source code for the Program is available from such -Contributor, and informs licensees how to obtain it in a reasonable manner on or -through a medium customarily used for software exchange.

-

When the Program is made available in source code form:

-

a) it must be made available under this Agreement; and

-

b) a copy of this Agreement must be included with each copy of the -Program.

-

Contributors may not remove or alter any copyright notices contained within -the Program.

-

Each Contributor must identify itself as the originator of its Contribution, -if any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution.

-

4. COMMERCIAL DISTRIBUTION

-

Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, if -a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, damages -and costs (collectively "Losses") arising from claims, lawsuits and other legal -actions brought by a third party against the Indemnified Contributor to the -extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor to -control, and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may participate in -any such claim at its own expense.

-

For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If that -Commercial Contributor then makes performance claims, or offers warranties -related to Product X, those performance claims and warranties are such -Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a court -requires any other Contributor to pay any damages as a result, the Commercial -Contributor must pay those damages.

-

5. NO WARRANTY

-

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON -AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS -OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its exercise of -rights under this Agreement , including but not limited to the risks and costs -of program errors, compliance with applicable laws, damage to or loss of data, -programs or equipment, and unavailability or interruption of operations.

-

6. DISCLAIMER OF LIABILITY

-

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS -GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

-

7. GENERAL

-

If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent necessary -to make such provision valid and enforceable.

-

If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted under -Section 2(b) shall terminate as of the date such litigation is filed.

-

All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue and -survive.

-

Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to time. -No one other than the Agreement Steward has the right to modify this Agreement. -The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation -may assign the responsibility to serve as the Agreement Steward to a suitable -separate entity. Each new version of the Agreement will be given a -distinguishing version number. The Program (including Contributions) may always -be distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to distribute the Program (including its Contributions) -under the new version. Except as expressly stated in Sections 2(a) and 2(b) -above, Recipient receives no rights or licenses to the intellectual property of -any Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted under -this Agreement are reserved.

-

This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation.

diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.bat b/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.bat deleted file mode 100644 index 49fef2c..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.bat +++ /dev/null @@ -1,9 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -java -Xmx1024M -cp libs/robocode.jar;libs/roborumble.jar;libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/meleerumble.txt \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.command b/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.command deleted file mode 100644 index f5ac342..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.command +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -################################################################################ -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -################################################################################ - -pwd=`pwd` -cd "${0%/*}" -java -Xdock:icon=roborumble.ico -Xdock:name=MeleeRumble -Xmx1024M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/meleerumble.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.sh b/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.sh deleted file mode 100644 index e6714a1..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/meleerumble.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -pwd=`pwd` -cd "${0%/*}" -java -Xmx1024M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/meleerumble.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/robocode.bat b/代码/workspace_robo4/robocode.content/src/main/resources/robocode.bat deleted file mode 100644 index cdb3c2a..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/robocode.bat +++ /dev/null @@ -1,9 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -java -Xmx512M -cp libs/robocode.jar robocode.Robocode %* \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/robocode.command b/代码/workspace_robo4/robocode.content/src/main/resources/robocode.command deleted file mode 100644 index 3065355..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/robocode.command +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -################################################################################ -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -################################################################################ - -pwd=`pwd` -cd "${0%/*}" -java -Xdock:icon=robocode.ico -Xdock:name=Robocode -Xmx512M -cp libs/robocode.jar robocode.Robocode $* -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/robocode.ico b/代码/workspace_robo4/robocode.content/src/main/resources/robocode.ico deleted file mode 100644 index 8c469e67c675f43cf369da4a75a653a87391f7b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370070 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 diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/robocode.sh b/代码/workspace_robo4/robocode.content/src/main/resources/robocode.sh deleted file mode 100644 index 81ca7de..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/robocode.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -pwd=`pwd` -cd "${0%/*}" -java -Xmx512M -cp libs/robocode.jar robocode.Robocode $* -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.bat b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.bat deleted file mode 100644 index e056ed9..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.bat +++ /dev/null @@ -1,9 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -java -Xmx512M -cp libs/robocode.jar;libs/roborumble.jar;libs/codesize-1.1.jar; roborumble.RoboRumbleAtHome ./roborumble/roborumble.txt \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.command b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.command deleted file mode 100644 index 27f9f4b..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.command +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -################################################################################ -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -################################################################################ - -pwd=`pwd` -cd "${0%/*}" -java -Xdock:icon=roborumble.ico -Xdock:name=RoboRumble -Xmx512M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/roborumble.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.ico b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.ico deleted file mode 100644 index 927ba6e4f14330fee367bc922e4ac6f3941bc752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32038 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 diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.sh b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.sh deleted file mode 100644 index b0a4050..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -pwd=`pwd` -cd "${0%/*}" -java -Xmx512M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/roborumble.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/meleerumble.txt b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/meleerumble.txt deleted file mode 100644 index 969673d..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/meleerumble.txt +++ /dev/null @@ -1,244 +0,0 @@ -#=============================================================================== -# meleerumble.txt - Configuration file for MeleeRumble (melee battles) -#=============================================================================== - -#------------------------------------------------------------------------------- -# User property. It's highly recommendable that you change this to use your name -#------------------------------------------------------------------------------- - -# USER The user name used when uploading the results to the RoboRumble -# server. Hence, you should replace 'Put_Your_Name_Here' with your -# name, which could be the initials you use for your robot(s). - -USER=Put_Your_Name_Here - -#------------------------------------------------------------------------------- -# Exclude filter used for excluding participants. Use with care! -#------------------------------------------------------------------------------- - -# EXCLUDE A comma separated list of all the participants you want to exclude -# from the competition. Excluded participants will not be downloaded -# or take part in battles. This way you can exclude participants that -# cannot be downloaded due to web servers that are down or hanging, -# the repository is down, robots/teams that crashes for some reason or -# cause other trouble. -# -# You can use the filename wildcards * and ? in the filter. Example: -# -# EXCLUDE=xyz.*v1.?, *Nano* - -EXCLUDE= - -#------------------------------------------------------------------------------- -# Properties for controlling the rumble. Use YES or NOT -#------------------------------------------------------------------------------- - -# DOWNLOAD Download data like participants, missing robots, rating files etc. -# from Internet if these have not been downloaded for 2 hours. -# -# EXECUTE Execute battles. Battles files are first created and old battles -# files are deleted before the battles are executed. -# -# UPLOAD Upload results to the RoboRumble server specified by the RESULTSURL -# property. -# -# ITERATE If set to NOT, the rumble will only execute battles once. -# If set to YES, the rumble will restart with new battles every time -# the battles have been executed, and it will run infinitely until -# terminated. - -DOWNLOAD=YES -EXECUTE=YES -UPLOAD=YES -ITERATE=YES - -# MELEE Must be set if this rumble is meant for melee battles. -# -# TEAMS Must be set if this rumble is meant for team battles. -# This flag is necessary, as jar files for robot teams are different -# from jar files for ordinary robots. - -# MELEE=YES as this property file is meant for melee battles. -# TEAM=NOT, as this property file is not meant for team battles. - -# Do not modify these properties! - -MELEE=YES -TEAMS=NOT - -#------------------------------------------------------------------------------ -# Properties for the battle engine -#------------------------------------------------------------------------------ - -# FIELDL Battlefield width measured in pixels. -# FIELDH Battlefield height measured in pixels. -# -# NUMBATTLES Number of battles performed per rumble. -# ROUNDS Number of rounds per battle. -# -# MELEEBOTS Number of robots that participate in a melee battle. - -# These are standard values for the MeleeRumble. Do not modify these properties! - -FIELDL=1000 -FIELDH=1000 -NUMBATTLES=3 -ROUNDS=35 -MELEEBOTS=10 - -# INPUT Input battles file that is generated by the rumble automatically. -# The rumble uses this file for selecting which robots that must -# battle against each other. -# -# OUTPUT Battle results file, which is the output of running the rumble. - -INPUT=./roborumble/temp/battlesmelee.txt -OUTPUT=./roborumble/files/resultsmelee.txt - -#------------------------------------------------------------------------------- -# Properties for retrieving robots from Internet -#------------------------------------------------------------------------------- - -# BOTSREP The robot repository where downloaded robots are put. -# -# TEMP Directory containing all temporary files for RoboRumble. - -BOTSREP=./robots/ -TEMP=./roborumble/temp/ - -#------------------------------------------------------------------------------- -# Properties for updating participants from Internet -#------------------------------------------------------------------------------- - -# PARTICIPANTSURL -# URL to the web page containing all participants of the competition, -# which will be used for updating the participants file specified with -# the PARTICIPANTSFILE property. -# -# PARTICIPANTSFILE -# File containing all the participants for the competition. -# -# STARTAG Tag marking the start and end of the participants on the web page -# pointed to with the PARTICIPANTSURL property. -# -# UPDATEBOTSURL -# URL used for removing old participants, which is used for updating -# the participants file specified with the PARTICIPANTSFILE property. - -PARTICIPANTSURL=http://robowiki.net/wiki/RoboRumble/Participants/Melee&action=raw -PARTICIPANTSFILE=./roborumble/files/participmelee.txt - -STARTAG=pre - -UPDATEBOTSURL=http://literumble.appspot.com/RemoveOldParticipant - -#------------------------------------------------------------------------------- -# Properties to control the way battles are run -#------------------------------------------------------------------------------- - -# RUNONLY If left black or set to GENERAL, a new battle file is created where -# robots from the participants file are paired at random. The number -# of robot pairs will match number of battles defined the NUMBATTLES -# property. -# -# If set to MINI, a new battle file is created similar to the one -# for GENERAL, but it will only contains robots that are MiniBots, -# which has a code size < 1500 bytes (calculated by the codesize tool). -# -# If set to MICRO, a new battle file is created similar to the one -# for GENERAL, but it will only contains robots that are MicroBots, -# which has a code size < 750 bytes (calculated by the codesize tool). -# -# If set to NANO, a new battle file is created similar to the one for -# GENERAL, but it will only contains robots that are NanoBots, which -# has a code size < 250 bytes (calculated by the codesize tool). -# -# If set to SERVER (recommended), a new battle file is created which -# will first of all contain priority battles for robots that that has -# priority over other robots until they have fought a specific number -# of battles specified by the BATTLESPERBOT property. The number of -# battles fought by the individual robots are extracted from the -# rating files, which are downloaded from the server if the DOWNLOAD -# property is set to YES. When no more priority battles are left, -# robots from the participants file are paired at random similar to -# GENERAL. -# -# BATTLESPERBOT -# The number of battles a robot has to fight before it will no longer -# have priority over other robots in battles. Prioritizing a robot -# makes its rating more reliable faster as its number of fought -# battles increases faster than when it is not prioritized. -# -# PRIORITYBATTLESFILE -# The priority battles file that is generated automatically by the -# rumble when the RUNONLY property is set to SERVER. - -RUNONLY=SERVER - -BATTLESPERBOT=2000 - -PRIORITYBATTLESFILE=./roborumble/temp/prioritymelee.txt - -#------------------------------------------------------------------------------- -# Properties for uploading the results to the server -#------------------------------------------------------------------------------- - -# RESULTSURL -# URL used for uploading the results to the server. -# -# BATTLESNUMFILE -# File containing the number of battles fought by the robots, which is -# returned by the server when results are uploaded to the server. - -RESULTSURL=http://literumble.appspot.com/UploadedResults - -BATTLESNUMFILE=./roborumble/temp/meleebattlesnumber.txt - -#------------------------------------------------------------------------------- -# Properties for related competitions -#------------------------------------------------------------------------------- - -# Related competitions are competitions where participants are a subset of the -# participants in the general competition. -# -# The MiniBots (code size < 1500) are participants of the MiniRumble. -# The MicroBots (code size < 750) are participants of the MicroRumble. -# The NanoBots (code size < 250) are participants of the NanoRumble. - -# Do not modify these properties! - -MINIBOTS=minimeleerumble -MICROBOTS=micromeleerumble -NANOBOTS=nanomeleerumble - -# CODESIZEFILE: -# The code size file that is generated automatically by the rumble in -# order determine the code size of each individual robot. - -CODESIZEFILE=./roborumble/files/codesizemelee.txt - -#------------------------------------------------------------------------------- -# Properties for URLs and file names for the rating files to download -#------------------------------------------------------------------------------- - -# RATINGS.URL: -# URL to where ratings files are located on Internet. -# -# RATINGS.GENERAL: -# File name for the rating file of the general MeleeRumble. -# -# RATINGS.MINIBOTS: -# File name for the rating file of the Melee MiniRumble. -# -# RATINGS.MICROBOTS: -# File name for the rating file of the Melee MicroRumble. -# -# RATINGS.NANOBOTS: -# File name for the rating file of the Melee NanoRumble. - -RATINGS.URL=http://literumble.appspot.com/RatingsFile - -RATINGS.GENERAL=./roborumble/temp/ratings_m_roborumble.txt -RATINGS.MINIBOTS=./roborumble/temp/ratings_m_minirumble.txt -RATINGS.MICROBOTS=./roborumble/temp/ratings_m_microrumble.txt -RATINGS.NANOBOTS=./roborumble/temp/ratings_m_nanorumble.txt diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.properties b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.properties deleted file mode 100644 index 1df0dea..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.properties +++ /dev/null @@ -1,6 +0,0 @@ -# Connection timeout in milliseconds -connection.open.timeout=10000 -# Connection read timeout in milliseconds -connection.read.timeout=10000 -# Download session timeout -download.session.timeout=10000 diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.txt b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.txt deleted file mode 100644 index ae45516..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/roborumble.txt +++ /dev/null @@ -1,241 +0,0 @@ -#=============================================================================== -# roborumble.txt - Configuration file for RoboRumble (1v1 battles) -#=============================================================================== - -#------------------------------------------------------------------------------- -# Username. It's highly recommendable that you change this to use your name -#------------------------------------------------------------------------------- - -# USER The username used when uploading the results to the RoboRumble -# server. Hence, you should replace 'Put_Your_Name_Here' with your -# name, which could be the initials you use for your robot(s). - -USER=Put_Your_Name_Here - -#------------------------------------------------------------------------------- -# Exclude filter used for excluding participants. Use with care! -#------------------------------------------------------------------------------- - -# EXCLUDE A comma separated list of all the participants you want to exclude -# from the competition. Excluded participants will not be downloaded -# or take part in battles. This way you can exclude participants that -# cannot be downloaded due to web servers that are down or hanging, -# the repository is down, robots/teams that crashes for some reason or -# cause other trouble. -# -# You can use the filename wildcards * and ? in the filter. Example: -# -# EXCLUDE=xyz.*v1.?, *Nano* - -EXCLUDE= - -#------------------------------------------------------------------------------- -# Properties for controlling the rumble. Use YES or NOT -#------------------------------------------------------------------------------- - -# DOWNLOAD Download data like participants, missing robots, rating files etc. -# from Internet if these have not been downloaded for 2 hours. -# -# EXECUTE Execute battles. Battles files are first created and old battles -# files are deleted before the battles are executed. -# -# UPLOAD Upload results to the RoboRumble server specified by the RESULTSURL -# property. -# -# ITERATE If set to NOT, the rumble will only execute battles once. -# If set to YES, the rumble will restart with new battles every time -# the battles have been executed, and it will run infinitely until -# terminated. - -DOWNLOAD=YES -EXECUTE=YES -UPLOAD=YES -ITERATE=YES - -# MELEE Must be set if this rumble is meant for melee battles. -# -# TEAMS Must be set if this rumble is meant for team battles. -# This flag is necessary, as jar files for robot teams are different -# from jar files for ordinary robots. - -# MELEE=NOT as this property file is not meant for melee battles. -# TEAM=NOT, as this property file is not meant for team battles. - -# Do not modify these properties! - -MELEE=NOT -TEAMS=NOT - -#------------------------------------------------------------------------------ -# Properties for the battle engine -#------------------------------------------------------------------------------ - -# FIELDL Battlefield width measured in pixels. -# FIELDH Battlefield height measured in pixels. -# -# NUMBATTLES Number of battles performed per rumble. -# ROUNDS Number of rounds per battle. - -# These are standard values for the RoboRumble. Do not modify these properties! - -FIELDL=800 -FIELDH=600 -NUMBATTLES=50 -ROUNDS=35 - -# INPUT Input battles file that is generated by the rumble automatically. -# The rumble uses this file for selecting which robots that must -# battle against each other. -# -# OUTPUT Battle results file, which is the output of running the rumble. - -INPUT=./roborumble/temp/battles1v1.txt -OUTPUT=./roborumble/files/results1v1.txt - -#------------------------------------------------------------------------------- -# Properties for retrieving robots from Internet -#------------------------------------------------------------------------------- - -# BOTSREP The robot repository where downloaded robots are put. -# -# TEMP Directory containing all temporary files for RoboRumble. - -BOTSREP=./robots/ -TEMP=./roborumble/temp/ - -#------------------------------------------------------------------------------- -# Properties for updating participants from Internet -#------------------------------------------------------------------------------- - -# PARTICIPANTSURL -# URL to the web page containing all participants of the competition, -# which will be used for updating the participants file specified with -# the PARTICIPANTSFILE property. -# -# PARTICIPANTSFILE -# File containing all the participants for the competition. -# -# STARTAG Tag marking the start and end of the participants on the web page -# pointed to with the PARTICIPANTSURL property. -# -# UPDATEBOTSURL -# URL used for removing old participants, which is used for updating -# the participants file specified with the PARTICIPANTSFILE property. - -PARTICIPANTSURL=http://robowiki.net/wiki/RoboRumble/Participants?action=raw -PARTICIPANTSFILE=./roborumble/files/particip1v1.txt - -STARTAG=pre - -UPDATEBOTSURL=http://literumble.appspot.com/RemoveOldParticipant - -#------------------------------------------------------------------------------- -# Properties to control the way battles are run -#------------------------------------------------------------------------------- - -# RUNONLY If left black or set to GENERAL, a new battle file is created where -# robots from the participants file are paired at random. The number -# of robot pairs will match number of battles defined the NUMBATTLES -# property. -# -# If set to MINI, a new battle file is created similar to the one -# for GENERAL, but it will only contains robots that are MiniBots, -# which has a code size < 1500 bytes (calculated by the codesize tool). -# -# If set to MICRO, a new battle file is created similar to the one -# for GENERAL, but it will only contains robots that are MicroBots, -# which has a code size < 750 bytes (calculated by the codesize tool). -# -# If set to NANO, a new battle file is created similar to the one for -# GENERAL, but it will only contains robots that are NanoBots, which -# has a code size < 250 bytes (calculated by the codesize tool). -# -# If set to SERVER (recommended), a new battle file is created which -# will first of all contain priority battles for robots that that has -# priority over other robots until they have fought a specific number -# of battles specified by the BATTLESPERBOT property. The number of -# battles fought by the individual robots are extracted from the -# rating files, which are downloaded from the server if the DOWNLOAD -# property is set to YES. When no more priority battles are left, -# robots from the participants file are paired at random similar to -# GENERAL. -# -# BATTLESPERBOT -# The number of battles a robot has to fight before it will no longer -# have priority over other robots in battles. Prioritizing a robot -# makes its rating more reliable faster as its number of fought -# battles increases faster than when it is not prioritized. -# -# PRIORITYBATTLESFILE -# The priority battles file that is generated automatically by the -# rumble when the RUNONLY property is set to SERVER. - -RUNONLY=SERVER - -BATTLESPERBOT=2000 - -PRIORITYBATTLESFILE=./roborumble/temp/priority1v1.txt - -#------------------------------------------------------------------------------- -# Properties for uploading the results to the server -#------------------------------------------------------------------------------- - -# RESULTSURL -# URL used for uploading the results to the server. -# -# BATTLESNUMFILE -# File containing the number of battles fought by the robots, which is -# returned by the server when results are uploaded to the server. - -RESULTSURL=http://literumble.appspot.com/UploadedResults - -BATTLESNUMFILE=./roborumble/temp/battlesnumber.txt - -#------------------------------------------------------------------------------- -# Properties for related competitions -#------------------------------------------------------------------------------- - -# Related competitions are competitions where participants are a subset of the -# participants in the general competition. -# -# The MiniBots (code size < 1500) are participants of the MiniRumble. -# The MicroBots (code size < 750) are participants of the MicroRumble. -# The NanoBots (code size < 250) are participants of the NanoRumble. - -# Do not modify these properties! - -MINIBOTS=minirumble -MICROBOTS=microrumble -NANOBOTS=nanorumble - -# CODESIZEFILE: -# The code size file that is generated automatically by the rumble in -# order determine the code size of each individual robot. - -CODESIZEFILE=./roborumble/files/codesize1v1.txt - -#------------------------------------------------------------------------------- -# Properties for URLs and file names for the rating files to download -#------------------------------------------------------------------------------- - -# RATINGS.URL: -# URL to where ratings files are located on Internet. -# -# RATINGS.GENERAL: -# File name for the rating file of the general RoboRumble. -# -# RATINGS.MINIBOTS: -# File name for the rating file of the MiniRumble. -# -# RATINGS.MICROBOTS: -# File name for the rating file of the MicroRumble. -# -# RATINGS.NANOBOTS: -# File name for the rating file of the NanoRumble. - -RATINGS.URL=http://literumble.appspot.com/RatingsFile - -RATINGS.GENERAL=./roborumble/temp/ratings_roborumble.txt -RATINGS.MINIBOTS=./roborumble/temp/ratings_minirumble.txt -RATINGS.MICROBOTS=./roborumble/temp/ratings_microrumble.txt -RATINGS.NANOBOTS=./roborumble/temp/ratings_nanorumble.txt diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/teamrumble.txt b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/teamrumble.txt deleted file mode 100644 index cf6262f..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/teamrumble.txt +++ /dev/null @@ -1,203 +0,0 @@ -#=============================================================================== -# teamrumble.txt - Configuration file for TeamRumble (team battles) -#=============================================================================== - -#------------------------------------------------------------------------------- -# User property. It's highly recommendable that you change this to use your name -#------------------------------------------------------------------------------- - -# USER The user name used when uploading the results to the RoboRumble -# server. Hence, you should replace 'Put_Your_Name_Here' with your -# name, which could be the initials you use for your robot(s). - -USER=Put_Your_Name_Here - -#------------------------------------------------------------------------------- -# Exclude filter used for excluding participants. Use with care! -#------------------------------------------------------------------------------- - -# EXCLUDE A comma separated list of all the participants you want to exclude -# from the competition. Excluded participants will not be downloaded -# or take part in battles. This way you can exclude participants that -# cannot be downloaded due to web servers that are down or hanging, -# the repository is down, robots/teams that crashes for some reason or -# cause other trouble. -# -# You can use the filename wildcards * and ? in the filter. Example: -# -# EXCLUDE=xyz.*v1.?, *Nano* - -EXCLUDE= - -#------------------------------------------------------------------------------- -# Properties for controlling the rumble. Use YES or NOT -#------------------------------------------------------------------------------- - -# DOWNLOAD Download data like participants, missing robots, rating files etc. -# from Internet if these have not been downloaded for 2 hours. -# -# EXECUTE Execute battles. Battles files are first created and old battles -# files are deleted before the battles are executed. -# -# UPLOAD Upload results to the RoboRumble server specified by the RESULTSURL -# property. -# -# ITERATE If set to NOT, the rumble will only execute battles once. -# If set to YES, the rumble will restart with new battles every time -# the battles have been executed, and it will run infinitely until -# terminated. - -DOWNLOAD=YES -EXECUTE=YES -UPLOAD=YES -ITERATE=YES - -# MELEE Must be set if this rumble is meant for melee battles. -# -# TEAMS Must be set if this rumble is meant for team battles. -# This flag is necessary, as jar files for robot teams are different -# from jar files for ordinary robots. - -# MELEE=NOT as this property file is not meant for melee battles. -# TEAM=YES, as this property file is meant for team battles. - -# Do not modify these properties! - -MELEE=NOT -TEAMS=YES - -#------------------------------------------------------------------------------ -# Properties for the battle engine -#------------------------------------------------------------------------------ - -# FIELDL Battlefield width measured in pixels. -# FIELDH Battlefield height measured in pixels. -# -# NUMBATTLES Number of battles performed per rumble. -# ROUNDS Number of rounds per battle. - -# These are standard values for the TeamRumble. Do not modify these properties! - -FIELDL=1200 -FIELDH=1200 -NUMBATTLES=10 -ROUNDS=10 - -# INPUT Input battles file that is generated by the rumble automatically. -# The rumble uses this file for selecting which robots that must -# battle against each other. -# -# OUTPUT Battle results file, which is the output of running the rumble. - -INPUT=./roborumble/temp/battlesTeams.txt -OUTPUT=./roborumble/files/resultsTeams.txt - -#------------------------------------------------------------------------------- -# Properties for retrieving robots from Internet -#------------------------------------------------------------------------------- - -# BOTSREP The robot repository where downloaded robots are put. -# -# TEMP Directory containing all temporary files for RoboRumble. - -BOTSREP=./robots/ -TEMP=./roborumble/temp/ - -#------------------------------------------------------------------------------- -# Properties for updating participants from Internet -#------------------------------------------------------------------------------- - -# PARTICIPANTSURL -# URL to the web page containing all participants of the competition, -# which will be used for updating the participants file specified with -# the PARTICIPANTSFILE property. -# -# PARTICIPANTSFILE -# File containing all the participants for the competition. -# -# STARTAG Tag marking the start and end of the participants on the web page -# pointed to with the PARTICIPANTSURL property. -# -# UPDATEBOTSURL -# URL used for removing old participants, which is used for updating -# the participants file specified with the PARTICIPANTSFILE property. - -PARTICIPANTSURL=http://robowiki.net/wiki/RoboRumble/Participants/Teams&action=raw -PARTICIPANTSFILE=./roborumble/files/participTeams.txt - -STARTAG=pre - -UPDATEBOTSURL=http://literumble.appspot.com/RemoveOldParticipant - -#------------------------------------------------------------------------------- -# Properties to control the way battles are run -#------------------------------------------------------------------------------- - -# RUNONLY If left black or set to GENERAL, a new battle file is created where -# robots from the participants file are paired at random. The number -# of robot pairs will match number of battles defined the NUMBATTLES -# property. -# -# If set to SERVER (recommended), a new battle file is created which -# will first of all contain priority battles for robots that that has -# priority over other robots until they have fought a specific number -# of battles specified by the BATTLESPERBOT property. The number of -# battles fought by the individual robots are extracted from the -# rating files, which are downloaded from the server if the DOWNLOAD -# property is set to YES. When no more priority battles are left, -# robots from the participants file are paired at random similar to -# GENERAL. -# -# BATTLESPERBOT -# The number of battles a robot has to fight before it will no longer -# have priority over other robots in battles. Prioritizing a robot -# makes its rating more reliable faster as its number of fought -# battles increases faster than when it is not prioritized. -# -# PRIORITYBATTLESFILE -# The priority battles file that is generated automatically by the -# rumble when the RUNONLY property is set to SERVER. - -RUNONLY=SERVER - -BATTLESPERBOT=200 - -PRIORITYBATTLESFILE=./roborumble/temp/priorityTeams.txt - -#------------------------------------------------------------------------------- -# Properties for uploading the results to the server -#------------------------------------------------------------------------------- - -# RESULTSURL -# URL used for uploading the results to the server. -# -# BATTLESNUMFILE -# File containing the number of battles fought by the robots, which is -# returned by the server when results are uploaded to the server. - -RESULTSURL=http://literumble.appspot.com/UploadedResults - -BATTLESNUMFILE=./roborumble/temp/teambattlesnumber.txt - -#------------------------------------------------------------------------------- -# Properties for URLs and file names for the rating files to download -#------------------------------------------------------------------------------- - -# RATINGS.URL: -# URL to where ratings files are located on Internet. -# -# RATINGS.GENERAL: -# File name for the rating file of the general RoboRumble. -# -# RATINGS.MINIBOTS: -# File name for the rating file of the MiniRumble. -# -# RATINGS.MICROBOTS: -# File name for the rating file of the MicroRumble. -# -# RATINGS.NANOBOTS: -# File name for the rating file of the NanoRumble. - -RATINGS.URL=http://literumble.appspot.com/RatingsFile - -RATINGS.GENERAL=./roborumble/temp/ratings_teamrumble.txt diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/twinduel.txt b/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/twinduel.txt deleted file mode 100644 index 8fc223b..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/roborumble/twinduel.txt +++ /dev/null @@ -1,203 +0,0 @@ -#=============================================================================== -# twinduel.txt - Configuration file for TwinDuel (rumble edition) -#=============================================================================== - -#------------------------------------------------------------------------------- -# User property. It's highly recommendable that you change this to use your name -#------------------------------------------------------------------------------- - -# USER The user name used when uploading the results to the RoboRumble -# server. Hence, you should replace 'Put_Your_Name_Here' with your -# name, which could be the initials you use for your robot(s). - -USER=Put_Your_Name_Here - -#------------------------------------------------------------------------------- -# Exclude filter used for excluding participants. Use with care! -#------------------------------------------------------------------------------- - -# EXCLUDE A comma separated list of all the participants you want to exclude -# from the competition. Excluded participants will not be downloaded -# or take part in battles. This way you can exclude participants that -# cannot be downloaded due to web servers that are down or hanging, -# the repository is down, robots/teams that crashes for some reason or -# cause other trouble. -# -# You can use the filename wildcards * and ? in the filter. Example: -# -# EXCLUDE=xyz.*v1.?, *Nano* - -EXCLUDE= - -#------------------------------------------------------------------------------- -# Properties for controlling the rumble. Use YES or NOT -#------------------------------------------------------------------------------- - -# DOWNLOAD Download data like participants, missing robots, rating files etc. -# from Internet if these have not been downloaded for 2 hours. -# -# EXECUTE Execute battles. Battles files are first created and old battles -# files are deleted before the battles are executed. -# -# UPLOAD Upload results to the RoboRumble server specified by the RESULTSURL -# property. -# -# ITERATE If set to NOT, the rumble will only execute battles once. -# If set to YES, the rumble will restart with new battles every time -# the battles have been executed, and it will run infinitely until -# terminated. - -DOWNLOAD=YES -EXECUTE=YES -UPLOAD=YES -ITERATE=YES - -# MELEE Must be set if this rumble is meant for melee battles. -# -# TEAMS Must be set if this rumble is meant for team battles. -# This flag is necessary, as jar files for robot teams are different -# from jar files for ordinary robots. - -# MELEE=NOT as this property file is not meant for melee battles. -# TEAM=YES, as this property file is meant for team battles. - -# Do not modify these properties! - -MELEE=NOT -TEAMS=YES - -#------------------------------------------------------------------------------ -# Properties for the battle engine -#------------------------------------------------------------------------------ - -# FIELDL Battlefield width measured in pixels. -# FIELDH Battlefield height measured in pixels. -# -# NUMBATTLES Number of battles performed per rumble. -# ROUNDS Number of rounds per battle. - -# These are standard values for the TeamRumble. Do not modify these properties! - -FIELDL=800 -FIELDH=800 -NUMBATTLES=10 -ROUNDS=75 - -# INPUT Input battles file that is generated by the rumble automatically. -# The rumble uses this file for selecting which robots that must -# battle against each other. -# -# OUTPUT Battle results file, which is the output of running the rumble. - -INPUT=./roborumble/temp/battlesTwinduel.txt -OUTPUT=./roborumble/files/resultsTwinduel.txt - -#------------------------------------------------------------------------------- -# Properties for retrieving robots from Internet -#------------------------------------------------------------------------------- - -# BOTSREP The robot repository where downloaded robots are put. -# -# TEMP Directory containing all temporary files for RoboRumble. - -BOTSREP=./robots/ -TEMP=./roborumble/temp/ - -#------------------------------------------------------------------------------- -# Properties for updating participants from Internet -#------------------------------------------------------------------------------- - -# PARTICIPANTSURL -# URL to the web page containing all participants of the competition, -# which will be used for updating the participants file specified with -# the PARTICIPANTSFILE property. -# -# PARTICIPANTSFILE -# File containing all the participants for the competition. -# -# STARTAG Tag marking the start and end of the participants on the web page -# pointed to with the PARTICIPANTSURL property. -# -# UPDATEBOTSURL -# URL used for removing old participants, which is used for updating -# the participants file specified with the PARTICIPANTSFILE property. - -PARTICIPANTSURL=http://robowiki.net/wiki/RoboRumble/Participants/TwinDuel -PARTICIPANTSFILE=./roborumble/files/participTwinduel.txt - -STARTAG=pre - -UPDATEBOTSURL=http://literumble.appspot.com/RemoveOldParticipant - -#------------------------------------------------------------------------------- -# Properties to control the way battles are run -#------------------------------------------------------------------------------- - -# RUNONLY If left black or set to GENERAL, a new battle file is created where -# robots from the participants file are paired at random. The number -# of robot pairs will match number of battles defined the NUMBATTLES -# property. -# -# If set to SERVER (recommended), a new battle file is created which -# will first of all contain priority battles for robots that that has -# priority over other robots until they have fought a specific number -# of battles specified by the BATTLESPERBOT property. The number of -# battles fought by the individual robots are extracted from the -# rating files, which are downloaded from the server if the DOWNLOAD -# property is set to YES. When no more priority battles are left, -# robots from the participants file are paired at random similar to -# GENERAL. -# -# BATTLESPERBOT -# The number of battles a robot has to fight before it will no longer -# have priority over other robots in battles. Prioritizing a robot -# makes its rating more reliable faster as its number of fought -# battles increases faster than when it is not prioritized. -# -# PRIORITYBATTLESFILE -# The priority battles file that is generated automatically by the -# rumble when the RUNONLY property is set to SERVER. - -RUNONLY=SERVER - -BATTLESPERBOT=200 - -PRIORITYBATTLESFILE=./roborumble/temp/priorityTwinduel.txt - -#------------------------------------------------------------------------------- -# Properties for uploading the results to the server -#------------------------------------------------------------------------------- - -# RESULTSURL -# URL used for uploading the results to the server. -# -# BATTLESNUMFILE -# File containing the number of battles fought by the robots, which is -# returned by the server when results are uploaded to the server. - -RESULTSURL=http://literumble.appspot.com/UploadedResults - -BATTLESNUMFILE=./roborumble/temp/twinduelbattlesnumber.txt - -#------------------------------------------------------------------------------- -# Properties for URLs and file names for the rating files to download -#------------------------------------------------------------------------------- - -# RATINGS.URL: -# URL to where ratings files are located on Internet. -# -# RATINGS.GENERAL: -# File name for the rating file of the general RoboRumble. -# -# RATINGS.MINIBOTS: -# File name for the rating file of the MiniRumble. -# -# RATINGS.MICROBOTS: -# File name for the rating file of the MicroRumble. -# -# RATINGS.NANOBOTS: -# File name for the rating file of the NanoRumble. - -RATINGS.URL=http://literumble.appspot.com/RatingsFile - -RATINGS.GENERAL=./roborumble/temp/ratings_twinduel.txt diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.bat b/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.bat deleted file mode 100644 index 3d97f1f..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.bat +++ /dev/null @@ -1,9 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -java -Xmx512M -cp libs/robocode.jar;libs/roborumble.jar;libs/codesize-1.1.jar; roborumble.RoboRumbleAtHome ./roborumble/teamrumble.txt \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.command b/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.command deleted file mode 100644 index c103230..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.command +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -################################################################################ -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -################################################################################ - -pwd=`pwd` -cd "${0%/*}" -java -Xdock:icon=roborumble.ico -Xdock:name=TeamRumble -Xmx512M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/teamrumble.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.sh b/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.sh deleted file mode 100644 index 96b6e82..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/teamrumble.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -pwd=`pwd` -cd "${0%/*}" -java -Xmx512M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/teamrumble.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/templates/newjavafile.tpt b/代码/workspace_robo4/robocode.content/src/main/resources/templates/newjavafile.tpt deleted file mode 100644 index b5bbc36..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/templates/newjavafile.tpt +++ /dev/null @@ -1,8 +0,0 @@ -package $PACKAGE; - -/** - * $CLASSNAME - a class by (your name here) - */ -public class $CLASSNAME -{ -} diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/templates/newjuniorrobot.tpt b/代码/workspace_robo4/robocode.content/src/main/resources/templates/newjuniorrobot.tpt deleted file mode 100644 index c7f0ec8..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/templates/newjuniorrobot.tpt +++ /dev/null @@ -1,54 +0,0 @@ -package $PACKAGE; -import robocode.*; - -// API help : http://robocode.sourceforge.net/docs/robocode/robocode/JuniorRobot.html - -/** - * $CLASSNAME - a robot by (your name here) - */ -public class $CLASSNAME extends JuniorRobot -{ - /** - * run: $CLASSNAME's default behavior - */ - public void run() { - // Initialization of the robot should be put here - - // Some color codes: blue, yellow, black, white, red, pink, brown, grey, orange... - // Sets these colors (robot parts): body, gun, radar, bullet, scan_arc - setColors(orange, blue, white, yellow, black); - - // Robot main loop - while(true) { - // Replace the next 4 lines with any behavior you would like - ahead(100); - turnGunRight(360); - back(100); - turnGunRight(360); - } - } - - /** - * onScannedRobot: What to do when you see another robot - */ - public void onScannedRobot() { - // Replace the next line with any behavior you would like - fire(1); - } - - /** - * onHitByBullet: What to do when you're hit by a bullet - */ - public void onHitByBullet() { - // Replace the next line with any behavior you would like - back(10); - } - - /** - * onHitWall: What to do when you hit a wall - */ - public void onHitWall() { - // Replace the next line with any behavior you would like - back(20); - } -} diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/templates/newrobot.tpt b/代码/workspace_robo4/robocode.content/src/main/resources/templates/newrobot.tpt deleted file mode 100644 index 070e471..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/templates/newrobot.tpt +++ /dev/null @@ -1,56 +0,0 @@ -package $PACKAGE; -import robocode.*; -//import java.awt.Color; - -// API help : http://robocode.sourceforge.net/docs/robocode/robocode/Robot.html - -/** - * $CLASSNAME - a robot by (your name here) - */ -public class $CLASSNAME extends Robot -{ - /** - * run: $CLASSNAME's default behavior - */ - public void run() { - // Initialization of the robot should be put here - - // After trying out your robot, try uncommenting the import at the top, - // and the next line: - - // setColors(Color.red,Color.blue,Color.green); // body,gun,radar - - // Robot main loop - while(true) { - // Replace the next 4 lines with any behavior you would like - ahead(100); - turnGunRight(360); - back(100); - turnGunRight(360); - } - } - - /** - * onScannedRobot: What to do when you see another robot - */ - public void onScannedRobot(ScannedRobotEvent e) { - // Replace the next line with any behavior you would like - fire(1); - } - - /** - * onHitByBullet: What to do when you're hit by a bullet - */ - public void onHitByBullet(HitByBulletEvent e) { - // Replace the next line with any behavior you would like - back(10); - } - - /** - * onHitWall: What to do when you hit a wall - */ - public void onHitWall(HitWallEvent e) { - // Replace the next line with any behavior you would like - back(20); - } -} diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode Black Theme.properties b/代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode Black Theme.properties deleted file mode 100644 index bd627b6..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode Black Theme.properties +++ /dev/null @@ -1,23 +0,0 @@ -#Robocode Editor Theme Properties -#Sun Sep 15 22:13:41 CEST 2013 -editor.theme=Robocode Black Theme -editor.font.name=Monospaced -editor.font.size=14 -editor.background.color=000000 -editor.lineNumber.background.color=22222 -editor.lineNumber.text.color=00CC00 -editor.highlighted.line.color=999999 -editor.selected.text.color=993300 -editor.selected.background.color=FFFFFF -editor.text.style.normal=Plain -editor.text.color.normal=00FFFF -editor.text.style.keyword=Bold -editor.text.color.keyword=0000FF -editor.text.style.literal=Plain -editor.text.color.literal=FFFF00 -editor.text.style.comment=Italic -editor.text.color.comment=00FF00 -editor.text.style.quoted=Plain -editor.text.color.quoted=FF0000 -editor.text.style.annotation=Plain -editor.text.color.annotation=FF00FF diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode White Theme.properties b/代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode White Theme.properties deleted file mode 100644 index 0eecd3e..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/theme/editor/Robocode White Theme.properties +++ /dev/null @@ -1,23 +0,0 @@ -#Robocode Editor Theme Properties -#Wed Jul 31 14:51:10 CEST 2013 -editor.theme=Robocode White Theme -editor.font.name=Monospaced -editor.font.size=14 -editor.background.color=FFFFFF -editor.lineNumber.background.color=EEEEEE -editor.lineNumber.text.color=000000 -editor.highlighted.line.color=FFFFCC -editor.selected.text.color=FFFFFF -editor.selected.background.color=3399FF -editor.text.style.normal=Plain -editor.text.color.normal=000000 -editor.text.style.keyword=Bold -editor.text.color.keyword=0000AF -editor.text.style.literal=Bold -editor.text.color.literal=0000AF -editor.text.style.comment=Plain -editor.text.color.comment=00AF00 -editor.text.style.quoted=Plain -editor.text.color.quoted=7F0000 -editor.text.style.annotation=Plain -editor.text.color.annotation=7F7F7F diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.bat b/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.bat deleted file mode 100644 index c5573f2..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.bat +++ /dev/null @@ -1,9 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -java -Xmx512M -cp libs/robocode.jar;libs/roborumble.jar;libs/codesize-1.1.jar; roborumble.RoboRumbleAtHome ./roborumble/twinduel.txt \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.command b/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.command deleted file mode 100644 index a61c9e8..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.command +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -################################################################################ -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -################################################################################ - -pwd=`pwd` -cd "${0%/*}" -java -Xdock:icon=roborumble.ico -Xdock:name=TwinDuel -Xmx512M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/twinduel.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.sh b/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.sh deleted file mode 100644 index 1669b1b..0000000 --- a/代码/workspace_robo4/robocode.content/src/main/resources/twinduel.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - -pwd=`pwd` -cd "${0%/*}" -java -Xmx512M -cp libs/robocode.jar:libs/roborumble.jar:libs/codesize-1.1.jar roborumble.RoboRumbleAtHome ./roborumble/twinduel.txt -cd "${pwd}" diff --git a/代码/workspace_robo4/robocode.core/.classpath b/代码/workspace_robo4/robocode.core/.classpath deleted file mode 100644 index a5988a2..0000000 --- a/代码/workspace_robo4/robocode.core/.classpath +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.core/.project b/代码/workspace_robo4/robocode.core/.project deleted file mode 100644 index 45e2fe1..0000000 --- a/代码/workspace_robo4/robocode.core/.project +++ /dev/null @@ -1,16 +0,0 @@ - - - robocode.core - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.core/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 65f3846..0000000 --- a/代码/workspace_robo4/robocode.core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:08 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.core/pom.xml b/代码/workspace_robo4/robocode.core/pom.xml deleted file mode 100644 index b544668..0000000 --- a/代码/workspace_robo4/robocode.core/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - 4.0.0 - robocode.core - Robocode Core - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - - org.picocontainer - picocontainer - 2.14.2 - - - - junit - junit - 4.11 - test - - - - - - maven-resources-plugin - - - copy-resources - validate - - copy-resources - - - ${basedir}/target/classes - - - .. - false - - - versions.md - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.core/robocode.core.iml b/代码/workspace_robo4/robocode.core/robocode.core.iml deleted file mode 100644 index 56af730..0000000 --- a/代码/workspace_robo4/robocode.core/robocode.core.iml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleProperties.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleProperties.java deleted file mode 100644 index c3a76d9..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleProperties.java +++ /dev/null @@ -1,333 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import robocode.AdvancedRobot; -import robocode.Robot; -import robocode.control.RobotSetup; -import robocode.control.RobotSpecification; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.Serializable; -import java.util.Properties; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class BattleProperties implements Serializable { - - private static final long serialVersionUID = 1L; - - private final static String - BATTLEFIELD_WIDTH = "robocode.battleField.width", - BATTLEFIELD_HEIGHT = "robocode.battleField.height", - BATTLE_NUMROUNDS = "robocode.battle.numRounds", - BATTLE_GUNCOOLINGRATE = "robocode.battle.gunCoolingRate", - BATTLE_RULES_INACTIVITYTIME = "robocode.battle.rules.inactivityTime", - BATTLE_HIDE_ENEMY_NAMES = "robocode.battle.hideEnemyNames", - BATTLE_SELECTEDROBOTS = "robocode.battle.selectedRobots", - BATTLE_INITIAL_POSITIONS = "robocode.battle.initialPositions", - BATTLE_SENTRY_BORDER_SIZE = "robocode.battle.sentryBorderSize"; - - private int battlefieldWidth = 800; - private int battlefieldHeight = 600; - private int numRounds = 10; - private double gunCoolingRate = 0.1; - private long inactivityTime = 450; - private boolean hideEnemyNames = false; - private int sentryBorderSize = 100; - private String selectedRobots; - private String initialPositions; - - private final Properties props = new Properties(); - - /** - * Gets the battlefieldWidth. - * - * @return Returns a int - */ - public int getBattlefieldWidth() { - return battlefieldWidth; - } - - /** - * Sets the battlefieldWidth. - * - * @param battlefieldWidth The battlefieldWidth to set - */ - public void setBattlefieldWidth(int battlefieldWidth) { - this.battlefieldWidth = battlefieldWidth; - props.setProperty(BATTLEFIELD_WIDTH, "" + battlefieldWidth); - } - - /** - * Gets the battlefieldHeight. - * - * @return Returns a int - */ - public int getBattlefieldHeight() { - return battlefieldHeight; - } - - /** - * Sets the battlefieldHeight. - * - * @param battlefieldHeight The battlefieldHeight to set - */ - public void setBattlefieldHeight(int battlefieldHeight) { - this.battlefieldHeight = battlefieldHeight; - props.setProperty(BATTLEFIELD_HEIGHT, "" + battlefieldHeight); - } - - /** - * Gets the numRounds. - * - * @return Returns a int - */ - public int getNumRounds() { - return numRounds; - } - - /** - * Sets the numRounds. - * - * @param numRounds The numRounds to set - */ - public void setNumRounds(int numRounds) { - this.numRounds = numRounds; - props.setProperty(BATTLE_NUMROUNDS, "" + numRounds); - } - - /** - * Returns the rate at which the gun will cool down, i.e. the amount of heat the gun heat will drop per turn. - *

- * The gun cooling rate is default 0.1 per turn, but can be changed by the battle setup. - * So don't count on the cooling rate being 0.1! - * - * @return the gun cooling rate - * @see #setGunCoolingRate(double) - * @see Robot#getGunHeat() - * @see Robot#fire(double) - * @see Robot#fireBullet(double) - * @see robocode.BattleRules#getGunCoolingRate() - */ - public double getGunCoolingRate() { - return gunCoolingRate; - } - - /** - * Sets the rate at which the gun will cool down, i.e. the amount of heat the gun heat will drop per turn. - * - * @param gunCoolingRate the new gun cooling rate - * @see #getGunCoolingRate - * @see Robot#getGunHeat() - * @see Robot#fire(double) - * @see Robot#fireBullet(double) - * @see robocode.BattleRules#getGunCoolingRate() - */ - public void setGunCoolingRate(double gunCoolingRate) { - this.gunCoolingRate = gunCoolingRate; - props.setProperty(BATTLE_GUNCOOLINGRATE, "" + gunCoolingRate); - } - - /** - * Returns the allowed inactivity time, where the robot is not taking any action, before will begin to be zapped. - * The inactivity time is measured in turns, and is the allowed time that a robot is allowed to omit taking - * action before being punished by the game by zapping. - *

- * When a robot is zapped by the game, it will loose 0.1 energy points per turn. Eventually the robot will be - * killed by zapping until the robot takes action. When the robot takes action, the inactivity time counter is - * reset. - *

- * The allowed inactivity time is per default 450 turns, but can be changed by the battle setup. - * So don't count on the inactivity time being 450 turns! - * - * @return the allowed inactivity time. - * @see robocode.BattleRules#getInactivityTime() - * @see Robot#doNothing() - * @see AdvancedRobot#execute() - */ - public long getInactivityTime() { - return inactivityTime; - } - - /** - * Sets the allowed inactivity time, where the robot is not taking any action, before will begin to be zapped. - * - * @param inactivityTime the new allowed inactivity time. - * @see robocode.BattleRules#getInactivityTime() - * @see Robot#doNothing() - * @see AdvancedRobot#execute() - */ - public void setInactivityTime(long inactivityTime) { - this.inactivityTime = inactivityTime; - props.setProperty(BATTLE_RULES_INACTIVITYTIME, "" + inactivityTime); - } - - /** - * Sets the flag defining if enemy names are hidden for robots during a battle. - * - * @param hideEnemyNames true if the enemy names must be hidden for a robot; false otherwise. - * - * @since 1.7.3 - */ - public void setHideEnemyNames(boolean hideEnemyNames) { - this.hideEnemyNames = hideEnemyNames; - props.setProperty(BATTLE_HIDE_ENEMY_NAMES, "" + hideEnemyNames); - } - - /** - * Returns true if the enemy names are hidden for robots during a battle; false otherwise. - * - * @since 1.7.3 - */ - public boolean getHideEnemyNames() { - return hideEnemyNames; - } - - /** - * Gets the selectedRobots. - * - * @return Returns a String - */ - public String getSelectedRobots() { - return selectedRobots; - } - - /** - * Sets the selectedRobots. - * - * @param selectedRobots The selectedRobots to set - */ - public void setSelectedRobots(String selectedRobots) { - this.selectedRobots = selectedRobots; - props.setProperty(BATTLE_SELECTEDROBOTS, "" + selectedRobots); - } - - /** - * Sets the selectedRobots. - * - * @param robots The robots to set - */ - public void setSelectedRobots(RobotSpecification[] robots) { - StringBuffer robotString = new StringBuffer(); - RobotSpecification robot; - - for (int i = 0; i < robots.length; i++) { - robot = robots[i]; - if (robot == null) { - continue; - } - - robotString.append(robot.getClassName()); - - if (!(robot.getVersion() == null || robot.getVersion().length() == 0)) { - robotString.append(' ').append(robot.getVersion()); - } - - if (i < robots.length - 1) { - robotString.append(','); - } - } - setSelectedRobots(robotString.toString()); - } - - /** - * Gets the initial robot positions and headings. - * - * @return a comma-separated string containing the initial positions and headings as a comma separated string: - * x1,y1,heading1, x2,y2,heading2 - * - * @since 1.7.1.2 - */ - public String getInitialPositions() { - return initialPositions; - } - - /** - * Sets the initial robot positions and headings. - * - * @param positions is the initial positions and headings as a comma separated string: - * x1,y1,heading1, x2,y2,heading2 - * - * @since 1.7.1.2 - */ - public void setInitialPositions(String positions) { - this.initialPositions = positions; - } - - /** - * Sets the initial robot positions and headings. - * - * @param initialSetups is the initial positions and headings as a {@link RobotSetup} array. - * - * @since 1.9.2.0 - */ - public void setInitialPositions(RobotSetup[] initialSetups) { - if (initialSetups == null) { - return; - } - - StringBuilder sb = new StringBuilder(); - - for (RobotSetup setup : initialSetups) { - String x = (setup.getX() == null) ? "?" : "" + setup.getX(); - String y = (setup.getY() == null) ? "?" : "" + setup.getY(); - String heading = (setup.getHeading() == null) ? "?" : "" + setup.getHeading(); - - sb.append('('); - sb.append(x).append(','); - sb.append(y).append(','); - sb.append(heading); - sb.append("),"); - } - - this.initialPositions = sb.toString(); - } - - /** - * Returns the sentry border size for a {@link robocode.BorderSentry BorderSentry}. - * - * @return the border size in units/pixels. - */ - public int getSentryBorderSize() { - return sentryBorderSize; - } - - /** - * Returns the sentry border size for a {@link robocode.BorderSentry BorderSentry}. - * - * @param borderSize is the sentry border size in units/pixels. - */ - public void setSentryBorderSize(int borderSize) { - sentryBorderSize = borderSize; - props.setProperty(BATTLE_SENTRY_BORDER_SIZE, "" + sentryBorderSize); - } - - public void store(FileOutputStream out, String desc) throws IOException { - props.store(out, desc); - } - - public void load(FileInputStream in) throws IOException { - props.load(in); - battlefieldWidth = Integer.parseInt(props.getProperty(BATTLEFIELD_WIDTH, "800")); - battlefieldHeight = Integer.parseInt(props.getProperty(BATTLEFIELD_HEIGHT, "600")); - gunCoolingRate = Double.parseDouble(props.getProperty(BATTLE_GUNCOOLINGRATE, "0.1")); - inactivityTime = Long.parseLong(props.getProperty(BATTLE_RULES_INACTIVITYTIME, "450")); - hideEnemyNames = Boolean.parseBoolean(props.getProperty(BATTLE_HIDE_ENEMY_NAMES, "false")); - numRounds = Integer.parseInt(props.getProperty(BATTLE_NUMROUNDS, "10")); - selectedRobots = props.getProperty(BATTLE_SELECTEDROBOTS, ""); - initialPositions = props.getProperty(BATTLE_INITIAL_POSITIONS, ""); - sentryBorderSize = Integer.parseInt(props.getProperty(BATTLE_SENTRY_BORDER_SIZE, "100")); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleRankingTableModel.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleRankingTableModel.java deleted file mode 100644 index bf32324..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleRankingTableModel.java +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import robocode.control.snapshot.IScoreSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.table.AbstractTableModel; - - -/** - * This table model extracts the robot ranking from the current battle, - * in order to be displayed by the RankingDialog. - * - * @author Luis Crespo (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - * @author Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh (contributors) - */ -@SuppressWarnings("serial") -public class BattleRankingTableModel extends AbstractTableModel { - - private IScoreSnapshot[] scoreSnapshotList; - - // The sum of the scores gathered by the robots in the actual round - private double currentSum; - - // The sum of the scores gathered by the robots in the previous rounds - private double totalSum; - - /** - * Function for counting the sum of the scores gathered by the robots. - */ - private void countTotalScores() { - currentSum = 0; - totalSum = 0; - - for (IScoreSnapshot score : scoreSnapshotList) { - currentSum += score.getCurrentScore(); - totalSum += score.getTotalScore(); - } - } - - public void updateSource(ITurnSnapshot snapshot) { - if (snapshot != null) { - scoreSnapshotList = snapshot.getSortedTeamScores(); - countTotalScores(); - } else { - scoreSnapshotList = null; - } - } - - public int getColumnCount() { - return 12; - } - - public int getRowCount() { - return scoreSnapshotList == null ? 0 : scoreSnapshotList.length; - } - - @Override - public String getColumnName(int col) { - switch (col) { - case 0: - return "Rank"; - - case 1: - return "Robot Name"; - - case 2: - return " Total Score "; - - case 3: - return " Survival "; - - case 4: - return "Surv Bonus"; - - case 5: - return " Bullet Dmg "; - - case 6: - return " Bullet Bonus "; - - case 7: - return "Ram Dmg * 2"; - - case 8: - return "Ram Bonus"; - - case 9: - return " 1sts "; - - case 10: - return " 2nds "; - - case 11: - return " 3rds "; - - default: - return ""; - } - } - - public Object getValueAt(int row, int col) { - - final IScoreSnapshot statistics = scoreSnapshotList[row]; - - switch (col) { - case 0: - return getPlacementString(row + 1); - - case 1: - return statistics.getName(); - - case 2: { - final double current = statistics.getCurrentScore(); - final double total = statistics.getTotalScore(); - - return (int) (current + 0.5) + " / " + (int) (total + current + 0.5) + " (" - + (int) (current / currentSum * 100) + " / " + (int) ((total + current) / (totalSum + currentSum) * 100) - + "%)"; - } - - case 3: { - final double current = statistics.getCurrentSurvivalScore(); - final double total = statistics.getTotalSurvivalScore(); - - return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); - } - - case 4: - return (int) (statistics.getTotalLastSurvivorBonus() + 0.5); - - case 5: { - final double current = statistics.getCurrentBulletDamageScore(); - final double total = statistics.getTotalBulletDamageScore(); - - return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); - } - - case 6: { - final double current = statistics.getCurrentBulletKillBonus(); - final double total = statistics.getTotalBulletKillBonus(); - - return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); - } - - case 7: { - final double current = statistics.getCurrentRammingDamageScore(); - final double total = statistics.getTotalRammingDamageScore(); - - return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); - } - - case 8: { - final double current = statistics.getCurrentRammingKillBonus(); - final double total = statistics.getTotalRammingKillBonus(); - - return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); - } - - case 9: - return "" + statistics.getTotalFirsts(); - - case 10: - return "" + statistics.getTotalSeconds(); - - case 11: - return "" + statistics.getTotalThirds(); - - default: - return ""; - } - } - - private static String getPlacementString(int i) { - String result = "" + i; - - if (i > 3 && i < 20) { - result += "th"; - } else if (i % 10 == 1) { - result += "st"; - } else if (i % 10 == 2) { - result += "nd"; - } else if (i % 10 == 3) { - result += "rd"; - } else { - result += "th"; - } - return result; - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleResultsTableModel.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleResultsTableModel.java deleted file mode 100644 index 1d3159f..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/BattleResultsTableModel.java +++ /dev/null @@ -1,253 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import net.sf.robocode.io.Logger; -import robocode.BattleResults; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.text.DateFormat; -import java.text.NumberFormat; -import java.util.Date; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - * @author Nathaniel Troutman (contributor) - * @author Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh (contributors) - */ -@SuppressWarnings("serial") -public class BattleResultsTableModel extends javax.swing.table.AbstractTableModel { - private String title; - private final BattleResults[] results; - private final int numRounds; - - // The sum of the scores gathered by the robots. - private final double totalScore; - - public BattleResultsTableModel(BattleResults[] results, int numRounds) { - this.results = results; - this.numRounds = numRounds; - totalScore = countTotalScore(); - } - - /** - * Function for counting the sum of the scores gathered by the robots. - * - * @return The sum. - */ - private double countTotalScore() { - - double totalScore = 0; - - for (BattleResults result : results) { - totalScore += result.getScore(); - } - - return totalScore; - } - - public int getColumnCount() { - return 12; - } - - @Override - public String getColumnName(int col) { - switch (col) { - case 0: - return "Rank"; - - case 1: - return "Robot Name"; - - case 2: - return " Total Score "; - - case 3: - return "Survival"; - - case 4: - return "Surv Bonus"; - - case 5: - return "Bullet Dmg"; - - case 6: - return "Bullet Bonus"; - - case 7: - return "Ram Dmg * 2"; - - case 8: - return "Ram Bonus"; - - case 9: - return " 1sts "; - - case 10: - return " 2nds "; - - case 11: - return " 3rds "; - - default: - return ""; - } - } - - public int getRowCount() { - return results.length; - } - - public String getTitle() { - if (title == null) { - int round = numRounds; - - title = "Results for " + round + " round"; - if (round > 1) { - title += 's'; - } - } - return title; - } - - public Object getValueAt(int row, int col) { - - BattleResults statistics = results[row]; - - switch (col) { - case 0: { - int place = row + 1; - - while (place < getRowCount() && statistics.getScore() == results[place].getScore()) { - place++; - } - return getPlacementString(place); - } - - case 1: - return statistics.getTeamLeaderName(); - - case 2: - String percent = ""; - - if (totalScore != 0) { - percent = " (" + NumberFormat.getPercentInstance().format(statistics.getScore() / totalScore) + ")"; - } - return "" + (int) (statistics.getScore() + 0.5) + percent; - - case 3: - return "" + (int) (statistics.getSurvival() + 0.5); - - case 4: - return "" + (int) (statistics.getLastSurvivorBonus() + 0.5); - - case 5: - return "" + (int) (statistics.getBulletDamage() + 0.5); - - case 6: - return "" + (int) (statistics.getBulletDamageBonus() + 0.5); - - case 7: - return "" + (int) (statistics.getRamDamage() + 0.5); - - case 8: - return "" + (int) (statistics.getRamDamageBonus() + 0.5); - - case 9: - return "" + statistics.getFirsts(); - - case 10: - return "" + statistics.getSeconds(); - - case 11: - return "" + statistics.getThirds(); - - default: - return ""; - } - } - - // Used for printing to the console only - public void print(PrintStream out) { - out.println(getTitle()); - - for (int col = 1; col < getColumnCount(); col++) { - out.print(getColumnName(col) + "\t"); - } - - out.println(); - - for (int row = 0; row < getRowCount(); row++) { - out.print(getValueAt(row, 0) + ": "); - for (int col = 1; col < getColumnCount(); col++) { - out.print(getValueAt(row, col) + "\t"); - } - out.println(); - } - } - - public void saveToFile(String filename, boolean append) { - try { - PrintStream out = new PrintStream(new FileOutputStream(filename, append)); - - out.println(DateFormat.getDateTimeInstance().format(new Date())); - - out.println(getTitle()); - - for (int col = 0; col < getColumnCount(); col++) { - if (col > 0) { - out.print(','); - } - out.print(getColumnName(col)); - } - - out.println(); - - for (int row = 0; row < getRowCount(); row++) { - for (int col = 0; col < getColumnCount(); col++) { - if (col > 0) { - out.print(','); - } - out.print(getValueAt(row, col)); - } - out.println(); - } - - out.println("$"); - - out.close(); - - } catch (IOException e) { - Logger.logError(e); - } - } - - private static String getPlacementString(int i) { - String result = "" + i; - - if (i > 3 && i < 20) { - result += "th"; - } else if (i % 10 == 1) { - result += "st"; - } else if (i % 10 == 2) { - result += "nd"; - } else if (i % 10 == 3) { - result += "rd"; - } else { - result += "th"; - } - return result; - } - -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/IBattleManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/IBattleManager.java deleted file mode 100644 index 76049be..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/IBattleManager.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle; - - -import robocode.Event; - - -/** - * Used for controlling a robot from the e.g. the UI or RobocodeEngine. - * - * @author Flemming N. Larsen - * - * @since 1.6.1 - */ -public interface IBattleManager extends IBattleManagerBase { - - /** - * Kills the robot. - * - * @param robotIndex the index of the robot to kill. - */ - void killRobot(int robotIndex); - - /** - * Enable or disable the robot paintings. - * - * @param robotIndex the index of the robot that must have its paintings enabled or disabled. - * @param enable {@code true} if paint must be enabled; {@code false} otherwise. - */ - void setPaintEnabled(int robotIndex, boolean enable); - - /** - * Enable or disable the robot paintings using the RobocodeSG coordinate system - * with the y-axis reversed compared to the coordinate system used in Robocode. - * - * @param robotIndex the index of the robot that must use RobocodeSG paintings. - * @param enable {@code true} if RobocodeSG paint coordinate system must be - * enabled when painting the robot; {@code false} otherwise. - */ - void setSGPaintEnabled(int robotIndex, boolean enable); - - /** - * Sends an interactive event for the robot. - * - * @param event the interactive event that has occurred to the robot. - */ - void sendInteractiveEvent(Event event); - - void startNewBattle(BattleProperties battleProperties, boolean waitTillOver, boolean enableCLIRecording); - - void nextTurn(); - - void prevTurn(); - - void pauseBattle(); - - void resumeBattle(); - - void togglePauseResumeBattle(); - - void resumeIfPausedBattle(); // TODO refactor, remove - - void pauseIfResumedBattle(); // TODO refactor, remove - - void restart(); - - void replay(); - - boolean isManagedTPS(); - - void setManagedTPS(boolean value); - - String getBattlePath(); - - String getBattleFilename(); - - void setBattleFilename(String newBattleFilename); - - BattleProperties loadBattleProperties(); - - void saveBattleProperties(); - - BattleProperties getBattleProperties(); - - void setDefaultBattleProperties(); - - void cleanup(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/events/BattleEventDispatcher.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/events/BattleEventDispatcher.java deleted file mode 100644 index 9155e67..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/events/BattleEventDispatcher.java +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.battle.events; - - -import static net.sf.robocode.io.Logger.logError; - -import net.sf.robocode.io.Logger; -import robocode.control.events.*; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - - -/** - * @author Flemming N. Larsen (original) - * @author Pavel Savara (original) - * - * @since 1.6.1 - */ -public class BattleEventDispatcher implements IBattleListener { - // This list is guaranteed to be thread-safe, which is necessary as it will be accessed - // by both the battle thread and battle manager thread. If this list is not thread-safe - // then ConcurentModificationExceptions will occur from time to time. - private final List listeners = new CopyOnWriteArrayList(); - - public BattleEventDispatcher() {} - - public void addListener(IBattleListener listener) { - assert (listener != null); - - listeners.add(listener); - } - - public void removeListener(IBattleListener listener) { - assert (listener != null); - listeners.remove(listener); - } - - public void onBattleStarted(BattleStartedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onBattleStarted(event); - } catch (RuntimeException ex) { - logError("onBattleStarted " + listener.getClass(), ex); - } - } - } - - public void onBattleCompleted(BattleCompletedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onBattleCompleted(event); - } catch (RuntimeException ex) { - logError("onBattleCompleted " + listener.getClass(), ex); - } - } - } - - public void onBattleFinished(BattleFinishedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onBattleFinished(event); - } catch (RuntimeException ex) { - logError("onBattleFinished " + listener.getClass(), ex); - } - } - } - - public void onBattlePaused(BattlePausedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onBattlePaused(event); - } catch (RuntimeException ex) { - logError("onBattlePaused " + listener.getClass(), ex); - } - } - } - - public void onBattleResumed(BattleResumedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onBattleResumed(event); - } catch (RuntimeException ex) { - logError("onBattleResumed " + listener.getClass(), ex); - } - } - } - - public void onRoundStarted(RoundStartedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onRoundStarted(event); - } catch (RuntimeException ex) { - logError("onRoundStarted " + listener.getClass(), ex); - } - } - } - - public void onRoundEnded(RoundEndedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onRoundEnded(event); - } catch (RuntimeException ex) { - logError("onRoundEnded " + listener.getClass(), ex); - } - } - } - - public void onTurnStarted(TurnStartedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onTurnStarted(event); - } catch (RuntimeException ex) { - logError("onTurnStarted " + listener.getClass(), ex); - } - } - } - - public void onTurnEnded(TurnEndedEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onTurnEnded(event); - } catch (RuntimeException ex) { - logError("onTurnEnded " + listener.getClass(), ex); - } - } - } - - public void onBattleMessage(BattleMessageEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onBattleMessage(event); - } catch (RuntimeException ex) { - logError("onBattleMessage " + listener.getClass(), ex); - } - } - } - - public void onBattleError(BattleErrorEvent event) { - for (IBattleListener listener : listeners) { - try { - listener.onBattleError(event); - } catch (RuntimeException ex) { - Logger.realErr.println(listener.getClass() + " " + ex.getMessage()); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/cachecleaner/CacheCleaner.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/cachecleaner/CacheCleaner.java deleted file mode 100644 index e14ecdd..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/cachecleaner/CacheCleaner.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.cachecleaner; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRepositoryManager; - -import java.io.File; -import java.io.IOException; - - -/** - * Cache cleaner used for cleaning the /robot directory of Robocode, especially - * for RoboRumble - * - * @author AaronR - * @author Flemming N. Larsen (minor optimizations) - */ -public final class CacheCleaner { - private CacheCleaner() {} - - public static void main(String[] args) { - clean(); - } - - public static void clean() { - File roborumbleTempFile = new File("roborumble/temp"); - - deleteFile(roborumbleTempFile.getPath()); - deleteFile(FileUtil.getRobotsDataDir().getPath()); - deleteFile(FileUtil.getRobotDatabaseFile().getPath()); - - FileUtil.createDir(roborumbleTempFile); - - final IRepositoryManager repositoryManager = Container.getComponent(IRepositoryManager.class); - - repositoryManager.reload(true); - - Logger.logMessage("Cleaning done."); - } - - private static void deleteFile(String filename) { - Logger.logMessage("Deleting " + filename + "..."); - try { - recursivelyDelete(new File(filename)); - } catch (IOException ex) { - Logger.logError(ex.getMessage()); - } - } - - private static void recursivelyDelete(File file) throws IOException { - if (file.exists()) { - if (file.isDirectory()) { - final File[] files = file.listFiles(); - - for (File f : files) { - recursivelyDelete(f); - } - } - if (!file.delete()) { - throw new IOException("Failed deleting file: " + file.getPath()); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/BaseModule.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/BaseModule.java deleted file mode 100644 index f3586b0..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/BaseModule.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public class BaseModule implements IModule { - public void afterLoaded(List allModules) {} -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Container.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Container.java deleted file mode 100644 index 3b2cba2..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Container.java +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -import net.sf.robocode.io.Logger; - -import org.picocontainer.Characteristics; -import org.picocontainer.MutablePicoContainer; -import org.picocontainer.behaviors.Caching; -import org.picocontainer.behaviors.OptInCaching; -import org.picocontainer.classname.DefaultClassLoadingPicoContainer; - -import java.awt.Toolkit; -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.net.URL; -import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - - -/** - * Root of loaders. - * - * we have three types of classLoaders. - * 1) System class loader. Is loaded by default and is parent of loaders below. It contains this container class. All content of robot.api module. All general java stuff. - * 2) EngineClassLoader. Is used as isolation of all other robocode modules from system classloader. Anything loaded by engine is loaded there. We use single instance of this loader. - * 3) RobotClassLoader. Is used by robots. It will load every class on robot's private classPath. It blocks malicious attempts of references to robocode engine classes. We use multiple instances of this loader. - * - communication between classes from different classloaders must be done using interfaces or data types from system classLoader - * - this class must not reference any class of EngineClassLoader scope - * - * Dependency injection - * We use PicoContainer as IoC vehicle. We configure it by loading Module class in every .jar or classpath we can find on system classPath - * 1) Container.cache is containing singletons - * 2) Container.factory will create always new instance of component - * - * @author Pavel Savara (original) - */ -public final class Container extends ContainerBase { - - private static final String classPath = System.getProperties().getProperty("robocode.class.path", null); - - public static final MutablePicoContainer cache; - public static final MutablePicoContainer factory; - public static final ClassLoader systemLoader; - public static final ClassLoader engineLoader; // NO_UCD (use private - used by the .NET plug-in) - private static Set known = new HashSet(); - private static final List modules = new ArrayList(); - - static { - instance = new Container(); - systemLoader = Container.class.getClassLoader(); - engineLoader = new EngineClassLoader(systemLoader); - final Thread currentThread = Thread.currentThread(); - - currentThread.setContextClassLoader(engineLoader); - currentThread.setName("Application Thread"); - - // make sure we have AWT before we init security - Toolkit.getDefaultToolkit(); - - cache = new DefaultClassLoadingPicoContainer(engineLoader, new Caching(), null); - factory = new DefaultClassLoadingPicoContainer(engineLoader, new OptInCaching(), cache); - loadModule("net.sf.robocode.api", systemLoader); - final String[] cp = classPath.split(File.pathSeparator); - - // load core first - for (String path : cp) { - if (path.toLowerCase().contains("robocode.core")) { - loadFromPath(path); - } - } - for (String path : cp) { - loadFromPath(path); - } - - if (known.size() < 2) { - Logger.logError("Main modules not loaded, something went wrong. We have only " + known.size() + " modules"); - Logger.logError("Class path: " + classPath); - throw new Error("Main modules not loaded"); - } - - for (IModule module : modules) { - module.afterLoaded(modules); - } - } - - static void init() {} - - private static void loadFromPath(String path) { - try { - File pathf = new File(path).getCanonicalFile(); - - path = pathf.toString(); - final String test = path.toLowerCase(); - - if (pathf.isDirectory()) { - String name = getModuleName(path); - - if (name != null) { - loadModule(name, engineLoader); - } - } else if (test.contains(File.separator + "robocode.") && test.endsWith(".jar")) { - final int i = test.lastIndexOf("robocode.jar"); - - if (i > 0) { - // load other .jar files in location - final File dir = new File(path.substring(0, i)); - - Logger.logMessage("Loading plugins from " + dir.toString()); - loadJars(dir); - } else { - String name = getModuleName(path); - - if (name != null) { - loadModule(name, engineLoader); - } - } - } - } catch (IOException e) { - Logger.logError(e); - } - } - - private static void loadJars(File pathf) { - final File[] files = pathf.listFiles(new FilenameFilter() { - public boolean accept(File dir, String name) { - return name.toLowerCase().startsWith("robocode") && name.toLowerCase().endsWith(".jar"); - } - }); - - for (File file : files) { - loadModule(getModuleName(file.toString()), engineLoader); - } - } - - private static boolean loadModule(String module, ClassLoader loader) { - try { - if (known.contains(module)) { - // Logger.logMessage("already loaded " + module); - return false; - } - Class modClass = loader.loadClass(module + ".Module"); - - final Object moduleInstance = modClass.newInstance(); - - if (moduleInstance instanceof IModule) { - modules.add((IModule) moduleInstance); - } - Logger.logMessage("Loaded " + module); - known.add(module); - return true; - } catch (ClassNotFoundException ignore) {// it is not our module ? - // Logger.logMessage("Can't load " + module); - } catch (IllegalAccessException e) { - Logger.logError(e); - } catch (InstantiationException e) { - Logger.logError(e); - } - return false; - } - - private static String getModuleName(String path) { - final String test = path.toLowerCase(); - - if (test.endsWith("robocode.jar") || test.contains("robocode.api")) { - return null; - } - int i = test.lastIndexOf("robocode."); - - if (i > 0) { - String name = path.substring(i); - - i = name.indexOf(File.separator); - if (i > 0) { - return "net.sf." + name.substring(0, i); - } - i = name.indexOf("-"); - if (i > 0) { - return "net.sf." + name.substring(0, i); - } - return "net.sf." + name; - } - return null; - } - - static URL[] findJars(String allowed) { - List urls = new ArrayList(); - final String classPath = System.getProperty("robocode.class.path", null); - - for (String path : classPath.split(File.pathSeparator)) { - String test = path.toLowerCase(); - - if (test.contains(allowed)) { - if (!test.contains("robocode.jar") && !test.contains("robocode.api") - ) { - urls.add(path); - } - } - } - return convertUrls(urls); - } - - private static URL[] convertUrls(List surls) { - final URL[] urls = new URL[surls.size()]; - - for (int i = 0; i < surls.size(); i++) { - String url = surls.get(i); - File f = new File(url); - - try { - urls[i] = f.getCanonicalFile().toURI().toURL(); - } catch (MalformedURLException e) { - Logger.logError(e); - } catch (IOException e) { - Logger.logError(e); - } - } - return urls; - } - - protected T getBaseComponent(final Class tClass) { - return cache.getComponent(tClass); - } - - public static T getComponent(java.lang.Class tClass) { - return cache.getComponent(tClass); - } - - public static T getComponent(java.lang.Class tClass, String className) { - final List list = cache.getComponents(tClass); - - for (T component : list) { - if (component.getClass().getName().endsWith(className)) { - return component; - } - } - return null; - } - - public static List getComponents(java.lang.Class tClass) { - return cache.getComponents(tClass); - } - - public static T createComponent(java.lang.Class tClass) { - return factory.as(Characteristics.NO_CACHE).getComponent(tClass); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/EngineClassLoader.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/EngineClassLoader.java deleted file mode 100644 index b796707..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/EngineClassLoader.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -import java.net.URL; -import java.net.URLClassLoader; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.HashSet; -import java.util.Set; -import java.io.File; - -import net.sf.robocode.io.RobocodeProperties; - - -/** - * @author Pavel Savara (original) - */ -public class EngineClassLoader extends URLClassLoader { - - private static Set exclusions = new HashSet(); - static { - // this will be loaded on system classloader - exclusions.add(EngineClassLoader.class.getName()); - exclusions.add(Container.class.getName()); - exclusions.add(RobocodeMainBase.class.getName()); - - // .NET proxies and their interfaces must be loaded in system class loader in order to call native methods - exclusions.add("net.sf.robocode.host.IHost"); - exclusions.add("net.sf.robocode.host.IHostManager"); - exclusions.add("net.sf.robocode.host.proxies.IHostingRobotProxy"); - exclusions.add("net.sf.robocode.peer.IRobotPeer"); - exclusions.add("net.sf.robocode.repository.IRobotItem"); - exclusions.add("net.sf.robocode.repository.RobotType"); - exclusions.add("net.sf.robocode.host.RobotStatics"); - exclusions.add("net.sf.robocode.peer.BadBehavior"); - exclusions.add("net.sf.robocode.dotnet.host.DotNetHost"); - exclusions.add("net.sf.robocode.dotnet.repository.root.DllRootHelper"); - exclusions.add("net.sf.robocode.dotnet.nhost.ModuleN"); - exclusions.add("net.sf.robocode.host.proxies.__IHostingRobotProxy"); - } - - public EngineClassLoader(ClassLoader parent) { - super(Container.findJars(File.separator + "robocode."), parent); - } - - public synchronized void addURL(URL url) { - super.addURL(url); - } - - public synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - - if (RobocodeProperties.isSecurityOff() || name.startsWith("java.lang")) { - return super.loadClass(name, resolve); - } - if (isEngineClass(name)) { - return loadEngineClass(name, resolve); - } - return super.loadClass(name, resolve); - } - - private Class loadEngineClass(String name, boolean resolve) throws ClassNotFoundException { - Class result = findLoadedClass(name); - - if (result == null) { - result = findClass(name); - } - if (resolve) { - resolveClass(result); - } - return result; - } - - private boolean isEngineClass(String name) { - if (name.startsWith("net.sf.robocode") || name.startsWith("robocode.control")) { - if (exclusions.contains(name)) { - return false; - } - // try to find it in engine's classpath - // this is URL, don't change to File.pathSeparator - final String path = name.replace('.', '/').concat(".class"); - - return AccessController.doPrivileged(new PrivilegedAction() { - public Boolean run() { - return findResource(path) != null; - } - }); - } - return false; - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Module.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Module.java deleted file mode 100644 index ae76ab2..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/Module.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -import net.sf.robocode.host.RobotStatics; -import net.sf.robocode.peer.*; -import net.sf.robocode.serialization.RbSerializer; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.settings.SettingsManager; -import net.sf.robocode.version.IVersionManager; -import net.sf.robocode.version.VersionManager; - -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public class Module extends BaseModule { - static { - Container.cache.addComponent(RobocodeMain.class); - Container.cache.addComponent(IVersionManager.class, VersionManager.class); - Container.cache.addComponent(ISettingsManager.class, SettingsManager.class); - } - - @Override - public void afterLoaded(List allModules) { - RbSerializer.register(ExecCommands.class, RbSerializer.ExecCommands_TYPE); - RbSerializer.register(BulletCommand.class, RbSerializer.BulletCommand_TYPE); - RbSerializer.register(TeamMessage.class, RbSerializer.TeamMessage_TYPE); - RbSerializer.register(DebugProperty.class, RbSerializer.DebugProperty_TYPE); - RbSerializer.register(ExecResults.class, RbSerializer.ExecResults_TYPE); - RbSerializer.register(BulletStatus.class, RbSerializer.BulletStatus_TYPE); - RbSerializer.register(RobotStatics.class, RbSerializer.RobotStatics_TYPE); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMain.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMain.java deleted file mode 100644 index 3ba5a93..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMain.java +++ /dev/null @@ -1,414 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -import net.sf.robocode.battle.BattleResultsTableModel; -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.host.ICpuManager; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.recording.BattleRecordFormat; -import net.sf.robocode.recording.IRecordManager; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.sound.ISoundManager; -import net.sf.robocode.ui.IWindowManager; -import net.sf.robocode.util.StringUtil; -import net.sf.robocode.version.IVersionManager; -import robocode.control.events.*; - -import java.awt.Toolkit; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; - - -/** - * Robocode - A programming game involving battling AI tanks.
- * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * - * @see robocode.sourceforge.net - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Pavel Savara (contributor) - */ -public final class RobocodeMain extends RobocodeMainBase { - - private final Setup setup; - private final BattleObserver battleObserver = new BattleObserver(); - final private ISettingsManager properties; - final private IHostManager hostManager; - final private IWindowManager windowManager; - final private ISoundManager soundManager; - final private IBattleManager battleManager; - final private IRecordManager recordManager; - final private IVersionManager versionManager; - - private static class Setup { - boolean minimize; - boolean exitOnComplete; - String battleFilename; - String recordFilename; - String recordXmlFilename; - String replayFilename; - String resultsFilename; - int tps; - } - - public RobocodeMain(ISettingsManager properties, - IHostManager hostManager, - IWindowManager windowManager, - ISoundManager soundManager, - IBattleManager battleManager, - IRecordManager recordManager, - IVersionManager versionManager - ) { - setup = new Setup(); - this.properties = properties; - this.hostManager = hostManager; - this.windowManager = windowManager; - this.soundManager = soundManager; - this.battleManager = battleManager; - this.recordManager = recordManager; - this.versionManager = versionManager; - } - - public RobocodeMain(ISettingsManager properties, - IHostManager hostManager, - IWindowManager windowManager, - IBattleManager battleManager, - IRecordManager recordManager, - IVersionManager versionManager - ) { - this(properties, hostManager, windowManager, null, battleManager, recordManager, versionManager); - } - - public RobocodeMain(ISettingsManager properties, - IHostManager hostManager, - IBattleManager battleManager, - IRecordManager recordManager, - IVersionManager versionManager - ) { - this(properties, hostManager, null, battleManager, recordManager, versionManager); - } - - public void run() { - Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread thread, Throwable t) { - t.printStackTrace(); - } - }); - - try { - hostManager.initSecurity(); - - // Set the Look and Feel (LAF) - if (windowManager != null && windowManager.isGUIEnabled()) { - windowManager.init(); - } - properties.setOptionsBattleDesiredTPS(setup.tps); - - battleManager.addListener(battleObserver); - - if (windowManager != null && windowManager.isGUIEnabled()) { - if (!setup.minimize && setup.battleFilename == null && soundManager != null) { - soundManager.playThemeMusic(); - windowManager.showSplashScreen(); - } - windowManager.showRobocodeFrame(true, setup.minimize); - - // Play the intro battle if a battle file is not specified and this is the first time Robocode is being run - - if (setup.battleFilename == null && versionManager.isLastRunVersionChanged()) { - properties.saveProperties(); - windowManager.runIntroBattle(); - } - } - - final boolean enableCLIRecording = (setup.recordFilename != null || setup.recordXmlFilename != null); - - // Note: At this point the GUI should be opened (if enabled) before starting the battle from a battle file - if (setup.battleFilename != null) { - if (setup.replayFilename != null) { - System.err.println("You cannot run both a battle and replay a battle record in the same time."); - System.exit(8); - } - - setup.exitOnComplete = true; - - battleManager.setBattleFilename(setup.battleFilename); - if (new File(battleManager.getBattleFilename()).exists()) { - battleManager.startNewBattle(battleManager.loadBattleProperties(), false, enableCLIRecording); - } else { - System.err.println("The specified battle file '" + setup.battleFilename + "' was not found"); - System.exit(8); - } - } else if (setup.replayFilename != null) { - setup.exitOnComplete = true; - if (setup.replayFilename.toLowerCase().endsWith("xml.zip")) { - recordManager.loadRecord(setup.replayFilename, BattleRecordFormat.XML_ZIP); - } else { - recordManager.loadRecord(setup.replayFilename, BattleRecordFormat.BINARY_ZIP); - } - - if (new File(setup.replayFilename).exists()) { - battleManager.replay(); - } else { - System.err.println("The specified battle record file '" + setup.replayFilename + "' was not found"); - System.exit(8); - } - } - } catch (RuntimeException e) { - Logger.logError(e); - } - } - - public void loadSetup(String[] args) { - - final String nosecMessage = "Robocode is running without a security manager.\n" - + "Robots have full access to your system.\n" + "You should only run robots which you trust!"; - final String exMessage = "Robocode is running in experimental mode.\n" - + "Robots have access to their IRobotPeer interfaces.\n" + "You should only run robots which you trust!"; - - if (RobocodeProperties.isSecurityOff()) { - Logger.logWarning(nosecMessage); - } - if (System.getProperty("EXPERIMENTAL", "false").equals("true")) { - Logger.logWarning(exMessage); - } - - setup.tps = properties.getOptionsBattleDesiredTPS(); - - // Disable canonical file path cache under Windows as it causes trouble when returning - // paths with differently-capitalized file names. - if (System.getProperty("os.name").toLowerCase().startsWith("windows ")) { - System.setProperty("sun.io.useCanonCaches", "false"); - } - - // Initialize the system property so the AWT does not use headless mode meaning that the - // GUI (Awt and Swing) is enabled per default when running starting Robocode. - // It might be set to true later, if the -nodisplay option is set (in the setEnableGUI method). - // Read more about headless mode here: - // http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ - System.setProperty("java.awt.headless", "false"); - - for (int i = 0; i < args.length; i++) { - String currentArg = args[i]; - if (currentArg.equalsIgnoreCase("-cwd") && (i < args.length + 1)) { - changeDirectory(args[i + 1]); - i++; - } else if (currentArg.equalsIgnoreCase("-battle") && (i < args.length + 1)) { - setup.battleFilename = args[i + 1]; - i++; - } else if (currentArg.equalsIgnoreCase("-record") && (i < args.length + 1)) { - setup.recordFilename = args[i + 1]; - i++; - } else if (currentArg.equalsIgnoreCase("-recordXML") && (i < args.length + 1)) { - setup.recordXmlFilename = args[i + 1]; - i++; - } else if (currentArg.equalsIgnoreCase("-replay") && (i < args.length + 1)) { - setup.replayFilename = args[i + 1]; - i++; - } else if (currentArg.equalsIgnoreCase("-results") && (i < args.length + 1)) { - setup.resultsFilename = args[i + 1]; - i++; - } else if (currentArg.equalsIgnoreCase("-tps") && (i < args.length + 1)) { - setup.tps = Integer.parseInt(args[i + 1]); - if (setup.tps < 1) { - Logger.logError("tps must be > 0"); - System.exit(8); - } - i++; - } else if (currentArg.equalsIgnoreCase("-minimize")) { - setup.minimize = true; - } else if (currentArg.equalsIgnoreCase("-nodisplay")) { - if (windowManager != null) { - windowManager.setEnableGUI(false); - } - if (soundManager != null) { - soundManager.setEnableSound(false); - } - setup.tps = 10000; // set TPS to maximum - } else if (currentArg.equalsIgnoreCase("-nosound")) { - if (soundManager != null) { - soundManager.setEnableSound(false); - } - } else if (currentArg.equals("-?") || currentArg.equalsIgnoreCase("-help")) { - printUsage(); - System.exit(0); - } else { - Logger.logError("Not understood: " + currentArg); - printUsage(); - System.exit(8); - } - } - File robotsDir = FileUtil.getRobotsDir(); - - if (robotsDir == null) { - System.err.println("No valid robot directory is specified"); - System.exit(8); - } else if (!(robotsDir.exists() && robotsDir.isDirectory())) { - System.err.println('\'' + robotsDir.getAbsolutePath() + "' is not a valid robot directory"); - System.exit(8); - } - - // The Default Toolkit must be set as soon as we know if we are going to use headless mode or not. - // That is if the toolkit must be headless or not (GUI on/off). If we are running in headless mode - // from this point, a HeadlessException will be thrown if we access a AWT/Swing component. - // Read more about headless mode here: - // http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ - Toolkit.getDefaultToolkit(); - } - - private void changeDirectory(String robocodeDir) { - try { - FileUtil.setCwd(new File(robocodeDir)); - } catch (IOException e) { - System.err.println(robocodeDir + " is not a valid directory to start Robocode in."); - System.exit(8); - } - } - - private void printUsage() { - System.out.print( - "Usage: robocode [-?] [-help] [-cwd path] [-battle filename [-results filename]\n" - + " [-record filename] [-recordXML filename] [-replay filename]\n" - + " [-tps tps] [-minimize] [-nodisplay] [-nosound]\n\n" + "where options include:\n" - + " -? or -help Prints out the command line usage of Robocode\n" - + " -cwd Change the current working directory\n" - + " -battle Run the battle specified in a battle file\n" - + " -results Save results to the specified text file\n" - + " -record Record the battle into the specified file as binary\n" - + " -recordXML Record the battle into the specified file as XML\n" - + " -replay Replay the specified battle record\n" - + " -tps Set the TPS > 0 (Turns Per Second)\n" - + " -minimize Run minimized when Robocode starts\n" - + " -nodisplay Run with the display / GUI disabled\n" - + " -nosound Run with sound disabled\n\n" + "Java Properties include:\n" - + " -DWORKINGDIRECTORY= Set the working directory\n" - + " -DROBOTPATH= Set the robots directory (default is 'robots')\n" - + " -DBATTLEPATH= Set the battles directory (default is 'battles')\n" - + " -DNOSECURITY=true|false Enable/disable Robocode's security manager\n" - + " -Ddebug=true|false Enable/disable debugging used for preventing\n" - + " robot timeouts and skipped turns, and allows an\n" - + " an unlimited painting buffer when debugging robots\n" - + " -DlogMessages=true|false Log messages and warnings will be disabled\n" - + " -DlogErrors=true|false Log errors will be disabled\n" - + " -DEXPERIMENTAL=true|false Enable/disable access to peer in robot interfaces\n" - + " -DPARALLEL=true|false Enable/disable parallel processing of robots turns\n" - + " -DRANDOMSEED= Set seed for deterministic behavior of random\n" - + " numbers\n"); - } - - private void printResultsData(BattleCompletedEvent event) { - // Do not print out if no result file has been specified and the GUI is enabled - if ((setup.resultsFilename == null && (!setup.exitOnComplete || windowManager.isGUIEnabled()))) { - return; - } - - PrintStream out = null; - FileOutputStream fos = null; - - try { - if (setup.resultsFilename == null) { - out = Logger.realOut; - } else { - File f = new File(setup.resultsFilename); - - try { - fos = new FileOutputStream(f); - out = new PrintStream(fos); - } catch (IOException e) { - Logger.logError(e); - } - } - if (out != null) { - BattleResultsTableModel resultsTable = new BattleResultsTableModel(event.getSortedResults(), - event.getBattleRules().getNumRounds()); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - resultsTable.print(new PrintStream(baos)); - out.append(StringUtil.toBasicLatin(baos.toString())); - } - } finally { - FileUtil.cleanupStream(out); - FileUtil.cleanupStream(fos); - } - } - - private class BattleObserver extends BattleAdaptor { - boolean isReplay; - - @Override - public void onBattleStarted(BattleStartedEvent event) { - isReplay = event.isReplay(); - } - - @Override - public void onBattleCompleted(BattleCompletedEvent event) { - if (!isReplay) { - printResultsData(event); - } - if (setup.recordFilename != null) { - recordManager.saveRecord(setup.recordFilename, BattleRecordFormat.BINARY_ZIP, - new SerializableOptions(false)); - } - if (setup.recordXmlFilename != null) { - recordManager.saveRecord(setup.recordXmlFilename, BattleRecordFormat.XML, new SerializableOptions(false)); - } - } - - @Override - public void onBattleMessage(BattleMessageEvent event) { - if (System.getProperty("logMessages", "true").equalsIgnoreCase("true")) { - Logger.realOut.println(event.getMessage()); - } - } - - @Override - public void onBattleError(BattleErrorEvent event) { - if (System.getProperty("logErrors", "true").equalsIgnoreCase("true")) { - Logger.realErr.println(event.getError()); - } - } - } - - public void cleanup() { - final IWindowManager windowManager = Container.getComponent(IWindowManager.class); - - if (windowManager != null) { - windowManager.cleanup(); - } - Container.getComponent(IBattleManager.class).cleanup(); - Container.getComponent(IHostManager.class).cleanup(); - } - - public void initForRobocodeEngine(IBattleListener listener) { - final IWindowManager windowManager = Container.getComponent(IWindowManager.class); - - if (windowManager != null) { - windowManager.setSlave(true); - windowManager.setEnableGUI(false); - } - Container.getComponent(IHostManager.class).initSecurity(); - if (listener != null) { - Container.getComponent(IBattleManager.class).addListener(listener); - } - Container.getComponent(ICpuManager.class).getCpuConstant(); - Container.getComponent(IRepositoryManager.class).reload(versionManager.isLastRunVersionChanged()); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMainBase.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMainBase.java deleted file mode 100644 index 79e6db4..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMainBase.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.core; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import robocode.control.events.IBattleListener; - -import java.io.File; -import java.io.IOException; -import java.lang.Thread.UncaughtExceptionHandler; - - -/** - * There are entrypoints called with reflection from HiddenAccess in robocode.api module, - * they cross classloaders boundaries. - * - * @author Pavel Savara (original) - */ -public abstract class RobocodeMainBase implements Runnable { - public abstract void loadSetup(String[] args); - - public abstract void initForRobocodeEngine(IBattleListener listener); - - public abstract void cleanup(); - - // ----------- - // entrypoints called with reflection from HiddenAccess in robocode.api module - // ----------- - - public static void robocodeMain(Object args) { - // here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader - RobocodeMainBase main = Container.getComponent(RobocodeMainBase.class); - - main.loadSetup((String[]) args); - - // Make sure ALL uncaught exceptions are logged - Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { - public void uncaughtException(Thread t, Throwable e) { - Logger.logError("UncaughtException on thread " + t.getClass(), e); - } - }); - - ThreadGroup group = new ThreadGroup("Robocode thread group"); - - new Thread(group, main, "Robocode main thread").start(); - } - - public static void initContainer() { - // here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader - Container.init(); - } - - public static void cleanupForRobocodeEngine() { - // here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader - RobocodeMainBase main = Container.getComponent(RobocodeMainBase.class); - - main.cleanup(); - } - - public static void initContainerForRobocodeEngine(File robocodeHome, IBattleListener listener) { - try { - if (robocodeHome == null) { - robocodeHome = FileUtil.getCwd(); - } - FileUtil.setCwd(robocodeHome); - - File robotsDir = FileUtil.getRobotsDir(); - - if (robotsDir == null) { - throw new RuntimeException("No valid robot directory is specified"); - } else if (!(robotsDir.exists() && robotsDir.isDirectory())) { - throw new RuntimeException('\'' + robotsDir.getAbsolutePath() + "' is not a valid robot directory"); - } - - } catch (IOException e) { - System.err.println(e); - return; - } - - // here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader - RobocodeMainBase main = Container.getComponent(RobocodeMainBase.class); - - main.initForRobocodeEngine(listener); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/ICpuManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/ICpuManager.java deleted file mode 100644 index 03bc90d..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/ICpuManager.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -/** - * @author Pavel Savara (original) - */ -public interface ICpuManager { - long getCpuConstant(); - - void calculateCpuConstant(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IHostManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IHostManager.java deleted file mode 100644 index 8a80d46..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IHostManager.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.repository.RobotType; -import robocode.control.RobotSpecification; - -import java.io.PrintStream; - - -/** - * @author Pavel Savara (original) - */ -public interface IHostManager { - - void initSecurity(); - - long getRobotFilesystemQuota(); - - void resetThreadManager(); - - void addSafeThread(Thread safeThread); - - void removeSafeThread(Thread safeThread); - - PrintStream getRobotOutputStream(); - - Object createRobotProxy(RobotSpecification robotSpecification, RobotStatics statics, IRobotPeer peer); - - void cleanup(); - - String[] getReferencedClasses(IRobotItem robotItem); - - RobotType getRobotType(IRobotItem robotItem, boolean resolve, boolean message); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IRobotClassLoader.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IRobotClassLoader.java deleted file mode 100644 index 245b165..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/IRobotClassLoader.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import robocode.robotinterfaces.IBasicRobot; - - -/** - * @author Pavel Savara (original) - */ -public interface IRobotClassLoader { - Class loadRobotMainClass(boolean resolve) throws ClassNotFoundException; - IBasicRobot createRobotInstance() throws ClassNotFoundException, InstantiationException, IllegalAccessException; - String[] getReferencedClasses(); - void setRobotProxy(Object robotProxy); - void cleanup(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/RobotStatics.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/RobotStatics.java deleted file mode 100644 index 3f1367a..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/host/RobotStatics.java +++ /dev/null @@ -1,319 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.BattleRules; -import robocode.control.RobotSpecification; - -import java.io.Serializable; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public final class RobotStatics implements IRobotStatics, Serializable { - private static final long serialVersionUID = 1L; - - private final String robocodeVersion; - - private final boolean isJuniorRobot; - private final boolean isAdvancedRobot; - private final boolean isTeamRobot; - private final boolean isDroid; - private final boolean isSentryRobot; - - private final boolean isInteractiveRobot; - private final boolean isPaintRobot; - - private final boolean isTeamLeader; - - private final String name; - private final String shortName; - private final String veryShortName; - - private final String fullClassName; - private final String shortClassName; - - private final BattleRules battleRules; - - private final String[] teammates; - private final String teamName; - - private final int robotIndex; - private final int teamIndex; - - public RobotStatics(RobotSpecification robotSpecification, int duplicate, boolean isLeader, BattleRules rules, String teamName, List teamMembers, int robotIndex, int teamIndex) { - IRobotItem robotItem = ((IRobotItem) HiddenAccess.getFileSpecification(robotSpecification)); - - this.robotIndex = robotIndex; - this.teamIndex = teamIndex; - - shortClassName = robotItem.getShortClassName(); - fullClassName = robotItem.getFullClassName(); - if (duplicate >= 0) { - String countString = " (" + (duplicate + 1) + ')'; - - name = robotItem.getUniqueFullClassNameWithVersion() + countString; - shortName = robotItem.getUniqueShortClassNameWithVersion() + countString; - veryShortName = robotItem.getUniqueVeryShortClassNameWithVersion() + countString; - } else { - name = robotItem.getUniqueFullClassNameWithVersion(); - shortName = robotItem.getUniqueShortClassNameWithVersion(); - veryShortName = robotItem.getUniqueVeryShortClassNameWithVersion(); - } - this.robocodeVersion = robotItem.getRobocodeVersion(); - this.isJuniorRobot = robotItem.isJuniorRobot(); - this.isAdvancedRobot = robotItem.isAdvancedRobot(); - this.isTeamRobot = robotItem.isTeamRobot(); - this.isDroid = robotItem.isDroid(); - this.isSentryRobot = robotItem.isSentryRobot(); - this.isInteractiveRobot = robotItem.isInteractiveRobot(); - this.isPaintRobot = robotItem.isPaintRobot(); - this.isTeamLeader = isLeader; - this.battleRules = rules; - - if (teamMembers != null) { - List list = new ArrayList(); - - for (String mate : teamMembers) { - if (!name.equals(mate)) { - list.add(mate); - } - } - teammates = list.toArray(new String[] {}); - this.teamName = teamName; - } else { - teammates = null; - this.teamName = name; - } - } - - private RobotStatics(String robocodeVersion, boolean isJuniorRobot, boolean isInteractiveRobot, boolean isPaintRobot, boolean isAdvancedRobot, - boolean isTeamRobot, boolean isTeamLeader, boolean isDroid, boolean isSentryRobot, String name, String shortName, - String veryShortName, String fullClassName, String shortClassName, BattleRules battleRules, - String[] teammates, String teamName, int robotIndex, int teamIndex) { - - this.robocodeVersion = robocodeVersion; - this.isJuniorRobot = isJuniorRobot; - this.isAdvancedRobot = isAdvancedRobot; - this.isTeamRobot = isTeamRobot; - this.isDroid = isDroid; - this.isSentryRobot = isSentryRobot; - this.isInteractiveRobot = isInteractiveRobot; - this.isPaintRobot = isPaintRobot; - this.isTeamLeader = isTeamLeader; - this.name = name; - this.shortName = shortName; - this.veryShortName = veryShortName; - this.fullClassName = fullClassName; - this.shortClassName = shortClassName; - this.battleRules = battleRules; - this.teammates = teammates; - this.teamName = teamName; - this.robotIndex = robotIndex; - this.teamIndex = teamIndex; - } - - public String getRobocodeVersion() { - return robocodeVersion; - } - - public String getAnnonymousName() { - return "#" + robotIndex; - } - - public boolean isJuniorRobot() { - return isJuniorRobot; - } - - public boolean isAdvancedRobot() { - return isAdvancedRobot; - } - - public boolean isTeamRobot() { - return isTeamRobot; - } - - public boolean isDroid() { - return isDroid; - } - - public boolean isSentryRobot() { - return isSentryRobot; - } - - public boolean isInteractiveRobot() { - return isInteractiveRobot; - } - - public boolean isPaintRobot() { - return isPaintRobot; - } - - public boolean isTeamLeader() { - return isTeamLeader; - } - - public String getName() { - return name; - } - - public String getShortName() { - return shortName; - } - - public String getVeryShortName() { - return veryShortName; - } - - public String getFullClassName() { - return fullClassName; - } - - public String getShortClassName() { - return shortClassName; - } - - public BattleRules getBattleRules() { - return battleRules; - } - - public String[] getTeammates() { - return teammates == null ? null : teammates.clone(); - } - - public String getTeamName() { - return teamName; - } - - public int getRobotIndex() { - return robotIndex; - } - - public int getTeamIndex() { - return teamIndex; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - RobotStatics obj = (RobotStatics) object; - int size = RbSerializer.SIZEOF_TYPEINFO + serializer.sizeOf(obj.robocodeVersion) - + RbSerializer.SIZEOF_BOOL * 9 + serializer.sizeOf(obj.name) + serializer.sizeOf(obj.shortName) - + serializer.sizeOf(obj.veryShortName) + serializer.sizeOf(obj.fullClassName) - + serializer.sizeOf(obj.shortClassName) + RbSerializer.SIZEOF_INT * 6 + RbSerializer.SIZEOF_DOUBLE - + RbSerializer.SIZEOF_LONG; - - if (obj.teammates != null) { - for (String mate : obj.teammates) { - size += serializer.sizeOf(mate); - } - } - size += RbSerializer.SIZEOF_INT; - size += serializer.sizeOf(obj.teamName); - - return size; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - RobotStatics obj = (RobotStatics) object; - - serializer.serialize(buffer, obj.robocodeVersion); - serializer.serialize(buffer, obj.isJuniorRobot); - serializer.serialize(buffer, obj.isInteractiveRobot); - serializer.serialize(buffer, obj.isPaintRobot); - serializer.serialize(buffer, obj.isAdvancedRobot); - serializer.serialize(buffer, obj.isTeamRobot); - serializer.serialize(buffer, obj.isTeamLeader); - serializer.serialize(buffer, obj.isDroid); - serializer.serialize(buffer, obj.isSentryRobot); - serializer.serialize(buffer, obj.name); - serializer.serialize(buffer, obj.shortName); - serializer.serialize(buffer, obj.veryShortName); - serializer.serialize(buffer, obj.fullClassName); - serializer.serialize(buffer, obj.shortClassName); - serializer.serialize(buffer, obj.battleRules.getBattlefieldWidth()); - serializer.serialize(buffer, obj.battleRules.getBattlefieldHeight()); - serializer.serialize(buffer, obj.battleRules.getNumRounds()); - serializer.serialize(buffer, obj.battleRules.getGunCoolingRate()); - serializer.serialize(buffer, obj.battleRules.getInactivityTime()); - serializer.serialize(buffer, obj.battleRules.getHideEnemyNames()); - serializer.serialize(buffer, obj.battleRules.getSentryBorderSize()); - if (obj.teammates != null) { - for (String mate : obj.teammates) { - serializer.serialize(buffer, mate); - } - } - buffer.putInt(-1); - serializer.serialize(buffer, obj.teamName); - serializer.serialize(buffer, obj.robotIndex); - serializer.serialize(buffer, obj.teamIndex); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - - String robocodeVersion = serializer.deserializeString(buffer); - boolean isJuniorRobot = serializer.deserializeBoolean(buffer); - boolean isInteractiveRobot = serializer.deserializeBoolean(buffer); - boolean isPaintRobot = serializer.deserializeBoolean(buffer); - boolean isAdvancedRobot = serializer.deserializeBoolean(buffer); - boolean isTeamRobot = serializer.deserializeBoolean(buffer); - boolean isTeamLeader = serializer.deserializeBoolean(buffer); - boolean isDroid = serializer.deserializeBoolean(buffer); - boolean isSentryRobot = serializer.deserializeBoolean(buffer); - String name = serializer.deserializeString(buffer); - String shortName = serializer.deserializeString(buffer); - String veryShortName = serializer.deserializeString(buffer); - String fullClassName = serializer.deserializeString(buffer); - String shortClassName = serializer.deserializeString(buffer); - - BattleRules battleRules = HiddenAccess.createRules(serializer.deserializeInt(buffer), // battleFieldWidth - serializer.deserializeInt(buffer), // battleFieldHeight - serializer.deserializeInt(buffer), // numOfRounds - serializer.deserializeDouble(buffer), // gunCoolingRate - serializer.deserializeLong(buffer), // inactivityTime - serializer.deserializeBoolean(buffer), // hideEnemyNames - serializer.deserializeInt(buffer)); // sentryBorderSize - - List teammates = new ArrayList(); - Object item = serializer.deserializeString(buffer); - - if (item == null) { - teammates = null; - } - while (item != null) { - if (item instanceof String) { - teammates.add((String) item); - } - item = serializer.deserializeString(buffer); - } - - String teamName = serializer.deserializeString(buffer); - int index = serializer.deserializeInt(buffer); - int contestantIndex = serializer.deserializeInt(buffer); - - return new RobotStatics(robocodeVersion, isJuniorRobot, isInteractiveRobot, isPaintRobot, isAdvancedRobot, - isTeamRobot, isTeamLeader, isDroid, isSentryRobot, name, shortName, veryShortName, fullClassName, - shortClassName, battleRules, teammates.toArray(new String[teammates.size()]), teamName, index, - contestantIndex); - } - } - -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/JarJar.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/JarJar.java deleted file mode 100644 index 720dc88..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/JarJar.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.io; - - -/** - * @author Pavel Savara (original) - */ -public class JarJar { - public final static char SEPARATOR_CHAR = '^'; - public final static String SEPARATOR = SEPARATOR_CHAR + "/"; -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/URLJarCollector.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/URLJarCollector.java deleted file mode 100644 index 89727db..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/io/URLJarCollector.java +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.io; - - -import java.net.URLConnection; -import java.net.URL; -import java.net.URLDecoder; -import java.lang.reflect.Field; -import java.util.*; -import java.util.jar.JarFile; -import java.io.File; -import java.io.IOException; - - -/** - * This ugly class is helping with closing of robot .jar files when used with URL, URLConnection and useCaches=true - * It is designed to close JarFiles opened and cached in SUN's JarFileFactory. - * If we are not on SUN's JVM, we fallback to useCaches=false, to not lock the files. - * Collection is now called after reposiotry refresh and after battle ended. - * Collection is disabled/posponed during running battle. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class URLJarCollector { - - private static HashMap fileCache; - private static HashMap urlCache; - private static Field jarFileURL; - private static final boolean sunJVM; - private static boolean enabled; - private static Set urlsToClean = new HashSet(); - - static { - boolean localSunJVM = false; - - try { - final Class jarFactory = ClassLoader.getSystemClassLoader().loadClass( - "sun.net.www.protocol.jar.JarFileFactory"); - final Field fileCacheF = jarFactory.getDeclaredField("fileCache"); - - fileCacheF.setAccessible(true); - fileCache = (HashMap) fileCacheF.get(null); - - final Field urlCacheF = jarFactory.getDeclaredField("urlCache"); - - urlCacheF.setAccessible(true); - urlCache = (HashMap) urlCacheF.get(null); - - final Class jarURLConnection = ClassLoader.getSystemClassLoader().loadClass( - "sun.net.www.protocol.jar.JarURLConnection"); - - jarFileURL = jarURLConnection.getDeclaredField("jarFileURL"); - jarFileURL.setAccessible(true); - - localSunJVM = true; - } catch (ClassNotFoundException ignore) { - Logger.logError(ignore); - } catch (NoSuchFieldException ignore) { - Logger.logError(ignore); - } catch (IllegalAccessException ignore) { - Logger.logError(ignore); - } - sunJVM = localSunJVM; - } - - public static synchronized URLConnection openConnection(URL url) throws IOException { - // Logger.logMessage("Open connection to URL: " + url); - final URLConnection urlConnection = url.openConnection(); - - if (sunJVM) { - registerConnection(urlConnection); - urlConnection.setUseCaches(true); - } else { - urlConnection.setUseCaches(false); - } - return urlConnection; - } - - public static synchronized void enableGc(boolean enabled) { - URLJarCollector.enabled = enabled; - } - - public static synchronized void gc() { - if (sunJVM) { - // Close all JarURLConnections if garbage collection is enabled - if (enabled) { - synchronized (urlsToClean) { - for (URL url : urlsToClean) { - closeJarURLConnection(url); - } - urlsToClean.clear(); - } - } - - // Bug fix [2867326] - Lockup on start if too many bots in robots dir (cont'd). - - // Remove all cache entries to temporary jar cache files created - // for connections using the jarjar protocol that get stuck up. - for (Iterator it = fileCache.keySet().iterator(); it.hasNext();) { - Object urlJarFile = it.next(); - - final JarFile jarFile = (JarFile) fileCache.get(urlJarFile); - - String filename = jarFile.getName(); - - filename = filename.substring(filename.lastIndexOf(File.separatorChar) + 1).toLowerCase(); - - if (filename.startsWith("jar_cache")) { - it.remove(); - synchronized (urlCache) { - urlCache.remove(jarFile); - } - } - } - } - } - - private static void registerConnection(URLConnection conn) { - if (conn != null) { - final String cl = conn.getClass().getName(); - - if (cl.equals("sun.net.www.protocol.jar.JarURLConnection")) { - try { - final URL url = (URL) jarFileURL.get(conn); - - if (!urlsToClean.contains(url)) { - synchronized (urlsToClean) { - urlsToClean.add(url); - } - } - } catch (IllegalAccessException ignore) {} - } - } - } - - // Added due to bug fix [2867326] - Lockup on start if too many bots in robots dir (cont'd). - public synchronized static void closeJarURLConnection(URL url) { - if (url != null) { - for (Iterator it = fileCache.keySet().iterator(); it.hasNext();) { - Object urlJarFile = it.next(); - - final JarFile jarFile = (JarFile) fileCache.get(urlJarFile); - - String urlPath = url.getPath(); - - try { - urlPath = URLDecoder.decode(urlPath, "UTF-8"); - } catch (java.io.UnsupportedEncodingException ignore) {} - - File urlFile = new File(urlPath); - - String jarFileName = jarFile.getName(); - String urlFileName = urlFile.getPath(); - - if (urlFileName.equals(jarFileName)) { - it.remove(); - synchronized (urlCache) { - urlCache.remove(jarFile); - } - try { - jarFile.close(); - } catch (IOException e) { - Logger.logError(e); - } - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BadBehavior.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BadBehavior.java deleted file mode 100644 index 502bcb8..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BadBehavior.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -/** - * @author Flemming N. Larsen (original) - */ -public enum BadBehavior { - CANNOT_START, - SKIPPED_TOO_MANY_TURNS, - UNSTOPPABLE, - SECURITY_VIOLATION -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletCommand.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletCommand.java deleted file mode 100644 index 2a0cd54..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletCommand.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; - -import java.io.Serializable; -import java.nio.ByteBuffer; - - -/** - * @author Pavel Savara (original) - */ -public class BulletCommand implements Serializable { - private static final long serialVersionUID = 1L; - - public BulletCommand(double power, boolean fireAssistValid, double fireAssistAngle, int bulletId) { - this.fireAssistValid = fireAssistValid; - this.fireAssistAngle = fireAssistAngle; - this.bulletId = bulletId; - this.power = power; - } - - private final double power; - private final boolean fireAssistValid; - private final double fireAssistAngle; - private final int bulletId; - - public boolean isFireAssistValid() { - return fireAssistValid; - } - - public int getBulletId() { - return bulletId; - } - - public double getPower() { - return power; - } - - public double getFireAssistAngle() { - return fireAssistAngle; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_DOUBLE + RbSerializer.SIZEOF_BOOL - + RbSerializer.SIZEOF_DOUBLE + RbSerializer.SIZEOF_INT; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - BulletCommand obj = (BulletCommand) object; - - serializer.serialize(buffer, obj.power); - serializer.serialize(buffer, obj.fireAssistValid); - serializer.serialize(buffer, obj.fireAssistAngle); - serializer.serialize(buffer, obj.bulletId); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - double power = buffer.getDouble(); - boolean fireAssistValid = serializer.deserializeBoolean(buffer); - double fireAssistAngle = buffer.getDouble(); - int bulletId = buffer.getInt(); - - return new BulletCommand(power, fireAssistValid, fireAssistAngle, bulletId); - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletStatus.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletStatus.java deleted file mode 100644 index 7fef56f..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/BulletStatus.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; - -import java.io.Serializable; -import java.nio.ByteBuffer; - - -/** - * @author Pavel Savara (original) - */ -public class BulletStatus implements Serializable { - private static final long serialVersionUID = 1L; - - public BulletStatus(int bulletId, double x, double y, String victimName, boolean isActive) { - this.bulletId = bulletId; - this.x = x; - this.y = y; - this.isActive = isActive; - this.victimName = victimName; - } - - public final int bulletId; - public final String victimName; - public final boolean isActive; - public final double x; - public final double y; - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - BulletStatus obj = (BulletStatus) object; - - return RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_INT + serializer.sizeOf(obj.victimName) - + RbSerializer.SIZEOF_BOOL + 2 * RbSerializer.SIZEOF_DOUBLE; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - BulletStatus obj = (BulletStatus) object; - - serializer.serialize(buffer, obj.bulletId); - serializer.serialize(buffer, obj.victimName); - serializer.serialize(buffer, obj.isActive); - serializer.serialize(buffer, obj.x); - serializer.serialize(buffer, obj.y); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - int bulletId = buffer.getInt(); - String victimName = serializer.deserializeString(buffer); - boolean isActive = serializer.deserializeBoolean(buffer); - double x = buffer.getDouble(); - double y = buffer.getDouble(); - - return new BulletStatus(bulletId, x, y, victimName, isActive); - } - } - -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/DebugProperty.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/DebugProperty.java deleted file mode 100644 index 62ff930..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/DebugProperty.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -import net.sf.robocode.serialization.*; -import robocode.control.snapshot.IDebugProperty; - -import java.io.IOException; -import java.io.Serializable; -import java.nio.ByteBuffer; - - -/** - * @author Pavel Savara (original) - */ -public class DebugProperty implements Serializable, IXmlSerializable, IDebugProperty { - private static final long serialVersionUID = 1L; - - public DebugProperty() {} - - public DebugProperty(String key, String value) { - this.setKey(key); - this.setValue(value); - } - - private String key; - private String value; - - public void writeXml(XmlWriter writer, SerializableOptions options) throws IOException { - writer.startElement("debug"); { - writer.writeAttribute("key", getKey()); - writer.writeAttribute("value", getValue()); - } - writer.endElement(); - } - - public XmlReader.Element readXml(XmlReader reader) { - return reader.expect("debug", new XmlReader.Element() { - public IXmlSerializable read(XmlReader reader) { - final DebugProperty snapshot = new DebugProperty(); - - reader.expect("key", new XmlReader.Attribute() { - public void read(String value) { - snapshot.setKey(value); - } - }); - - reader.expect("value", new XmlReader.Attribute() { - public void read(String value) { - snapshot.setValue(value); - } - }); - - return snapshot; - } - }); - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - DebugProperty obj = (DebugProperty) object; - - return RbSerializer.SIZEOF_TYPEINFO + serializer.sizeOf(obj.key) + serializer.sizeOf(obj.value); - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - DebugProperty obj = (DebugProperty) object; - - serializer.serialize(buffer, obj.key); - serializer.serialize(buffer, obj.value); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - String key = serializer.deserializeString(buffer); - String value = serializer.deserializeString(buffer); - - return new DebugProperty(key, value); - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecCommands.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecCommands.java deleted file mode 100644 index bc089d7..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecCommands.java +++ /dev/null @@ -1,428 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.Rules; - -import java.io.Serializable; -import static java.lang.Math.abs; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public final class ExecCommands implements Serializable { - private static final long serialVersionUID = 1L; - public static final int defaultBodyColor = 0xFF29298C; - public static final int defaultGunColor = 0xFF29298C; - public static final int defaultRadarColor = 0xFF29298C; - public static final int defaultScanColor = 0xFF0000FF; - public static final int defaultBulletColor = 0xFFFFFFFF; - - private double bodyTurnRemaining; - private double radarTurnRemaining; - private double gunTurnRemaining; - private double distanceRemaining; - - private boolean isAdjustGunForBodyTurn; - private boolean isAdjustRadarForGunTurn; - private boolean isAdjustRadarForBodyTurn; - private boolean isAdjustRadarForBodyTurnSet; - - private int bodyColor = defaultBodyColor; - private int gunColor = defaultGunColor; - private int radarColor = defaultRadarColor; - private int scanColor = defaultScanColor; - private int bulletColor = defaultBulletColor; - private double maxTurnRate; - private double maxVelocity; - - private boolean moved; - private boolean scan; - private boolean isIORobot; - private boolean isTryingToPaint; - private String outputText; - private List bullets = new ArrayList(); - private List teamMessages = new ArrayList(); - private List debugProperties = new ArrayList(); - private Object graphicsCalls; - - public ExecCommands() { - setMaxVelocity(Double.MAX_VALUE); - setMaxTurnRate(Double.MAX_VALUE); - } - - public ExecCommands(ExecCommands origin, boolean fromRobot) { - bodyTurnRemaining = origin.bodyTurnRemaining; - radarTurnRemaining = origin.radarTurnRemaining; - gunTurnRemaining = origin.gunTurnRemaining; - distanceRemaining = origin.distanceRemaining; - isAdjustGunForBodyTurn = origin.isAdjustGunForBodyTurn; - isAdjustRadarForGunTurn = origin.isAdjustRadarForGunTurn; - isAdjustRadarForBodyTurn = origin.isAdjustRadarForBodyTurn; - isAdjustRadarForBodyTurnSet = origin.isAdjustRadarForBodyTurnSet; - maxTurnRate = origin.maxTurnRate; - maxVelocity = origin.maxVelocity; - copyColors(origin); - if (fromRobot) { - debugProperties = origin.debugProperties; - bullets = origin.bullets; - scan = origin.scan; - moved = origin.moved; - graphicsCalls = origin.graphicsCalls; - outputText = origin.outputText; - teamMessages = origin.teamMessages; - isTryingToPaint = origin.isTryingToPaint; - } - } - - public void copyColors(ExecCommands origin) { - if (origin != null) { - bodyColor = origin.bodyColor; - gunColor = origin.gunColor; - radarColor = origin.radarColor; - bulletColor = origin.bulletColor; - scanColor = origin.scanColor; - } - } - - public int getBodyColor() { - return bodyColor; - } - - public int getRadarColor() { - return radarColor; - } - - public int getGunColor() { - return gunColor; - } - - public int getBulletColor() { - return bulletColor; - } - - public int getScanColor() { - return scanColor; - } - - public void setBodyColor(int color) { - bodyColor = color; - } - - public void setRadarColor(int color) { - radarColor = color; - } - - public void setGunColor(int color) { - gunColor = color; - } - - public void setBulletColor(int color) { - bulletColor = color; - } - - public void setScanColor(int color) { - scanColor = color; - } - - public double getBodyTurnRemaining() { - return bodyTurnRemaining; - } - - public void setBodyTurnRemaining(double bodyTurnRemaining) { - this.bodyTurnRemaining = bodyTurnRemaining; - } - - public double getRadarTurnRemaining() { - return radarTurnRemaining; - } - - public void setRadarTurnRemaining(double radarTurnRemaining) { - this.radarTurnRemaining = radarTurnRemaining; - } - - public double getGunTurnRemaining() { - return gunTurnRemaining; - } - - public void setGunTurnRemaining(double gunTurnRemaining) { - this.gunTurnRemaining = gunTurnRemaining; - } - - public double getDistanceRemaining() { - return distanceRemaining; - } - - public void setDistanceRemaining(double distanceRemaining) { - this.distanceRemaining = distanceRemaining; - } - - public boolean isAdjustGunForBodyTurn() { - return isAdjustGunForBodyTurn; - } - - public void setAdjustGunForBodyTurn(boolean adjustGunForBodyTurn) { - isAdjustGunForBodyTurn = adjustGunForBodyTurn; - } - - public boolean isAdjustRadarForGunTurn() { - return isAdjustRadarForGunTurn; - } - - public void setAdjustRadarForGunTurn(boolean adjustRadarForGunTurn) { - isAdjustRadarForGunTurn = adjustRadarForGunTurn; - } - - public boolean isAdjustRadarForBodyTurn() { - return isAdjustRadarForBodyTurn; - } - - public void setAdjustRadarForBodyTurn(boolean adjustRadarForBodyTurn) { - isAdjustRadarForBodyTurn = adjustRadarForBodyTurn; - } - - public boolean isAdjustRadarForBodyTurnSet() { - return isAdjustRadarForBodyTurnSet; - } - - public void setAdjustRadarForBodyTurnSet(boolean adjustRadarForBodyTurnSet) { - isAdjustRadarForBodyTurnSet = adjustRadarForBodyTurnSet; - } - - public double getMaxTurnRate() { - return maxTurnRate; - } - - public void setMaxTurnRate(double maxTurnRate) { - this.maxTurnRate = Math.min(abs(maxTurnRate), Rules.MAX_TURN_RATE_RADIANS); - } - - public double getMaxVelocity() { - return maxVelocity; - } - - public void setMaxVelocity(double maxVelocity) { - this.maxVelocity = Math.min(abs(maxVelocity), Rules.MAX_VELOCITY); - } - - public boolean isMoved() { - return moved; - } - - public void setMoved(boolean moved) { - this.moved = moved; - } - - public boolean isScan() { - return scan; - } - - public void setScan(boolean scan) { - this.scan = scan; - } - - public List getBullets() { - return bullets; - } - - public Object getGraphicsCalls() { - return graphicsCalls; - } - - public List getDebugProperties() { - return debugProperties; - } - - public void setGraphicsCalls(Object graphicsCalls) { - this.graphicsCalls = graphicsCalls; - } - - public String getOutputText() { - final String out = outputText; - - outputText = ""; - if (out == null) { - return ""; - } - return out; - } - - public void setOutputText(String out) { - outputText = out; - } - - public List getTeamMessages() { - return teamMessages; - } - - public boolean isIORobot() { - return isIORobot; - } - - public void setIORobot() { - isIORobot = true; - } - - public void setDebugProperty(String key, String value) { - debugProperties.add(new DebugProperty(key, value)); - } - - public boolean isTryingToPaint() { - return isTryingToPaint; - } - - public void setTryingToPaint(boolean tryingToPaint) { - isTryingToPaint = tryingToPaint; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - ExecCommands obj = (ExecCommands) object; - int size = RbSerializer.SIZEOF_TYPEINFO + 4 * RbSerializer.SIZEOF_DOUBLE; - - size += 4 * RbSerializer.SIZEOF_BOOL; - size += 5 * RbSerializer.SIZEOF_INT; - size += 2 * RbSerializer.SIZEOF_DOUBLE; - size += 4 * RbSerializer.SIZEOF_BOOL; - size += serializer.sizeOf(obj.outputText); - - size += serializer.sizeOf((byte[]) obj.graphicsCalls); - - // bullets - size += obj.bullets.size() * serializer.sizeOf(RbSerializer.BulletCommand_TYPE, null); - size += 1; - - // messages - for (TeamMessage m : obj.teamMessages) { - size += serializer.sizeOf(RbSerializer.TeamMessage_TYPE, m); - } - size += 1; - - // properties - for (DebugProperty d : obj.debugProperties) { - size += serializer.sizeOf(RbSerializer.DebugProperty_TYPE, d); - } - size += 1; - - return size; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - ExecCommands obj = (ExecCommands) object; - - serializer.serialize(buffer, obj.bodyTurnRemaining); - serializer.serialize(buffer, obj.radarTurnRemaining); - serializer.serialize(buffer, obj.gunTurnRemaining); - serializer.serialize(buffer, obj.distanceRemaining); - - serializer.serialize(buffer, obj.isAdjustGunForBodyTurn); - serializer.serialize(buffer, obj.isAdjustRadarForGunTurn); - serializer.serialize(buffer, obj.isAdjustRadarForBodyTurn); - serializer.serialize(buffer, obj.isAdjustRadarForBodyTurnSet); - - serializer.serialize(buffer, obj.bodyColor); - serializer.serialize(buffer, obj.gunColor); - serializer.serialize(buffer, obj.radarColor); - serializer.serialize(buffer, obj.scanColor); - serializer.serialize(buffer, obj.bulletColor); - - serializer.serialize(buffer, obj.maxTurnRate); - serializer.serialize(buffer, obj.maxVelocity); - - serializer.serialize(buffer, obj.moved); - serializer.serialize(buffer, obj.scan); - serializer.serialize(buffer, obj.isIORobot); - serializer.serialize(buffer, obj.isTryingToPaint); - - serializer.serialize(buffer, obj.outputText); - - serializer.serialize(buffer, (byte[]) obj.graphicsCalls); - - for (BulletCommand bullet : obj.bullets) { - serializer.serialize(buffer, RbSerializer.BulletCommand_TYPE, bullet); - } - buffer.put(RbSerializer.TERMINATOR_TYPE); - for (TeamMessage message : obj.teamMessages) { - serializer.serialize(buffer, RbSerializer.TeamMessage_TYPE, message); - } - buffer.put(RbSerializer.TERMINATOR_TYPE); - for (DebugProperty prop : obj.debugProperties) { - serializer.serialize(buffer, RbSerializer.DebugProperty_TYPE, prop); - } - buffer.put(RbSerializer.TERMINATOR_TYPE); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - ExecCommands res = new ExecCommands(); - - res.bodyTurnRemaining = buffer.getDouble(); - res.radarTurnRemaining = buffer.getDouble(); - res.gunTurnRemaining = buffer.getDouble(); - res.distanceRemaining = buffer.getDouble(); - - res.isAdjustGunForBodyTurn = serializer.deserializeBoolean(buffer); - res.isAdjustRadarForGunTurn = serializer.deserializeBoolean(buffer); - res.isAdjustRadarForBodyTurn = serializer.deserializeBoolean(buffer); - res.isAdjustRadarForBodyTurnSet = serializer.deserializeBoolean(buffer); - - res.bodyColor = buffer.getInt(); - res.gunColor = buffer.getInt(); - res.radarColor = buffer.getInt(); - res.scanColor = buffer.getInt(); - res.bulletColor = buffer.getInt(); - - res.maxTurnRate = buffer.getDouble(); - res.maxVelocity = buffer.getDouble(); - - res.moved = serializer.deserializeBoolean(buffer); - res.scan = serializer.deserializeBoolean(buffer); - res.isIORobot = serializer.deserializeBoolean(buffer); - res.isTryingToPaint = serializer.deserializeBoolean(buffer); - - res.outputText = serializer.deserializeString(buffer); - - res.graphicsCalls = serializer.deserializeBytes(buffer); - - Object item = serializer.deserializeAny(buffer); - - while (item != null) { - if (item instanceof BulletCommand) { - res.bullets.add((BulletCommand) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) { - if (item instanceof TeamMessage) { - res.teamMessages.add((TeamMessage) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) { - if (item instanceof DebugProperty) { - res.debugProperties.add((DebugProperty) item); - } - item = serializer.deserializeAny(buffer); - } - return res; - } - } -} - diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecResults.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecResults.java deleted file mode 100644 index c24330c..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/ExecResults.java +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; -import robocode.Event; -import robocode.RobotStatus; - -import java.io.Serializable; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public final class ExecResults implements Serializable { - private static final long serialVersionUID = 1L; - - private ExecCommands commands; - private RobotStatus status; - private List events; - private List teamMessages; - private List bulletUpdates; - private boolean halt; - private boolean shouldWait; - private boolean paintEnabled; - - public ExecResults(ExecCommands commands, RobotStatus status, List events, List teamMessages, List bulletUpdates, boolean halt, boolean shouldWait, boolean paintEnabled) { - this.commands = commands; - this.status = status; - this.events = events; - this.teamMessages = teamMessages; - this.bulletUpdates = bulletUpdates; - this.halt = halt; - this.shouldWait = shouldWait; - this.paintEnabled = paintEnabled; - } - - private ExecResults() {} - - public ExecCommands getCommands() { - return commands; - } - - public RobotStatus getStatus() { - return status; - } - - public List getEvents() { - return events; - } - - public List getTeamMessages() { - return teamMessages; - } - - public List getBulletUpdates() { - return bulletUpdates; - } - - public boolean isHalt() { - return halt; - } - - public boolean isShouldWait() { - return shouldWait; - } - - public boolean isPaintEnabled() { - return paintEnabled; - } - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - ExecResults obj = (ExecResults) object; - int size = RbSerializer.SIZEOF_TYPEINFO + 3 * RbSerializer.SIZEOF_BOOL; - - size += serializer.sizeOf(RbSerializer.ExecCommands_TYPE, obj.commands); - size += serializer.sizeOf(RbSerializer.RobotStatus_TYPE, obj.status); - - // events - for (Event event : obj.events) { - size += serializer.sizeOf(event); - } - size += 1; - - // messages - for (TeamMessage m : obj.teamMessages) { - size += serializer.sizeOf(RbSerializer.TeamMessage_TYPE, m); - } - size += 1; - - // bullets - for (BulletStatus b : obj.bulletUpdates) { - size += serializer.sizeOf(RbSerializer.BulletStatus_TYPE, b); - } - size += 1; - - return size; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - ExecResults obj = (ExecResults) object; - - serializer.serialize(buffer, obj.halt); - serializer.serialize(buffer, obj.shouldWait); - serializer.serialize(buffer, obj.paintEnabled); - - serializer.serialize(buffer, RbSerializer.ExecCommands_TYPE, obj.commands); - serializer.serialize(buffer, RbSerializer.RobotStatus_TYPE, obj.status); - - for (Event event : obj.events) { - serializer.serialize(buffer, event); - } - buffer.put(RbSerializer.TERMINATOR_TYPE); - for (TeamMessage message : obj.teamMessages) { - serializer.serialize(buffer, RbSerializer.TeamMessage_TYPE, message); - } - buffer.put(RbSerializer.TERMINATOR_TYPE); - for (BulletStatus bulletStatus : obj.bulletUpdates) { - serializer.serialize(buffer, RbSerializer.BulletStatus_TYPE, bulletStatus); - } - buffer.put(RbSerializer.TERMINATOR_TYPE); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - ExecResults res = new ExecResults(); - - res.halt = serializer.deserializeBoolean(buffer); - res.shouldWait = serializer.deserializeBoolean(buffer); - res.paintEnabled = serializer.deserializeBoolean(buffer); - - res.commands = (ExecCommands) serializer.deserializeAny(buffer); - res.status = (RobotStatus) serializer.deserializeAny(buffer); - - res.events = new ArrayList(); - res.teamMessages = new ArrayList(); - res.bulletUpdates = new ArrayList(); - Object item = serializer.deserializeAny(buffer); - - while (item != null) { - if (item instanceof Event) { - res.events.add((Event) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) { - if (item instanceof TeamMessage) { - res.teamMessages.add((TeamMessage) item); - } - item = serializer.deserializeAny(buffer); - } - item = serializer.deserializeAny(buffer); - while (item != null) { - if (item instanceof BulletStatus) { - res.bulletUpdates.add((BulletStatus) item); - } - item = serializer.deserializeAny(buffer); - } - return res; - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/IRobotPeer.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/IRobotPeer.java deleted file mode 100644 index faf5f63..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/IRobotPeer.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -import java.io.IOException; -import java.nio.ByteBuffer; - - -/** - * @author Pavel Savara (original) - */ -public interface IRobotPeer { - - void drainEnergy(); - - void punishBadBehavior(BadBehavior badBehavior); - - void setRunning(boolean value); - - boolean isRunning(); - - ExecResults waitForBattleEndImpl(ExecCommands newCommands); - - ExecResults executeImpl(ExecCommands newCommands); - - void setupBuffer(ByteBuffer bidirectionalBuffer); // NO_UCD (unused code - used by the .NET plug-in) - - void executeImplSerial() throws IOException; // NO_UCD (unused code - used by the .NET plug-in) - - void waitForBattleEndImplSerial() throws IOException; // NO_UCD (unused code - used by the .NET plug-in) - - void setupThread(); // NO_UCD (unused code - used by the .NET plug-in) -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/TeamMessage.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/TeamMessage.java deleted file mode 100644 index 5db0dc1..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/peer/TeamMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.peer; - - -import net.sf.robocode.serialization.ISerializableHelper; -import net.sf.robocode.serialization.RbSerializer; - -import java.io.Serializable; -import java.nio.ByteBuffer; - - -/** - * @author Pavel Savara (original) - */ -public class TeamMessage implements Serializable { - private static final long serialVersionUID = 1L; - - public TeamMessage(String sender, String recipient, byte[] message) { - this.sender = sender; - this.recipient = recipient; - this.message = message; - - } - - public final String sender; - public final String recipient; - public final byte[] message; - - static ISerializableHelper createHiddenSerializer() { - return new SerializableHelper(); - } - - private static class SerializableHelper implements ISerializableHelper { - public int sizeOf(RbSerializer serializer, Object object) { - TeamMessage obj = (TeamMessage) object; - final int s = serializer.sizeOf(obj.sender); - final int r = serializer.sizeOf(obj.recipient); - final int m = serializer.sizeOf(obj.message); - - return RbSerializer.SIZEOF_TYPEINFO + s + r + m; - } - - public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { - TeamMessage obj = (TeamMessage) object; - - serializer.serialize(buffer, obj.sender); - serializer.serialize(buffer, obj.recipient); - serializer.serialize(buffer, obj.message); - } - - public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { - String sender = serializer.deserializeString(buffer); - String recipient = serializer.deserializeString(buffer); - byte[] message = serializer.deserializeBytes(buffer); - - return new TeamMessage(sender, recipient, message); - } - } - -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/BattleRecordFormat.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/BattleRecordFormat.java deleted file mode 100644 index c4b825d..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/BattleRecordFormat.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.recording; - - -/** - * @author Flemming N. Larsen (original) - */ -public enum BattleRecordFormat { - BINARY, - BINARY_ZIP, - XML, - XML_ZIP -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/IRecordManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/IRecordManager.java deleted file mode 100644 index 4a50d66..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/recording/IRecordManager.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.recording; - - -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.serialization.SerializableOptions; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (original) - */ -public interface IRecordManager { - - void attachRecorder(BattleEventDispatcher battleEventDispatcher); - void detachRecorder(); - - void saveRecord(String fileName, BattleRecordFormat format, SerializableOptions options); - - void loadRecord(String fileName, BattleRecordFormat format); - - boolean hasRecord(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java deleted file mode 100644 index b1bbdb4..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/CodeSizeCalculator.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - - -/** - * Tool used for calculating the code size of a directory or jar file. - * - * @author Flemming N. Larsen (original) - */ -public final class CodeSizeCalculator { - - public static Integer getDirectoryCodeSize(File dir) { - return getCodeSize("processDirectory", dir); - } - - public static Integer getJarFileCodeSize(File jarFile) { - return getCodeSize("processZipFile", jarFile); - } - - private static Integer getCodeSize(String invokeMethod, File jarFile) { - Integer codesize; - try { - // Call the code size utility using reflection - Class classType = Class.forName("codesize.Codesize"); - - Method method = classType.getMethod(invokeMethod, new Class[] { File.class }); - Object item = method.invoke(null/* static method */, jarFile); - - // Calls Codesize.Item.getCodeSize() - method = item.getClass().getMethod("getCodeSize", (Class[]) null); - codesize = (Integer) method.invoke(item, (Object[]) null); - - } catch (IllegalAccessException e) { - codesize = null; - } catch (InvocationTargetException e) { - codesize = null; - } catch (NoSuchMethodException e) { - codesize = null; - } catch (ClassNotFoundException e) { - codesize = null; - } - return codesize; - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRepositoryManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRepositoryManager.java deleted file mode 100644 index fb6bc87..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRepositoryManager.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import robocode.control.RobotSpecification; - -import java.io.File; -import java.io.IOException; -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public interface IRepositoryManager extends IRepositoryManagerBase { - - /** - * Returns the directory containing the robots. - * - * @return a file that is the directory containing the robots. - */ - File getRobotsDirectory(); - - /** - * Returns all development directories that are additional directories to the 'robots' directory. - * - * @return a list of files containing development directories. - */ - List getDevelDirectories(); - - void refresh(String friendlyUrl); - - boolean refresh(boolean force); - void reload(boolean forced); - - List getRepositoryItems(boolean onlyWithSource, boolean onlyWithPackage, - boolean onlyRobots, boolean onlyDevelopment, boolean onlyNotDevelopment, boolean ignoreTeamRobots, boolean onlyInJar); - - RobotSpecification[] loadSelectedRobots(RobotSpecification[] selectedRobots); - - List getSelectedSpecifications(String selectedRobots); - - boolean verifyRobotName(String robotName, String shortClassName); - - int extractJar(IRobotSpecItem item); - - void createTeam(File target, TeamProperties teamProperties) throws IOException; - - String createPackage(File jarFile, List selectedRobots, RobotProperties robotProperties); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotItem.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotItem.java deleted file mode 100644 index 7497808..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotItem.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import java.net.URL; - - -/** - * @author Pavel Savara (original) - */ -public interface IRobotItem extends IRobotSpecItem { - String getPlatform(); - - boolean isJuniorRobot(); - boolean isStandardRobot(); - boolean isAdvancedRobot(); - boolean isTeamRobot(); - boolean isDroid(); - boolean isSentryRobot(); - - boolean isInteractiveRobot(); - boolean isPaintRobot(); - - URL getClassPathURL(); - URL[] getSourcePathURLs(); - - String getWritableDirectory(); - String getReadableDirectory(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotSpecItem.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotSpecItem.java deleted file mode 100644 index 60c77f2..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/IRobotSpecItem.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import robocode.control.RobotSpecification; - -import java.io.IOException; -import java.io.OutputStream; -import java.net.URL; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public interface IRobotSpecItem extends Comparable { - boolean isValid(); - - boolean isTeam(); - - boolean isInJAR(); - - void setValid(boolean value); - - String getVersion(); - - String getDescription(); - - String getAuthorName(); - - URL getWebpage(); - - boolean getIncludeSource(); - - boolean getIncludeData(); - - boolean isSourceIncluded(); - - String getRootPath(); - - URL getItemURL(); - - boolean isDevelopmentVersion(); - - String getRobocodeVersion(); - - String getFullPackage(); - - String getRelativePath(); - - String getRootPackage(); - - String getFullClassNameWithVersion(); - - String getUniqueFullClassName(); - - String getUniqueFullClassNameWithVersion(); - - String getUniqueShortClassNameWithVersion(); - - String getUniqueVeryShortClassNameWithVersion(); - - String getFullClassName(); - - String getShortClassName(); - - RobotSpecification createRobotSpecification(); - - void storeProperties(OutputStream os, RobotProperties robotProperties) throws IOException; -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotProperties.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotProperties.java deleted file mode 100644 index 3bd9e0e..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotProperties.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import java.net.URL; - - -/** - * Container for the robot properties used in robot packages. - * - * @author Flemming N. Larsen (original) - */ -public class RobotProperties { - - private boolean includeSource; - private boolean includeData; - private String version; - private String author; - private String description; - private URL webPage; - private Integer codeSize; - - public boolean isIncludeSource() { - return includeSource; - } - - public void setIncludeSource(boolean includeSource) { - this.includeSource = includeSource; - } - - public boolean isIncludeData() { - return includeData; - } - - public void setIncludeData(boolean includeData) { - this.includeData = includeData; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public URL getWebPage() { - return webPage; - } - - public void setWebPage(URL webPage) { - this.webPage = webPage; - } - - public Integer getCodeSize() { - return codeSize; - } - - public void setCodeSize(Integer codeSize) { - this.codeSize = codeSize; - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotType.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotType.java deleted file mode 100644 index ce64a75..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/RobotType.java +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import java.io.Serializable; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public final class RobotType implements Serializable { - private static final long serialVersionUID = 1L; - - private static final transient int - NONE_FLAG = 0, - JUNIOR_FLAG = 1, - STANDARD_FLAG = 2, - ADVANCED_FLAG = 4, - TEAM_FLAG = 8, - DROID_FLAG = 16, - INTERACTIVE_FLAG = 32, - PAINTING_FLAG = 64, - SENTRY_FLAG = 128; - - public static final transient RobotType INVALID = new RobotType(NONE_FLAG); - - private int typeFlags; - - public RobotType(int typeFlags) { // NO_UCD (use private - used by .NET plug-in) - this.typeFlags = typeFlags; - } - - public RobotType( - boolean isJuniorRobot, - boolean isStandardRobot, - boolean isInteractiveRobot, - boolean isPaintRobot, - boolean isAdvancedRobot, - boolean isTeamRobot, - boolean isDroid, - boolean isSentryRobot) { - - typeFlags = NONE_FLAG; - - if (isJuniorRobot) { - typeFlags |= JUNIOR_FLAG; - } - if (isStandardRobot) { - typeFlags |= STANDARD_FLAG; - } - if (isInteractiveRobot) { - typeFlags |= INTERACTIVE_FLAG; - } - if (isPaintRobot) { - typeFlags |= PAINTING_FLAG; - } - if (isAdvancedRobot) { - typeFlags |= ADVANCED_FLAG; - } - if (isTeamRobot) { - typeFlags |= TEAM_FLAG; - } - if (isDroid) { - typeFlags |= DROID_FLAG; - } - if (isSentryRobot) { - typeFlags |= SENTRY_FLAG; - } - } - - public int getTypeFlags() { - return typeFlags; - } - - public boolean isValid() { - return isJuniorRobot() || isStandardRobot() || isAdvancedRobot(); - } - - public boolean isJuniorRobot() { - return (typeFlags & JUNIOR_FLAG) != 0; - } - - public boolean isStandardRobot() { - return (typeFlags & STANDARD_FLAG) != 0; - } - - public boolean isInteractiveRobot() { - return (typeFlags & INTERACTIVE_FLAG) != 0; - } - - public boolean isPaintRobot() { - return (typeFlags & PAINTING_FLAG) != 0; - } - - public boolean isAdvancedRobot() { - return (typeFlags & ADVANCED_FLAG) != 0; - } - - public boolean isTeamRobot() { - return (typeFlags & TEAM_FLAG) != 0; - } - - public boolean isDroid() { - return (typeFlags & DROID_FLAG) != 0; - } - - public boolean isSentryRobot() { - return (typeFlags & SENTRY_FLAG) != 0; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + typeFlags; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - RobotType other = (RobotType) obj; - return (typeFlags == other.typeFlags); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/TeamProperties.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/TeamProperties.java deleted file mode 100644 index dcd74f9..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/repository/TeamProperties.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import java.net.URL; - - -/** - * Container for Team properties used in Team packages. - * - * @author Flemming N. Larsen (original) - */ -public class TeamProperties { - - private String members; - private String version; - private String author; - private String description; - private URL webPage; - - public String getMembers() { - return members; - } - - public void setMembers(String members) { - this.members = members; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public URL getWebPage() { - return webPage; - } - - public void setWebPage(URL webPage) { - this.webPage = webPage; - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/Graphics2DSerialized.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/Graphics2DSerialized.java deleted file mode 100644 index 8246511..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/Graphics2DSerialized.java +++ /dev/null @@ -1,2340 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.robotpaint; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.serialization.RbSerializer; - -import java.awt.*; -import java.awt.font.FontRenderContext; -import java.awt.font.GlyphVector; -import java.awt.geom.*; -import java.awt.image.BufferedImage; -import java.awt.image.BufferedImageOp; -import java.awt.image.ImageObserver; -import java.awt.image.RenderedImage; -import java.awt.image.renderable.RenderableImage; -import java.nio.BufferOverflowException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.text.AttributedCharacterIterator; -import java.text.CharacterIterator; -import java.util.Map; - -import javax.swing.UIManager; - - -/** - * @author Flemming N. Larsen (original) - * @author Pavel Savara (original) - */ -public class Graphics2DSerialized extends Graphics2D implements IGraphicsProxy { - - private static final int INITIAL_BUFFER_SIZE = 2 * 1024; - private static final int MAX_BUFFER_SIZE = 64 * 1024; - - private final Method[] methods = Method.class.getEnumConstants(); - - private enum Method { - TRANSLATE_INT, // translate(int, int) - SET_COLOR, // setColor(Color) - SET_PAINT_MODE, // setPaintMode() - SET_XOR_MODE, // setXORMode(Color) - SET_FONT, // setFont(Font) - CLIP_RECT, // clipRect(int, int, int, int) - SET_CLIP, // setClip(int, int, int, int) - SET_CLIP_SHAPE, // setClip(Shape) - COPY_AREA, // copyArea(int, int, int, int, int, int) - DRAW_LINE, // drawLine(int, int, int, int) - FILL_RECT, // fillRect(int, int, int, int) - DRAW_RECT, // drawRect(int, int, int, int) - CLEAR_RECT, // clearRect(int, int, int, int) - DRAW_ROUND_RECT, // drawRoundRect(int, int, int, int, int, int) - FILL_ROUND_RECT, // fillRoundRect(int, int, int, int, int, int) - DRAW_3D_RECT, // draw3DRect(int, int, int, int, boolean) - FILL_3D_RECT, // draw3DRect(int, int, int, int, boolean) - DRAW_OVAL, // drawOval(int, int, int, int) - FILL_OVAL, // fillOval(int, int, int, int) - DRAW_ARC, // drawArc(int, int, int, int, int, int) - FILL_ARC, // fillArc(int, int, int, int, int, int) - DRAW_POLYLINE, // drawPolyline(int[], int[], int) - DRAW_POLYGON, // drawPolygon(int[], int[], int) - FILL_POLYGON, // fillPolygon(int[], int[], int) - DRAW_STRING_INT, // drawString(String, int, int) - DRAW_STRING_ACI_INT, // drawString(AttributedCharacterIterator, int, int) - DRAW_CHARS, // drawChars(char[], int, int, int, int) - DRAW_BYTES, // drawBytes(byte[], int, int, int, int) - DRAW_IMAGE_1, // drawImage(Image, int, int, ImageObserver) - DRAW_IMAGE_2, // drawImage(Image, int, int, int, int, ImageObserver) - DRAW_IMAGE_3, // drawImage(Image, int, int, Color, ImageObserver) - DRAW_IMAGE_4, // drawImage(Image, int, int, int, int, Color, ImageObserver) - DRAW_IMAGE_5, // drawImage(Image, int, int, int, int, int, int, int, int, ImageObserver) - DRAW_IMAGE_6, // drawImage(Image, int, int, int, int, int, int, int, int, Color, ImageObserver) - DRAW_SHAPE, // draw(Shape) - DRAW_IMAGE_7, // drawImage(Image, AffineTransform, ImageObserver) - DRAW_IMAGE_8, // drawImage(BufferedImage, BufferedImageOp, int, int) - DRAW_RENDERED_IMAGE, // drawRenderedImage(RenderedImage, AffineTransform) - DRAW_RENDERABLE_IMAGE, // drawRenderableImage(RenderableImage, AffineTransform) - DRAW_STRING_FLOAT, // drawString(String, float, float) - DRAW_STRING_ACI_FLOAT, // drawString(AttributedCharacterIterator, float, float) - DRAW_GLYPH_VECTOR, // drawGlyphVector(GlyphVector gv, float x, float y) - FILL_SHAPE, // fill(Shape) - SET_COMPOSITE, // setComposite(Composite) - SET_PAINT, // setPaint(Paint) - SET_STROKE, // setStroke(Stroke) - SET_RENDERING_HINT, // setRenderingHint(Key, Object) - SET_RENDERING_HINTS, // setRenderingHints(Map) - ADD_RENDERING_HINTS, // addRenderingHints(Map) - TRANSLATE_DOUBLE, // translate(double, double) - ROTATE, // rotate(double) - ROTATE_XY, // rotate(double, double, double) - SCALE, // scale(double, double) - SHEAR, // shear(double, double) - TRANSFORM, // transform(AffineTransform) - SET_TRANSFORM, // setTransform(AffineTransform Tx) - SET_BACKGROUND, // setBackground(Color) - CLIP, // clip(Shape) - } - - // Needed for getTransform() - private transient AffineTransform transform = new AffineTransform(); - - // Needed for getComposite() - private transient Composite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER); - - // Needed for getPaint() - private transient Paint paint = Color.BLACK; - - // Needed for getStroke() - private transient Stroke stroke = new BasicStroke(); - - // Needed for getRenderingHint() and getRenderingHints() - private transient RenderingHints renderingHints; - - // Needed for getBackground() - private transient Color background = UIManager.getColor("Button.background"); - - // Needed for getClip() - private transient Shape clip; // is null initially - - // Needed for getColor() - private transient Color color = Color.BLACK; - - // Needed for getFont() - private transient Font font = new Font("Dialog", Font.PLAIN, 11); // used for robot labels - - // Flag indicating if this proxy has been initialized - private transient boolean isInitialized; - - // Flag indicating if painting is enabled - private transient boolean isPaintingEnabled; - - // Byte buffer that works as a stack of method calls to this proxy - private ByteBuffer calls; - - // Serializer for this proxy - private final RbSerializer serializer = new RbSerializer(); - - // FOR-DEBUG private Method lastRead; - // FOR-DEBUG private int lastPos; - - - // The one and only constructor - public Graphics2DSerialized() { - // Create a default RenderingHints object - renderingHints = new RenderingHints(null); - renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT); - renderingHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - renderingHints.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); - renderingHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); - renderingHints.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); - } - - // -------------------------------------------------------------------------- - // Overriding all methods from the extended Graphics class - // -------------------------------------------------------------------------- - - // Methods that should not be overridden or implemented: - // - finalize() - // - toString() - - @Override - public Graphics create() { - Graphics2DSerialized gfxProxyCopy = new Graphics2DSerialized(); - - gfxProxyCopy.calls = ByteBuffer.allocate(INITIAL_BUFFER_SIZE); - gfxProxyCopy.transform = transform; - gfxProxyCopy.composite = copyOf(composite); - gfxProxyCopy.paint = paint; - gfxProxyCopy.stroke = copyOf(stroke); - gfxProxyCopy.renderingHints = renderingHints; - gfxProxyCopy.background = copyOf(background); - gfxProxyCopy.clip = copyOf(clip); - gfxProxyCopy.color = copyOf(color); - gfxProxyCopy.font = font; - gfxProxyCopy.isInitialized = isInitialized; - - calls.put(calls); - - return gfxProxyCopy; - } - - @Override - public Graphics create(int x, int y, int width, int height) { - Graphics g = create(); - - g.translate(x, y); - g.setClip(0, 0, width, height); - - return g; - } - - @Override - public void translate(int x, int y) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.TRANSLATE_INT); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - translate(x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - this.transform.translate(x, y); - } - - @Override - public Color getColor() { - return color; - } - - @Override - public void setColor(Color c) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_COLOR); - put(c); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setColor(c); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getColor() - this.color = c; - } - - @Override - public void setPaintMode() { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_PAINT_MODE); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setPaintMode(); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void setXORMode(Color c1) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_XOR_MODE); - put(c1); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setXORMode(c1); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public Font getFont() { - return font; - } - - @Override - public void setFont(Font font) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_FONT); - put(font); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setFont(font); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getFont() - this.font = font; - } - - @Override - public FontMetrics getFontMetrics(Font f) { - return new FontMetricsByFont(f, getFontRenderContext()); - } - - @Override - public Rectangle getClipBounds() { - return clip.getBounds(); - } - - @Override - public void clipRect(int x, int y, int width, int height) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.CLIP_RECT); - put(x); - put(y); - put(width); - put(height); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - clipRect(x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getClip() - - Area clipArea = new Area(clip); - Area clipRectArea = new Area(new Rectangle(x, y, width, height)); - - clipArea.intersect(clipRectArea); - - this.clip = clipArea; - } - - @Override - public void setClip(int x, int y, int width, int height) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_CLIP); - put(x); - put(y); - put(width); - put(height); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setClip(x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getClip() - this.clip = new Rectangle(x, y, width, height); - } - - @Override - public Shape getClip() { - return clip; - } - - @Override - public void setClip(Shape clip) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_CLIP_SHAPE); - put(clip); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setClip(clip); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getClip() - this.clip = clip; - } - - @Override - public void copyArea(int x, int y, int width, int height, int dx, int dy) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.COPY_AREA); - put(x); - put(y); - put(width); - put(height); - put(dx); - put(dy); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - copyArea(x, y, width, height, dx, dy); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawLine(int x1, int y1, int x2, int y2) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_LINE); - put(x1); - put(y1); - put(x2); - put(y2); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawLine(x1, y1, x2, y2); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void fillRect(int x, int y, int width, int height) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.FILL_RECT); - put(x); - put(y); - put(width); - put(height); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - fillRect(x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawRect(int x, int y, int width, int height) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_RECT); - put(x); - put(y); - put(width); - put(height); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawRect(x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void clearRect(int x, int y, int width, int height) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.CLEAR_RECT); - put(x); - put(y); - put(width); - put(height); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - clearRect(x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_ROUND_RECT); - put(x); - put(y); - put(width); - put(height); - put(arcWidth); - put(arcHeight); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawRoundRect(x, y, width, height, arcWidth, arcHeight); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.FILL_ROUND_RECT); - put(x); - put(y); - put(width); - put(height); - put(arcWidth); - put(arcHeight); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - fillRoundRect(x, y, width, height, arcWidth, arcHeight); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void draw3DRect(int x, int y, int width, int height, boolean raised) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_3D_RECT); - put(x); - put(y); - put(width); - put(height); - put(raised); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - draw3DRect(x, y, width, height, raised); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void fill3DRect(int x, int y, int width, int height, boolean raised) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.FILL_3D_RECT); - put(x); - put(y); - put(width); - put(height); - put(raised); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - fill3DRect(x, y, width, height, raised); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawOval(int x, int y, int width, int height) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_OVAL); - put(x); - put(y); - put(width); - put(height); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawOval(x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void fillOval(int x, int y, int width, int height) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.FILL_OVAL); - put(x); - put(y); - put(width); - put(height); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - fillOval(x, y, width, height); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_ARC); - put(x); - put(y); - put(width); - put(height); - put(startAngle); - put(arcAngle); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawArc(x, y, width, height, startAngle, arcAngle); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.FILL_ARC); - put(x); - put(y); - put(width); - put(height); - put(startAngle); - put(arcAngle); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - fillArc(x, y, width, height, startAngle, arcAngle); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawPolyline(int[] xPoints, int[] yPoints, int npoints) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_POLYLINE); - put(xPoints); - put(yPoints); - put(npoints); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawPolyline(xPoints, yPoints, npoints); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawPolygon(int[] xPoints, int[] yPoints, int npoints) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_POLYGON); - put(xPoints); - put(yPoints); - put(npoints); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawPolygon(xPoints, yPoints, npoints); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawPolygon(Polygon p) { - if (isPaintingEnabled) { - drawPolygon(p.xpoints, p.ypoints, p.npoints); // Reuse sister method - } - } - - @Override - public void fillPolygon(int[] xPoints, int[] yPoints, int npoints) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.FILL_POLYGON); - put(xPoints); - put(yPoints); - put(npoints); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - fillPolygon(xPoints, yPoints, npoints); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void fillPolygon(Polygon p) { - if (isPaintingEnabled) { - fillPolygon(p.xpoints, p.ypoints, p.npoints); // Reuse sister method - } - } - - @Override - public void drawString(String str, int x, int y) { - if (str == null) { - throw new NullPointerException("str is null"); // According to the specification! - } - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_STRING_INT); - put(str); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawString(str, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawString(AttributedCharacterIterator iterator, int x, int y) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_STRING_ACI_INT); - put(iterator); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawString(iterator, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawChars(char[] data, int offset, int length, int x, int y) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_CHARS); - put(data); - put(offset); - put(length); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawChars(data, offset, length, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawBytes(byte[] data, int offset, int length, int x, int y) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_BYTES); - put(data); - put(offset); - put(length); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawBytes(data, offset, length, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public boolean drawImage(Image img, int x, int y, ImageObserver observer) { - if (isPaintingEnabled) { - notSupported(); - } - return false; // as if the image pixels are still changing (as the call is queued) - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { - if (isPaintingEnabled) { - notSupported(); - } - return false; // as if the image pixels are still changing (as the call is queued) - } - - @Override - public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) { - if (isPaintingEnabled) { - notSupported(); - } - return false; // as if the image pixels are still changing (as the call is queued) - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { - if (isPaintingEnabled) { - notSupported(); - } - return false; // as if the image pixels are still changing (as the call is queued) - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, - ImageObserver observer) { - - if (isPaintingEnabled) { - notSupported(); - } - return false; // as if the image pixels are still changing (as the call is queued) - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, - Color bgcolor, ImageObserver observer) { - - if (isPaintingEnabled) { - notSupported(); - } - return false; // as if the image pixels are still changing (as the call is queued) - } - - @Override - public void dispose() {// Ignored here - } - - @Override - @Deprecated - public Rectangle getClipRect() { - return getClipBounds(); // Must use getClipBounds() instead of this deprecated method - } - - @Override - public boolean hitClip(int x, int y, int width, int height) { - return (clip != null) && clip.intersects(x, y, width, height); - } - - @Override - public Rectangle getClipBounds(Rectangle r) { - Rectangle bounds = clip.getBounds(); - - r.setBounds(bounds); - return bounds; - } - - // -------------------------------------------------------------------------- - // Overriding all methods from the extended Graphics2D class - // -------------------------------------------------------------------------- - - @Override - public void draw(Shape s) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_SHAPE); - put(s); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - draw(s); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { - if (isPaintingEnabled) { - notSupported(); - } - return false; // as if the image is still being rendered (as the call is queued) - } - - @Override - public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { - if (isPaintingEnabled) { - notSupported(); - } - } - - @Override - public void drawRenderedImage(RenderedImage img, AffineTransform xform) {} - - @Override - public void drawRenderableImage(RenderableImage img, AffineTransform xform) { - if (isPaintingEnabled) { - notSupported(); - } - } - - @Override - public void drawString(String str, float x, float y) { - if (str == null) { - throw new NullPointerException("str is null"); // According to the specification! - } - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_STRING_FLOAT); - put(str); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawString(str, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawString(AttributedCharacterIterator iterator, float x, float y) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.DRAW_STRING_ACI_FLOAT); - put(iterator); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - drawString(iterator, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public void drawGlyphVector(GlyphVector gv, float x, float y) { - if (isPaintingEnabled) { - notSupported(); - } - } - - @Override - public void fill(Shape s) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.FILL_SHAPE); - put(s); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - fill(s); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - } - - @Override - public boolean hit(Rectangle rect, Shape s, boolean onStroke) { - if (onStroke && getStroke() != null) { - s = getStroke().createStrokedShape(s); - } - - if (getTransform() != null) { - s = getTransform().createTransformedShape(s); - } - - Area area = new Area(s); - - if (getClip() != null) { - area.intersect(new Area(getClip())); - } - - return area.intersects(rect); - } - - @Override - public GraphicsConfiguration getDeviceConfiguration() { - return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); - } - - @Override - public void setComposite(Composite comp) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_COMPOSITE); - put(comp); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setComposite(comp); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getComposite() - this.composite = comp; - } - - @Override - public void setPaint(Paint paint) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_PAINT); - put(paint); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setPaint(paint); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getPaint() - this.paint = paint; - } - - @Override - public void setStroke(Stroke s) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_STROKE); - put(s); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setStroke(s); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getStroke() - this.stroke = s; - } - - @Override - public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue) { - // for getRenderingHint() and getRenderingHints() - this.renderingHints.put(hintKey, hintValue); - - if (isPaintingEnabled) { - notSupportedWarn(); - } - } - - @Override - public Object getRenderingHint(RenderingHints.Key hintKey) { - return renderingHints.get(hintKey); - } - - @Override - public void setRenderingHints(Map hints) { - // for getRenderingHint() and getRenderingHints() - this.renderingHints.clear(); // Needs to clear first - this.renderingHints.putAll(hints); // Only overrides existing keys - - if (isPaintingEnabled) { - notSupportedWarn(); - } - } - - @Override - public void addRenderingHints(Map hints) { - // for getRenderingHint() and getRenderingHints() - this.renderingHints.putAll(hints); - - if (isPaintingEnabled) { - notSupportedWarn(); - } - } - - @Override - public RenderingHints getRenderingHints() { - return renderingHints; - } - - @Override - public void translate(double tx, double ty) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.TRANSLATE_DOUBLE); - put(tx); - put(ty); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - translate(tx, ty); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - transform.translate(tx, ty); - } - - @Override - public void rotate(double theta) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.ROTATE); - put(theta); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - rotate(theta); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - transform.rotate(theta); - } - - @Override - public void rotate(double theta, double x, double y) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.ROTATE_XY); - put(theta); - put(x); - put(y); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - rotate(theta, x, y); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - transform.rotate(theta, x, y); - } - - @Override - public void scale(double sx, double sy) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SCALE); - put(sx); - put(sy); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - scale(sx, sy); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - transform.scale(sx, sy); - } - - @Override - public void shear(double shx, double shy) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SHEAR); - put(shx); - put(shy); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - shear(shx, shy); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - transform.shear(shx, shy); - } - - @Override - public void transform(AffineTransform Tx) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.TRANSFORM); - put(Tx); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - transform(Tx); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - transform.concatenate(Tx); - } - - @Override - public void setTransform(AffineTransform Tx) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_TRANSFORM); - put(Tx); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setTransform(Tx); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getTransform() - this.transform = Tx; - } - - @Override - public AffineTransform getTransform() { - return (AffineTransform) transform.clone(); - } - - @Override - public Paint getPaint() { - return paint; - } - - @Override - public Composite getComposite() { - return composite; - } - - @Override - public void setBackground(Color color) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.SET_BACKGROUND); - put(color); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - setBackground(color); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getBackground() - background = color; - } - - @Override - public Color getBackground() { - return background; - } - - @Override - public Stroke getStroke() { - return stroke; - } - - @Override - public void clip(Shape s) { - if (isPaintingEnabled) { - calls.mark(); // Mark for rollback - try { - put(Method.CLIP); - put(s); - } catch (BufferOverflowException e) { - if (recoverFromBufferOverflow()) { - clip(s); // Retry this method after reallocation - return; // Make sure we leave - } - } - } - - // for getClip() - if (s == null) { - this.clip = null; - } else { - Area shapeArea = new Area(s); - Area clipArea = new Area(clip); - - shapeArea.transform(transform); // transform by the current transform - clipArea.intersect(shapeArea); // intersect current clip by the transformed shape - - this.clip = clipArea; - } - } - - @Override - public FontRenderContext getFontRenderContext() { - RenderingHints hints = getRenderingHints(); - - if (hints == null) { - return new FontRenderContext(null, false, false); - } else { - boolean isAntiAliased = RenderingHints.VALUE_FRACTIONALMETRICS_ON.equals( - hints.get(RenderingHints.KEY_TEXT_ANTIALIASING)); - boolean usesFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_ON.equals( - hints.get(RenderingHints.KEY_FRACTIONALMETRICS)); - - return new FontRenderContext(null, isAntiAliased, usesFractionalMetrics); - } - } - - // -------------------------------------------------------------------------- - // Processing of queued method calls to a Graphics2D object - // -------------------------------------------------------------------------- - - public void setPaintingEnabled(boolean enabled) { - if (enabled && !isPaintingEnabled) { - calls = ByteBuffer.allocate(INITIAL_BUFFER_SIZE); - calls.put(calls.order() == ByteOrder.BIG_ENDIAN ? (byte) 1 : (byte) 0); - } - isPaintingEnabled = enabled; - } - - public void processTo(Graphics2D g) { - if (!isInitialized) { - calls = ByteBuffer.allocate(INITIAL_BUFFER_SIZE); - - // Make sure the transform is not null - transform = g.getTransform(); - transform = transform == null ? new AffineTransform() : new AffineTransform(transform); - - color = copyOf(g.getColor()); - - font = g.getFont(); - - clip = copyOf(g.getClip()); - - composite = copyOf(g.getComposite()); - - paint = g.getPaint(); - - stroke = copyOf(g.getStroke()); - - renderingHints = (RenderingHints) g.getRenderingHints().clone(); - - background = copyOf(g.getBackground()); - - isInitialized = true; - } - - calls.flip(); - - while (calls.remaining() > 0) { - processQueuedCall(g); - } - } - - public void processTo(Graphics2D g, Object graphicsCalls) { - calls.clear(); - - calls.mark(); // Mark for rollback - try { - calls.put((byte[]) graphicsCalls); - } catch (BufferOverflowException e) { - calls.reset(); // Rollback buffer - if (reallocBuffer()) { - processTo(g, graphicsCalls); - return; // must exit here - } - calls.clear(); - } - - calls.flip(); - calls.order(calls.get() == 1 ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); - - while (calls.remaining() > 0) { - try { - processQueuedCall(g); - } catch (Exception e) { - e.printStackTrace(); - // FOR-DEBUG } catch (Error e) { - // FOR-DEBUG calls.position(lastPos - 4); - } - } - } - - public byte[] readoutQueuedCalls() { - if (calls == null || calls.position() == 0) { - return null; - } - byte[] res = new byte[calls.position()]; - - calls.flip(); - calls.get(res); - - calls.clear(); - calls.put(calls.order() == ByteOrder.BIG_ENDIAN ? (byte) 1 : (byte) 0); - - return res; - } - - private void processQueuedCall(Graphics2D g) { - Method m = readMethod(); - - switch (m) { - case TRANSLATE_INT: - processTranslate_int(g); - break; - - case SET_COLOR: - processSetColor(g); - break; - - case SET_PAINT_MODE: - processSetPaintMode(g); - break; - - case SET_XOR_MODE: - processSetXORMode(g); - break; - - case SET_FONT: - processSetFont(g); - break; - - case CLIP_RECT: - processClipRect(g); - break; - - case SET_CLIP: - processSetClip(g); - break; - - case SET_CLIP_SHAPE: - processSetClip_Shape(g); - break; - - case COPY_AREA: - processCopyArea(g); - break; - - case DRAW_LINE: - processDrawLine(g); - break; - - case FILL_RECT: - processFillRect(g); - break; - - case DRAW_RECT: - processDrawRect(g); - break; - - case CLEAR_RECT: - processClearRect(g); - break; - - case DRAW_ROUND_RECT: - processDrawRoundRect(g); - break; - - case FILL_ROUND_RECT: - processFillRoundRect(g); - break; - - case DRAW_3D_RECT: - processDraw3DRect(g); - break; - - case FILL_3D_RECT: - processFill3DRect(g); - break; - - case DRAW_OVAL: - processDrawOval(g); - break; - - case FILL_OVAL: - processFillOval(g); - break; - - case DRAW_ARC: - processDrawArc(g); - break; - - case FILL_ARC: - processFillArc(g); - break; - - case DRAW_POLYLINE: - processDrawPolyline(g); - break; - - case DRAW_POLYGON: - processDrawPolygon(g); - break; - - case FILL_POLYGON: - processFillPolygon(g); - break; - - case DRAW_STRING_INT: - processDrawString_int(g); - break; - - case DRAW_STRING_ACI_INT: - processDrawString_ACIterator_int(g); - break; - - case DRAW_CHARS: - processDrawChars(g); - break; - - case DRAW_BYTES: - processDrawBytes(g); - break; - - case DRAW_SHAPE: - processDrawShape(g); - break; - - case DRAW_STRING_FLOAT: - processDrawString_float(g); - break; - - case DRAW_STRING_ACI_FLOAT: - processDrawString_ACIterator_float(g); - break; - - case FILL_SHAPE: - processFillShape(g); - break; - - case SET_COMPOSITE: - processSetComposite(g); - break; - - case SET_PAINT: - processSetPaint(g); - break; - - case SET_STROKE: - processSetStroke(g); - break; - - case TRANSLATE_DOUBLE: - processTranslate_double(g); - break; - - case ROTATE: - processRotate(g); - break; - - case ROTATE_XY: - processRotate_xy(g); - break; - - case SCALE: - processScale(g); - break; - - case SHEAR: - processShear(g); - break; - - case TRANSFORM: - processTransform(g); - break; - - case SET_TRANSFORM: - processSetTransform(g); - break; - - case SET_BACKGROUND: - processSetBackground(g); - break; - - case CLIP: - processClip(g); - break; - - case DRAW_GLYPH_VECTOR: - case DRAW_IMAGE_1: - case DRAW_IMAGE_2: - case DRAW_IMAGE_3: - case DRAW_IMAGE_4: - case DRAW_IMAGE_5: - case DRAW_IMAGE_6: - case DRAW_IMAGE_7: - case DRAW_IMAGE_8: - case DRAW_RENDERED_IMAGE: - case DRAW_RENDERABLE_IMAGE: - case SET_RENDERING_HINT: - case SET_RENDERING_HINTS: - case ADD_RENDERING_HINTS: - default: - notSupported(); - break; - } - } - - private void processTranslate_int(Graphics2D g) { - // translate(int, int) - g.translate(calls.getInt(), calls.getInt()); - } - - private void processSetColor(Graphics2D g) { - // setColor(Color) - g.setColor(readColor()); - } - - private void processSetPaintMode(Graphics2D g) { - // setPaintMode() - g.setPaintMode(); - } - - private void processSetXORMode(Graphics2D g) { - // setXORMode(Color) - g.setXORMode(readColor()); - } - - private void processSetFont(Graphics2D g) { - Font font = calls.get() == 0 - ? null - : new Font(serializer.deserializeString(calls), calls.getInt(), calls.getInt()); - - // setFont(Font) - g.setFont(font); - } - - private void processClipRect(Graphics2D g) { - // clipRect(int, int, int, int) - g.clipRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processSetClip(Graphics2D g) { - // setClip(int, int, int, int) - g.setClip(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processSetClip_Shape(Graphics2D g) { - // setClip(Shape) - g.setClip(readShape()); - } - - private void processCopyArea(Graphics2D g) { - // copyArea(int, int, int, int, int, int) - g.copyArea(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDrawLine(Graphics2D g) { - // drawLine(int, int, int, int) - g.drawLine(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processFillRect(Graphics2D g) { - // fillRect(int, int, int, int) - g.fillRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDrawRect(Graphics2D g) { - // drawRect(int, int, int, int) - g.drawRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processClearRect(Graphics2D g) { - // clearRect(int, int, int, int) - g.clearRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDrawRoundRect(Graphics2D g) { - // drawRoundRect(int, int, int, int, int, int) - g.drawRoundRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processFillRoundRect(Graphics2D g) { - // fillRoundRect(int, int, int, int, int, int) - g.fillRoundRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDraw3DRect(Graphics2D g) { - // draw3DRect(int, int, int, int, boolean) - g.draw3DRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), - serializer.deserializeBoolean(calls)); - } - - private void processFill3DRect(Graphics2D g) { - // fill3DRect(int, int, int, int, boolean) - g.fill3DRect(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), - serializer.deserializeBoolean(calls)); - } - - private void processDrawOval(Graphics2D g) { - // drawOval(int, int, int, int) - g.drawOval(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processFillOval(Graphics2D g) { - // fillOval(int, int, int, int) - g.fillOval(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDrawArc(Graphics2D g) { - // drawArc(int, int, int, int, int, int) - g.drawArc(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processFillArc(Graphics2D g) { - // fillArc(int, int, int, int, int, int) - g.fillArc(calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDrawPolyline(Graphics2D g) { - // drawPolyline(int[], int[], int) - g.drawPolyline(serializer.deserializeIntegers(calls), serializer.deserializeIntegers(calls), calls.getInt()); - } - - private void processDrawPolygon(Graphics2D g) { - // drawPolygon(int[], int[], int) - g.drawPolygon(serializer.deserializeIntegers(calls), serializer.deserializeIntegers(calls), calls.getInt()); - } - - private void processFillPolygon(Graphics2D g) { - // fillPolygon(int[], int[], int) - g.fillPolygon(serializer.deserializeIntegers(calls), serializer.deserializeIntegers(calls), calls.getInt()); - } - - private void processDrawString_int(Graphics2D g) { - // drawString(String, int, int) - g.drawString(serializer.deserializeString(calls), calls.getInt(), calls.getInt()); - } - - private void processDrawString_ACIterator_int(Graphics2D g) { - // drawString(String, int, int) - g.drawString(serializer.deserializeString(calls), calls.getInt(), calls.getInt()); - } - - private void processDrawChars(Graphics2D g) { - // drawBytes(char[], int, int, int, int) - g.drawChars(serializer.deserializeChars(calls), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDrawBytes(Graphics2D g) { - // drawBytes(byte[], int, int, int, int) - g.drawBytes(serializer.deserializeBytes(calls), calls.getInt(), calls.getInt(), calls.getInt(), calls.getInt()); - } - - private void processDrawShape(Graphics2D g) { - // draw(Shape) - g.draw(readShape()); - } - - private void processDrawString_float(Graphics2D g) { - // drawString(String, float, float) - g.drawString(serializer.deserializeString(calls), calls.getFloat(), calls.getFloat()); - } - - private void processDrawString_ACIterator_float(Graphics2D g) { - // drawString(String, float, float) - g.drawString(serializer.deserializeString(calls), calls.getFloat(), calls.getFloat()); - } - - private void processFillShape(Graphics2D g) { - // fill(Shape) - g.fill(readShape()); - } - - private void processSetComposite(Graphics2D g) { - // setComposite(Composite) - g.setComposite(readComposite()); - } - - private void processSetPaint(Graphics2D g) { - // setPaint(Paint) - g.setPaint(readPaint()); - } - - private void processSetStroke(Graphics2D g) { - // setStroke(Stroke) - g.setStroke(readStroke()); - } - - private void processTranslate_double(Graphics2D g) { - // translate(double, double) - g.translate(calls.getDouble(), calls.getDouble()); - } - - private void processRotate(Graphics2D g) { - // rotate(double) - g.rotate(calls.getDouble()); - } - - private void processRotate_xy(Graphics2D g) { - // rotate(double) - g.rotate(calls.getDouble(), calls.getDouble(), calls.getDouble()); - } - - private void processScale(Graphics2D g) { - // scale(double, double) - g.scale(calls.getDouble(), calls.getDouble()); - } - - private void processShear(Graphics2D g) { - // shear(double, double) - g.shear(calls.getDouble(), calls.getDouble()); - } - - private void processTransform(Graphics2D g) { - // transform(AffineTransform) - g.transform(readAffineTransform()); - } - - private void processSetTransform(Graphics2D g) { - // setTransform(AffineTransform) - g.setTransform(readAffineTransform()); - } - - private void processSetBackground(Graphics2D g) { - // setBackground(Color) - g.setBackground(readColor()); - } - - private void processClip(Graphics2D g) { - // clip(Shape) - g.clip(readShape()); - } - - private Shape readShape() { - switch (calls.get()) { - case 0: - return null; - - case 1: - return new Arc2D.Double(calls.getDouble(), // x - calls.getDouble(), // y - calls.getDouble(), // width - calls.getDouble(), // height - calls.getDouble(), // angle start - calls.getDouble(), // angle extended - calls.getInt()); // arc type - - case 2: - return new Line2D.Double(calls.getDouble(), // x1 - calls.getDouble(), // y1 - calls.getDouble(), // x2 - calls.getDouble()); // y2 - - case 3: - return new Rectangle2D.Double(calls.getDouble(), // x - calls.getDouble(), // y - calls.getDouble(), // width - calls.getDouble()); // height - - case 4: - return new Ellipse2D.Double(calls.getDouble(), // x - calls.getDouble(), // y - calls.getDouble(), // width - calls.getDouble()); // height - - case 5: - GeneralPath path = new GeneralPath(); - - path.append(new DeserializePathIterator(), false); - return path; - } - notSupported(); - return null; - } - - /** - * Reallocates the calls buffer by replacing it with a new one with doubled capacity - * and copying the old one. - * - * @return {@code true} if the buffer was reallocated; - * {@code false} if the max. capacity has been reached meaning that the reallocation - * was not performed. - */ - private boolean reallocBuffer() { - int bufferSize; - - if (calls == null) { - // No buffer -> Use initial buffer size - bufferSize = INITIAL_BUFFER_SIZE; - } else { - // Otherwise, double up capacity - bufferSize = 2 * calls.capacity(); - } - - // Check if the max. buffer size has been reached - if (RobocodeProperties.isDebuggingOff() && bufferSize > MAX_BUFFER_SIZE) { - return false; // not reallocated! - } - - // Allocate new buffer - ByteBuffer newBuffer = ByteBuffer.allocate(bufferSize); - - if (calls != null) { - // Copy all bytes contained in the current buffer to the new buffer - - byte[] copiedBytes = new byte[calls.position()]; - - calls.clear(); - calls.get(copiedBytes); - - newBuffer.put(copiedBytes); - } - - // Switch to the new buffer - calls = newBuffer; - - return true; // buffer was reallocated - } - - private int unrecoveredBufferOverflowCount; - - private boolean recoverFromBufferOverflow() { - calls.reset(); // Rollback buffer - - boolean recovered = reallocBuffer(); - - if (!recovered) { - if (unrecoveredBufferOverflowCount++ == 1) { // Prevent spamming - System.out.println( - "SYSTEM: This robot is painting too much between actions.\n" + "SYSTEM: Max. buffer capacity (" - + MAX_BUFFER_SIZE + " bytes per turn) has been reached.\n" - + "SYSTEM: Last painting operations are being dropped.\n"); - } - } - return recovered; - } - - private class DeserializePathIterator implements PathIterator { - final int count; - int pos; - final int windingRule; - int[] type; - double[][] coords; - - public DeserializePathIterator() { - count = calls.getInt(); - pos = 0; - windingRule = calls.getInt(); - if (count > 0) { - type = new int[count]; - coords = new double[count][]; - for (int i = 0; i < count; i++) { - type[i] = calls.getInt(); - coords[i] = serializer.deserializeDoubles(calls); - } - } - } - - public int getWindingRule() { - return windingRule; - } - - public boolean isDone() { - return pos == count; - } - - public void next() { - pos++; - } - - public int currentSegment(float[] coords) { - for (int i = 0; i < coords.length; i++) { - coords[i] = (float) this.coords[pos][i]; - } - return type[pos]; - } - - public int currentSegment(double[] coords) { - System.arraycopy(this.coords[pos], 0, coords, 0, coords.length); - return type[pos]; - } - } - - private void put(Shape shape) { - if (shape == null) { - put((byte) 0); - } else if (shape instanceof Arc2D) { - put((byte) 1); - Arc2D arc = (Arc2D) shape; - - put(arc.getX()); - put(arc.getY()); - put(arc.getWidth()); - put(arc.getHeight()); - put(arc.getAngleStart()); - put(arc.getAngleExtent()); - put(arc.getArcType()); - } else if (shape instanceof Line2D) { - put((byte) 2); - Line2D line = (Line2D) shape; - - put(line.getX1()); - put(line.getY1()); - put(line.getX2()); - put(line.getY2()); - } else if (shape instanceof Rectangle2D) { - put((byte) 3); - Rectangle2D rect = (Rectangle2D) shape; - - put(rect.getX()); - put(rect.getY()); - put(rect.getWidth()); - put(rect.getHeight()); - } else if (shape instanceof Ellipse2D) { - put((byte) 4); - Ellipse2D elipse = (Ellipse2D) shape; - - put(elipse.getX()); - put(elipse.getY()); - put(elipse.getWidth()); - put(elipse.getHeight()); - } else { - put((byte) 5); - - double coords[] = new double[6]; - int count = 0; - - // count them first - PathIterator pi = shape.getPathIterator(null); - - while (!pi.isDone()) { - count++; - pi.next(); - } - put(count); - - // write them - pi = shape.getPathIterator(null); - put(pi.getWindingRule()); - while (!pi.isDone()) { - int type = pi.currentSegment(coords); - - put(type); - put(coords); - pi.next(); - } - } - } - - private Composite readComposite() { - switch (calls.get()) { - case 0: - return null; - - case 1: - return AlphaComposite.getInstance(calls.getInt()); - } - notSupported(); - return null; - } - - private void put(Composite comp) { - if (comp == null) { - put((byte) 0); - } else if (comp instanceof AlphaComposite) { - AlphaComposite composite = (AlphaComposite) comp; - - put((byte) 1); - put(composite.getRule()); - } else { - notSupported(); - } - } - - private Paint readPaint() { - switch (calls.get()) { - case 0: - return null; - - case 1: - return new Color(calls.getInt(), true); - } - notSupported(); - return null; - } - - private void put(Paint paint) { - if (paint == null) { - put((byte) 0); - } else if (paint instanceof Color) { - Color color = (Color) paint; - - put((byte) 1); - put(color.getRGB()); - } else { - notSupported(); - } - } - - private Stroke readStroke() { - switch (calls.get()) { - case 0: - return null; - - case 1: - return new BasicStroke(calls.getFloat(), calls.getInt(), calls.getInt(), calls.getFloat(), - serializer.deserializeFloats(calls), calls.getFloat()); - } - notSupported(); - return null; - } - - private void put(Stroke stroke) { - if (stroke == null) { - put((byte) 0); - } else if (stroke instanceof BasicStroke) { - BasicStroke bs = (BasicStroke) stroke; - - put((byte) 1); - put(bs.getLineWidth()); - put(bs.getEndCap()); - put(bs.getLineJoin()); - put(bs.getMiterLimit()); - put(bs.getDashArray()); - put(bs.getDashPhase()); - } else { - notSupported(); - } - } - - private AffineTransform readAffineTransform() { - switch (calls.get()) { - case 0: - return null; - - case 1: - return new AffineTransform(serializer.deserializeDoubles(calls)); - } - notSupported(); - return null; - } - - private void put(AffineTransform tx) { - if (tx == null) { - put((byte) 0); - } else { - double[] m = new double[6]; - - tx.getMatrix(m); - - put((byte) 1); - put(m); - put(tx.getType()); - } - } - - private Method readMethod() { - // FOR-DEBUG if (calls.getInt() != 0xBADF00D) { - // FOR-DEBUG calls.position(lastPos); - // FOR-DEBUG // throw new Error(); - // FOR-DEBUG } - // FOR-DEBUG lastPos = calls.position(); - Method m = methods[calls.get()]; - - // FOR-DEBUG if (calls.getInt() != 0xBADF00D) { - // FOR-DEBUG throw new Error(); - // FOR-DEBUG } - // FOR-DEBUG lastRead = m; - return m; - } - - private void put(Method m) { - // FOR-DEBUG calls.putInt(0xBADF00D); - calls.put((byte) m.ordinal()); - // FOR-DEBUG calls.putInt(0xBADF00D); - } - - private void put(AttributedCharacterIterator iterator) { - if (iterator == null) { - put((String) null); - } else { - StringBuilder sb = new StringBuilder(); - - for (char c = iterator.first(); c != CharacterIterator.DONE; c = iterator.next()) { - sb.append(c); - } - put(sb.toString()); - } - } - - private void put(String value) { - serializer.serialize(calls, value); - } - - private void put(boolean value) { - serializer.serialize(calls, value); - } - - private void put(byte value) { - calls.put(value); - } - - private void put(int value) { - calls.putInt(value); - } - - private void put(int[] values) { - serializer.serialize(calls, values); - } - - private void put(byte[] values) { - serializer.serialize(calls, values); - } - - private void put(char[] values) { - serializer.serialize(calls, values); - } - - private void put(double[] values) { - serializer.serialize(calls, values); - } - - private void put(float[] values) { - serializer.serialize(calls, values); - } - - private void put(double value) { - calls.putDouble(value); - } - - private void put(float value) { - calls.putFloat(value); - } - - private Color readColor() { - return calls.get() == 0 ? null : new Color(calls.getInt(), true); - } - - private void put(Color value) { - if (value == null) { - calls.put((byte) 0); - } else { - calls.put((byte) 1); - calls.putInt(value.getRGB()); - } - } - - private void put(Font font) { - if (font == null) { - calls.put((byte) 0); - } else { - calls.put((byte) 1); - serializer.serialize(calls, font.getFontName()); - calls.putInt(font.getStyle()); - calls.putInt(font.getSize()); - } - } - - // -------------------------------------------------------------------------- - // Copy - // -------------------------------------------------------------------------- - - private static Color copyOf(Color c) { - return (c != null) ? new Color(c.getRGB(), true) : null; - } - - private Shape copyOf(Shape s) { - return (s != null) ? new GeneralPath(s) : null; - } - - private Stroke copyOf(Stroke s) { - if (s == null) { - return null; - } - if (s instanceof BasicStroke) { - BasicStroke bs = (BasicStroke) s; - - return new BasicStroke(bs.getLineWidth(), bs.getEndCap(), bs.getLineJoin(), bs.getMiterLimit(), - bs.getDashArray(), bs.getDashPhase()); - } - throw new UnsupportedOperationException("The Stroke type '" + s.getClass().getName() + "' is not supported"); - } - - private Composite copyOf(Composite c) { - if (c == null) { - return null; - } - if (c instanceof AlphaComposite) { - AlphaComposite ac = (AlphaComposite) c; - - return AlphaComposite.getInstance(ac.getRule(), ac.getAlpha()); - } - throw new UnsupportedOperationException("The Composite type '" + c.getClass().getName() + "' is not supported"); - } - - private void notSupported() { - throw new UnsupportedOperationException("We are sorry. Operation is not supported in Robocode."); - } - - private void notSupportedWarn() { - Logger.printlnToRobotsConsole("SYSTEM: We are sorry. Operation is not supported in Robocode."); - } - - // -------------------------------------------------------------------------- - // Worker classes - // -------------------------------------------------------------------------- - - - /** - * Extended FontMetrics class which only purpose is to let us access its - * protected contructor taking a Font as input parameter. - * - * @author Flemming N. Larsen - */ - private class FontMetricsByFont extends FontMetrics { - static final long serialVersionUID = 1L; - - final FontRenderContext fontRenderContext; - - FontMetricsByFont(Font font, FontRenderContext frc) { - super(font); - fontRenderContext = frc; - } - - /** - * Bugfix [2791007] - FontMetrics StackOverflowError. - * More info here: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4257064 - */ - @Override - public int charsWidth(char[] data, int off, int len) { - if (font == null) { - return 0; - } - Rectangle2D bounds = font.getStringBounds(data, off, off + len, fontRenderContext); - - return (bounds != null) ? (int) (bounds.getWidth() + 0.5) : 0; - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/IGraphicsProxy.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/IGraphicsProxy.java deleted file mode 100644 index 89a1031..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/robotpaint/IGraphicsProxy.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.robotpaint; - - -import java.awt.*; - - -/** - * @author Pavel Savara (original) - */ -public interface IGraphicsProxy { - void setPaintingEnabled(boolean enabled); - void processTo(Graphics2D g, Object graphicsCalls); - - void processTo(Graphics2D g); - - Object readoutQueuedCalls(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/IXmlSerializable.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/IXmlSerializable.java deleted file mode 100644 index 78330dd..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/IXmlSerializable.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -import java.io.IOException; - - -/** - * @author Pavel Savara (original) - */ -public interface IXmlSerializable { - void writeXml(XmlWriter writer, SerializableOptions options) throws IOException; - - XmlReader.Element readXml(XmlReader reader); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/SerializableOptions.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/SerializableOptions.java deleted file mode 100644 index 9e3f9f8..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/SerializableOptions.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -/** - * @author Pavel Savara (original) - */ -public class SerializableOptions { - public boolean skipExploded; - public boolean skipNames; - public boolean skipVersion; - public boolean skipDebug; - public boolean skipTotal; - public boolean trimPrecision; - public boolean shortAttributes; - - public SerializableOptions(SerializableOptions src) { - skipExploded = src.skipExploded; - skipNames = src.skipNames; - skipVersion = src.skipVersion; - skipDebug = src.skipDebug; - skipTotal = src.skipTotal; - trimPrecision = src.trimPrecision; - shortAttributes = src.shortAttributes; - } - - public SerializableOptions(boolean skipAllDetails) { - if (skipAllDetails) { - skipExploded = true; - skipNames = true; - skipVersion = true; - skipDebug = true; - skipTotal = true; - trimPrecision = true; - shortAttributes = true; - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlReader.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlReader.java deleted file mode 100644 index 6d0e453..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlReader.java +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Stack; - - -/** - * @author Pavel Savara (original) - */ -public class XmlReader { - - private SAXParser parser; - - private final InputStream input; - private final Stack elements = new Stack(); - private final Stack items = new Stack(); - private final Stack> elementNames = new Stack>(); - private final Stack> attributeNames = new Stack>(); - private IXmlSerializable result; - private Map context = new HashMap(); - - private XmlReader(InputStream input) throws SAXException, ParserConfigurationException { - this.input = input; - SAXParserFactory factory = SAXParserFactory.newInstance(); - - parser = factory.newSAXParser(); - } - - private Object deserialize(IXmlSerializable prototype) throws IOException, SAXException { - elementNames.push(new HashMap()); - attributeNames.push(new HashMap()); - items.push(null); - elements.push(new ListElement() { - public IXmlSerializable read(XmlReader reader) { - return null; - } - - public void add(IXmlSerializable child) { - result = child; - } - - public void close() {} - }); - prototype.readXml(this); - parser.parse(input, new Handler(this)); - items.pop(); - elements.pop(); - elementNames.pop(); - attributeNames.pop(); - - return result; - } - - private class Handler extends DefaultHandler { - final XmlReader parent; - - public Handler(XmlReader parent) { - this.parent = parent; - } - - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - final Map names = XmlReader.this.elementNames.peek(); - final Element element = names == null ? null : names.get(qName); - - if (element != null) { - elements.push(element); - XmlReader.this.elementNames.push(new HashMap()); - attributeNames.push(new HashMap()); - final IXmlSerializable item = element.read(parent); - - item.readXml(parent); - for (int i = 0; i < attributes.getLength(); i++) { - Attribute attribute = attributeNames.peek().get(attributes.getQName(i)); - - if (attribute != null) { - attribute.read(attributes.getValue(i)); - } - } - items.push(item); - } else { - items.push(null); - elements.push(null); - XmlReader.this.elementNames.push(null); - attributeNames.push(null); - } - } - - public void endElement(String uri, String localName, String qName) throws SAXException { - elements.pop(); - final IXmlSerializable item = items.peek(); - final Element parentElement = elements.peek(); - - if (parentElement instanceof ListElement) { - ListElement le = (ListElement) parentElement; - - le.add(item); - } - items.pop(); - elementNames.pop(); - attributeNames.pop(); - final Map names = XmlReader.this.elementNames.peek(); - final Element element = names == null ? null : names.get(qName); - - if (element != null) { - if (element instanceof ElementClose) { - ElementClose ec = (ElementClose) element; - - ec.close(); - } - } - } - - } - - public Map getContext() { - return context; - } - - public Element expect(String name, Element element) { - elementNames.peek().put(name, element); - return element; - } - - public Element expect(String name, String altName, Element element) { - elementNames.peek().put(name, element); - elementNames.peek().put(altName, element); - return element; - } - - public Attribute expect(String name, Attribute attribute) { - attributeNames.peek().put(name, attribute); - return attribute; - } - - public Attribute expect(String name, String altName, Attribute attribute) { - attributeNames.peek().put(name, attribute); - attributeNames.peek().put(altName, attribute); - return attribute; - } - - public interface Element { - IXmlSerializable read(XmlReader reader); - } - - - public interface ElementClose extends Element { - void close(); - } - - - public interface ListElement extends ElementClose { - void add(IXmlSerializable child); - } - - - public interface Attribute { - void read(String value); - } - - public static Object deserialize(InputStream input, IXmlSerializable prototype) throws IOException { - try { - XmlReader xr = new XmlReader(input); - - return xr.deserialize(prototype); - } catch (SAXException e) { - throw new IOException(); - } catch (ParserConfigurationException e) { - throw new IOException(); - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlWriter.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlWriter.java deleted file mode 100644 index bbddec2..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/serialization/XmlWriter.java +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -import java.io.IOException; -import java.io.Writer; -import java.text.CharacterIterator; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.text.StringCharacterIterator; -import java.util.Locale; -import java.util.Stack; - - -/** - * @author Pavel Savara (original) - */ -public class XmlWriter { - private static final DecimalFormat decimalFormat = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US)); - private final Writer writer; - private final Stack elements = new Stack(); - private boolean headClosed = true; - private boolean innerElement = false; - private boolean indent = true; - - public XmlWriter(Writer writer, boolean indent) { - this.writer = writer; - this.indent = indent; - } - - public void startDocument() throws IOException { - writer.write("\n"); - } - - public void startElement(String name) throws IOException { - closeHead(); - indent(elements.size()); - elements.push(name); - writer.write('<'); - writer.write(encode(name)); - headClosed = false; - innerElement = false; - } - - public void writeAttribute(String name, String value) throws IOException { - if (value != null) { - writer.write(' '); - writer.write(encode(name)); - writer.write("=\""); - writer.write(encode(value)); - writer.write('"'); - } - } - - public void writeAttribute(String name, boolean value) throws IOException { - writeAttribute(name, Boolean.toString(value)); - } - - public void writeAttribute(String name, long value) throws IOException { - writeAttribute(name, Long.toString(value)); - } - - public void writeAttribute(String name, double value, boolean trim) throws IOException { - if (trim) { - writeAttribute(name, decimalFormat.format(value)); - } else { - writeAttribute(name, Double.toString(value)); - } - } - - public void endElement() throws IOException { - String name = elements.pop(); - - if (innerElement || headClosed) { - closeHead(); - indent(elements.size()); - writer.write(""); - } else { - writer.write("/>"); - headClosed = true; - } - newline(); - innerElement = true; - } - - private void newline() throws IOException { - if (indent) { - writer.write("\n"); - } - } - - private void closeHead() throws IOException { - if (!headClosed) { - writer.write('>'); - newline(); - headClosed = true; - } - } - - private void indent(int level) throws IOException { - if (indent) { - for (int i = 0; i < level; i++) { - writer.write("\t"); - } - } - } - - private static String encode(String text) { - final StringBuilder result = new StringBuilder(); - final StringCharacterIterator iterator = new StringCharacterIterator(text); - char character = iterator.current(); - - while (character != CharacterIterator.DONE) { - if (character == '<') { - result.append("<"); - } else if (character == '>') { - result.append(">"); - } else if (character == '&') { - result.append("&"); - } else if (character == '\"') { - result.append("""); - } else if (character == '\n') { - result.append(" "); - } else { - // the char is not a special one - // add it to the result as is - result.append(character); - } - character = iterator.next(); - } - return result.toString(); - } - -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsListener.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsListener.java deleted file mode 100644 index f779268..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsListener.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.settings; - - -/** - * @author Pavel Savara (original) - */ -public interface ISettingsListener { - void settingChanged(String property); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsManager.java deleted file mode 100644 index db43abb..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/ISettingsManager.java +++ /dev/null @@ -1,317 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.settings; - - -import java.awt.*; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Collection; -import java.util.Date; - - -/** - * @author Pavel Savara (original) - */ -public interface ISettingsManager { - void saveProperties(); - - boolean getOptionsViewRobotNames(); - - void setOptionsViewRobotNames(boolean optionsViewRobotNames); - - boolean getOptionsViewScanArcs(); - - void setOptionsViewScanArcs(boolean optionsViewScanArcs); - - boolean getOptionsViewRobotEnergy(); - - void setOptionsViewRobotEnergy(boolean optionsViewRobotEnergy); - - boolean getOptionsViewGround(); - - void setOptionsViewGround(boolean optionsViewGround); - - boolean getOptionsViewTPS(); - - void setOptionsViewTPS(boolean optionsViewTPS); - - boolean getOptionsViewFPS(); - - void setOptionsViewFPS(boolean optionsViewFPS); - - boolean getOptionsViewExplosions(); - - void setOptionsViewExplosions(boolean optionsViewExplosions); - - boolean getOptionsViewExplosionDebris(); - - void setOptionsViewExplosionDebris(boolean optionsViewExplosionDebris); - - boolean getOptionsViewSentryBorder(); - - void setOptionsViewSentryBorder(boolean optionsViewSentryBorder); - - boolean getOptionsViewPreventSpeedupWhenMinimized(); - - void setOptionsViewPreventSpeedupWhenMinimized(boolean preventSpeedupWhenMinimized); - - int getOptionsRenderingAntialiasing(); - - void setOptionsRenderingAntialiasing(int optionsRenderingAntialiasing); - - int getOptionsRenderingTextAntialiasing(); - - void setOptionsRenderingTextAntialiasing(int optionsRenderingTextAntialiasing); - - int getOptionsRenderingMethod(); - - void setOptionsRenderingMethod(int optionsRenderingMethod); - - RenderingHints getRenderingHints(); - - int getOptionsRenderingNoBuffers(); - - void setOptionsRenderingNoBuffers(int optionsRenderingNoBuffers); - - boolean getOptionsRenderingBufferImages(); - - void setOptionsRenderingBufferImages(boolean optionsRenderingBufferImages); - - boolean getOptionsRenderingForceBulletColor(); - - void setOptionsRenderingForceBulletColor(boolean optionsRenderingForceBulletColor); - - int getOptionsBattleDesiredTPS(); - - void setOptionsBattleDesiredTPS(int optionsBattleDesiredTPS); - - boolean getOptionsSoundEnableSound(); - - void setOptionsSoundEnableSound(boolean optionsSoundEnableSound); - - boolean getOptionsSoundEnableGunshot(); - - void setOptionsSoundEnableGunshot(boolean optionsSoundEnableGunshot); - - boolean getOptionsSoundEnableBulletHit(); - - void setOptionsSoundEnableBulletHit(boolean optionsSoundEnableBulletHit); - - boolean getOptionsSoundEnableRobotDeath(); - - void setOptionsSoundEnableRobotDeath(boolean optionsSoundEnableRobotDeath); - - boolean getOptionsSoundEnableWallCollision(); - - void setOptionsSoundEnableWallCollision(boolean optionsSoundEnableWallCollision); - - boolean getOptionsSoundEnableRobotCollision(); - - void setOptionsSoundEnableRobotCollision(boolean optionsSoundEnableRobotCollision); - - boolean getOptionsSoundEnableMixerVolume(); - - void setOptionsSoundMixer(String optionsSoundMixer); - - String getOptionsSoundMixer(); - - void setOptionsSoundEnableMixerVolume(boolean optionsSoundEnableMixerVolume); - - boolean getOptionsSoundEnableMixerPan(); - - void setOptionsSoundEnableMixerPan(boolean optionsSoundEnableMixerPan); - - boolean getOptionsTeamShowTeamRobots(); - - void setOptionsTeamShowTeamRobots(boolean optionsTeamShowTeamRobots); - - String getFileThemeMusic(); - - String getFileBackgroundMusic(); - - String getFileEndOfBattleMusic(); - - String getFileGunshotSfx(); - - String getBulletHitsRobotSfx(); - - String getBulletHitsBulletSfx(); - - String getRobotDeathSfx(); - - String getRobotCollisionSfx(); - - String getWallCollisionSfx(); - - Date getVersionChecked(); - - void setVersionChecked(Date versionChecked); - - long getRobotFilesystemQuota(); - - void setRobotFilesystemQuota(long robotFilesystemQuota); - - long getConsoleQuota(); - - void setConsoleQuota(long consoleQuota); - - long getCpuConstant(); - - void setCpuConstant(long cpuConstant); - - Collection getOptionsDevelopmentPaths(); - - void setOptionsDevelopmentPaths(Collection paths); - - Collection getOptionsExcludedDevelopmentPaths(); - - void setOptionsExcludedDevelopmentPaths(Collection excludedPaths); - - Collection getOptionsEnabledDevelopmentPaths(); - - boolean getOptionsCommonShowResults(); - - boolean getOptionsCommonDontHideRankings(); - - void setOptionsCommonDontHideRankings(boolean dontHide); - - void setOptionsCommonAppendWhenSavingResults(boolean enable); - - boolean getOptionsCommonAppendWhenSavingResults(); - - void setOptionsCommonShowResults(boolean enable); - - boolean getOptionsCommonEnableReplayRecording(); - - boolean getOptionsCommonEnableAutoRecording(); - - boolean getOptionsCommonAutoRecordingXML(); - - void setOptionsCommonEnableReplayRecording(boolean enable); - - void setOptionsCommonEnableAutoRecording(boolean enable); - - void setOptionsCommonEnableAutoRecordingXML(boolean enable); - - void setOptionsCommonNotifyAboutNewBetaVersions(boolean enable); - - boolean getOptionsCommonNotifyAboutNewBetaVersions(); - - int getBattleDefaultBattlefieldWidth(); - - void setBattleDefaultBattlefieldWidth(int battlefieldWidth); - - int getBattleDefaultBattlefieldHeight(); - - void setBattleDefaultBattlefieldHeight(int battlefieldHeight); - - double getBattleDefaultGunCoolingRate(); - - void setBattleDefaultGunCoolingRate(double gunCoolingRate); - - long getBattleDefaultInactivityTime(); - - void setBattleDefaultInactivityTime(long inactivityTime); - - int getBattleDefaultSentryBorderSize(); - - void setBattleDefaultSentryBorderSize(int sentryBorderSize); - - boolean getBattleDefaultHideEnemyNames(); - - void setBattleDefaultHideEnemyNames(boolean hideEnemyNames); - - int getBattleDefaultNumberOfRounds(); - - void setBattleDefaultNumberOfRounds(int numberOfRounds); - - void store(FileOutputStream out, String desc) throws IOException; - - void load(FileInputStream in) throws IOException; - - String getLastRunVersion(); - - void setLastRunVersion(String lastRunVersion); - - void addPropertyListener(ISettingsListener listener); - - void removePropertyListener(ISettingsListener propertyListener); - - public final static String - OPTIONS_VIEW_ROBOTNAMES = "robocode.options.view.robotNames", - OPTIONS_VIEW_SCANARCS = "robocode.options.view.scanArcs", - OPTIONS_VIEW_ROBOTENERGY = "robocode.options.view.robotEnergy", - OPTIONS_VIEW_GROUND = "robocode.options.view.ground", - OPTIONS_VIEW_TPS = "robocode.options.view.TPS", - OPTIONS_VIEW_FPS = "robocode.options.view.FPS", - OPTIONS_VIEW_EXPLOSIONS = "robocode.options.view.explosions", - OPTIONS_VIEW_EXPLOSION_DEBRIS = "robocode.options.view.explosionDebris", - OPTIONS_VIEW_SENTRY_BORDER = "robocode.options.view.sentryBorder", - - OPTIONS_BATTLE_DESIREDTPS = "robocode.options.battle.desiredTPS", - - OPTIONS_VIEW_PREVENT_SPEEDUP_WHEN_MINIMIZED = "robocode.options.view.preventSpeedupWhenMinimized", - - OPTIONS_RENDERING_ANTIALIASING = "robocode.options.rendering.antialiasing", - OPTIONS_RENDERING_TEXT_ANTIALIASING = "robocode.options.rendering.text.antialiasing", - OPTIONS_RENDERING_METHOD = "robocode.options.rendering.method", - OPTIONS_RENDERING_NO_BUFFERS = "robocode.options.rendering.noBuffers", - OPTIONS_RENDERING_BUFFER_IMAGES = "robocode.options.rendering.bufferImages", - OPTIONS_RENDERING_FORCE_BULLET_COLOR = "robocode.options.rendering.forceBulletColor", - - OPTIONS_SOUND_ENABLESOUND = "robocode.options.sound.enableSound", - OPTIONS_SOUND_ENABLEGUNSHOT = "robocode.options.sound.enableGunshot", - OPTIONS_SOUND_ENABLEBULLETHIT = "robocode.options.sound.enableBulletHit", - OPTIONS_SOUND_ENABLEROBOTDEATH = "robocode.options.sound.enableRobotDeath", - OPTIONS_SOUND_ENABLEWALLCOLLISION = "robocode.options.sound.enableWallCollision", - OPTIONS_SOUND_ENABLEROBOTCOLLISION = "robocode.options.sound.enableRobotCollision", - - OPTIONS_SOUND_MIXER = "robocode.options.sound.mixer", - OPTIONS_SOUND_ENABLEMIXERVOLUME = "robocode.options.sound.enableMixerVolume", - OPTIONS_SOUND_ENABLEMIXERPAN = "robocode.options.sound.enableMixerPan", - - OPTIONS_COMMON_NOTIFY_ABOUT_NEW_BETA_VERSIONS = "robocode.options.common.notifyAboutNewBetaVersions", - OPTIONS_COMMON_SHOW_RESULTS = "robocode.options.common.showResults", - OPTIONS_COMMON_DONT_HIDE_RANKINGS = "robocode.options.common.dontHideRankings", - OPTIONS_COMMON_APPEND_WHEN_SAVING_RESULTS = "robocode.options.common.appendWhenSavingResults", - OPTIONS_COMMON_ENABLE_REPLAY_RECORDING = "robocode.options.common.enableReplayRecording", - OPTIONS_COMMON_ENABLE_AUTO_RECORDING = "robocode.options.common.enableAutoRecording", - OPTIONS_COMMON_AUTO_RECORDING_XML = "robocode.options.common.autoRecordingXML", - - OPTIONS_TEAM_SHOWTEAMROBOTS = "robocode.options.team.showTeamRobots", - - OPTIONS_DEVELOPMENT_PATH = "robocode.options.development.path", - OPTIONS_DEVELOPMENT_PATH_EXCLUDED = "robocode.options.development.path.excluded", - - FILE_THEME_MUSIC = "robocode.file.music.theme", - FILE_BACKGROUND_MUSIC = "robocode.file.music.background", - FILE_END_OF_BATTLE_MUSIC = "robocode.file.music.endOfBattle", - - FILE_GUNSHOT_SFX = "robocode.file.sfx.gunshot", - FILE_ROBOT_COLLISION_SFX = "robocode.file.sfx.robotCollision", - FILE_WALL_COLLISION_SFX = "robocode.file.sfx.wallCollision", - FILE_ROBOT_DEATH_SFX = "robocode.file.sfx.robotDeath", - FILE_BULLET_HITS_ROBOT_SFX = "robocode.file.sfx.bulletHitsRobot", - FILE_BULLET_HITS_BULLET_SFX = "robocode.file.sfx.bulletHitsBullet", - - VERSIONCHECKED = "robocode.versionchecked", - ROBOT_FILESYSTEM_QUOTA = "robocode.robot.filesystem.quota", - CONSOLE_QUOTA = "robocode.console.quota", - CPU_CONSTANT = "robocode.cpu.constant", - LAST_RUN_VERSION = "robocode.version.lastrun", - - BATTLE_DEFAULT_BATTLEFIELD_WIDTH = "robocode.battle.default.battlefieldWidth", - BATTLE_DEFAULT_BATTLEFIELD_HEIGHT = "robocode.battle.default.battlefieldHeight", - BATTLE_DEFAULT_NUMBER_OF_ROUNDS = "robocode.battle.default.numberOfBattles", - BATTLE_DEFAULT_GUN_COOLING_RATE = "robocode.battle.default.gunCoolingRate", - BATTLE_DEFAULT_INACTIVITY_TIME = "robocode.battle.default.inactivityTime", - BATTLE_DEFAULT_SENTRY_BORDER_SIZE = "robocode.battle.default.sentryBorderSize", - BATTLE_DEFAULT_HIDE_ENEMY_NAMES = "robocode.battle.default.hideEnemyNames"; -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/SettingsManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/SettingsManager.java deleted file mode 100644 index 39c4a9c..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/settings/SettingsManager.java +++ /dev/null @@ -1,896 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.settings; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import static net.sf.robocode.io.Logger.logError; - -import java.awt.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Nathaniel Troutman (contributor) - */ -// TODO ZAMO, refactor, split by modules -public class SettingsManager implements ISettingsManager { - // Default SFX files - private final static String - DEFAULT_FILE_GUNSHOT_SFX = "/net/sf/robocode/sound/sounds/zap.wav", - DEFAULT_FILE_ROBOT_COLLISION_SFX = "/net/sf/robocode/sound/sounds/13831_adcbicycle_22.wav", - DEFAULT_FILE_WALL_COLLISION_SFX = DEFAULT_FILE_ROBOT_COLLISION_SFX, - DEFAULT_FILE_ROBOT_DEATH_SFX = "/net/sf/robocode/sound/sounds/explode.wav", - DEFAULT_FILE_BULLET_HITS_ROBOT_SFX = "/net/sf/robocode/sound/sounds/shellhit.wav", - DEFAULT_FILE_BULLET_HITS_BULLET_SFX = DEFAULT_FILE_BULLET_HITS_ROBOT_SFX; - - // View Options (Arena) - private boolean - optionsViewRobotEnergy = true, - optionsViewRobotNames = true, - optionsViewScanArcs = false, - optionsViewExplosions = true, - optionsViewGround = true, - optionsViewExplosionDebris = true, - optionsViewSentryBorder = false; - - // View Options (Turns Per Second) - private boolean - optionsViewTPS = true, - optionsViewFPS = true; - - // Prevent speedup when view is minimized - private boolean - optionsViewPreventSpeedupWhenMinimized = false; - - // Rendering Options - private int - optionsRenderingAntialiasing = 0, // 0 = default, 1 = on, 2 = off - optionsRenderingTextAntialiasing = 0, // 0 = default, 1 = on, 2 = off - optionsRenderingMethod = 0, // 0 = default, 1 = speed, 2 = quality - optionsRenderingNoBuffers = 2, // 1 = single buffering, 2 = double buffering, 3 = triple buffering - optionsBattleDesiredTPS = 30; - - private boolean - optionsRenderingBufferImages = true, - optionsRenderingForceBulletColor = false; - - // Sound Options (Sound Effects) - private boolean - optionsSoundEnableSound = false, - optionsSoundEnableGunshot = true, - optionsSoundEnableBulletHit = true, - optionsSoundEnableRobotDeath = true, - optionsSoundEnableWallCollision = true, - optionsSoundEnableRobotCollision = true; - - // Sound Options (Mixer) - private String optionsSoundMixer = "DirectAudioDevice"; - private boolean - optionsSoundEnableMixerVolume = true, - optionsSoundEnableMixerPan = true; - - // Development Options - private Collection - optionsDevelopmentPaths = new HashSet(), - optionsExcludedDevelopmentPaths = new HashSet(); - - // Common Options - private boolean - optionsCommonNotifyAboutNewBetaVersions = false, - optionsCommonShowResults = true, - optionsCommonAppendWhenSavingResults = true, - optionsCommonDontHideRankings = true, - optionsCommonEnableAutoRecording = false, - optionsCommonAutoRecordingXML = false, - optionsCommonEnableReplayRecording = false; - - // Team Options - private boolean optionsTeamShowTeamRobots = false; - - // Music files - private String - fileThemeMusic = "", - fileBackgroundMusic = "", - fileEndOfBattleMusic = ""; - - // SFX files - private String - fileGunshotSfx = DEFAULT_FILE_GUNSHOT_SFX, - fileRobotCollisionSfx = DEFAULT_FILE_ROBOT_COLLISION_SFX, - fileWallCollisionSfx = DEFAULT_FILE_WALL_COLLISION_SFX, - fileRobotDeathSfx = DEFAULT_FILE_ROBOT_DEATH_SFX, - fileBulletHitsRobotSfx = DEFAULT_FILE_BULLET_HITS_ROBOT_SFX, - fileBulletHitsBulletSfx = DEFAULT_FILE_BULLET_HITS_BULLET_SFX; - - // Robocode internals - private String lastRunVersion = ""; - private Date versionChecked; - private long robotFilesystemQuota = 200000; - private long consoleQuota = 8192; - private long cpuConstant = -1; - - // Battle default settings - private int battleDefaultBattlefieldWidth = 800; - private int battleDefaultBattlefieldHeight = 600; - private double battleDefaultGunCoolingRate = 0.1; - private long battleDefaultInactivityTime = 450; - private int battleDefaultSentryBorderSize = 100; - private boolean battleDefaultHideEnemyNames = false; - private int battleDefaultNumberOfRounds = 10; - - private final Properties props = new SortedProperties(); - - private final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy H:mm:ss"); - - private final RenderingHints renderingHints = new RenderingHints(new HashMap()); - - private final List listeners = new ArrayList(); - - public SettingsManager() { - FileInputStream in = null; - try { - in = new FileInputStream(FileUtil.getRobocodeConfigFile()); - this.load(in); - } catch (FileNotFoundException e) { - logError("No " + FileUtil.getRobocodeConfigFile().getName() + ". Using defaults."); - } catch (IOException e) { - logError("Error while reading " + FileUtil.getRobocodeConfigFile().getName() + ": " + e); - } finally { - if (in != null) { - // noinspection EmptyCatchBlock - try { - in.close(); - } catch (IOException e) {} - } - } - } - - public void saveProperties() { - FileOutputStream out = null; - try { - out = new FileOutputStream(FileUtil.getRobocodeConfigFile()); - this.store(out, "Robocode Properties"); - } catch (IOException e) { - Logger.logError(e); - } finally { - if (out != null) { - // noinspection EmptyCatchBlock - try { - out.close(); - } catch (IOException e) {} - } - } - } - - public boolean getOptionsViewRobotNames() { - return optionsViewRobotNames; - } - - public void setOptionsViewRobotNames(boolean optionsViewRobotNames) { - this.optionsViewRobotNames = optionsViewRobotNames; - props.setProperty(OPTIONS_VIEW_ROBOTNAMES, "" + optionsViewRobotNames); - } - - public boolean getOptionsViewScanArcs() { - return optionsViewScanArcs; - } - - public void setOptionsViewScanArcs(boolean optionsViewScanArcs) { - this.optionsViewScanArcs = optionsViewScanArcs; - props.setProperty(OPTIONS_VIEW_SCANARCS, "" + optionsViewScanArcs); - } - - public boolean getOptionsViewRobotEnergy() { - return optionsViewRobotEnergy; - } - - public void setOptionsViewRobotEnergy(boolean optionsViewRobotEnergy) { - this.optionsViewRobotEnergy = optionsViewRobotEnergy; - props.setProperty(OPTIONS_VIEW_ROBOTENERGY, "" + optionsViewRobotEnergy); - } - - public boolean getOptionsViewGround() { - return optionsViewGround; - } - - public void setOptionsViewGround(boolean optionsViewGround) { - this.optionsViewGround = optionsViewGround; - props.setProperty(OPTIONS_VIEW_GROUND, "" + optionsViewGround); - } - - public boolean getOptionsViewTPS() { - return optionsViewTPS; - } - - public void setOptionsViewTPS(boolean optionsViewTPS) { - this.optionsViewTPS = optionsViewTPS; - props.setProperty(OPTIONS_VIEW_TPS, "" + optionsViewTPS); - } - - public boolean getOptionsViewFPS() { - return optionsViewFPS; - } - - public void setOptionsViewFPS(boolean optionsViewFPS) { - this.optionsViewFPS = optionsViewFPS; - props.setProperty(OPTIONS_VIEW_FPS, "" + optionsViewFPS); - } - - public boolean getOptionsViewExplosions() { - return optionsViewExplosions; - } - - public void setOptionsViewExplosions(boolean optionsViewExplosions) { - this.optionsViewExplosions = optionsViewExplosions; - props.setProperty(OPTIONS_VIEW_EXPLOSIONS, "" + optionsViewExplosions); - } - - public boolean getOptionsViewExplosionDebris() { - return optionsViewExplosionDebris; - } - - public void setOptionsViewExplosionDebris(boolean optionsViewExplosionDebris) { - this.optionsViewExplosionDebris = optionsViewExplosionDebris; - props.setProperty(OPTIONS_VIEW_EXPLOSION_DEBRIS, "" + optionsViewExplosionDebris); - } - - public boolean getOptionsViewPreventSpeedupWhenMinimized() { - return optionsViewPreventSpeedupWhenMinimized; - } - - public void setOptionsViewPreventSpeedupWhenMinimized(boolean preventSpeedupWhenMinimized) { - this.optionsViewPreventSpeedupWhenMinimized = preventSpeedupWhenMinimized; - props.setProperty(OPTIONS_VIEW_PREVENT_SPEEDUP_WHEN_MINIMIZED, "" + preventSpeedupWhenMinimized); - } - - public boolean getOptionsViewSentryBorder() { - return optionsViewSentryBorder; - } - - public void setOptionsViewSentryBorder(boolean optionsViewSentryBorder) { - this.optionsViewSentryBorder = optionsViewSentryBorder; - props.setProperty(OPTIONS_VIEW_SENTRY_BORDER, "" + optionsViewSentryBorder); - } - - public int getOptionsRenderingAntialiasing() { - return optionsRenderingAntialiasing; - } - - public void setOptionsRenderingAntialiasing(int optionsRenderingAntialiasing) { - this.optionsRenderingAntialiasing = optionsRenderingAntialiasing; - props.setProperty(OPTIONS_RENDERING_ANTIALIASING, "" + optionsRenderingAntialiasing); - - Object value; - - switch (optionsRenderingAntialiasing) { - case 1: - value = RenderingHints.VALUE_ANTIALIAS_ON; - break; - - case 2: - value = RenderingHints.VALUE_ANTIALIAS_OFF; - break; - - case 0: - default: - value = RenderingHints.VALUE_ANTIALIAS_DEFAULT; - } - renderingHints.put(RenderingHints.KEY_ANTIALIASING, value); - } - - public int getOptionsRenderingTextAntialiasing() { - return optionsRenderingTextAntialiasing; - } - - public void setOptionsRenderingTextAntialiasing(int optionsRenderingTextAntialiasing) { - this.optionsRenderingTextAntialiasing = optionsRenderingTextAntialiasing; - props.setProperty(OPTIONS_RENDERING_TEXT_ANTIALIASING, "" + optionsRenderingTextAntialiasing); - - Object value; - - switch (optionsRenderingTextAntialiasing) { - case 1: - value = RenderingHints.VALUE_TEXT_ANTIALIAS_ON; - break; - - case 2: - value = RenderingHints.VALUE_TEXT_ANTIALIAS_OFF; - break; - - case 0: - default: - value = RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT; - } - renderingHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, value); - } - - public int getOptionsRenderingMethod() { - return optionsRenderingMethod; - } - - public void setOptionsRenderingMethod(int optionsRenderingMethod) { - this.optionsRenderingMethod = optionsRenderingMethod; - props.setProperty(OPTIONS_RENDERING_METHOD, "" + optionsRenderingMethod); - - Object value; - - switch (optionsRenderingMethod) { - case 1: - value = RenderingHints.VALUE_RENDER_QUALITY; - break; - - case 2: - value = RenderingHints.VALUE_RENDER_SPEED; - break; - - case 0: - default: - value = RenderingHints.VALUE_RENDER_DEFAULT; - } - renderingHints.put(RenderingHints.KEY_RENDERING, value); - } - - public RenderingHints getRenderingHints() { - return renderingHints; - } - - public int getOptionsRenderingNoBuffers() { - return optionsRenderingNoBuffers; - } - - public void setOptionsRenderingNoBuffers(int optionsRenderingNoBuffers) { - this.optionsRenderingNoBuffers = optionsRenderingNoBuffers; - props.setProperty(OPTIONS_RENDERING_NO_BUFFERS, "" + optionsRenderingNoBuffers); - } - - public boolean getOptionsRenderingBufferImages() { - return optionsRenderingBufferImages; - } - - public void setOptionsRenderingBufferImages(boolean optionsRenderingBufferImages) { - this.optionsRenderingBufferImages = optionsRenderingBufferImages; - props.setProperty(OPTIONS_RENDERING_BUFFER_IMAGES, "" + optionsRenderingBufferImages); - } - - public boolean getOptionsRenderingForceBulletColor() { - return optionsRenderingForceBulletColor; - } - - public void setOptionsRenderingForceBulletColor(boolean optionsRenderingForceBulletColor) { - this.optionsRenderingForceBulletColor = optionsRenderingForceBulletColor; - props.setProperty(OPTIONS_RENDERING_FORCE_BULLET_COLOR, "" + optionsRenderingForceBulletColor); - } - - public int getOptionsBattleDesiredTPS() { - return optionsBattleDesiredTPS; - } - - public void setOptionsBattleDesiredTPS(int optionsBattleDesiredTPS) { - this.optionsBattleDesiredTPS = optionsBattleDesiredTPS; - props.setProperty(OPTIONS_BATTLE_DESIREDTPS, "" + optionsBattleDesiredTPS); - } - - public boolean getOptionsSoundEnableSound() { - return optionsSoundEnableSound; - } - - public void setOptionsSoundEnableSound(boolean optionsSoundEnableSound) { - this.optionsSoundEnableSound = optionsSoundEnableSound; - props.setProperty(OPTIONS_SOUND_ENABLESOUND, "" + optionsSoundEnableSound); - } - - public boolean getOptionsSoundEnableGunshot() { - return optionsSoundEnableGunshot; - } - - public void setOptionsSoundEnableGunshot(boolean optionsSoundEnableGunshot) { - this.optionsSoundEnableGunshot = optionsSoundEnableGunshot; - props.setProperty(OPTIONS_SOUND_ENABLEGUNSHOT, "" + optionsSoundEnableGunshot); - } - - public boolean getOptionsSoundEnableBulletHit() { - return optionsSoundEnableBulletHit; - } - - public void setOptionsSoundEnableBulletHit(boolean optionsSoundEnableBulletHit) { - this.optionsSoundEnableBulletHit = optionsSoundEnableBulletHit; - props.setProperty(OPTIONS_SOUND_ENABLEBULLETHIT, "" + optionsSoundEnableBulletHit); - } - - public boolean getOptionsSoundEnableRobotDeath() { - return optionsSoundEnableRobotDeath; - } - - public void setOptionsSoundEnableRobotDeath(boolean optionsSoundEnableRobotDeath) { - this.optionsSoundEnableRobotDeath = optionsSoundEnableRobotDeath; - props.setProperty(OPTIONS_SOUND_ENABLEROBOTDEATH, "" + optionsSoundEnableRobotDeath); - } - - public boolean getOptionsSoundEnableWallCollision() { - return optionsSoundEnableWallCollision; - } - - public void setOptionsSoundEnableWallCollision(boolean optionsSoundEnableWallCollision) { - this.optionsSoundEnableWallCollision = optionsSoundEnableWallCollision; - props.setProperty(OPTIONS_SOUND_ENABLEWALLCOLLISION, "" + optionsSoundEnableWallCollision); - } - - public boolean getOptionsSoundEnableRobotCollision() { - return optionsSoundEnableRobotCollision; - } - - public void setOptionsSoundEnableRobotCollision(boolean optionsSoundEnableRobotCollision) { - this.optionsSoundEnableRobotCollision = optionsSoundEnableRobotCollision; - props.setProperty(OPTIONS_SOUND_ENABLEROBOTCOLLISION, "" + optionsSoundEnableRobotCollision); - } - - public boolean getOptionsSoundEnableMixerVolume() { - return optionsSoundEnableMixerVolume; - } - - public void setOptionsSoundMixer(String optionsSoundMixer) { - this.optionsSoundMixer = optionsSoundMixer; - props.setProperty(OPTIONS_SOUND_MIXER, optionsSoundMixer); - } - - public String getOptionsSoundMixer() { - return optionsSoundMixer; - } - - public void setOptionsSoundEnableMixerVolume(boolean optionsSoundEnableMixerVolume) { - this.optionsSoundEnableMixerVolume = optionsSoundEnableMixerVolume; - props.setProperty(OPTIONS_SOUND_ENABLEMIXERVOLUME, "" + optionsSoundEnableMixerVolume); - } - - public boolean getOptionsSoundEnableMixerPan() { - return optionsSoundEnableMixerPan; - } - - public void setOptionsSoundEnableMixerPan(boolean optionsSoundEnableMixerPan) { - this.optionsSoundEnableMixerPan = optionsSoundEnableMixerPan; - props.setProperty(OPTIONS_SOUND_ENABLEMIXERPAN, "" + optionsSoundEnableMixerPan); - } - - public boolean getOptionsTeamShowTeamRobots() { - return optionsTeamShowTeamRobots; - } - - public void setOptionsTeamShowTeamRobots(boolean optionsTeamShowTeamRobots) { - this.optionsTeamShowTeamRobots = optionsTeamShowTeamRobots; - props.setProperty(OPTIONS_TEAM_SHOWTEAMROBOTS, "" + optionsTeamShowTeamRobots); - } - - public String getFileThemeMusic() { - return fileThemeMusic; - } - - public String getFileBackgroundMusic() { - return fileBackgroundMusic; - } - - public String getFileEndOfBattleMusic() { - return fileEndOfBattleMusic; - } - - public String getFileGunshotSfx() { - return fileGunshotSfx; - } - - public String getBulletHitsRobotSfx() { - return fileBulletHitsRobotSfx; - } - - public String getBulletHitsBulletSfx() { - return fileBulletHitsBulletSfx; - } - - public String getRobotDeathSfx() { - return fileRobotDeathSfx; - } - - public String getRobotCollisionSfx() { - return fileRobotCollisionSfx; - } - - public String getWallCollisionSfx() { - return fileWallCollisionSfx; - } - - public Date getVersionChecked() { - return (versionChecked != null) ? (Date) versionChecked.clone() : null; - } - - public void setVersionChecked(Date versionChecked) { - this.versionChecked = (versionChecked != null) ? (Date) versionChecked.clone() : null; - props.setProperty(VERSIONCHECKED, dateFormat.format(new Date())); - } - - public long getRobotFilesystemQuota() { - return robotFilesystemQuota; - } - - public void setRobotFilesystemQuota(long robotFilesystemQuota) { - this.robotFilesystemQuota = robotFilesystemQuota; - props.setProperty(ROBOT_FILESYSTEM_QUOTA, "" + robotFilesystemQuota); - } - - public long getConsoleQuota() { - return consoleQuota; - } - - public void setConsoleQuota(long consoleQuota) { - this.consoleQuota = consoleQuota; - props.setProperty(CONSOLE_QUOTA, "" + consoleQuota); - } - - public long getCpuConstant() { - return cpuConstant; - } - - public void setCpuConstant(long cpuConstant) { - this.cpuConstant = cpuConstant; - props.setProperty(CPU_CONSTANT, "" + cpuConstant); - } - - public Collection getOptionsDevelopmentPaths() { - return new HashSet(optionsDevelopmentPaths); - } - - public void setOptionsDevelopmentPaths(Collection paths) { - this.optionsDevelopmentPaths = new HashSet(paths); - - props.setProperty(OPTIONS_DEVELOPMENT_PATH, toCommaSeparatedString(paths)); - } - - public Collection getOptionsExcludedDevelopmentPaths() { - return new HashSet(optionsExcludedDevelopmentPaths); - } - - public void setOptionsExcludedDevelopmentPaths(Collection paths) { - this.optionsExcludedDevelopmentPaths = new HashSet(paths); - - props.setProperty(OPTIONS_DEVELOPMENT_PATH_EXCLUDED, toCommaSeparatedString(paths)); - } - - public Collection getOptionsEnabledDevelopmentPaths() { - Collection paths = getOptionsDevelopmentPaths(); - - paths.removeAll(getOptionsExcludedDevelopmentPaths()); - return paths; - } - - public boolean getOptionsCommonShowResults() { - return optionsCommonShowResults; - } - - public void setOptionsCommonAppendWhenSavingResults(boolean enable) { - this.optionsCommonAppendWhenSavingResults = enable; - props.setProperty(OPTIONS_COMMON_APPEND_WHEN_SAVING_RESULTS, "" + enable); - } - - public boolean getOptionsCommonAppendWhenSavingResults() { - return optionsCommonAppendWhenSavingResults; - } - - public void setOptionsCommonShowResults(boolean enable) { - this.optionsCommonShowResults = enable; - props.setProperty(OPTIONS_COMMON_SHOW_RESULTS, "" + enable); - } - - public boolean getOptionsCommonDontHideRankings() { - return optionsCommonDontHideRankings; - } - - public void setOptionsCommonDontHideRankings(boolean enable) { - this.optionsCommonDontHideRankings = enable; - props.setProperty(OPTIONS_COMMON_DONT_HIDE_RANKINGS, "" + enable); - } - - public boolean getOptionsCommonEnableReplayRecording() { - return optionsCommonEnableReplayRecording; - } - - public void setOptionsCommonEnableReplayRecording(boolean enable) { - this.optionsCommonEnableReplayRecording = enable; - props.setProperty(OPTIONS_COMMON_ENABLE_REPLAY_RECORDING, "" + enable); - } - - public boolean getOptionsCommonEnableAutoRecording() { - return optionsCommonEnableAutoRecording; - } - - public boolean getOptionsCommonAutoRecordingXML() { - return optionsCommonAutoRecordingXML; - } - - public void setOptionsCommonEnableAutoRecording(boolean enable) { - this.optionsCommonEnableAutoRecording = enable; - props.setProperty(OPTIONS_COMMON_ENABLE_AUTO_RECORDING, "" + enable); - } - - public void setOptionsCommonEnableAutoRecordingXML(boolean enable) { - this.optionsCommonAutoRecordingXML = enable; - props.setProperty(OPTIONS_COMMON_AUTO_RECORDING_XML, "" + enable); - } - - public void setOptionsCommonNotifyAboutNewBetaVersions(boolean enable) { - this.optionsCommonNotifyAboutNewBetaVersions = enable; - props.setProperty(OPTIONS_COMMON_NOTIFY_ABOUT_NEW_BETA_VERSIONS, "" + enable); - } - - public boolean getOptionsCommonNotifyAboutNewBetaVersions() { - return optionsCommonNotifyAboutNewBetaVersions; - } - - public int getBattleDefaultBattlefieldWidth() { - return battleDefaultBattlefieldWidth; - } - - public void setBattleDefaultBattlefieldWidth(int battlefieldWidth) { - this.battleDefaultBattlefieldWidth = Math.max(400, battlefieldWidth); - props.setProperty(BATTLE_DEFAULT_BATTLEFIELD_WIDTH, "" + this.battleDefaultBattlefieldWidth); - } - - public int getBattleDefaultBattlefieldHeight() { - return battleDefaultBattlefieldHeight; - } - - public void setBattleDefaultBattlefieldHeight(int battlefieldHeight) { - this.battleDefaultBattlefieldHeight = Math.max(400, battlefieldHeight); - props.setProperty(BATTLE_DEFAULT_BATTLEFIELD_HEIGHT, "" + this.battleDefaultBattlefieldHeight); - } - - public double getBattleDefaultGunCoolingRate() { - return battleDefaultGunCoolingRate; - } - - public void setBattleDefaultGunCoolingRate(double gunCoolingRate) { - this.battleDefaultGunCoolingRate = Math.max(0.1, gunCoolingRate); - props.setProperty(BATTLE_DEFAULT_GUN_COOLING_RATE, "" + this.battleDefaultGunCoolingRate); - } - - public long getBattleDefaultInactivityTime() { - return battleDefaultInactivityTime; - } - - public void setBattleDefaultInactivityTime(long inactivityTime) { - this.battleDefaultInactivityTime = Math.max(0, inactivityTime); - props.setProperty(BATTLE_DEFAULT_INACTIVITY_TIME, "" + this.battleDefaultInactivityTime); - } - - public int getBattleDefaultSentryBorderSize() { - return battleDefaultSentryBorderSize; - } - - public void setBattleDefaultSentryBorderSize(int sentryBorderSize) { - this.battleDefaultSentryBorderSize = sentryBorderSize; - props.setProperty(BATTLE_DEFAULT_SENTRY_BORDER_SIZE, "" + this.battleDefaultSentryBorderSize); - } - - public boolean getBattleDefaultHideEnemyNames() { - return battleDefaultHideEnemyNames; - } - - public void setBattleDefaultHideEnemyNames(boolean hideEnemyNames) { - this.battleDefaultHideEnemyNames = hideEnemyNames; - props.setProperty(BATTLE_DEFAULT_HIDE_ENEMY_NAMES, "" + this.battleDefaultHideEnemyNames); - } - - public int getBattleDefaultNumberOfRounds() { - return battleDefaultNumberOfRounds; - } - - public void setBattleDefaultNumberOfRounds(int numberOfRounds) { - this.battleDefaultNumberOfRounds = Math.max(1, numberOfRounds); - props.setProperty(BATTLE_DEFAULT_NUMBER_OF_ROUNDS, "" + this.battleDefaultNumberOfRounds); - } - - public void store(FileOutputStream out, String desc) throws IOException { - props.store(out, desc); - } - - public void load(FileInputStream in) throws IOException { - props.load(in); - - optionsViewRobotNames = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_ROBOTNAMES, "true")); - optionsViewScanArcs = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_SCANARCS, "false")); - optionsViewRobotEnergy = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_ROBOTENERGY, "true")); - optionsViewGround = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_GROUND, "true")); - optionsViewTPS = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_TPS, "true")); - optionsViewFPS = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_FPS, "true")); - optionsViewExplosions = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_EXPLOSIONS, "true")); - optionsViewExplosionDebris = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_EXPLOSION_DEBRIS, "true")); - optionsViewSentryBorder = Boolean.valueOf(props.getProperty(OPTIONS_VIEW_SENTRY_BORDER, "false")); - optionsViewPreventSpeedupWhenMinimized = Boolean.valueOf( - props.getProperty(OPTIONS_VIEW_PREVENT_SPEEDUP_WHEN_MINIMIZED, "false")); - - optionsBattleDesiredTPS = Integer.parseInt(props.getProperty(OPTIONS_BATTLE_DESIREDTPS, "30")); - - // set methods are used here in order to set the rendering hints, which must be rebuild - setOptionsRenderingAntialiasing(Integer.parseInt(props.getProperty(OPTIONS_RENDERING_ANTIALIASING, "0"))); - setOptionsRenderingTextAntialiasing( - Integer.parseInt(props.getProperty(OPTIONS_RENDERING_TEXT_ANTIALIASING, "0"))); - setOptionsRenderingMethod(Integer.parseInt(props.getProperty(OPTIONS_RENDERING_METHOD, "0"))); - optionsRenderingNoBuffers = Integer.parseInt(props.getProperty(OPTIONS_RENDERING_NO_BUFFERS, "2")); - optionsRenderingBufferImages = Boolean.valueOf(props.getProperty(OPTIONS_RENDERING_BUFFER_IMAGES, "true")); - optionsRenderingForceBulletColor = Boolean.valueOf( - props.getProperty(OPTIONS_RENDERING_FORCE_BULLET_COLOR, "false")); - - optionsSoundEnableSound = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLESOUND, "false")); - optionsSoundEnableGunshot = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLEGUNSHOT, "true")); - optionsSoundEnableBulletHit = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLEBULLETHIT, "true")); - optionsSoundEnableRobotDeath = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLEROBOTDEATH, "true")); - optionsSoundEnableRobotCollision = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLEROBOTCOLLISION, "true")); - optionsSoundEnableWallCollision = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLEWALLCOLLISION, "true")); - - optionsSoundMixer = props.getProperty(OPTIONS_SOUND_MIXER, "DirectAudioDevice"); - optionsSoundEnableMixerVolume = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLEMIXERVOLUME, "true")); - optionsSoundEnableMixerPan = Boolean.valueOf(props.getProperty(OPTIONS_SOUND_ENABLEMIXERPAN, "true")); - - optionsDevelopmentPaths = fromCommaSeparatedString(props.getProperty(OPTIONS_DEVELOPMENT_PATH, "")); - optionsExcludedDevelopmentPaths = fromCommaSeparatedString( - props.getProperty(OPTIONS_DEVELOPMENT_PATH_EXCLUDED, "")); - - optionsCommonNotifyAboutNewBetaVersions = Boolean.valueOf( - props.getProperty(OPTIONS_COMMON_NOTIFY_ABOUT_NEW_BETA_VERSIONS, "false")); - optionsCommonShowResults = Boolean.valueOf(props.getProperty(OPTIONS_COMMON_SHOW_RESULTS, "true")); - optionsCommonAppendWhenSavingResults = Boolean.valueOf( - props.getProperty(OPTIONS_COMMON_APPEND_WHEN_SAVING_RESULTS, "true")); - optionsCommonDontHideRankings = Boolean.valueOf(props.getProperty(OPTIONS_COMMON_DONT_HIDE_RANKINGS, "true")); - optionsCommonEnableReplayRecording = Boolean.valueOf( - props.getProperty(OPTIONS_COMMON_ENABLE_REPLAY_RECORDING, "false")); - optionsCommonEnableAutoRecording = Boolean.valueOf( - props.getProperty(OPTIONS_COMMON_ENABLE_AUTO_RECORDING, "false")); - optionsCommonAutoRecordingXML = Boolean.valueOf(props.getProperty(OPTIONS_COMMON_AUTO_RECORDING_XML, "false")); - - optionsTeamShowTeamRobots = Boolean.valueOf(props.getProperty(OPTIONS_TEAM_SHOWTEAMROBOTS, "false")); - - fileThemeMusic = props.getProperty(FILE_THEME_MUSIC); - fileBackgroundMusic = props.getProperty(FILE_BACKGROUND_MUSIC); - fileEndOfBattleMusic = props.getProperty(FILE_END_OF_BATTLE_MUSIC); - - fileGunshotSfx = props.getProperty(FILE_GUNSHOT_SFX, DEFAULT_FILE_GUNSHOT_SFX); - fileRobotCollisionSfx = props.getProperty(FILE_ROBOT_COLLISION_SFX, DEFAULT_FILE_ROBOT_COLLISION_SFX); - fileWallCollisionSfx = props.getProperty(FILE_WALL_COLLISION_SFX, DEFAULT_FILE_WALL_COLLISION_SFX); - fileRobotDeathSfx = props.getProperty(FILE_ROBOT_DEATH_SFX, DEFAULT_FILE_ROBOT_DEATH_SFX); - fileBulletHitsRobotSfx = props.getProperty(FILE_BULLET_HITS_ROBOT_SFX, DEFAULT_FILE_BULLET_HITS_ROBOT_SFX); - fileBulletHitsBulletSfx = props.getProperty(FILE_BULLET_HITS_BULLET_SFX, DEFAULT_FILE_BULLET_HITS_BULLET_SFX); - - lastRunVersion = props.getProperty(LAST_RUN_VERSION, ""); - - props.remove("robocode.cpu.constant.1000"); - - try { - versionChecked = dateFormat.parse(props.getProperty(VERSIONCHECKED)); - } catch (Exception e) { - Logger.logMessage("Initializing version check date."); - setVersionChecked(new Date()); - } - - battleDefaultBattlefieldWidth = Integer.parseInt(props.getProperty(BATTLE_DEFAULT_BATTLEFIELD_WIDTH, "800")); - battleDefaultBattlefieldHeight = Integer.parseInt(props.getProperty(BATTLE_DEFAULT_BATTLEFIELD_HEIGHT, "600")); - battleDefaultGunCoolingRate = Double.parseDouble(props.getProperty(BATTLE_DEFAULT_GUN_COOLING_RATE, "0.1")); - battleDefaultInactivityTime = Long.parseLong(props.getProperty(BATTLE_DEFAULT_INACTIVITY_TIME, "450")); - battleDefaultHideEnemyNames = Boolean.parseBoolean(props.getProperty(BATTLE_DEFAULT_HIDE_ENEMY_NAMES, "false")); - battleDefaultNumberOfRounds = Integer.parseInt(props.getProperty(BATTLE_DEFAULT_NUMBER_OF_ROUNDS, "10")); - - robotFilesystemQuota = Long.parseLong(props.getProperty(ROBOT_FILESYSTEM_QUOTA, "" + 200000)); - consoleQuota = Long.parseLong(props.getProperty(CONSOLE_QUOTA, "8192")); - cpuConstant = Long.parseLong(props.getProperty(CPU_CONSTANT, "-1")); - } - - public String getLastRunVersion() { - return lastRunVersion; - } - - public void setLastRunVersion(String lastRunVersion) { - this.lastRunVersion = lastRunVersion; - props.setProperty(LAST_RUN_VERSION, "" + lastRunVersion); - } - - public void addPropertyListener(ISettingsListener listener) { - listeners.add(listener); - } - - public void removePropertyListener(ISettingsListener propertyListener) { - listeners.remove(propertyListener); - } - - private void notifyPropertyChanged(String name) { - for (ISettingsListener listener : listeners) { - try { - listener.settingChanged(name); - } catch (Exception e) { - Logger.logError(e); - } - } - } - - /** - * Returns a comma-separated string from a collection of strings. - */ - private static String toCommaSeparatedString(Collection strings) { - if (strings == null || strings.size() == 0) { - return ""; - } - StringBuilder sb = new StringBuilder(); - - for (String s : strings) { - sb.append(s).append(','); - } - String line = sb.toString(); - - return line.substring(0, line.length() - 1); - } - - /** - * Returns a collection of strings from a comma-separated string. - */ - private static Collection fromCommaSeparatedString(String line) { - if (line == null || line.trim().length() == 0) { - return new HashSet(); - } - Set set = new HashSet(); - String splitExpr = File.pathSeparatorChar == ':' ? "[,:]+" : "[,;]+"; - String[] strings = line.split(splitExpr); - - for (String s : strings) { - set.add(s); - } - return set; - } - - /** - * Sorted properties used for sorting the keys for the properties file. - * - * @author Flemming N. Larsen - */ - private class SortedProperties extends Properties { - private static final long serialVersionUID = 1L; - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Enumeration keys() { - Enumeration keysEnum = super.keys(); - - Vector keyList = new Vector(); - - while (keysEnum.hasMoreElements()) { - keyList.add((String) keysEnum.nextElement()); - } - - Collections.sort(keyList); - - // noinspection RedundantCast - return (Enumeration) keyList.elements(); - } - - @Override - public synchronized Object setProperty(String key, String value) { - final String old = super.getProperty(key, null); - boolean notify = (old == null && value != null) || (old != null && !old.equals(value)); - final Object res = super.setProperty(key, value); - - if (notify) { - notifyPropertyChanged(key); - } - return res; - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/sound/ISoundManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/sound/ISoundManager.java deleted file mode 100644 index 691a57f..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/sound/ISoundManager.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.sound; - - -/** - * @author Pavel Savara (original) - */ -public interface ISoundManager { - void setEnableSound(boolean enable); - - void playThemeMusic(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/ui/IWindowManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/ui/IWindowManager.java deleted file mode 100644 index 80be36a..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/ui/IWindowManager.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.gui.IWindowManagerBase; -import robocode.control.events.IBattleListener; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; - - -/** - * @author Pavel Savara (original) - */ -public interface IWindowManager extends IWindowManagerBase { - void init(); - - void setEnableGUI(boolean enable); - - boolean isGUIEnabled(); - - boolean isSlave(); - - boolean isShowResultsEnabled(); - - boolean isIconified(); - - void setSlave(boolean slave); - - void showRobocodeFrame(boolean visible, boolean iconified); - - void showSplashScreen(); - - void cleanup(); - - JFrame getRobocodeFrame(); - - void setBusyPointer(boolean enabled); - - void setStatus(String s); - - ITurnSnapshot getLastSnapshot(); - - void addBattleListener(IBattleListener listener); - - void removeBattleListener(IBattleListener listener); - - void runIntroBattle(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/util/AlphanumericComparator.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/util/AlphanumericComparator.java deleted file mode 100644 index 0bace67..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/util/AlphanumericComparator.java +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.util; - - -import java.util.Comparator; - -import static java.lang.Character.isDigit; - - -/** - * This is a comparator used for comparing two alphanumeric strings. - * Normally strings are sorted one character at a time, meaning that e.g. "1.22" comes before "1.3". - * However, with alphanumeric sorting, "1.3" comes before "1.22", as 3 is lesser than 22. - * This comparator also others letter in this order "A", "a", "B", "b" instead of the normal character - * order "A", "B", "a", "b". - * - * Example of usage: - *
- *    String[] strings = new String[] { "1.22", "1.3", "A", "B", "a", "b" };
- *
- *    Arrays.sort(strings, new AlphanumericComparator());
- *	
- *    for (String s : strings) {
- *        System.out.println(s);
- *    }
- * 
- * - * @author Flemming N. Larsen - */ -public class AlphanumericComparator implements Comparator, java.io.Serializable { - - private static final long serialVersionUID = 1L; - - /** - * Compares two alphanumeric strings. - * - * @param str1 the first string to be compared. - * @param str2 the second string to be compared. - * @return a negative integer, zero, or a positive integer as the first string is less than, equal to, or greater - * than the second. - */ - public int compare(final String str1, final String str2) { - - // Checks against null strings - if (str1 == null) { - return (str2 == null) ? 0 : 1; - } - if (str2 == null) { - return -1; - } - if (str1.equals(str2)) { - return 0; - } - - // Main loop where we keep read tokens from both input strings until the tokens differ - - String tok1; - int result = 0; - - for (int index = 0;; index += tok1.length()) { - tok1 = readToken(str1, index); - - result = compareTokens(tok1, readToken(str2, index)); - if (result != 0) { - return result; - } - } - } - - /** - * Reads a token from the specified input string from a start index. - * - * @param input the input string. - * @param startIndex the start index of the token to read. - * @return the read token or null if there is no token could be read. - */ - private static String readToken(final String input, final int startIndex) { - - // Return null if the input string is null or the startIndex is out of bounds - if (input == null || startIndex >= input.length()) { - return null; - } - - int index = startIndex + 1; - - // Check if the next token is numeric or not - if (isDigit(input.charAt(startIndex))) { - // Handle numeric token, which contains only digits in one continuous sequence - for (; index < input.length() && isDigit(input.charAt(index)); index++) { - ; - } - } else { - // Handle all other tokens that does not contain any digits - for (; index < input.length() && !isDigit(input.charAt(index)); index++) { - ; - } - } - - // Return our token - return input.substring(startIndex, index); - } - - /** - * Compares two tokens. - * - * @param tok1 the first token to be compared. - * @param tok2 the second token to be compared. - * @return a negative integer, zero, or a positive integer as the first token is less than, equal to, or greater - * than the second. - */ - private static int compareTokens(final String tok1, final String tok2) { - - // Checks against null strings - if (tok1 == null) { - return (tok2 == null) ? 0 : 1; - } - if (tok2 == null) { - return -1; - } - - // A numeric token has precedence over other tokens - - if (isDigit(tok1.charAt(0))) { - if (isDigit(tok2.charAt(0))) { - // Two numeric tokens are compared as two long values - return (int) (Long.parseLong(tok1) - Long.parseLong(tok2)); - } - return -1; - } else if (isDigit(tok2.charAt(0))) { - return 1; - } - - // Compare two non-numeric tokens in alphabetic order. - // That is, we want "A", "a", "B", "b" instead of "A", "B", "a", "b" - - int result = tok1.toUpperCase().compareTo(tok2.toUpperCase()); - - if (result != 0) { - return result; - } - return tok1.compareTo(tok2); - } - - /* Example application where output must be: - "1.2" - "1.3" - "1.22A" - "1.22" - "1c" - "1h" - "1p" - "2.1.1" - "2.1a" - "2.10.2" - "2.10a.1" - "2.10" - " " - "ALPHA" - "ALpha" - "Alpha1" - "Alpha2" - "Alpha" - "alPHA" - "alpha1" - "alpha2" - "alpha" - "alpha" - "BETA" - "BEta" - "BeTa" - "bEtA" - "beTA" - "beta" - "" - - */ - public static void main(String... args) { - // Our unsorted strings that must be sorted - final String[] strings = { - null, "", " ", "alpha2", "alpha1", "bEtA", "BeTa", "alpha", "Alpha2", "Alpha1", "Alpha", "1.2", "1.22", - "1.22A", "1.3", "2.10a.1", "2.1.1", "2.10", "2.1a", "2.10.2", "1c", "1h", "1p", "alpha", "beta", "alPHA", - "beTA", "ALpha", "BEta", "ALPHA", "BETA" - }; - - java.util.Arrays.sort(strings, new AlphanumericComparator()); - - for (String s : strings) { - System.out.println(s == null ? "" : '"' + s + '"'); - } - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/IVersionManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/IVersionManager.java deleted file mode 100644 index 3c9dd32..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/IVersionManager.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.version; - - -import net.sf.robocode.manager.IVersionManagerBase; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public interface IVersionManager extends IVersionManagerBase { - String checkForNewVersion(); -} diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/Version.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/Version.java deleted file mode 100644 index 88ac8a5..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/Version.java +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.version; - - -/** - * @author Flemming N. Larsen (original) - */ -public class Version implements Comparable { - - private final String version; - - // The allowed format is ... where all of these are ints - private final int major; - private final int minor; - private final int revision; - private final int build; - - // , e.g. in "Beta 3" the maturity is 2, and maturity version is 3 - private final int maturity; // Alpha is 1, Beta is 2, Final is 3 - private final int maturity_version; // The number following e.g. "Alpha" or "Beta" - - public Version(String version) { - - // Validate version format - if (!version.matches("\\s*[0-9]+\\.[0-9]+(\\.[0-9]+)?(\\.[0-9]+)?(\\s?(([aA]lpha)|([bB]eta))(\\s?[0-9]+)?)?\\s*")) { - throw new IllegalArgumentException("The format of the version string is not a valid"); - } - version = version.trim(); - this.version = version; - - // Split the version number into its integer numbers - final String[] numbers = version.split("\\."); - - // Parse the major version - int major = 0; - - if (numbers.length >= 1) { - try { - major = Integer.parseInt(numbers[0]); - } catch (NumberFormatException ignore) {} - } - this.major = major; - - // Parse the minor version - int minor = 0; - - if (numbers.length >= 2) { - try { - String[] split = numbers[1].split("\\s++|([aA]lpha)|([bB]eta)"); - - minor = Integer.parseInt(split[0]); - } catch (NumberFormatException ignore) {} - } - this.minor = minor; - - // Parse the revision - int revision = 0; - - if (numbers.length >= 3) { - try { - String[] split = numbers[2].split("\\s++|([aA]lpha)|([bB]eta)"); - - revision = Integer.parseInt(split[0]); - } catch (NumberFormatException ignore) {} - } - this.revision = revision; - - // Parse the build number - int build = 0; - - if (numbers.length >= 4) { - try { - String[] split = numbers[3].split("\\s++|([aA]lpha)|([bB]eta)"); - - build = Integer.parseInt(split[0]); - } catch (NumberFormatException ignore) {} - } - this.build = build; - - // Parse the maturity version, e.g. "Beta 1" - int maturity; - int maturity_version = 1; - - if (isAlpha()) { - maturity = 1; - final String[] split = version.split("[aA]lpha"); - - if (split.length >= 2) { - maturity_version = Integer.parseInt(split[1].trim()); - } - } else if (isBeta()) { - maturity = 2; - final String[] split = version.split("[bB]eta"); - - if (split.length >= 2) { - maturity_version = Integer.parseInt(split[1].trim()); - } - } else { - maturity = 3; - } - this.maturity = maturity; - this.maturity_version = maturity_version; - } - - public boolean isAlpha() { - return (version.matches(".*[aA]lpha.*")); - } - - public boolean isBeta() { - return (version.matches(".*[bB]eta.*")); - } - - public boolean isFinal() { - return !(isAlpha() || isBeta()); - } - - public int getMajor() { - return major; - } - - public int getMinor() { - return minor; - } - - public int getRevision() { - return revision; - } - - public int getBuild() { - return build; - } - - @Override - public String toString() { - return version; - } - - public int compareTo(Object o) { - if (o == null) { - throw new IllegalArgumentException("The input object cannot be null"); - } - if (o instanceof String) { - return compareTo(new Version((String) o)); - } - if (o instanceof Version) { - Version v = (Version) o; - - long delta = getVersionLong() - v.getVersionLong(); - - return (delta == 0) ? 0 : (delta < 0) ? -1 : 1; - } - throw new IllegalArgumentException("The input object must be a String or Version object"); - } - - private long getVersionLong() { - return ((long) major << 40) + ((long) minor << 32) + (revision << 24) + (build << 16) + (maturity << 8) - + maturity_version; - } - - public static int compare(String oneVersion, String anotherVersion) { - return new Version(oneVersion).compareTo(new Version(anotherVersion)); - } - - public static boolean isBeta(String version) { - return new Version(version).isBeta(); - } - - public static boolean isFinal(String version) { - return new Version(version).isFinal(); - } -} - diff --git a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/VersionManager.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/VersionManager.java deleted file mode 100644 index 774b557..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/version/VersionManager.java +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.version; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.RobocodeProperties; -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logMessage; -import static net.sf.robocode.io.Logger.logWarning; -import net.sf.robocode.settings.ISettingsManager; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - - -/** - * @author Mathew A. Nelson (original) - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public final class VersionManager implements IVersionManager { - - private static final String VERSIONS_TXT = "versions.md"; - private static final String UNKNOWN_VERSION = "unknown"; - - private static Version version; - - private final boolean versionChanged; - - public VersionManager(ISettingsManager settingsManager) { // NO_UCD (unused code) - if (settingsManager != null) { - versionChanged = !settingsManager.getLastRunVersion().equals(getVersion()); - if (versionChanged) { - settingsManager.setLastRunVersion(getVersion()); - } - } else { - versionChanged = false; - } - } - - public String checkForNewVersion() { - String newVersLine = null; - InputStream inputStream = null; - InputStreamReader inputStreamReader = null; - BufferedReader reader = null; - - try { - URL url = new URL("http://robocode.sourceforge.net/version/version.html"); - - URLConnection urlConnection = url.openConnection(); - - urlConnection.setConnectTimeout(5000); - - if (urlConnection instanceof HttpURLConnection) { - logMessage("Update checking with http."); - HttpURLConnection h = (HttpURLConnection) urlConnection; - - if (h.usingProxy()) { - logMessage("http using proxy."); - } - } - inputStream = urlConnection.getInputStream(); - inputStreamReader = new InputStreamReader(inputStream); - reader = new BufferedReader(inputStreamReader); - - newVersLine = reader.readLine(); - - } catch (MalformedURLException e) { - logError("Unable to check for new version", e); - newVersLine = null; - } catch (IOException e) { - logError("Unable to check for new version", e); - newVersLine = null; - } finally { - FileUtil.cleanupStream(inputStream); - FileUtil.cleanupStream(inputStreamReader); - FileUtil.cleanupStream(reader); - } - return newVersLine; - } - - public String getVersion() { - return getVersionInstance().toString(); - } - - private static Version getVersionInstance() { - if (version == null) { - version = new Version(getVersionFromJar()); - } - return version; - } - - public boolean isLastRunVersionChanged() { - return versionChanged; - } - - public String getVersionN() { - Version v = getVersionInstance(); - - return v.getMajor() + "." + v.getMinor() + "." + v.getRevision() + "." + v.getBuild(); - } - - public int getVersionAsInt() { - Version v = getVersionInstance(); - - return (v.getMajor() << 24) + (v.getMinor() << 16) + (v.getRevision() << 8) + v.getBuild(); - } - - private static String getVersionFromJar() { - String versionString = null; - - BufferedReader in = null; - - try { - URL versionsUrl = VersionManager.class.getResource("/" + VERSIONS_TXT); - - if (versionsUrl == null) { - logError("The URL for the " + VERSIONS_TXT + " was not found"); - versionString = UNKNOWN_VERSION; - } else { - final URLConnection connection = versionsUrl.openConnection(); - - connection.setUseCaches(false); - final InputStream is = connection.getInputStream(); - - in = new BufferedReader(new InputStreamReader(is)); - - versionString = in.readLine(); - while (versionString != null && !versionString.startsWith("## Version ")) { - versionString = in.readLine(); - } - } - } catch (FileNotFoundException e) { - logError("No " + VERSIONS_TXT + " file in robocode.jar"); - versionString = UNKNOWN_VERSION; - } catch (IOException e) { - logError("Error while reading " + VERSIONS_TXT + " from robocode.jar: " + e); - versionString = UNKNOWN_VERSION; - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) {} - } - } - - String version = UNKNOWN_VERSION; - - if (versionString != null && !versionString.equals(UNKNOWN_VERSION)) { - try { - version = versionFileLineToVersion(versionString); - } catch (Exception ignore) {} - } - if (version.equals(UNKNOWN_VERSION)) { - logWarning("Getting version from file"); - return getVersionFromFile(); - } - return version; - } - - private static String getVersionFromFile() { - String versionString = null; - - FileReader fileReader = null; - BufferedReader in = null; - - try { - File dir = FileUtil.getCwd(); - - if (RobocodeProperties.isTestingOn()) { - dir = dir.getParentFile().getParentFile().getParentFile(); - } - fileReader = new FileReader(new File(dir, VERSIONS_TXT)); - in = new BufferedReader(fileReader); - - versionString = in.readLine(); - } catch (FileNotFoundException e) { - logError("No " + VERSIONS_TXT + " file."); - versionString = UNKNOWN_VERSION; - } catch (IOException e) { - logError("IO Exception reading " + VERSIONS_TXT, e); - versionString = UNKNOWN_VERSION; - } finally { - if (fileReader != null) { - try { - fileReader.close(); - } catch (IOException ignored) {} - } - if (in != null) { - try { - in.close(); - } catch (IOException ignored) {} - } - } - - String version = UNKNOWN_VERSION; - - if (versionString != null && !versionString.equals(UNKNOWN_VERSION)) { - try { - version = versionFileLineToVersion(versionString); - } catch (Exception ignore) {} - } - return version; - } - - private static String versionFileLineToVersion(String versionFileLine) { - String version = versionFileLine.substring("## Version ".length()); - - int index = version.indexOf('('); - if (index >= 0) { - version = version.substring(0, index); - } - return version.trim(); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/main/resources/battleRecord.xsd b/代码/workspace_robo4/robocode.core/src/main/resources/battleRecord.xsd deleted file mode 100644 index b29815e..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/resources/battleRecord.xsd +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.core/src/main/resources/battleRecordS.xsd b/代码/workspace_robo4/robocode.core/src/main/resources/battleRecordS.xsd deleted file mode 100644 index abd5f78..0000000 --- a/代码/workspace_robo4/robocode.core/src/main/resources/battleRecordS.xsd +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/ObjectCloner.java b/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/ObjectCloner.java deleted file mode 100644 index 1f4207a..0000000 --- a/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/ObjectCloner.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -import java.awt.*; -import java.io.*; - - -/** - * This utility class is used for cloning objects. - * - * @author Flemming N. Larsen (original) - */ -public class ObjectCloner { - - /** - * Returns a deep copy of the specified object, or {@code null} if the - * object cannot be serialized. - * - * @param orig the object to deep copy. - * @return a new object that is a deep copy of the specified input object; or - * {@code null} if the object was not copied for some reason. - */ - public static Object deepCopy(Object orig) { - if (!(orig instanceof Serializable)) { - return null; - } - - // Write the object out to a byte array - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream out = null; - - try { - out = new ObjectOutputStream(baos); - out.writeObject(orig); - out.flush(); - } catch (IOException e) { - return null; - } finally { - if (out != null) { - try { - out.close(); - } catch (IOException ignored) {} - } - } - - // Now, create a new object by reading it in from the byte array where the - // original object was written to. - - Object obj = null; - ObjectInputStream in = null; - - try { - in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); - - obj = in.readObject(); - } catch (IOException e) { - return null; - } catch (ClassNotFoundException e) { - return null; - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) {} - } - } - - return obj; - } - - /** - * Returns a deep copy of the specified {@code Color}, or {@code null} if - * the reference to the {@code Color} is {@code null}. - * - * @param c the {@code Color} to deep copy. - * @return a new {@code Color} that is a deep copy if the specified input - * {@code Color}; or {@code null} if the reference to the - * {@code Color} is {@code null}. - */ - public static Color deepCopy(Color c) { - return (c != null) ? new Color(c.getRGB(), true) : null; - } -} diff --git a/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/RbSerializerTest.java b/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/RbSerializerTest.java deleted file mode 100644 index af1b629..0000000 --- a/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/serialization/RbSerializerTest.java +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.serialization; - - -import net.sf.robocode.peer.BulletCommand; -import net.sf.robocode.peer.DebugProperty; -import net.sf.robocode.peer.ExecCommands; -import net.sf.robocode.peer.TeamMessage; -import net.sf.robocode.robotpaint.Graphics2DSerialized; -import net.sf.robocode.security.HiddenAccess; - -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import robocode.util.Utils; - -import javax.swing.*; - -import java.awt.*; -import java.awt.geom.*; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - - -/** - * @author Pavel Savara (original) - */ -public class RbSerializerTest { - - Exception exception = null; - - @BeforeClass - public static void init() { - // we need to switch off engine classloader for this test - System.setProperty("NOSECURITY", "true"); - System.setProperty("WORKINGDIRECTORY", "target//test-classes"); - System.setProperty("TESTING", "true"); - HiddenAccess.initContainer(); - } - - @AfterClass - public static void cleanup() { - System.setProperty("NOSECURITY", "false"); - } - - @Test - public void empty() throws IOException { - HiddenAccess.initContainer(); - ExecCommands ec = new ExecCommands(); - - ec.setBodyTurnRemaining(150.123); - ec.setTryingToPaint(true); - - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - RbSerializer rbs = new RbSerializer(); - - rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); - - assertNear(ec2.getBodyTurnRemaining(), ec.getBodyTurnRemaining()); - Assert.assertEquals(ec2.isTryingToPaint(), true); - } - - @Test - public void withBullets() throws IOException { - ExecCommands ec = new ExecCommands(); - - ec.setBodyTurnRemaining(150.123); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getBullets().add(new BulletCommand(1.0, false, 0.9454, 12)); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9554, -128)); - - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - RbSerializer rbs = new RbSerializer(); - - rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); - - assertNear(ec2.getBodyTurnRemaining(), ec.getBodyTurnRemaining()); - assertNear(ec2.getBullets().get(0).getPower(), 1.0); - Assert.assertEquals(ec2.getBullets().get(1).isFireAssistValid(), false); - Assert.assertEquals(ec2.getBullets().get(2).isFireAssistValid(), true); - Assert.assertEquals(ec2.getBullets().get(2).getBulletId(), -128); - } - - @Test - public void withMessages() throws IOException { - ExecCommands ec = new ExecCommands(); - - ec.setBodyTurnRemaining(150.123); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - final byte[] data = new byte[20]; - - data[10] = 10; - ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", data)); - ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); - - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - RbSerializer rbs = new RbSerializer(); - - rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); - - Assert.assertEquals(ec2.getTeamMessages().get(0).message[0], 0); - Assert.assertEquals(ec2.getTeamMessages().get(0).message[10], 10); - Assert.assertEquals(ec2.getTeamMessages().get(0).sender, "Foo"); - Assert.assertEquals(ec2.getTeamMessages().get(0).recipient, "Bar"); - Assert.assertEquals(ec2.getTeamMessages().get(1).message, null); - } - - @Test - public void withProperties() throws IOException { - ExecCommands ec = new ExecCommands(); - - ec.setBodyTurnRemaining(150.123); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); - ec.getDebugProperties().add( - new DebugProperty("UTF8 Native characters", "Pli lu?ouk k pl belsk dy")); - - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - RbSerializer rbs = new RbSerializer(); - - rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); - - Assert.assertEquals(ec2.getDebugProperties().get(0).getKey(), "UTF8 Native characters"); - Assert.assertEquals(ec2.getDebugProperties().get(0).getValue(), "Pli lu?ouk k pl belsk dy"); - } - - // @Test - // 14 seconds for 1000 000, - // 15x faster - public void speed() throws IOException { - ExecCommands ec = new ExecCommands(); - - ec.setBodyTurnRemaining(150.123); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); - ec.getDebugProperties().add(new DebugProperty("ooooh", "aaaah")); - - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - - for (int i = 0; i < 1000000; i++) { - out.reset(); - ec.setGunColor(i); - RbSerializer rbs = new RbSerializer(); - - rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); - - Assert.assertEquals(ec2.getGunColor(), i); - } - } - - // @Test - // 21 seconds for 100 000 - public void speed2() { - ExecCommands ec = new ExecCommands(); - - ec.setBodyTurnRemaining(150.123); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getBullets().add(new BulletCommand(1.0, true, 0.9354, 11)); - ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); - ec.getDebugProperties().add(new DebugProperty("ooooh", "aaaah")); - - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - - for (int i = 0; i < 100000; i++) { - out.reset(); - ec.setGunColor(i); - ExecCommands ec2 = (ExecCommands) ObjectCloner.deepCopy(ec); - - Assert.assertEquals(ec2.getGunColor(), i); - } - } - - @SuppressWarnings("serial") - @Test - public void graphics() throws InterruptedException { - final Graphics2DSerialized sg = new Graphics2DSerialized(); - - sg.setPaintingEnabled(true); - sg.setBackground(Color.GREEN); - sg.setColor(Color.RED); - Arc2D a = new Arc2D.Double(Arc2D.PIE); - - a.setAngleExtent(10); - a.setAngleStart(-30); - a.setFrame(0, 0, 80, 80); - sg.draw(a); - - sg.setColor(Color.BLUE); - sg.draw(new Line2D.Double(99, 98, 78, 3)); - - sg.setColor(Color.YELLOW); - sg.draw(new Rectangle2D.Double(20, 20, 30, 50)); - - sg.setColor(Color.BLACK); - sg.drawLine(99, 3, 78, 3); - sg.drawRect(90, 20, 30, 50); - - sg.setColor(Color.CYAN); - - sg.setStroke(new BasicStroke(1, 2, BasicStroke.JOIN_ROUND, 4, null, 0)); - sg.fill(new Rectangle2D.Double(20, 70, 30, 50)); - sg.fill(new Ellipse2D.Double(70, 70, 30, 50)); - - sg.setColor(Color.MAGENTA); - sg.fill(new RoundRectangle2D.Double(110, 70, 30, 50, 13.5, 16.1)); - - exception = null; - - Canvas d = new Canvas() { - @Override - public void paint(Graphics g) { - synchronized (this) { - try { - sg.processTo((Graphics2D) g); - } catch (Exception e) { - exception = e; - } - } - } - }; - - d.setSize(200, 200); - - JFrame f = new JFrame() {}; - - f.add(d); - f.pack(); - f.setVisible(true); - f.setFocusable(true); - Thread.sleep(100); - f.setVisible(false); - - Assert.assertNull("Exception occured: " + exception, exception); - } - - public static void assertNear(double v1, double v2) { - org.junit.Assert.assertEquals(v1, v2, Utils.NEAR_DELTA); - } -} diff --git a/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/version/VersionTest.java b/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/version/VersionTest.java deleted file mode 100644 index 2feb52c..0000000 --- a/代码/workspace_robo4/robocode.core/src/test/java/net/sf/robocode/version/VersionTest.java +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.version; - - -import org.junit.Assert; -import org.junit.Test; - - -/** - * @author Pavel Savara (original) - */ -public class VersionTest { - - @Test - public void same() { - Assert.assertTrue(Version.compare("1.1.3", "1.1.3") == 0); - } - - @Test - public void equalVersion() { - Assert.assertTrue(Version.compare("1.1", "1.1.0.0") == 0); - } - - @Test - public void equalAlphas() { - Assert.assertTrue(Version.compare(" 1.2 Alpha", "1.2.0.0alpha1 ") == 0); - } - - @Test - public void equalBetas() { - Assert.assertTrue(Version.compare("4.2.1Beta2 ", " 4.2.1.0 beta 2") == 0); - } - - @Test - public void greater() { - Assert.assertTrue(Version.compare("1.1.4", "1.1.3") > 0); - } - - @Test - public void greaterShort() { - Assert.assertTrue(Version.compare("1.4", "1.1.3") > 0); - } - - @Test - public void greaterShort2() { - Assert.assertTrue(Version.compare("1.4", "1.1") > 0); - } - - @Test - public void greaterShortBeta() { - Assert.assertTrue(Version.compare("1.4 Beta", "1.1.3") > 0); - } - - @Test - public void greaterShortBeta3() { - Assert.assertTrue(Version.compare("1.4 Beta", "1.1") > 0); - } - - @Test - public void greaterShortBeta2() { - Assert.assertTrue(Version.compare("1.4", "1.1.3") > 0); - } - - @Test - public void greaterLong() { - Assert.assertTrue(Version.compare("1.4.1", "1.1") > 0); - } - - @Test - public void smaller() { - Assert.assertTrue(Version.compare("1.1.2", "1.1.3") < 0); - } - - @Test - public void greaterToo() { - Assert.assertTrue(Version.compare("4.1.2", "1.1.3") > 0); - } - - @Test - public void greaterThanBeta() { - Assert.assertTrue(Version.compare("1.1.3", "1.1.3 Beta") > 0); - } - - @Test - public void smallerThanBeta() { - Assert.assertTrue(Version.compare("1.1.2", "1.1.3 Beta") < 0); - } - - @Test - public void smallerThanAlpha() { - Assert.assertTrue(Version.compare("1.1.3 Alpha", "1.1.3 Beta") < 0); - } - - @Test - public void compareBetas() { - // we can't name versions Beta 2 - Assert.assertTrue(Version.compare("1.1.3 Beta", "1.1.3 Beta 2") < 0); - } - - @Test - public void compareBetas2() { - // we can't name versions Beta 2 - Assert.assertTrue(Version.compare("1.1.3 Beta 2 ", "1.1.3 Beta 3") < 0); - } - - @Test - public void compareBetas3() { - // we can't name versions Beta 2 - Assert.assertTrue(Version.compare("1.1.3 Beta2 ", "1.1.3 Beta 3") < 0); - } - - @Test - public void compareBetas4() { - // we can't name versions Beta 2 - Assert.assertTrue(Version.compare("1.1.3Beta2", "1.1.3 Beta 3") < 0); - } - - @Test - public void compareBetasShort() { - // we can't name versions Beta 2 - Assert.assertTrue(Version.compare("1.7 Beta", "1.1") > 0); - } - - @Test - public void compareBetasShort2() { - // we can't name versions Beta 2 - Assert.assertTrue(Version.compare("1.7 Beta", "1.8") < 0); - } -} diff --git a/代码/workspace_robo4/robocode.distribution/.classpath b/代码/workspace_robo4/robocode.distribution/.classpath deleted file mode 100644 index adc405e..0000000 --- a/代码/workspace_robo4/robocode.distribution/.classpath +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.distribution/.project b/代码/workspace_robo4/robocode.distribution/.project deleted file mode 100644 index 602d015..0000000 --- a/代码/workspace_robo4/robocode.distribution/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - robocode.distribution - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.roborumble - robocode.battle - robocode.core - robocode.host - robocode.repository - robocode.ui.editor - robocode.ui - robocode.sound - robocode.installer - robocode.content - robocode.samples - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.distribution/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.distribution/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 66e68a8..0000000 --- a/代码/workspace_robo4/robocode.distribution/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:10 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.distribution/pom.xml b/代码/workspace_robo4/robocode.distribution/pom.xml deleted file mode 100644 index d13ecae..0000000 --- a/代码/workspace_robo4/robocode.distribution/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - 4.0.0 - robocode.distribution - Robocode Distribution - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - jar - - - net.sf.robocode - robocode.roborumble - ${project.version} - jar - - - net.sf.robocode - robocode.ui.editor - ${project.version} - jar - - - net.sf.robocode - robocode.installer - ${project.version} - jar - - - net.sf.robocode - robocode.content - ${project.version} - jar - - - - - - maven-assembly-plugin - - ${project.parent.artifactId}-${project.version} - true - - setup.asm.xml - src.asm.xml - - - - net.sf.robocode.installer.AutoExtract - - - - - - make-assembly - package - - single - - - - - - - diff --git a/代码/workspace_robo4/robocode.distribution/robocode.distribution.iml b/代码/workspace_robo4/robocode.distribution/robocode.distribution.iml deleted file mode 100644 index daa00fa..0000000 --- a/代码/workspace_robo4/robocode.distribution/robocode.distribution.iml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.distribution/setup.asm.xml b/代码/workspace_robo4/robocode.distribution/setup.asm.xml deleted file mode 100644 index c8a5b52..0000000 --- a/代码/workspace_robo4/robocode.distribution/setup.asm.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - setup - - dir - jar - - false - - - - - net.sf.robocode:robocode.api - - libs - false - robocode.${artifact.extension} - - - - - net.sf.robocode:robocode.roborumble - - libs - false - roborumble.${artifact.extension} - - - - - - net.sf.robocode:robocode.distribution - - net.sf.robocode:robocode.installer - net.sf.robocode:robocode.content - net.sf.robocode:robocode.samples - - net.sf.robocode:robocode.api - - net.sf.robocode:robocode.roborumble - - libs - false - - - - - net.sf.robocode:robocode.content - net.sf.robocode:robocode.installer - - true - - - **/META-INF/** - - - - - - - - net.sf.robocode:robocode.samples - - true - - robots - - - - - ../robocode.api/target/site/apidocs - javadoc - lf - - - - - ../versions.md - lf - - - diff --git a/代码/workspace_robo4/robocode.distribution/src.asm.xml b/代码/workspace_robo4/robocode.distribution/src.asm.xml deleted file mode 100644 index 86b0cec..0000000 --- a/代码/workspace_robo4/robocode.distribution/src.asm.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - src - - dir - zip - - - - .. - lf - - plugins/battleview3d/** - plugins/js/** - plugins/scala/** - **/_ReSharper*/** - **/_ReSharper.*/** - **/Debug/** - **/Release/** - **/obj/** - **/target/** - **/lib/** - **/*.suo - **/*.user - **/*.log - **/*.iws - **/*.iml - **/*.ipr - **/*.jar - **/*.dll - **/*.exe - **/*.bak - **/Thumbs.db - **/~* - **/.* - **/.* - **/_svn/** - **/.svn/** - **/.metadata/** - **/*.jkey - **/*.snk - - - - diff --git a/代码/workspace_robo4/robocode.dummy.zip b/代码/workspace_robo4/robocode.dummy.zip deleted file mode 100644 index 354edba3f544c7e9d884cb9f2d9322c549239bfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3658 zcmWIWW@Zs#U|`^2ILv8mHB01sturG7gCGk7gBVb>C_gDbIX@*;FQqg$w^F|#KUc3J zH)rc)UvFkZfwuR5MZG`lIvHl`adMfsV2jvM{XNHWZn@3kpS0z+(!cWLZ^3sKx!#Gs zSE=^-T#A@~dC}aQouy8zWqK0Xgx1Z_Yl(XH;NwHBy$r!dhmO4pKUX7^@w8~er+YpE zlS)pDE@|5&+I~y#;@h(_a}U4yJk7(e%x_Ccf2g0PwUu0 zjm&)$ED8;+F8BO;@$UGllZr{tyS#jq*$+!jh~SaV+WBe8+MbnPlN@L6*Xy{dZ*`_A z`HHZ0QRdfUEUtz8cbUpcgkM~!I`rhp+Jy=n^_$? z6_CH-hR4qT_Z}Kf6P-He&ef2j$XJP^T5$!3Lj}Ki6hL`pP#G$&l8%jq7(bIc`|ZP81(zIw#8t04M(PCLl51&MAX-Pl1;8ch4)!hjzLQ-sIH=eoda&f)QA<^7; z2VQo@xd%?F?7CHUY4*A{t^W6+_hXAL-=80nxawcJQ2m?job!*W>|ubpn}MN$L)!}I zR5%a@ve1%CaZ$29ZVeLHHRL8{=HbyLi$_;hVp$>{t%`)S=B1Y4(XK*__Tn@=Cg>7r z0xTHu7^Q^AsG`*3{L-T2)M7mP)riuMKR`5zHUn>{7?ENO5kZ3^U6rI3^HWN5QuRPqt_?byciVu+?s&uf#^Xyoo~A5cxO>eD zJ=SXrZ+v6wITCS5<>G=A@q-)6=PzM-*%s%`+2%UoKL65(&uSOHf50YJVbv*}+qU)I zf%dz3``6y@|Il*t689bLA8vMqEIn-dJ~x_5Go3Z;wmvgc)pSnv`-Klx1iVzZC0Xs) zdK+-|H!b`s?%}Z3(nrEyuTQ{Wvc;El0THd4O#R$e{p|h*?#`Efc_n%rI9^uqK%i^c z^PdmqwypOI_F*|4_g3mccj>LTnKDZ+g)EVner}cQ@m%4MN$X=~L~lM@xl5XDXGLgd z`o)qINl({P&Gwslt3GW%UAH`kZ=YG*v!7Noc28URv4^|zN8k#U^(Uh%di2CUKREP6 zGvG|b)T>S3dl$Y}yRyGPMT0HGYSn5>MUPykUt081RGtp;Q>uvK~> zoe(q1foTWL3`7-(Fa~=a1Tuz!K>&#Lfe9SV7)Xr-^9!Z{pt1u3Kn5gWHvn2g;WhY&OHZ z22K2+6bBAagd3qnC_b-)>O=?t8Jj_hu`v7b1}$nj-+|qHaQ%VLm8j|b9UfCiOy`=c zSi=#uLc`}W6B1U8YGceXV7ZKTCu^Ww%Dd9%LYG8=l man->P3lxBq8ynWZC1e3ojU3?33N(X(K^O@6fGjl*5Dx$e+ZEgZ diff --git a/代码/workspace_robo4/robocode.host/.classpath b/代码/workspace_robo4/robocode.host/.classpath deleted file mode 100644 index a1d093f..0000000 --- a/代码/workspace_robo4/robocode.host/.classpath +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.host/.project b/代码/workspace_robo4/robocode.host/.project deleted file mode 100644 index e6a7e2e..0000000 --- a/代码/workspace_robo4/robocode.host/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - robocode.host - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.core - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.host/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.host/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 65f3846..0000000 --- a/代码/workspace_robo4/robocode.host/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:08 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.host/pom.xml b/代码/workspace_robo4/robocode.host/pom.xml deleted file mode 100644 index f0e6ed6..0000000 --- a/代码/workspace_robo4/robocode.host/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - robocode.host - Robocode Host - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.core - ${project.version} - - - - junit - junit - 4.11 - test - - - diff --git a/代码/workspace_robo4/robocode.host/robocode.host.iml b/代码/workspace_robo4/robocode.host/robocode.host.iml deleted file mode 100644 index ddbee93..0000000 --- a/代码/workspace_robo4/robocode.host/robocode.host.iml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/CpuManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/CpuManager.java deleted file mode 100644 index 93a9a28..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/CpuManager.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.io.Logger; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.IWindowManager; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert Maupin (contributor) - * @author Pavel Savara (contributor) - */ -public class CpuManager implements ICpuManager { // NO_UCD (use default) - private final static int APPROXIMATE_CYCLES_ALLOWED = 6250; - private final static int TEST_PERIOD_MILLIS = 5000; - - private long cpuConstant = -1; - private final ISettingsManager properties; - - public CpuManager(ISettingsManager properties) { // NO_UCD (unused code) - this.properties = properties; - } - - public long getCpuConstant() { - if (cpuConstant == -1) { - cpuConstant = properties.getCpuConstant(); - if (cpuConstant == -1) { - calculateCpuConstant(); - } - } - return cpuConstant; - } - - public void calculateCpuConstant() { - setStatus("Estimating CPU speed, please wait..."); - - setCpuConstant(); - Logger.logMessage( - "Each robot will be allowed a maximum of " + cpuConstant + " nanoseconds per turn on this system."); - - properties.setCpuConstant(cpuConstant); - properties.saveProperties(); - - setStatus(""); - } - - private void setCpuConstant() { - long count = 0; - double d = 0; - - long start = System.currentTimeMillis(); - - while (System.currentTimeMillis() - start < TEST_PERIOD_MILLIS) { - d += Math.hypot(Math.sqrt(Math.abs(Math.log(Math.atan(Math.random())))), - Math.cbrt(Math.abs(Math.random() * 10))) - / Math.exp(Math.random()); - count++; - } - - // to cheat optimizer, almost never happen - if (d == 0.0) { - Logger.logMessage("bingo!"); - } - - cpuConstant = Math.max(1, (long) (1000000.0 * APPROXIMATE_CYCLES_ALLOWED * TEST_PERIOD_MILLIS / count)); - } - - private void setStatus(String message) { - IWindowManager windowManager = Container.getComponent(IWindowManager.class); - - if (windowManager != null) { - windowManager.setStatus(message); - } - } - -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/HostManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/HostManager.java deleted file mode 100644 index 8dd1320..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/HostManager.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.host.proxies.*; -import net.sf.robocode.host.security.*; -import net.sf.robocode.host.jarjar.JarJarURLConnection; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.repository.RobotType; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.core.Container; -import robocode.control.RobotSpecification; - -import java.io.InputStream; -import java.io.PrintStream; - - -/** - * @author Pavel Savara (original) - */ -public class HostManager implements IHostManager { - private final ISettingsManager properties; - private IThreadManager threadManager; - - public HostManager(ISettingsManager properties, IThreadManager threadManager) { // NO_UCD (unused code) - this.properties = properties; - this.threadManager = threadManager; - } - - static { - initStreams(); - } - - private static void initStreams() { - PrintStream sysout = new SecurePrintStream(Logger.realOut, true); - PrintStream syserr = new SecurePrintStream(Logger.realErr, true); - InputStream sysin = new SecureInputStream(System.in); - - System.setOut(sysout); - if (RobocodeProperties.isDebuggingOff()) { - System.setErr(syserr); - } - System.setIn(sysin); - } - - public long getRobotFilesystemQuota() { - return properties.getRobotFilesystemQuota(); - } - - public IThreadManager getThreadManager() { - return threadManager; - } - - public void resetThreadManager() { - threadManager.reset(); - } - - public void addSafeThread(Thread safeThread) { - threadManager.addSafeThread(safeThread); - } - - public void removeSafeThread(Thread safeThread) { - threadManager.removeSafeThread(safeThread); - } - - public PrintStream getRobotOutputStream() { - return threadManager.getRobotOutputStream(); - } - - public void cleanup() {// TODO - } - - public String[] getReferencedClasses(IRobotItem robotItem) { - return getHost(robotItem).getReferencedClasses(robotItem); - } - - public RobotType getRobotType(IRobotItem robotItem, boolean resolve, boolean message) { - return getHost(robotItem).getRobotType(robotItem, resolve, message); - } - - public IHostingRobotProxy createRobotProxy(RobotSpecification robotSpecification, RobotStatics statics, IRobotPeer peer) { - IRobotItem specification = (IRobotItem) HiddenAccess.getFileSpecification(robotSpecification); - return getHost(specification).createRobotProxy(this, robotSpecification, statics, peer); - } - - private IHost getHost(IRobotItem robotItem) { - return (IHost) Container.cache.getComponent("robocode.host." + robotItem.getPlatform().toLowerCase()); - } - - public void initSecurity() { - JarJarURLConnection.register(); - new RobocodeSecurityPolicy(threadManager); - new RobocodeSecurityManager(threadManager); - } - -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHost.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHost.java deleted file mode 100644 index f5d6a33..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHost.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.repository.RobotType; -import net.sf.robocode.host.proxies.IHostingRobotProxy; -import net.sf.robocode.peer.IRobotPeer; -import robocode.control.RobotSpecification; - - -/** - * @author Pavel Savara (original) - */ -public interface IHost { // NO_UCD (use default) - IHostingRobotProxy createRobotProxy(IHostManager hostManager, RobotSpecification robotSpecification, IRobotStatics statics, IRobotPeer peer); - String[] getReferencedClasses(IRobotItem robotItem); - RobotType getRobotType(IRobotItem robotItem, boolean resolve, boolean message); -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHostedThread.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHostedThread.java deleted file mode 100644 index 98addcc..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IHostedThread.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.host.io.RobotFileSystemManager; -import net.sf.robocode.host.io.RobotOutputStream; - - -/** - * @author Pavel Savara (original) - */ -public interface IHostedThread extends Runnable { - void println(String s); - - void drainEnergy(); - - void punishSecurityViolation(String message); - - RobotStatics getStatics(); - - RobotFileSystemManager getRobotFileSystemManager(); - - RobotOutputStream getOut(); - - ClassLoader getRobotClassloader(); -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IThreadManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IThreadManager.java deleted file mode 100644 index e0e3aac..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/IThreadManager.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.security.IThreadManagerBase; - -import java.io.PrintStream; - - -/** - * @author Pavel Savara (original) - */ -public interface IThreadManager extends IThreadManagerBase { - void addThreadGroup(ThreadGroup g, IHostedThread robotProxy); - - IHostedThread getLoadingRobotProxy(Thread t); - - IHostedThread getLoadedOrLoadingRobotProxy(Thread t); - - IHostedThread getRobotProxy(Thread t); - - void reset(); - - void setLoadingRobot(IHostedThread newLoadingRobotProxy); - - void addSafeThread(Thread safeThread); - - void addSafeThreadGroup(ThreadGroup safeThreadGroup); - - void removeSafeThread(Thread safeThread); - - boolean isSafeThread(Thread c); - - PrintStream getRobotOutputStream(); - - boolean checkRobotFileStream(); -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/JavaHost.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/JavaHost.java deleted file mode 100644 index 7dde1e9..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/JavaHost.java +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.host.security.RobotClassLoader; -import net.sf.robocode.host.proxies.*; -import net.sf.robocode.peer.IRobotStatics; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.repository.RobotType; -import static net.sf.robocode.io.Logger.logError; -import net.sf.robocode.io.Logger; -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.security.HiddenAccess; -import robocode.Droid; -import robocode.Robot; -import robocode.BorderSentry; -import robocode.control.RobotSpecification; -import robocode.robotinterfaces.*; - -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; -import java.awt.*; -import java.security.AccessControlException; -import java.lang.reflect.Method; - - -/** - * @author Pavel Savara (original) - */ -public class JavaHost implements IHost { - public IRobotClassLoader createLoader(IRobotItem robotItem) { - return new RobotClassLoader(robotItem.getClassPathURL(), robotItem.getFullClassName()); - } - - public IHostingRobotProxy createRobotProxy(IHostManager hostManager, RobotSpecification robotSpecification, IRobotStatics statics, IRobotPeer peer) { - IHostingRobotProxy robotProxy; - final IRobotItem specification = (IRobotItem) HiddenAccess.getFileSpecification(robotSpecification); - - if (specification.isTeamRobot()) { - robotProxy = new TeamRobotProxy(specification, hostManager, peer, (RobotStatics) statics); - } else if (specification.isAdvancedRobot()) { - robotProxy = new AdvancedRobotProxy(specification, hostManager, peer, (RobotStatics) statics); - } else if (specification.isStandardRobot()) { - robotProxy = new StandardRobotProxy(specification, hostManager, peer, (RobotStatics) statics); - } else if (specification.isJuniorRobot()) { - robotProxy = new JuniorRobotProxy(specification, hostManager, peer, (RobotStatics) statics); - } else { - throw new AccessControlException("Unknown robot type"); - } - return robotProxy; - } - - public String[] getReferencedClasses(IRobotItem robotItem) { - IRobotClassLoader loader = null; - - try { - loader = createLoader(robotItem); - loader.loadRobotMainClass(true); - return loader.getReferencedClasses(); - - } catch (ClassNotFoundException e) { - Logger.logError(e); - return new String[0]; - } finally { - if (loader != null) { - loader.cleanup(); - } - } - } - - public RobotType getRobotType(IRobotItem robotItem, boolean resolve, boolean message) { - IRobotClassLoader loader = null; - - try { - loader = createLoader(robotItem); - Class robotClass = loader.loadRobotMainClass(resolve); - - if (robotClass == null || java.lang.reflect.Modifier.isAbstract(robotClass.getModifiers())) { - // this class is not robot - return RobotType.INVALID; - } - return checkInterfaces(robotClass, robotItem); - - } catch (RuntimeException t) { - if (message) { - logError("Got an error with " + robotItem.getFullClassName() + ": " + t); // just message here - if (t.getMessage() != null && t.getMessage().contains("Bad version number in .class file")) { - logError( - "Maybe robot was compiled with a newer Java version the Java version used for running Robocode?"); - } - } - return RobotType.INVALID; - } finally { - if (loader != null) { - loader.cleanup(); - } - } - } - - private RobotType checkInterfaces(Class robotClass, IRobotItem robotItem) { - boolean isJuniorRobot = false; - boolean isStandardRobot = false; - boolean isInteractiveRobot = false; - boolean isPaintRobot = false; - boolean isAdvancedRobot = false; - boolean isTeamRobot = false; - boolean isDroid = false; - boolean isSentryRobot = false; - - if (IAdvancedRobot.class.isAssignableFrom(robotClass)) { // Note: must be checked first - isAdvancedRobot = true; - } - if (Robot.class.isAssignableFrom(robotClass) && !isAdvancedRobot) { - isStandardRobot = true; - } - if (IJuniorRobot.class.isAssignableFrom(robotClass)) { // Note: Must be checked before checking for standard robot - isJuniorRobot = true; - if (isAdvancedRobot) { - throw new AccessControlException( - robotItem.getFullClassName() + ": Junior robot should not implement IAdvancedRobot interface."); - } - } - if (IBasicRobot.class.isAssignableFrom(robotClass)) { - if (!(isAdvancedRobot || isJuniorRobot)) { - isStandardRobot = true; - } - } - if (ITeamRobot.class.isAssignableFrom(robotClass)) { - isTeamRobot = true; - } - if (Droid.class.isAssignableFrom(robotClass)) { - isDroid = true; - } - if (BorderSentry.class.isAssignableFrom(robotClass)) { - isSentryRobot = true; - } - - if (IInteractiveRobot.class.isAssignableFrom(robotClass)) { - // in this case we make sure that robot don't waste time - if (checkMethodOverride(robotClass, Robot.class, "getInteractiveEventListener") - || checkMethodOverride(robotClass, Robot.class, "onKeyPressed", KeyEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onKeyReleased", KeyEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onKeyTyped", KeyEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMouseClicked", MouseEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMouseEntered", MouseEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMouseExited", MouseEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMousePressed", MouseEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMouseReleased", MouseEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMouseMoved", MouseEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMouseDragged", MouseEvent.class) - || checkMethodOverride(robotClass, Robot.class, "onMouseWheelMoved", MouseWheelEvent.class) - ) { - isInteractiveRobot = true; - } - } - - if (IPaintRobot.class.isAssignableFrom(robotClass)) { - if (checkMethodOverride(robotClass, Robot.class, "getPaintEventListener") - || checkMethodOverride(robotClass, Robot.class, "onPaint", Graphics2D.class) - ) { - isPaintRobot = true; - } - } - - return new RobotType(isJuniorRobot, isStandardRobot, isInteractiveRobot, isPaintRobot, isAdvancedRobot, - isTeamRobot, isDroid, isSentryRobot); - } - - private boolean checkMethodOverride(Class robotClass, Class knownBase, String name, Class... parameterTypes) { - if (knownBase.isAssignableFrom(robotClass)) { - final Method getInteractiveEventListener; - - try { - getInteractiveEventListener = robotClass.getMethod(name, parameterTypes); - } catch (NoSuchMethodException e) { - return false; - } - if (getInteractiveEventListener.getDeclaringClass().equals(knownBase)) { - return false; - } - } - return true; - } - -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/Module.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/Module.java deleted file mode 100644 index d551df1..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/Module.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host; - - -import net.sf.robocode.core.BaseModule; -import net.sf.robocode.core.Container; -import net.sf.robocode.host.security.ThreadManager; - - -/** - * @author Pavel Savara (original) - */ -public class Module extends BaseModule { - static { - Container.cache.addComponent(IHostManager.class, HostManager.class); - Container.cache.addComponent(ICpuManager.class, CpuManager.class); - Container.cache.addComponent(IThreadManager.class, ThreadManager.class); - Container.cache.addComponent("robocode.host.java", JavaHost.class); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventManager.java deleted file mode 100644 index 5621c87..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventManager.java +++ /dev/null @@ -1,572 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.events; - - -import net.sf.robocode.host.proxies.BasicRobotProxy; -import net.sf.robocode.security.HiddenAccess; -import robocode.*; -import robocode.exception.EventInterruptedException; -import robocode.robotinterfaces.IBasicRobot; - -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; - - -// XXX Remember to update the .NET version whenever a change is made to this class! - -/** - * This class is used for managing the event queue for a robot. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - * @author Robert D. Maupin (contributor) - * @author Nathaniel Troutman (contributor) - * @author Pavel Savara (contributor) - */ -public final class EventManager implements IEventManager { - - private final static int MAX_PRIORITY = 100; - public final static int MAX_EVENT_STACK = 2; - public final static int MAX_QUEUE_SIZE = 256; - - private final List customEvents = new CopyOnWriteArrayList(); - private final EventQueue eventQueue; - - private final boolean[] interruptible = new boolean[MAX_PRIORITY + 1]; - private Event currentTopEvent; - private int currentTopEventPriority; - private ScannedRobotEvent dummyScannedRobotEvent; - private Map eventNames; - - private IBasicRobot robot; - private BasicRobotProxy robotProxy; - - /** - * Constructs a new EventManager. - * - * @param robotProxy the robot proxy that this event manager applies to. - */ - public EventManager(BasicRobotProxy robotProxy) { - this.robotProxy = robotProxy; - eventQueue = new EventQueue(); - - registerEventNames(); - reset(); - } - - /** - * Adds an event to the event queue. - * @param event is the event to add to the event queue. - */ - public void add(Event event) { - if (!HiddenAccess.isCriticalEvent(event)) { - final int priority = getEventPriority(event.getClass().getName()); - HiddenAccess.setEventPriority(event, priority); - } - addImpl(event); - } - - /** - * Internal method for adding an event to the event queue. - * @param event is the event to add to the event queue. - */ - private void addImpl(Event event) { - if (eventQueue != null) { - if (eventQueue.size() > MAX_QUEUE_SIZE) { - robotProxy.println( - "Not adding to " + robotProxy.getStatics().getName() + "'s queue, exceeded " + MAX_QUEUE_SIZE - + " events in queue."); - } else { - HiddenAccess.setEventTime(event, getTime()); - eventQueue.add(event); - } - } - } - - /** - * Adds an custom event to the event queue based on a condition. - * @param condition is the condition that must be met in order to trigger the custom event. - */ - public void addCustomEvent(Condition condition) { - customEvents.add(condition); - } - - /** - * Removes all events from the event queue. - * @param includingSystemEvents {@code true} if system events must be removed as well; - * {@code false} if system events should stay on the event queue. - */ - public void clearAllEvents(boolean includingSystemEvents) { - eventQueue.clear(includingSystemEvents); - // customEvents.clear(); // Custom event should not be cleared here - } - - /** - * Cleans up the event queue. - *

- * This method should be called when the event queue is no longer needed, - * i.e. before it must be garbage collected. - */ - public void cleanup() { - // Remove all events - reset(); - - // Remove all references to robots - robot = null; - robotProxy = null; - } - - /** - * Returns a list containing all events currently in the robot's queue. - */ - public List getAllEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - events.add(e); - } - } - return events; - } - - /** - * Returns a list containing all BulletHitBulletEvents currently in the robot's queue. - */ - public List getBulletHitBulletEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof BulletHitBulletEvent) { - events.add((BulletHitBulletEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all BulletHitEvents currently in the robot's queue. - */ - public List getBulletHitEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof BulletHitEvent) { - events.add((BulletHitEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all BulletMissedEvents currently in the robot's queue. - */ - public List getBulletMissedEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof BulletMissedEvent) { - events.add((BulletMissedEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all HitByBulletEvents currently in the robot's queue. - */ - public List getHitByBulletEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof HitByBulletEvent) { - events.add((HitByBulletEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all HitRobotEvents currently in the robot's queue. - */ - public List getHitRobotEvents() { - List events = new ArrayList(); - - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof HitRobotEvent) { - events.add((HitRobotEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all HitWallEvents currently in the robot's queue. - */ - public List getHitWallEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof HitWallEvent) { - events.add((HitWallEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all RobotDeathEvents currently in the robot's queue. - */ - public List getRobotDeathEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof RobotDeathEvent) { - events.add((RobotDeathEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all ScannedRobotEvents currently in the robot's queue. - */ - public List getScannedRobotEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof ScannedRobotEvent) { - events.add((ScannedRobotEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all MessageEvents currently in the robot's queue. - */ - public List getMessageEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof MessageEvent) { - events.add((MessageEvent) e); - } - } - } - return events; - } - - /** - * Returns a list containing all StatusEvents currently in the robot's queue. - */ - public List getStatusEvents() { - List events = new ArrayList(); - synchronized (eventQueue) { - for (Event e : eventQueue) { - if (e instanceof StatusEvent) { - events.add((StatusEvent) e); - } - } - } - return events; - } - - /** - * Returns the priority of the current top event. - */ - public int getCurrentTopEventPriority() { - return currentTopEventPriority; - } - - /** - * Returns the current top event. - */ - public Event getCurrentTopEvent() { - return currentTopEvent; - } - - /** - * Checks if events with a specific event priority are interruptible. - * @param priority is the event priority that must be checked. - * @see #setInterruptible(int, boolean) - */ - public boolean isInterruptible(int priority) { - return interruptible[priority]; - } - - /** - * Sets the robot that will receive events dispatched from the event queue. - * @param robot is the robot that will receive event dispatched from the event queue. - */ - public void setRobot(IBasicRobot robot) { - this.robot = robot; - } - - /** - * Returns the priority of a ScannedRobotEvent. - */ - public int getScannedRobotEventPriority() { - return dummyScannedRobotEvent.getPriority(); - } - - /** - * Returns the current time/turn of the battle round. - */ - public long getTime() { - return robotProxy.getTimeImpl(); - } - - /** - * This is the heart of the event manager, which processes the events for a robot. - */ - public void processEvents() { - // Remove old events - eventQueue.clear(getTime() - MAX_EVENT_STACK); - - // Process custom events - for (Condition customEvent : customEvents) { - boolean conditionSatisfied = callUserCode(customEvent); - if (conditionSatisfied) { - addImpl(new CustomEvent(customEvent)); - } - } - - // Sort the events based on the time and priority of the events - eventQueue.sort(); - - // Process event queue here - Event currentEvent; - while ((currentEvent = (eventQueue.size() > 0) ? eventQueue.get(0) : null) != null - && currentEvent.getPriority() >= currentTopEventPriority) { - - if (currentEvent.getPriority() == currentTopEventPriority) { - if (currentTopEventPriority > Integer.MIN_VALUE && isInterruptible(currentTopEventPriority)) { - setInterruptible(currentTopEventPriority, false); // we're going to restart it, so reset. - - // We are already in an event handler, took action, and a new event was generated. - // So we want to break out of the old handler to process it here. - throw new EventInterruptedException(currentEvent.getPriority()); - } - break; - } - - int oldTopEventPriority = currentTopEventPriority; - - currentTopEventPriority = currentEvent.getPriority(); - currentTopEvent = currentEvent; - - eventQueue.remove(currentEvent); - try { - dispatch(currentEvent); - - setInterruptible(currentTopEventPriority, false); - - } catch (EventInterruptedException e) { - currentTopEvent = null; - } catch (RuntimeException e) { - currentTopEvent = null; - throw e; - } catch (MyException e) { - currentTopEvent = null; - throw e; - } finally { - currentTopEventPriority = oldTopEventPriority; - } - } - } - - /** - * Checks if the user's condition for a custom event is satisfied. - * @param condition is the condition to check. - * @return {@code true} if the condition is satisfied; {@code false} otherwise. - */ - private boolean callUserCode(Condition condition) { - boolean conditionSatisfied; - robotProxy.setTestingCondition(true); - try { - conditionSatisfied = condition.test(); - } finally { - robotProxy.setTestingCondition(false); - } - return conditionSatisfied; - } - - /** - * Dispatches an event for a robot. - *

- * Too old events will not be dispatched and a critical event is always dispatched. - * - * @param event the event to dispatch to the robot. - */ - private void dispatch(Event event) { - if (robot != null && event != null) { - try { - // skip too old events - if ((event.getTime() > getTime() - MAX_EVENT_STACK) || HiddenAccess.isCriticalEvent(event)) { - HiddenAccess.dispatch(event, robot, robotProxy.getStatics(), robotProxy.getGraphicsImpl()); - } - } catch (Exception ex) { - robotProxy.println("SYSTEM: " + ex.getClass().getName() + " occurred on " + event.getClass().getName()); - ex.printStackTrace(robotProxy.getOut()); - } - } - } - - /** - * Removes the custom event with the specified condition from the event queue. - * @param condition is the condition of the custom event to remove. - */ - public void removeCustomEvent(Condition condition) { - customEvents.remove(condition); - } - - /** - * Removes all custom events from the event queue. - */ - public void resetCustomEvents() { - customEvents.clear(); - } - - /** - * Resets this event manager by removing all events from the event queue. - */ - public synchronized void reset() { - currentTopEventPriority = Integer.MIN_VALUE; - clearAllEvents(true); - customEvents.clear(); - } - - /** - * Changes the interruptible flag for events with a specific priority. - * When an event is interrupted, events with the same priority are allowed to restart the event handler. - * - * @param priority is the priority of the event to set the interruptible flag for. - * @param isInterruptable {@code true} if events with the specified priority must be interruptible - * allowing events with the same priority to restart the event handler. - * {@code false} if events with the specified priority must not be interruptible - * disallowing events with the same priority to restart the event handler. - */ - public void setInterruptible(int priority, boolean isInterruptable) { - if (priority >= 0 && priority < MAX_PRIORITY) { - interruptible[priority] = isInterruptable; - } - } - - /** - * Returns the priority of events belonging to a specific class. - * @param eventClass is a string with the full class name of the event type to get the priority from. - * @return the event priority of the specified event class. - * @see robocode.Event#getPriority() - */ - public int getEventPriority(String eventClass) { - if (eventClass == null) { - return -1; - } - final Event event = eventNames.get(eventClass); - if (event == null) { - return -1; - } - return event.getPriority(); - } - - /** - * Sets the event priority of events belonging to a specific class. - * @param eventClass is a string with the full class name of the event type to set the priority for. - * @param priority is the new priority - */ - public void setEventPriority(String eventClass, int priority) { - if (eventClass == null) { - return; - } - final Event event = eventNames.get(eventClass); - if (event == null) { - robotProxy.println("SYSTEM: Unknown event class: " + eventClass); - return; - } - if (HiddenAccess.isCriticalEvent(event)) { - robotProxy.println("SYSTEM: You may not change the priority of a system event."); - } - HiddenAccess.setEventPriority(event, priority); - } - - /** - * Registers the full and simple class names of all events used by {@link #getEventPriority(String)} and - * {@link #setEventPriority(String, int)} and sets the default priority of each event class. - */ - private void registerEventNames() { - eventNames = new HashMap(); - dummyScannedRobotEvent = new ScannedRobotEvent(null, 0, 0, 0, 0, 0, false); - registerEventNames(new BattleEndedEvent(false, null)); - registerEventNames(new BulletHitBulletEvent(null, null)); - registerEventNames(new BulletHitEvent(null, 0, null)); - registerEventNames(new BulletMissedEvent(null)); - registerEventNames(new DeathEvent()); - registerEventNames(new HitByBulletEvent(0, null)); - registerEventNames(new HitRobotEvent(null, 0, 0, false)); - registerEventNames(new HitWallEvent(0)); - registerEventNames(new KeyPressedEvent(null)); - registerEventNames(new KeyReleasedEvent(null)); - registerEventNames(new KeyTypedEvent(null)); - registerEventNames(new MessageEvent(null, null)); - registerEventNames(new MouseClickedEvent(null)); - registerEventNames(new MouseDraggedEvent(null)); - registerEventNames(new MouseEnteredEvent(null)); - registerEventNames(new MouseExitedEvent(null)); - registerEventNames(new MouseMovedEvent(null)); - registerEventNames(new MousePressedEvent(null)); - registerEventNames(new MouseReleasedEvent(null)); - registerEventNames(new MouseWheelMovedEvent(null)); - registerEventNames(new PaintEvent()); - registerEventNames(new RobotDeathEvent(null)); - registerEventNames(new RoundEndedEvent(0, 0, 0)); - registerEventNames(dummyScannedRobotEvent); - registerEventNames(new SkippedTurnEvent(0)); - registerEventNames(new StatusEvent(null)); - registerEventNames(new WinEvent()); - - // same as any line above but for custom event - final DummyCustomEvent customEvent = new DummyCustomEvent(); - eventNames.put("robocode.CustomEvent", customEvent); // full name with package name - eventNames.put("CustomEvent", customEvent); // only the class name - } - - /** - * Registers the full and simple class name of the specified event and sets the default - * priority of the event class. - * @param event an event belonging to the event class to register the class name for etc. - */ - private void registerEventNames(Event event) { - if (!HiddenAccess.isCriticalEvent(event)) { - HiddenAccess.setDefaultPriority(event); - } - final Class type = event.getClass(); - eventNames.put(type.getName(), event); // full name with package name - eventNames.put(type.getSimpleName(), event); // only the class name - } - - /** - * A dummy CustomEvent used only for registering the class name. - */ - @SuppressWarnings("serial") - private static final class DummyCustomEvent extends CustomEvent { - public DummyCustomEvent() { - super(null); - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventQueue.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventQueue.java deleted file mode 100644 index 62779b5..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventQueue.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.events; - - -import net.sf.robocode.security.HiddenAccess; -import robocode.Event; - -import java.util.ArrayList; -import java.util.Collections; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class EventQueue extends ArrayList { - - public void clear(boolean includingSystemEvents) { - if (includingSystemEvents) { - super.clear(); - return; - } - - for (int i = 0; i < size(); i++) { - Event e = get(i); - - if (!HiddenAccess.isCriticalEvent(e)) { - remove(i--); - } - } - } - - public void clear(long clearTime) { - for (int i = 0; i < size(); i++) { - Event e = get(i); - - if ((e.getTime() <= clearTime) && !HiddenAccess.isCriticalEvent(e)) { - remove(i--); - } - } - } - - void sort() { - Collections.sort(this); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/IEventManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/IEventManager.java deleted file mode 100644 index 0d8a85e..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/IEventManager.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.events; - - -import robocode.*; - -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public interface IEventManager { - void addCustomEvent(Condition condition); - - void removeCustomEvent(Condition condition); - - void clearAllEvents(boolean includingSystemEvents); - - void setEventPriority(String eventClass, int priority); - - int getEventPriority(String eventClass); - - java.util.List getAllEvents(); - - List getBulletMissedEvents(); - - List getBulletHitBulletEvents(); - - List getBulletHitEvents(); - - List getHitByBulletEvents(); - - List getHitRobotEvents(); - - List getHitWallEvents(); - - List getRobotDeathEvents(); - - List getScannedRobotEvents(); - - // team - List getMessageEvents(); -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedInputStream.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedInputStream.java deleted file mode 100644 index 9e7c191..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedInputStream.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.io; - - -import java.io.IOException; -import java.io.InputStream; - - -/** - * @author Mathew A. Nelson (original) - */ -class BufferedPipedInputStream extends InputStream { - - private final BufferedPipedOutputStream out; - - protected BufferedPipedInputStream(BufferedPipedOutputStream out) { - this.out = out; - } - - @Override - public int read() throws IOException { - return out.read(); - } - - @Override - public int read(byte b[], int off, int len) throws IOException { - return out.read(b, off, len); - } - - @Override - public int available() { - return out.available(); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedOutputStream.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedOutputStream.java deleted file mode 100644 index 448e50c..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/BufferedPipedOutputStream.java +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.io; - - -import java.io.IOException; -import java.io.OutputStream; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -class BufferedPipedOutputStream extends OutputStream { - - private final Object monitor = new Object(); - private final byte[] buf; - private volatile int readIndex; - private volatile int writeIndex; - private volatile boolean waiting; - private volatile boolean closed; - private BufferedPipedInputStream in; - private final boolean skipLines; - - BufferedPipedOutputStream(int bufferSize, boolean skipLines) { - this.buf = new byte[bufferSize]; - this.skipLines = skipLines; - } - - /* - * @see OutputStream#write(int) - */ - @Override - public void write(int b) throws IOException { - synchronized (monitor) { - if (closed) { - throw new IOException("Stream is closed."); - } - - buf[writeIndex++] = (byte) (b & 0xff); - if (writeIndex == buf.length) { - writeIndex = 0; - } - if (writeIndex == readIndex) { - // skipping a line! - if (skipLines) { - boolean writeIndexReached = false; - - while (buf[readIndex] != '\n') { - readIndex++; - if (readIndex == buf.length) { - readIndex = 0; - } - if (readIndex == writeIndex) { - writeIndexReached = true; - } - } - if (!writeIndexReached) { - readIndex++; - if (readIndex == buf.length) { - readIndex = 0; - } - } - } else { - throw new IOException("Buffer is full."); - } - } - if (waiting) { - monitor.notifyAll(); - } - } - } - - protected int read() throws IOException { - synchronized (monitor) { - while (readIndex == writeIndex) { - waiting = true; - try { - if (!closed) { - monitor.wait(10000); - } - if (closed) { - return -1; - } - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - IOException ioException = new IOException("read interrupted"); - - ioException.initCause(e); - throw ioException; - } - } - int result = buf[readIndex++]; - - if (readIndex == buf.length) { - readIndex = 0; - } - - return result; - } - } - - int read(byte b[], int off, int len) throws IOException { - if (b == null) { - throw new NullPointerException(); - } else if (off < 0 || len < 0 || off >= b.length || (off + len) > b.length) { - throw new IndexOutOfBoundsException(); - } else if (len == 0) { - return 0; - } - int first = read(); - - if (first == -1) { - return -1; - } - - b[off] = (byte) (first & 0xff); - int count = 1; - - synchronized (monitor) { - for (int i = 1; readIndex != writeIndex && i < len; i++) { - b[off + i] = buf[readIndex++]; - count++; - if (readIndex == buf.length) { - readIndex = 0; - } - } - } - return count; - } - - protected int available() { - synchronized (monitor) { - if (writeIndex == readIndex) { - return 0; - } else if (writeIndex > readIndex) { - return writeIndex - readIndex; - } else { - return buf.length - readIndex + writeIndex; - } - } - } - - public BufferedPipedInputStream getInputStream() { - synchronized (monitor) { - if (in == null) { - in = new BufferedPipedInputStream(this); - } - return in; - } - } - - @Override - public void close() { - synchronized (monitor) { - closed = true; - if (waiting) { - monitor.notifyAll(); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileOutputStream.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileOutputStream.java deleted file mode 100644 index 3895021..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileOutputStream.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.io; - - -import java.io.FileOutputStream; -import java.io.IOException; - - -/** - * @author Pavel Savara (original) - */ -public class RobotFileOutputStream extends FileOutputStream { - - private RobotFileSystemManager fileSystemManager; - - public RobotFileOutputStream(String filename, boolean append, RobotFileSystemManager fileSystemManager) throws IOException { - super(filename, append); - this.fileSystemManager = fileSystemManager; - fileSystemManager.addStream(this); - } - - @Override - public final void close() throws IOException { - fileSystemManager.removeStream(this); - super.close(); - } - - @Override - public final void write(byte[] b) throws IOException { - try { - fileSystemManager.checkQuota(b.length); - super.write(b); - } catch (IOException e) { - try { - close(); - } catch (IOException ignored) {} - throw e; - } - } - - @Override - public final void write(byte[] b, int off, int len) throws IOException { - if (len < 0) { - throw new IndexOutOfBoundsException(); - } - try { - fileSystemManager.checkQuota(len); - super.write(b, off, len); - } catch (IOException e) { - try { - close(); - } catch (IOException ignored) {} - throw e; - } - } - - @Override - public final void write(int b) throws IOException { - try { - fileSystemManager.checkQuota(1); - super.write(b); - } catch (IOException e) { - try { - close(); - } catch (IOException ignored) {} - throw e; - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileSystemManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileSystemManager.java deleted file mode 100644 index 7ffb8d4..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotFileSystemManager.java +++ /dev/null @@ -1,336 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.io; - - -import net.sf.robocode.host.IHostedThread; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.version.Version; - -import java.io.*; -import java.net.JarURLConnection; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -public class RobotFileSystemManager { - private final IHostedThread robotProxy; - private long quotaUsed; - private boolean quotaMessagePrinted; - private final List streams = new ArrayList(); - private final long maxQuota; - private final String writableRootDirectory; - private final String readableRootDirectory; - private final String rootPath; - private final String dataDir; - - public RobotFileSystemManager(IHostedThread robotProxy, long maxQuota, String writableRootDirectory, String readableRootDirectory, String rootPath) { - this.robotProxy = robotProxy; - this.maxQuota = maxQuota; - this.writableRootDirectory = writableRootDirectory; - this.readableRootDirectory = readableRootDirectory; - this.rootPath = rootPath; - - this.dataDir = robotProxy.getStatics().getFullClassName().replace('.', '/') + ".data/"; - } - - public void initialize() { - initializeQuota(); - updateDataFiles(); - } - - void addStream(RobotFileOutputStream s) throws IOException { - if (s == null) { - throw new SecurityException("You may not add a null stream."); - } - if (!streams.contains(s)) { - if (streams.size() < 5) { - streams.add(s); - } else { - throw new SecurityException( - "You may only have 5 streams open at a time.\n Make sure you call close() on your streams when you are finished with them."); - } - } - } - - public synchronized void adjustQuota(long len) { - quotaUsed += len; - } - - public void checkQuota() throws IOException { - checkQuota(0); - } - - void checkQuota(long numBytes) throws IOException { - if (numBytes < 0) { - throw new IllegalArgumentException("checkQuota on negative numBytes!"); - } - if (quotaUsed + numBytes <= maxQuota) { - adjustQuota(numBytes); - } else { - final String msg = "You have reached your filesystem quota of: " + maxQuota + " bytes."; - - if (!quotaMessagePrinted) { - robotProxy.println("SYSTEM: " + msg); - quotaMessagePrinted = true; - } - throw new IOException(msg); // Must be IOException due to bug fix [2960894] - } - } - - public long getMaxQuota() { - return maxQuota; - } - - public long getQuotaUsed() { - return quotaUsed; - } - - public File getReadableDirectory() { - try { - return (readableRootDirectory == null) ? null : new File(readableRootDirectory).getCanonicalFile(); - } catch (IOException e) { - Logger.logError(e); - return null; - } - } - - public File getWritableDirectory() { - try { - return (writableRootDirectory == null) - ? null - : new File(writableRootDirectory, robotProxy.getStatics().getShortClassName() + ".data").getCanonicalFile(); - } catch (IOException e) { - Logger.logError(e); - return null; - } - } - - public File getDataFile(String filename) { - filename = filename.replaceAll("\\*", ""); - - final File parent = getWritableDirectory(); - File file = new File(parent, filename); - - // TODO the file is never replaced from jar or directory after it was created - // TODO it would be good to replace it when it have bigger last modified date - if (!file.exists()) { - if (parent != null && !parent.exists() && !parent.mkdirs()) { - return file; - } - InputStream is = null; - OutputStream os = null; - - try { - URL url = new URL(rootPath + dataDir + filename); - - URLConnection connection = url.openConnection(); - connection.setUseCaches(false); - try { - is = connection.getInputStream(); - } catch (FileNotFoundException ex) { // Expected as no file might exists with the specified input 'filename' - // #380 yet another historical bot related bug - Version robocodeVersion = toVersion(robotProxy.getStatics().getRobocodeVersion()); - if (robocodeVersion != null && robocodeVersion.compareTo("1.8.2.0") < 0) { - throw ex; - } - } - os = new FileOutputStream(file); - if (is != null) { - copyStream(is, os); - } - } catch (IOException e) { - // #380 yet another historical bot related bug - boolean legacyRobot = false; - if (e instanceof FileNotFoundException) { - Version robocodeVersion = toVersion(robotProxy.getStatics().getRobocodeVersion()); - if (robocodeVersion != null && robocodeVersion.compareTo("1.8.2.0") < 0) { - legacyRobot = true; - } - } - if (!legacyRobot) { - // Always log error, unless an legacy robot got a FileNotFoundException - Logger.logError(e); - } - } finally { - FileUtil.cleanupStream(is); - FileUtil.cleanupStream(os); - } - } - return file; - } - - private void initializeQuota() { - quotaUsed = 0; - quotaMessagePrinted = false; - - File dataDirectory = getWritableDirectory(); - - if (dataDirectory != null && dataDirectory.exists()) { - File[] dataFiles = dataDirectory.listFiles(); - - for (File file : dataFiles) { - quotaUsed += file.length(); - } - } - } - - public boolean isReadable(String fileName) { - File allowedDirectory = getReadableDirectory(); - if (allowedDirectory == null) { - return false; - } - - File attemptedFile; - try { - attemptedFile = new File(fileName).getCanonicalFile(); - } catch (IOException e) { - return false; - } - - if (attemptedFile.equals(allowedDirectory)) { - return true; // recursive check - } - - if (attemptedFile.getParent().indexOf(allowedDirectory.toString()) == 0) { - String fs = attemptedFile.toString(); - int dataIndex = fs.indexOf(".data", allowedDirectory.toString().length()); - - if (dataIndex >= 0) { - if (isWritable(fileName) || attemptedFile.equals(getWritableDirectory())) { - return true; - } - throw new java.security.AccessControlException( - "Preventing " + Thread.currentThread().getName() + " from access to: " + fileName - + ": You may not read another robot's data directory."); - } - return true; - } - - return false; - } - - public boolean isWritable(String fileName) { - File allowedDirectory = getWritableDirectory(); - - if (allowedDirectory == null) { - return false; - } - - File attemptedFile; - - try { - attemptedFile = new File(fileName).getCanonicalFile(); - } catch (IOException e) { - return false; - } - - return attemptedFile.equals(allowedDirectory) || attemptedFile.getParentFile().equals(allowedDirectory); - } - - void removeStream(RobotFileOutputStream s) { - if (s == null) { - throw new SecurityException("You may not remove a null stream."); - } - if (streams.contains(s)) { - streams.remove(s); - } - } - - private void updateDataFiles() { - try { - if (rootPath.startsWith("jar:")) { - updateDataFilesFromJar(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void updateDataFilesFromJar() throws IOException { - URL url = new URL(rootPath); - JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); - - jarConnection.setUseCaches(false); - - JarFile jarFile = jarConnection.getJarFile(); - - Enumeration entries = jarFile.entries(); - - final File parent = getWritableDirectory(); - - if (!parent.exists() && !parent.mkdirs()) { - throw new IOException("Could not create writeable directory for " + robotProxy.getStatics().getName()); - } - - InputStream is = null; - OutputStream os = null; - - while (entries.hasMoreElements()) { - JarEntry jarEntry = (JarEntry) entries.nextElement(); - - String filename = jarEntry.getName(); - - if (filename.startsWith(dataDir)) { - filename = filename.substring(dataDir.length()); - if (filename.length() == 0) { // Bugfix [2845608] - FileNotFoundException - continue; - } - - is = null; - os = null; - try { - is = jarFile.getInputStream(jarEntry); - os = new FileOutputStream(new File(parent, filename)); - copyStream(is, os); - } finally { - FileUtil.cleanupStream(is); - FileUtil.cleanupStream(os); - } - } - } - } - - private void copyStream(InputStream is, OutputStream os) throws IOException { - BufferedInputStream bis = new BufferedInputStream(is); - BufferedOutputStream bos = new BufferedOutputStream(os); - - byte[] buf = new byte[8192]; - int len; - - while ((len = bis.read(buf)) > 0) { - bos.write(buf, 0, len); - } - bos.flush(); - } - - private static Version toVersion(String vers) { - if (vers != null) { - vers = vers.trim(); - if (vers.length() > 0) { - try { - return new Version(vers); - } catch (IllegalArgumentException ex) { - return null; - } - } - } - return null; - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotOutputStream.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotOutputStream.java deleted file mode 100644 index 74cd65f..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/io/RobotOutputStream.java +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.io; - - -import java.io.PrintWriter; -import java.io.StringWriter; - -import net.sf.robocode.io.RobocodeProperties; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobotOutputStream extends java.io.PrintStream { - - private static final int MAX_CHARS = 50000; - - private int count = 0; - private boolean messaged = false; - private final StringBuilder text; - private final Object syncRoot = new Object(); - - public RobotOutputStream() { - super(new BufferedPipedOutputStream(128, true)); - this.text = new StringBuilder(8192); - } - - public String readAndReset() { - synchronized (syncRoot) { - - // Out's counter must be reset before processing event. - // Otherwise, it will not be reset when printing in the onScannedEvent() - // before a scan() call, which will potentially cause a new onScannedEvent() - // and therefore not be able to reset the counter. - count = 0; - - if (text.length() > 0) { - final String result = text.toString(); - - text.setLength(0); - return result; - } - return ""; - } - } - - private boolean isOkToPrint() { - synchronized (syncRoot) { - if (RobocodeProperties.isDebuggingOn()) { // It is always allowed to print when debugging is enabled. - return true; - } - if (count > MAX_CHARS) { - if (!messaged) { - text.append( - "\nSYSTEM: This robot is printing too much between actions. Output stopped until next action.\n"); - messaged = true; - } - return false; - } - messaged = false; - return true; - } - } - - @Override - public void print(char[] s) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append(s); - count += text.length() - origLen; - } - } - } - - @Override - public void print(char c) { - synchronized (syncRoot) { - if (isOkToPrint()) { - text.append(c); - count++; - } - } - } - - @Override - public void print(double d) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append(d); - count += text.length() - origLen; - } - } - } - - @Override - public void print(float f) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append(f); - count += text.length() - origLen; - } - } - } - - @Override - public void print(int i) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append(i); - count += text.length() - origLen; - } - } - } - - @Override - public void print(long l) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append(l); - count += text.length() - origLen; - } - } - } - - @Override - public void print(Object obj) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - if (obj != null) { - String s = obj.toString(); - - text.append(s); - } else { - text.append((Object) null); - } - count += text.length() - origLen; - } - } - } - - @Override - public void print(String s) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append(s); - count += text.length() - origLen; - } - } - } - - @Override - public void print(boolean b) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append(b); - count += text.length() - origLen; - } - } - } - - @Override - public void println() { - print('\n'); - } - - @Override - public void println(char[] x) { - print(x); - print('\n'); - } - - @Override - public void println(char x) { - print(x); - print('\n'); - } - - @Override - public void println(double x) { - print(x); - print('\n'); - } - - @Override - public void println(float x) { - print(x); - print('\n'); - } - - @Override - public void println(int x) { - print(x); - print('\n'); - } - - @Override - public void println(long x) { - print(x); - print('\n'); - } - - @Override - public void println(Object x) { - print(x); - print('\n'); - } - - @Override - public void println(String x) { - print(x); - print('\n'); - } - - @Override - public void println(boolean x) { - print(x); - print('\n'); - } - - @Override - public void write(byte[] buf) { - write(buf, 0, buf.length); - } - - @Override - public void write(byte[] buf, int off, int len) { - synchronized (syncRoot) { - if (isOkToPrint()) { - if (buf != null) { - int origLen = text.length(); - - for (int i = 0; i < len; i++) { - text.append((char) buf[off + i]); - } - count += text.length() - origLen; - } - } - } - } - - @Override - public void write(int b) { - synchronized (syncRoot) { - if (isOkToPrint()) { - int origLen = text.length(); - - text.append((char) b); - count += text.length() - origLen; - } - } - } - - public void printStackTrace(Throwable t) { - if (t != null) { - synchronized (syncRoot) { - if (isOkToPrint()) { - StringWriter sw = new StringWriter(); - final PrintWriter writer = new PrintWriter(sw); - - t.printStackTrace(writer); - writer.flush(); - - int origLen = text.length(); - - text.append(sw.toString()); - count += text.length() - origLen; - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/jarjar/JarJarURLConnection.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/jarjar/JarJarURLConnection.java deleted file mode 100644 index bce050c..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/jarjar/JarJarURLConnection.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -// NOTE: JarJarURLStreamHandler is just tweaked version of jar handler from OpenJDK. - -package net.sf.robocode.host.jarjar; - - -import net.sf.robocode.io.URLJarCollector; -import net.sf.robocode.io.JarJar; - -import java.io.InputStream; -import java.io.IOException; -import java.net.*; - - -// TODO: Update to new version from OpenJDK - -/** - * @author Sun Microsystems, Inc (original) - * @author Pavel Savara (contributor) - */ -public class JarJarURLConnection extends URLConnection { - - private final static char SEPARATOR_CHAR = JarJar.SEPARATOR_CHAR; // this is '^' now - private final static String SEPARATOR = SEPARATOR_CHAR + "/"; - - private URLConnection connection; - private static boolean registered; - - private JarJarURLConnection(URL url) - throws IOException { - super(url); - final String file = url.getFile(); - URL inner = new URL(file); - - // this is same as - // connection = inner.openConnection() - // we just cache the connection in URLJarCollector - // because we need to be able to close it to release jar files - connection = URLJarCollector.openConnection(inner); - } - - public void connect() throws IOException { - if (!connected) { - connection.connect(); - connected = true; - } - } - - public InputStream getInputStream() throws IOException { - connect(); - return connection.getInputStream(); - } - - public static void register() { - if (!registered) { - URL.setURLStreamHandlerFactory(new JarJarURLStreamHandlerFactory()); - registered = true; - } - } - - private static class JarJarURLStreamHandlerFactory implements URLStreamHandlerFactory { - public URLStreamHandler createURLStreamHandler(String protocol) { - if (protocol.equals("jarjar")) { - return new JarJarURLStreamHandler(); - } - return null; - } - } - - - private static class JarJarURLStreamHandler extends URLStreamHandler { - - protected URLConnection openConnection(URL u) throws IOException { - return new JarJarURLConnection(u); - } - - private int indexOfBangSlash(String spec) { - int indexOfBang = spec.length(); - - while ((indexOfBang = spec.lastIndexOf(SEPARATOR_CHAR, indexOfBang)) != -1) { - if ((indexOfBang != (spec.length() - 1)) && (spec.charAt(indexOfBang + 1) == '/')) { - return indexOfBang + 1; - } else { - indexOfBang--; - } - } - return -1; - } - - @SuppressWarnings({ "deprecation"}) - protected void parseURL(URL url, String spec, - int start, int limit) { - String file = null; - String ref = null; - // first figure out if there is an anchor - int refPos = spec.indexOf('#', limit); - boolean refOnly = refPos == start; - - if (refPos > -1) { - ref = spec.substring(refPos + 1, spec.length()); - if (refOnly) { - file = url.getFile(); - } - } - // then figure out if the spec is - // 1. absolute (jarjar:) - // 2. relative (i.e. url + foo/bar/baz.ext) - // 3. anchor-only (i.e. url + #foo), which we already did (refOnly) - boolean absoluteSpec = false; - - if (spec.length() >= 7) { - absoluteSpec = spec.substring(0, 7).equalsIgnoreCase("jarjar:"); - } - spec = spec.substring(start, limit); - - if (absoluteSpec) { - file = parseAbsoluteSpec(spec); - } else if (!refOnly) { - file = parseContextSpec(url, spec); - - // Canonize the result after the bangslash - int bangSlash = indexOfBangSlash(file); - String toBangSlash = file.substring(0, bangSlash); - String afterBangSlash = file.substring(bangSlash); - - file = toBangSlash + afterBangSlash; - } - file = file != null ? "jar:" + file.replaceFirst("\\" + SEPARATOR, "!/") : null; - setURL(url, "jarjar", "", -1, file, ref); - } - - private String parseAbsoluteSpec(String spec) { - @SuppressWarnings("unused") - URL url = null; - int index = -1; - - // check for !/ - if ((index = indexOfBangSlash(spec)) == -1) { - throw new NullPointerException("no " + SEPARATOR + " in spec"); - } - // test the inner URL - try { - String innerSpec = spec.substring(0, index - 1); - - url = new URL(innerSpec); - } catch (MalformedURLException e) { - throw new NullPointerException("invalid url: " + spec + " (" + e + ")"); - } - return spec; - } - - private String parseContextSpec(URL url, String spec) { - String ctxFile = url.getFile(); - - // if the spec begins with /, chop up the jar back !/ - if (spec.startsWith("/")) { - int bangSlash = indexOfBangSlash(ctxFile); - - if (bangSlash == -1) { - throw new NullPointerException("malformed " + "context url:" + url + ": no " + SEPARATOR); - } - ctxFile = ctxFile.substring(0, bangSlash); - } - if (!ctxFile.endsWith("/") && (!spec.startsWith("/"))) { - // chop up the last component - int lastSlash = ctxFile.lastIndexOf('/'); - - if (lastSlash == -1) { - throw new NullPointerException("malformed " + "context url:" + url); - } - ctxFile = ctxFile.substring(0, lastSlash + 1); - } - return (ctxFile + spec); - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/AdvancedRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/AdvancedRobotProxy.java deleted file mode 100644 index da868da..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/AdvancedRobotProxy.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.proxies; - - -import net.sf.robocode.host.RobotStatics; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.repository.IRobotItem; -import robocode.*; -import robocode.robotinterfaces.peer.IAdvancedRobotPeer; - -import java.io.File; -import java.security.AccessControlException; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.List; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class AdvancedRobotProxy extends StandardRobotProxy implements IAdvancedRobotPeer { - - public AdvancedRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) { - super(specification, hostManager, peer, statics); - } - - public boolean isAdjustGunForBodyTurn() { - getCall(); - return commands.isAdjustGunForBodyTurn(); - } - - public boolean isAdjustRadarForGunTurn() { - getCall(); - return commands.isAdjustRadarForGunTurn(); - } - - public boolean isAdjustRadarForBodyTurn() { - getCall(); - return commands.isAdjustRadarForBodyTurn(); - } - - // asynchronous actions - public void setResume() { - setCall(); - setResumeImpl(); - } - - public void setStop(boolean overwrite) { - setCall(); - setStopImpl(overwrite); - } - - public void setMove(double distance) { - setCall(); - setMoveImpl(distance); - } - - public void setTurnBody(double radians) { - setCall(); - setTurnBodyImpl(radians); - } - - public void setTurnGun(double radians) { - setCall(); - setTurnGunImpl(radians); - } - - public void setTurnRadar(double radians) { - setCall(); - setTurnRadarImpl(radians); - } - - // blocking actions - public void waitFor(Condition condition) { - waitCondition = condition; - do { - execute(); // Always tick at least once - } while (!condition.test()); - - waitCondition = null; - } - - // fast setters - public void setMaxTurnRate(double newTurnRate) { - setCall(); - if (Double.isNaN(newTurnRate)) { - println("You cannot setMaxTurnRate to: " + newTurnRate); - return; - } - commands.setMaxTurnRate(newTurnRate); - } - - public void setMaxVelocity(double newVelocity) { - setCall(); - if (Double.isNaN(newVelocity)) { - println("You cannot setMaxVelocity to: " + newVelocity); - return; - } - commands.setMaxVelocity(newVelocity); - } - - // events manipulation - public void setInterruptible(boolean interruptable) { - setCall(); - eventManager.setInterruptible(eventManager.getCurrentTopEventPriority(), interruptable); - } - - public void setEventPriority(String eventClass, int priority) { - setCall(); - eventManager.setEventPriority(eventClass, priority); - } - - public int getEventPriority(String eventClass) { - getCall(); - return eventManager.getEventPriority(eventClass); - } - - public void removeCustomEvent(Condition condition) { - setCall(); - eventManager.removeCustomEvent(condition); - } - - public void addCustomEvent(Condition condition) { - setCall(); - eventManager.addCustomEvent(condition); - } - - public void clearAllEvents() { - setCall(); - eventManager.clearAllEvents(false); - } - - public List getAllEvents() { - getCall(); - return eventManager.getAllEvents(); - } - - public List getStatusEvents() { - getCall(); - return eventManager.getStatusEvents(); - } - - public List getBulletMissedEvents() { - getCall(); - return eventManager.getBulletMissedEvents(); - } - - public List getBulletHitBulletEvents() { - getCall(); - return eventManager.getBulletHitBulletEvents(); - } - - public List getBulletHitEvents() { - getCall(); - return eventManager.getBulletHitEvents(); - } - - public List getHitByBulletEvents() { - getCall(); - return eventManager.getHitByBulletEvents(); - } - - public List getHitRobotEvents() { - getCall(); - return eventManager.getHitRobotEvents(); - } - - public List getHitWallEvents() { - getCall(); - return eventManager.getHitWallEvents(); - } - - public List getRobotDeathEvents() { - getCall(); - return eventManager.getRobotDeathEvents(); - } - - public List getScannedRobotEvents() { - getCall(); - return eventManager.getScannedRobotEvents(); - } - - // data - public File getDataDirectory() { - getCall(); - commands.setIORobot(); - return robotFileSystemManager.getWritableDirectory(); - } - - public File getDataFile(final String filename) { - getCall(); - commands.setIORobot(); - if (filename.contains("..")) { - throw new AccessControlException("no relative path allowed"); - } - - return AccessController.doPrivileged(new PrivilegedAction() { - public File run() { - return robotFileSystemManager.getDataFile(filename); - } - }); - } - - public long getDataQuotaAvailable() { - getCall(); - return robotFileSystemManager.getMaxQuota() - robotFileSystemManager.getQuotaUsed(); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/BasicRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/BasicRobotProxy.java deleted file mode 100644 index 8f0fea8..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/BasicRobotProxy.java +++ /dev/null @@ -1,567 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.proxies; - - -import net.sf.robocode.host.RobotStatics; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.host.events.EventManager; -import net.sf.robocode.peer.*; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.robotpaint.Graphics2DSerialized; -import net.sf.robocode.robotpaint.IGraphicsProxy; -import net.sf.robocode.security.HiddenAccess; -import robocode.*; -import robocode.Event; -import robocode.exception.AbortedException; -import robocode.exception.DeathException; -import robocode.exception.DisabledException; -import robocode.exception.RobotException; -import robocode.exception.WinException; -import robocode.robotinterfaces.peer.IBasicRobotPeer; -import robocode.util.Utils; - -import java.awt.*; -import static java.lang.Math.max; -import static java.lang.Math.min; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; - - -// XXX Remember to update the .NET version whenever a change is made to this class! - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class BasicRobotProxy extends HostingRobotProxy implements IBasicRobotPeer { - private static final long - MAX_SET_CALL_COUNT = 10000, - MAX_GET_CALL_COUNT = 10000; - - private IGraphicsProxy graphicsProxy; - - private RobotStatus status; - private boolean isDisabled; - protected ExecCommands commands; - private ExecResults execResults; - - private final Map bullets = new ConcurrentHashMap(); - private int nextBulletId = 1; // 0 is used for bullet explosions - - private final AtomicInteger setCallCount = new AtomicInteger(0); - private final AtomicInteger getCallCount = new AtomicInteger(0); - - protected Condition waitCondition; - private boolean testingCondition; - private double firedEnergy; - private double firedHeat; - - BasicRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) { - super(specification, hostManager, peer, statics); - - eventManager = new EventManager(this); - - graphicsProxy = new Graphics2DSerialized(); - - // dummy - execResults = new ExecResults(null, null, null, null, null, false, false, false); - - setSetCallCount(0); - setGetCallCount(0); - } - - protected void initializeRound(ExecCommands commands, RobotStatus status) { - updateStatus(commands, status); - - eventManager.reset(); - eventManager.add(new StatusEvent(status)); // Start event - - setSetCallCount(0); - setGetCallCount(0); - } - - @Override - public void cleanup() { - super.cleanup(); - - // Cleanup and remove current wait condition - if (waitCondition != null) { - waitCondition.cleanup(); - waitCondition = null; - } - - // Cleanup and remove the event manager - if (eventManager != null) { - eventManager.cleanup(); - eventManager = null; - } - - // Cleanup graphics proxy - graphicsProxy = null; - execResults = null; - status = null; - commands = null; - } - - // asynchronous actions - public Bullet setFire(double power) { - setCall(); - return setFireImpl(power); - } - - // blocking actions - public void execute() { - executeImpl(); - } - - public void move(double distance) { - setMoveImpl(distance); - do { - execute(); // Always tick at least once - } while (getDistanceRemaining() != 0); - } - - public void turnBody(double radians) { - setTurnBodyImpl(radians); - do { - execute(); // Always tick at least once - } while (getBodyTurnRemaining() != 0); - } - - public void turnGun(double radians) { - setTurnGunImpl(radians); - do { - execute(); // Always tick at least once - } while (getGunTurnRemaining() != 0); - } - - public Bullet fire(double power) { - Bullet bullet = setFire(power); - - execute(); - return bullet; - } - - // fast setters - public void setBodyColor(Color color) { - setCall(); - commands.setBodyColor(color != null ? color.getRGB() : ExecCommands.defaultBodyColor); - } - - public void setGunColor(Color color) { - setCall(); - commands.setGunColor(color != null ? color.getRGB() : ExecCommands.defaultGunColor); - } - - public void setRadarColor(Color color) { - setCall(); - commands.setRadarColor(color != null ? color.getRGB() : ExecCommands.defaultRadarColor); - } - - public void setBulletColor(Color color) { - setCall(); - commands.setBulletColor(color != null ? color.getRGB() : ExecCommands.defaultBulletColor); - } - - public void setScanColor(Color color) { - setCall(); - commands.setScanColor(color != null ? color.getRGB() : ExecCommands.defaultScanColor); - } - - // counters - public void setCall() { - if (!isDisabled) { - final int res = setCallCount.incrementAndGet(); - - if (res >= MAX_SET_CALL_COUNT) { - isDisabled = true; - println("SYSTEM: You have made " + res + " calls to setXX methods without calling execute()"); - throw new DisabledException("Too many calls to setXX methods"); - } - } - } - - public void getCall() { - if (!isDisabled) { - final int res = getCallCount.incrementAndGet(); - - if (res >= MAX_GET_CALL_COUNT) { - isDisabled = true; - println("SYSTEM: You have made " + res + " calls to getXX methods without calling execute()"); - throw new DisabledException("Too many calls to getXX methods"); - } - } - } - - public double getDistanceRemaining() { - getCall(); - return commands.getDistanceRemaining(); - } - - public double getRadarTurnRemaining() { - getCall(); - return commands.getRadarTurnRemaining(); - } - - public double getBodyTurnRemaining() { - getCall(); - return commands.getBodyTurnRemaining(); - } - - public double getGunTurnRemaining() { - getCall(); - return commands.getGunTurnRemaining(); - } - - public double getVelocity() { - getCall(); - return status.getVelocity(); - } - - public double getGunCoolingRate() { - getCall(); - return statics.getBattleRules().getGunCoolingRate(); - } - - public String getName() { - getCall(); - return statics.getName(); - } - - public long getTime() { - getCall(); - return getTimeImpl(); - } - - public double getBodyHeading() { - getCall(); - return status.getHeadingRadians(); - } - - public double getGunHeading() { - getCall(); - return status.getGunHeadingRadians(); - } - - public double getRadarHeading() { - getCall(); - return status.getRadarHeadingRadians(); - } - - public double getEnergy() { - getCall(); - return getEnergyImpl(); - } - - public double getGunHeat() { - getCall(); - return getGunHeatImpl(); - } - - public double getX() { - getCall(); - return status.getX(); - } - - public double getY() { - getCall(); - return status.getY(); - } - - public int getOthers() { - getCall(); - return status.getOthers(); - } - - public int getNumSentries() { - getCall(); - return status.getNumSentries(); - } - - public double getBattleFieldHeight() { - getCall(); - return statics.getBattleRules().getBattlefieldHeight(); - } - - public double getBattleFieldWidth() { - getCall(); - return statics.getBattleRules().getBattlefieldWidth(); - } - - public int getNumRounds() { - getCall(); - return statics.getBattleRules().getNumRounds(); - } - - public int getRoundNum() { - getCall(); - return status.getRoundNum(); - } - - public int getSentryBorderSize() { - getCall(); - return statics.getBattleRules().getSentryBorderSize(); - } - - public Graphics2D getGraphics() { - getCall(); - commands.setTryingToPaint(true); - return getGraphicsImpl(); - } - - public void setDebugProperty(String key, String value) { - setCall(); - commands.setDebugProperty(key, value); - } - - public void rescan() { - boolean reset = false; - boolean origInterruptableValue = false; - - if (eventManager.getCurrentTopEventPriority() == eventManager.getScannedRobotEventPriority()) { - reset = true; - origInterruptableValue = eventManager.isInterruptible(eventManager.getScannedRobotEventPriority()); - eventManager.setInterruptible(eventManager.getScannedRobotEventPriority(), true); - } - - commands.setScan(true); - executeImpl(); - - if (reset) { - eventManager.setInterruptible(eventManager.getScannedRobotEventPriority(), origInterruptableValue); - } - } - - // ----------- - // implementations - // ----------- - - public long getTimeImpl() { - return status.getTime(); - } - - public Graphics2D getGraphicsImpl() { - return (Graphics2D) graphicsProxy; - } - - @Override - protected final void executeImpl() { - if (execResults == null) { - // this is to slow down undead robot after cleanup, from fast exception-loop - try { - Thread.sleep(1000); - } catch (InterruptedException ignore) {} - } - - // Entering tick - robotThreadManager.checkRunThread(); - if (testingCondition) { - throw new RobotException( - "You cannot take action inside Condition.test(). You should handle onCustomEvent instead."); - } - - setSetCallCount(0); - setGetCallCount(0); - - // This stops autoscan from scanning... - if (waitCondition != null && waitCondition.test()) { - waitCondition = null; - commands.setScan(true); - } - - commands.setOutputText(out.readAndReset()); - commands.setGraphicsCalls(graphicsProxy.readoutQueuedCalls()); - - // Call server - execResults = peer.executeImpl(commands); - - updateStatus(execResults.getCommands(), execResults.getStatus()); - - graphicsProxy.setPaintingEnabled(execResults.isPaintEnabled()); - firedEnergy = 0; - firedHeat = 0; - - // add new events - eventManager.add(new StatusEvent(execResults.getStatus())); - if (statics.isPaintRobot() && execResults.isPaintEnabled()) { - // Add paint event, if robot is a paint robot and its painting is enabled - eventManager.add(new PaintEvent()); - } - - // add other events - if (execResults.getEvents() != null) { - for (Event event : execResults.getEvents()) { - eventManager.add(event); - } - } - - if (execResults.getBulletUpdates() != null) { - for (BulletStatus bulletStatus : execResults.getBulletUpdates()) { - final Bullet bullet = bullets.get(bulletStatus.bulletId); - - if (bullet != null) { - HiddenAccess.update(bullet, bulletStatus.x, bulletStatus.y, bulletStatus.victimName, - bulletStatus.isActive); - if (!bulletStatus.isActive) { - bullets.remove(bulletStatus.bulletId); - } - } - } - } - - // add new team messages - loadTeamMessages(execResults.getTeamMessages()); - - eventManager.processEvents(); - } - - @Override - protected final void waitForBattleEndImpl() { - eventManager.clearAllEvents(false); - graphicsProxy.setPaintingEnabled(false); - do { - // Make sure remaining system events like e.g. are processed this round - try { - eventManager.processEvents(); - - // The exceptions below are expected to occur, and has already been logged in the robot console, - // but still exists in the robot's event queue. Hence we just ignore these! - // Look in the HostingRobotProxy.run() to see which robot errors that are already handled. - } catch (DeathException ignore) {} catch (WinException ignore) {// Bug fix [2952549] - } catch (AbortedException ignore) {} catch (DisabledException ignore) {// Bug fix [2976258] - } - - commands.setOutputText(out.readAndReset()); - commands.setGraphicsCalls(graphicsProxy.readoutQueuedCalls()); - - // Call server - execResults = peer.waitForBattleEndImpl(commands); - - updateStatus(execResults.getCommands(), execResults.getStatus()); - - // Add remaining events like BattleEndedEvent Otherwise, the robot might never receive those events - if (execResults.getEvents() != null) { - for (Event event : execResults.getEvents()) { - if (event instanceof BattleEndedEvent) { - eventManager.add(event); - } - } - } - eventManager.resetCustomEvents(); - } while (!execResults.isHalt() && execResults.isShouldWait()); - } - - private void updateStatus(ExecCommands commands, RobotStatus status) { - this.status = status; - this.commands = commands; - } - - protected void loadTeamMessages(java.util.List teamMessages) {} - - private final double getEnergyImpl() { - return status.getEnergy() - firedEnergy; - } - - private final double getGunHeatImpl() { - return status.getGunHeat() + firedHeat; - } - - protected final void setMoveImpl(double distance) { - if (getEnergyImpl() == 0) { - return; - } - commands.setDistanceRemaining(distance); - commands.setMoved(true); - } - - private final Bullet setFireImpl(double power) { - if (Double.isNaN(power)) { - println("SYSTEM: You cannot call fire(NaN)"); - return null; - } - if (getGunHeatImpl() > 0 || getEnergyImpl() == 0) { - return null; - } - - power = min(getEnergyImpl(), min(max(power, Rules.MIN_BULLET_POWER), Rules.MAX_BULLET_POWER)); - - Bullet bullet; - BulletCommand wrapper; - Event currentTopEvent = eventManager.getCurrentTopEvent(); - - nextBulletId++; - - if (currentTopEvent != null && currentTopEvent.getTime() == status.getTime() && !statics.isAdvancedRobot() - && status.getGunHeadingRadians() == status.getRadarHeadingRadians() - && ScannedRobotEvent.class.isAssignableFrom(currentTopEvent.getClass())) { - // this is angle assisted bullet - ScannedRobotEvent e = (ScannedRobotEvent) currentTopEvent; - double fireAssistAngle = Utils.normalAbsoluteAngle(status.getHeadingRadians() + e.getBearingRadians()); - - bullet = new Bullet(fireAssistAngle, getX(), getY(), power, statics.getName(), null, true, nextBulletId); - wrapper = new BulletCommand(power, true, fireAssistAngle, nextBulletId); - } else { - // this is normal bullet - bullet = new Bullet(status.getGunHeadingRadians(), getX(), getY(), power, statics.getName(), null, true, - nextBulletId); - wrapper = new BulletCommand(power, false, 0, nextBulletId); - } - - firedEnergy += power; - firedHeat += Rules.getGunHeat(power); - - commands.getBullets().add(wrapper); - - bullets.put(nextBulletId, bullet); - - return bullet; - } - - protected final void setTurnGunImpl(double radians) { - commands.setGunTurnRemaining(radians); - } - - protected final void setTurnBodyImpl(double radians) { - if (getEnergyImpl() > 0) { - commands.setBodyTurnRemaining(radians); - } - } - - protected final void setTurnRadarImpl(double radians) { - commands.setRadarTurnRemaining(radians); - } - - // ----------- - // battle driven methods - // ----------- - - private void setSetCallCount(int setCallCount) { - this.setCallCount.set(setCallCount); - } - - private void setGetCallCount(int getCallCount) { - this.getCallCount.set(getCallCount); - } - - // ----------- - // for robot thread - // ----------- - - public void setTestingCondition(boolean testingCondition) { - this.testingCondition = testingCondition; - } - - @Override - public String toString() { - return statics.getShortName() + "(" + (int) status.getEnergy() + ") X" + (int) status.getX() + " Y" - + (int) status.getY(); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/HostingRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/HostingRobotProxy.java deleted file mode 100644 index 9fdb31e..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/HostingRobotProxy.java +++ /dev/null @@ -1,306 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.proxies; - - -import net.sf.robocode.host.events.EventManager; -import net.sf.robocode.host.io.RobotFileSystemManager; -import net.sf.robocode.host.io.RobotOutputStream; -import net.sf.robocode.host.security.RobotThreadManager; -import net.sf.robocode.host.*; -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logMessage; -import net.sf.robocode.peer.BadBehavior; -import net.sf.robocode.peer.ExecCommands; -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.core.Container; -import robocode.RobotStatus; -import robocode.exception.AbortedException; -import robocode.exception.DeathException; -import robocode.exception.DisabledException; -import robocode.exception.WinException; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.peer.IBasicRobotPeer; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - - -// XXX Remember to update the .NET version whenever a change is made to this class! - -/** - * @author Pavel Savara (original) - */ -abstract class HostingRobotProxy implements IHostingRobotProxy, IHostedThread { - - private final IRobotItem robotSpecification; - - protected EventManager eventManager; - private final IHostManager hostManager; - protected RobotThreadManager robotThreadManager; - protected RobotFileSystemManager robotFileSystemManager; - private IThreadManager threadManager; - - private IBasicRobot robot; - protected final IRobotPeer peer; - protected IRobotClassLoader robotClassLoader; - - protected final RobotStatics statics; - protected RobotOutputStream out; - - private final Set securityViolations = Collections.synchronizedSet(new HashSet()); - - HostingRobotProxy(IRobotItem robotSpecification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) { - this.peer = peer; - this.statics = statics; - this.hostManager = hostManager; - this.robotSpecification = robotSpecification; - - robotClassLoader = getHost(robotSpecification).createLoader(robotSpecification); - robotClassLoader.setRobotProxy(this); - - out = new RobotOutputStream(); - robotThreadManager = new RobotThreadManager(this); - - loadClassBattle(); - - robotFileSystemManager = new RobotFileSystemManager(this, hostManager.getRobotFilesystemQuota(), - robotSpecification.getWritableDirectory(), robotSpecification.getReadableDirectory(), - robotSpecification.getRootPath()); - - robotFileSystemManager.initialize(); - } - - private JavaHost getHost(IRobotItem robotSpecification) { - return (JavaHost) Container.cache.getComponent("robocode.host." + robotSpecification.getPlatform().toLowerCase()); - } - - public void cleanup() { - robot = null; - - // Remove the file system and the manager - robotFileSystemManager = null; - if (out != null) { - out.close(); - out = null; - } - - if (robotThreadManager != null) { - robotThreadManager.cleanup(); - } - robotThreadManager = null; - - // Cleanup and remove class manager - if (robotClassLoader != null) { - robotClassLoader.cleanup(); - robotClassLoader = null; - } - } - - public RobotOutputStream getOut() { - return out; - } - - public void println(String s) { - out.println(s); - } - - private void println(Throwable ex) { - ex.printStackTrace(out); - } - - public RobotStatics getStatics() { - return statics; - } - - public RobotFileSystemManager getRobotFileSystemManager() { - return robotFileSystemManager; - } - - public ClassLoader getRobotClassloader() { - return (ClassLoader) robotClassLoader; - } - - // ----------- - // battle driven methods - // ----------- - - protected abstract void initializeRound(ExecCommands commands, RobotStatus status); - - public void startRound(ExecCommands commands, RobotStatus status) { - initializeRound(commands, status); - threadManager = ((HostManager) hostManager).getThreadManager(); - robotThreadManager.start(threadManager); - } - - public void forceStopThread() { - if (!robotThreadManager.forceStop()) { - peer.punishBadBehavior(BadBehavior.UNSTOPPABLE); - peer.setRunning(false); - } - } - - public void waitForStopThread() { - if (!robotThreadManager.waitForStop()) { - peer.punishBadBehavior(BadBehavior.UNSTOPPABLE); - peer.setRunning(false); - } - } - - private void loadClassBattle() { - try { - robotClassLoader.loadRobotMainClass(true); - } catch (RuntimeException e) { - println("SYSTEM: Could not load " + statics.getName() + " : "); - println(e); - drainEnergy(); - } - } - - private boolean loadRobotRound() { - robot = null; - try { - threadManager.setLoadingRobot(this); - robot = robotClassLoader.createRobotInstance(); - if (robot == null) { - println("SYSTEM: Skipping robot: " + statics.getName()); - return false; - } - robot.setOut(out); - robot.setPeer((IBasicRobotPeer) this); - eventManager.setRobot(robot); - } catch (IllegalAccessException e) { - println("SYSTEM: Unable to instantiate this robot: " + e); - println("SYSTEM: Is your constructor marked public?"); - println(e); - robot = null; - logError(e); - return false; - } catch (RuntimeException e) { - println("SYSTEM: An error occurred during initialization of " + statics.getName()); - println("SYSTEM: " + e); - println(e); - robot = null; - logError(e); - return false; - } finally { - threadManager.setLoadingRobot(null); - } - return true; - } - - protected abstract void executeImpl(); - - public void run() { - // Only initialize AWT if we are not running in headless mode. - // Bugfix [2833271] IllegalThreadStateException with the AWT-Shutdown thread. - // Read more about headless mode here: - // http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ - if (System.getProperty("java.awt.headless", "true").equals("false")) { - robotThreadManager.initAWT(); - } - - if (robotSpecification.isValid() && loadRobotRound()) { - try { - if (robot != null) { - peer.setRunning(true); - - // Process all events for the first turn. - // This is done as the first robot status event must occur before the robot - // has started running. - eventManager.processEvents(); - - // Call user code - callUserCode(); - } - while (peer.isRunning()) { - executeImpl(); - } - } catch (WinException e) {// Do nothing - } catch (AbortedException e) {// Do nothing - } catch (DeathException e) { - println("SYSTEM: " + statics.getName() + " has died"); - } catch (DisabledException e) { - drainEnergy(); - - String msg = e.getMessage(); - if (msg == null) { - msg = ""; - } else { - msg = ": " + msg; - } - println("SYSTEM: Robot disabled: " + msg); - logMessage("Robot disabled: " + statics.getName()); - } catch (Exception e) { - drainEnergy(); - println(e); - logMessage(statics.getName() + ": Exception: " + e); // without stack here - } catch (ThreadDeath e) { - drainEnergy(); - println(e); - logMessage(statics.getName() + " stopped successfully."); - throw e; // must be re-thrown in order to stop the thread - } catch (RuntimeException t) { - drainEnergy(); - println(t); - logMessage(statics.getName() + ": Throwable: " + t); // without stack here - } finally { - waitForBattleEndImpl(); - } - } else { - drainEnergy(); - peer.punishBadBehavior(BadBehavior.CANNOT_START); - waitForBattleEndImpl(); - } - - peer.setRunning(false); - - // If battle is waiting for us, well, all done! - synchronized (this) { - notifyAll(); - } - } - - private void callUserCode() { - Runnable runnable = robot.getRobotRunnable(); - if (runnable != null) { - runnable.run(); - } - } - - protected abstract void waitForBattleEndImpl(); - - public void drainEnergy() { - peer.drainEnergy(); - } - - public void punishSecurityViolation(String message) { - // Prevent unit tests of failing if multiple threads are calling this method in the same time. - // We only want the a specific type of security violation logged once so we only get one error - // per security violation. - synchronized (securityViolations) { - String key = message; - - if (key.startsWith("Preventing Thread-")) { - key = key.replaceAll("\\d+", "X"); - } - if (!securityViolations.contains(key)) { - securityViolations.add(key); - logError(message); - println("SYSTEM: " + message); - - if (securityViolations.size() == 1) { - peer.drainEnergy(); - peer.punishBadBehavior(BadBehavior.SECURITY_VIOLATION); - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy.java deleted file mode 100644 index 13be4eb..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/IHostingRobotProxy.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.proxies; - - -import net.sf.robocode.peer.ExecCommands; -import robocode.RobotStatus; - - -/** - * @author Pavel Savara (original) - */ -public interface IHostingRobotProxy { - - void startRound(ExecCommands commands, RobotStatus status); - - void forceStopThread(); - - void waitForStopThread(); - - void cleanup(); - -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/JuniorRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/JuniorRobotProxy.java deleted file mode 100644 index 65fa414..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/JuniorRobotProxy.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.proxies; - - -import net.sf.robocode.host.RobotStatics; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.repository.IRobotItem; -import robocode.Rules; -import robocode.robotinterfaces.peer.IJuniorRobotPeer; - - -/** - * NOTE: This is temporary implementation of the interface. You should not build any external component on top of it. - * - * @author Flemming N. Larsen (original) - * @author Pavel Savara (contributor) - */ -public class JuniorRobotProxy extends BasicRobotProxy implements IJuniorRobotPeer { - - public JuniorRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) { - super(specification, hostManager, peer, statics); - } - - public void turnAndMove(double distance, double radians) { - if (distance == 0) { - turnBody(radians); - return; - } - - // Save current max. velocity and max. turn rate so they can be restored - final double savedMaxVelocity = commands.getMaxVelocity(); - final double savedMaxTurnRate = commands.getMaxTurnRate(); - - final double absDegrees = Math.abs(Math.toDegrees(radians)); - final double absDistance = Math.abs(distance); - - // -- Calculate max. velocity for moving perfect in a circle -- - - // maxTurnRate = 10 * 0.75 * abs(velocity) (Robocode rule), and - // maxTurnRate = velocity * degrees / distance (curve turn rate) - // - // Hence, max. velocity = 10 / (degrees / distance + 0.75) - - final double maxVelocity = Math.min(Rules.MAX_VELOCITY, 10 / (absDegrees / absDistance + 0.75)); - - // -- Calculate number of turns for acceleration + deceleration -- - - double accDist = 0; // accumulated distance during acceleration - double decDist = 0; // accumulated distance during deceleration - - int turns = 0; // number of turns to it will take to move the distance - - // Calculate the amount of turn it will take to accelerate + decelerate - // up to the max. velocity, but stop if the distance for used for - // acceleration + deceleration gets bigger than the total distance to move - for (int t = 1; t < maxVelocity; t++) { - - // Add the current velocity to the acceleration distance - accDist += t; - - // Every 2nd time we add the deceleration distance needed to - // get to a velocity of 0 - if (t > 2 && (t % 2) > 0) { - decDist += t - 2; - } - - // Stop if the acceleration + deceleration > total distance to move - if ((accDist + decDist) >= absDistance) { - break; - } - - // Increment turn for acceleration - turns++; - - // Every 2nd time we increment time for deceleration - if (t > 2 && (t % 2) > 0) { - turns++; - } - } - - // Add number of turns for the remaining distance at max velocity - if ((accDist + decDist) < absDistance) { - turns += (int) ((absDistance - accDist - decDist) / maxVelocity + 1); - } - - // -- Move and turn in a curve -- - - // Set the calculated max. velocity - commands.setMaxVelocity(maxVelocity); - - // Set the robot to move the specified distance - setMoveImpl(distance); - // Set the robot to turn its body to the specified amount of radians - setTurnBodyImpl(radians); - - // Loop thru the number of turns it will take to move the distance and adjust - // the max. turn rate so it fit the current velocity of the robot - for (int t = turns; t >= 0; t--) { - commands.setMaxTurnRate(getVelocity() * radians / absDistance); - execute(); // Perform next turn - } - - // Restore the saved max. velocity and max. turn rate - commands.setMaxVelocity(savedMaxVelocity); - commands.setMaxTurnRate(savedMaxTurnRate); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/StandardRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/StandardRobotProxy.java deleted file mode 100644 index 804c379..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/StandardRobotProxy.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.proxies; - - -import net.sf.robocode.host.RobotStatics; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.peer.ExecCommands; -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.repository.IRobotItem; -import robocode.RobotStatus; -import robocode.robotinterfaces.peer.IStandardRobotPeer; - - -/** - * @author Pavel Savara (original) - */ -public class StandardRobotProxy extends BasicRobotProxy implements IStandardRobotPeer { - - private boolean isStopped; - private double saveAngleToTurn; - private double saveDistanceToGo; - private double saveGunAngleToTurn; - private double saveRadarAngleToTurn; - - public StandardRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) { - super(specification, hostManager, peer, statics); - } - - @Override - protected void initializeRound(ExecCommands commands, RobotStatus status) { - super.initializeRound(commands, status); - isStopped = true; - } - - // blocking actions - public void stop(boolean overwrite) { - setStopImpl(overwrite); - execute(); - } - - public void resume() { - setResumeImpl(); - execute(); - } - - public void turnRadar(double radians) { - setTurnRadarImpl(radians); - do { - execute(); // Always tick at least once - } while (getRadarTurnRemaining() != 0); - } - - // fast setters - public void setAdjustGunForBodyTurn(boolean newAdjustGunForBodyTurn) { - setCall(); - commands.setAdjustGunForBodyTurn(newAdjustGunForBodyTurn); - } - - public void setAdjustRadarForGunTurn(boolean newAdjustRadarForGunTurn) { - setCall(); - commands.setAdjustRadarForGunTurn(newAdjustRadarForGunTurn); - if (!commands.isAdjustRadarForBodyTurnSet()) { - commands.setAdjustRadarForBodyTurn(newAdjustRadarForGunTurn); - } - } - - public void setAdjustRadarForBodyTurn(boolean newAdjustRadarForBodyTurn) { - setCall(); - commands.setAdjustRadarForBodyTurn(newAdjustRadarForBodyTurn); - commands.setAdjustRadarForBodyTurnSet(true); - } - - protected final void setResumeImpl() { - if (isStopped) { - isStopped = false; - commands.setDistanceRemaining(saveDistanceToGo); - commands.setBodyTurnRemaining(saveAngleToTurn); - commands.setGunTurnRemaining(saveGunAngleToTurn); - commands.setRadarTurnRemaining(saveRadarAngleToTurn); - } - } - - protected final void setStopImpl(boolean overwrite) { - if (!isStopped || overwrite) { - this.saveDistanceToGo = getDistanceRemaining(); - this.saveAngleToTurn = getBodyTurnRemaining(); - this.saveGunAngleToTurn = getGunTurnRemaining(); - this.saveRadarAngleToTurn = getRadarTurnRemaining(); - } - isStopped = true; - - commands.setDistanceRemaining(0); - commands.setBodyTurnRemaining(0); - commands.setGunTurnRemaining(0); - commands.setRadarTurnRemaining(0); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/TeamRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/TeamRobotProxy.java deleted file mode 100644 index 22b8ca0..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/TeamRobotProxy.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.proxies; - - -import net.sf.robocode.host.RobotStatics; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.host.serialization.RobocodeObjectInputStream; -import net.sf.robocode.peer.IRobotPeer; -import net.sf.robocode.peer.TeamMessage; -import net.sf.robocode.repository.IRobotItem; -import robocode.MessageEvent; -import robocode.robotinterfaces.peer.ITeamRobotPeer; - -import java.io.*; -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public class TeamRobotProxy extends AdvancedRobotProxy implements ITeamRobotPeer { - private static final int MAX_MESSAGE_SIZE = 32768; - private final ByteArrayOutputStream byteStreamWriter; - - public TeamRobotProxy(IRobotItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) { - super(specification, hostManager, peer, statics); - byteStreamWriter = new ByteArrayOutputStream(MAX_MESSAGE_SIZE); - } - - // team - public String[] getTeammates() { - getCall(); - return statics.getTeammates(); - } - - public boolean isTeammate(String name) { - getCall(); - if (name != null) { // Bugfix [2960870] - if (name.equals(statics.getName())) { - return true; - } - final String[] teammates = statics.getTeammates(); - - if (teammates != null) { - for (String mate : teammates) { - if (mate.equals(name)) { - return true; - } - } - } - } - return false; - } - - public void broadcastMessage(Serializable message) throws IOException { - sendMessage(null, message); - } - - public void sendMessage(String name, Serializable message) throws IOException { - setCall(); - - try { - if (!statics.isTeamRobot()) { - throw new IOException("You are not on a team."); - } - byteStreamWriter.reset(); - ObjectOutputStream objectStreamWriter = new ObjectOutputStream(byteStreamWriter); - - objectStreamWriter.writeObject(message); - objectStreamWriter.flush(); - byteStreamWriter.flush(); - final byte[] bytes = byteStreamWriter.toByteArray(); - - objectStreamWriter.reset(); - if (bytes.length > MAX_MESSAGE_SIZE) { - throw new IOException("Message too big. " + bytes.length + ">" + MAX_MESSAGE_SIZE); - } - commands.getTeamMessages().add(new TeamMessage(getName(), name, bytes)); - } catch (IOException e) { - out.printStackTrace(e); - throw e; - } - - } - - @Override - protected final void loadTeamMessages(List teamMessages) { - if (teamMessages == null) { - return; - } - for (TeamMessage teamMessage : teamMessages) { - try { - ByteArrayInputStream byteStreamReader = new ByteArrayInputStream(teamMessage.message); - byteStreamReader.reset(); - - RobocodeObjectInputStream objectStreamReader = null; - try { - objectStreamReader = new RobocodeObjectInputStream(byteStreamReader, (ClassLoader) robotClassLoader); - Serializable message = (Serializable) objectStreamReader.readObject(); - MessageEvent event = new MessageEvent(teamMessage.sender, message); - eventManager.add(event); - } finally { - if (objectStreamReader != null) { - objectStreamReader.close(); - } - } - } catch (IOException e) { - out.printStackTrace(e); - } catch (ClassNotFoundException e) { - out.printStackTrace(e); - } - } - } - - // events - public List getMessageEvents() { - getCall(); - return eventManager.getMessageEvents(); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ClassAnalyzer.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ClassAnalyzer.java deleted file mode 100644 index 36208f3..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ClassAnalyzer.java +++ /dev/null @@ -1,248 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import net.sf.robocode.io.Logger; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -class ClassAnalyzer { - private final static byte CONSTANT_Class = 7; - private final static byte CONSTANT_Fieldref = 9; - private final static byte CONSTANT_Methodref = 10; - private final static byte CONSTANT_InterfaceMethodref = 11; - private final static byte CONSTANT_String = 8; - private final static byte CONSTANT_Integer = 3; - private final static byte CONSTANT_Float = 4; - private final static byte CONSTANT_Long = 5; - private final static byte CONSTANT_Double = 6; - private final static byte CONSTANT_NameAndType = 12; - private final static byte CONSTANT_Utf8 = 1; - - /** - * ClassAnalyzer constructor comment. - */ - public ClassAnalyzer() { - super(); - } - - static void getReferencedClasses(ByteBuffer classFile, Set collection) { - - /* - http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html - - 4.1 The ClassFile Structure - A class file consists of a single ClassFile structure: - - ClassFile { - u4 magic; - u2 minor_version; - u2 major_version; - u2 constant_pool_count; - cp_info constant_pool[constant_pool_count-1]; - u2 access_flags; - u2 this_class; - u2 super_class; - u2 interfaces_count; - u2 interfaces[interfaces_count]; - u2 fields_count; - field_info fields[fields_count]; - u2 methods_count; - method_info methods[methods_count]; - u2 attributes_count; - attribute_info attributes[attributes_count]; - } - */ - String strings[]; - List classNameIndexes = new ArrayList(); - - try { - DataInputStream in = new DataInputStream(new ByteArrayInputStream(classFile.array(), 0, classFile.limit())); - long magic = in.readInt(); - - if (magic != 0xCAFEBABE) { - Logger.logError("Not a class file!"); - return; - } - in.readUnsignedShort(); // minor version - in.readUnsignedShort(); // major version - int constant_pool_count = in.readUnsignedShort(); - - strings = new String[constant_pool_count]; - - /* - - All constant_pool table entries have the following general format: - - - cp_info { - u1 tag; - u1 info[]; - } - - Constant Type Value - CONSTANT_Class 7 - CONSTANT_Fieldref 9 - CONSTANT_Methodref 10 - CONSTANT_InterfaceMethodref 11 - CONSTANT_String 8 - CONSTANT_Integer 3 - CONSTANT_Float 4 - CONSTANT_Long 5 - CONSTANT_Double 6 - CONSTANT_NameAndType 12 - CONSTANT_Utf8 1 - */ - - - for (int i = 1; i < constant_pool_count; i++) { - byte tag = in.readByte(); - - switch (tag) { - - /* - CONSTANT_Class_info { - u1 tag; - u2 name_index; - } - */ - case CONSTANT_Class: { - int name_index = in.readUnsignedShort(); - - classNameIndexes.add(name_index); - } - break; - - /* - CONSTANT_Fieldref_info { - u1 tag; - u2 class_index; - u2 name_and_type_index; - } - CONSTANT_Methodref_info { - u1 tag; - u2 class_index; - u2 name_and_type_index; - } - CONSTANT_InterfaceMethodref_info { - u1 tag; - u2 class_index; - u2 name_and_type_index; - } - */ - case CONSTANT_Fieldref: - case CONSTANT_Methodref: - case CONSTANT_InterfaceMethodref: { - in.readUnsignedShort(); // class index - in.readUnsignedShort(); // name and type index - } - break; - - /* - CONSTANT_String_info { - u1 tag; - u2 string_index; - } - */ - case CONSTANT_String: { - in.readUnsignedShort(); // string index - } - break; - - /* - CONSTANT_Integer_info { - u1 tag; - u4 bytes; - } - CONSTANT_Float_info { - u1 tag; - u4 bytes; - } - */ - case CONSTANT_Integer: - case CONSTANT_Float: { - in.readInt(); // bytes - } - break; - - /* - CONSTANT_Long_info { - u1 tag; - u4 high_bytes; - u4 low_bytes; - } - CONSTANT_Double_info { - u1 tag; - u4 high_bytes; - u4 low_bytes; - } - All 8-byte constants take up two entries in the constant_pool table of the class file. If a CONSTANT_Long_info or CONSTANT_Double_info structure is the item in the constant_pool table at index n, then the next usable item in the pool is located at index n+2. The constant_pool index n+1 must be valid but is considered unusable.2 - */ - - case CONSTANT_Long: - case CONSTANT_Double: { - in.readInt(); // high bytes - in.readInt(); // low bytes - i++; // see "all 8-byte..." comment above. - } - break; - - /* - CONSTANT_NameAndType_info { - u1 tag; - u2 name_index; - u2 descriptor_index; - } - */ - case CONSTANT_NameAndType: { - in.readUnsignedShort(); // name index - in.readUnsignedShort(); // descriptor index - } - break; - - /* - CONSTANT_Utf8_info { - u1 tag; - u2 length; - u1 bytes[length]; - } - */ - case CONSTANT_Utf8: { - String utf8_string = in.readUTF(); - - strings[i] = utf8_string; - } - break; - } // switch - } // for i - } catch (IOException e) { - return; - } - - for (Integer classNameIndex : classNameIndexes) { - String className = strings[classNameIndex].replace('\\', '.').replace('/', '.'); - - if (className.indexOf("[") != 0 && !collection.contains(className)) { - collection.add(className); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodePermission.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodePermission.java deleted file mode 100644 index f33422f..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodePermission.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -/** - * @author Mathew A. Nelson (original) - */ -@SuppressWarnings("serial") class RobocodePermission extends java.security.Permission { - - RobocodePermission(String name) { - super(name); - } - - /** - * Checks two Permission objects for equality. - *

- * Do not use the {@code equals} method for making access control - * decisions; use the {@code implies} method. - * - * @param obj the object we are testing for equality with this object. - * @return true if both Permission objects are equivalent. - */ - @Override - public boolean equals(Object obj) { - return false; - } - - /** - * Returns the actions as a String. This is abstract - * so subclasses can defer creating a String representation until - * one is needed. Subclasses should always return actions in what they - * consider to be their - * canonical form. For example, two FilePermission objects created via - * the following: - *

- *

-	 *   perm1 = new FilePermission(p1,"read,write");
-	 *   perm2 = new FilePermission(p2,"write,read");
-	 * 
- *

- * both return - * "read,write" when the {code getActions()} method is invoked. - * - * @return the actions of this Permission. - */ - @Override - public String getActions() { - return null; - } - - /** - * Returns the hash code value for this Permission object. - *

- * The required {@code hashCode} behavior for Permission Objects is - * the following:

- *

    - *
  • Whenever it is invoked on the same Permission object more than - * once during an execution of a Java application, the - * {@code hashCode} method - * must consistently return the same integer. This integer need not - * remain consistent from one execution of an application to another - * execution of the same application.

    - *

  • If two Permission objects are equal according to the {@code equals} - * method, then calling the {@code hashCode} method on each of the - * two Permission objects must produce the same integer result. - *
- * - * @return a hash code value for this object. - */ - @Override - public int hashCode() { - return 0; - } - - /** - * Checks if the specified permission's actions are "implied by" - * this object's actions. - *

- * This must be implemented by subclasses of Permission, as they are the - * only ones that can impose semantics on a Permission object. - *

- *

The {@code implies} method is used by the AccessController to determine - * whether or not a requested permission is implied by another permission that - * is known to be valid in the current execution context. - * - * @param permission the permission to check against. - * @return true if the specified permission is implied by this object, - * false if not. - */ - @Override - public boolean implies(java.security.Permission permission) { - return false; - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityManager.java deleted file mode 100644 index 3eb2988..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityManager.java +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import net.sf.robocode.host.IHostedThread; -import net.sf.robocode.host.IThreadManager; -import net.sf.robocode.io.RobocodeProperties; - -import java.security.AccessControlException; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - * @author Pavel Savara (contributor) - */ -public class RobocodeSecurityManager extends SecurityManager { - - private final IThreadManager threadManager; - - public RobocodeSecurityManager(IThreadManager threadManager) { - super(); - this.threadManager = threadManager; - - ThreadGroup tg = Thread.currentThread().getThreadGroup(); - - while (tg != null) { - threadManager.addSafeThreadGroup(tg); - tg = tg.getParent(); - } - // We need to exercise it in order to load all used classes on this thread - isSafeThread(Thread.currentThread()); - if (RobocodeProperties.isSecurityOn()) { - System.setSecurityManager(this); - } - } - - @Override - public void checkAccess(Thread t) { - if (RobocodeProperties.isSecurityOff()) { - return; - } - - Thread c = Thread.currentThread(); - - if (isSafeThread(c)) { - return; - } - super.checkAccess(t); - - // Threads belonging to other thread groups is not allowed to access threads belonging to other thread groups - // Bug fix [3021140] Possible for robot to kill other robot threads. - // In the following the thread group of the current thread must be in the thread group hierarchy of the - // attacker thread; otherwise an AccessControlException must be thrown. - - boolean found = false; - - ThreadGroup cg = c.getThreadGroup(); - ThreadGroup tg = t.getThreadGroup(); - - while (tg != null) { - if (tg == cg) { - found = true; - break; - } - try { - tg = tg.getParent(); - } catch (AccessControlException e) { - // We expect an AccessControlException due to missing RuntimePermission modifyThreadGroup - break; - } - } - if (!found) { - String message = "Preventing " + c.getName() + " from access to " + t.getName(); - IHostedThread robotProxy = threadManager.getLoadedOrLoadingRobotProxy(c); - - if (robotProxy != null) { - robotProxy.punishSecurityViolation(message); - } - throw new AccessControlException(message); - } - } - - @Override - public void checkAccess(ThreadGroup g) { - if (RobocodeProperties.isSecurityOff()) { - return; - } - Thread c = Thread.currentThread(); - - if (isSafeThread(c)) { - return; - } - super.checkAccess(g); - - final ThreadGroup cg = c.getThreadGroup(); - - if (cg == null) { - // What the heck is going on here? JDK 1.3 is sending me a dead thread. - // This crashes the entire jvm if I don't return here. - return; - } - - IHostedThread robotProxy = threadManager.getLoadedOrLoadingRobotProxy(c); - - if (robotProxy == null) { - throw new AccessControlException("Preventing " + c.getName() + " from access to " + g.getName()); - } - - if (cg.activeCount() > 5) { - String message = "Robots are only allowed to create up to 5 threads!"; - - robotProxy.punishSecurityViolation(message); - throw new AccessControlException(message); - } - } - - private boolean isSafeThread(Thread c) { - return threadManager.isSafeThread(c); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityPolicy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityPolicy.java deleted file mode 100644 index 0a278b9..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobocodeSecurityPolicy.java +++ /dev/null @@ -1,322 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.host.IHostedThread; -import net.sf.robocode.host.IThreadManager; -import net.sf.robocode.host.io.RobotFileSystemManager; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.repository.IRepositoryManager; - -import java.io.File; -import java.io.FilePermission; -import java.io.IOException; -import java.net.MalformedURLException; -import java.security.*; -import java.util.*; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - * @author Pavel Savara (contributor) - */ -public class RobocodeSecurityPolicy extends Policy { - private static final boolean isFileReadSecutityOff = System.getProperty("OVERRIDEFILEREADSECURITY", "false").equals( - "true"); - private static final boolean isExperimental = System.getProperty("EXPERIMENTAL", "false").equals("true"); - private final Set allowedPackages = new HashSet(); - - private final Policy parentPolicy; - private final PermissionCollection allPermissions; - private Set untrustedCodeUrls; - - private final IThreadManager threadManager; - - public RobocodeSecurityPolicy(IThreadManager threadManager) { - this.parentPolicy = Policy.getPolicy(); - this.allPermissions = new Permissions(); - this.allPermissions.add(new AllPermission()); - this.threadManager = threadManager; - - allowedPackages.add("robocode.util"); - allowedPackages.add("robocode.robotinterfaces"); - allowedPackages.add("robocode.robotpaint"); - allowedPackages.add("robocode.robocodeGL"); - if (isExperimental) { - allowedPackages.add("robocode.robotinterfaces.peer"); - } - - initUrls(); - - if (RobocodeProperties.isSecurityOn()) { - Policy.setPolicy(this); - } - } - - @Override - public PermissionCollection getPermissions(ProtectionDomain domain) { - return getPermissions(domain.getCodeSource()); - } - - @Override - public PermissionCollection getPermissions(final CodeSource codeSource) { - if (RobocodeProperties.isSecurityOff()) { - return allPermissions; - } - - final String source = codeSource.getLocation().toString(); - - if (untrustedCodeUrls.contains(source)) { - return new Permissions(); - } - - return AccessController.doPrivileged(new PrivilegedAction() { - public PermissionCollection run() { - return parentPolicy.getPermissions(codeSource); - } - }); - } - - @Override - public boolean implies(ProtectionDomain domain, final Permission permission) { - if (RobocodeProperties.isSecurityOff()) { - return true; - } - final String source = domain.getCodeSource().getLocation().toString(); - - if (!untrustedCodeUrls.contains(source)) { - return true; - } - - return AccessController.doPrivileged(new PrivilegedAction() { - public Boolean run() { - return impliesRobot(permission); - } - }); - } - - private boolean impliesRobot(Permission perm) { - // For development purposes, allow read any file if override is set. - final String actions = perm.getActions(); - final String name = perm.getName(); - - if (perm instanceof FilePermission && actions.equals("read") && isFileReadSecutityOff) { - return true; - } - - // Allow reading of properties. - if (perm instanceof PropertyPermission && actions.equals("read")) { - return true; - } - - if (perm instanceof RobocodePermission) { - if (name.equals("System.out") || name.equals("System.err") || name.equals("System.in")) { - return true; - } - } - - // Ok, we need to figure out who our robot is. - Thread c = Thread.currentThread(); - - IHostedThread robotProxy = threadManager.getLoadedOrLoadingRobotProxy(c); - - if (robotProxy == null) { - Logger.logError("Preventing unknown thread " + Thread.currentThread().getName() + " from access: " + perm); - return false; - } - - // Attempt to stop the window from displaying - if (perm instanceof java.awt.AWTPermission) { - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + perm; - - robotProxy.punishSecurityViolation(message); - - // this is hack, because security exception is not enough - throw new ThreadDeath(); - } - - // FilePermission access request. - if (perm instanceof FilePermission) { - FilePermission filePermission = (FilePermission) perm; - // Get the fileSystemManager - RobotFileSystemManager fileSystemManager = robotProxy.getRobotFileSystemManager(); - - // Robot wants access to read something - if (filePermission.getActions().equals("read")) { - return impliesRobotFileRead(robotProxy, fileSystemManager, filePermission); - - } // Robot wants access to write something - else if (filePermission.getActions().equals("write")) { - return impliesRobotFileWrite(robotProxy, fileSystemManager, filePermission); - - } // Robot wants access to write something - else if (filePermission.getActions().equals("delete")) { - return impliesRobotFileDelete(robotProxy, fileSystemManager, filePermission); - - } - } - - // check package access - if (perm instanceof RuntimePermission && name.startsWith("accessClassInPackage.")) { - return impliesRobotPackageAccess(robotProxy, name.substring(21)); - } - - // Permission denied. - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + perm; - - robotProxy.punishSecurityViolation(message); - return false; - } - - private boolean impliesRobotPackageAccess(IHostedThread robotProxy, String packageName) { - if (packageName.startsWith("robocode.control") || packageName.startsWith("net.sf.robocode")) { - if (allowedPackages.contains(packageName)) { - return true; - } - final String message = "Preventing " + Thread.currentThread().getName() - + " from access to the internal Robocode package: " + packageName; - - robotProxy.punishSecurityViolation(message); - return false; - } - return true; - } - - private boolean impliesRobotFileDelete(IHostedThread robotProxy, RobotFileSystemManager fileSystemManager, FilePermission filePermission) { - // If there is no writable directory, deny access - if (fileSystemManager.getWritableDirectory() == null) { - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + filePermission - + ". Robots that are not in a package may not delete any files."; - - robotProxy.punishSecurityViolation(message); - return false; - } - // If this is a writable file, permit access - if (fileSystemManager.isWritable(filePermission.getName())) { - return true; - } // else it's not writable, deny access. - - // We are deleting our data directory. - if (fileSystemManager.getWritableDirectory().toString().equals(filePermission.getName())) { - return true; - } - // Not a writable directory. - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + filePermission - + ". You may only delete files in your own data directory: " + fileSystemManager.getWritableDirectory(); - - robotProxy.punishSecurityViolation(message); - return false; - } - - private boolean impliesRobotFileWrite(IHostedThread robotProxy, RobotFileSystemManager fileSystemManager, FilePermission filePermission) { - // There isn't one. Deny access. - if (!threadManager.checkRobotFileStream()) { - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + filePermission - + ". You must use a RobocodeOutputStream."; - - robotProxy.punishSecurityViolation(message); - return false; - } - - // If there is no writable directory, deny access - if (fileSystemManager.getWritableDirectory() == null) { - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + filePermission - + ". Robots that are not in a package may not write any files."; - - robotProxy.punishSecurityViolation(message); - return false; - } - // If this is a writable file, permit access - if (fileSystemManager.isWritable(filePermission.getName())) { - return true; - } // else it's not writable, deny access. - - // We are creating the directory. - if (fileSystemManager.getWritableDirectory().toString().equals(filePermission.getName())) { - return true; - } - // Not a writable directory. - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + filePermission - + ". You may only write files in your own data directory: " + fileSystemManager.getWritableDirectory(); - - robotProxy.punishSecurityViolation(message); - return false; - } - - private boolean impliesRobotFileRead(IHostedThread robotProxy, RobotFileSystemManager fileSystemManager, FilePermission filePermission) { - // If there is no readable directory, deny access. - if (fileSystemManager.getReadableDirectory() == null) { - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + filePermission - + ". Robots that are not in a package may not read any files."; - - robotProxy.punishSecurityViolation(message); - return false; - } - // If this is a writtable file, return. - if (fileSystemManager.isWritable(filePermission.getName())) { - return true; - } - // If this is a readable file, return. - if (fileSystemManager.isReadable(filePermission.getName())) { - return true; - } - // Else disable robot - final String message = "Preventing " + robotProxy.getStatics().getName() + " from access: " + filePermission - + ". You may only read files in your own root package directory."; - - robotProxy.punishSecurityViolation(message); - return false; - } - - @Override - public void refresh() { - initUrls(); - parentPolicy.refresh(); - } - - private void initUrls() { - untrustedCodeUrls = new HashSet(); - untrustedCodeUrls.add(RobotClassLoader.UNTRUSTED_URL); - - String classPath = System.getProperty("robocode.class.path"); - StringTokenizer tokenizer = new StringTokenizer(classPath, File.pathSeparator); - - // TODO load URLs from new repository roots, don't forget about all robot .jar files - // TODO or check it directly against repository ? - try { - final List robots = new ArrayList(); - IRepositoryManager repositoryManager = Container.getComponent(IRepositoryManager.class); - - if (repositoryManager != null) { - robots.add(repositoryManager.getRobotsDirectory().toURI().toString()); - for (File devel : repositoryManager.getDevelDirectories()) { - robots.add(devel.toURI().toString()); - } - } - - while (tokenizer.hasMoreTokens()) { - String u = new File(tokenizer.nextToken()).getCanonicalFile().toURI().toString(); - - if (robots.contains(u)) { - if (!untrustedCodeUrls.contains(u)) { - untrustedCodeUrls.add(u); - } - } - } - } catch (MalformedURLException e) { - Logger.logError(e); - } catch (IOException e) { - Logger.logError(e); - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotClassLoader.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotClassLoader.java deleted file mode 100644 index 0993839..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotClassLoader.java +++ /dev/null @@ -1,424 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.host.IHostedThread; -import net.sf.robocode.host.IRobotClassLoader; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.io.URLJarCollector; -import robocode.robotinterfaces.IBasicRobot; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLConnection; -import java.nio.ByteBuffer; -import java.security.*; -import java.security.cert.Certificate; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - - -/** - * This class loader is used by robots. It isolates classes which belong to robot and load them locally. - * General java classes or robocode.api classes are loaded by parent loader and shared with Robocode engine. - * Attempts to load classes of Robocode engine are blocked. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - * @author Robert D. Maupin (contributor) - * @author Nathaniel Troutman (contributor) - */ -public class RobotClassLoader extends URLClassLoader implements IRobotClassLoader { - - static final String UNTRUSTED_URL = "http://robocode.sf.net/untrusted"; - - private static final PermissionCollection EMPTY_PERMISSIONS = new Permissions(); - - private final String fullClassName; - - private ClassLoader parent; - private CodeSource codeSource; - - private IHostedThread robotProxy; - private Class robotClass; - - // Names on classes referenced from the robot class - private Set referencedClasses = new HashSet(); - - // Cached names on found system classes - private Set foundSystemClasses = new HashSet(); - - // Cached warning messages - private String[] staticRobotInstanceWarning; - - public RobotClassLoader(URL robotClassPath, String robotFullClassName) { - super(new URL[] { robotClassPath}, Container.systemLoader); - fullClassName = robotFullClassName; - parent = getParent(); - try { - codeSource = new CodeSource(new URL(UNTRUSTED_URL), (Certificate[]) null); - } catch (MalformedURLException ignored) {} - } - - public void setRobotProxy(Object robotProxy) { - this.robotProxy = (IHostedThread) robotProxy; - } - - public synchronized void addURL(URL url) { - super.addURL(url); - } - - public synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - if (name.startsWith("java.lang")) { - // we always delegate java.lang stuff to parent loader - return super.loadClass(name, resolve); - } - if (RobocodeProperties.isSecurityOn()) { - testPackages(name); - } - if (!name.startsWith("robocode")) { - Class result = loadRobotClassLocaly(name, resolve); - if (result != null) { - // yes, it is in robot's class path - // we loaded it locally - return result; - } - } - - // it is robot API - // or java class - // or security is off - // so we delegate to parent class loader - return parent.loadClass(name); - } - - private void testPackages(String name) throws ClassNotFoundException { - if (name.startsWith("net.sf.robocode")) { - String message = "Robots are not allowed to reference Robocode engine in package: net.sf.robocode"; - - punishSecurityViolation(message); - throw new ClassNotFoundException(message); - } - if (name.startsWith("robocode.control")) { - String message = "Robots are not allowed to reference Robocode engine in package: robocode.control"; - - punishSecurityViolation(message); - throw new ClassNotFoundException(message); - } - if (RobocodeProperties.isSecurityOn() && name.startsWith("javax.swing")) { - String message = "Robots are not allowed to reference Robocode engine in package: javax.swing"; - - punishSecurityViolation(message); - throw new ClassNotFoundException(message); - } - } - - private Class loadRobotClassLocaly(String name, boolean resolve) throws ClassNotFoundException { - Class result = findLoadedClass(name); - if (result == null) { - ByteBuffer resource = findLocalResource(name); - if (resource != null) { - result = defineClass(name, resource, codeSource); - if (resolve) { - resolveClass(result); - } - ClassAnalyzer.getReferencedClasses(resource, referencedClasses); - } - } - return result; - } - - // this whole fun is there to be able to provide defineClass with bytes - // we need to call defineClass to be able to set codeSource to untrustedLocation - private ByteBuffer findLocalResource(final String name) { - return AccessController.doPrivileged(new PrivilegedAction() { - public ByteBuffer run() { - // try to find it in robot's class path - // this is URL, don't change to File.pathSeparator - String path = name.replace('.', '/').concat(".class"); - URL url = findResource(path); - ByteBuffer result = null; - InputStream is = null; - BufferedInputStream bis = null; - - if (url != null) { - try { - URLConnection connection = URLJarCollector.openConnection(url); - - is = connection.getInputStream(); - bis = new BufferedInputStream(is); - - result = ByteBuffer.allocate(1024 * 8); - boolean done = false; - - do { - do { - int res = bis.read(result.array(), result.position(), result.remaining()); - - if (res == -1) { - done = true; - break; - } - result.position(result.position() + res); - } while (result.remaining() != 0); - result.flip(); - if (!done) { - result = ByteBuffer.allocate(result.capacity() * 2).put(result); - } - } while (!done); - - } catch (IOException e) { - Logger.logError(e); - return null; - } finally { - FileUtil.cleanupStream(bis); - FileUtil.cleanupStream(is); - } - } - return result; - } - }); - } - - private void punishSecurityViolation(String message) { - if (robotProxy != null) { - robotProxy.punishSecurityViolation(message); - } - } - - protected PermissionCollection getPermissions(CodeSource codesource) { - if (RobocodeProperties.isSecurityOn()) { - return EMPTY_PERMISSIONS; - } - return super.getPermissions(codesource); - } - - public String[] getReferencedClasses() { - return referencedClasses.toArray(new String[referencedClasses.size()]); - } - - public synchronized Class loadRobotMainClass(boolean resolve) throws ClassNotFoundException { - try { - if (robotClass == null) { - robotClass = loadClass(fullClassName, resolve); - - if (!IBasicRobot.class.isAssignableFrom(robotClass)) { - // that's not robot - return null; - } - if (resolve) { - // resolve methods to see more referenced classes - robotClass.getMethods(); - - // iterate thru dependencies until we didn't found any new - HashSet clone; - - do { - clone = new HashSet(referencedClasses); - for (String reference : clone) { - testPackages(reference); - if (!isSystemClass(reference)) { - loadClass(reference, true); - } - } - } while (referencedClasses.size() != clone.size()); - } - } else { - warnIfStaticRobotInstanceFields(); - } - } catch (RuntimeException e) { - robotClass = null; - throw new ClassNotFoundException(e.getMessage(), e); - } - return robotClass; - } - - public IBasicRobot createRobotInstance() throws ClassNotFoundException, InstantiationException, IllegalAccessException { - loadRobotMainClass(true); - return (IBasicRobot) robotClass.newInstance(); - } - - public void cleanup() { - // Bug fix [2930266] - Robot static data isn't being GCed after battle - for (String className : getReferencedClasses()) { - cleanStaticReferences(className); - } - - parent = null; - codeSource = null; - robotProxy = null; - robotClass = null; - referencedClasses = null; - foundSystemClasses = null; - } - - /** - * Cleans all static field references on a class. - * - * @param className the name of the class containing the static references to clean. - */ - private void cleanStaticReferences(String className) { - if (isSystemClass(className)) { - return; - } - Class type = null; - try { - type = loadRobotClassLocaly(className, false); - if (type != null) { - for (Field field : getAllFields(new ArrayList(), type)) { - if (isStaticReference(field)) { - cleanStaticReference(field); - } - } - } - } catch (RuntimeException t) { - Logger.logError(t); - } - } - - private void warnIfStaticRobotInstanceFields() { - if (staticRobotInstanceWarning == null) { - List staticRobotReferences = new ArrayList(); - - for (String className : getReferencedClasses()) { // Bug fix [3028102] - ConcurrentModificationException - if (isSystemClass(className)) { - continue; - } - Class type = null; - try { - type = loadRobotClassLocaly(className, false); - } catch (RuntimeException t) { - continue; - } - if (type != null) { - for (Field field : getAllFields(new ArrayList(), type)) { - if (isStaticReference(field) && IBasicRobot.class.isAssignableFrom(field.getType()) - && field.getAnnotation(robocode.annotation.SafeStatic.class) == null) { - staticRobotReferences.add(field); - } - } - } - } - if (staticRobotReferences.size() > 0) { - StringBuilder buf = new StringBuilder(); - - buf.append("Warning: ").append(fullClassName).append( - " uses static reference to a robot with the following field(s):"); - - for (Field field : staticRobotReferences) { - buf.append("\n\t").append(field.getDeclaringClass().getName()).append('.').append(field.getName()).append(", which points to a ").append( - field.getType().getName()); - } - - staticRobotInstanceWarning = new String[] { - buf.toString(), - "Static references to robots can cause unwanted behaviour with the robot using these.", - "Please change static robot references to non-static references and recompile the robot."}; - } else { - staticRobotInstanceWarning = new String[] {}; // Signal that there is no warnings to cache - } - } else if (staticRobotInstanceWarning.length == 0) { - return; // Return, as no warnings should be written out in the robot console - } - - // Write out warnings to the robot console - if (robotProxy != null) { - for (String line : staticRobotInstanceWarning) { - robotProxy.getOut().println("SYSTEM: " + line); - } - } - } - - /** - * Cleans a static field reference class, even when it is 'private static final' - * - * @param field the field to clean, if it is a static reference. - */ - private void cleanStaticReference(Field field) { - if (field.getName().startsWith("const__")) { - // Ignore 'const__' fields used with e.g. the Clojure language - return; - } - field.setAccessible(true); - try { - // In order to set a 'private static field', we need to fix the modifier, i.e. use magic! ;-) - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - int modifiers = modifiersField.getInt(field); - modifiersField.setInt(field, modifiers & ~Modifier.FINAL); // Remove the FINAL modifier - field.set(null, null); - - } catch (RuntimeException ignore) {} - } - - /** - * Gets all fields of a class (public, protected, private) and the ones inherited from all super classes. - * @param fields the list where the fields will be added as a result of calling this method. - * @param type the class to retrieve all the fields from - * @return the list specified as input parameter containing all the retrieved fields - */ - private List getAllFields(List fields, Class type) { - if (type == null || isSystemClass(type.getName())) { - return fields; - } - try { - for (Field field: type.getDeclaredFields()) { - fields.add(field); - } - } catch (RuntimeException ignore) {// NoClassDefFoundError does occur with some robots, e.g. sgp.Drunken [1.12] - // We ignore all exceptions and errors here so we can proceed to retrieve - // field from super classes. - } - if (type.getSuperclass() != null) { - fields = getAllFields(fields, type.getSuperclass()); - } - return fields; - } - - /** - * Checks if a specified class name is a Java system class or internal Robocode class. - * @param className the class name to check. - * @return true if the class name is a system class; false otherwise. - */ - private boolean isSystemClass(String className) { - boolean isSystemClass = foundSystemClasses.contains(className); - if (!isSystemClass) { - try { - if (findSystemClass(className) != null) { - foundSystemClasses.add(className); - isSystemClass = true; - } - } catch (ClassNotFoundException ignore) {} - } - return isSystemClass; - } - - /** - * Checks if a specified field is a static reference. - * - * @param field the field to check. - * @return true if the field is static reference; false otherwise. - */ - private static boolean isStaticReference(Field field) { - return Modifier.isStatic(field.getModifiers()) - && !(field.getType().isPrimitive() || field.isEnumConstant() || field.isSynthetic()); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotThreadManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotThreadManager.java deleted file mode 100644 index d409324..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotThreadManager.java +++ /dev/null @@ -1,343 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import net.sf.robocode.host.IHostedThread; -import net.sf.robocode.host.IThreadManager; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logMessage; -import static net.sf.robocode.io.Logger.logWarning; -import robocode.exception.RobotException; - -import java.lang.reflect.InvocationTargetException; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.HashMap; -import java.util.Map; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Pavel Savara (contributor) - */ -public class RobotThreadManager { - - private final IHostedThread robotProxy; - private Thread runThread; - private ThreadGroup runThreadGroup; - private Object awtForThreadGroup; - private final Map disposeAppContextThreadMap = new HashMap(); - - public RobotThreadManager(IHostedThread robotProxy) { - this.robotProxy = robotProxy; - createThreadGroup(); - } - - public void cleanup() { - try { - if (runThread == null || !runThread.isAlive()) { - if (!discardAWT()) { - runThreadGroup.destroy(); - } - } else { - Logger.logWarning("Could not destroy " + runThread.getName()); - } - } catch (Exception e) { - Logger.logError("Could not destroy " + runThreadGroup.getName(), e); - } - } - - public void initAWT() { - if (awtForThreadGroup == null) { - awtForThreadGroup = AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return createNewAppContext(); - } - }); - } - } - - private boolean discardAWT() { - boolean res = false; - - if (awtForThreadGroup != null && !(awtForThreadGroup instanceof Integer)) { - res = disposeAppContext(awtForThreadGroup); - awtForThreadGroup = null; - } - return res; - } - - public void checkRunThread() { - if (Thread.currentThread() != runThread) { - throw new RobotException("You cannot take action in this thread!"); - } - } - - public void start(IThreadManager threadManager) { - try { - threadManager.addThreadGroup(runThreadGroup, robotProxy); - - runThread = new Thread(runThreadGroup, robotProxy, robotProxy.getStatics().getName()); - runThread.setDaemon(true); - runThread.setPriority(Thread.NORM_PRIORITY - 1); - runThread.setContextClassLoader(this.robotProxy.getRobotClassloader()); - runThread.start(); - } catch (Exception e) { - logError("Exception starting thread", e); - } - } - - /** - * @return true as peaceful stop - */ - public boolean waitForStop() { - boolean isAlive = false; - - if (runThread != null && runThread.isAlive()) { - runThread.interrupt(); - waitForStop(runThread); - isAlive = runThread.isAlive(); - } - - Thread[] threads = new Thread[100]; - - runThreadGroup.enumerate(threads); - - for (Thread thread : threads) { - if (thread != null && thread != runThread && thread.isAlive()) { - thread.interrupt(); - waitForStop(thread); - isAlive |= thread.isAlive(); - } - } - - if (isAlive) { - if (RobocodeProperties.isSecurityOn()) { - logError("Robot " + robotProxy.getStatics().getName() + " is not stopping. Forcing a stop."); - - // Force the robot to stop - return forceStop(); - } else { - logError( - "Robot " + robotProxy.getStatics().getName() - + " is still running. Not stopping it because security is off."); - } - } - - return true; - } - - /** - * @return true as peaceful stop - */ - public boolean forceStop() { - int res = stopSteps(runThread); - - Thread[] threads = new Thread[100]; - - runThreadGroup.enumerate(threads); - - for (Thread thread : threads) { - if (thread != null && thread != runThread && thread.isAlive()) { - res += stopSteps(thread); - } - } - if (res > 0) { - robotProxy.println("SYSTEM: This robot has been stopped. No score will be generated."); - - // recycle thread group - createThreadGroup(); - } - runThread = null; - return res == 0; - } - - /** - * @param t thread to stop - * @return 0 as peaceful stop - */ - private int stopSteps(Thread t) { - if (t != null && t.isAlive()) { - interrupt(t); - if (t.isAlive()) { - stop(t); - } - if (t.isAlive()) { - // noinspection deprecation - // t.suspend(); - logWarning("Unable to stop thread: " + runThread.getName()); - } else { - logMessage(robotProxy.getStatics().getName() + " has been stopped."); - } - return 1; - } - return 0; - } - - @SuppressWarnings("deprecation") - private void stop(Thread t) { - if (t != null) { - // noinspection deprecation - t.stop(); - try { - t.join(1500); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - } - } - - private void interrupt(Thread t) { - if (t != null) { - try { - t.setPriority(Thread.MIN_PRIORITY); - } catch (NullPointerException e) { - logError("Sometimes this occurs in the Java core?!", e); - } - t.interrupt(); - try { - t.join(500); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - } - } - - private void waitForStop(Thread thread) { - for (int j = 0; j < 100 && thread.isAlive(); j++) { - if (j == 50) { - logMessage( - "Waiting for robot " + robotProxy.getStatics().getName() + " to stop thread " + thread.getName()); - } - try { - Thread.sleep(10); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - break; // We are in a loop - } - } - } - - private void createThreadGroup() { - runThreadGroup = new ThreadGroup(robotProxy.getStatics().getName()); - - // bit lower than battle have - runThreadGroup.setMaxPriority(Thread.NORM_PRIORITY - 1); - } - - private Object createNewAppContext() { - // Add the current thread to our disposeAppContextThreadMap if it does not exit already - if (!disposeAppContextThreadMap.containsKey(Thread.currentThread())) { - disposeAppContextThreadMap.put(Thread.currentThread(), new Disposal()); - } - - // same as SunToolkit.createNewAppContext(); - // we can't assume that we are always on Suns JVM, so we can't reference it directly - // why we call that ? Because SunToolkit is caching AWTQueue instance form main thread group and use it on robots threads - // and he is not asking us for checkAwtEventQueueAccess above - try { - final Class sunToolkit = ClassLoader.getSystemClassLoader().loadClass("sun.awt.SunToolkit"); - - // We need to wait for the sun.awt.AppContext.dispose() to complete for the current thread before creating - // a new AppContext for it. Otherwise the AWT EventQueue fires events like WINDOW_CLOSE to our main window - // which closes the entire application due to a System.exit() - - Disposal disposal = disposeAppContextThreadMap.get(Thread.currentThread()); - - synchronized (disposal) { - while (disposal.isDisposing) { - try { - disposal.wait(); - } catch (InterruptedException e) { - return -1; - } - } - } - - // Call sun.awt.SunToolkit.createNewAppContext() to create a new AppContext for the current thread - return sunToolkit.getDeclaredMethod("createNewAppContext").invoke(null); - - } catch (ClassNotFoundException e) { - // we are not on sun JVM - return -1; - } catch (NoSuchMethodException e) { - throw new Error("Looks like SunVM but unable to assure secured AWTQueue, sorry", e); - } catch (InvocationTargetException e) { - throw new Error("Looks like SunVM but unable to assure secured AWTQueue, sorry", e); - } catch (IllegalAccessException e) { - throw new Error("Looks like SunVM but unable to assure secured AWTQueue, sorry", e); - } - // end: same as SunToolkit.createNewAppContext(); - } - - private boolean disposeAppContext(final Object appContext) { - // This method should must not be used when the AWT is running in headless mode! - // Bugfix [2833271] IllegalThreadStateException with the AWT-Shutdown thread. - // Read more about headless mode here: - // http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ - - // This check makes sure we exit, if the AWT is running in headless mode - if (System.getProperty("java.awt.headless", "false").equals("true")) { - return false; - } - - // same as AppContext.dispose(); - try { - final Class sunToolkit = ClassLoader.getSystemClassLoader().loadClass("sun.awt.AppContext"); - - // We run this in a thread, as invoking the AppContext.dispose() method sometimes takes several - // seconds, and thus causes the cleanup of a battle to hang, which is annoying when trying to restart - // a battle. - new Thread(new Runnable() { - public void run() { - Disposal disposal = disposeAppContextThreadMap.get(Thread.currentThread()); - - try { - // Signal that the AppContext for the current thread is being disposed (start) - if (disposal != null) { - synchronized (disposal) { - disposal.isDisposing = true; - disposal.notifyAll(); - } - } - // Call sun.awt.AppContext.dispose(appContext) to dispose the AppContext for the current thread - sunToolkit.getDeclaredMethod("dispose").invoke(appContext); - - } catch (Exception e) { - logError(e); - } finally { - // Signal that the AppContext for the current thread has been disposed (finish) - if (disposal != null) { - synchronized (disposal) { - disposal.isDisposing = false; - disposal.notifyAll(); - } - } - } - } - }, "DisposeAppContext").start(); - - return true; - } catch (ClassNotFoundException e) { - logError(e); - } - return false; - // end: same as AppContext.dispose(); - } - - private static class Disposal { - boolean isDisposing; - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecureInputStream.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecureInputStream.java deleted file mode 100644 index 4a04866..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecureInputStream.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import java.io.IOException; -import java.io.InputStream; -import java.security.AccessController; - - -/** - * @author Mathew A. Nelson (original) - */ -public class SecureInputStream extends java.io.InputStream { - private RobocodePermission inputPermission = null; - private InputStream in = null; - - /** - * SecureInputStream constructor comment. - * - * @param in original - */ - public SecureInputStream(InputStream in) { - super(); - this.in = in; - this.inputPermission = new RobocodePermission("System.in"); - } - - @Override - public final int available() throws IOException { - checkAccess(); - return in.available(); - } - - private void checkAccess() { - AccessController.checkPermission(inputPermission); - } - - @Override - public final void close() throws IOException { - checkAccess(); - in.close(); - } - - @Override - public final synchronized void mark(int readlimit) { - checkAccess(); - in.mark(readlimit); - } - - @Override - public final boolean markSupported() { - checkAccess(); - return in.markSupported(); - } - - /** - * Reads the next byte of data from the input stream. The value byte is - * returned as an {@code int} in the range 0 to 255. If no byte is available - * because the end of the stream has been reached, the value -1 is returned. - * This method blocks until input data is available, the end of the stream - * is detected, or an exception is thrown. - *

- *

A subclass must provide an implementation of this method. - * - * @return the next byte of data, or -1 if the end of the stream is reached. - * @throws IOException if an I/O error occurs. - */ - @Override - public final int read() throws java.io.IOException { - checkAccess(); - return in.read(); - } - - @Override - public final int read(byte[] b) throws IOException { - checkAccess(); - return in.read(b); - } - - @Override - public final int read(byte[] b, int off, int len) throws IOException { - checkAccess(); - return in.read(b, off, len); - } - - @Override - public final synchronized void reset() throws IOException { - checkAccess(); - in.reset(); - } - - @Override - public final long skip(long n) throws IOException { - checkAccess(); - return in.skip(n); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecurePrintStream.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecurePrintStream.java deleted file mode 100644 index 730bcd7..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/SecurePrintStream.java +++ /dev/null @@ -1,293 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.host.IHostManager; - -import java.io.OutputStream; -import java.io.PrintStream; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class SecurePrintStream extends PrintStream { - - public SecurePrintStream(OutputStream out, boolean autoFlush) { - super(out, autoFlush); - } - - @Override - public final boolean checkError() { - PrintStream out = checkAccess(); - - return (out == this) ? super.checkError() : out.checkError(); - } - - @Override - public final void close() { - PrintStream out = checkAccess(); - - if (out == this) { - super.close(); - } else { - out.close(); - } - } - - @Override - public final void flush() { - PrintStream out = checkAccess(); - - if (out == this) { - super.flush(); - } else { - out.flush(); - } - } - - @Override - public final void print(char[] s) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(s); - } else { - out.print(s); - } - } - - @Override - public final void print(char c) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(c); - } else { - out.print(c); - } - } - - @Override - public final void print(double d) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(d); - } else { - out.print(d); - } - } - - @Override - public final void print(float f) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(f); - } else { - out.print(f); - } - } - - @Override - public final void print(int i) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(i); - } else { - out.print(i); - } - } - - @Override - public final void print(long l) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(l); - } else { - out.print(l); - } - } - - @Override - public final void print(Object obj) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(obj); - } else { - out.print(obj); - } - } - - @Override - public final void print(String s) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(s); - } else { - out.print(s); - } - } - - @Override - public final void print(boolean b) { - PrintStream out = checkAccess(); - - if (out == this) { - super.print(b); - } else { - out.print(b); - } - } - - @Override - public final void println() { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(); - } else { - out.println(); - } - } - - @Override - public final void println(char[] x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(char x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(double x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(float x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(int x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(long x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(Object x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(String x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void println(boolean x) { - PrintStream out = checkAccess(); - - if (out == this) { - super.println(x); - } else { - out.println(x); - } - } - - @Override - public final void write(byte[] buf, int off, int len) { - PrintStream out = checkAccess(); - - if (out == this) { - super.write(buf, off, len); - } else { - out.write(buf, off, len); - } - } - - @Override - public final void write(int b) { - PrintStream out = checkAccess(); - - if (out == this) { - super.write(b); - } else { - out.write(b); - } - } - - private PrintStream checkAccess() { - PrintStream out = Container.getComponent(IHostManager.class).getRobotOutputStream(); - - return (out == null) ? this : out; - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ThreadManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ThreadManager.java deleted file mode 100644 index 6e47b48..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/ThreadManager.java +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.security; - - -import net.sf.robocode.host.IHostedThread; -import net.sf.robocode.host.IThreadManager; -import net.sf.robocode.host.io.RobotFileOutputStream; -import net.sf.robocode.host.io.RobotFileSystemManager; -import robocode.exception.RobotException; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.security.AccessController; -import java.security.PrivilegedAction; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -public class ThreadManager implements IThreadManager { - - private final PrintStream syserr = System.err; - - private final List safeThreads = new CopyOnWriteArrayList(); - private final List safeThreadGroups = new CopyOnWriteArrayList(); - private final List groups = new CopyOnWriteArrayList(); - private final List outputStreamThreads = new CopyOnWriteArrayList(); - private final List robots = new CopyOnWriteArrayList(); - - private Thread robotLoaderThread; - private IHostedThread loadingRobot; - - public ThreadManager() {} - - public void addSafeThread(Thread safeThread) { - safeThreads.add(safeThread); - } - - public void removeSafeThread(Thread safeThread) { - safeThreads.remove(safeThread); - } - - public void addSafeThreadGroup(ThreadGroup safeThreadGroup) { - safeThreadGroups.add(safeThreadGroup); - } - - public void addThreadGroup(ThreadGroup g, IHostedThread robotProxy) { - if (!groups.contains(g)) { - groups.add(g); - robots.add(robotProxy); - } - } - - public synchronized IHostedThread getLoadingRobot() { - return loadingRobot; - } - - public synchronized IHostedThread getLoadingRobotProxy(Thread t) { - if (t != null && robotLoaderThread != null - && (t.equals(robotLoaderThread) - || (t.getThreadGroup() != null && t.getThreadGroup().equals(robotLoaderThread.getThreadGroup())))) { - return loadingRobot; - } - return null; - } - - public synchronized IHostedThread getLoadedOrLoadingRobotProxy(Thread t) { - IHostedThread robotProxy = getRobotProxy(t); - - if (robotProxy == null) { - robotProxy = getLoadingRobotProxy(t); - } - return robotProxy; - } - - public IHostedThread getRobotProxy(Thread t) { - ThreadGroup g = t.getThreadGroup(); - - if (g == null) { - return null; - } - int index = groups.indexOf(g); - - if (index == -1) { - return null; - } - return robots.get(index); - } - - public void reset() { - groups.clear(); - robots.clear(); - } - - public synchronized void setLoadingRobot(IHostedThread newLoadingRobotProxy) { - if (newLoadingRobotProxy == null) { - this.robotLoaderThread = null; - loadingRobot = null; - } else { - this.robotLoaderThread = Thread.currentThread(); - loadingRobot = newLoadingRobotProxy; - } - } - - public boolean isSafeThread() { - return isSafeThread(Thread.currentThread()); - } - - public FileOutputStream createRobotFileStream(String fileName, boolean append) throws IOException { - final Thread c = Thread.currentThread(); - - final IHostedThread robotProxy = getRobotProxy(c); - - if (robotProxy == null) { - syserr.println("RobotProxy is null"); - return null; - } - if (!robotProxy.getStatics().isAdvancedRobot()) { - throw new RobotException("Only advanced robots could create files"); - } - - final File dir = robotProxy.getRobotFileSystemManager().getWritableDirectory(); - - if (!dir.exists()) { - robotProxy.println("SYSTEM: Creating a data directory for you."); - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - outputStreamThreads.add(c); - if (!dir.exists() && !dir.mkdirs()) { - syserr.println("Can't create dir " + dir.toString()); - } - return null; - } - }); - } - - final RobotFileSystemManager fileSystemManager = robotProxy.getRobotFileSystemManager(); - - File f = new File(fileName); - long len; - - if (f.exists()) { - len = f.length(); - } else { - fileSystemManager.checkQuota(); - len = 0; - } - - if (!append) { - fileSystemManager.adjustQuota(-len); - } - - outputStreamThreads.add(c); - return new RobotFileOutputStream(fileName, append, fileSystemManager); - } - - public boolean checkRobotFileStream() { - final Thread c = Thread.currentThread(); - - synchronized (outputStreamThreads) { - if (outputStreamThreads.contains(c)) { - outputStreamThreads.remove(c); - return true; - } - } - return false; - } - - public boolean isSafeThread(Thread c) { - try { - if (safeThreads.contains(c)) { - return true; - } - - for (ThreadGroup tg : safeThreadGroups) { - if (c.getThreadGroup() == tg) { - safeThreads.add(c); - return true; - } - } - - return false; - } catch (Exception e) { - syserr.println("Exception checking safe thread: "); - e.printStackTrace(syserr); - return false; - } - } - - public PrintStream getRobotOutputStream() { - Thread c = Thread.currentThread(); - - if (isSafeThread(c)) { - return null; - } - - IHostedThread robotProxy = getLoadedOrLoadingRobotProxy(c); - - return (robotProxy != null) ? robotProxy.getOut() : null; - } -} diff --git a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/serialization/RobocodeObjectInputStream.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/serialization/RobocodeObjectInputStream.java deleted file mode 100644 index fd4824c..0000000 --- a/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/serialization/RobocodeObjectInputStream.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.serialization; - - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectStreamClass; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobocodeObjectInputStream extends ObjectInputStream { - - private ClassLoader classLoader; - - public RobocodeObjectInputStream(InputStream in, ClassLoader classLoader) throws IOException { - super(in); - this.classLoader = classLoader; - } - - @Override - protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { - String name = desc.getName(); - - try { - return Class.forName(name, false, classLoader); - } catch (ClassNotFoundException ex) { - return super.resolveClass(desc); - } - } -} diff --git a/代码/workspace_robo4/robocode.host/src/test/java/net/sf/robocode/host/jarjar/JarJarTest.java b/代码/workspace_robo4/robocode.host/src/test/java/net/sf/robocode/host/jarjar/JarJarTest.java deleted file mode 100644 index 6cf90e1..0000000 --- a/代码/workspace_robo4/robocode.host/src/test/java/net/sf/robocode/host/jarjar/JarJarTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.host.jarjar; - - -import org.junit.Test; -import org.junit.Assert; - -import java.net.URL; -import java.net.URLConnection; -import java.net.URLClassLoader; -import java.io.InputStream; -import java.io.IOException; -import java.io.InputStreamReader; - -import net.sf.robocode.io.URLJarCollector; -import net.sf.robocode.io.JarJar; - - -/** - * @author Pavel Savara (original) - */ -public class JarJarTest { - static { - JarJarURLConnection.register(); - } - - @Test - public void run() throws IOException { - - String clas = "Hello.class"; - String inner = "Inner.jar"; - String outer = "file:src/test/resources/Outer.jar"; - - final String separ = "!/"; - URL u = new URL("jar:jarjar:" + outer + JarJar.SEPARATOR + inner + separ + clas); - final URLConnection urlConnection = URLJarCollector.openConnection(u); - final InputStream inputStream = urlConnection.getInputStream(); - InputStreamReader isr = new InputStreamReader(inputStream); - char[] c = new char[4]; - - int len = isr.read(c); - - Assert.assertEquals(len, 4); - Assert.assertEquals('T', c[0]); - Assert.assertEquals('e', c[1]); - Assert.assertEquals('s', c[2]); - Assert.assertEquals('t', c[3]); - Assert.assertFalse(isr.ready()); - isr.close(); - inputStream.close(); - } - - @Test - public void runClassLoader() throws IOException, ClassNotFoundException { - String clas = "tested.robots.Ahead"; - String inner = "Inner.jar"; - String outer = "file:src/test/resources/Outer.jar"; - final String separ = "!/"; - final String root = "jar:jarjar:" + outer + JarJar.SEPARATOR + inner + separ; - URL u = new URL(root); - - ClassLoader ucl = new URLClassLoader(new URL[] { u}); - - ucl.loadClass(clas); - } -} diff --git a/代码/workspace_robo4/robocode.host/src/test/resources/Outer.jar b/代码/workspace_robo4/robocode.host/src/test/resources/Outer.jar deleted file mode 100644 index 4b539ff162e604aedc14b2f2c7639013f92064c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 611 zcmWIWW@Zs#U|`^2Si_NFHPUM}PD=QKUbM{h>8`NX=2vXfP4z4;-uG^yJ4y|{D5-L!s3&mq2qdsbPd?cpWMa^} zgNcoar=dbhImqCkNg}@n2gA*6vjw9!uvTntnqs_xX`y1kQFpfqTNwhp8JR>FaHk7k b(f|SlFo~2(0=!w-Kw^wQXbz;sm_R%L@}U0s diff --git a/代码/workspace_robo4/robocode.iml b/代码/workspace_robo4/robocode.iml deleted file mode 100644 index aaf2c03..0000000 --- a/代码/workspace_robo4/robocode.iml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.installer/.classpath b/代码/workspace_robo4/robocode.installer/.classpath deleted file mode 100644 index faff71b..0000000 --- a/代码/workspace_robo4/robocode.installer/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.installer/.project b/代码/workspace_robo4/robocode.installer/.project deleted file mode 100644 index c76d339..0000000 --- a/代码/workspace_robo4/robocode.installer/.project +++ /dev/null @@ -1,14 +0,0 @@ - - - robocode.installer - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.installer/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.installer/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.installer/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.installer/pom.xml b/代码/workspace_robo4/robocode.installer/pom.xml deleted file mode 100644 index d9e283c..0000000 --- a/代码/workspace_robo4/robocode.installer/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - 4.0.0 - robocode.installer - Robocode Installer - - net.sf.robocode - robocode - ${robocode.version} - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - net.sf.robocode.installer.AutoExtract - - - - - - - diff --git a/代码/workspace_robo4/robocode.installer/robocode.installer.iml b/代码/workspace_robo4/robocode.installer/robocode.installer.iml deleted file mode 100644 index 613ddb1..0000000 --- a/代码/workspace_robo4/robocode.installer/robocode.installer.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java b/代码/workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java deleted file mode 100644 index e4c6d0a..0000000 --- a/代码/workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java +++ /dev/null @@ -1,705 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.installer; - - -import javax.swing.*; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.URL; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.jar.JarInputStream; - - -/** - * Installer for Robocode. - * - * @author Mathew A. Nelsen (original) - * @author Flemming N. Larsen (contributor) - */ -public class AutoExtract implements ActionListener { - private JDialog licenseDialog; - private boolean accepted; - private static final String[] SPINNER = { "-", "\\", "|", "/"}; - private String message = ""; - private static File installDir; - private static final String osName = System.getProperty("os.name"); - private static final double osVersion = doubleValue(System.getProperty("os.version")); - private static final String javaVersion = System.getProperty("java.version"); - - private static double doubleValue(String s) { - s = s.replaceAll("[^.0-9]", ""); // Remove invalid characters, e.g. "3.0-ARCH" become "3.0" - - int p = s.indexOf("."); - - if (p >= 0) { - p = s.indexOf(".", p + 1); - } - if (p >= 0) { - s = s.substring(0, p); - } - - double d = 0.0; - - try { - d = Double.parseDouble(s); - } catch (NumberFormatException e) { - e.printStackTrace(System.err); - } - - return d; - } - - private boolean acceptLicense() { - StringBuffer licenseText = new StringBuffer(); - - InputStream is; - - try { - JarFile extractJar = new JarFile("extract.jar"); - - is = extractJar.getInputStream(extractJar.getJarEntry("license/cpl-v10.html")); - } catch (IOException e) { - return true; - } - if (is == null) { - return true; - } - - InputStreamReader isr = null; - BufferedReader br = null; - - try { - isr = new InputStreamReader(is); - br = new BufferedReader(isr); - - String line = br.readLine(); - - while (line != null) { - licenseText.append(line); - line = br.readLine(); - } - return acceptReject(licenseText.toString()); - - } catch (IOException e) { - System.err.println("Could not read line from license file: " + e); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (isr != null) { - try { - isr.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return true; - } - - private boolean acceptReject(String text) { - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - licenseDialog = new JDialog(); - licenseDialog.setTitle("License Agreement"); - licenseDialog.setModal(true); - licenseDialog.setLocation((screenSize.width - 500) / 2, (screenSize.height - 400) / 2); - licenseDialog.setSize(500, 400); - JTextPane t = new JTextPane(); - - t.setContentType("text/html"); - t.setText(text); - t.setFont(new Font("Dialog", Font.PLAIN, 12)); - t.setEditable(false); - - JScrollPane s = new JScrollPane(); - - s.setViewportView(t); - - licenseDialog.getContentPane().setLayout(new BorderLayout()); - licenseDialog.getContentPane().add(s, BorderLayout.CENTER); - - JPanel p = new JPanel(); - - p.setLayout(new BorderLayout()); - JButton b1 = new JButton("Accept"); - JButton b2 = new JButton("Cancel"); - - p.add(b1, BorderLayout.WEST); - p.add(b2, BorderLayout.EAST); - - b1.addActionListener(this); - b2.addActionListener(this); - - licenseDialog.getContentPane().add(p, BorderLayout.SOUTH); - - licenseDialog.setVisible(true); - - return accepted; - } - - public void actionPerformed(ActionEvent e) { - accepted = e.getActionCommand().equals("Accept"); - licenseDialog.dispose(); - licenseDialog = null; - } - - private boolean extract(File installDir) { - JDialog statusDialog = new JDialog(); - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - int width = 500; - int height = 100; - - statusDialog.setTitle("Installing"); - statusDialog.setLocation((screenSize.width - width) / 2, (screenSize.height - height) / 2); - statusDialog.setSize(width, height); - JLabel status = new JLabel(); - - statusDialog.getContentPane().setLayout(new BorderLayout()); - statusDialog.getContentPane().add(status, BorderLayout.CENTER); - - statusDialog.setVisible(true); - - FileOutputStream fos; - String entryName; - - byte buf[] = new byte[2048]; - - final String name = AutoExtract.class.getName().replaceAll("\\.", "/") + ".class"; - String urlJar = AutoExtract.class.getClassLoader().getResource(name).toString(); - final String src = urlJar.substring("jar:file:/".length(), urlJar.indexOf("!/")); - - if (src.indexOf('!') > -1) { - message = src + "\nContains an exclamation point. Please move the file to a different directory."; - JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE); - return false; - } - JarInputStream jarIS = null; - - try { - final URL url = new URL("file:/" + src); - InputStream is = url.openStream(); - - jarIS = new JarInputStream(is); - - JarEntry entry; - - while ((entry = jarIS.getNextJarEntry()) != null) { - int spin = 0; - - entryName = entry.getName(); - if (entry.isDirectory()) { - if (!entryName.startsWith("net") && !(entryName.equals("desktop") && isFreeBSD())) { - File dir = new File(installDir, entry.getName()); - if (!dir.exists() && !dir.mkdirs()) { - System.err.println("Can't create dir: " + dir); - } - } - } else if (!entryName.equals(name)) { - - // Skip .bat, .sh, and .command files depending on which OS Robocode is installed - - final String entryNameLC = entryName.toLowerCase(); - - boolean skipEntry = false; - - final boolean isBatFile = entryNameLC.length() > ".bat".length() && entryNameLC.endsWith(".bat"); - final boolean isShFile = entryNameLC.length() > ".sh".length() && entryNameLC.endsWith(".sh"); - final boolean isCommandFile = entryNameLC.length() > ".command".length() - && entryNameLC.endsWith(".command"); - final boolean isDesktopFile = entryNameLC.startsWith("desktop/"); - - // Unix systems and Mac OS X - if (File.separatorChar == '/') { - // Skip .bat files under Unix and Mac OS X - // Skip .command files under Unix - skipEntry = isBatFile || (isCommandFile && !isMacOSX()) || (isDesktopFile && !isFreeBSD()); - } else { - // Under Windows the .sh and .command files are skipped - skipEntry = isShFile || isCommandFile || isDesktopFile; - } - - // If we are not skipping the entry, then copy from our .jar into the installation dir - if (!skipEntry) { - status.setText(entryName + " " + SPINNER[spin++]); - - File out = new File(installDir, entryName); - - File parentDirectory = new File(out.getParent()); - if (!parentDirectory.exists() && !parentDirectory.mkdirs()) { - System.err.println("Can't create dir: " + parentDirectory); - } - fos = new FileOutputStream(out); - - int index = 0; - int num; - int count = 0; - - while ((num = jarIS.read(buf, 0, 2048)) != -1) { - fos.write(buf, 0, num); - index += num; - count++; - if (count > 80) { - status.setText(entryName + " " + SPINNER[spin++] + " (" + index + " bytes)"); - if (spin > 3) { - spin = 0; - } - count = 0; - } - } - fos.close(); - - // Set file permissions for .sh and .command files under Unix and Mac OS X - if (File.separatorChar == '/') { - if (isShFile || isCommandFile) { - // Grant read and execute access for everyone and also write access for the owner of the file - Runtime.getRuntime().exec("chmod 755 " + out.toString()); - } - } - - status.setText(entryName + " " + SPINNER[spin] + " (" + index + " bytes)"); - } - } - } - statusDialog.dispose(); - return true; - } catch (IOException e) { - message = "Installation failed: " + e; - JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE); - return false; - } finally { - if (jarIS != null) { - try { - jarIS.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - public static void main(String argv[]) { - String suggestedDirName; - - if (argv.length == 1) { - suggestedDirName = argv[0]; - } else if (isWindowsOS()) { - suggestedDirName = "C:\\robocode\\"; - } else { - suggestedDirName = System.getProperty("user.home") + File.separator + "robocode" + File.separator; - } - - String message; - - if (install(new File(suggestedDirName))) { - message = "Installation successful"; - } else { - message = "Installation cancelled"; - } - - // Delete the class file with the installer and it's parent folders in the robocode home dir - if (installDir != null) { - String installerPath = AutoExtract.class.getName().replaceAll("\\.", "/") + "$1.class"; - - deleteFileAndParentDirsIfEmpty(new File(installDir, installerPath)); - } - - JOptionPane.showMessageDialog(null, message); - } - - private static boolean install(File suggestedDir) { - // Verify that the Java version is version 6 (1.6.0) or newer - if (javaVersion.startsWith("1.") && javaVersion.charAt(2) < '5') { - final String message = "Robocode requires Java 6 (1.6.0) or newer.\n" - + "Your system is currently running Java " + javaVersion + ".\n" - + "If you have not installed (or activated) at least\n" + "JRE 6 or JDK 6, please do so."; - - JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE); - System.err.println(message); - return false; - } - - // Set native look and feel - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (RuntimeException t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF - } - - AutoExtract extractor = new AutoExtract(); - - if (extractor.acceptLicense()) { - boolean done = false; - - while (!done) { - int rc = JOptionPane.showConfirmDialog(null, - "Robocode will be installed in:\n" + suggestedDir + "\nIs this ok?", "Installing Robocode", - JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - - if (rc == JOptionPane.YES_OPTION) { - installDir = suggestedDir; - done = true; - } else if (rc == JOptionPane.NO_OPTION) { - Object r = JOptionPane.showInputDialog(null, "Please type in the installation directory", - "Installation Directory", JOptionPane.PLAIN_MESSAGE, null, null, suggestedDir); - - if (r != null) { - suggestedDir = new File(((String) r).trim()); - } else { - return false; - } - } else if (rc == JOptionPane.CANCEL_OPTION) { - return false; - } - } - if (!installDir.exists() && !installDir.mkdirs()) { - System.err.println("Can't create dir: " + installDir); - return false; - } - deleteOldLibs(installDir); - - // The .robotcache has been renamed to .data - File robotsCacheDir = new File(installDir, "robots/.robotcache"); - File robotsDataDir = new File(installDir, "robots/.data"); - - if (robotsCacheDir.exists()) { - // Rename ".robotcache" into ".data" - robotsCacheDir.renameTo(robotsDataDir); - } - - // Fix problem with .data starting with a underscore dir by - // renaming files containing ".data/_" into ".data" - if (robotsDataDir.exists()) { - File underScoreDir = new File(robotsDataDir, "_"); - String[] list = underScoreDir.list(); - - if (list != null) { - for (String fileName : list) { - File file = new File(underScoreDir, fileName); - - file.renameTo(new File(robotsDataDir, fileName)); - } - underScoreDir.delete(); - } - } - - // Create shortcuts and file associations - if (extractor.extract(installDir)) { - extractor.createShortcuts(installDir, "robocode.bat", "Robocode", "Robocode"); - extractor.createFileAssociations(installDir); - return true; - } - } - return false; - } - - private static void deleteOldLibs(File installDir) { - File libs = new File(installDir, "libs"); - - if (libs.exists()) { - final File[] del = libs.listFiles(new FilenameFilter() { - - public boolean accept(File dir, String name) { - String test = name.toLowerCase(); - - return test.endsWith(".jar") || test.endsWith(".dll"); - } - }); - - for (File d : del) { - if (!d.delete()) { - System.err.println("Can't delete: " + d); - } - } - } - } - - private static boolean deleteDir(File dir) { - if (dir.isDirectory()) { - for (File file : dir.listFiles()) { - if (file.isDirectory()) { - // Skip directories ending with ".data" - if (file.getName().endsWith(".data")) { - continue; - } - try { - // Test for symlink and ignore. - // Robocode won't create one, but just in case a user does... - if (file.getCanonicalFile().getParentFile().equals(dir.getCanonicalFile())) { - deleteDir(file); - if (file.exists() && !file.delete()) { - System.err.println("Can't delete: " + file); - } - } else { - System.out.println("Warning: " + file + " may be a symlink. It has been ignored"); - } - } catch (IOException e) { - System.out.println( - "Warning: Cannot determine canonical file for " + file + ". It has been ignored"); - } - } else { - if (file.exists() && !file.delete()) { - System.err.println("Can't delete: " + file); - } - } - } - return dir.delete(); - } - return false; - } - - private void createShortcuts(File installDir, String runnable, String folder, String name) { - if (osName.toLowerCase().indexOf("win") == 0) { - if (createWindowsShortcuts(installDir, runnable, folder, name) == false) { - JOptionPane.showMessageDialog(null, - message + "\n" + "To start Robocode, enter the following at a command prompt:\n" + "cd " - + installDir.getAbsolutePath() + "\n" + "robocode.bat"); - } - } else if (osName.toLowerCase().indexOf("mac") == 0) { - if (osVersion >= 10.1) { - JOptionPane.showMessageDialog(null, - message + "\n" + "To start Robocode, browse to " + installDir + " then double-click robocode.sh\n"); - } else { - JOptionPane.showMessageDialog(null, - message + "\n" + "To start Robocode, enter the following at a command prompt:\n" - + installDir.getAbsolutePath() + "/robocode.sh"); - } - } else { - JOptionPane.showMessageDialog(null, - message + "\n" + "To start Robocode, enter the following at a command prompt:\n" - + installDir.getAbsolutePath() + "/robocode.sh"); - } - } - - private boolean createWindowsShortcuts(File installDir, String runnable, String folder, String name) { - int rc = JOptionPane.showConfirmDialog(null, - "Would you like to install a shortcut to Robocode in the Start menu? (Recommended)", "Create Shortcuts", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - - if (rc != JOptionPane.YES_OPTION) { - return false; - } - - final String command = getWindowsCmd() + " cscript.exe "; - - try { - File shortcutMaker = new File(installDir, "makeshortcut.vbs"); - PrintStream out = new PrintStream(new FileOutputStream(shortcutMaker)); - - out.println("WScript.Echo(\"Creating shortcuts...\")"); - out.println("Set Shell = CreateObject (\"WScript.Shell\")"); - out.println("Set fso = CreateObject(\"Scripting.FileSystemObject\")"); - out.println("ProgramsPath = Shell.SpecialFolders(\"Programs\")"); - out.println("if (not(fso.folderExists(ProgramsPath + \"\\\\" + folder + "\"))) Then"); - out.println(" fso.CreateFolder(ProgramsPath + \"\\\\" + folder + "\")"); - out.println("End If"); - out.println("Set link = Shell.CreateShortcut(ProgramsPath + \"\\\\" + folder + "\\\\" + name + ".lnk\")"); - out.println("link.Arguments = \"\""); - out.println("link.Description = \"" + name + "\""); - out.println("link.HotKey = \"\""); - out.println("link.IconLocation = \"" + escaped(installDir.getAbsolutePath()) + "\\\\" + "robocode.ico,0\""); - out.println("link.TargetPath = \"" + escaped(installDir.getAbsolutePath()) + "\\\\" + runnable + "\""); - out.println("link.WindowStyle = 1"); - out.println("link.WorkingDirectory = \"" + escaped(installDir.getAbsolutePath()) + "\""); - out.println("link.Save()"); - out.println("DesktopPath = Shell.SpecialFolders(\"Desktop\")"); - out.println("Set link = Shell.CreateShortcut(DesktopPath + \"\\\\" + name + ".lnk\")"); - out.println("link.Arguments = \"\""); - out.println("link.Description = \"" + name + "\""); - out.println("link.HotKey = \"\""); - out.println("link.IconLocation = \"" + escaped(installDir.getAbsolutePath()) + "\\\\" + "robocode.ico,0\""); - out.println("link.TargetPath = \"" + escaped(installDir.getAbsolutePath()) + "\\\\" + runnable + "\""); - out.println("link.WindowStyle = 1"); - out.println("link.WorkingDirectory = \"" + escaped(installDir.getAbsolutePath()) + "\""); - out.println("link.Save()"); - out.println("WScript.Echo(\"Shortcuts created.\")"); - - out.close(); - - Process p = Runtime.getRuntime().exec(command + " makeshortcut.vbs", null, installDir); - int rv = p.waitFor(); - - if (rv != 0) { - System.err.println("Can't create shortcut: " + shortcutMaker); - return false; - } - JOptionPane.showMessageDialog(null, - message + "\n" + "A Robocode program group has been added to your Start menu\n" - + "A Robocode icon has been added to your desktop."); - if (!shortcutMaker.delete()) { - System.err.println("Can't delete: " + shortcutMaker); - } - return true; - } catch (IOException e) { - e.printStackTrace(System.err); - } catch (InterruptedException e) { - e.printStackTrace(System.err); - } - - return false; - } - - private void createFileAssociations(File installDir) { - if (isWindowsOS()) { - createWindowsFileAssociations(installDir); - } - } - - private void createWindowsFileAssociations(File installDir) { - int rc = JOptionPane.showConfirmDialog(null, - "Would you like to create file associations for Robocode in\n" - + "the Windows Registry for the file extensions .battle and .br?\n" - + "Please notice that you might need to grant permission to add\n" - + "the file associations in the Registry, and you must be an\n" - + "administrator or granted permission to change the registry.", - "Create File Associations", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (rc != JOptionPane.YES_OPTION) { - return; - } - - File file = null; - PrintStream out = null; - - try { - file = new File(installDir + "\\FileAssoc.reg"); - - out = new PrintStream(new FileOutputStream(file)); - - String installPath = installDir.getAbsolutePath(); - - out.print( - createWindowsRegistryFileAssociation(installPath, ".battle", "Robocode.BattleSpecification", - "Robocode Battle Specification", "-battle")); - out.print( - createWindowsRegistryFileAssociation(installPath, ".br", "Robocode.BattleRecord", "Robocode Battle Record", - "-replay")); - - out.close(); - out = null; - - Process p = Runtime.getRuntime().exec(getWindowsCmd() + file.getAbsolutePath(), null, null); - int rv; - - try { - rv = p.waitFor(); - if (rv != 0) { - System.err.println("Could not create association(s)"); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (out != null) { - out.close(); - } - if (file != null) { - if (!file.delete()) { - System.err.println("Could not delete the file: " + file); - } - } - } - } - - private static String createWindowsRegistryFileAssociation(String installDir, String fileExt, String progId, String description, String robocodeCmdParam) { - StringBuffer sb = new StringBuffer(); - - final String HKCR = "[HKEY_CLASSES_ROOT\\"; - - sb.append("REGEDIT4\n"); - sb.append(HKCR).append(fileExt).append("]\n"); - sb.append("@=\"").append(progId).append("\"\n"); - sb.append(HKCR).append(progId).append("]\n"); - sb.append("@=\"").append(description).append("\"\n"); - sb.append(HKCR).append(progId).append("\\shell]\n"); - sb.append(HKCR).append(progId).append("\\shell\\open]\n"); - sb.append(HKCR).append(progId).append("\\shell\\open\\command]\n"); - sb.append("@=\"").append(getWindowsCmd()).append("\\\"cd \\\"").append(installDir.replaceAll("[\\\\]", "\\\\\\\\")).append("\\\" && robocode.bat ").append(robocodeCmdParam).append( - " \\\"%1\\\"\\\"\"\n"); - - return sb.toString(); - } - - private static String escaped(String s) { - StringBuffer eascaped = new StringBuffer(); - - for (int i = 0; i < s.length(); i++) { - if (s.charAt(i) == '\\') { - eascaped.append('\\'); - } - eascaped.append(s.charAt(i)); - } - return eascaped.toString(); - } - - private static boolean isWindowsOS() { - return osName.startsWith("Windows "); - } - - private static boolean isMacOSX() { - return osName.startsWith("Mac OS X"); - } - - private static boolean isFreeBSD() { - return osName.equals("FreeBSD"); - } - - private static String getWindowsCmd() { - String os = System.getProperty("os.name"); - - return ((os.equals("Windows 95") || os.equals("Windows 95") || os.equals("Windows ME")) - ? "command.com" - : "cmd.exe") - + " /C "; - } - - /** - * Deletes a file and afterwards deletes the parent directories that are empty. - * - * @param file the file or directory to delete - * @return true if success - */ - private static boolean deleteFileAndParentDirsIfEmpty(final File file) { - boolean wasDeleted = false; - - if (file != null && file.exists()) { - if (file.isDirectory()) { - wasDeleted = deleteDir(file); - } else { - wasDeleted = file.delete(); - - File parent = file; - - while (wasDeleted && (parent = parent.getParentFile()) != null) { - // Delete parent directory, but only if it is empty - File[] files = parent.listFiles(); - - if (files != null && files.length == 0) { - wasDeleted = deleteDir(parent); - } else { - wasDeleted = false; - } - } - } - } - return wasDeleted; - } -} diff --git a/代码/workspace_robo4/robocode.ipr b/代码/workspace_robo4/robocode.ipr deleted file mode 100644 index a27683a..0000000 --- a/代码/workspace_robo4/robocode.ipr +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.iws b/代码/workspace_robo4/robocode.iws deleted file mode 100644 index 03c854e..0000000 --- a/代码/workspace_robo4/robocode.iws +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.repository/.classpath b/代码/workspace_robo4/robocode.repository/.classpath deleted file mode 100644 index ea90720..0000000 --- a/代码/workspace_robo4/robocode.repository/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.repository/.project b/代码/workspace_robo4/robocode.repository/.project deleted file mode 100644 index 3ea6809..0000000 --- a/代码/workspace_robo4/robocode.repository/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - robocode.repository - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.core - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.repository/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.repository/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.repository/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.repository/pom.xml b/代码/workspace_robo4/robocode.repository/pom.xml deleted file mode 100644 index 57259bb..0000000 --- a/代码/workspace_robo4/robocode.repository/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - robocode.repository - Robocode Repository - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.core - ${project.version} - - - net.sf.robocode - codesize - 1.1 - - - diff --git a/代码/workspace_robo4/robocode.repository/robocode.repository.iml b/代码/workspace_robo4/robocode.repository/robocode.repository.iml deleted file mode 100644 index 6b1701e..0000000 --- a/代码/workspace_robo4/robocode.repository/robocode.repository.iml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/IRepository.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/IRepository.java deleted file mode 100644 index d8401b3..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/IRepository.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Map; - -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.root.IRepositoryRoot; - - -/** - * Interface for a repository containing meta-data for robot and team items.

- * - * Items can be retrieved from the reposition by using {@link IRepository#getItem(String)} using "friendly URLs" - * that identifies the individual item. See {@link IRepositoryItem#getFriendlyURLs()}. An item has typically several - * friendly URLs that identifies it, e.g. a file URL to a local property file or class file, or a URL to a JAR entry. - * - * @author Flemming N. Larsen (original) - */ -public interface IRepository { - - /** - * Loads data into this repository, previously saved by {@link #save(OutputStream)}. - * - * @param in is an input stream used for reading the data. - * - * @see #save(OutputStream) - */ - public void load(InputStream in); - - /** - * Saves the data in this repository to an output stream. - * - * @param out is the output stream used for writing the data. - * - * @see #load(InputStream) - */ - public void save(OutputStream out); - - /** - * Adds or updates an item.

- * - * If the item is not present in the repository, it will be added; otherwise it will be updated, if the specified - * item has a never version than the existing item in the repository.

- * - * This method will store the item under each friendly URL (keys) by using {@link IRepositoryItem#getFriendlyURLs()}. - * - * @param item is the item to add or update. - * - * @see #getItem(String) - * @see #getItems() - */ - void addOrUpdateItem(IRepositoryItem item); - - /** - * Returns an item stored in this repository identified by a friendly URL (key). - * - * @param friendlyUrl is a key to the item used when the item was stored using {@link IRepositoryItem#getFriendlyURLs()}. - * @return an item from the repository identified by the friendly URL or null if the item does not exist. - * - * @see #addOrUpdateItem(IRepositoryItem) - * @see #getItems() - */ - IRepositoryItem getItem(String friendlyUrl); - - /** - * Returns all items stored in this repository. - * @return a map containing items, where the keys are friendly URLs used for identifying the items. - * - * @see #getItem(String) - */ - Map getItems(); - - /** - * Returns all repository roots stored in this repository.

- * - * @return a map containing repository roots, where the keys are URLs used for identifying the individual - * repository root. - * - * @see IRepositoryRoot - */ - Map getRoots(); - - /** - * Removes a repository root from this repository. - * - * @param url is the URL (key) of the repository root to remove. - */ - void removeRoot(String url); - - /** - * Removes all items from this repository that belongs to a specific repository root. - * - * @param root is the repository root containing the items to remove. - */ - void removeItemsFromRoot(IRepositoryRoot root); -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Module.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Module.java deleted file mode 100644 index 47d1834..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Module.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import net.sf.robocode.core.BaseModule; -import net.sf.robocode.core.Container; -import net.sf.robocode.repository.items.handlers.ClassHandler; -import net.sf.robocode.repository.items.handlers.PropertiesHandler; -import net.sf.robocode.repository.items.handlers.SourceHandler; -import net.sf.robocode.repository.items.handlers.TeamHandler; -import net.sf.robocode.repository.root.handlers.ClassPathHandler; -import net.sf.robocode.repository.root.handlers.JarHandler; - - -/** - * @author Pavel Savara (original) - */ -public class Module extends BaseModule { - static { - Container.cache.addComponent(IRepositoryManager.class, RepositoryManager.class); - - // file handlers - Container.cache.addComponent("TeamHandler", TeamHandler.class); - Container.cache.addComponent("PropertiesHandler", PropertiesHandler.class); - Container.cache.addComponent("ClassHandler", ClassHandler.class); - Container.cache.addComponent("SourceHandler", SourceHandler.class); - - // root handlers - Container.cache.addComponent("JarHandler", JarHandler.class); - Container.cache.addComponent("ClassPathHandler", ClassPathHandler.class); - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Repository.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Repository.java deleted file mode 100644 index cfe3bf1..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/Repository.java +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.root.BaseRoot; -import net.sf.robocode.repository.root.IRepositoryRoot; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.OutputStream; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - - -/** - * Repository containing robot and team repositoryItems. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -class Repository implements IRepository { - - private Map roots = new ConcurrentHashMap(); - private Map repositoryItems = new ConcurrentHashMap(); - private Map removedItems = new ConcurrentHashMap(); - - /** - * {@inheritDoc} - */ - public void save(OutputStream out) { - Set uniqueItems = new HashSet(); - Set uniqueRoots = new HashSet(); - - for (IRepositoryItem repositoryItem : repositoryItems.values()) { - uniqueItems.add(repositoryItem); - } - - for (IRepositoryRoot root : roots.values()) { - uniqueRoots.add(root); - } - - ObjectOutputStream oos = null; - try { - oos = new ObjectOutputStream(out); - oos.writeObject(uniqueRoots); - oos.writeObject(uniqueItems); - } catch (IOException e) { - Logger.logError("Can't save robot database", e); - } finally { - FileUtil.cleanupStream(oos); - } - } - - /** - * {@inheritDoc} - */ - @SuppressWarnings("unchecked") - public void load(InputStream in) { - Set uniqueItems; - Set uniqueRoots; - - ObjectInputStream ois = null; - try { - ois = new ObjectInputStream(in); - - uniqueRoots = (Set) ois.readObject(); - uniqueItems = (Set) ois.readObject(); - - for (IRepositoryRoot root : uniqueRoots) { - ((BaseRoot) root).setRepository(this); - - String key = root.getURL().toString(); - key = URLDecoder.decode(key, "UTF-8"); - - roots.put(key, root); - } - for (IRepositoryItem repositoryItem : uniqueItems) { - addOrUpdateItem(repositoryItem); - } - } catch (IOException e) { - Logger.logError("Can't load robot database: " + e.getMessage()); - } catch (ClassNotFoundException e) { - Logger.logError("Can't load robot database: " + e.getMessage()); - } finally { - FileUtil.cleanupStream(ois); - } - } - - /** - * {@inheritDoc} - */ - public void addOrUpdateItem(IRepositoryItem repositoryItem) { - Collection friendlyUrls = repositoryItem.getFriendlyURLs(); - if (friendlyUrls != null) { - // Add or update the item so it can be found using later using any friendly URL - for (String friendly : friendlyUrls) { - if (friendly != null) { - IRepositoryItem existingItem = repositoryItems.get(friendly); - // Add the item if it does not exist already, or update it if the version is newer - // than the existing item. - if (existingItem == null || repositoryItem.compareTo(existingItem) > 0) { - repositoryItems.put(friendly, repositoryItem); - } - } - } - } - } - - /** - * {@inheritDoc} - */ - public IRepositoryItem getItem(String friendlyUrl) { - IRepositoryItem repositoryItem = repositoryItems.get(friendlyUrl); - if (repositoryItem == null) { - repositoryItem = removedItems.get(friendlyUrl); - } - return repositoryItem; - } - - /** - * {@inheritDoc} - */ - public Map getItems() { - return Collections.unmodifiableMap(repositoryItems); - } - - /** - * {@inheritDoc} - */ - public Map getRoots() { - return Collections.unmodifiableMap(roots); - } - - /** - * {@inheritDoc} - */ - public void removeRoot(String friendlyUrl) { - roots.remove(friendlyUrl); - } - - /** - * {@inheritDoc} - */ - public void removeItemsFromRoot(IRepositoryRoot root) { - Collection> itemsToRemove = new ArrayList>(); - - for (Map.Entry entry : repositoryItems.entrySet()) { - if (entry.getValue().getRoot().equals(root)) { - itemsToRemove.add(entry); - } - } - - for (Map.Entry entry : itemsToRemove) { - String key = entry.getKey(); - - removedItems.put(key, entry.getValue()); - repositoryItems.remove(key); - } - } - - /** - * Replaces the repository roots with new repository roots. - * - * @param newRoots is the new repository roots for this repository. - */ - // Only for the RepositoryManager - public void setRoots(Map newRoots) { - - // Remove all items from current roots - for (IRepositoryRoot root : roots.values()) { - if (!newRoots.containsKey(root.getURL().toString())) { - removeItemsFromRoot(root); - } - } - - // Set the new roots - roots = newRoots; - - // Clear items to be removed - removedItems.clear(); - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/RepositoryManager.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/RepositoryManager.java deleted file mode 100644 index a97ad9b..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/RepositoryManager.java +++ /dev/null @@ -1,480 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.URLJarCollector; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.items.TeamItem; -import net.sf.robocode.repository.items.RepositoryItem; -import net.sf.robocode.repository.packager.JarCreator; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.repository.root.handlers.RootHandler; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.settings.ISettingsListener; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.IWindowManager; -import robocode.control.RobotSpecification; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; - - -/** - * @author Pavel Savara (original) - */ -public class RepositoryManager implements IRepositoryManager { // NO_UCD (use default) - - private static final String DATABASE_FILENAME = "robot.database"; - - private final ISettingsManager properties; - private Repository repository; - - public RepositoryManager(ISettingsManager properties) { // NO_UCD (unused code) - this.properties = properties; - properties.addPropertyListener(new SettingsListener()); - } - - // ------------------------------------------ - // interfaces - // ------------------------------------------ - - @Override - public File getRobotsDirectory() { - return FileUtil.getRobotsDir(); - } - - @Override - public List getDevelDirectories() { - List develDirectories = new ArrayList(); - - for (String path : properties.getOptionsEnabledDevelopmentPaths()) { - try { - develDirectories.add(new File(path).getCanonicalFile()); - } catch (IOException e) { - Logger.logError(e); - } - } - return develDirectories; - } - - public void refresh(String friendlyUrl) { - if (!updateItemRoot(friendlyUrl, true)) { - refresh(true); - } - URLJarCollector.gc(); - } - - public boolean refresh() { - return refresh(false); - } - - public boolean refresh(boolean force) { - boolean refreshed = update(getRobotsDirectory(), getDevelDirectories(), force); - if (refreshed) { - setStatus("Saving robot database"); - save(); - } - - setStatus(""); - URLJarCollector.gc(); - - return refreshed; - } - - private boolean update(File robotsDir, Collection devDirs, boolean force) { - final int prev = repository.getItems().size(); - - RootHandler.openHandlers(); - try { - Map newRoots = new HashMap(); - - RootHandler.visitDirectories(robotsDir, false, newRoots, repository, force); - for (File dir : devDirs) { - RootHandler.visitDirectories(dir, true, newRoots, repository, force); - } - repository.setRoots(newRoots); - } finally { - RootHandler.closeHandlers(); - } - - return prev != repository.getItems().size(); - } - - private boolean updateItemRoot(String friendlyUrl, boolean force) { - IRepositoryItem repositoryItem = repository.getItems().get(friendlyUrl); - if (repositoryItem != null) { - repositoryItem.getRoot().updateItem(repositoryItem, force); - return true; - } - return false; - } - - private void save() { - FileOutputStream fos = null; - try { - fos = new FileOutputStream(new File(getRobotsDirectory(), DATABASE_FILENAME)); - repository.save(fos); - } catch (IOException e) { - Logger.logError("Can't save robot database", e); - } finally { - FileUtil.cleanupStream(fos); - } - } - - private Repository load() { - Repository repository = new Repository(); - - FileInputStream fis = null; - try { - File file = new File(getRobotsDirectory(), DATABASE_FILENAME); - if (file.exists()) { - fis = new FileInputStream(file); - repository.load(fis); - } - } catch (IOException e) { - Logger.logError("Can't load robot database", e); - repository = null; - } finally { - FileUtil.cleanupStream(fis); - } - return repository; - } - - public void reload(boolean rebuild) { - // Bug fix [2867326] - Lockup on start if too many bots in robots dir (cont'd). - URLJarCollector.enableGc(true); - URLJarCollector.gc(); - - if (rebuild) { - Logger.logMessage("Rebuilding robot database..."); - repository = new Repository(); - } else if (repository == null) { - setStatus("Reading robot database"); - repository = load(); - if (repository == null) { - setStatus("Building robot database"); - repository = new Repository(); - } - } - refresh(true); - setStatus(""); - } - - public RobotSpecification[] getSpecifications() { - checkDbExists(); - final Collection list = getAllValidItems(); - Collection res = new ArrayList(); - - for (IRobotSpecItem s : list) { - res.add(s.createRobotSpecification()); - } - return res.toArray(new RobotSpecification[res.size()]); - } - - /** - * Expand teams, validate robots - * @param selectedRobots, names of robots and teams, comma separated - * @return robots in teams - */ - public RobotSpecification[] loadSelectedRobots(RobotSpecification[] selectedRobots) { - checkDbExists(); - Collection battlingRobotsList = new ArrayList(); - int teamNum = 0; - - for (RobotSpecification spec: selectedRobots) { - IRobotSpecItem item = (IRobotSpecItem) HiddenAccess.getFileSpecification(spec); - - if (item == null) { - item = getRobot(spec.getNameAndVersion()); - } - loadItem(battlingRobotsList, spec, item, teamNum); - teamNum++; - } - return battlingRobotsList.toArray(new RobotSpecification[battlingRobotsList.size()]); - } - - /** - * Expand teams, validate robots - * @param selectedRobots, names of robots and teams, comma separated - * @return robots in teams - */ - public RobotSpecification[] loadSelectedRobots(String selectedRobots) { - checkDbExists(); - Collection battlingRobotsList = new ArrayList(); - final Collection list = getValidItems(selectedRobots); - int teamNum = 0; - - for (IRobotSpecItem item: list) { - loadItem(battlingRobotsList, null, item, teamNum); - teamNum++; - } - return battlingRobotsList.toArray(new RobotSpecification[battlingRobotsList.size()]); - } - - private boolean loadItem(Collection battlingRobotsList, RobotSpecification spec, IRobotSpecItem item, int teamNum) { - String teamId = String.format("%4d", teamNum); - - if (item != null) { - if (item.isTeam()) { - teamId = item.getFullClassNameWithVersion() + "[" + teamId + "]"; - final Collection members = getRobotItems((TeamItem) item); - - for (IRobotSpecItem member : members) { - final RobotItem robot = (RobotItem) member; - - boolean tested = false; - - for (RobotSpecification loaded : battlingRobotsList) { - if (HiddenAccess.getFileSpecification(loaded).equals(robot)) { - tested = true; - break; - } - } - - if (tested || robot.validate()) { - battlingRobotsList.add(robot.createRobotSpecification(null, teamId)); - } - } - } else { - final RobotItem robot = (RobotItem) item; - - if (robot.validate()) { - battlingRobotsList.add(robot.createRobotSpecification(spec, null)); - } else { - Logger.logError("Could not load robot: " + robot.getFullClassName()); - return false; - } - } - return true; - } - return false; - } - - public List getSelectedSpecifications(String selectedRobots) { - checkDbExists(); - return getValidItems(selectedRobots); - } - - private Collection getAllValidItems() { - final ArrayList res = new ArrayList(); - - for (IRepositoryItem repositoryItem : repository.getItems().values()) { - final IRobotSpecItem spec = (IRobotSpecItem) repositoryItem; - if (repositoryItem.isValid() && !res.contains(spec)) { - res.add(spec); - } - } - return res; - } - - private List getValidItems(String friendlyUrls) { - List result = new ArrayList(); - StringTokenizer tokenizer = new StringTokenizer(friendlyUrls, ","); - - while (tokenizer.hasMoreTokens()) { - String friendlyUrl = tokenizer.nextToken().trim(); - - IRepositoryItem repositoryItem = repository.getItem(friendlyUrl); - if (repositoryItem != null) { - if (repositoryItem.isValid()) { - result.add((IRobotSpecItem) repositoryItem); - } else { - Logger.logError("Can't load '" + friendlyUrl + "' because it is an invalid robot or team."); - } - } else { - Logger.logError("Can't find '" + friendlyUrl + '\''); - } - } - return result; - } - - public List getRepositoryItems(boolean onlyWithSource, boolean onlyWithPackage, boolean onlyRobots, boolean onlyDevelopment, boolean onlyNotDevelopment, boolean ignoreTeamRobots, boolean onlyInJar) { - checkDbExists(); - - final List res = new ArrayList(); - - for (IRepositoryItem repositoryItem : repository.getItems().values()) { - final IRobotSpecItem spec = (IRobotSpecItem) repositoryItem; - - if (!repositoryItem.isValid()) { - continue; - } - if (onlyWithSource && !spec.isSourceIncluded()) { - continue; - } - if (onlyWithPackage && spec.getFullPackage() == null) { - continue; - } - if (onlyInJar && !spec.isInJAR()) { - continue; - } - if (onlyRobots && !(repositoryItem instanceof RobotItem)) { - continue; - } - if (onlyDevelopment && !spec.isDevelopmentVersion()) { - continue; - } - if (onlyNotDevelopment && spec.isDevelopmentVersion()) { - continue; - } - if (res.contains(spec)) { - continue; - } - res.add(spec); - } - Collections.sort(res); - return res; - } - - public boolean verifyRobotName(String robotName, String shortClassName) { - return RobotItem.verifyRobotName(robotName, shortClassName, true); - } - - public int extractJar(IRobotSpecItem item) { - if (!item.isInJAR()) { - return -2; - } - ((RepositoryItem) item).getRoot().extractJAR(); - return 0; - } - - public void createTeam(File target, TeamProperties teamProps) throws IOException { - checkDbExists(); - - TeamItem.createOrUpdateTeam(target, teamProps); - refresh(target.toURI().toString()); - } - - public String createPackage(File jarFile, List selectedRobots, RobotProperties robotProps) { - checkDbExists(); - List robotItems = getAllRobotItems(selectedRobots); - TeamItem teamItem = getTeamItem(selectedRobots); - - String res = JarCreator.createPackage(jarFile, robotItems, teamItem, robotProps); - refresh(jarFile.toURI().toString()); - - return res; - } - - private Collection getRobotItems(TeamItem team) { - Collection result = new ArrayList(); - StringTokenizer teamTokenizer = new StringTokenizer(team.getMembers(), ","); - - while (teamTokenizer.hasMoreTokens()) { - String botNameAndVersion = teamTokenizer.nextToken(); - int versionIndex = botNameAndVersion.indexOf(' '); - String botPath = versionIndex < 0 ? botNameAndVersion : botNameAndVersion.substring(0, versionIndex); - - botPath = botPath.replace('.', '/').replaceAll("\\*", ""); - - // first load from same classPath - String teamBot = team.getRoot().getURL() + botPath; - IRepositoryItem res = repository.getItem(teamBot); - - if (res != null && res instanceof RobotItem) { - result.add((RobotItem) res); - continue; - } - - // try general search - res = repository.getItem(botNameAndVersion); - if (res != null && res instanceof RobotItem) { - result.add((RobotItem) res); - continue; - } - - // not found - Logger.logError("Can't find robot: " + botNameAndVersion); - } - return result; - } - - private List getAllRobotItems(Collection items) { - List result = new ArrayList(); - - for (IRobotSpecItem item : items) { - if (item.isTeam()) { - result.addAll(getRobotItems((TeamItem) item)); - } else { - result.add((RobotItem) item); - } - } - return result; - } - - private static TeamItem getTeamItem(Collection items) { - for (IRobotSpecItem item : items) { - if (item.isTeam()) { - return (TeamItem) item; - } - } - return null; - } - - private IRobotSpecItem getRobot(String fullClassNameWithVersion) { - final IRepositoryItem repositoryItem = repository.getItem(fullClassNameWithVersion); - - if (repositoryItem == null || !repositoryItem.isValid()) { - return null; - } - return (IRobotSpecItem) repositoryItem; - } - - private void setStatus(String message) { - IWindowManager windowManager = Container.getComponent(IWindowManager.class); - - if (windowManager != null) { - windowManager.setStatus(message); - } - if (message.length() > 0) { - Logger.logMessage(message); - } - } - - private void checkDbExists() { - if (repository == null) { - reload(false); - } - } - - // ------------------------------------------ - // settings listener - // ------------------------------------------ - - private class SettingsListener implements ISettingsListener { - - private Collection lastEnabledDevelPaths; - - public void settingChanged(String property) { - if (property.equals(ISettingsManager.OPTIONS_DEVELOPMENT_PATH) - || property.equals(ISettingsManager.OPTIONS_DEVELOPMENT_PATH_EXCLUDED)) { - - Collection enabledDevelPaths = properties.getOptionsEnabledDevelopmentPaths(); - - if (lastEnabledDevelPaths == null || !enabledDevelPaths.equals(lastEnabledDevelPaths)) { - lastEnabledDevelPaths = enabledDevelPaths; - reload(true); - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/IRepositoryItem.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/IRepositoryItem.java deleted file mode 100644 index c83e9d1..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/IRepositoryItem.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items; - - -import net.sf.robocode.repository.root.IRepositoryRoot; - -import java.net.URL; -import java.util.Set; - - -/** - * @author Pavel Savara (original) - */ -public interface IRepositoryItem extends Comparable { - URL getItemURL(); - IRepositoryRoot getRoot(); - Set getFriendlyURLs(); - - /** - * Updates the repository item if specified 'last modified' date is newer than the one recorded on this item, - * or if it is a forced update. - * - * @param lastModified is a 'last modified' date (millis since 1970). If this parameter is newer than the one - * previously set on this item, then this item will be updated. - * @param force is a flag specifying if this item is forced to be updated. - * If this parameter is true, then this item will be updated. - */ - void update(long lastModified, boolean force); - - long getLastModified(); - boolean isValid(); -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RepositoryItem.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RepositoryItem.java deleted file mode 100644 index d8e9592..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RepositoryItem.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items; - - -import net.sf.robocode.repository.root.IRepositoryRoot; - -import java.io.Serializable; -import java.net.URL; - - -/** - * @author Pavel Savara (original) - */ -public abstract class RepositoryItem implements IRepositoryItem, Serializable { - private static final long serialVersionUID = 1L; - - protected URL itemUrl; - protected IRepositoryRoot root; - protected long lastModified; - protected boolean isValid; - - RepositoryItem(URL itemURL, IRepositoryRoot root) { - this.itemUrl = itemURL; - this.root = root; - this.lastModified = 0; - } - - public URL getItemURL() { - return itemUrl; - } - - public IRepositoryRoot getRoot() { - return root; - } - - public boolean isInJAR() { - return root.isJAR(); - } - - public long getLastModified() { - return lastModified; - } - - public boolean isValid() { - return isValid; - } - - public void setValid(boolean valid) { - isValid = valid; - } - - @Override - public int hashCode() { - return 31 + ((itemUrl == null) ? 0 : itemUrl.hashCode()); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || !(obj instanceof RepositoryItem)) { - return false; - } - RepositoryItem other = (RepositoryItem) obj; - if (itemUrl == null && other.itemUrl != null) { - return false; - } - return itemUrl.equals(other.itemUrl); - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotItem.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotItem.java deleted file mode 100644 index d9b00a6..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotItem.java +++ /dev/null @@ -1,608 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.io.URLJarCollector; -import static net.sf.robocode.io.Logger.logError; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.repository.RobotProperties; -import net.sf.robocode.repository.RobotType; -import net.sf.robocode.repository.root.ClasspathRoot; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.core.Container; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.version.IVersionManager; -import robocode.control.RobotSpecification; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.util.HashSet; -import java.util.Set; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobotItem extends RobotSpecItem implements IRobotItem { - private static final long serialVersionUID = 1L; - - // Allowed maximum length for a robot's full package name - private static final int MAX_FULL_PACKAGE_NAME_LENGTH = 32; - // Allowed maximum length for a robot's short class name - private static final int MAX_SHORT_CLASS_NAME_LENGTH = 32; - - protected static final String ROBOT_PLATFORM = "robot.platform"; - private static final String ROBOT_CLASSNAME = "robot.classname"; - private static final String ROBOT_VERSION = "robot.version"; - private static final String ROBOT_DESCRIPTION = "robot.description"; - private static final String ROBOT_AUTHOR_NAME = "robot.author.name"; - private static final String ROBOT_WEBPAGE = "robot.webpage"; - private static final String ROBOCODE_VERSION = "robocode.version"; - private static final String ROBOT_INCLUDE_SOURCE = "robot.include.source"; - private static final String ROBOT_INCLUDE_DATA = "robot.include.data"; - private static final String ROBOT_CODESIZE = "robot.codesize"; - - // File extensions - private static final String CLASS_EXTENSION = ".class"; - private static final String PROPERTIES_EXTENSION = ".properties"; - private static final String HTML_EXTENSION = ".html"; - - private static final boolean ALWAYS_USE_CACHE_FOR_DATA = System.getProperty("ALWAYSUSECACHEFORDATA", "false").equals( - "true"); - - private RobotType robotType; - - private URL classPathURL; - private Set sourcePathURLs; // This is a Set in order to avoid duplicates - - private URL classURL; - private URL propertiesURL; - - private String className; - protected boolean isPropertiesLoaded; - - public RobotItem(URL itemURL, IRepositoryRoot root) { - super(itemURL, root); - - isValid = true; - - classPathURL = root.getURL(); - sourcePathURLs = new HashSet(); - } - - private void populate() { - populatePropertiesURLFromClassURL(); - populateClassURLFromPropertiesURL(); - loadProperties(); - } - - public void setClassURL(URL classUrl) { - this.classURL = classUrl; - populate(); - } - - public void setPropertiesURL(URL propertiesUrl) { - this.propertiesURL = propertiesUrl; - populate(); - } - - public void setClassPathURL(URL classPathUrl) { - this.classPathURL = classPathUrl; - } - - public void addSourcePathURL(URL sourcePathUrl) { - sourcePathURLs.add(sourcePathUrl); - } - - // ------------------------------------- - // URL initialization - // ------------------------------------- - - private void populatePropertiesURLFromClassURL() { - if (propertiesURL == null && classURL != null) { - final String path = classURL.toString().replaceFirst("\\" + CLASS_EXTENSION, PROPERTIES_EXTENSION); - - try { - propertiesURL = new URL(path); - } catch (MalformedURLException e) { - Logger.logError(e); - } - if (isInvalidURL(propertiesURL)) { - propertiesURL = null; - } - } - } - - private void populateClassURLFromPropertiesURL() { - if (classURL == null && propertiesURL != null) { - final String path = propertiesURL.toString().replaceAll("\\" + PROPERTIES_EXTENSION, CLASS_EXTENSION); - - try { - classURL = new URL(path); - } catch (MalformedURLException e) { - Logger.logError(e); - } - if (isInvalidURL(classURL)) { - classURL = null; - } - } - } - - private void populateClassNameFromClassURL() { - populate(); - - if (className == null && classURL != null) { - final String path = classURL.toString(); - - // .dll file? - int index = (path.toLowerCase().indexOf(".dll!/")); - - if (index > 0) { - className = path.substring(index + 6); - return; - } - - // Class within .jar or regular file path? - - index = path.lastIndexOf('!'); - - if (index > 0) { - // .jar file - className = path.substring(index + 2); - } else { - // file path - className = path.substring(root.getURL().toString().length()); - } - - // Remove the file extension from the class name - index = className.lastIndexOf('.'); - - if (index > 0) { - className = className.substring(0, index); - } - - // Replace all file separators with dots (from file path the package/namespace) - className = className.replaceAll("[\\\\\\/]", "."); - } - } - - private void populateHtmlURL() { - populate(); - - if (htmlURL == null && classURL != null) { - try { - htmlURL = new URL(classURL.toString().replaceFirst(CLASS_EXTENSION, HTML_EXTENSION)); - } catch (MalformedURLException ignore) {} - } - if (htmlURL == null && propertiesURL != null) { - try { - htmlURL = new URL(propertiesURL.toString().replaceFirst(PROPERTIES_EXTENSION, HTML_EXTENSION)); - } catch (MalformedURLException ignore) {} - } - if (isInvalidURL(htmlURL)) { - htmlURL = null; - } - } - - private boolean isInvalidURL(URL url) { - if (url != null) { - InputStream is = null; - try { - URLConnection conn = URLJarCollector.openConnection(url); - is = conn.getInputStream(); - return false; - } catch (IOException e) { - return true; - } finally { - FileUtil.cleanupStream(is); - } - } - return true; - } - - // / ------------------------------------- - // / public - // / ------------------------------------- - - public boolean isTeam() { - return false; - } - - public URL getHtmlURL() { - // Lazy - if (htmlURL == null) { - populateHtmlURL(); - } - return htmlURL; - } - - public URL getPropertiesURL() { - if (propertiesURL == null) { - populatePropertiesURLFromClassURL(); - } - return propertiesURL; - } - - public Set getFriendlyURLs() { - populate(); - - Set urls = new HashSet(); - - URL url = null; - if (classURL != null) { - url = classURL; - } else if (propertiesURL != null) { - url = propertiesURL; - } - if (url != null) { - String sUrl = url.toString(); - String urlNoType = sUrl.substring(0, sUrl.lastIndexOf('.')); - - String path = url.getPath(); - String pathNoType = path.substring(0, path.lastIndexOf('.')); - - urls.add(urlNoType); - urls.add(pathNoType); - } - if (getFullClassName() != null) { - if (RobocodeProperties.isTestingOn()) { - urls.add(getFullClassName()); - } else { - urls.add(getUniqueFullClassName()); - } - urls.add(getUniqueFullClassNameWithVersion()); - } - if (root.isJAR()) { - urls.add(root.getURL().toString()); - } - if (root instanceof ClasspathRoot) { - String friendly = ((ClasspathRoot) root).getFriendlyProjectURL(itemUrl); - - if (friendly != null) { - urls.add(friendly); - } - } - return urls; - } - - /** - * {@inheritDoc} - */ - public void update(long lastModified, boolean force) { - if (lastModified > this.lastModified || force) { - if (force) { - isValid = true; - } - - // trying to guess all correct file locations - populate(); - - this.lastModified = lastModified; - if (classURL == null) { - isValid = false; - } - loadProperties(); - if (root.isJAR() && !isPropertiesLoaded) { - isValid = false; - } - if (isValid) { - validateType(false); - } - if (isValid) { - verifyName(); - } - } - } - - protected void validateType(boolean resolve) { - populate(); - - final IHostManager hostManager = Container.getComponent(IHostManager.class); - - robotType = hostManager.getRobotType(this, resolve, classURL != null); - if (!robotType.isValid()) { - isValid = false; - } - } - - // Stronger than update - public boolean validate() { - validateType(true); - return isValid; - } - - // Note that ROBOCODE_CLASSNAME can be invalid, an hence can't be trusted when loaded! - // Hence, we read the fullClassName field instead and NOT the ROBOCODE_CLASSNAME property. - private boolean loadProperties() { - if (!isPropertiesLoaded && propertiesURL != null) { - InputStream ios = null; - try { - URLConnection con = URLJarCollector.openConnection(propertiesURL); - - ios = con.getInputStream(); - properties.load(ios); - isPropertiesLoaded = true; - return true; - } catch (IOException e) { - return false; - } finally { - FileUtil.cleanupStream(ios); - } - } - return false; - } - - private boolean verifyName() { - String robotName = getFullClassName(); - String shortClassName = getShortClassName(); - - final boolean valid = verifyRobotName(robotName, shortClassName, false); - - if (!valid) { - isValid = false; - } - return valid; - } - - public static boolean verifyRobotName(String fullClassName, String shortClassName, boolean silent) { - if (fullClassName == null || fullClassName.length() == 0 || fullClassName.contains("$")) { - return false; - } - - int lIndex = fullClassName.indexOf("."); - if (lIndex > 0) { - String rootPackage = fullClassName.substring(0, lIndex); - - if (rootPackage.equalsIgnoreCase("robocode")) { - if (!silent) { - logError("Robot " + fullClassName + " ignored. You cannot use package " + rootPackage); - } - return false; - } - if (rootPackage.length() > MAX_FULL_PACKAGE_NAME_LENGTH) { - if (!silent) { - logError( - "Robot " + fullClassName + " has package name too long. " + MAX_FULL_PACKAGE_NAME_LENGTH - + " characters maximum please."); - } - return false; - } - } - if (shortClassName != null && shortClassName.length() > MAX_SHORT_CLASS_NAME_LENGTH) { - if (!silent) { - logError( - "Robot " + fullClassName + " has classname too long. " + MAX_SHORT_CLASS_NAME_LENGTH - + " characters maximum please."); - } - return false; - } - return true; - } - - public void storeProperties(OutputStream os, RobotProperties robotProps) throws IOException { - if (className != null) { - properties.setProperty(ROBOT_CLASSNAME, className); - } - if (robotProps.getVersion() != null) { - properties.setProperty(ROBOT_VERSION, robotProps.getVersion()); - } - if (robotProps.getDescription() != null) { - properties.setProperty(ROBOT_DESCRIPTION, robotProps.getDescription()); - } - if (robotProps.getAuthor() != null) { - properties.setProperty(ROBOT_AUTHOR_NAME, robotProps.getAuthor()); - } - if (robotProps.getWebPage() != null) { - properties.setProperty(ROBOT_WEBPAGE, robotProps.getWebPage().toExternalForm()); - } - if (robotProps.getCodeSize() != null) { - properties.setProperty(ROBOT_CODESIZE, "" + robotProps.getCodeSize()); - } - properties.setProperty(ROBOT_INCLUDE_SOURCE, "" + robotProps.isIncludeSource()); - - String version = Container.getComponent(IVersionManager.class).getVersion(); - properties.setProperty(ROBOCODE_VERSION, version); - - saveProperties(os); - - saveProperties(); - } - - private void saveProperties(OutputStream os) throws IOException { - properties.store(os, "Robocode Robot"); - } - - private void saveProperties() { - File file = new File(root.getPath(), className.replaceAll("\\.", "/") + PROPERTIES_EXTENSION); - FileOutputStream fos = null; - - try { - fos = new FileOutputStream(file); - saveProperties(fos); - } catch (IOException e) { - e.printStackTrace(); - } finally { - FileUtil.cleanupStream(fos); - } - populatePropertiesURLFromClassURL(); - } - - public boolean isJuniorRobot() { - return robotType.isJuniorRobot(); - } - - public boolean isStandardRobot() { - return robotType.isStandardRobot(); - } - - public boolean isAdvancedRobot() { - return robotType.isAdvancedRobot(); - } - - public boolean isTeamRobot() { - return robotType.isTeamRobot(); - } - - public boolean isDroid() { - return robotType.isDroid(); - } - - public boolean isSentryRobot() { - return robotType.isSentryRobot(); - } - - public boolean isInteractiveRobot() { - return robotType.isInteractiveRobot(); - } - - public boolean isPaintRobot() { - return robotType.isPaintRobot(); - } - - public URL getClassPathURL() { - return classPathURL; - } - - public URL[] getSourcePathURLs() { - // If no source path URL exists, we must use the class path URL - if (sourcePathURLs.size() == 0) { - return new URL[] { classPathURL }; - } - return sourcePathURLs.toArray(new URL[] {}); - } - - public String getFullClassName() { - // Lazy - if (className == null) { - populateClassNameFromClassURL(); - } - return className; - } - - public String getVersion() { - return properties.getProperty(ROBOT_VERSION, null); - } - - public String getDescription() { - return properties.getProperty(ROBOT_DESCRIPTION, null); - } - - public String getAuthorName() { - return properties.getProperty(ROBOT_AUTHOR_NAME, null); - } - - public String getPlatform() { - return properties.getProperty(ROBOT_PLATFORM, "Java"); - } - - public URL getWebpage() { - try { - String webPage = properties.getProperty(ROBOT_WEBPAGE, null); - if (webPage == null || webPage.trim().isEmpty()) { - return null; - } - return new URL(webPage); - } catch (MalformedURLException e) { - return null; - } - } - - public Integer getCodeSize() { - String value = properties.getProperty(ROBOT_CODESIZE); - if (value == null) { - return null; - } - try { - return Integer.parseInt(value); - } catch (NumberFormatException e) { - return null; - } - } - - public boolean getIncludeSource() { - return properties.getProperty(ROBOT_INCLUDE_SOURCE, "true").equalsIgnoreCase("true"); - } - - public boolean getIncludeData() { - return properties.getProperty(ROBOT_INCLUDE_DATA, "true").equalsIgnoreCase("true"); - } - - public boolean isSourceIncluded() { - return sourcePathURLs.size() > 0; - } - - public String getRobocodeVersion() { - return properties.getProperty(ROBOCODE_VERSION, null); - } - - public String getReadableDirectory() { - String path; - if (root.isJAR()) { - String jarFile = getClassPathURL().getFile(); - jarFile = jarFile.substring(jarFile.lastIndexOf('/') + 1, jarFile.length()); - path = FileUtil.getRobotsDataDir().getPath(); - if (jarFile.length() > 0) { - path += File.separator + jarFile + '_'; - } - } else { - path = getClassPathURL().getFile(); - } - if (getFullPackage() != null) { - path += File.separator + getFullPackage().replace('.', File.separatorChar); - } - return path; - } - - public String getWritableDirectory() { - String path; - if (root.isJAR()) { - String jarFile = getClassPathURL().getFile(); - jarFile = jarFile.substring(jarFile.lastIndexOf('/') + 1, jarFile.length()); - path = FileUtil.getRobotsDataDir().getPath(); - if (jarFile.length() > 0) { - path += File.separator + jarFile + '_'; - } - } else { - path = ALWAYS_USE_CACHE_FOR_DATA ? FileUtil.getRobotsDataDir().getPath() : getClassPathURL().getFile(); - } - if (getFullPackage() != null) { - path += File.separator + getFullPackage().replace('.', File.separatorChar); - } - return path; - } - - public RobotSpecification createRobotSpecification(RobotSpecification battleRobotSpec, String teamId) { - RobotSpecification specification; - - if (battleRobotSpec != null) { - specification = battleRobotSpec; - } else { - specification = createRobotSpecification(); - } - if (teamId != null) { - HiddenAccess.setTeamId(specification, teamId); - } - return specification; - } - - public String toString() { - return itemUrl.toString(); - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotSpecItem.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotSpecItem.java deleted file mode 100644 index 953d63d..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/RobotSpecItem.java +++ /dev/null @@ -1,259 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items; - - -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.security.HiddenAccess; -import net.sf.robocode.util.AlphanumericComparator; -import robocode.control.RobotSpecification; - -import java.net.URL; -import java.util.Properties; -import java.util.StringTokenizer; - - -/** - * @author Pavel Savara (original) - */ -public abstract class RobotSpecItem extends RepositoryItem implements IRobotSpecItem { - private static final long serialVersionUID = 1L; - - protected Properties properties = new Properties(); - protected URL htmlURL; - - RobotSpecItem(URL itemURL, IRepositoryRoot root) { - super(itemURL, root); - } - - public abstract URL getPropertiesURL(); - - public abstract String getFullClassName(); - - public abstract String getVersion(); - - public abstract URL getWebpage(); - - public abstract String getAuthorName(); - - public abstract String getRobocodeVersion(); - - public abstract String getDescription(); - - public abstract URL getHtmlURL(); - - public boolean isDevelopmentVersion() { - return root.isDevelopmentRoot() - && !(getFullClassName().startsWith("sample") || getFullClassName().startsWith("tested.")); - } - - public String getRootPath() { - return root.getURL().toString(); - } - - public String getRootPackage() { - int lIndex = getFullClassName().indexOf("."); - String rootPackage = null; - - if (lIndex > 0) { - rootPackage = getFullClassName().substring(0, lIndex); - } - return rootPackage; - } - - public String getFullPackage() { - if (getFullClassName() == null) { - return null; - } - final int index = getFullClassName().lastIndexOf('.'); - - return (index >= 0) ? getFullClassName().substring(0, index) : null; - } - - // same as package but with slash - public String getRelativePath() { - final int index = getFullClassName().lastIndexOf('.'); - - return (index < 0) ? "" : getFullClassName().substring(0, index).replaceAll("\\.", "/"); - } - - public String getShortClassName() { - if (getFullClassName() == null) { - return null; - } - final int index = getFullClassName().lastIndexOf('.'); - - if (index == -1) { - return getFullClassName(); - } - return getFullClassName().substring(index + 1); - } - - public String getFullClassNameWithVersion() { - String fullClassName = getFullClassName(); - - if (getVersion() != null) { - fullClassName += " " + getVersion(); - } - return fullClassName; - } - - public String getUniqueFullClassName() { - String uniqueFullClassName = getFullClassName(); - - if (isDevelopmentVersion()) { - uniqueFullClassName += '*'; - } - return uniqueFullClassName; - } - - public String getUniqueFullClassNameWithVersion() { - String uniqueFullClassName = (getVersion() == null) ? getFullClassName() : getFullClassNameWithVersion(); - - if (isDevelopmentVersion()) { - uniqueFullClassName += '*'; - } - return uniqueFullClassName; - } - - public String getUniqueShortClassNameWithVersion() { - String uniqueShortClassName = (getVersion() == null) ? getShortClassName() : getShortClassNameWithVersion(); - - if (isDevelopmentVersion()) { - uniqueShortClassName += '*'; - } - return uniqueShortClassName; - } - - public String getUniqueVeryShortClassNameWithVersion() { - String veryShortClassName = (getVersion() == null) - ? getVeryShortClassName() - : getVeryShortClassNameWithVersion(); - - if (isDevelopmentVersion()) { - veryShortClassName += '*'; - } - return veryShortClassName; - } - - public String getShortClassNameWithVersion() { - String shortClassName = getShortClassName(); - - if (getVersion() != null) { - shortClassName += " " + getVersion(); - } - return shortClassName; - } - - public String getVeryShortClassNameWithVersion() { - String veryShortClassName = getVeryShortClassName(); - - if (getVersion() != null) { - veryShortClassName += " " + getVersion(); - } - return veryShortClassName; - } - - public String getVeryShortClassName() { - String veryShortClassName = getShortClassName(); - - if (veryShortClassName.length() > 12) { - veryShortClassName = veryShortClassName.substring(0, 12) + "..."; - } - return veryShortClassName; - } - - public RobotSpecification createRobotSpecification() { - return HiddenAccess.createSpecification(this, getUniqueFullClassName(), getAuthorName(), - (getWebpage() != null) ? getWebpage().toString() : null, getVersion(), getRobocodeVersion(), - root.getURL().toString(), getFullClassName(), getDescription()); - } - - public int compareTo(Object other) { - if (other == this) { - return 0; - } - if (other instanceof IRobotSpecItem) { - IRobotSpecItem otherRI = (IRobotSpecItem) other; - - return compare(getFullPackage(), getFullClassName(), getVersion(), otherRI.getFullPackage(), - otherRI.getFullClassName(), otherRI.getVersion()); - } - - // for IgnoredItem - return 0; - } - - private static int compare(String p1, String c1, String v1, String p2, String c2, String v2) { - AlphanumericComparator alphaNumComparator = new AlphanumericComparator(); - - // Compare packages - int result = alphaNumComparator.compare(p1, p2); - - if (result != 0) { - return result; - } - - // Same package, so compare classes - result = alphaNumComparator.compare(c1, c2); - if (result != 0) { - return result; - } - - // Same robot, so compare versions - if (v1 == null && v2 == null) { - return 0; - } - if (v1 == null) { - return 1; - } - if (v2 == null) { - return -1; - } - - if (v1.equals(v2)) { - return 0; - } - - if (v1.indexOf(".") < 0 || v2.indexOf(".") < 0) { - return alphaNumComparator.compare(v1, v2); - } - - // Dot separated versions. - StringTokenizer s1 = new StringTokenizer(v1, "."); - StringTokenizer s2 = new StringTokenizer(v2, "."); - - while (s1.hasMoreTokens() && s2.hasMoreTokens()) { - String tok1 = s1.nextToken(); - String tok2 = s2.nextToken(); - - try { - int i1 = Integer.parseInt(tok1); - int i2 = Integer.parseInt(tok2); - - if (i1 != i2) { - return i1 - i2; - } - } catch (NumberFormatException e) { - int tc = alphaNumComparator.compare(tok1, tok2); - - if (tc != 0) { - return tc; - } - } - } - if (s1.hasMoreTokens()) { - return 1; - } - if (s2.hasMoreTokens()) { - return -1; - } - return 0; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/TeamItem.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/TeamItem.java deleted file mode 100644 index 1f5b8fc..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/TeamItem.java +++ /dev/null @@ -1,258 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.RobocodeProperties; -import net.sf.robocode.io.URLJarCollector; -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.repository.RobotProperties; -import net.sf.robocode.repository.TeamProperties; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.core.Container; -import net.sf.robocode.version.IVersionManager; - -import java.io.*; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.util.HashSet; -import java.util.Properties; -import java.util.Set; - - -/** - * @author Pavel Savara (original) - */ -public class TeamItem extends RobotSpecItem implements IRobotSpecItem { - private static final long serialVersionUID = 1L; - - private static final String TEAM_DESCRIPTION = "team.description"; - private static final String TEAM_AUTHOR_NAME = "team.author.name"; - private static final String TEAM_VERSION = "team.version"; - private static final String TEAM_WEBPAGE = "team.webpage"; - private static final String TEAM_MEMBERS = "team.members"; - private static final String ROBOCODE_VERSION = "robocode.version"; - - private final String fullTeamName; - - public TeamItem(URL itemURL, IRepositoryRoot root) { - super(itemURL, root); - String tUrl = itemURL.toString(); - - tUrl = tUrl.substring(0, tUrl.lastIndexOf(".team")); - final int versionSeparator = tUrl.lastIndexOf(" "); - final int rootLen = root.getURL().toString().length(); - - if (versionSeparator != -1) { - fullTeamName = tUrl.substring(rootLen, versionSeparator).replace('/', '.').replace('\\', '.'); - } else { - fullTeamName = tUrl.substring(rootLen).replace('/', '.').replace('\\', '.'); - } - if (loadProperties()) { - isValid = true; - } - } - - private void htmlURLFromPropertiesURL() { - try { - htmlURL = new URL(itemUrl.toString().replaceAll("\\.team", ".html")); - - // test that html file exists - final URLConnection conn = URLJarCollector.openConnection(htmlURL); - - conn.getInputStream().close(); - } catch (IOException ignored) { - // doesn't exist - htmlURL = null; - } - } - - public Set getFriendlyURLs() { - Set urls = new HashSet(); - - if (itemUrl != null) { - String url = itemUrl.toString(); - String urlNoType = url.substring(0, url.lastIndexOf('.')); - - String path = itemUrl.getPath(); - String pathNoType = path.substring(0, path.lastIndexOf('.')); - - urls.add(urlNoType); - urls.add(pathNoType); - } - if (RobocodeProperties.isTestingOn()) { - urls.add(getFullClassName()); - } else { - urls.add(getUniqueFullClassName()); - } - urls.add(getUniqueFullClassNameWithVersion()); - - return urls; - } - - /** - * {@inheritDoc} - */ - public void update(long lastModified, boolean force) { - if (lastModified > this.lastModified || force) { - this.lastModified = lastModified; - loadProperties(); - } - } - - private boolean loadProperties() { - if (itemUrl != null) { - InputStream ios = null; - - try { - final URLConnection connection = URLJarCollector.openConnection(itemUrl); - - ios = connection.getInputStream(); - - properties.load(ios); - return true; - } catch (IOException e) { - Logger.logError(e); - } finally { - FileUtil.cleanupStream(ios); - } - } - return false; - } - - public URL getHtmlURL() { - // lazy - if (htmlURL == null) { - htmlURLFromPropertiesURL(); - } - return htmlURL; - } - - public URL getPropertiesURL() { - return itemUrl; - } - - public boolean isTeam() { - return true; - } - - public String getFullClassName() { - return fullTeamName; - } - - public String getMembers() { - return properties.getProperty(TEAM_MEMBERS, null); - } - - public String getVersion() { - return properties.getProperty(TEAM_VERSION, null); - } - - public String getDescription() { - return properties.getProperty(TEAM_DESCRIPTION, null); - } - - public String getAuthorName() { - return properties.getProperty(TEAM_AUTHOR_NAME, null); - } - - public URL getWebpage() { - try { - return new URL(properties.getProperty(TEAM_WEBPAGE, null)); - } catch (MalformedURLException e) { - return null; - } - } - - public boolean getIncludeSource() { - return false; - } - - public boolean getIncludeData() { - return false; - } - - public boolean isSourceIncluded() { - return false; - } - - public String getRobocodeVersion() { - return properties.getProperty(ROBOCODE_VERSION, null); - } - - public String toString() { - return itemUrl.toString(); - } - - public void storeProperties(OutputStream os, RobotProperties props) throws IOException { - if (props.getVersion() != null) { - properties.setProperty(TEAM_VERSION, props.getVersion()); - } - if (props.getDescription() != null) { - properties.setProperty(TEAM_DESCRIPTION, props.getDescription()); - } - if (props.getAuthor() != null) { - properties.setProperty(TEAM_AUTHOR_NAME, props.getAuthor()); - } - if (props.getWebPage() != null) { - properties.setProperty(TEAM_WEBPAGE, props.getWebPage().toExternalForm()); - } - properties.setProperty(ROBOCODE_VERSION, Container.getComponent(IVersionManager.class).getVersion()); - - properties.store(os, "Robocode Robot Team"); - } - - public static void createOrUpdateTeam(File target, TeamProperties props) throws IOException { - FileOutputStream os = null; - - try { - Properties team = loadTeamProperties(target); - - if (props.getMembers() != null) { - team.setProperty(TEAM_MEMBERS, props.getMembers()); - } - if (props.getAuthor() != null) { - team.setProperty(TEAM_AUTHOR_NAME, props.getAuthor()); - } - if (props.getDescription() != null) { - team.setProperty(TEAM_DESCRIPTION, props.getDescription()); - } - if (props.getWebPage() != null) { - team.setProperty(TEAM_WEBPAGE, props.getWebPage().toExternalForm()); - } - String version = Container.getComponent(IVersionManager.class).getVersion(); - team.setProperty(ROBOCODE_VERSION, version); - - os = new FileOutputStream(target); - team.store(os, "Robocode robot team"); - } finally { - FileUtil.cleanupStream(os); - } - } - - private static Properties loadTeamProperties(File target) { - Properties team = new Properties(); - - if (target.exists()) { - FileInputStream fis = null; - - try { - fis = new FileInputStream(target); - team.load(fis); - } catch (Exception e) { - Logger.logError(e); - } finally { - FileUtil.cleanupStream(fis); - } - } - return team; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ClassHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ClassHandler.java deleted file mode 100644 index d1389a0..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ClassHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items.handlers; - - -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.util.UrlUtil; - -import java.net.URL; - - -/** - * Item handler for accepting and registering Java class files. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class ClassHandler extends ItemHandler { - - /** - * {@inheritDoc} - */ - @Override - protected IRepositoryItem acceptItem(URL itemURL, IRepositoryRoot root, IRepository repository) { - // Accept and register the item if it is a Java class file, but not an inner class file - String name = itemURL.toString().toLowerCase(); - if (name.endsWith(".class") && !name.contains("$")) { - return register(itemURL, root, repository); - } - return null; - } - - /** - * Registers the class file with the specified URL as a RobotItem. - * - * @param classFileUrl is the URL of the class file to register. - * @param root is the repository root containing the class file to register. - * @param repository is the repository, where the class file is automatically added or updated, - * when the class file is registered. - * @return a RobotItem that has been created or updated in the repository. - */ - private RobotItem register(URL classFileUrl, IRepositoryRoot root, IRepository repository) { - RobotItem item = null; - - // Check if the class file is already registered in the repository - String friendlyUrl = UrlUtil.removeFileExtension(classFileUrl.toString()); - - IRepositoryItem repositoryItem = repository.getItem(friendlyUrl); - if (repositoryItem instanceof RobotItem) { - item = (RobotItem) repositoryItem; - } - - // If the class file has not been registered then create a new RobotItem based on the class file URL - if (item == null) { - item = new RobotItem(classFileUrl, root); - } - - // Set the class path URL and class URL on the RobotItem - item.setClassPathURL(root.getURL()); - item.setClassURL(classFileUrl); - - // Add or update the item in the repository and return it - repository.addOrUpdateItem(item); - return item; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ItemHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ItemHandler.java deleted file mode 100644 index 8567bff..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/ItemHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items.handlers; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.root.IRepositoryRoot; - -import java.net.URL; -import java.util.List; - - -/** - * Abstract item handler used for accepting and registering specific item types. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public abstract class ItemHandler { - - /** - * Tests whether or not the item with at the specified item URL is accepted and can be handled by this item handler. - * - * @param itemUrl is the URL of the item to test. - * @param root is the repository root containing the item to test. - * @param repository is the repository, where the item is automatically added or updated, if the item is accepted. - * @return a repository item that has been created or updated in the repository or null if the item was not - * accepted by this item handler. - */ - protected abstract IRepositoryItem acceptItem(URL itemUrl, IRepositoryRoot root, IRepository repository); - - /** - * Tests whether or not the item with at the specified item URL is accepted and can be handled by any - * available item handler. - * - * @param itemUrl is the URL of the item to test. - * @param root is the repository root containing the item to test. - * @param repository is the repository, where the item is automatically added or updated, if the item is accepted. - * @return a repository item that has been created or updated in the repository or null if the item was not - * accepted by an item handler. - */ - public final static IRepositoryItem registerItem(URL itemUrl, IRepositoryRoot root, IRepository repository) { - // Test if any available item handler will accept and register the item - List itemHandlers = Container.getComponents(ItemHandler.class); - for (ItemHandler handler : itemHandlers) { - IRepositoryItem repositoryItem = handler.acceptItem(itemUrl, root, repository); - if (repositoryItem != null) { - return repositoryItem; - } - } - return null; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/PropertiesHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/PropertiesHandler.java deleted file mode 100644 index f7d168b..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/PropertiesHandler.java +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items.handlers; - - -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.util.UrlUtil; -import net.sf.robocode.core.Container; - -import java.net.URL; - - -/** - * Handler for accepting and registering Java properties files. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class PropertiesHandler extends ItemHandler { - - /** - * {@inheritDoc} - */ - @Override - protected IRepositoryItem acceptItem(URL itemURL, IRepositoryRoot root, IRepository repository) { - // Accept and register the item if it is a Java properties file - String name = itemURL.toString().toLowerCase(); - if (name.endsWith(".properties")) { - return register(itemURL, root, repository); - } - return null; - } - - /** - * Registers the properties file with the specified URL as a RobotItem. - * - * @param propertiesFileUrl is the URL of the properties file to register. - * @param root is the repository root containing the properties file to register. - * @param repository is the repository, where the properties file is automatically added or updated, - * when the properties file is registered. - * @return a RobotItem that has been created or updated in the repository. - */ - private RobotItem register(URL propertiesFileUrl, IRepositoryRoot root, IRepository repository) { - RobotItem item = null; - - // Check if the properties file is already registered in the repository - String friendlyUrl = UrlUtil.removeFileExtension(propertiesFileUrl.toString()); - - IRepositoryItem repositoryItem = repository.getItem(friendlyUrl); - if (repositoryItem instanceof RobotItem) { - item = (RobotItem) repositoryItem; - } - - // If the properties file has not been registered then create a new RobotItem based on the properties file URL - if (item == null) { - item = createRobotItem(propertiesFileUrl, root, repository); - } - - // Add or update the item in the repository and return it - if (item != null) { - repository.addOrUpdateItem(item); - } - return item; - } - - /** - * Creates a new RobotItem based on the properties file URL. - * This method will dispatch creating and registering the properties file to another handler, - * if the platform is not Java. - * - * @param propertiesFileUrl is the URL of the properties file. - * @param root is the repository root containing the properties file to create the RobotItem from. - * @param repository is the repository, where the properties file is automatically added or updated, - * when the properties file is registered. - * @return a new RobotItem that has been created or null if the RobotItem could not be created. - */ - private RobotItem createRobotItem(URL propertiesFileUrl, IRepositoryRoot root, IRepository repository) { - // Create a RobotItem based on the properties file URL - RobotItem item = new RobotItem(propertiesFileUrl, root); - - // Check if the robot is for the Java platform - String platform = item.getPlatform(); - if (platform.equalsIgnoreCase("Java")) { - // Java platform -> set the properties URL on the RobotItem - item.setPropertiesURL(propertiesFileUrl); - } else { - // Another platform -> Look for another properties handler - PropertiesHandler otherHandler = Container.getComponent(PropertiesHandler.class, - platform + "PropertiesHandler"); - - // If the another properties handler was found then let create the RobotItem; otherwise return null - return (otherHandler == null) ? null : otherHandler.createRobotItem(propertiesFileUrl, root, repository); - } - return item; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/SourceHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/SourceHandler.java deleted file mode 100644 index 86176a9..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/SourceHandler.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items.handlers; - - -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.root.ClasspathRoot; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.util.UrlUtil; - -import java.net.URL; - - -/** - * Item handler for accepting and registering source files, e.g. Java source files. - * - * @author Flemming N. Larsen (original) - */ -public class SourceHandler extends ItemHandler { - - /** - * {@inheritDoc} - */ - @Override - protected IRepositoryItem acceptItem(URL itemURL, IRepositoryRoot root, IRepository repository) { - // Accept and register the item if it is a Java source file, but not an inner Java source file (e.g. mechanical generated) - String name = itemURL.toString().toLowerCase(); - if (name.endsWith(".java") && !name.contains("$")) { - return register(itemURL, root, repository); - } - return null; - } - - /** - * Registers the source file with the specified URL as a RobotItem. - * - * @param sourceFileUrl is the URL of the source file to register. - * @param root is the repository root containing the source file to register. - * @param repository is the repository, where the source file is automatically added or updated, - * when the source file is registered. - * @return a RobotItem that has been created or updated in the repository. - */ - private RobotItem register(URL sourceFileUrl, IRepositoryRoot root, IRepository repository) { - RobotItem item = null; - - // Check if the source file is already registered in the repository with a project URL - if (root instanceof ClasspathRoot) { - String projectUrl = ((ClasspathRoot) root).getFriendlyProjectURL(sourceFileUrl); - if (projectUrl != null) { - IRepositoryItem repositoryItem = repository.getItem(projectUrl); - if (repositoryItem instanceof RobotItem) { - item = (RobotItem) repositoryItem; - } - } - } - - // If no project URL was registered with the source file then check if the source file is registered - // in the repository. - if (item == null) { - String friendlyUrl = UrlUtil.removeFileExtension(sourceFileUrl.toString()); - - IRepositoryItem repositoryItem = repository.getItem(friendlyUrl); - if (repositoryItem instanceof RobotItem) { - item = (RobotItem) repositoryItem; - } - } - - // If the source file has not been registered then create a new RobotItem based on the source file URL - if (item == null) { - item = new RobotItem(sourceFileUrl, root); - } - - // Add the root URL as source path with the RobotIteam - item.addSourcePathURL(root.getURL()); - - // Add or update the item in the repository and return it - repository.addOrUpdateItem(item); - return item; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/TeamHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/TeamHandler.java deleted file mode 100644 index 7b5fcfd..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/items/handlers/TeamHandler.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.items.handlers; - - -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.TeamItem; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.util.UrlUtil; - -import java.net.URL; - - -/** - * Item handler for accepting and registering robot team files. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class TeamHandler extends ItemHandler { - - /** - * {@inheritDoc} - */ - @Override - protected IRepositoryItem acceptItem(URL itemURL, IRepositoryRoot root, IRepository repository) { - // Accept and register the item if it is a robot team file - String name = itemURL.toString().toLowerCase(); - if (name.endsWith(".team")) { - return register(itemURL, root, repository); - } - return null; - } - - /** - * Registers the team file with the specified URL as a TeamItem. - * - * @param teamFileUrl is the URL of the team file to register. - * @param root is the repository root containing the team file to register. - * @param repository is the repository, where the team file is automatically added or updated, - * when the team file is registered. - * @return a TeamItem that has been created or updated in the repository. - */ - private TeamItem register(URL teamFileUrl, IRepositoryRoot root, IRepository repository) { - TeamItem item = null; - - // Check if the team file is already registered in the repository - String friendlyUrl = UrlUtil.removeFileExtension(teamFileUrl.toString()); - - IRepositoryItem repositoryItem = repository.getItem(friendlyUrl); - if (repositoryItem instanceof TeamItem) { - item = (TeamItem) repositoryItem; - } - - // If the team file has not been registered then create a new TeamItem based on the team file URL - if (item == null) { - item = new TeamItem(teamFileUrl, root); - } - - // Add or update the item in the repository and return it - repository.addOrUpdateItem(item); - return item; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarCreator.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarCreator.java deleted file mode 100644 index fb96df8..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarCreator.java +++ /dev/null @@ -1,267 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.packager; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.host.IHostManager; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.CodeSizeCalculator; -import net.sf.robocode.repository.IRobotItem; -import net.sf.robocode.repository.RobotProperties; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.items.TeamItem; -import net.sf.robocode.version.IVersionManager; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.jar.Attributes; -import java.util.jar.JarEntry; -import java.util.jar.JarOutputStream; -import java.util.jar.Manifest; -import java.net.URL; -import java.net.URLDecoder; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class JarCreator { - - public static String createPackage(File jarFile, List robotItems, TeamItem teamItem, RobotProperties props) { - JarOutputStream jarOut = null; - FileOutputStream fos = null; - Set jarEntries = new HashSet(); - try { - fos = new FileOutputStream(jarFile); - jarOut = new JarOutputStream(fos, createManifest(robotItems)); - - String rVersion = Container.getComponent(IVersionManager.class).getVersion(); - jarOut.setComment(rVersion + " - Robocode version"); - - boolean isTeam = teamItem != null; - - // Add robot items - addRobotItemToJar(jarOut, jarEntries, robotItems, props, isTeam); - - // Add team item, if it exists - if (isTeam) { - addTeamItemToJar(jarOut, jarEntries, teamItem, props); - } - } catch (IOException e) { - Logger.logError(e); - } finally { - FileUtil.cleanupStream(jarOut); - FileUtil.cleanupStream(fos); - } - - StringBuilder sb = new StringBuilder(); - for (String entry : jarEntries) { - sb.append(entry).append('\n'); - } - appendCodeSize(jarFile, sb); - return sb.toString(); - } - - private static Manifest createManifest(List robots) { - Manifest manifest; - - manifest = new Manifest(); - manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); - StringBuilder robotsString = new StringBuilder(); - - for (int i = 0; i < robots.size(); i++) { - robotsString.append(robots.get(i).getFullClassName()); - if (i < robots.size() - 1) { - robotsString.append(','); - } - } - manifest.getMainAttributes().put(new Attributes.Name("robots"), robotsString.toString()); - return manifest; - } - - private static void addRobotItemToJar(JarOutputStream target, Set jarEntries, List robotItems, RobotProperties props, boolean isTeam) throws IOException { - for (IRobotItem robotItem : robotItems) { - String path = robotItem.getRelativePath() + '/' + robotItem.getShortClassName() + ".properties"; - - // Add the code size to the robot properties before storing them - String classPath = robotItem.getClassPathURL().getPath(); // Takes the dev.path into account! - File dir = new File(classPath, robotItem.getRelativePath()); - Integer codeSize = CodeSizeCalculator.getDirectoryCodeSize(dir); - props.setCodeSize(codeSize); - - if (!isTeam) { - // Store local .properties file - FileOutputStream fis = null; - try { - File file = new File(classPath, path); - fis = new FileOutputStream(file); - robotItem.storeProperties(fis, props); - } finally { - FileUtil.cleanupStream(fis); - } - } - // Package robot files (.class, .properties, .java) into jar file - addRobotFilesToJar(target, jarEntries, robotItem, props); - } - } - - private static void addTeamItemToJar(JarOutputStream target, Set jarEntries, TeamItem teamItem, RobotProperties props) throws IOException { - String robotPathWithoutFileExt = teamItem.getRelativePath() + '/' + teamItem.getShortClassName(); - - File file = new File(FileUtil.getRobotsDir(), robotPathWithoutFileExt); - - // Store .team file into local robot dir - FileOutputStream fis = null; - try { - fis = new FileOutputStream(file); - teamItem.storeProperties(fis, props); - } finally { - FileUtil.cleanupStream(fis); - } - // Store .team file into jar file - addToJar(target, jarEntries, FileUtil.getRobotsDir().getPath(), robotPathWithoutFileExt, ".team"); - } - - private static void addRobotFilesToJar(JarOutputStream target, Set jarEntries, IRobotItem robotItem, RobotProperties props) throws IOException { - IHostManager host = Container.getComponent(IHostManager.class); - for (String className : host.getReferencedClasses(robotItem)) { - if (!className.startsWith("java") && !className.startsWith("robocode")) { - String robotPath = className.replace('.', '/'); - addRobotFilesToJar(target, jarEntries, robotPath, robotItem, props); - } - } - } - - private static void addRobotFilesToJar(JarOutputStream target, Set jarEntries, String robotPathWithoutFileExt, IRobotItem robotItem, RobotProperties props) throws IOException { - addClassFileToJar(target, jarEntries, robotPathWithoutFileExt, robotItem); - addPropertiesFileToJar(target, jarEntries, robotPathWithoutFileExt, robotItem); - addJavaFileToJar(target, jarEntries, robotPathWithoutFileExt, robotItem, props); - addDataDirToJar(target, jarEntries, robotPathWithoutFileExt, robotItem, props); - } - - private static void addClassFileToJar(JarOutputStream target, Set jarEntries, String robotPathWithoutFileExt, IRobotItem robotItem) throws IOException { - String classRootPath = robotItem.getClassPathURL().getPath(); - addToJar(target, jarEntries, classRootPath, robotPathWithoutFileExt, ".class"); - } - - private static void addPropertiesFileToJar(JarOutputStream target, Set jarEntries, String robotPathWithoutFileExt, IRobotItem robotItem) throws IOException { - String classRootPath = robotItem.getClassPathURL().getPath(); - addToJar(target, jarEntries, classRootPath, robotPathWithoutFileExt, ".properties"); - } - - private static void addJavaFileToJar(JarOutputStream target, Set jarEntries, String robotFilePath, IRobotItem robotItem, RobotProperties props) throws IOException { - if (props.isIncludeSource() && !robotFilePath.contains("$")) { - for (URL sourcePathURL : robotItem.getSourcePathURLs()) { - addToJar(target, jarEntries, sourcePathURL.getPath(), robotFilePath, ".java"); - } - } - } - - private static void addDataDirToJar(JarOutputStream target, Set jarEntries, String robotPathWithoutFileExt, IRobotItem robotItem, RobotProperties props) throws IOException { - if (props.isIncludeData()) { - String rootPath = robotItem.getRootPath().replace('\\', '/'); - if (rootPath.startsWith("file:/")) { - rootPath = rootPath.substring("file:/".length()); - } - addToJar(target, jarEntries, rootPath, robotPathWithoutFileExt, ".data"); - } - } - - private static void addToJar(JarOutputStream target, Set jarEntries, String rootPath, String robotPathWithoutFileExt, String fileExt) throws IOException { - String filePath = robotPathWithoutFileExt + fileExt; - try { - rootPath = URLDecoder.decode(rootPath, "UTF-8"); - } catch (UnsupportedEncodingException e) { - Logger.logError(e); - } - File file = new File(rootPath, filePath); - if (file.exists() && !jarEntries.contains(filePath)) { - addFileToJar(file, filePath, target); - jarEntries.add(filePath); - } - } - - private static void addFileToJar(File source, String entryPath, JarOutputStream target) throws IOException { - // Jar/zip files only allows '/' as file separator - String path = entryPath.replace("\\", "/"); - - // No jar/zip entry must start with an '/' - while (path.startsWith("/")) { - path = path.substring(1); - } - - if (source.isDirectory()) { - // Directory entries must end with an '/' - if (!path.isEmpty() && !path.endsWith("/")) { - path += "/"; - } - // Add all files in the directory to the target jar - for (File nestedFile: source.listFiles()) { - String newEntryPath = entryPath + '/' + nestedFile.getName(); - addFileToJar(nestedFile, newEntryPath, target); - } - } else { - JarEntry entry = new JarEntry(path); - entry.setTime(source.lastModified()); - target.putNextEntry(entry); - - // Source is a file - - FileInputStream fis = null; - BufferedInputStream bis = null; - try { - fis = new FileInputStream(source); - bis = new BufferedInputStream(fis); - - byte[] buffer = new byte[1024]; - while (true) { - int count = bis.read(buffer); - if (count == -1) { - break; - } - target.write(buffer, 0, count); - } - } finally { - target.closeEntry(); - - FileUtil.cleanupStream(bis); - FileUtil.cleanupStream(fis); - } - } - } - - private static void appendCodeSize(File jarFile, StringBuilder sb) { - Integer codesize = CodeSizeCalculator.getJarFileCodeSize(jarFile); - if (codesize != null) { - String weightClass = null; - - if (codesize >= 1500) { - weightClass = "MegaBot (codesize >= 1500 bytes)"; - } else if (codesize >= 750) { - weightClass = "MiniBot (codesize < 1500 bytes)"; - } else if (codesize >= 250) { - weightClass = "MicroBot (codesize < 750 bytes)"; - } else { - weightClass = "NanoBot (codesize < 250 bytes)"; - } - sb.append("\n\n---- Codesize ----\n"); - sb.append("Codesize: ").append(codesize).append(" bytes\n"); - sb.append("Robot weight class: ").append(weightClass).append('\n'); - } - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarExtractor.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarExtractor.java deleted file mode 100644 index 1997f1c..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/packager/JarExtractor.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.packager; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.URLJarCollector; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.InputStream; -import java.io.IOException; -import java.io.FileOutputStream; -import java.util.jar.JarInputStream; -import java.util.jar.JarEntry; -import java.net.URLConnection; -import java.net.URL; - - -/** - * @author Pavel Savara (original) - */ -public class JarExtractor { - public static void extractJar(URL url) { - File dest = FileUtil.getRobotsDir(); - InputStream is = null; - BufferedInputStream bis = null; - JarInputStream jarIS = null; - - try { - final URLConnection con = URLJarCollector.openConnection(url); - - is = con.getInputStream(); - bis = new BufferedInputStream(is); - jarIS = new JarInputStream(bis); - - JarEntry entry = jarIS.getNextJarEntry(); - - while (entry != null) { - if (entry.isDirectory()) { - File dir = new File(dest, entry.getName()); - - if (!dir.exists() && !dir.mkdirs()) { - Logger.logError("Cannot create dir: " + dir); - } - } else { - extractFile(dest, jarIS, entry); - } - entry = jarIS.getNextJarEntry(); - } - } catch (IOException e) { - Logger.logError(e); - } finally { - FileUtil.cleanupStream(jarIS); - FileUtil.cleanupStream(bis); - FileUtil.cleanupStream(is); - } - } - - public static void extractFile(File dest, JarInputStream jarIS, JarEntry entry) throws IOException { - File out = new File(dest, entry.getName()); - File parentDirectory = new File(out.getParent()); - - if (!parentDirectory.exists() && !parentDirectory.mkdirs()) { - Logger.logError("Cannot create dir: " + parentDirectory); - } - FileOutputStream fos = null; - BufferedOutputStream bos = null; - byte buf[] = new byte[2048]; - - try { - fos = new FileOutputStream(out); - bos = new BufferedOutputStream(fos); - - int num; - - while ((num = jarIS.read(buf, 0, 2048)) != -1) { - bos.write(buf, 0, num); - } - } finally { - FileUtil.cleanupStream(bos); - FileUtil.cleanupStream(fos); - } - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/parsers/ClasspathFileParser.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/parsers/ClasspathFileParser.java deleted file mode 100644 index b464500..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/parsers/ClasspathFileParser.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.parsers; - - -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - - -/** - * Class used for parsing a .classpath file in an Eclipse project. - * - * @author Flemming N. Larsen (original) - */ -public class ClasspathFileParser { - - private ClasspathHandler classpathHandler = new ClasspathHandler(); - - public void parse(URL url) { - try { - SAXParserFactory.newInstance().newSAXParser().parse(url.toString(), classpathHandler); - } catch (SAXException ignore) {} catch (IOException ignore) {} catch (ParserConfigurationException ignore) {} - } - - public String[] getSourcePaths() { - return classpathHandler.sourcePaths.toArray(new String[] {}); - } - - public String getClassPath() { - return classpathHandler.outputPath; - } - - private static class ClasspathHandler extends DefaultHandler { - String outputPath = null; - List sourcePaths = new ArrayList(); - - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if ("classpathentry".equals(qName)) { - String kind = attributes.getValue("kind"); - - if ("src".equals(kind)) { - sourcePaths.add(attributes.getValue("path")); - } else if ("output".equals(kind)) { - outputPath = attributes.getValue("path"); - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/BaseRoot.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/BaseRoot.java deleted file mode 100644 index 14b6c89..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/BaseRoot.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.root; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.ui.IWindowManager; - -import java.io.File; -import java.io.Serializable; -import java.net.MalformedURLException; -import java.net.URL; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public abstract class BaseRoot implements Serializable, IRepositoryRoot { - private static final long serialVersionUID = 1L; - - protected transient IRepository repository; - protected final File rootPath; - protected final URL rootURL; - - public BaseRoot(IRepository repository, File rootPath) { - this.repository = repository; - this.rootPath = rootPath; - - URL url = null; - try { - url = rootPath.toURI().toURL(); - } catch (MalformedURLException e) { - Logger.logError(e); - } - this.rootURL = url; - } - - public URL getURL() { - return rootURL; - } - - public File getPath() { - return rootPath; - } - - public void setRepository(IRepository repository) { - this.repository = repository; - } - - public String toString() { - return rootURL != null ? rootURL.toString() : null; - } - - public void extractJAR() { - throw new UnsupportedOperationException(); - } - - public boolean equals(Object obj) { - if (obj instanceof IRepositoryRoot) { - return ((IRepositoryRoot) obj).getURL().equals(rootURL); - } - return false; - } - - protected static void setStatus(String message) { - IWindowManager windowManager = net.sf.robocode.core.Container.getComponent(IWindowManager.class); - if (windowManager != null) { - windowManager.setStatus(message); - } - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/ClasspathRoot.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/ClasspathRoot.java deleted file mode 100644 index 974b510..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/ClasspathRoot.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.root; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.handlers.ItemHandler; -import net.sf.robocode.util.UrlUtil; - -import java.io.File; -import java.io.FileFilter; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - - -/** - * Represents a classpath root. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public final class ClasspathRoot extends BaseRoot implements IRepositoryRoot { - private static final long serialVersionUID = 1L; - - private final File projectPath; - - public ClasspathRoot(IRepository repository, File rootPath, File projectPath) { - super(repository, rootPath); - this.projectPath = projectPath; - } - - /** - * {@inheritDoc} - */ - public void updateItems(boolean force) { - setStatus("Updating classpath: " + rootPath.toString()); - - // We remove all items from the root so we don't need to check, which items that might have been deleted. - // This is fast to do, as items are simple referenced by friendly URLs in a map. - // Items will be re-added or updated later in this method. - repository.removeItemsFromRoot(this); - - // Retrieve all items accessible from this classpath root along with their 'last modified' date - List items = new ArrayList(); - List itemsLastModification = new ArrayList(); - - visitDirectory(rootPath, items, itemsLastModification); - - // Run thru all found repository items and update these according to their 'last modified' date - for (int i = 0; i < items.size(); i++) { - IRepositoryItem repositoryItem = items.get(i); - repositoryItem.update(itemsLastModification.get(i), force); - } - } - - private void visitDirectory(File path, final List items, final List itemsLastModification) { - - path.listFiles( - new FileFilter() { - public boolean accept(File pathname) { - if (pathname.isFile()) { - try { - IRepositoryItem repositoryItem = ItemHandler.registerItem(pathname.toURI().toURL(), - ClasspathRoot.this, repository); - if (repositoryItem != null) { - items.add(repositoryItem); - itemsLastModification.add(pathname.lastModified()); - } - } catch (MalformedURLException e) { - Logger.logError(e); - } - } - return false; - } - }); - - // find sub-directories - File[] subDirs = path.listFiles( - new FileFilter() { - public boolean accept(File pathname) { - return pathname.isDirectory() && !pathname.getName().toLowerCase().endsWith(".data") - && !pathname.getName().toLowerCase().endsWith(".robotcache"); - } - }); - - if (subDirs != null) { - for (File subDir : subDirs) { - visitDirectory(subDir, items, itemsLastModification); - } - } - } - - public void updateItem(IRepositoryItem item, boolean force) { - setStatus("Updating classpath: " + rootPath); - - File file = new File(item.getItemURL().toString()); - item.update(file.lastModified(), force); - } - - public boolean isChanged(IRepositoryItem repositoryItem) { - File file = new File(repositoryItem.getItemURL().toString()); - return file.lastModified() > repositoryItem.getLastModified(); - } - - public boolean isDevelopmentRoot() { - return true; - } - - public boolean isJAR() { - return false; - } - - public String getFriendlyProjectURL(URL itemURL) { - String url = null; - - if (projectPath != null) { - try { - String rootPath = projectPath.toURI().toURL().toString(); - String itemPath = itemURL.toString().substring(getURL().toString().length()); - - url = rootPath + UrlUtil.removeFileExtension(itemPath); - - } catch (MalformedURLException e) { - Logger.logError(e); - } - } - return url; - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/IRepositoryRoot.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/IRepositoryRoot.java deleted file mode 100644 index fb99e70..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/IRepositoryRoot.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.root; - - -import net.sf.robocode.repository.items.IRepositoryItem; - -import java.io.File; -import java.net.URL; - - -/** - * @author Pavel Savara (original) - */ -public interface IRepositoryRoot { - URL getURL(); - File getPath(); - - /** - * Updates all items accessible from this repository root. - * Only items that needs to be updated will be updated, e.g. by checking the 'last modified' date on the item. - * - * @param force is a flag specifying if the items are forced to be updated. - * If this parameter is true, then all items will be updated. - */ - void updateItems(boolean force); - - void updateItem(IRepositoryItem repositoryItem, boolean force); - - boolean isJAR(); - boolean isDevelopmentRoot(); - void extractJAR(); -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/JarRoot.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/JarRoot.java deleted file mode 100644 index 18f7cf6..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/JarRoot.java +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.root; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.URLJarCollector; -import net.sf.robocode.io.JarJar; -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.packager.JarExtractor; -import net.sf.robocode.repository.items.IRepositoryItem; -import net.sf.robocode.repository.items.RobotItem; -import net.sf.robocode.repository.items.handlers.ItemHandler; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarInputStream; - - -/** - * Represents a JAR file. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public final class JarRoot extends BaseRoot implements IRepositoryRoot { - private static final long serialVersionUID = 1L; - - private final String jarPath; // without a separator ("/!") - private final URL jarUrl; - - private long lastModified; - - public JarRoot(IRepository repository, File rootPath) { - super(repository, rootPath); - String jarPath = null; - URL jarUrl = null; - try { - jarPath = "jar:" + rootPath.toURI().toString(); - jarUrl = new URL(jarPath + "!/"); - } catch (MalformedURLException e) { - Logger.logError(e); - } - this.jarPath = jarPath; - this.jarUrl = jarUrl; - } - - /** - * {@inheritDoc} - */ - public void updateItems(boolean force) { - setStatus("Updating JAR: " + rootPath.toString()); - - long lastModified = rootPath.lastModified(); - - if (lastModified > this.lastModified) { - repository.removeItemsFromRoot(this); - this.lastModified = lastModified; - - List repositoryItems = new ArrayList(); - - visitItems(repositoryItems); - for (IRepositoryItem repositoryItem : repositoryItems) { - repositoryItem.update(lastModified, force); - } - } - } - - private void visitItems(List repositoryItems) { - String root = jarPath; - InputStream is = null; - BufferedInputStream bis = null; - JarInputStream jarIS = null; - - try { - URLConnection con = URLJarCollector.openConnection(rootURL); - - is = con.getInputStream(); - bis = new BufferedInputStream(is); - jarIS = new JarInputStream(bis); - readJarStream(repositoryItems, root, jarIS); - - } catch (Exception e) { - Logger.logError(rootURL + " is probably corrupted (" + e.getClass().getName() + " " + e.getMessage() + ")"); - } finally { - FileUtil.cleanupStream(jarIS); - FileUtil.cleanupStream(bis); - FileUtil.cleanupStream(is); - } - } - - private void readJarStream(List repositoryItems, String root, JarInputStream jarIS) throws IOException { - JarEntry entry = jarIS.getNextJarEntry(); - - while (entry != null) { - String name = entry.getName().toLowerCase(); - - if (!entry.isDirectory()) { - if (name.contains(".data/") && !name.contains(".robotcache/")) { - JarExtractor.extractFile(FileUtil.getRobotsDataDir(), jarIS, entry); - } else { - if (name.endsWith(".jar") || name.endsWith(".zip")) { - JarInputStream inner = null; - - try { - inner = new JarInputStream(jarIS); - readJarStream(repositoryItems, "jar:jar" + root + JarJar.SEPARATOR + entry.getName(), inner); - } finally { - if (inner != null) { - inner.closeEntry(); - } - } - } else { - createItem(repositoryItems, new URL(root + "!/"), entry); - } - } - } - entry = jarIS.getNextJarEntry(); - } - } - - private void createItem(List repositoryItems, URL root, JarEntry entry) { - try { - String pUrl = root.toString() + entry.getName(); - IRepositoryItem repositoryItem = ItemHandler.registerItem(new URL(pUrl), JarRoot.this, repository); - - if (repositoryItem != null) { - if (repositoryItem instanceof RobotItem) { - RobotItem robotItem = (RobotItem) repositoryItem; - - robotItem.setClassPathURL(root); - } - repositoryItems.add(repositoryItem); - } - } catch (MalformedURLException e) { - Logger.logError(e); - } - } - - public void updateItem(IRepositoryItem repositoryItem, boolean force) { - repositoryItem.update(rootPath.lastModified(), force); - } - - public boolean isChanged(IRepositoryItem repositoryItem) { - return rootPath.lastModified() > lastModified; - } - - public URL getURL() { - return jarUrl; - } - - public boolean isDevelopmentRoot() { - return false; - } - - public boolean isJAR() { - return true; - } - - public void extractJAR() { - JarExtractor.extractJar(rootURL); - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/ClassPathHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/ClassPathHandler.java deleted file mode 100644 index fb5b16e..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/ClassPathHandler.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.root.handlers; - - -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.parsers.ClasspathFileParser; -import net.sf.robocode.repository.root.ClasspathRoot; -import net.sf.robocode.repository.root.IRepositoryRoot; - -import java.io.File; -import java.net.MalformedURLException; -import java.util.Map; - - -/** - * Handler for registering class path roots. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class ClassPathHandler extends RootHandler { - public void visitDirectory(File dir, boolean isDevel, Map newRoots, IRepository repository, boolean force) { - if (isDevel) { - File classpathFile = new File(dir, ".classpath"); - - if (classpathFile.exists()) { - ClasspathFileParser classpathParser = new ClasspathFileParser(); - - boolean parsed = true; - - try { - classpathParser.parse(classpathFile.toURI().toURL()); - } catch (MalformedURLException e) { - parsed = false; - } - if (parsed) { - String classPath = classpathParser.getClassPath(); - - if (classPath != null) { - File classPathDir = new File(dir, classPath); - - handleDirectory(classPathDir, dir, newRoots, repository, force); - } - - for (String sourcePath : classpathParser.getSourcePaths()) { - if (sourcePath != null) { - File sourcePathDir = new File(dir, sourcePath); - - handleDirectory(sourcePathDir, dir, newRoots, repository, force); - } - } - - return; // we are done! - } - } - } - handleDirectory(dir, null, newRoots, repository, force); - } - - private void handleDirectory(File dir, File projectDir, Map newRoots, IRepository repository, boolean force) { - String key; - - try { - key = dir.toURI().toURL().toString(); - } catch (MalformedURLException e) { - return; - } - - IRepositoryRoot root = repository.getRoots().get(key); - if (root == null) { - root = new ClasspathRoot(repository, dir, projectDir); - } else { - repository.removeRoot(key); - } - - root.updateItems(force); - newRoots.put(key, root); - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/JarHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/JarHandler.java deleted file mode 100644 index d27d0c3..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/JarHandler.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.root.handlers; - - -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.root.IRepositoryRoot; -import net.sf.robocode.repository.root.JarRoot; -import net.sf.robocode.io.Logger; -import net.sf.robocode.io.URLJarCollector; - -import java.io.File; -import java.io.FileFilter; -import java.net.MalformedURLException; -import java.util.Map; - - -/** - * @author Pavel Savara (original) - */ -public class JarHandler extends RootHandler { - public void visitDirectory(File dir, boolean isDevel, Map newRoots, IRepository repository, boolean force) { - if (!isDevel) { - // find jar files - final File[] jars = dir.listFiles(new FileFilter() { - public boolean accept(File pathname) { - String path = pathname.toString().toLowerCase(); - return pathname.isFile() && (path.endsWith(".jar") || path.endsWith(".zip")); - } - }); - - if (jars == null) { - return; // Avoid NPE by returning - } - - // update jar files - for (File jar : jars) { - String key; - - try { - key = "jar:" + jar.toURI().toURL().toString() + "!/"; - } catch (MalformedURLException e) { - e.printStackTrace(); - continue; - } - IRepositoryRoot root = repository.getRoots().get(key); - if (root == null) { - root = new JarRoot(repository, jar); - } else { - repository.removeRoot(key); - } - - root.updateItems(force); - newRoots.put(key, root); - - try { - URLJarCollector.closeJarURLConnection(jar.toURI().toURL()); - } catch (MalformedURLException e) { - Logger.logError(e); - } - URLJarCollector.gc(); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/RootHandler.java b/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/RootHandler.java deleted file mode 100644 index f9e3f09..0000000 --- a/代码/workspace_robo4/robocode.repository/src/main/java/net/sf/robocode/repository/root/handlers/RootHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.repository.root.handlers; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.repository.IRepository; -import net.sf.robocode.repository.root.IRepositoryRoot; - -import java.io.File; -import java.util.List; -import java.util.Map; - - -/** - * @author Pavel Savara (original) - */ -public abstract class RootHandler { - public abstract void visitDirectory(File dir, boolean isDevel, Map newRoots, IRepository repository, boolean force); - - public void open() {} - - public void close() {} - - public static void visitDirectories(File dir, boolean isDevel, Map newRoots, IRepository repository, boolean force) { - // walk thru all plugins - final List itemHandlerList = Container.getComponents(RootHandler.class); - - for (RootHandler handler : itemHandlerList) { - handler.visitDirectory(dir, isDevel, newRoots, repository, force); - } - } - - public static void openHandlers() { - List rootHandlers = Container.getComponents(RootHandler.class); - for (RootHandler handler : rootHandlers) { - handler.open(); - } - } - - public static void closeHandlers() { - List rootHandlers = Container.getComponents(RootHandler.class); - for (RootHandler handler : rootHandlers) { - handler.close(); - } - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/.classpath b/代码/workspace_robo4/robocode.roborumble/.classpath deleted file mode 100644 index a355dc2..0000000 --- a/代码/workspace_robo4/robocode.roborumble/.classpath +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.roborumble/.project b/代码/workspace_robo4/robocode.roborumble/.project deleted file mode 100644 index 9bd56e1..0000000 --- a/代码/workspace_robo4/robocode.roborumble/.project +++ /dev/null @@ -1,20 +0,0 @@ - - - robocode.roborumble - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.battle - robocode.core - robocode.host - robocode.repository - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.roborumble/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.roborumble/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.roborumble/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.roborumble/MeleeRumble.launch b/代码/workspace_robo4/robocode.roborumble/MeleeRumble.launch deleted file mode 100644 index 593e4df..0000000 --- a/代码/workspace_robo4/robocode.roborumble/MeleeRumble.launch +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.roborumble/RoboRumble.launch b/代码/workspace_robo4/robocode.roborumble/RoboRumble.launch deleted file mode 100644 index b1e6cf8..0000000 --- a/代码/workspace_robo4/robocode.roborumble/RoboRumble.launch +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.roborumble/TeamRumble.launch b/代码/workspace_robo4/robocode.roborumble/TeamRumble.launch deleted file mode 100644 index 8aa9b19..0000000 --- a/代码/workspace_robo4/robocode.roborumble/TeamRumble.launch +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.roborumble/pom.xml b/代码/workspace_robo4/robocode.roborumble/pom.xml deleted file mode 100644 index 9b66c50..0000000 --- a/代码/workspace_robo4/robocode.roborumble/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - robocode.roborumble - Roborumble Client - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.core - ${project.version} - - - net.sf.robocode - codesize - 1.1 - - - net.sf.robocode - robocode.battle - ${project.version} - runtime - - - - - - org.apache.maven.plugins - maven-jar-plugin - - roborumble - - - roborumble.RoboRumbleAtHome - - - - - - - diff --git a/代码/workspace_robo4/robocode.roborumble/robocode.roborumble.iml b/代码/workspace_robo4/robocode.roborumble/robocode.roborumble.iml deleted file mode 100644 index 986c6f3..0000000 --- a/代码/workspace_robo4/robocode.roborumble/robocode.roborumble.iml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/BattlesRunner.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/BattlesRunner.java deleted file mode 100644 index 433cff6..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/BattlesRunner.java +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.battlesengine; - - -import net.sf.robocode.io.Logger; -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; -import robocode.control.*; -import robocode.control.events.BattleAdaptor; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.BattleErrorEvent; - -import java.io.*; -import java.util.*; - - -/** - * The BattlesRunner is running battles. - * Reads a file with the battles to be runned and outputs the results in another file. - * Controlled by properties files. - * - * @author Albert Prez (original) - * @author Flemming N. Larsen (contributor) - * @author Joachim Hofer (contributor) - */ -public class BattlesRunner { - private final String inputfile; - private final int numrounds; - private final int fieldlen; - private final int fieldhei; - private final String outfile; - private final String user; - private String game; - private static RobotResults[] lastResults; - private static IRobocodeEngine engine; - - public BattlesRunner(String propertiesfile) { - // Read parameters - Properties parameters = getProperties(propertiesfile); - - inputfile = parameters.getProperty("INPUT", ""); - numrounds = Integer.parseInt(parameters.getProperty("ROUNDS", "10")); - fieldlen = Integer.parseInt(parameters.getProperty("FIELDL", "800")); - fieldhei = Integer.parseInt(parameters.getProperty("FIELDH", "600")); - outfile = parameters.getProperty("OUTPUT", ""); - user = parameters.getProperty("USER", ""); - - game = propertiesfile; - while (game.indexOf("/") != -1) { - game = game.substring(game.indexOf("/") + 1); - } - game = game.substring(0, game.indexOf(".")); - - initialize(); - } - - private void initialize() { - if (engine == null) { - engine = new RobocodeEngine(); - engine.addBattleListener(new BattleObserver()); - } - } - - public String getVersion() { - return (engine != null) ? engine.getVersion() : null; - } - - public void runBattlesImpl(boolean melee) { - // Initialize objects - BattlefieldSpecification field = new BattlefieldSpecification(fieldlen, fieldhei); - BattleSpecification battle = new BattleSpecification(numrounds, field, (new RobotSpecification[2])); - - // Read input file - ArrayList robots = new ArrayList(); - if (readRobots(robots)) { - return; - } - - // open output file - PrintStream outtxt = getRedirectedOutput(); - if (outtxt == null) { - return; - } - - // run battle - int index = 0; - - while (index < robots.size()) { - String[] param = (robots.get(index)).split(","); - - String enemies = getEnemies(melee, param); - - System.out.println("Fighting battle " + (index) + " ... " + enemies); - - final RobotSpecification[] robotsList = engine.getLocalRepository(enemies); - - if (robotsList.length > 1) { - final String team0 = robotsList[0].getTeamId(); - final String teamLast = robotsList[robotsList.length - 1].getTeamId(); - - if (team0 == null || !team0.equals(teamLast)) { - final BattleSpecification specification = new BattleSpecification(battle.getNumRounds(), - battle.getBattlefield(), robotsList); - - lastResults = null; - engine.runBattle(specification, true); - if (lastResults != null && lastResults.length > 1) { - dumpResults(outtxt, lastResults, param[param.length - 1], melee); - } - } - } else { - System.err.println("Skipping battle because can't load robots: " + enemies); - } - index++; - } - - // close - outtxt.close(); - } - - private String getEnemies(boolean melee, String[] param) { - String enemies; - - if (melee) { - StringBuilder eb = new StringBuilder(); - - for (int i = 0; i < param.length - 1; i++) { - if (i > 0) { - eb.append(','); - } - eb.append(param[i]); - } - enemies = eb.toString(); - } else { - enemies = param[0] + "," + param[1]; - } - return enemies; - } - - private PrintStream getRedirectedOutput() { - try { - return new PrintStream(new BufferedOutputStream(new FileOutputStream(outfile, true)), true); - } catch (IOException e) { - System.out.println("Not able to open output file ... Aborting"); - System.out.println(e); - return null; - } - } - - private boolean readRobots(ArrayList robots) { - BufferedReader br = null; - try { - FileReader fr = new FileReader(inputfile); - br = new BufferedReader(fr); - - String record; - while ((record = br.readLine()) != null) { - robots.add(record); - } - } catch (IOException e) { - System.out.println("Battles input file not found ... Aborting"); - System.out.println(e); - return true; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignore) {} - } - } - return false; - } - - private void dumpResults(PrintStream outtxt, RobotResults[] results, String last, boolean melee) { - final String BOT_INDEX_PATTERN = "\\[.*\\]"; - - for (int i = 0; i < results.length; i++) { - for (int j = 0; j < results.length; j++) { - if (i < j) { - RobotSpecification bot1 = results[i].getRobot(); - RobotSpecification bot2 = results[j].getRobot(); - - String name1 = bot1.getTeamId() != null - ? bot1.getTeamId().replaceAll(BOT_INDEX_PATTERN, "") - : bot1.getNameAndVersion(); - String name2 = bot2.getTeamId() != null - ? bot2.getTeamId().replaceAll(BOT_INDEX_PATTERN, "") - : bot2.getNameAndVersion(); - int points1 = results[i].getScore(); - int points2 = results[j].getScore(); - int bullets1 = results[i].getBulletDamage(); - int bullets2 = results[j].getBulletDamage(); - int survival1 = results[i].getFirsts(); - int survival2 = results[j].getFirsts(); - - outtxt.println( - game + "," + numrounds + "," + fieldlen + "x" + fieldhei + "," + user + "," - + System.currentTimeMillis() + "," + last); - outtxt.println(name1 + "," + points1 + "," + bullets1 + "," + survival1); - outtxt.println(name2 + "," + points2 + "," + bullets2 + "," + survival2); - } - } - } - if (melee) { - System.out.println( - "RESULT = " + results[0].getRobot().getNameAndVersion() + " wins, " - + results[1].getRobot().getNameAndVersion() + " is second."); - } else { - RobotSpecification winnerBot = results[0].getRobot(); - String winnerBotName = winnerBot.getTeamId() != null - ? winnerBot.getTeamId().replaceAll(BOT_INDEX_PATTERN, "") - : winnerBot.getNameAndVersion(); - - System.out.println( - "RESULT = " + winnerBotName + " wins " + results[0].getScore() + " to " + results[1].getScore()); - } - } - - class BattleObserver extends BattleAdaptor { - @Override - public void onBattleError(final BattleErrorEvent event) { - Logger.realErr.println(event.getError()); - } - - @Override - public void onBattleCompleted(final BattleCompletedEvent event) { - lastResults = RobotResults.convertResults(event.getSortedResults()); - } - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/CompetitionsSelector.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/CompetitionsSelector.java deleted file mode 100644 index 96a9e88..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/CompetitionsSelector.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.battlesengine; - - -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; -import static net.sf.robocode.roborumble.util.PropertiesUtil.storeProperties; - -import java.io.File; -import java.util.Properties; - -import net.sf.robocode.repository.CodeSizeCalculator; - - -/** - * This class is used to control which competitions a robot is allowed to - * participate in. - * Reads a file with the battles to be runned and outputs the results in - * another file. - * Controlled by properties files. - * - * @author Albert Prez (original) - * @author Flemming N. Larsen (contributor) - */ -public class CompetitionsSelector { - private final String repository; - private final String sizesfile; - private final Properties sizes; - - public CompetitionsSelector(String sizesfile, String repository) { - this.repository = repository; - // open sizes file - this.sizesfile = sizesfile; - - sizes = getProperties(sizesfile); - } - - public boolean checkCompetitorForSize(String botName, long maxSize) { - String name = botName.replace(' ', '_'); - - // Read sizes - long codeSize = Long.parseLong(sizes.getProperty(name, "0")); - - // Find out the size if not in the file - boolean fileNeedsUpdate = false; - - if (codeSize == 0) { - File f = new File(repository + name + ".jar"); - if (f.exists()) { - fileNeedsUpdate = true; // Bug-362 - - Integer jarFileCodeSize = CodeSizeCalculator.getJarFileCodeSize(f); - if (jarFileCodeSize != null) { - codeSize = jarFileCodeSize; - sizes.setProperty(name, Long.toString(codeSize)); - } - } - } - - // If the file needs update, then save the file - if (fileNeedsUpdate && codeSize > 0) { - storeProperties(sizes, sizesfile, "Bots code size"); - } - - // Check the code size - return (codeSize < maxSize); // Bug-362 - } - - public boolean checkCompetitorsForSize(String bot1, String bot2, long maxsize) { - return checkCompetitorForSize(bot1, maxsize) && checkCompetitorForSize(bot2, maxsize); - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/PrepareBattles.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/PrepareBattles.java deleted file mode 100644 index b594e67..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/battlesengine/PrepareBattles.java +++ /dev/null @@ -1,579 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.battlesengine; - - -import static net.sf.robocode.roborumble.util.ExcludesUtil.*; -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.Random; - - -/** - * PrepareBattles is used for preparing battles. - * Controlled by properties files. - * - * @author Albert Prez (original) - * @author Flemming N. Larsen (contributor) - * @author Jerome Lavigne (contributor) - */ -public class PrepareBattles { - - private final String botsrepository; - private final String participantsfile; - private final String battlesfile; - private final int numbattles; - private final CompetitionsSelector size; - private final String runonly; - private final Properties generalratings; - private final Properties miniratings; - private final Properties microratings; - private final Properties nanoratings; - private final String priority; - private final int prioritynum; - private final int meleebots; - - private final static Random RANDOM = new Random(); - - public PrepareBattles(String propertiesfile) { - // Read parameters - Properties parameters = getProperties(propertiesfile); - - botsrepository = parameters.getProperty("BOTSREP", ""); - participantsfile = parameters.getProperty("PARTICIPANTSFILE", ""); - battlesfile = parameters.getProperty("INPUT", ""); - numbattles = Integer.parseInt(parameters.getProperty("NUMBATTLES", "100")); - String sizesfile = parameters.getProperty("CODESIZEFILE", ""); - - size = new CompetitionsSelector(sizesfile, botsrepository); - runonly = parameters.getProperty("RUNONLY", "GENERAL"); - prioritynum = Integer.parseInt(parameters.getProperty("BATTLESPERBOT", "500")); - meleebots = Integer.parseInt(parameters.getProperty("MELEEBOTS", "10")); - generalratings = getProperties(parameters.getProperty("RATINGS.GENERAL", "")); - miniratings = getProperties(parameters.getProperty("RATINGS.MINIBOTS", "")); - microratings = getProperties(parameters.getProperty("RATINGS.MICROBOTS", "")); - nanoratings = getProperties(parameters.getProperty("RATINGS.NANOBOTS", "")); - priority = parameters.getProperty("PRIORITYBATTLESFILE", ""); - - // Read and prepare exclude filters - setExcludes(parameters); - } - - public boolean createBattlesList() { - List names = new ArrayList(); - - // Read participants - - BufferedReader br = null; - - try { - FileReader fr = new FileReader(participantsfile); - - br = new BufferedReader(fr); - String participant; - - while ((participant = br.readLine()) != null) { - if (participant.indexOf(",") != -1) { - String name = participant.substring(0, participant.indexOf(",")); - - if (isExcluded(name)) { - continue; // ignore excluded participant - } - String jar = name.replace(' ', '_') + ".jar"; - boolean exists = (new File(botsrepository + jar)).exists(); - - if (exists) { - if ((runonly.equals("MINI") && size.checkCompetitorForSize(name, 1500)) - || (runonly.equals("MICRO") && size.checkCompetitorForSize(name, 750)) - || (runonly.equals("NANO") && size.checkCompetitorForSize(name, 250)) - || (!runonly.equals("MINI") && !runonly.equals("MICRO") && !runonly.equals("NANO"))) { - names.add(name); - } - } - } - } - } catch (IOException e) { - System.out.println("Participants file not found ... Aborting"); - System.out.println(e); - return false; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - // Open battles file - PrintStream outtxt; - - try { - outtxt = new PrintStream(new BufferedOutputStream(new FileOutputStream(battlesfile)), false); - } catch (IOException e) { - System.out.println("Not able to open battles file " + battlesfile + " ... Aborting"); - System.out.println(e); - return false; - } - // Create the participants file - Random random = new Random(); - int count = 0; - - while (count < numbattles && names.size() > 1) { - int bot1 = random.nextInt(names.size()); - int bot2 = random.nextInt(names.size()); - - if (bot1 != bot2) { - outtxt.println(names.get(bot1) + "," + names.get(bot2) + "," + runonly); - count++; - } - } - outtxt.close(); - return true; - } - - public boolean createSmartBattlesList() { - List namesAll = new ArrayList(); - List namesMini = new ArrayList(); - List namesMicro = new ArrayList(); - List namesNano = new ArrayList(); - List namesNoRanking = new ArrayList(); - List priorityAll = new ArrayList(); - List priorityMini = new ArrayList(); - List priorityMicro = new ArrayList(); - List priorityNano = new ArrayList(); - - List priorityBattles = new ArrayList(); - - // Read participants - - BufferedReader br = null; - - try { - FileReader fr = new FileReader(participantsfile); - - br = new BufferedReader(fr); - String participant; - - while ((participant = br.readLine()) != null) { - if (participant.indexOf(",") != -1) { - String name = participant.substring(0, participant.indexOf(",")); - - if (isExcluded(name)) { - continue; // ignore excluded participant - } - String jar = name.replace(' ', '_') + ".jar"; - boolean exists = (new File(botsrepository + jar)).exists(); - - if (exists) { - namesAll.add(name); - if (size.checkCompetitorForSize(name, 1500)) { - namesMini.add(name); - } - if (size.checkCompetitorForSize(name, 750)) { - namesMicro.add(name); - } - if (size.checkCompetitorForSize(name, 250)) { - namesNano.add(name); - } - if (robotHasPriority(name, generalratings)) { - priorityAll.add(name); - } - if (size.checkCompetitorForSize(name, 1500) && robotHasPriority(name, miniratings)) { - priorityMini.add(name); - } - if (size.checkCompetitorForSize(name, 750) && robotHasPriority(name, microratings)) { - priorityMicro.add(name); - } - if (size.checkCompetitorForSize(name, 250) && robotHasPriority(name, nanoratings)) { - priorityNano.add(name); - } - if (!isRobotInRatings(name)) { - namesNoRanking.add(name); - } - } - } - } - } catch (IOException e) { - System.out.println("Participants file not found ... Aborting"); - System.out.println(e); - return false; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - - // Read priority battles - - br = null; - - try { - FileReader fr = new FileReader(priority); - - br = new BufferedReader(fr); - String record; - - while ((record = br.readLine()) != null) { - String[] items = record.split(","); - - if (items.length == 3) { - // Check that competitors exist - String jar1 = items[0].replace(' ', '_') + ".jar"; - boolean exists1 = (new File(botsrepository + jar1)).exists() && namesAll.contains(items[0]); - String jar2 = items[1].replace(' ', '_') + ".jar"; - boolean exists2 = (new File(botsrepository + jar2)).exists() && namesAll.contains(items[1]); - - // Add battles to priority battles list - if (exists1 && exists2 && !priorityBattles.contains(record)) { - priorityBattles.add(record); - } else { - System.out.println("Ignoring: " + record); - } - } - } - } catch (IOException e) { - System.out.println("Priority battles file not found ... "); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignore) {} - } - } - - // Delete priority battles (avoid duplication) - File r = new File(priority); - - if (r.exists() && !r.delete()) { - System.out.println("Cannot delete: " + priority); - } - - // Open battles file - PrintStream outtxt; - - try { - outtxt = new PrintStream(new BufferedOutputStream(new FileOutputStream(battlesfile)), false); - } catch (IOException e) { - System.out.println("Not able to open battles file " + battlesfile + " ... Aborting"); - System.out.println(e); - return false; - } - - // Create the participants file - int count = 0; - - // Add priority battles - while (count < numbattles && count < priorityBattles.size()) { - String battle = priorityBattles.get(count); - outtxt.println(battle); - count++; - } - // Add bots with less than 500 battles, or a random battle if all bots have enough battles - if (namesAll.size() > 1) { - while (count < numbattles) { - String[] bots; - if (namesNoRanking.size() > 0) { - // Bug [3547611] - New bots not given priority - List listWithSingleItem = new ArrayList(); - String bot = namesNoRanking.get(0); - listWithSingleItem.add(bot); - bots = getRandomBots(listWithSingleItem, namesAll); - namesNoRanking.remove(0); - } else if (priorityAll.size() > 0) { - bots = getRandomBots(priorityAll, namesAll); - } else if (priorityMini.size() > 0 && namesMini.size() > 1) { - bots = getRandomBots(priorityMini, namesMini); - } else if (priorityMicro.size() > 0 && namesMicro.size() > 1) { - bots = getRandomBots(priorityMicro, namesMicro); - } else if (priorityNano.size() > 0 && namesNano.size() > 1) { - bots = getRandomBots(priorityNano, namesNano); - } else { - bots = getRandomBots(namesAll, namesAll); - } - if (bots != null) { - outtxt.println(bots[0] + "," + bots[1] + "," + runonly); - count++; - } - } - } - outtxt.close(); - return true; - } - - private String[] getRandomBots(List list1, List list2) { - int bot1 = RANDOM.nextInt(list1.size()); - int bot2 = RANDOM.nextInt(list2.size()); - - while ((list1.get(bot1)).equals(list2.get(bot2))) { - bot1 = RANDOM.nextInt(list1.size()); - bot2 = RANDOM.nextInt(list2.size()); - } - String[] bots = new String[2]; - - bots[0] = list1.get(bot1); - bots[1] = list2.get(bot2); - return bots; - } - - private boolean robotHasPriority(String name, Properties ratings) { - if (name == null || ratings == null) { - return false; - } - String bot = name.replaceAll(" ", "_"); - String values = ratings.getProperty(bot); - - if (values == null) { - return false; // must be false (Bug 3474173) - } - String[] value = values.split(","); - double battles = Double.parseDouble(value[1]); - - return (battles < prioritynum); - } - - private boolean isRobotInRatings(String name) { - if (name == null || name.trim().length() == 0) { - return false; - } - String bot = name.replaceAll(" ", "_"); - - Properties[] ratingLists = new Properties[] { generalratings, miniratings, microratings, nanoratings }; - - for (Properties ratings : ratingLists) { - if (ratings.getProperty(bot) != null) { - return true; - } - } - return false; - } - - public boolean createMeleeBattlesList() { - List namesAll = new ArrayList(); - List namesMini = new ArrayList(); - List namesMicro = new ArrayList(); - List namesNano = new ArrayList(); - List namesNoRanking = new ArrayList(); - List priorityAll = new ArrayList(); - List priorityMini = new ArrayList(); - List priorityMicro = new ArrayList(); - List priorityNano = new ArrayList(); - - List priorityPairs = new ArrayList(); - - // Read participants - - BufferedReader br = null; - - try { - FileReader fr = new FileReader(participantsfile); - - br = new BufferedReader(fr); - String participant; - - while ((participant = br.readLine()) != null) { - if (participant.indexOf(",") != -1) { - String name = participant.substring(0, participant.indexOf(",")); - - if (isExcluded(name)) { - continue; // ignore excluded participant - } - String jar = name.replace(' ', '_') + ".jar"; - boolean exists = (new File(botsrepository + jar)).exists(); - - if (exists) { - namesAll.add(name); - if (size.checkCompetitorForSize(name, 1500)) { - namesMini.add(name); - } - if (size.checkCompetitorForSize(name, 750)) { - namesMicro.add(name); - } - if (size.checkCompetitorForSize(name, 250)) { - namesNano.add(name); - } - if (robotHasPriority(name, generalratings)) { - priorityAll.add(name); - } - if (size.checkCompetitorForSize(name, 1500) && robotHasPriority(name, miniratings)) { - priorityMini.add(name); - } - if (size.checkCompetitorForSize(name, 750) && robotHasPriority(name, microratings)) { - priorityMicro.add(name); - } - if (size.checkCompetitorForSize(name, 250) && robotHasPriority(name, nanoratings)) { - priorityNano.add(name); - } - if (!isRobotInRatings(name)) { - namesNoRanking.add(name); - } - } - } - } - } catch (IOException e) { - System.out.println("Participants file not found ... Aborting"); - System.out.println(e); - return false; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - - // Read priority battles - - br = null; - - try { - FileReader fr = new FileReader(priority); - - br = new BufferedReader(fr); - String record; - - while ((record = br.readLine()) != null) { - String[] items = record.split(","); - - if (items.length == 3) { - // Check that competitors exist - String jar1 = items[0].replace(' ', '_') + ".jar"; - boolean exists1 = (new File(botsrepository + jar1)).exists() && namesAll.contains(items[0]); - String jar2 = items[1].replace(' ', '_') + ".jar"; - boolean exists2 = (new File(botsrepository + jar2)).exists() && namesAll.contains(items[1]); - - // Add battles to priority battles vector - if (exists1 && exists2 && !priorityPairs.contains(items)) { - priorityPairs.add(items); - } else { - System.out.println("Ignoring: " + record); - } - } - } - } catch (IOException e) { - System.out.println("Priority battles file not found ... "); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignore) {} - } - } - - // Delete priority battles (avoid duplication) - File r = new File(priority); - - if (r.exists() && !r.delete()) { - System.out.println("Cannot delete: " + priority); - } - - // Open battles file - PrintStream outtxt; - - try { - outtxt = new PrintStream(new BufferedOutputStream(new FileOutputStream(battlesfile)), false); - } catch (IOException e) { - System.out.println("Not able to open battles file " + battlesfile + " ... Aborting"); - System.out.println(e); - return false; - } - - // Create the participants file - int count = 0; - - // Add bots with less than 500 battles, or a random battle if all bots have enough battles - if (namesAll.size() > meleebots) { - while (count < numbattles) { - String[] bots = null; - if (namesNoRanking.size() > 0) { - // Bug [3547611] - New bots not given priority - List listWithSingleItem = new ArrayList(); - String bot = namesNoRanking.get(0); - listWithSingleItem.add(bot); - bots = getRandomMeleeBots(listWithSingleItem, namesAll); - namesNoRanking.remove(0); - } else if (count < priorityPairs.size()) { - String[] prioritybots = priorityPairs.get(count); - bots = getRandomMeleeBots(prioritybots[0], prioritybots[1], namesAll); - } else if (priorityAll.size() > 0 && namesAll.size() >= meleebots) { - bots = getRandomMeleeBots(priorityAll, namesAll); - } else if (priorityMini.size() > 0 && namesMini.size() >= meleebots) { - bots = getRandomMeleeBots(priorityMini, namesMini); - } else if (priorityMicro.size() > 0 && namesMicro.size() >= meleebots) { - bots = getRandomMeleeBots(priorityMicro, namesMicro); - } else if (priorityNano.size() > 0 && namesNano.size() >= meleebots) { - bots = getRandomMeleeBots(priorityNano, namesNano); - } else if (namesAll.size() >= meleebots) { - bots = getRandomMeleeBots(namesAll, namesAll); - } - if (bots != null) { - StringBuilder battle = new StringBuilder(bots[0]); - - for (int i = 1; i < bots.length; i++) { - battle.append(',').append(bots[i]); - } - battle.append(',').append(runonly); - - outtxt.println(battle); - count++; - } - } - } - outtxt.close(); - return true; - } - - private String[] getRandomMeleeBots(List list1, List list2) { - String[] bots = new String[meleebots]; - - bots[0] = list1.get(RANDOM.nextInt(list1.size())); - int count = 1; - - while (count < meleebots) { - bots[count] = list2.get(RANDOM.nextInt(list2.size())); - boolean exists = false; - - for (int i = 0; i < count; i++) { - if (bots[i].equals(bots[count])) { - exists = true; - } - } - if (!exists) { - count++; - } - } - return bots; - } - - private String[] getRandomMeleeBots(String bot1, String bot2, List list2) { - String[] bots = new String[meleebots]; - - bots[0] = bot1; - bots[1] = bot2; - int count = 2; - - while (count < meleebots) { - bots[count] = list2.get(RANDOM.nextInt(list2.size())); - boolean exists = false; - - for (int i = 0; i < count; i++) { - if (bots[i].equals(bots[count])) { - exists = true; - } - } - if (!exists) { - count++; - } - } - return bots; - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/BotsDownload.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/BotsDownload.java deleted file mode 100644 index b8c2d87..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/BotsDownload.java +++ /dev/null @@ -1,625 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.netengine; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.roborumble.battlesengine.CompetitionsSelector; -import static net.sf.robocode.roborumble.netengine.FileTransfer.DownloadStatus; -import static net.sf.robocode.roborumble.util.ExcludesUtil.*; -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Properties; -import java.util.Set; -import java.util.Vector; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; - - -/** - * Class used for downloading participating robots from the Internet. - * Manages the download operations (participants and JAR files). - * Controlled by properties files. - * - * @author Albert Prez (original) - * @author Flemming N. Larsen (contributor) - */ -public class BotsDownload { - - // private String internetrepository; - private final String botsrepository; - private final String participantsfile; - private final String participantsurl; - private final String tempdir; - private final String tag; - private final String isteams; - private final String sizesfile; - private final CompetitionsSelector size; - private final String ratingsurl; - private String generalBots; - private final String miniBots; - private final String microBots; - private final String nanoBots; - private final String generalbotsfile; - private final String minibotsfile; - private final String microbotsfile; - private final String nanobotsfile; - private final String removeboturl; - - public BotsDownload(String propertiesfile) { - // Read parameters - Properties parameters = getProperties(propertiesfile); - - botsrepository = parameters.getProperty("BOTSREP", ""); - isteams = parameters.getProperty("TEAMS", "NOT"); - participantsurl = parameters.getProperty("PARTICIPANTSURL", ""); - participantsfile = parameters.getProperty("PARTICIPANTSFILE", ""); - tag = parameters.getProperty("STARTAG", "pre"); - tempdir = parameters.getProperty("TEMP", ""); - - // Code size - sizesfile = parameters.getProperty("CODESIZEFILE", ""); - size = new CompetitionsSelector(sizesfile, botsrepository); - - // Ratings files - ratingsurl = parameters.getProperty("RATINGS.URL", ""); - generalBots = propertiesfile; - while (generalBots.indexOf("/") != -1) { - generalBots = generalBots.substring(generalBots.indexOf("/") + 1); - } - generalBots = generalBots.substring(0, generalBots.indexOf(".")); - miniBots = parameters.getProperty("MINIBOTS", ""); - microBots = parameters.getProperty("MICROBOTS", ""); - nanoBots = parameters.getProperty("NANOBOTS", ""); - generalbotsfile = parameters.getProperty("RATINGS.GENERAL", ""); - minibotsfile = parameters.getProperty("RATINGS.MINIBOTS", ""); - microbotsfile = parameters.getProperty("RATINGS.MICROBOTS", ""); - nanobotsfile = parameters.getProperty("RATINGS.NANOBOTS", ""); - // remove old bots - removeboturl = parameters.getProperty("UPDATEBOTSURL", ""); - - // Read and prepare exclude filters - setExcludes(parameters); - } - - public boolean downloadRatings() { - File file; - - // delete previous files - if (generalbotsfile.length() != 0) { - file = new File(generalbotsfile); - if (file.exists() && !file.delete()) { - Logger.logError("Can't delete file: " + file); - } - } - if (minibotsfile.length() != 0) { - file = new File(minibotsfile); - if (file.exists() && !file.delete()) { - Logger.logError("Can't delete file: " + file); - } - } - if (microbotsfile.length() != 0) { - file = new File(microbotsfile); - if (file.exists() && !file.delete()) { - Logger.logError("Can't delete file: " + file); - } - } - if (nanobotsfile.length() != 0) { - file = new File(nanobotsfile); - if (file.exists() && !file.delete()) { - Logger.logError("Can't delete file: " + file); - } - } - // download new ones - if (ratingsurl.length() == 0) { - return false; - } - boolean downloaded = true; - - if (generalBots.length() != 0 && generalbotsfile.length() != 0) { - downloaded = downloadRatingsFile(generalBots, generalbotsfile) & downloaded; - } - if (miniBots.length() != 0 && minibotsfile.length() != 0) { - downloaded = downloadRatingsFile(miniBots, minibotsfile) & downloaded; - } - if (microBots.length() != 0 && microbotsfile.length() != 0) { - downloaded = downloadRatingsFile(microBots, microbotsfile) & downloaded; - } - if (nanoBots.length() != 0 && nanobotsfile.length() != 0) { - downloaded = downloadRatingsFile(nanoBots, nanobotsfile) & downloaded; - } - return downloaded; - } - - public boolean downloadParticipantsList() { - String begin = "<" + tag + ">"; - String end = ""; - Vector bots = new Vector(); - - InputStream in = null; - InputStreamReader inputStreamReader = null; - BufferedReader bufferedReader = null; - HttpURLConnection conn = null; - - try { - URL url = new URL(participantsurl); - - conn = FileTransfer.connectToHttpInputConnection(url); - - // Check that we received a HTTP_OK response code. - // Bugfix [2779557] - Client tries to remove all participants. - if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { - System.out.print("Unable to retrieve participants list. Response is " + conn.getResponseCode()); - if (conn.getResponseMessage() != null) { - System.out.print(": " + conn.getResponseMessage()); - } - System.out.println(); - - return false; // Error - } - - boolean arebots = false; - - in = FileTransfer.getInputStream(conn); - inputStreamReader = new InputStreamReader(in); - bufferedReader = new BufferedReader(inputStreamReader); - - for (String participant; (participant = bufferedReader.readLine()) != null;) { - if (participant.indexOf(begin) >= 0) { - arebots = true; - } else if (participant.indexOf(end) >= 0) { - arebots = false; - } else if (arebots) { - String bot = participant.split("[,]")[0]; - - if (!isExcluded(bot)) { - if (!verifyParticipantFormat(participant)) { - if (participant.trim().length() > 0) { - System.out.println("Participant ignored due to invalid line: " + bot); - } - } else { - bots.add(participant); - } - } else { - System.out.println("Ignored excluded: " + bot); - } - } - } - - // Prevent our local participants file to be overwritten, if the downloaded list is empty. - // Bugfix [2779557] - Client tries to remove all participants. - if (bots.size() == 0) { - System.out.println("The participants list is empty"); - return false; // Error - } - - final File dir = new File(participantsfile).getParentFile(); - - if (!dir.exists() && !dir.mkdirs()) { - Logger.logError("Can't create directory: " + dir); - } - - PrintStream outtxt = new PrintStream(new BufferedOutputStream(new FileOutputStream(participantsfile)), false); - - for (String bot : bots) { - outtxt.println(bot); - } - outtxt.close(); - - } catch (IOException e) { - System.out.println("Unable to retrieve participants list:"); - System.out.println(e); - return false; // Error - } finally { - if (bufferedReader != null) { - try { - bufferedReader.close(); - } catch (IOException ignored) {} - } - if (conn != null) { - conn.disconnect(); - } - } - return true; // Success - } - - public void downloadMissingBots() { - Vector jars = new Vector(); - Vector ids = new Vector(); - Vector names = new Vector(); - - // Read participants - - BufferedReader br = null; - - try { - FileReader fr = new FileReader(participantsfile); - br = new BufferedReader(fr); - - for (String record; (record = br.readLine()) != null;) { - if (record.indexOf(",") >= 0) { - String id = record.substring(record.indexOf(",") + 1).trim(); - String name = record.substring(0, record.indexOf(",")).trim(); - String jar = name.replace(' ', '_') + ".jar"; - - jars.add(jar); - ids.add(id); - names.add(name); - } - } - } catch (IOException e) { - System.out.println("Participants file not found ... Aborting"); - System.out.println(e); - return; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - - // check if the file exists in the repository and download if not present - for (int i = 0; i < jars.size(); i++) { - String botjar = jars.get(i); - String botid = ids.get(i); - String botname = names.get(i); - String botpath = botsrepository + botjar; - boolean exists = (new File(botpath)).exists(); - - if (!exists) { - boolean downloaded = downloadBot(botname, botjar, botid, botsrepository, tempdir); - if (!downloaded) { - System.out.println("Could not download " + botjar); - } - } - } - } - - public void updateCodeSize() { - if (sizesfile.length() != 0) { - BufferedReader br = null; - try { - FileReader fr = new FileReader(participantsfile); - br = new BufferedReader(fr); - - for (String record; (record = br.readLine()) != null;) { - String name = record.substring(0, record.indexOf(",")); - size.checkCompetitorForSize(name, 1500); - } - } catch (IOException e) { - System.out.println("Battles input file not found ... Aborting"); - System.out.println(e); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - } - } - - private boolean downloadBot(String botname, String file, String id, String destination, String tempdir) { - String tempFileName = tempdir + file; - String repositoryFileName = destination + file; - - // check if the bot exists in the repository - - boolean exists = (new File(repositoryFileName)).exists(); - if (exists) { - System.out.println("The bot already exists in the repository."); - return false; - } - - // Download the bot - - String url; - String sessionId = null; - - if (id.indexOf("://") == -1) { - url = "http://robocoderepository.com/Controller.jsp?submitAction=downloadClass&id=" + id; - - sessionId = FileTransfer.getSessionId( - "http://robocoderepository.com/BotSearch.jsp?botName=''&authorName=''&uploadDate="); - } else { - url = id; - } - - DownloadStatus downloadStatus = FileTransfer.download(url, tempFileName, sessionId); - - if (downloadStatus == DownloadStatus.FILE_NOT_FOUND) { - System.out.println("Could not find " + botname + " from " + url); - return false; - } else if (downloadStatus == DownloadStatus.COULD_NOT_CONNECT) { - System.out.println("Could not connect to " + url); - return false; - } - - // Check the bot and save it into the repository - - if (checkJarFile(tempFileName, botname)) { - if (!FileTransfer.copy(tempFileName, repositoryFileName)) { - System.out.println("Unable to copy " + tempFileName + " into the repository"); - return false; - } - } else { - System.out.println("Downloaded file is wrong or corrupted: " + file); - return false; - } - - System.out.println("Downloaded " + botname + " into " + repositoryFileName); - return true; - } - - private boolean checkJarFile(String file, String botname) { - if (botname.indexOf(" ") == -1) { - System.out.println("Are you sure " + botname + " is a bot/team? Can't download it."); - return false; - } - - String bot = botname.substring(0, botname.indexOf(" ")); - - bot = bot.replace('.', '/'); - if (isteams.equals("YES")) { - bot += ".team"; - } else { - bot += ".properties"; - } - - try { - JarFile jarf = new JarFile(file); - ZipEntry zipe = jarf.getJarEntry(bot); - - if (zipe == null) { - System.out.println("Not able to read properties"); - return false; - } - InputStream properties = jarf.getInputStream(zipe); - - Properties parameters = getProperties(properties); - - if (!isteams.equals("YES")) { - String classname = parameters.getProperty("robot.classname", ""); - String version = parameters.getProperty("robot.version", ""); - - return (botname.equals(classname + " " + version)); - } - String version = parameters.getProperty("team.version", ""); - - return (botname.equals(botname.substring(0, botname.indexOf(" ")) + " " + version)); - } catch (Exception e) { - System.out.println(e); - return false; - } - } - - // ---------------------------------------------------------------------------------- - // download ratings file - // ---------------------------------------------------------------------------------- - private boolean downloadRatingsFile(String competition, String file) { - - InputStream in = null; - InputStreamReader inputStreamReader = null; - BufferedReader bufferedReader = null; - PrintStream outtxt = null; - - try { - URL url = new URL(ratingsurl + "?version=1&game=" + competition); - - HttpURLConnection conn = FileTransfer.connectToHttpInputConnection(url); - - final File dir = new File(file).getParentFile(); - - if (!dir.exists() && !dir.mkdirs()) { - Logger.logError("Can't create directory: " + dir); - } - - outtxt = new PrintStream(new BufferedOutputStream(new FileOutputStream(file)), false); - - in = FileTransfer.getInputStream(conn); - inputStreamReader = new InputStreamReader(in); - bufferedReader = new BufferedReader(inputStreamReader); - - for (String str; (str = bufferedReader.readLine()) != null;) { - outtxt.println(str); - } - conn.disconnect(); - - } catch (IOException e) { - System.out.println("Unable to ratings for " + competition); - System.out.println(e); - return false; - } finally { - if (bufferedReader != null) { - try { - bufferedReader.close(); - } catch (IOException ignored) {} - } - if (outtxt != null) { - outtxt.close(); - } - } - return true; - } - - // ---------------------------------------------------------------------------------- - // download ratings file - // ---------------------------------------------------------------------------------- - - public void notifyServerForOldParticipants() { - // Load participants names - Set namesAll = new HashSet(); - Set namesMini = new HashSet(); - Set namesMicro = new HashSet(); - Set namesNano = new HashSet(); - - BufferedReader br = null; - try { - FileReader fr = new FileReader(participantsfile); - br = new BufferedReader(fr); - - for (String record; (record = br.readLine()) != null;) { - if (record.indexOf(",") != -1) { - String name = record.substring(0, record.indexOf(",")).replace(' ', '_'); - - namesAll.add(name); - if (size.checkCompetitorForSize(name, 1500)) { - namesMini.add(name); - } - if (size.checkCompetitorForSize(name, 750)) { - namesMicro.add(name); - } - if (size.checkCompetitorForSize(name, 250)) { - namesNano.add(name); - } - } - } - } catch (IOException e) { - System.out.println("Participants file not found when removing old participants ... Aborting"); - System.out.println(e); - return; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - - // Load ratings files - Properties generalRatings = getProperties(generalbotsfile); - Properties miniRatings = getProperties(minibotsfile); - Properties microRatings = getProperties(microbotsfile); - Properties nanoRatings = getProperties(nanobotsfile); - - // Check general ratings - for (Enumeration e = generalRatings.propertyNames(); e.hasMoreElements();) { - String bot = (String) e.nextElement(); - - if (!(isExcluded(bot) || namesAll.contains(bot))) { - // Remove the bot from the ratings file - System.out.println("Removing entry ... " + bot + " from " + generalBots); - removeBot(generalBots, bot); - } - } - // Check mini ratings - for (Enumeration e = miniRatings.propertyNames(); e.hasMoreElements();) { - String bot = (String) e.nextElement(); - - if (!(isExcluded(bot) || namesMini.contains(bot))) { - // Remove the bot from the ratings file - System.out.println("Removing entry ... " + bot + " from " + miniBots); - removeBot(miniBots, bot); - } - } - - // Check micro ratings - for (Enumeration e = microRatings.propertyNames(); e.hasMoreElements();) { - String bot = (String) e.nextElement(); - - if (!(isExcluded(bot) || namesMicro.contains(bot))) { - // Remove the bot from the ratings file - System.out.println("Removing entry ... " + bot + " from " + microBots); - removeBot(microBots, bot); - } - } - - // Check nano ratings - for (Enumeration e = nanoRatings.propertyNames(); e.hasMoreElements();) { - String bot = (String) e.nextElement(); - - if (!(isExcluded(bot) || namesNano.contains(bot))) { - // Remove the bot from the ratings file - System.out.println("Removing entry ... " + bot + " from " + nanoBots); - removeBot(nanoBots, bot); - } - } - } - - private void removeBot(String game, String bot) { - if (removeboturl.length() == 0) { - System.out.println("UPDATEBOTS URL not defined!"); - return; - } - - String data = "version=1&game=" + game + "&name=" + bot.trim() + "&dummy=NA"; - - OutputStream out = null; - OutputStreamWriter outputStreamWriter = null; - PrintWriter wr = null; - InputStream in = null; - InputStreamReader inputStreamReader = null; - BufferedReader bufferedReader = null; - - try { - // Send data - URLConnection conn = FileTransfer.openOutputURLConnection(new URL(removeboturl)); - - out = FileTransfer.getOutputStream(conn); - outputStreamWriter = new OutputStreamWriter(out); - wr = new PrintWriter(outputStreamWriter); - - wr.println(data); - wr.flush(); - - // Get the response - in = FileTransfer.getInputStream(conn); - inputStreamReader = new InputStreamReader(in); - bufferedReader = new BufferedReader(inputStreamReader); - - for (String line; (line = bufferedReader.readLine()) != null;) { - System.out.println(line); - } - } catch (IOException e) { - System.out.println(e); - } finally { - if (wr != null) { - wr.close(); - } - if (bufferedReader != null) { - try { - bufferedReader.close(); - } catch (IOException ignored) {} - } - } - } - - // Checks if a participant format from the participant list is valid - private boolean verifyParticipantFormat(String participant) { - String[] split = participant.split("[,]"); - - boolean matches = false; - - if (split.length == 2) { - String robot = split[0].trim(); - String link = split[1].trim(); - - if (robot.matches("[\\w\\.]+[ ][\\w\\.-]+")) { - if (link.startsWith("http")) { - try { - new URL(link); - matches = true; - } catch (MalformedURLException e) { - matches = false; - } - } else if (link.matches("[\\d]+")) { - matches = true; - } - } - } - return matches; - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/FileTransfer.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/FileTransfer.java deleted file mode 100644 index 09004c4..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/FileTransfer.java +++ /dev/null @@ -1,657 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.netengine; - - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLConnection; -import java.util.Properties; -import java.util.zip.GZIPInputStream; -import java.util.zip.InflaterInputStream; - -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; - - -/** - * Utility class for downloading files from the net and copying files. - * - * @author Flemming N. Larsen (original) - */ -public class FileTransfer { - - private final static int DEFAULT_CONNECTION_TIMEOUT = 10000; // 10 seconds - private final static int DEFAULT_READ_TIMEOUT = 10000; // 10 seconds - private final static int DEFAULT_SESSION_TIMEOUT = 10000; // 10 seconds - - private static int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT; - private static int readTimeout = DEFAULT_READ_TIMEOUT; - private static int sessionTimeout = DEFAULT_SESSION_TIMEOUT; - - static { - readProperties(); - } - - /** - * Represents the download status returned when downloading files. - */ - public enum DownloadStatus { - OK, // The download was succesful - COULD_NOT_CONNECT, // Connection problem - FILE_NOT_FOUND, // The file to download was not found - } - - - /** - * Daemon worker thread containing a 'finish' flag for waiting and notifying when the thread has finished it's job. - */ - private static class WorkerThread extends Thread { - - final Object monitor = new Object(); - - volatile boolean isFinished; - - public WorkerThread(String name) { - super(name); - setDaemon(true); - } - - void notifyFinish() { - // Notify that this thread is finish - synchronized (monitor) { - isFinished = true; - monitor.notifyAll(); - } - } - } - - /* - * Returns a session id for keeping a session on a HTTP site. - * - * @param url is the url of the HTTP site. - * - * @return a session id for keeping a session on a HTTP site or null if no session is available. - */ - public static String getSessionId(String url) { - HttpURLConnection conn = null; - - try { - // Open connection - conn = FileTransfer.connectToHttpInputConnection(new URL(url)); - if (conn == null) { - throw new IOException("Could not open connection to '" + url + "'"); - } - - // Get a session id if available - final GetSessionIdThread sessionIdThread = new GetSessionIdThread(conn); - - sessionIdThread.start(); - - // Wait for the session id - synchronized (sessionIdThread.monitor) { - while (!sessionIdThread.isFinished) { - try { - sessionIdThread.monitor.wait(sessionTimeout); - sessionIdThread.interrupt(); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - return null; - } - } - } - - // Return the session id - return sessionIdThread.sessionId; - - } catch (final IOException e) { - return null; - } finally { - // Make sure the connection is disconnected. - // This will cause threads using the connection to throw an exception - // and thereby terminate if they were hanging. - if (conn != null) { - conn.disconnect(); - } - } - } - - /** - * Worker thread used for getting the session id of an already open HTTP connection. - */ - private final static class GetSessionIdThread extends WorkerThread { - - // The resulting session id to read out - String sessionId; - - final HttpURLConnection conn; - - GetSessionIdThread(HttpURLConnection conn) { - super("FileTransfer: Get session ID"); - this.conn = conn; - } - - @Override - public void run() { - try { - // Get the cookie value - final String cookieVal = conn.getHeaderField("Set-Cookie"); - - // Extract the session id from the cookie value - if (cookieVal != null) { - sessionId = cookieVal.substring(0, cookieVal.indexOf(";")); - } - } catch (final Exception e) { - sessionId = null; - } - // Notify that this thread is finish - notifyFinish(); - } - } - - /** - * Downloads a file from a HTTP site. - * - * @param url is the url of the HTTP site to download the file from. - * @param filename is the filename of the destination file. - * @param sessionId is an optional session id if the download is session based. - * @return the download status, which is DownloadStatus.OK if the download completed successfully; otherwise an - * error occurred. - */ - public static DownloadStatus download(String url, String filename, String sessionId) { - HttpURLConnection conn = null; - - try { - // Create connection - conn = connectToHttpInputConnection(new URL(url), sessionId); - if (conn == null) { - throw new IOException("Could not open connection to: " + url); - } - - // Begin the download - final DownloadThread downloadThread = new DownloadThread(conn, filename); - - downloadThread.start(); - - // Wait for the download to complete - synchronized (downloadThread.monitor) { - while (!downloadThread.isFinished) { - try { - downloadThread.monitor.wait(); - } catch (InterruptedException e) { - return DownloadStatus.COULD_NOT_CONNECT; - } - } - } - - // Return the download status - return downloadThread.status; - - } catch (final IOException e) { - return DownloadStatus.COULD_NOT_CONNECT; - } finally { - // Make sure the connection is disconnected. - // This will cause threads using the connection to throw an exception - // and thereby terminate if they were hanging. - try { - if (conn != null) { - conn.disconnect(); - } - } catch (RuntimeException ignore) {// we expect this, right ? - } - } - } - - /** - * Worker thread used for downloading a file from an already open HTTP connection. - */ - private final static class DownloadThread extends WorkerThread { - - // The download status to be read out - DownloadStatus status = DownloadStatus.COULD_NOT_CONNECT; // Default error - - final HttpURLConnection conn; - final String filename; - - InputStream in; - OutputStream out; - - DownloadThread(HttpURLConnection conn, String filename) { - super("FileTransfer: Download"); - this.conn = conn; - this.filename = filename; - } - - @Override - public void run() { - try { - // Start getting the response code - final GetResponseCodeThread responseThread = new GetResponseCodeThread(conn); - - responseThread.start(); - - // Wait for the response to finish - synchronized (responseThread.monitor) { - while (!responseThread.isFinished) { - try { - responseThread.monitor.wait(sessionTimeout); - responseThread.interrupt(); - } catch (InterruptedException e) { - notifyFinish(); - return; - } - } - } - - final int responseCode = responseThread.responseCode; - - if (responseCode == -1) { - // Terminate if we did not get the response code - notifyFinish(); - return; - - } else if (responseCode == HttpURLConnection.HTTP_NOT_FOUND) { - // Terminate if the HTTP page containing the file was not found - status = DownloadStatus.FILE_NOT_FOUND; - notifyFinish(); - return; - - } else if (responseCode != HttpURLConnection.HTTP_OK) { - // Generally, terminate if did not receive a OK response - notifyFinish(); - return; - } - - // Start getting the size of the file to download - final GetContentLengthThread contentLengthThread = new GetContentLengthThread(conn); - - contentLengthThread.start(); - - // Wait for the file size - synchronized (contentLengthThread.monitor) { - while (!contentLengthThread.isFinished) { - try { - contentLengthThread.monitor.wait(sessionTimeout); - contentLengthThread.interrupt(); - } catch (InterruptedException e) { - notifyFinish(); - return; - } - } - } - - final int size = contentLengthThread.contentLength; - - if (size == -1) { - // Terminate if we did not get the content length - notifyFinish(); - return; - } - - // Get the input stream from the connection - in = getInputStream(conn); - - // Prepare the output stream for the file output - out = new FileOutputStream(filename); - - // Download the file - - final byte[] buf = new byte[4096]; - - int totalRead = 0; - int bytesRead; - - // Start thread for reading bytes into the buffer - - while (totalRead < size) { - // Start reading bytes into the buffer - final ReadInputStreamToBufferThread readThread = new ReadInputStreamToBufferThread(in, buf); - - readThread.start(); - - // Wait for the reading to finish - synchronized (readThread.monitor) { - while (!readThread.isFinished) { - try { - readThread.monitor.wait(sessionTimeout); - readThread.interrupt(); - } catch (InterruptedException e) { - notifyFinish(); - return; - } - } - } - - bytesRead = readThread.bytesRead; - if (bytesRead == -1) { - // Read completed has completed - notifyFinish(); - break; - } - - // Write the byte buffer to the output - out.write(buf, 0, bytesRead); - - totalRead += bytesRead; - } - - // If we reached this point, the download was successful - status = DownloadStatus.OK; - - notifyFinish(); - - } catch (final IOException e) { - status = DownloadStatus.COULD_NOT_CONNECT; - } finally { - // Make sure the input stream is closed - if (in != null) { - try { - in.close(); - } catch (final IOException e) { - e.printStackTrace(); - } - } - // Make sure the output stream is closed - if (out != null) { - try { - out.close(); - } catch (final IOException e) { - e.printStackTrace(); - } - } - } - } - } - - - /** - * Worker thread used for getting the response code of an already open HTTP connection. - */ - final static class GetResponseCodeThread extends WorkerThread { - - // The response code to read out - int responseCode; - - final HttpURLConnection conn; - - GetResponseCodeThread(HttpURLConnection conn) { - super("FileTransfer: Get response code"); - this.conn = conn; - } - - @Override - public void run() { - try { - // Get the response code - responseCode = conn.getResponseCode(); - } catch (final Exception e) { - responseCode = -1; - } - // Notify that this thread is finish - notifyFinish(); - } - } - - - /** - * Worker thread used for getting the content length of an already open HTTP connection. - */ - final static class GetContentLengthThread extends WorkerThread { - - // The content length to read out - int contentLength; - - final HttpURLConnection conn; - - GetContentLengthThread(HttpURLConnection conn) { - super("FileTransfer: Get content length"); - this.conn = conn; - } - - @Override - public void run() { - try { - // Get the content length - contentLength = conn.getContentLength(); - } catch (final Exception e) { - contentLength = -1; - } - // Notify that this thread is finish - notifyFinish(); - } - } - - - /** - * Worker thread used for reading bytes from an already open input stream into a byte buffer. - */ - final static class ReadInputStreamToBufferThread extends WorkerThread { - - int bytesRead; - - final InputStream in; - - final byte[] buf; - - ReadInputStreamToBufferThread(InputStream in, byte[] buf) { - super("FileTransfer: Read input stream to buffer"); - this.in = in; - this.buf = buf; - } - - @Override - public void run() { - try { - // Read bytes into the buffer - bytesRead = in.read(buf); - } catch (final Exception e) { - bytesRead = -1; - } - // Notify that this thread is finish - notifyFinish(); - } - } - - /** - * Copies a file into another file. - * - * @param srcFile is the filename of the source file to copy. - * @param destFile is the filename of the destination file to copy the file into. - * @return true if the file was copied; false otherwise - */ - public static boolean copy(String srcFile, String destFile) { - FileInputStream in = null; - FileOutputStream out = null; - - try { - if (srcFile.equals(destFile)) { - throw new IOException("You cannot copy a file onto itself"); - } - final byte[] buf = new byte[4096]; - - in = new FileInputStream(srcFile); - out = new FileOutputStream(destFile); - - while (in.available() > 0) { - out.write(buf, 0, in.read(buf, 0, buf.length)); - } - } catch (final IOException e) { - return false; - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (out != null) { - try { - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return true; - } - - /** - * Opens and connects to a {@link java.net.HttpURLConnection} for input only, and where the connection timeout and - * read timeout are controlled by properties. - * - * @param url is the URL to open a connection to. - * @return a HttpURLConnection intended for reading input only. - * @throws IOException if an I/O exception occurs. - */ - public static HttpURLConnection connectToHttpInputConnection(URL url) throws IOException { - return connectToHttpInputConnection(url, null); - } - - /** - * Opens and connects to a {@link java.net.HttpURLConnection} for input only, and where the connection timeout and - * read timeout are controlled by properties. - * - * @param url is the URL to open a connection to. - * @param sessionId is a optional session id. - * @return a HttpURLConnection intended for reading input only. - * @throws IOException if an I/O exception occurs. - */ - public static HttpURLConnection connectToHttpInputConnection(URL url, String sessionId) throws IOException { - HttpURLConnection conn = (HttpURLConnection) openURLConnection(url, false); // not for output - - conn.setRequestMethod("GET"); - if (sessionId != null) { - conn.setRequestProperty("Cookie", sessionId); - } - conn.connect(); - return conn; - } - - /** - * Opens a {link {@link java.net.URLConnection} for output (and input) where the connection timeout and read timeout - * are controlled by properties. - * - * @param url is the URL to open. - * @return a URLConnection for output. - * @throws IOException if an I/O exception occurs. - */ - public static URLConnection openOutputURLConnection(URL url) throws IOException { - return openURLConnection(url, true); // for output - } - - /** - * Convenient method used for getting an input stream from an URLConnection. - * This method checks if a GZIPInputStream or InflaterInputStream should be used to wrap the input stream from the - * URLConnection depending on the content encoding. - * - * @param conn is the URLConnection - * @return an input stream from the URLConnection, which can be a GZIPInputStream or InflaterInputStream. - * @throws IOException if an I/O exception occurs. - */ - public static InputStream getInputStream(URLConnection conn) throws IOException { - // Get input stream - InputStream in = conn.getInputStream(); - - // Get the encoding returned by the server - String encoding = conn.getContentEncoding(); - - // Check if we need to use a gzip or inflater input stream depending on the content encoding - if ("gzip".equalsIgnoreCase(encoding)) { - in = new GZIPInputStream(in); - } else if ("deflate".equalsIgnoreCase(encoding)) { - in = new InflaterInputStream(in); - } - return in; - } - - /** - * Convenient method used for getting an output stream from an URLConnection. - * This method checks if a GZIPOutputStream or DeflaterOutputStream should be used to wrap the output stream from - * the URLConnection depending on the content encoding. - * - * @param conn is the URLConnection - * @return an output stream from the URLConnection, which can be a GZIPOutputStream or DeflaterOutputStream. - * @throws IOException if an I/O exception occurs. - */ - public static OutputStream getOutputStream(URLConnection conn) throws IOException { - // Get output stream - OutputStream out = conn.getOutputStream(); - - // // Get the encoding returned by the server - // String encoding = conn.getContentEncoding(); - // - // // Check if we need to use a gzip or inflater input stream depending on the content encoding - // if ("gzip".equalsIgnoreCase(encoding)) { - // out = new GZIPOutputStream(out); - // } else if ("deflate".equalsIgnoreCase(encoding)) { - // out = new DeflaterOutputStream(out); - // } - return out; - } - - /** - * Opens a {link {@link java.net.URLConnection} for input and optional output where the connection timeout and read - * timeout are controlled by properties. - * - * @param url is the URL to open. - * @param isOutput is a flag specifying if the opened connection is for output. - * @return a URLConnection. - * @throws IOException if an I/O exception occurs. - */ - public static URLConnection openURLConnection(URL url, boolean isOutput) throws IOException { - URLConnection conn = url.openConnection(); - - conn.setDoInput(true); - conn.setDoOutput(isOutput); - - conn.setConnectTimeout(connectionTimeout); - conn.setReadTimeout(readTimeout); - - if (!isOutput) { - // Allow both GZip and Deflate (ZLib) encodings - conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); - conn.setRequestProperty("User-Agent", "RoboRumble@Home - gzip, deflate"); - } - return conn; - } - - /** - * Reads the roborumble.properties file and stores property values into global variables. - */ - private static void readProperties() { - Properties props = getProperties("./roborumble/roborumble.properties"); - - // Get connection timeout - String value = props.getProperty("connection.open.timeout"); - - if (value != null) { - try { - connectionTimeout = Integer.parseInt(value); - } catch (NumberFormatException ignore) {} - } - - // Get connection read timeout - value = props.getProperty("connection.read.timeout"); - if (value != null) { - try { - readTimeout = Integer.parseInt(value); - } catch (NumberFormatException ignore) {} - } - - // Get download session timeout - value = props.getProperty("download.session.timeout"); - if (value != null) { - try { - sessionTimeout = Integer.parseInt(value); - } catch (NumberFormatException ignore) {} - } - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/ResultsUpload.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/ResultsUpload.java deleted file mode 100644 index aaa5246..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/ResultsUpload.java +++ /dev/null @@ -1,328 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.netengine; - - -import net.sf.robocode.roborumble.battlesengine.CompetitionsSelector; -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; - -import java.io.*; -import java.net.URL; -import java.net.URLConnection; -import java.util.Properties; -import java.util.Vector; - - -/** - * Class used for uploading results to a server. - * Controlled by properties files. - * - * @author Albert Prez (original) - * @author Flemming N. Larsen (contributor) - */ -public class ResultsUpload { - - private final String client; - private final String resultsfile; - private final String resultsurl; - private final String tempdir; - private String game; - private final String user; - private final String sizesfile; - private final String minibots; - private final String microbots; - private final String nanobots; - private final CompetitionsSelector size; - private final String battlesnumfile; - private final String priority; - private final String teams; - private final String melee; - - public ResultsUpload(String propertiesfile, String clientVersion) { - // Read parameters - Properties parameters = getProperties(propertiesfile); - - resultsfile = parameters.getProperty("OUTPUT", ""); - resultsurl = parameters.getProperty("RESULTSURL", ""); - tempdir = parameters.getProperty("TEMP", ""); - user = parameters.getProperty("USER", ""); - game = propertiesfile; - String botsrepository = parameters.getProperty("BOTSREP", ""); - - while (game.indexOf("/") != -1) { - game = game.substring(game.indexOf("/") + 1); - } - game = game.substring(0, game.indexOf(".")); - sizesfile = parameters.getProperty("CODESIZEFILE", ""); - minibots = parameters.getProperty("MINIBOTS", ""); - microbots = parameters.getProperty("MICROBOTS", ""); - nanobots = parameters.getProperty("NANOBOTS", ""); - battlesnumfile = parameters.getProperty("BATTLESNUMFILE", ""); - priority = parameters.getProperty("PRIORITYBATTLESFILE", ""); - client = clientVersion; - teams = parameters.getProperty("TEAMS", "NOT"); - melee = parameters.getProperty("MELEE", "NOT"); - - // Open competitions selector - size = new CompetitionsSelector(sizesfile, botsrepository); - } - - public void uploadResults() { - - boolean errorsfound = false; - - // Read the results file - - Vector results = new Vector(); - String match = ""; - String bot1 = ""; - String bot2; - int status = 0; - BufferedReader br = null; - - try { - FileReader fr = new FileReader(resultsfile); - - br = new BufferedReader(fr); - String record; - - while ((record = br.readLine()) != null) { - if (record.indexOf(game) != -1) { - match = record; - status = 0; - } else if (status == 0) { - bot1 = record; - status = 1; - } else if (status == 1) { - bot2 = record; - results.add(match); - results.add(bot1); - results.add(bot2); - } - } - } catch (IOException e) { - System.out.println("Can't open result file for upload"); - return; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - - // Open the temp file to put the unuploaded results - PrintStream outtxt; - - try { - outtxt = new PrintStream(new BufferedOutputStream(new FileOutputStream(tempdir + "results.txt")), false); - } catch (IOException e) { - System.out.println("Not able to open output file ... Aborting"); - System.out.println(e); - return; - } - - // Open the file to put the battles number for each participant - PrintStream battlesnum; - - try { - battlesnum = new PrintStream(new BufferedOutputStream(new FileOutputStream(battlesnumfile)), false); - } catch (IOException e) { - System.out.println("Not able to open battles number file ... Aborting"); - System.out.println(e); - - outtxt.close(); - return; - } - - // Open the file to put the battles which have priority - PrintStream prioritybattles; - - try { - prioritybattles = new PrintStream(new BufferedOutputStream(new FileOutputStream(priority)), false); - } catch (IOException e) { - System.out.println("Not able to open priorities file ... Aborting"); - System.out.println(e); - - outtxt.close(); - battlesnum.close(); - return; - } - - // Post the results - - for (int i = 0; i < results.size() / 3; i++) { - - // Create the parameters String - String[] header = results.get(i * 3).split(","); - String[] first = results.get(i * 3 + 1).split(","); - String[] second = results.get(i * 3 + 2).split(","); - - // find the match mode - String matchtype = "GENERAL"; - - if (header.length >= 6) { - matchtype = header[5]; - } - - // if the match mode was general, then send the results to all competitions (assuming codesize is used). - // if its not, then send results only to smaller size competitions - - final String commonData = "&version=1" + "&client=" + client + "&teams=" + teams + "&melee=" + melee - + "&rounds=" + header[1] + "&field=" + header[2] + "&user=" + user + "&time=" + header[4] + "&fname=" - + first[0] + "&fscore=" + first[1] + "&fbulletd=" + first[2] + "&fsurvival=" + first[3] + "&sname=" - + second[0] + "&sscore=" + second[1] + "&sbulletd=" + second[2] + "&ssurvival=" + second[3]; - - String data = "game=" + game + commonData; - - if (matchtype.equals("GENERAL") || matchtype.equals("SERVER")) { - errorsfound = errorsfound | senddata(game, data, outtxt, true, results, i, battlesnum, prioritybattles); - } - - if (sizesfile.length() != 0) { // upload also related competitions - if (minibots.length() != 0 && !matchtype.equals("NANO") && !matchtype.equals("MICRO") - && size.checkCompetitorsForSize(first[0], second[0], 1500)) { - data = "game=" + minibots + commonData; - errorsfound = errorsfound - | senddata(minibots, data, outtxt, true, results, i, battlesnum, prioritybattles); - } - if (microbots.length() != 0 && !matchtype.equals("NANO") - && size.checkCompetitorsForSize(first[0], second[0], 750)) { - data = "game=" + microbots + commonData; - errorsfound = errorsfound - | senddata(microbots, data, outtxt, true, results, i, battlesnum, prioritybattles); - } - if (nanobots.length() != 0 && size.checkCompetitorsForSize(first[0], second[0], 250)) { - data = "game=" + nanobots + commonData; - errorsfound = errorsfound - | senddata(nanobots, data, outtxt, true, results, i, battlesnum, prioritybattles); - } - } - } - - // close files - outtxt.close(); - battlesnum.close(); - prioritybattles.close(); - - // delete results file - File r = new File(resultsfile); - boolean b = r.delete(); - - if (!b) { - System.out.println("Unable to delete results file."); - } - - // copy temp file into results file if there was some error - if (errorsfound) { - if (!FileTransfer.copy(tempdir + "results.txt", resultsfile)) { - System.out.println("Error when copying results errors file."); - } - } - } - - private void saveError(PrintStream outtxt, String match, String bot1, String bot2, boolean saveonerror) { - if (saveonerror) { - outtxt.println(match); - outtxt.println(bot1); - outtxt.println(bot2); - } - System.out.println("Unable to upload results " + match + " " + bot1 + " " + bot2); - } - - private boolean senddata(String game, String data, PrintStream outtxt, boolean saveonerror, Vector results, int i, PrintStream battlesnum, PrintStream prioritybattles) { - boolean errorsfound = false; - OutputStream out = null; - OutputStreamWriter outputStreamWriter = null; - PrintWriter wr = null; - InputStream in = null; - InputStreamReader inputStreamReader = null; - BufferedReader bufferedReader = null; - - try { - // Send data - URLConnection conn = FileTransfer.openOutputURLConnection(new URL(resultsurl)); - - out = FileTransfer.getOutputStream(conn); - outputStreamWriter = new OutputStreamWriter(out); - wr = new PrintWriter(outputStreamWriter); - - wr.println(data); - wr.flush(); - - // Get the response - in = FileTransfer.getInputStream(conn); - inputStreamReader = new InputStreamReader(in); - bufferedReader = new BufferedReader(inputStreamReader); - - String line; - boolean ok = false; - - while ((line = bufferedReader.readLine()) != null) { - if (line.indexOf("OK") != -1) { - ok = true; - System.out.println(line); - } else if (line.indexOf("<") != -1 && line.indexOf(">") != -1) { - // System.out.println(line); - // Save the number of battles for the bots into battlesnum !!!!!!!!!!!!! - String bot1 = results.get(i * 3 + 1); - - bot1 = bot1.substring(0, bot1.indexOf(",")); - String bot2 = results.get(i * 3 + 2); - - bot2 = bot2.substring(0, bot2.indexOf(",")); - line = line.replaceAll("<", ""); - line = line.replaceAll(">", ""); - String[] b = line.split(" "); - - if (b.length == 2) { - battlesnum.println(game + "," + bot1 + "," + b[0]); - battlesnum.println(game + "," + bot2 + "," + b[1]); - } - } else if (line.indexOf("[") != -1 && line.indexOf("]") != -1) { - line = line.substring(1); - line = line.substring(0, line.length() - 1); - String[] items = line.split(","); - String bot1 = items[0].substring(0, items[0].lastIndexOf("_")) + " " - + items[0].substring(items[0].lastIndexOf("_") + 1); - String bot2 = items[1].substring(0, items[1].lastIndexOf("_")) + " " - + items[1].substring(items[1].lastIndexOf("_") + 1); - String battle = bot1 + "," + bot2 + "," + "SERVER"; - - if (prioritybattles != null) { - prioritybattles.println(battle); - } - } else { - System.out.println(line); - } - } - if (!ok) { - saveError(outtxt, results.get(i * 3), results.get(i * 3 + 1), results.get(i * 3 + 2), saveonerror); - if (saveonerror) { - errorsfound = true; - } - } - } catch (IOException e) { - System.out.println(e); - if (saveonerror) { - errorsfound = true; - } - saveError(outtxt, results.get(i * 3), results.get(i * 3 + 1), results.get(i * 3 + 2), saveonerror); - } finally { - if (wr != null) { - wr.close(); - } - if (bufferedReader != null) { - try { - bufferedReader.close(); - } catch (IOException ignored) {} - } - } - return errorsfound; - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/UpdateRatingFiles.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/UpdateRatingFiles.java deleted file mode 100644 index ea9c212..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/UpdateRatingFiles.java +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.netengine; - - -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; -import static net.sf.robocode.roborumble.util.PropertiesUtil.storeProperties; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; -import java.util.Vector; - - -/** - * Class used for updating the local rating files. - * Controlled by properties files. - * - * @author Albert Prez (original) - * @author Flemming N. Larsen (contributor) - */ -public class UpdateRatingFiles { - - private String game; - private final String minibots; - private final String microbots; - private final String nanobots; - private final String battlesnumfile; - private final String generalratings; - private final String miniratings; - private final String microratings; - private final String nanoratings; - - public UpdateRatingFiles(String propertiesfile) { - // Read parameters - Properties parameters = getProperties(propertiesfile); - - game = propertiesfile; - while (game.indexOf("/") != -1) { - game = game.substring(game.indexOf("/") + 1); - } - game = game.substring(0, game.indexOf(".")); - minibots = parameters.getProperty("MINIBOTS", ""); - microbots = parameters.getProperty("MICROBOTS", ""); - nanobots = parameters.getProperty("NANOBOTS", ""); - - battlesnumfile = parameters.getProperty("BATTLESNUMFILE", ""); - - generalratings = parameters.getProperty("RATINGS.GENERAL", ""); - miniratings = parameters.getProperty("RATINGS.MINIBOTS", ""); - microratings = parameters.getProperty("RATINGS.MICROBOTS", ""); - nanoratings = parameters.getProperty("RATINGS.NANOBOTS", ""); - } - - public boolean updateRatings() { - - // read all the records to be updated - Vector battles = new Vector(); - BufferedReader br = null; - - try { - FileReader fr = new FileReader(battlesnumfile); - - br = new BufferedReader(fr); - String record; - - while ((record = br.readLine()) != null) { - battles.add(record); - } - } catch (IOException e) { - System.out.println("Can't open # battles file ... Aborting # battles update"); - return false; - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) {} - } - } - - // read the ratings files - Properties all = getProperties(generalratings); - Properties mini = getProperties(miniratings); - Properties micro = getProperties(microratings); - Properties nano = getProperties(nanoratings); - - // update #battles - for (String battle : battles) { - String[] battleSpec = battle.split(","); - - battleSpec[1] = battleSpec[1].replaceAll(" ", "_"); - double num = Double.parseDouble(battleSpec[2]); - - if (battleSpec[0].equals(game)) { - updateRecord(battleSpec[1], num, all); - } else if (battleSpec[0].equals(minibots) && mini != null) { - updateRecord(battleSpec[1], num, mini); - } else if (battleSpec[0].equals(microbots) && micro != null) { - updateRecord(battleSpec[1], num, micro); - } else if (battleSpec[0].equals(nanobots) && nano != null) { - updateRecord(battleSpec[1], num, nano); - } - } - - // save ratings files - return storeProperties(all, generalratings, "General ratings updated with new battles number") - && storeProperties(all, miniratings, "Mini ratings updated with new battles number") - && storeProperties(all, microratings, "Micro ratings updated with new battles number") - && storeProperties(all, nanoratings, "Nano ratings updated with new battles number"); - } - - private void updateRecord(String bot, double battles, Properties ratings) { - String values = ratings.getProperty(bot); - - if (values == null) { - return; - } - - String[] value = values.split(","); - - values = value[0] + "," + Double.toString(battles) + "," + value[2]; - ratings.setProperty(bot, values); - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/ExcludesUtil.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/ExcludesUtil.java deleted file mode 100644 index fd8bb56..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/ExcludesUtil.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.util; - - -import java.util.Properties; - - -/** - * Utility class for working with the EXCLUDE property for excluding robots from download and battles. - * - * @author Flemming N. Larsen (original) - */ -public class ExcludesUtil { - - private static String[] excludes; - - /** - * Read and prepared exclude filters for robots that should not be downloaded or participate in battles. - * - * @param properties the properties to store. - * @return a string array containing the excluded robots or null if no excludes are defined. - */ - public static void setExcludes(Properties properties) { - if (excludes != null) { - return; - } - - // Read and prepare exclude filters - String exclude = properties.getProperty("EXCLUDE"); - - if (exclude != null) { - // Convert into regular expression - - // Dots must be dots, not "any character" in the regular expression - exclude = exclude.replaceAll("\\.", "\\\\."); - - // The wildcard character ? corresponds to the regular expression .? - exclude = exclude.replaceAll("\\?", ".?"); - - // The wildcard character * corresponds to the regular expression .* - exclude = exclude.replaceAll("\\*", ".*"); - - // Split the exclude line into independent exclude filters that are trimmed for white-spaces - excludes = exclude.split("[,;]+"); // white spaces are allowed in the filter due to robot version numbers - } - } - - /** - * Checks if a participant is excluded. - * - * @param botNameVersion the name and version of the participant. - * @return true if the participant is excluded; false otherwise. - */ - public static boolean isExcluded(String botNameVersion) { - if (excludes == null) { - return false; - } - - // Check the name against all exclude filters - for (int i = excludes.length - 1; i >= 0; i--) { - try { - if (botNameVersion.matches(excludes[i])) { - return true; - } - } catch (java.util.regex.PatternSyntaxException e) { - // Clear the current exclude if the syntax is illegal (for next time this method is called) - excludes[i] = ""; - } - } - - // Not excluded - return false; - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/PropertiesUtil.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/PropertiesUtil.java deleted file mode 100644 index 2527f1d..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/util/PropertiesUtil.java +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.roborumble.util; - - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - - -/** - * @author Flemming N. Larsen (original) - */ -public final class PropertiesUtil { - - /** - * Returns a new Properties instance that is initialized to the specified properties file. - * - * @param filename the filename of the properties file to load - * @return a new java.util.Properties instance - */ - public static Properties getProperties(String filename) { - Properties props = new Properties(); - - if (filename != null && filename.trim().length() > 0) { - FileInputStream fis = null; - - try { - fis = new FileInputStream(filename); - props.load(fis); - } catch (IOException e) { - System.err.println("Could not load properties file: " + filename); - } finally { - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - return props; - } - - /** - * Returns a new Properties instance that is initialized to the specified properties input stream. - * - * @param is the input stream of the properties to load - * @return a new java.util.Properties instance - */ - public static Properties getProperties(InputStream is) { - Properties props = new Properties(); - - try { - props.load(is); - } catch (Exception e) { - System.err.println("Could not load properties input stream: " + is); - } - return props; - } - - /** - * Stores a Properties instance to the specified properties file. - * - * @param properties the properties to store - * @param filename the filename of the file to store the properties into - * @param comments comments to include in the properties file - * @return true if the properties were stored; false otherwise - */ - public static boolean storeProperties(Properties properties, String filename, String comments) { - if (properties == null || filename == null || filename.trim().length() == 0) { - return false; - } - - FileOutputStream fos = null; - - try { - fos = new FileOutputStream(filename); - properties.store(fos, comments); - } catch (IOException e) { - System.err.println("Could not store properties to file: " + filename); - return false; - } finally { - if (fos != null) { - try { - fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return true; - } -} diff --git a/代码/workspace_robo4/robocode.roborumble/src/main/java/roborumble/RoboRumbleAtHome.java b/代码/workspace_robo4/robocode.roborumble/src/main/java/roborumble/RoboRumbleAtHome.java deleted file mode 100644 index ab15763..0000000 --- a/代码/workspace_robo4/robocode.roborumble/src/main/java/roborumble/RoboRumbleAtHome.java +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package roborumble; - - -import net.sf.robocode.roborumble.battlesengine.BattlesRunner; -import net.sf.robocode.roborumble.battlesengine.PrepareBattles; -import net.sf.robocode.roborumble.netengine.BotsDownload; -import net.sf.robocode.roborumble.netengine.ResultsUpload; -import net.sf.robocode.roborumble.netengine.UpdateRatingFiles; -import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; - -import java.util.Properties; - - -/** - * Implements the client side of RoboRumble@Home. - * Controlled by properties files. - * - * @author Albert Prez (original) - * @author Flemming N. Larsen (contributor) - * @author Jerome Lavigne (contributor) - */ -public class RoboRumbleAtHome { - - public static void main(String args[]) { - - // Get the associated parameters file - String parameters = "./roborumble/roborumble.txt"; - - try { - parameters = args[0]; - } catch (Exception e) { - System.out.println("No argument found specifying properties file. \"roborumble.txt\" assumed."); - } - - // Read parameters for running the app - Properties param = getProperties(parameters); - - String downloads = param.getProperty("DOWNLOAD", "NOT"); - String executes = param.getProperty("EXECUTE", "NOT"); - String uploads = param.getProperty("UPLOAD", "NOT"); - String iterates = param.getProperty("ITERATE", "NOT"); - String runonly = param.getProperty("RUNONLY", "GENERAL"); - String melee = param.getProperty("MELEE", "NOT"); - - int iterations = 0; - long lastdownload = 0; - boolean ratingsdownloaded = false; - boolean participantsdownloaded; - String version = null; - - do { - final BattlesRunner engine = new BattlesRunner(parameters); - - if (version == null) { - version = engine.getVersion(); - } - - System.out.println("Iteration number " + iterations); - - // Download data from Internet if downloads is YES and it has not been download for two hours - if (downloads.equals("YES")) { - BotsDownload download = new BotsDownload(parameters); - - if (runonly.equals("SERVER")) { - // Download rating files and update ratings downloaded - System.out.println("Downloading rating files ..."); - ratingsdownloaded = download.downloadRatings(); - } - if ((System.currentTimeMillis() - lastdownload) > 2 * 3600 * 1000) { - System.out.println("Downloading participants list ..."); - participantsdownloaded = download.downloadParticipantsList(); - System.out.println("Downloading missing bots ..."); - download.downloadMissingBots(); - download.updateCodeSize(); - // Send the order to the server to remove old participants from the ratings file - if (ratingsdownloaded && participantsdownloaded) { - System.out.println("Removing old participants from server ..."); - // Send unwanted participants to the server - download.notifyServerForOldParticipants(); - } - - lastdownload = System.currentTimeMillis(); - } - } - - // Create battles file (and delete old ones), and execute battles - if (executes.equals("YES")) { - final boolean isMelee = melee.equals("YES"); - - boolean ready; - PrepareBattles battles = new PrepareBattles(parameters); - - if (isMelee) { - System.out.println("Preparing melee battles list ..."); - ready = battles.createMeleeBattlesList(); - } else { - final boolean isSmartBattles = ratingsdownloaded && runonly.equals("SERVER"); - - if (isSmartBattles) { - System.out.println("Preparing battles list using smart battles..."); - ready = battles.createSmartBattlesList(); - } else { - System.out.println("Preparing battles list..."); - ready = battles.createBattlesList(); - } - } - - // Disable the -DPRARALLEL and -DRANDOMSEED options - System.setProperty("PARALLEL", "false"); // TODO: Remove when robot thread CPU time can be measured - System.setProperty("RANDOMSEED", "none"); // In tournaments, robots should not be deterministic! - - // Execute battles - if (ready) { - if (isMelee) { - System.out.println("Executing melee battles ..."); - } else { - System.out.println("Executing battles ..."); - } - - engine.runBattlesImpl(isMelee); - } - } - - // Upload results - if (uploads.equals("YES") && version != null) { - System.out.println("Uploading results ..."); - ResultsUpload upload = new ResultsUpload(parameters, version); - - // Uploads the results to the server - upload.uploadResults(); - - // Updates the number of battles from the info received from the server - System.out.println("Updating number of battles fought ..."); - UpdateRatingFiles updater = new UpdateRatingFiles(parameters); - - ratingsdownloaded = updater.updateRatings(); - } - - iterations++; - } while (iterates.equals("YES")); - - // With Java 5 this causes a IllegalThreadStateException, but not in Java 6 - // System.exit(0); - } -} diff --git a/代码/workspace_robo4/robocode.samples/.classpath b/代码/workspace_robo4/robocode.samples/.classpath deleted file mode 100644 index 2dfe70b..0000000 --- a/代码/workspace_robo4/robocode.samples/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.samples/.project b/代码/workspace_robo4/robocode.samples/.project deleted file mode 100644 index d30f541..0000000 --- a/代码/workspace_robo4/robocode.samples/.project +++ /dev/null @@ -1,16 +0,0 @@ - - - robocode.samples - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.samples/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.samples/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.samples/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.samples/pom.xml b/代码/workspace_robo4/robocode.samples/pom.xml deleted file mode 100644 index 6ee25a0..0000000 --- a/代码/workspace_robo4/robocode.samples/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - robocode.samples - Robocode Samples - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - - src/main/java - false - - **/*.java - - - - src/main/resources - false - - **/*.properties - **/*.team - **/*.html - - - - - diff --git a/代码/workspace_robo4/robocode.samples/robocode.samples.iml b/代码/workspace_robo4/robocode.samples/robocode.samples.iml deleted file mode 100644 index bfdd4ee..0000000 --- a/代码/workspace_robo4/robocode.samples/robocode.samples.iml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Corners.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Corners.java deleted file mode 100644 index 935467e..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Corners.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.DeathEvent; -import robocode.Robot; -import robocode.ScannedRobotEvent; -import static robocode.util.Utils.normalRelativeAngleDegrees; - -import java.awt.*; - - -/** - * Corners - a sample robot by Mathew Nelson. - *

- * This robot moves to a corner, then swings the gun back and forth. - * If it dies, it tries a new corner in the next round. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Corners extends Robot { - int others; // Number of other robots in the game - static int corner = 0; // Which corner we are currently using - // static so that it keeps it between rounds. - boolean stopWhenSeeRobot = false; // See goCorner() - - /** - * run: Corners' main run function. - */ - public void run() { - // Set colors - setBodyColor(Color.red); - setGunColor(Color.black); - setRadarColor(Color.yellow); - setBulletColor(Color.green); - setScanColor(Color.green); - - // Save # of other bots - others = getOthers(); - - // Move to a corner - goCorner(); - - // Initialize gun turn speed to 3 - int gunIncrement = 3; - - // Spin gun back and forth - while (true) { - for (int i = 0; i < 30; i++) { - turnGunLeft(gunIncrement); - } - gunIncrement *= -1; - } - } - - /** - * goCorner: A very inefficient way to get to a corner. Can you do better? - */ - public void goCorner() { - // We don't want to stop when we're just turning... - stopWhenSeeRobot = false; - // turn to face the wall to the "right" of our desired corner. - turnRight(normalRelativeAngleDegrees(corner - getHeading())); - // Ok, now we don't want to crash into any robot in our way... - stopWhenSeeRobot = true; - // Move to that wall - ahead(5000); - // Turn to face the corner - turnLeft(90); - // Move to the corner - ahead(5000); - // Turn gun to starting point - turnGunLeft(90); - } - - /** - * onScannedRobot: Stop and fire! - */ - public void onScannedRobot(ScannedRobotEvent e) { - // Should we stop, or just fire? - if (stopWhenSeeRobot) { - // Stop everything! You can safely call stop multiple times. - stop(); - // Call our custom firing method - smartFire(e.getDistance()); - // Look for another robot. - // NOTE: If you call scan() inside onScannedRobot, and it sees a robot, - // the game will interrupt the event handler and start it over - scan(); - // We won't get here if we saw another robot. - // Okay, we didn't see another robot... start moving or turning again. - resume(); - } else { - smartFire(e.getDistance()); - } - } - - /** - * smartFire: Custom fire method that determines firepower based on distance. - * - * @param robotDistance the distance to the robot to fire at - */ - public void smartFire(double robotDistance) { - if (robotDistance > 200 || getEnergy() < 15) { - fire(1); - } else if (robotDistance > 50) { - fire(2); - } else { - fire(3); - } - } - - /** - * onDeath: We died. Decide whether to try a different corner next game. - */ - public void onDeath(DeathEvent e) { - // Well, others should never be 0, but better safe than sorry. - if (others == 0) { - return; - } - - // If 75% of the robots are still alive when we die, we'll switch corners. - if ((others - getOthers()) / (double) others < .75) { - corner += 90; - if (corner == 270) { - corner = -90; - } - out.println("I died and did poorly... switching corner to " + corner); - } else { - out.println("I died but did well. I will still use corner " + corner); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Crazy.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Crazy.java deleted file mode 100644 index 4508d33..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Crazy.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.*; - -import java.awt.*; - - -/** - * Crazy - a sample robot by Mathew Nelson. - *

- * This robot moves around in a crazy pattern. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Crazy extends AdvancedRobot { - boolean movingForward; - - /** - * run: Crazy's main run function - */ - public void run() { - // Set colors - setBodyColor(new Color(0, 200, 0)); - setGunColor(new Color(0, 150, 50)); - setRadarColor(new Color(0, 100, 100)); - setBulletColor(new Color(255, 255, 100)); - setScanColor(new Color(255, 200, 200)); - - // Loop forever - while (true) { - // Tell the game we will want to move ahead 40000 -- some large number - setAhead(40000); - movingForward = true; - // Tell the game we will want to turn right 90 - setTurnRight(90); - // At this point, we have indicated to the game that *when we do something*, - // we will want to move ahead and turn right. That's what "set" means. - // It is important to realize we have not done anything yet! - // In order to actually move, we'll want to call a method that - // takes real time, such as waitFor. - // waitFor actually starts the action -- we start moving and turning. - // It will not return until we have finished turning. - waitFor(new TurnCompleteCondition(this)); - // Note: We are still moving ahead now, but the turn is complete. - // Now we'll turn the other way... - setTurnLeft(180); - // ... and wait for the turn to finish ... - waitFor(new TurnCompleteCondition(this)); - // ... then the other way ... - setTurnRight(180); - // .. and wait for that turn to finish. - waitFor(new TurnCompleteCondition(this)); - // then back to the top to do it all again - } - } - - /** - * onHitWall: Handle collision with wall. - */ - public void onHitWall(HitWallEvent e) { - // Bounce off! - reverseDirection(); - } - - /** - * reverseDirection: Switch from ahead to back & vice versa - */ - public void reverseDirection() { - if (movingForward) { - setBack(40000); - movingForward = false; - } else { - setAhead(40000); - movingForward = true; - } - } - - /** - * onScannedRobot: Fire! - */ - public void onScannedRobot(ScannedRobotEvent e) { - fire(1); - } - - /** - * onHitRobot: Back up! - */ - public void onHitRobot(HitRobotEvent e) { - // If we're moving the other robot, reverse! - if (e.isMyFault()) { - reverseDirection(); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Fire.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Fire.java deleted file mode 100644 index f15b29f..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Fire.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.HitByBulletEvent; -import robocode.HitRobotEvent; -import robocode.Robot; -import robocode.ScannedRobotEvent; -import static robocode.util.Utils.normalRelativeAngleDegrees; - -import java.awt.*; - - -/** - * Fire - a sample robot by Mathew Nelson, and maintained. - *

- * Sits still. Spins gun around. Moves when hit. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Fire extends Robot { - int dist = 50; // distance to move when we're hit - - /** - * run: Fire's main run function - */ - public void run() { - // Set colors - setBodyColor(Color.orange); - setGunColor(Color.orange); - setRadarColor(Color.red); - setScanColor(Color.red); - setBulletColor(Color.red); - - // Spin the gun around slowly... forever - while (true) { - turnGunRight(5); - } - } - - /** - * onScannedRobot: Fire! - */ - public void onScannedRobot(ScannedRobotEvent e) { - // If the other robot is close by, and we have plenty of life, - // fire hard! - if (e.getDistance() < 50 && getEnergy() > 50) { - fire(3); - } // otherwise, fire 1. - else { - fire(1); - } - // Call scan again, before we turn the gun - scan(); - } - - /** - * onHitByBullet: Turn perpendicular to the bullet, and move a bit. - */ - public void onHitByBullet(HitByBulletEvent e) { - turnRight(normalRelativeAngleDegrees(90 - (getHeading() - e.getHeading()))); - - ahead(dist); - dist *= -1; - scan(); - } - - /** - * onHitRobot: Aim at it. Fire Hard! - */ - public void onHitRobot(HitRobotEvent e) { - double turnGunAmt = normalRelativeAngleDegrees(e.getBearing() + getHeading() - getGunHeading()); - - turnGunRight(turnGunAmt); - fire(3); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive.java deleted file mode 100644 index 51dcbc5..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive.java +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.AdvancedRobot; -import static robocode.util.Utils.normalAbsoluteAngle; -import static robocode.util.Utils.normalRelativeAngle; - -import java.awt.*; -import java.awt.event.KeyEvent; -import static java.awt.event.KeyEvent.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; - - -/** - * Interactive - a sample robot by Flemming N. Larsen. - *

- * This is a robot that is controlled using the arrow keys and mouse only. - *

- * Keys: - * - W or arrow up: Move forward - * - S or arrow down: Move backward - * - A or arrow right: Turn right - * - D or arrow left: Turn left - * Mouse: - * - Moving: Moves the aim, which the gun will follow - * - Wheel up: Move forward - * - Wheel down: Move backward - * - Button 1: Fire a bullet with power = 1 - * - Button 2: Fire a bullet with power = 2 - * - Button 3: Fire a bullet with power = 3 - *

- * The bullet color depends on the fire power: - * - Power = 1: Yellow - * - Power = 2: Orange - * - Power = 3: Red - *

- * Note that the robot will continue firing as long as the mouse button is - * pressed down. - *

- * By enabling the "Paint" button on the robot console window for this robot, - * a cross hair will be painted for the robots current aim (controlled by the - * mouse). - * - * @author Flemming N. Larsen (original) - * - * @version 1.2 - * - * @since 1.3.4 - */ -public class Interactive extends AdvancedRobot { - - // Move direction: 1 = move forward, 0 = stand still, -1 = move backward - int moveDirection; - - // Turn direction: 1 = turn right, 0 = no turning, -1 = turn left - int turnDirection; - - // Amount of pixels/units to move - double moveAmount; - - // The coordinate of the aim (x,y) - int aimX, aimY; - - // Fire power, where 0 = don't fire - int firePower; - - // Called when the robot must run - public void run() { - - // Sets the colors of the robot - // body = black, gun = white, radar = red - setColors(Color.BLACK, Color.WHITE, Color.RED); - - // Loop forever - for (;;) { - // Sets the robot to move forward, backward or stop moving depending - // on the move direction and amount of pixels to move - setAhead(moveAmount * moveDirection); - - // Decrement the amount of pixels to move until we reach 0 pixels - // This way the robot will automatically stop if the mouse wheel - // has stopped it's rotation - moveAmount = Math.max(0, moveAmount - 1); - - // Sets the robot to turn right or turn left (at maximum speed) or - // stop turning depending on the turn direction - setTurnRight(45 * turnDirection); // degrees - - // Turns the gun toward the current aim coordinate (x,y) controlled by - // the current mouse coordinate - double angle = normalAbsoluteAngle(Math.atan2(aimX - getX(), aimY - getY())); - - setTurnGunRightRadians(normalRelativeAngle(angle - getGunHeadingRadians())); - - // Fire the gun with the specified fire power, unless the fire power = 0 - if (firePower > 0) { - setFire(firePower); - } - - // Execute all pending set-statements - execute(); - - // Next turn is processed in this loop.. - } - } - - // Called when a key has been pressed - public void onKeyPressed(KeyEvent e) { - switch (e.getKeyCode()) { - case VK_UP: - case VK_W: - // Arrow up key: move direction = forward (infinitely) - moveDirection = 1; - moveAmount = Double.POSITIVE_INFINITY; - break; - - case VK_DOWN: - case VK_S: - // Arrow down key: move direction = backward (infinitely) - moveDirection = -1; - moveAmount = Double.POSITIVE_INFINITY; - break; - - case VK_RIGHT: - case VK_D: - // Arrow right key: turn direction = right - turnDirection = 1; - break; - - case VK_LEFT: - case VK_A: - // Arrow left key: turn direction = left - turnDirection = -1; - break; - } - } - - // Called when a key has been released (after being pressed) - public void onKeyReleased(KeyEvent e) { - switch (e.getKeyCode()) { - case VK_UP: - case VK_W: - case VK_DOWN: - case VK_S: - // Arrow up and down keys: move direction = stand still - moveDirection = 0; - moveAmount = 0; - break; - - case VK_RIGHT: - case VK_D: - case VK_LEFT: - case VK_A: - // Arrow right and left keys: turn direction = stop turning - turnDirection = 0; - break; - } - } - - // Called when the mouse wheel is rotated - public void onMouseWheelMoved(MouseWheelEvent e) { - // If the wheel rotation is negative it means that it is moved forward. - // Set move direction = forward, if wheel is moved forward. - // Otherwise, set move direction = backward - moveDirection = (e.getWheelRotation() < 0) ? 1 : -1; - - // Set the amount to move = absolute wheel rotation amount * 5 (speed) - // Here 5 means 5 pixels per wheel rotation step. The higher value, the - // more speed - moveAmount += Math.abs(e.getWheelRotation()) * 5; - } - - // Called when the mouse has been moved - public void onMouseMoved(MouseEvent e) { - // Set the aim coordinate = the mouse pointer coordinate - aimX = e.getX(); - aimY = e.getY(); - } - - // Called when a mouse button has been pressed - public void onMousePressed(MouseEvent e) { - if (e.getButton() == MouseEvent.BUTTON3) { - // Button 3: fire power = 3 energy points, bullet color = red - firePower = 3; - setBulletColor(Color.RED); - } else if (e.getButton() == MouseEvent.BUTTON2) { - // Button 2: fire power = 2 energy points, bullet color = orange - firePower = 2; - setBulletColor(Color.ORANGE); - } else { - // Button 1 or unknown button: - // fire power = 1 energy points, bullet color = yellow - firePower = 1; - setBulletColor(Color.YELLOW); - } - } - - // Called when a mouse button has been released (after being pressed) - public void onMouseReleased(MouseEvent e) { - // Fire power = 0, which means "don't fire" - firePower = 0; - } - - // Called in order to paint graphics for this robot. - // "Paint" button on the robot console window for this robot must be - // enabled in order to see the paintings. - public void onPaint(Graphics2D g) { - // Draw a red cross hair with the center at the current aim - // coordinate (x,y) - g.setColor(Color.RED); - g.drawOval(aimX - 15, aimY - 15, 30, 30); - g.drawLine(aimX, aimY - 4, aimX, aimY + 4); - g.drawLine(aimX - 4, aimY, aimX + 4, aimY); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive_v2.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive_v2.java deleted file mode 100644 index dcddb3b..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Interactive_v2.java +++ /dev/null @@ -1,263 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.AdvancedRobot; -import robocode.util.Utils; -import static robocode.util.Utils.normalAbsoluteAngle; -import static robocode.util.Utils.normalRelativeAngle; - -import java.awt.*; -import java.awt.event.KeyEvent; -import static java.awt.event.KeyEvent.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; -import java.util.HashSet; -import java.util.Set; - - -/** - * Interactive_v2 - a modified version of the sample robot Interactive by Flemming N. Larsen - * to use absolute movements (up, right, down, left) by Tuan Anh Nguyen. - *

- * This is a robot that is controlled using the arrow keys (or WASD) and mouse only. - *

- * Keys: - * - W or arrow up: Move up - * - S or arrow down: Move down - * - A or arrow right: Move right - * - D or arrow left: Move left - * Mouse: - * - Moving: Moves the aim, which the gun will follow - * - Button 1: Fire a bullet with power = 1 - * - Button 2: Fire a bullet with power = 2 - * - Button 3: Fire a bullet with power = 3 - *

- * The bullet color depends on the fire power: - * - Power = 1: Yellow - * - Power = 2: Orange - * - Power = 3: Red - *

- * Note that the robot will continue firing as long as the mouse button is - * pressed down. - *

- * By enabling the "Paint" button on the robot console window for this robot, - * a cross hair will be painted for the robots current aim (controlled by the - * mouse). - * - * @author Flemming N. Larsen (original) - * @author Tuan Anh Nguyen (contributor) - * - * @version 1.0 - * - * @since 1.7.2.2 - */ -public class Interactive_v2 extends AdvancedRobot { - - // The coordinate of the aim (x,y) - int aimX, aimY; - - // Fire power, where 0 = don't fire - int firePower; - - // Absolute directions on the screen - private enum Direction { - UP, - DOWN, - LEFT, - RIGHT - } - - // Current move directions - private final Set directions = new HashSet(); - - // Called when the robot must run - public void run() { - - // Sets the colors of the robot - // body = black, gun = white, radar = red - setColors(Color.BLACK, Color.WHITE, Color.RED); - - // Loop forever - for (;;) { - // Move the robot compared to the distance to move - setAhead(distanceToMove()); - - // Turn the body to it points in the correct direction - setTurnRight(angleToTurnInDegrees()); - - // Turns the gun toward the current aim coordinate (x,y) controlled by - // the current mouse coordinate - double angle = normalAbsoluteAngle(Math.atan2(aimX - getX(), aimY - getY())); - - setTurnGunRightRadians(normalRelativeAngle(angle - getGunHeadingRadians())); - - // Fire the gun with the specified fire power, unless the fire power = 0 - if (firePower > 0) { - setFire(firePower); - } - - // Execute all pending set-statements - execute(); - - // Next turn is processed in this loop.. - } - } - - // Called when a key has been pressed - public void onKeyPressed(KeyEvent e) { - switch (e.getKeyCode()) { - case VK_UP: - case VK_W: - directions.add(Direction.UP); - break; - - case VK_DOWN: - case VK_S: - directions.add(Direction.DOWN); - break; - - case VK_RIGHT: - case VK_D: - directions.add(Direction.RIGHT); - break; - - case VK_LEFT: - case VK_A: - directions.add(Direction.LEFT); - break; - } - } - - // Called when a key has been released (after being pressed) - public void onKeyReleased(KeyEvent e) { - switch (e.getKeyCode()) { - case VK_UP: - case VK_W: - directions.remove(Direction.UP); - break; - - case VK_DOWN: - case VK_S: - directions.remove(Direction.DOWN); - break; - - case VK_RIGHT: - case VK_D: - directions.remove(Direction.RIGHT); - break; - - case VK_LEFT: - case VK_A: - directions.remove(Direction.LEFT); - break; - } - } - - // Called when the mouse wheel is rotated - public void onMouseWheelMoved(MouseWheelEvent e) {// Do nothing - } - - // Called when the mouse has been moved - public void onMouseMoved(MouseEvent e) { - // Set the aim coordinate = the mouse pointer coordinate - aimX = e.getX(); - aimY = e.getY(); - } - - // Called when a mouse button has been pressed - public void onMousePressed(MouseEvent e) { - if (e.getButton() == MouseEvent.BUTTON3) { - // Button 3: fire power = 3 energy points, bullet color = red - firePower = 3; - setBulletColor(Color.RED); - } else if (e.getButton() == MouseEvent.BUTTON2) { - // Button 2: fire power = 2 energy points, bullet color = orange - firePower = 2; - setBulletColor(Color.ORANGE); - } else { - // Button 1 or unknown button: - // fire power = 1 energy points, bullet color = yellow - firePower = 1; - setBulletColor(Color.YELLOW); - } - } - - // Called when a mouse button has been released (after being pressed) - public void onMouseReleased(MouseEvent e) { - // Fire power = 0, which means "don't fire" - firePower = 0; - } - - // Called in order to paint graphics for this robot. - // "Paint" button on the robot console window for this robot must be - // enabled in order to see the paintings. - public void onPaint(Graphics2D g) { - // Draw a red cross hair with the center at the current aim - // coordinate (x,y) - g.setColor(Color.RED); - g.drawOval(aimX - 15, aimY - 15, 30, 30); - g.drawLine(aimX, aimY - 4, aimX, aimY + 4); - g.drawLine(aimX - 4, aimY, aimX + 4, aimY); - } - - // Returns the angle to turn, which is the delta between the desired - // direction and the current heading of the robot - private double angleToTurnInDegrees() { - if (directions.isEmpty()) { - return 0; - } - return Utils.normalRelativeAngleDegrees(desiredDirection() - getHeading()); - } - - // Returns the distance to move - private double distanceToMove() { - // If no keys are pressed, we should not move at all - if (directions.isEmpty()) { - return 0; - } - // If the robot has more than 45 degrees to turn, move only 5 pixel - if (Math.abs(angleToTurnInDegrees()) > 45) { - return 5; - } - // Otherwise, move at full speed - return Double.POSITIVE_INFINITY; - } - - // Return the desired direction depending on the pending move directions. - // With one arrow key pressed, the move to N, E, S, W. - // With two keys pressed, the robot also move to NE, NW, SE, SW. - private double desiredDirection() { - if (directions.contains(Direction.UP)) { - if (directions.contains(Direction.RIGHT)) { - return 45; - } - if (directions.contains(Direction.LEFT)) { - return 315; - } - return 0; - } - if (directions.contains(Direction.DOWN)) { - if (directions.contains(Direction.RIGHT)) { - return 135; - } - if (directions.contains(Direction.LEFT)) { - return 225; - } - return 180; - } - if (directions.contains(Direction.RIGHT)) { - return 90; - } - if (directions.contains(Direction.LEFT)) { - return 270; - } - return 0; - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstJuniorRobot.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstJuniorRobot.java deleted file mode 100644 index 7931009..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstJuniorRobot.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.JuniorRobot; - - -/** - * MyFirstJuniorRobot - a sample robot by Flemming N. Larsen - *

- * Moves in a seesaw motion, and spins the gun around at each end - * when it cannot see any enemy robot. When the robot sees and enemy - * robot, it will immediately turn the gun and fire at it. - * - * @author Flemming N. Larsen (original) - */ -public class MyFirstJuniorRobot extends JuniorRobot { - - /** - * MyFirstJuniorRobot's run method - Seesaw as default - */ - public void run() { - // Set robot colors - setColors(green, black, blue); - - // Seesaw forever - while (true) { - ahead(100); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(100); // Move back 100 - turnGunRight(360); // Spin gun around - } - } - - /** - * When we see a robot, turn the gun towards it and fire - */ - public void onScannedRobot() { - // Turn gun to point at the scanned robot - turnGunTo(scannedAngle); - - // Fire! - fire(1); - } - - /** - * We were hit! Turn and move perpendicular to the bullet, - * so our seesaw might avoid a future shot. - */ - public void onHitByBullet() { - // Move ahead 100 and in the same time turn left papendicular to the bullet - turnAheadLeft(100, 90 - hitByBulletBearing); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstRobot.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstRobot.java deleted file mode 100644 index d9013d0..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/MyFirstRobot.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.HitByBulletEvent; -import robocode.Robot; -import robocode.ScannedRobotEvent; - - -/** - * MyFirstRobot - a sample robot by Mathew Nelson. - *

- * Moves in a seesaw motion, and spins the gun around at each end. - * - * @author Mathew A. Nelson (original) - */ -public class MyFirstRobot extends Robot { - - /** - * MyFirstRobot's run method - Seesaw - */ - public void run() { - - while (true) { - ahead(100); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(100); // Move back 100 - turnGunRight(360); // Spin gun around - } - } - - /** - * Fire when we see a robot - */ - public void onScannedRobot(ScannedRobotEvent e) { - fire(1); - } - - /** - * We were hit! Turn perpendicular to the bullet, - * so our seesaw might avoid a future shot. - */ - public void onHitByBullet(HitByBulletEvent e) { - turnLeft(90 - e.getBearing()); - } -} - diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/PaintingRobot.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/PaintingRobot.java deleted file mode 100644 index 638d04b..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/PaintingRobot.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.HitByBulletEvent; -import robocode.Robot; -import robocode.ScannedRobotEvent; - -import java.awt.*; - - -/** - * PaintingRobot - a sample robot that demonstrates the onPaint() and - * getGraphics() methods. - * Also demonstrate feature of debugging properties on RobotDialog - *

- * Moves in a seesaw motion, and spins the gun around at each end. - * When painting is enabled for this robot, a red circle will be painted - * around this robot. - * - * @author Stefan Westen (original SGSample) - * @author Pavel Savara (contributor) - */ -public class PaintingRobot extends Robot { - - /** - * PaintingRobot's run method - Seesaw - */ - public void run() { - while (true) { - ahead(100); - turnGunRight(360); - back(100); - turnGunRight(360); - } - } - - /** - * Fire when we see a robot - */ - public void onScannedRobot(ScannedRobotEvent e) { - // demonstrate feature of debugging properties on RobotDialog - setDebugProperty("lastScannedRobot", e.getName() + " at " + e.getBearing() + " degrees at time " + getTime()); - - fire(1); - } - - /** - * We were hit! Turn perpendicular to the bullet, - * so our seesaw might avoid a future shot. - * In addition, draw orange circles where we were hit. - */ - public void onHitByBullet(HitByBulletEvent e) { - // demonstrate feature of debugging properties on RobotDialog - setDebugProperty("lastHitBy", e.getName() + " with power of bullet " + e.getPower() + " at time " + getTime()); - - // show how to remove debugging property - setDebugProperty("lastScannedRobot", null); - - // gebugging by painting to battle view - Graphics2D g = getGraphics(); - - g.setColor(Color.orange); - g.drawOval((int) (getX() - 55), (int) (getY() - 55), 110, 110); - g.drawOval((int) (getX() - 56), (int) (getY() - 56), 112, 112); - g.drawOval((int) (getX() - 59), (int) (getY() - 59), 118, 118); - g.drawOval((int) (getX() - 60), (int) (getY() - 60), 120, 120); - - turnLeft(90 - e.getBearing()); - } - - /** - * Paint a red circle around our PaintingRobot - */ - public void onPaint(Graphics2D g) { - g.setColor(Color.red); - g.drawOval((int) (getX() - 50), (int) (getY() - 50), 100, 100); - g.setColor(new Color(0, 0xFF, 0, 30)); - g.fillOval((int) (getX() - 60), (int) (getY() - 60), 120, 120); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/RamFire.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/RamFire.java deleted file mode 100644 index d33c269..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/RamFire.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.HitRobotEvent; -import robocode.Robot; -import robocode.ScannedRobotEvent; - -import java.awt.*; - - -/** - * RamFire - a sample robot by Mathew Nelson. - *

- * Drives at robots trying to ram them. - * Fires when it hits them. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RamFire extends Robot { - int turnDirection = 1; // Clockwise or counterclockwise - - /** - * run: Spin around looking for a target - */ - public void run() { - // Set colors - setBodyColor(Color.lightGray); - setGunColor(Color.gray); - setRadarColor(Color.darkGray); - - while (true) { - turnRight(5 * turnDirection); - } - } - - /** - * onScannedRobot: We have a target. Go get it. - */ - public void onScannedRobot(ScannedRobotEvent e) { - - if (e.getBearing() >= 0) { - turnDirection = 1; - } else { - turnDirection = -1; - } - - turnRight(e.getBearing()); - ahead(e.getDistance() + 5); - scan(); // Might want to move ahead again! - } - - /** - * onHitRobot: Turn to face robot, fire hard, and ram him again! - */ - public void onHitRobot(HitRobotEvent e) { - if (e.getBearing() >= 0) { - turnDirection = 1; - } else { - turnDirection = -1; - } - turnRight(e.getBearing()); - - // Determine a shot that won't kill the robot... - // We want to ram him instead for bonus points - if (e.getEnergy() > 16) { - fire(3); - } else if (e.getEnergy() > 10) { - fire(2); - } else if (e.getEnergy() > 4) { - fire(1); - } else if (e.getEnergy() > 2) { - fire(.5); - } else if (e.getEnergy() > .4) { - fire(.1); - } - ahead(40); // Ram him again! - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.html b/代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.html deleted file mode 100644 index 9f4d522..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - SittingDuck's Webpage - - - - - -

Hi! I'm a sitting duck.
- - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.java deleted file mode 100644 index 78d7878..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/SittingDuck.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.AdvancedRobot; -import robocode.RobocodeFileOutputStream; - -import java.awt.*; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.io.PrintStream; - - -/** - * SittingDuck - a sample robot by Mathew Nelson. - *

- * Along with sitting still doing nothing, this robot demonstrates persistency. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Andrew Magargle (contributor) - */ -public class SittingDuck extends AdvancedRobot { - static boolean incrementedBattles = false; - - public void run() { - setBodyColor(Color.yellow); - setGunColor(Color.yellow); - - int roundCount, battleCount; - - try { - BufferedReader reader = null; - try { - // Read file "count.dat" which contains 2 lines, a round count, and a battle count - reader = new BufferedReader(new FileReader(getDataFile("count.dat"))); - - // Try to get the counts - roundCount = Integer.parseInt(reader.readLine()); - battleCount = Integer.parseInt(reader.readLine()); - - } finally { - if (reader != null) { - reader.close(); - } - } - } catch (IOException e) { - // Something went wrong reading the file, reset to 0. - roundCount = 0; - battleCount = 0; - } catch (NumberFormatException e) { - // Something went wrong converting to ints, reset to 0 - roundCount = 0; - battleCount = 0; - } - - // Increment the # of rounds - roundCount++; - - // If we haven't incremented # of battles already, - // Note: Because robots are only instantiated once per battle, member variables remain valid throughout it. - if (!incrementedBattles) { - // Increment # of battles - battleCount++; - incrementedBattles = true; - } - - PrintStream w = null; - try { - w = new PrintStream(new RobocodeFileOutputStream(getDataFile("count.dat"))); - - w.println(roundCount); - w.println(battleCount); - - // PrintStreams don't throw IOExceptions during prints, they simply set a flag.... so check it here. - if (w.checkError()) { - out.println("I could not write the count!"); - } - } catch (IOException e) { - out.println("IOException trying to write: "); - e.printStackTrace(out); - } finally { - if (w != null) { - w.close(); - } - } - out.println("I have been a sitting duck for " + roundCount + " rounds, in " + battleCount + " battles."); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/SpinBot.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/SpinBot.java deleted file mode 100644 index 4f4f3d0..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/SpinBot.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.AdvancedRobot; -import robocode.HitRobotEvent; -import robocode.ScannedRobotEvent; - -import java.awt.*; - - -/** - * SpinBot - a sample robot by Mathew Nelson. - *

- * Moves in a circle, firing hard when an enemy is detected. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class SpinBot extends AdvancedRobot { - - /** - * SpinBot's run method - Circle - */ - public void run() { - // Set colors - setBodyColor(Color.blue); - setGunColor(Color.blue); - setRadarColor(Color.black); - setScanColor(Color.yellow); - - // Loop forever - while (true) { - // Tell the game that when we take move, - // we'll also want to turn right... a lot. - setTurnRight(10000); - // Limit our speed to 5 - setMaxVelocity(5); - // Start moving (and turning) - ahead(10000); - // Repeat. - } - } - - /** - * onScannedRobot: Fire hard! - */ - public void onScannedRobot(ScannedRobotEvent e) { - fire(3); - } - - /** - * onHitRobot: If it's our fault, we'll stop turning and moving, - * so we need to turn again to keep spinning. - */ - public void onHitRobot(HitRobotEvent e) { - if (e.getBearing() > -10 && e.getBearing() < 10) { - fire(3); - } - if (e.isMyFault()) { - turnRight(10); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Target.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Target.java deleted file mode 100644 index 0c34b2a..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Target.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.AdvancedRobot; -import robocode.Condition; -import robocode.CustomEvent; - -import java.awt.*; - - -/** - * Target - a sample robot by Mathew Nelson. - *

- * Sits still. Moves every time energy drops by 20. - * This Robot demonstrates custom events. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Target extends AdvancedRobot { - - int trigger; // Keeps track of when to move - - /** - * TrackFire's run method - */ - public void run() { - // Set colors - setBodyColor(Color.white); - setGunColor(Color.white); - setRadarColor(Color.white); - - // Initially, we'll move when life hits 80 - trigger = 80; - // Add a custom event named "trigger hit", - addCustomEvent(new Condition("triggerhit") { - public boolean test() { - return (getEnergy() <= trigger); - } - }); - } - - /** - * onCustomEvent handler - */ - public void onCustomEvent(CustomEvent e) { - // If our custom event "triggerhit" went off, - if (e.getCondition().getName().equals("triggerhit")) { - // Adjust the trigger value, or - // else the event will fire again and again and again... - trigger -= 20; - out.println("Ouch, down to " + (int) (getEnergy() + .5) + " energy."); - // move around a bit. - turnLeft(65); - ahead(100); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/TrackFire.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/TrackFire.java deleted file mode 100644 index 70ca780..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/TrackFire.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.Robot; -import robocode.ScannedRobotEvent; -import robocode.WinEvent; -import static robocode.util.Utils.normalRelativeAngleDegrees; - -import java.awt.*; - - -/** - * TrackFire - a sample robot by Mathew Nelson. - *

- * Sits still. Tracks and fires at the nearest robot it sees. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class TrackFire extends Robot { - - /** - * TrackFire's run method - */ - public void run() { - // Set colors - setBodyColor(Color.pink); - setGunColor(Color.pink); - setRadarColor(Color.pink); - setScanColor(Color.pink); - setBulletColor(Color.pink); - - // Loop forever - while (true) { - turnGunRight(10); // Scans automatically - } - } - - /** - * onScannedRobot: We have a target. Go get it. - */ - public void onScannedRobot(ScannedRobotEvent e) { - // Calculate exact location of the robot - double absoluteBearing = getHeading() + e.getBearing(); - double bearingFromGun = normalRelativeAngleDegrees(absoluteBearing - getGunHeading()); - - // If it's close enough, fire! - if (Math.abs(bearingFromGun) <= 3) { - turnGunRight(bearingFromGun); - // We check gun heat here, because calling fire() - // uses a turn, which could cause us to lose track - // of the other robot. - if (getGunHeat() == 0) { - fire(Math.min(3 - Math.abs(bearingFromGun), getEnergy() - .1)); - } - } // otherwise just set the gun to turn. - // Note: This will have no effect until we call scan() - else { - turnGunRight(bearingFromGun); - } - // Generates another scan event if we see a robot. - // We only need to call this if the gun (and therefore radar) - // are not turning. Otherwise, scan is called automatically. - if (bearingFromGun == 0) { - scan(); - } - } - - public void onWin(WinEvent e) { - // Victory dance - turnRight(36000); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Tracker.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Tracker.java deleted file mode 100644 index 1cdc19c..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Tracker.java +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.HitRobotEvent; -import robocode.Robot; -import robocode.ScannedRobotEvent; -import robocode.WinEvent; -import static robocode.util.Utils.normalRelativeAngleDegrees; - -import java.awt.*; - - -/** - * Tracker - a sample robot by Mathew Nelson. - *

- * Locks onto a robot, moves close, fires when close. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Tracker extends Robot { - int count = 0; // Keeps track of how long we've - // been searching for our target - double gunTurnAmt; // How much to turn our gun when searching - String trackName; // Name of the robot we're currently tracking - - /** - * run: Tracker's main run function - */ - public void run() { - // Set colors - setBodyColor(new Color(128, 128, 50)); - setGunColor(new Color(50, 50, 20)); - setRadarColor(new Color(200, 200, 70)); - setScanColor(Color.white); - setBulletColor(Color.blue); - - // Prepare gun - trackName = null; // Initialize to not tracking anyone - setAdjustGunForRobotTurn(true); // Keep the gun still when we turn - gunTurnAmt = 10; // Initialize gunTurn to 10 - - // Loop forever - while (true) { - // turn the Gun (looks for enemy) - turnGunRight(gunTurnAmt); - // Keep track of how long we've been looking - count++; - // If we've haven't seen our target for 2 turns, look left - if (count > 2) { - gunTurnAmt = -10; - } - // If we still haven't seen our target for 5 turns, look right - if (count > 5) { - gunTurnAmt = 10; - } - // If we *still* haven't seen our target after 10 turns, find another target - if (count > 11) { - trackName = null; - } - } - } - - /** - * onScannedRobot: Here's the good stuff - */ - public void onScannedRobot(ScannedRobotEvent e) { - - // If we have a target, and this isn't it, return immediately - // so we can get more ScannedRobotEvents. - if (trackName != null && !e.getName().equals(trackName)) { - return; - } - - // If we don't have a target, well, now we do! - if (trackName == null) { - trackName = e.getName(); - out.println("Tracking " + trackName); - } - // This is our target. Reset count (see the run method) - count = 0; - // If our target is too far away, turn and move toward it. - if (e.getDistance() > 150) { - gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading())); - - turnGunRight(gunTurnAmt); // Try changing these to setTurnGunRight, - turnRight(e.getBearing()); // and see how much Tracker improves... - // (you'll have to make Tracker an AdvancedRobot) - ahead(e.getDistance() - 140); - return; - } - - // Our target is close. - gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading())); - turnGunRight(gunTurnAmt); - fire(3); - - // Our target is too close! Back up. - if (e.getDistance() < 100) { - if (e.getBearing() > -90 && e.getBearing() <= 90) { - back(40); - } else { - ahead(40); - } - } - scan(); - } - - /** - * onHitRobot: Set him as our new target - */ - public void onHitRobot(HitRobotEvent e) { - // Only print if he's not already our target. - if (trackName != null && !trackName.equals(e.getName())) { - out.println("Tracking " + e.getName() + " due to collision"); - } - // Set the target - trackName = e.getName(); - // Back up a bit. - // Note: We won't get scan events while we're doing this! - // An AdvancedRobot might use setBack(); execute(); - gunTurnAmt = normalRelativeAngleDegrees(e.getBearing() + (getHeading() - getRadarHeading())); - turnGunRight(gunTurnAmt); - fire(3); - back(50); - } - - /** - * onWin: Do a victory dance - */ - public void onWin(WinEvent e) { - for (int i = 0; i < 50; i++) { - turnRight(30); - turnLeft(30); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/VelociRobot.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/VelociRobot.java deleted file mode 100644 index 8eadf8b..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/VelociRobot.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.HitByBulletEvent; -import robocode.HitWallEvent; -import robocode.RateControlRobot; -import robocode.ScannedRobotEvent; - - -/** - * This is a sample of a robot using the RateControlRobot class - * - * @author Joshua Galecki (original) - */ -public class VelociRobot extends RateControlRobot { - - int turnCounter; - public void run() { - - turnCounter = 0; - setGunRotationRate(15); - - while (true) { - if (turnCounter % 64 == 0) { - // Straighten out, if we were hit by a bullet and are turning - setTurnRate(0); - // Go forward with a velocity of 4 - setVelocityRate(4); - } - if (turnCounter % 64 == 32) { - // Go backwards, faster - setVelocityRate(-6); - } - turnCounter++; - execute(); - } - } - - public void onScannedRobot(ScannedRobotEvent e) { - fire(1); - } - - public void onHitByBullet(HitByBulletEvent e) { - // Turn to confuse the other robot - setTurnRate(5); - } - - public void onHitWall(HitWallEvent e) { - // Move away from the wall - setVelocityRate(-1 * getVelocityRate()); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Walls.java b/代码/workspace_robo4/robocode.samples/src/main/java/sample/Walls.java deleted file mode 100644 index f122c7b..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sample/Walls.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sample; - - -import robocode.HitRobotEvent; -import robocode.Robot; -import robocode.ScannedRobotEvent; - -import java.awt.*; - - -/** - * Walls - a sample robot by Mathew Nelson, and maintained by Flemming N. Larsen - *

- * Moves around the outer edge with the gun facing in. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class Walls extends Robot { - - boolean peek; // Don't turn if there's a robot there - double moveAmount; // How much to move - - /** - * run: Move around the walls - */ - public void run() { - // Set colors - setBodyColor(Color.black); - setGunColor(Color.black); - setRadarColor(Color.orange); - setBulletColor(Color.cyan); - setScanColor(Color.cyan); - - // Initialize moveAmount to the maximum possible for this battlefield. - moveAmount = Math.max(getBattleFieldWidth(), getBattleFieldHeight()); - // Initialize peek to false - peek = false; - - // turnLeft to face a wall. - // getHeading() % 90 means the remainder of - // getHeading() divided by 90. - turnLeft(getHeading() % 90); - ahead(moveAmount); - // Turn the gun to turn right 90 degrees. - peek = true; - turnGunRight(90); - turnRight(90); - - while (true) { - // Look before we turn when ahead() completes. - peek = true; - // Move up the wall - ahead(moveAmount); - // Don't look now - peek = false; - // Turn to the next wall - turnRight(90); - } - } - - /** - * onHitRobot: Move away a bit. - */ - public void onHitRobot(HitRobotEvent e) { - // If he's in front of us, set back up a bit. - if (e.getBearing() > -90 && e.getBearing() < 90) { - back(100); - } // else he's in back of us, so set ahead a bit. - else { - ahead(100); - } - } - - /** - * onScannedRobot: Fire! - */ - public void onScannedRobot(ScannedRobotEvent e) { - fire(2); - // Note that scan is called automatically when the robot is moving. - // By calling it manually here, we make sure we generate another scan event if there's a robot on the next - // wall, so that we do not start moving up it until it's gone. - if (peek) { - scan(); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Alien.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Alien.java deleted file mode 100644 index b963ca6..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Alien.java +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleex; - - -import robocode.*; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.peer.IBasicRobotPeer; -import robocode.robotinterfaces.peer.IStandardRobotPeer; - -import java.io.PrintStream; - - -/** - * A sample robot. - * Is not inherited from classic base robots, uses new experimental access to RobotPeer. - * Use -DEXPERIMENTAL=true to start robocode for this robot. - * - * @author Pavel Savara (original) - */ -public class Alien implements IBasicEvents, IBasicRobot, Runnable { - - PrintStream out; - IStandardRobotPeer peer; - - public Runnable getRobotRunnable() { - return this; - } - - public IBasicEvents getBasicEventListener() { - return this; - } - - public void setPeer(IBasicRobotPeer iRobotPeer) { - peer = (IStandardRobotPeer) iRobotPeer; - } - - public void setOut(PrintStream printStream) { - out = printStream; - } - - public void run() { - while (true) { - peer.move(100); // Move ahead 100 - peer.turnGun(Math.PI * 2); // Spin gun around - peer.move(-100); // Move back 100 - peer.turnGun(Math.PI * 2); // Spin gun around - } - } - - public void onScannedRobot(ScannedRobotEvent e) { - peer.setFire(1); - } - - public void onHitByBullet(HitByBulletEvent e) { - peer.turnBody(Math.PI / 2 + e.getBearingRadians()); - } - - public void onStatus(StatusEvent e) {} - - public void onBulletHit(BulletHitEvent e) {} - - public void onBulletHitBullet(BulletHitBulletEvent e) {} - - public void onBulletMissed(BulletMissedEvent e) {} - - public void onDeath(DeathEvent e) {} - - public void onHitRobot(HitRobotEvent e) {} - - public void onHitWall(HitWallEvent e) {} - - public void onRobotDeath(RobotDeathEvent e) {} - - public void onWin(WinEvent e) {} -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/AlienComposition.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/AlienComposition.java deleted file mode 100644 index 6e0f113..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/AlienComposition.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleex; - - -import robocode.*; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IBasicRobot; -import robocode.robotinterfaces.peer.IBasicRobotPeer; -import robocode.robotinterfaces.peer.IStandardRobotPeer; - -import java.io.PrintStream; - - -/** - * A sample robot. - * Is not inherited from classic base robots, uses new experimental access to RobotPeer. - * Use -DEXPERIMENTAL=true to start robocode for this robot. - * This composition version is showing possible decomposition of robot, main runnable and event handler to different classes. - * - * @author Pavel Savara (original) - */ -public class AlienComposition implements IBasicRobot { - PrintStream out; - IStandardRobotPeer peer; - final AlienMain main; - final AlienEventHandler handler; - - public AlienComposition() { - main = new AlienMain(); - handler = new AlienEventHandler(); - } - - public void setPeer(IBasicRobotPeer iRobotPeer) { - peer = (IStandardRobotPeer) iRobotPeer; - } - - public void setOut(PrintStream printStream) { - out = printStream; - } - - public Runnable getRobotRunnable() { - return main; - } - - public IBasicEvents getBasicEventListener() { - return handler; - } - - class AlienMain implements Runnable { - public void run() { - while (true) { - peer.move(100); // Move ahead 100 - peer.turnGun(Math.PI * 2); // Spin gun around - peer.move(-100); // Move back 100 - peer.turnGun(Math.PI * 2); // Spin gun around - } - } - } - - - class AlienEventHandler implements IBasicEvents { - public void onScannedRobot(ScannedRobotEvent e) { - peer.setFire(1); - } - - public void onHitByBullet(HitByBulletEvent e) { - peer.turnBody(Math.PI / 2 + e.getBearingRadians()); - } - - public void onStatus(StatusEvent e) {} - - public void onBulletHit(BulletHitEvent e) {} - - public void onBulletHitBullet(BulletHitBulletEvent e) {} - - public void onBulletMissed(BulletMissedEvent e) {} - - public void onDeath(DeathEvent e) {} - - public void onHitRobot(HitRobotEvent e) {} - - public void onHitWall(HitWallEvent e) {} - - public void onRobotDeath(RobotDeathEvent e) {} - - public void onWin(WinEvent e) {} - } -} - diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/MasterAndSlave.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/MasterAndSlave.java deleted file mode 100644 index b862ff5..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/MasterAndSlave.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleex; - - -import robocode.AdvancedRobot; -import robocode.HitByBulletEvent; -import robocode.ScannedRobotEvent; -import robocode.robotinterfaces.IAdvancedEvents; -import robocode.robotinterfaces.IAdvancedRobot; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IInteractiveEvents; -import robocode.robotinterfaces.peer.IBasicRobotPeer; - -import java.io.PrintStream; - - -/** - * @author Pavel Savara (original) - */ -public class MasterAndSlave extends MasterBase implements IAdvancedRobot { - - /** - * This is not showing any aditional qualities over normal MyFirst robot. - * But it could, because architecture is no more tied by inheritance from Robot base class. - */ - public void run() { - while (true) { - ahead(100); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(100); // Move back 100 - turnGunRight(360); // Spin gun around - } - } - - public void onScannedRobot(ScannedRobotEvent e) { - fire(1); - } - - public void onHitByBullet(HitByBulletEvent e) { - turnLeft(90 - e.getBearing()); - } - - public IInteractiveEvents getInteractiveEventListener() { - return null; - } -} - - -/** - * Infrastructure base class, for helpers and boring implementation details - */ -abstract class MasterBase { - - public MasterBase() { - helperRobot = new Slave(this); - } - - private final AdvancedRobot helperRobot; - - public IAdvancedEvents getAdvancedEventListener() { - return helperRobot; - } - - public IInteractiveEvents getSystemEventListener() { - return helperRobot; - } - - public Runnable getRobotRunnable() { - return helperRobot; - } - - public IBasicEvents getBasicEventListener() { - return helperRobot; - } - - public void setPeer(IBasicRobotPeer robotPeer) { - helperRobot.setPeer(robotPeer); - } - - public void setOut(PrintStream printStream) { - helperRobot.setOut(printStream); - } - - public void turnGunRight(double degrees) { - helperRobot.turnGunRight(degrees); - } - - public void turnLeft(double degrees) { - helperRobot.turnLeft(degrees); - } - - public void ahead(double distance) { - helperRobot.ahead(distance); - } - - public void back(double distance) { - helperRobot.back(distance); - } - - public void fire(double power) { - helperRobot.fire(power); - } - - public void onScannedRobot(ScannedRobotEvent e) {} - - public void onHitByBullet(HitByBulletEvent e) {} - - public void run() {} -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/ProxyOfGreyEminence.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/ProxyOfGreyEminence.java deleted file mode 100644 index 9c2864b..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/ProxyOfGreyEminence.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleex; - - -import robocode.AdvancedRobot; -import robocode.HitByBulletEvent; -import robocode.ScannedRobotEvent; - - -/** - * This is just dummy proxy, it's hiding the Eminence and - * giving it more freedom to inherit from Monk rather than from Robot. - * - * @author Pavel Savara (original) - */ -public class ProxyOfGreyEminence extends AdvancedRobot { - private final GreyEminence monk; - - public ProxyOfGreyEminence() { - monk = new GreyEminence(this); - } - - public void onHitByBullet(HitByBulletEvent event) { - monk.onHitByBullet(event); - } - - public void onScannedRobot(ScannedRobotEvent event) { - monk.onScannedRobot(event); - } - - public void run() { - monk.run(); - } -} - - -/** - * The power behind the throne. - */ -class GreyEminence extends RegullarMonk { - private final ProxyOfGreyEminence proxy; - - public GreyEminence(ProxyOfGreyEminence proxy) { - this.proxy = proxy; - } - - /** - * This is not showing any aditional qualities over normal MyFirst robot. - * But it could, because architecture is no more tied by inheritance from Robot base class. - */ - public void run() { - while (true) { - proxy.ahead(100); // Move ahead 100 - proxy.turnGunRight(360); // Spin gun around - proxy.back(100); // Move back 100 - proxy.turnGunRight(360); // Spin gun around - } - } - - public void onScannedRobot(ScannedRobotEvent e) { - proxy.fire(1); - } - - public void onHitByBullet(HitByBulletEvent e) { - proxy.turnLeft(90 - e.getBearing()); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/RegullarMonk.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/RegullarMonk.java deleted file mode 100644 index 253f53c..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/RegullarMonk.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleex; - - -/** - * Monk of a order. Implements anything too boring for Eminence. - * The infractructure base class. - * - * @author Pavel Savara (original) - */ -abstract class RegullarMonk {} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Slave.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Slave.java deleted file mode 100644 index d5e47ab..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleex/Slave.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleex; - - -import robocode.AdvancedRobot; -import robocode.HitByBulletEvent; -import robocode.ScannedRobotEvent; - - -/** - * This is robot derived from AdvancedRobot. - * Only reason to use this inheritance and this class is that external robots are unable to call RobotPeer directly. - * - * @author Pavel Savara (original) - */ -class Slave extends AdvancedRobot { - final MasterBase parent; - - public Slave(MasterBase parent) { - this.parent = parent; - } - - public void run() { - parent.run(); - } - - public void onScannedRobot(ScannedRobotEvent e) { - parent.onScannedRobot(e); - } - - public void onHitByBullet(HitByBulletEvent e) { - parent.onHitByBullet(e); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/samplesentry/BorderGuard.java b/代码/workspace_robo4/robocode.samples/src/main/java/samplesentry/BorderGuard.java deleted file mode 100644 index 8fc6ac7..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/samplesentry/BorderGuard.java +++ /dev/null @@ -1,716 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package samplesentry; - - -import robocode.*; -import robocode.util.Utils; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.geom.Point2D; -import java.util.*; - - -/** - * BorderGuard - is a sample robot that demonstrates how the BorderSentry interface can be used for - * creating a robot that guards the border area of the battle field, and which is efficient against - * robots trying to hide at corners and robots sneaking around near the borders. - *

- * This robot is somewhat advanced due to:
- * 1) it uses linear targeting for predicting how to hit robots that moves in straight lines.
- * 2) it will only fire at a robot, if it figures out that its bullets will do damage to that - * particular robot, e.g. when the robots predicted future position will be within the sentry border - * attack range.
- * 3) it has an efficient scanner that keeps the scan angle as little as possible to get as new - * scanned data for enemy robots as possible.
- * 4) it picks a target robot to fire at, which is the nearest robot our robot will be able to - * damage (by predicting its future position using linear targeting).
- * 5) it only moves along the borders of the battle field and constantly changes its direction, so - * it is not an easy target, and it will try to get as close to its target robot as possible.
- *

- * Lots of improvements can be made to this robot by copying it - making it even stronger. The - * intention with of this sample robot is to serve as a more advanced example of how a AdvancedRobot - * can be made, and how it can be structured as most sample robots are far simpler. - *

- * - * Credits goes to the hard working Robocoders at the RoboWiki. :-) - *

- * - * This robot makes use of the Oldest Scanned melee scanner from the RoboWiki:
- * http://robowiki.net/wiki/Melee_Radar - *

- * - * In addition, it makes use of the Exact Non-iterative Solution for Linear Targeting from the - * RoboWiki:
- * http://robowiki.net/wiki/Linear_Targeting - * - * @author Flemming N. Larsen - * - * @version 1.0 - * - * @since 1.9.0.0 - */ -public class BorderGuard extends AdvancedRobot implements BorderSentry { - - // Constants - final double FIREPOWER = 3; // Max. power => violent as this robot can afford it! - final double HALF_ROBOT_SIZE = 18; // Robot size is 36x36 units, so the half size is 18 units - - // Map containing data for all scanned robots. - // The key to the map is a robot name and the value is an object containing robot data. - final Map enemyMap; - - // Scanning direction, where the radar turns to the right with positive values, and turns - // to the left with negative values. - double scanDir = 1; - - // Oldest scanned robot. Can be null. - RobotData oldestScanned; - - // Target robot for the gun. Can be null meaning that there is currently no target robot. - RobotData target; - - // Last time when the robot shifted its direction - long lastDirectionShift; - - // Current direction, where 1 means ahead (forward) and -1 means back - int direction = 1; - - /** - * Constructs this robot. - */ - public BorderGuard() { - // We initialize a specialized HashMap that uses a linked list for the access order. - // This means that the last accessed robot entry is listed first, when we iterate over its - // values. This robot always sweep the radar towards the oldest scanned robot. - enemyMap = new LinkedHashMap(5, 2, true); - } - - /** - * Main method that is called by the game when the robot engage in the next round of a battle. - */ - @Override - public void run() { - // Do initialization stuff here before the loop - initialize(); - - // Loop forever. If the robot does not take action, the game will disable our robot! - while (true) { - // Handle a single turn... - - // Handle the radar that scans enemy robots - handleRadar(); - // Handle the gun by turning it and fire at our target - handleGun(); - // Move the robot around on the battlefield - moveRobot(); - - // Scan for other robots. Note that this method will execute all pending commands for - // the next turn. Hence, scan() ends the turn for our robot. - scan(); - } - } - - /** - * This method is called by the game when your robot sees another robot, i.e. when the robot's - * radar scan "hits" another robot. - * - * @param scannedRobotEvent - * is a ScannedRobotEvent event. - */ - @Override - public void onScannedRobot(ScannedRobotEvent scannedRobotEvent) { - // Check that the scanned robot is not a sentry robot - if (!scannedRobotEvent.isSentryRobot()) { - // The scanned robot is not a sentry robot... - - // Update the enemy map - updateEnemyMap(scannedRobotEvent); - - // Update the scan direction - updateScanDirection(scannedRobotEvent); - - // Update enemy target positions - updateEnemyTargetPositions(); - } - } - - /** - * This method is called by the game when another robot dies. - * - * @param robotDeathEvent - * is the RobotDeathEvent that occurs, when another robot dies, which contains data - * for the robot that died. - */ - @Override - public void onRobotDeath(RobotDeathEvent robotDeathEvent) { - // Gets the name of the robot that died - final String deadRobotName = robotDeathEvent.getName(); - - // Remove the robot data for the robot that died from the enemy map - enemyMap.remove(deadRobotName); - - // Remove the data entry for the oldest scanned robot, if we have such an entry - if (oldestScanned != null && oldestScanned.name.equals(deadRobotName)) { - oldestScanned = null; - } - if (target != null && target.name.equals(deadRobotName)) { - target = null; - } - } - - /** - * This method is called by the every time the robot is painted. In order to see the painting, - * make sure to enable the Paint button on the robot console for this robot. - * - * @param g - * is the {@link Graphics2D} object, which is the graphics context used for painting - * various shapes like rectangles, circles, lines etc. on top of the battlefield for - * debugging graphics. - */ - @Override - public void onPaint(Graphics2D g) { - // Set the line width to 2 pixels - g.setStroke(new BasicStroke(2f)); - - // Prepare colors for painting the scanned coordinate and target coordinate - Color color1 = new Color(0x00, 0xFF, 0x00, 0x40); // Green with 25% alpha blending - Color color2 = new Color(0xFF, 0xFF, 0x00, 0x40); // Yellow with 25% alhpa blending - - // Paint a two circles for each robot in the enemy map. One circle where the robot was - // scanned the last time, and another circle where our robot must point the gun in order to - // hit it (target coordinate). In addition, a line is drawn between these circles. - for (RobotData robot : enemyMap.values()) { - // Paint the two circles and a line - fillCircle(g, robot.scannedX, robot.scannedY, color1); // scanned coordinate - fillCircle(g, robot.targetX, robot.targetY, color2); // target coordinate - g.setColor(color1); - g.drawLine((int) robot.scannedX, (int) robot.scannedY, (int) robot.targetX, (int) robot.targetY); - } - - // Paint a two circles for the target robot. One circle where the robot was - // scanned the last time, and another circle where our robot must point the gun in order to - // hit it (target coordinate). In addition, a line is drawn between these circles. - if (target != null) { - // Prepare colors for painting the scanned coordinate and target coordinate - color1 = new Color(0xFF, 0x7F, 0x00, 0x40); // Orange with 25% alpha blending - color2 = new Color(0xFF, 0x00, 0x00, 0x80); // Red with 50% alpha blending - - // Paint the two circles and a line - fillCircle(g, target.scannedX, target.scannedY, color1); // scanned coordinate - fillCircle(g, target.targetX, target.targetY, color2); // target coordinate - g.setColor(color1); - g.drawLine((int) target.scannedX, (int) target.scannedY, (int) target.targetX, (int) target.targetY); - } - } - - /** - * Initializes this robot before a new round in a battle. - */ - private void initialize() { - // Let the robot body, gun, and radar turn independently of each other - setAdjustRadarForGunTurn(true); - setAdjustGunForRobotTurn(true); - - // Set robot colors - setBodyColor(new Color(0x5C, 0x33, 0x17)); // Chocolate Brown - setGunColor(new Color(0x45, 0x8B, 0x74)); // Aqua Marine - setRadarColor(new Color(0xD2, 0x69, 0x1E)); // Orange Chocolate - setBulletColor(new Color(0xFF, 0xD3, 0x9B)); // Burly wood - setScanColor(new Color(0xCA, 0xFF, 0x70)); // Olive Green - } - - /** - * This method handles the radar that scans for enemy robots. - */ - private void handleRadar() { - // Set the radar to turn infinitely to the right if the scan direction is positive; - // otherwise the radar is moved to the left, if the scan direction is negative. - // Notice that onScannedRobot(ScannedRobotEvent) is responsible for determining the scan - // direction. - setTurnRadarRightRadians(scanDir * Double.POSITIVE_INFINITY); - } - - /** - * Method that handles the gun be turning it and fire at a target. - */ - private void handleGun() { - // Update our target robot to fire at - updateTarget(); - // Update the gun direction - updateGunDirection(); - // Fires the gun, when it is ready - fireGunWhenReady(); - } - - /** - * Method that moves our robot around the battlefield. - */ - private void moveRobot() { - - // The movement strategy is to move as close to our target robot as possible. - // Our robot should move along the borders all the time, vertically or horizontally. - // When we get close to our target, or have no where to go, our robot should shift its - // direction from side to side so it does not stand still at any time. - // If the robot stands still, it will be an easy target for enemy robots. - - int newDirection = direction; - - // Get closer to our target if we have a target robot - if (target != null) { - // Calculate the range from the walls/borders, our robot should keep within - int borderRange = getSentryBorderSize() - 20; - - // The horizontal and vertical flags are used for determining, if our robot should - // move horizontal or vertical. - boolean horizontal = false; - boolean vertical = false; - - // Initialize the new heading of the robot to the current heading of the robot - double newHeading = getHeadingRadians(); - - // Check if our robot is at the upper or lower border and hence should move horizontally - if (getY() < borderRange || getY() > getBattleFieldHeight() - borderRange) { - horizontal = true; - } - // Check if our robot is at the left or right border and hence should move vertically - if (getX() < borderRange || getX() > getBattleFieldWidth() - borderRange) { - vertical = true; - } - - // If we are in one of the corners of the battlefield, we could move both horizontally - // or vertically. - // In this situation, we need to choose one of the two directions. - if (horizontal && vertical) { - // If the horizontal distance to our target is lesser than the vertical distance, - // then we choose to move vertically, and hence we clear the horizontal flag. - if (Math.abs(target.targetX - getX()) <= Math.abs(target.targetY - getY())) { - horizontal = false; // Do not move horizontally => move vertically - } - } - // Adjust the heading of our robot with 90 degrees, if it must move horizontally. - // Otherwise the calculated heading is towards moving vertically. - if (horizontal) { - newHeading -= Math.PI / 2; - } - // Set the robot to turn left the amount of radians we have just calculated - setTurnLeftRadians(Utils.normalRelativeAngle(newHeading)); - - // Check if our robot has finished turning, i.e. has less than 1 degrees left to turn - if (Math.abs(getTurnRemaining()) < 1 || Math.abs(getVelocity()) < 0.01) { - // If we should move horizontally, the set the robot to move ahead with the - // horizontal distance to the target robot. Otherwise, use the vertical distance. - double delta; // delta is the delta distance to move - if (horizontal) { - delta = target.targetX - getX(); - } else { - delta = target.targetY - getY(); - } - setAhead(delta); - - // Set the new direction of our robot to 1 (meaning move forward) if the delta - // distance is positive; otherwise it is set to -1 (meaning move backward). - newDirection = delta > 0 ? 1 : -1; - - // Check if more than 10 turns have past since we changed the direction the last - // time - if (getTime() - lastDirectionShift > 10) { - // If so, set the new direction to be the reverse direction if the velocity < 1 - if (Math.abs(getVelocity()) < 1) { - newDirection = direction * -1; - } - // Check if the direction really changed - if (newDirection != direction) { - // If the new direction != current direction, then set the current direction - // to be the new direction and save the current time so we know when we - // changed the direction the last time. - direction = newDirection; - lastDirectionShift = getTime(); - } - } - } - } - // Set ahead 100 units forward or backward depending on the direction - setAhead(100 * direction); - } - - /** - * Method the updates the enemy map based on new scan data for a scanned robot. - * - * @param scannedRobotEvent - * is a ScannedRobotEvent event containing data about a scanned robot. - */ - private void updateEnemyMap(ScannedRobotEvent scannedRobotEvent) { - // Gets the name of the scanned robot - final String scannedRobotName = scannedRobotEvent.getName(); - - // Get robot data for the scanned robot, if we have an entry in the enemy map - RobotData scannedRobot = enemyMap.get(scannedRobotName); - - // Check if data entry exists for the scanned robot - if (scannedRobot == null) { - // No data entry exists => Create a new data entry for the scanned robot - scannedRobot = new RobotData(scannedRobotEvent); - // Put the new data entry into the enemy map - enemyMap.put(scannedRobotName, scannedRobot); - } else { - // Data entry exists => Update the current entry with new scanned data - scannedRobot.update(scannedRobotEvent); - } - } - - /** - * Method that updates the direction of the radar based on new scan data for a scanned robot. - * - * @param scannedRobotEvent - * is a ScannedRobotEvent event containing data about a scanned robot. - */ - private void updateScanDirection(ScannedRobotEvent scannedRobotEvent) { - // Gets the name of the scanned robot - final String scannedRobotName = scannedRobotEvent.getName(); - - // Change the scanning direction if and only if we have no record for the oldest scanned - // robot or the scanned robot IS the oldest scanned robot (based on the name) AND the enemy - // map contains scanned data entries for ALL robots (the size of the enemy map is equal to - // the number of opponent robots found by calling the getOthers() method). - if ((oldestScanned == null || scannedRobotName.equals(oldestScanned.name)) && enemyMap.size() == getOthers()) { - - // Get the oldest scanned robot data from our LinkedHashMap, where the first value - // contains the oldest accessed entry, which is the robot we need to get. - RobotData oldestScannedRobot = enemyMap.values().iterator().next(); - - // Get the recent scanned position (x,y) of the oldest scanned robot - double x = oldestScannedRobot.scannedX; - double y = oldestScannedRobot.scannedY; - - // Get the heading of our robot - double ourHeading = getRadarHeadingRadians(); - - // Calculate the bearing to the oldest scanned robot. - // The bearing is the delta angle between the heading of our robot and the other robot, - // which can be a positive or negative angle. - double bearing = bearingTo(ourHeading, x, y); - - // Update the scan direction based on the bearing. - // If the bearing is positive, the radar will be moved to the right. - // If the bearing is negative, the radar will be moved to the left. - scanDir = bearing; - } - } - - /** - * Updates the target positions for all enemies. The target position is the position our robot - * must fire at in order to hit the target robot. This robot uses Linear Targeting (Exact - * Non-iterative Solution) as described on the RoboWiki here: - * http://robowiki.net/wiki/Linear_Targeting - */ - private void updateEnemyTargetPositions() { - // Go thru all robots in the enemy map - for (RobotData enemy : enemyMap.values()) { - - // Variables prefixed with e- refer to enemy and b- refer to bullet - double bV = Rules.getBulletSpeed(FIREPOWER); - double eX = enemy.scannedX; - double eY = enemy.scannedY; - double eV = enemy.scannedVelocity; - double eH = enemy.scannedHeading; - - // These constants make calculating the quadratic coefficients below easier - double A = (eX - getX()) / bV; - double B = (eY - getY()) / bV; - double C = eV / bV * Math.sin(eH); - double D = eV / bV * Math.cos(eH); - - // Quadratic coefficients: a*(1/t)^2 + b*(1/t) + c = 0 - double a = A * A + B * B; - double b = 2 * (A * C + B * D); - double c = (C * C + D * D - 1); - - // If the discriminant of the quadratic formula is >= 0, we have a solution meaning that - // at some time, t, the bullet will hit the enemy robot if we fire at it now. - double discrim = b * b - 4 * a * c; - if (discrim >= 0) { - // Reciprocal of quadratic formula. Calculate the two possible solution for the - // time, t - double t1 = 2 * a / (-b - Math.sqrt(discrim)); - double t2 = 2 * a / (-b + Math.sqrt(discrim)); - - // Choose the minimum positive time or select the one closest to 0, if the time is - // negative - double t = Math.min(t1, t2) >= 0 ? Math.min(t1, t2) : Math.max(t1, t2); - - // Calculate the target position (x,y) for the enemy. That is the point that our gun - // should point at in order to hit the enemy at the time, t. - double targetX = eX + eV * t * Math.sin(eH); - double targetY = eY + eV * t * Math.cos(eH); - - // Assume enemy stops at walls. Hence, we limit that target position at the walls. - double minX = HALF_ROBOT_SIZE; - double minY = HALF_ROBOT_SIZE; - double maxX = getBattleFieldWidth() - HALF_ROBOT_SIZE; - double maxY = getBattleFieldHeight() - HALF_ROBOT_SIZE; - - enemy.targetX = limit(targetX, minX, maxX); - enemy.targetY = limit(targetY, minY, maxY); - } - } - } - - /** - * Updates which enemy robot from the enemy map that should be our current target. - */ - private void updateTarget() { - // Set target to null, meaning that we have no target robot yet - target = null; - - // Create a list over possible target robots that is a copy of robot data from the enemy map - List targets = new ArrayList(enemyMap.values()); - - // Run thru all the possible target robots and remove those that are outside the attack - // range for this border sentry robot as our robot cannot do harm to robots outside its - // range. - Iterator it = targets.iterator(); - while (it.hasNext()) { - RobotData robot = it.next(); - if (isOutsideAttackRange(robot.targetX, robot.targetY)) { - it.remove(); - } - } - - // Set the target robot to be the one among all possible target robots that is closest to - // our robot. - double minDist = Double.POSITIVE_INFINITY; - for (RobotData robot : targets) { - double dist = distanceTo(robot.targetX, robot.targetY); - if (dist < minDist) { - minDist = dist; - target = robot; - } - } - - // If we still haven't got a target robot, then take the first one from our list of target - // robots if the list is not empty. - if (target == null && targets.size() > 0) { - target = targets.get(0); - } - } - - /** - * Method that updates the gun direction to point at the current target. - */ - private void updateGunDirection() { - // Only update the gun direction, if we have a current target - if (target != null) { - // Calculate the bearing between the gun and the target, which can be positive or - // negative - double targetBearing = bearingTo(getGunHeadingRadians(), target.targetX, target.targetY); - // Set the gun to turn right the amount of radians defined by the bearing to the target - setTurnGunRightRadians(targetBearing); // positive => turn right, negative => turn left - } - } - - /** - * Method that fires a bullet when the gun is ready to fire. - */ - private void fireGunWhenReady() { - // We only fire the fun, when we have a target robot - if (target != null) { - // Only fire when the angle of the gun is pointing at our (virtual) target robot - - // Calculate the distance between between our robot and the target robot - double dist = distanceTo(target.targetX, target.targetY); - // Angle that "covers" the the target robot from its center to its edge - double angle = Math.atan(HALF_ROBOT_SIZE / dist); - - // Check if the remaining angle (turn) to move the gun is less than our calculated cover - // angle - if (Math.abs(getGunTurnRemaining()) < angle) { - // If so, our gun should be pointing at our target so we can hit it => fire!! - setFire(FIREPOWER); - } - } - } - - /** - * Method that checks if a coordinate (x,y) is outside the Border Sentry's attack range. - * - * @param x - * is the x coordinate. - * @param y - * is the y coordinate. - * @return true if the coordinate is outside the attack range; false otherwise. - */ - private boolean isOutsideAttackRange(double x, double y) { - double minBorderX = getSentryBorderSize(); - double minBorderY = getSentryBorderSize(); - double maxBorderX = getBattleFieldWidth() - getSentryBorderSize(); - double maxBorderY = getBattleFieldHeight() - getSentryBorderSize(); - - return (x > minBorderX) && (y > minBorderY) && (x < maxBorderX) && (y < maxBorderY); - } - - /** - * Method that returns a value that is guaranteed to be within a value range defined by a - * minimum and maximum value based on an input value.
- * If the input value is lesser than the minimum value, the returned value will be set to the - * minimum value.
- * If the input value is greater than the maximum value, the returned value will be set to the - * maximum value.
- * Otherwise the returned value will be equal to the input value. - * - * @param value - * is the input value to limit. - * @param min - * is the allowed minimum value. - * @param max - * is the allowed maximum value. - * @return the limited input value that is guaranteed to be within the specified minimum and - * maximum range. - */ - private double limit(double value, double min, double max) { - return Math.min(max, Math.max(min, value)); - } - - /** - * Methods that returns the distance to a coordinate (x,y) from our robot. - * - * @param x - * is the x coordinate. - * @param y - * is the y coordinate. - * @return the distance to the coordinate (x,y). - */ - private double distanceTo(double x, double y) { - return Math.hypot(x - getX(), y - getY()); - } - - /** - * Method that returns the angle to a coordinate (x,y) from our robot. - * - * @param x - * is the x coordinate. - * @param y - * is the y coordinate. - * @return the angle to the coordinate (x,y). - */ - private double angleTo(double x, double y) { - return Math.atan2(x - getX(), y - getY()); - } - - /** - * Method that returns the bearing to a coordinate (x,y) from the position and heading of our - * robot. The bearing is the delta angle between the heading of our robot and the angle of the - * specified coordinate. - * - * @param x - * is the x coordinate. - * @param y - * is the y coordinate. - * @return the angle to the coordinate (x,y). - */ - private double bearingTo(double heading, double x, double y) { - return Utils.normalRelativeAngle(angleTo(x, y) - heading); - } - - /** - * Method that paints a filled circle at the specified coordinate (x,y) and given color. The - * circle will have a radius of 20 pixels (meaning that the diameter will be 40 pixels). - * - * @param gfx - * is the graphics context to draw within. - * @param x - * is the x coordinate for the center of the circle. - * @param y - * is the y coordinate for the center of the circle. - * @param color - * is the color of the filled circle. - */ - private void fillCircle(Graphics2D gfx, double x, double y, Color color) { - // Set the pen color - gfx.setColor(color); - // Paint a filled circle (oval) that has a radius of 20 pixels with a center at the input - // coordinates. - gfx.fillOval((int) x - 20, (int) y - 20, 40, 40); - } - - /** - * This class is used for storing data about a robot that has been scanned.
- * The data is mainly a snapshot of specific scanned data like the scanned position (x,y), - * velocity and heading, put also the calculated predicted target position of the robot when our - * robot needs to fire at the scanned robot.
- * Note that this class calculates the position (x,y) of the scanned robot as our robot moves, - * and hence data like the angle and distance to the scanned robot will change over time. by - * using the position, it is easy to calculate a new angle and distance to the robot. - */ - class RobotData { - final String name; // name of the scanned robot - double scannedX; // x coordinate of the scanned robot based on the last update - double scannedY; // y coordinate of the scanned robot based on the last update - double scannedVelocity; // velocity of the scanned robot from the last update - double scannedHeading; // heading of the scanned robot from the last update - double targetX; // predicated x coordinate to aim our gun at, when firing at the robot - double targetY; // predicated y coordinate to aim our gun at, when firing at the robot - - /** - * Creates a new robot data entry based on new scan data for a scanned robot. - * - * @param event - * is a ScannedRobotEvent event containing data about a scanned robot. - */ - RobotData(ScannedRobotEvent event) { - // Store the name of the scanned robot - name = event.getName(); - // Updates all scanned facts like position, velocity, and heading - update(event); - // Initialize the coordinates (x,y) to fire at to the updated scanned position - targetX = scannedX; - targetY = scannedY; - } - - /** - * Updates the scanned data based on new scan data for a scanned robot. - * - * @param event - * is a ScannedRobotEvent event containing data about a scanned robot. - */ - void update(ScannedRobotEvent event) { - // Get the position of the scanned robot based on the ScannedRobotEvent - Point2D.Double pos = getPosition(event); - // Store the scanned position (x,y) - scannedX = pos.x; - scannedY = pos.y; - // Store the scanned velocity and heading - scannedVelocity = event.getVelocity(); - scannedHeading = event.getHeadingRadians(); - } - - /** - * Returns the position of the scanned robot based on new scan data for a scanned robot. - * - * @param event - * is a ScannedRobotEvent event containing data about a scanned robot. - * @return the position (x,y) of the scanned robot. - */ - Point2D.Double getPosition(ScannedRobotEvent event) { - // Gets the distance to the scanned robot - double distance = event.getDistance(); - // Calculate the angle to the scanned robot (our robot heading + bearing to scanned - // robot) - double angle = getHeadingRadians() + event.getBearingRadians(); - - // Calculate the coordinates (x,y) of the scanned robot - double x = getX() + Math.sin(angle) * distance; - double y = getY() + Math.cos(angle) * distance; - - // Return the position as a point (x,y) - return new Point2D.Double(x, y); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstDroid.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstDroid.java deleted file mode 100644 index c57d0d2..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstDroid.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleteam; - - -import robocode.Droid; -import robocode.MessageEvent; -import robocode.TeamRobot; -import static robocode.util.Utils.normalRelativeAngleDegrees; - - -/** - * SimpleDroid - a sample robot by Mathew Nelson. - *

- * Follows orders of team leader. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class MyFirstDroid extends TeamRobot implements Droid { - - /** - * run: Droid's default behavior - */ - public void run() { - out.println("MyFirstDroid ready."); - } - - /** - * onMessageReceived: What to do when our leader sends a message - */ - public void onMessageReceived(MessageEvent e) { - // Fire at a point - if (e.getMessage() instanceof Point) { - Point p = (Point) e.getMessage(); - // Calculate x and y to target - double dx = p.getX() - this.getX(); - double dy = p.getY() - this.getY(); - // Calculate angle to target - double theta = Math.toDegrees(Math.atan2(dx, dy)); - - // Turn gun to target - turnGunRight(normalRelativeAngleDegrees(theta - getGunHeading())); - // Fire hard! - fire(3); - } // Set our colors - else if (e.getMessage() instanceof RobotColors) { - RobotColors c = (RobotColors) e.getMessage(); - - setBodyColor(c.bodyColor); - setGunColor(c.gunColor); - setRadarColor(c.radarColor); - setScanColor(c.scanColor); - setBulletColor(c.bulletColor); - } - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstLeader.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstLeader.java deleted file mode 100644 index 140a94a..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/MyFirstLeader.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleteam; - - -import robocode.HitByBulletEvent; -import robocode.ScannedRobotEvent; -import robocode.TeamRobot; - -import java.awt.*; -import java.io.IOException; - - -/** - * MyFirstLeader - a sample team robot by Mathew Nelson. - *

- * Looks around for enemies, and orders teammates to fire - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class MyFirstLeader extends TeamRobot { - - /** - * run: Leader's default behavior - */ - public void run() { - // Prepare RobotColors object - RobotColors c = new RobotColors(); - - c.bodyColor = Color.red; - c.gunColor = Color.red; - c.radarColor = Color.red; - c.scanColor = Color.yellow; - c.bulletColor = Color.yellow; - - // Set the color of this robot containing the RobotColors - setBodyColor(c.bodyColor); - setGunColor(c.gunColor); - setRadarColor(c.radarColor); - setScanColor(c.scanColor); - setBulletColor(c.bulletColor); - try { - // Send RobotColors object to our entire team - broadcastMessage(c); - } catch (IOException ignored) {} - // Normal behavior - while (true) { - setTurnRadarRight(10000); - ahead(100); - back(100); - } - } - - /** - * onScannedRobot: What to do when you see another robot - */ - public void onScannedRobot(ScannedRobotEvent e) { - // Don't fire on teammates - if (isTeammate(e.getName())) { - return; - } - // Calculate enemy bearing - double enemyBearing = this.getHeading() + e.getBearing(); - // Calculate enemy's position - double enemyX = getX() + e.getDistance() * Math.sin(Math.toRadians(enemyBearing)); - double enemyY = getY() + e.getDistance() * Math.cos(Math.toRadians(enemyBearing)); - - try { - // Send enemy position to teammates - broadcastMessage(new Point(enemyX, enemyY)); - } catch (IOException ex) { - out.println("Unable to send order: "); - ex.printStackTrace(out); - } - } - - /** - * onHitByBullet: Turn perpendicular to bullet path - */ - public void onHitByBullet(HitByBulletEvent e) { - turnLeft(90 - e.getBearing()); - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/Point.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/Point.java deleted file mode 100644 index 79f9c1b..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/Point.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleteam; - - -/** - * Point - a serializable point class - */ -public class Point implements java.io.Serializable { - - private static final long serialVersionUID = 1L; - - private double x = 0.0; - private double y = 0.0; - - public Point(double x, double y) { - this.x = x; - this.y = y; - } - - public double getX() { - return x; - } - - public double getY() { - return y; - } -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/RobotColors.java b/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/RobotColors.java deleted file mode 100644 index 079bc60..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/java/sampleteam/RobotColors.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package sampleteam; - - -import java.awt.*; - - -/** - * RobotColors - A serializable class to send Colors to teammates. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobotColors implements java.io.Serializable { - - private static final long serialVersionUID = 1L; - - public Color bodyColor; - public Color gunColor; - public Color radarColor; - public Color scanColor; - public Color bulletColor; -} diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Corners.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Corners.properties deleted file mode 100644 index 86a295d..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Corners.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:14:27 EST 2006 -robot.description=\ A sample robot\n Moves to a corner, then swings the gun back and forth.\n If it dies, it tries a new corner in the next round. -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.Corners -robot.name=Corners diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Crazy.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Crazy.properties deleted file mode 100644 index adc9001..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Crazy.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:16:04 EST 2006 -robot.description=\ A sample robot\n\n Moves around in a crazy pattern -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.Crazy -robot.name=Crazy diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Fire.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Fire.properties deleted file mode 100644 index db0f3a7..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Fire.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:16:33 EST 2007 -robot.description=\ A sample robot\n\n Sits still. Spins gun around. Moves when hit. Ooh\! -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.Fire -robot.name=Fire diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive.properties deleted file mode 100644 index 66603d1..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Wed Jun 27 23:08:48 EST 2007 -robot.description=\ A sample robot\n\n This is a robot that is controlled using the arrow keys and mouse only -robot.webpage= -robocode.version=1.3.4 -robot.java.source.included=true -robot.author.name=Flemming N. Larsen -robot.classname=sample.Interactive -robot.name=Interactive \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive_v2.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive_v2.properties deleted file mode 100644 index aab1784..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Interactive_v2.properties +++ /dev/null @@ -1,8 +0,0 @@ -#Robot Properties -robot.description=\ A sample robot\n\n This is a robot that is controlled using the arrow keys and mouse only -robot.webpage= -robocode.version=1.3.4 -robot.java.source.included=true -robot.author.name=Tuan Anh Nguyen and Flemming N. Larsen -robot.classname=sample.Interactive_v2 -robot.name=Interactive_v2 \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstJuniorRobot.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstJuniorRobot.properties deleted file mode 100644 index 2cafbdc..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstJuniorRobot.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Jul 29 00:07:28 EST 2007 -robot.description=\ A sample robot\n Moves in a seesaw motion, and spins the gun around at each end\n Moves perpendicular to the direction of a bullet that hits it -robot.webpage= -robocode.version=1.4 -robot.java.source.included=true -robot.author.name=Flemming N. Larsen -robot.classname=sample.MyFirstJuniorRobot -robot.name=MyFirstJuniorRobot \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstRobot.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstRobot.properties deleted file mode 100644 index 1d298da..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/MyFirstRobot.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Fri Nov 02 17:17:44 EST 2001 -robot.description=\ A sample robot\n Moves in a seesaw motion, and spins the gun around at each end\n Turns perpendicular to the direction of a bullet that hits it -robot.webpage=http\://robocode.sourceforge.net/myfirstrobot/MyFirstRobot.html -robocode.version=1.0 -robot.java.source.included=true -robot.author.name=Mathew Nelson -robot.classname=sample.MyFirstRobot -robot.name=MyFirstRobot diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/PaintingRobot.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/PaintingRobot.properties deleted file mode 100644 index df0c29e..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/PaintingRobot.properties +++ /dev/null @@ -1,10 +0,0 @@ -#Robot Properties -#Sat Apr 12 14:47:44 EST 2008 -robot.description=\ A sample robot\n Demonstrates how to do custom painting and debugging properties. -robot.webpage= -robocode.version=1.6 -robot.java.source.included=true -robot.author.name=Stefan Westen -robot.classname=sample.PaintingRobot -robot.name=PaintingRobot - diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/RamFire.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/RamFire.properties deleted file mode 100644 index e48d0d4..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/RamFire.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:17:21 EST 2007 -robot.description=\ A sample robot\n Drives at robots trying to ram them.\n Fires when it hits them. -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.RamFire -robot.name=RamFire diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/SittingDuck.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/SittingDuck.properties deleted file mode 100644 index c3aab1e..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/SittingDuck.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:18:07 EST 2007 -robot.description=\ A sample robot\nThis robot sits still, and waits to be fired upon. Exciting stuff\!\nAlso counts how many times he has been a sitting duck. -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.SittingDuck -robot.name=SittingDuck diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/SpinBot.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/SpinBot.properties deleted file mode 100644 index c80fa0b..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/SpinBot.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:18:07 EST 2006 -robot.description=\ A sample robot\n\n Moves in a circle, firing hard when an enemy is detected -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.SpinBot -robot.name=SpinBot diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Target.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Target.properties deleted file mode 100644 index 4537956..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Target.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:18:46 EST 2006 -robot.description=\ A sample robot\n Sits still. Moves every time energy drops by 20.\n This Robot demonstrates custom events. -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.Target -robot.name=Target diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/TrackFire.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/TrackFire.properties deleted file mode 100644 index be9b3e8..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/TrackFire.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:21:08 EST 2006 -robot.description=\ A sample robot\n\n Tracks and fires at the nearest robot it sees -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.TrackFire -robot.name=TrackFire diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Tracker.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Tracker.properties deleted file mode 100644 index 1e510a5..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Tracker.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:20:26 EST 2006 -robot.description=\ A sample robot\n\n Locks onto a robot, moves close, fires when close. -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.Tracker -robot.name=Tracker diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/VelociRobot.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/VelociRobot.properties deleted file mode 100644 index a48dbb8..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/VelociRobot.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Tue May 27 14:21:08 EST 2009 -robot.description=\ A sample robot\n\n Demonstrates the RateControlRobot -robot.webpage= -robocode.version=1.7.1.3 -robot.java.source.included=true -robot.author.name=Joshua Galecki -robot.classname=sample.VelociRobot -robot.name=VelociRobot diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Walls.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Walls.properties deleted file mode 100644 index 7549037..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sample/Walls.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Aug 20 21:21:53 EST 2006 -robot.description=\ A sample robot\n\n Moves around the outer edge with the gun facing in -robot.webpage= -robocode.version=1.1.2 -robot.java.source.included=true -robot.author.name=Mathew Nelson and Flemming N. Larsen -robot.classname=sample.Walls -robot.name=Walls diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/Alien.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/Alien.properties deleted file mode 100644 index 292c411..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/Alien.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Feb 20 21:16:33 EST 2008 -robot.description=\ A sample robot\n\n Is not inherited from classic base robots,\n uses new experimental access to RobotPeer. -robot.webpage=zamboch.blogspot.com -robocode.version=1.6 -robot.java.source.included=true -robot.author.name=Pavel Savara -robot.classname=sampleex.Alien -robot.name=Alien diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/MasterAndSlave.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/MasterAndSlave.properties deleted file mode 100644 index 539d240..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/MasterAndSlave.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Feb 20 21:16:33 EST 2008 -robot.description=\ A sample robot\n\n Is not inherited from classic base robots,\n uses new experimental access to RobotPeer. -robot.webpage=zamboch.blogspot.com -robocode.version=1.6 -robot.java.source.included=true -robot.author.name=Pavel Savara -robot.classname=sampleex.MasterAndSlave -robot.name=MasterAndSlave diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/ProxyOfGreyEminence.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/ProxyOfGreyEminence.properties deleted file mode 100644 index e47c5a0..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleex/ProxyOfGreyEminence.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sun Feb 20 21:16:33 EST 2008 -robot.description=\ A sample robot\n\n Is not inherited from classic base robots,\n uses new experimental access to RobotPeer. -robot.webpage=zamboch.blogspot.com -robocode.version=1.6 -robot.java.source.included=true -robot.author.name=Pavel Savara -robot.classname=sampleex.ProxyOfGreyEminence -robot.name=ProxyOfGreyEminence diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/samplesentry/BorderGuard.properties b/代码/workspace_robo4/robocode.samples/src/main/resources/samplesentry/BorderGuard.properties deleted file mode 100644 index 4224bae..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/samplesentry/BorderGuard.properties +++ /dev/null @@ -1,9 +0,0 @@ -#Robot Properties -#Sat May 25 22:15:07 EST 2013 -robot.description=\ A sample robot\n\n This is a robot that guards the borders of the battlefield\n\nUse it against \"wall crawlers\" like e.g. sample.Walls and sample.Corners -robot.webpage= -robocode.version=1.9.0.0 -robot.java.source.included=true -robot.author.name=Flemming N. Larsen -robot.classname=samplesentry.BorderGuard -robot.name=BorderGuard \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleteam/MyFirstTeam.team b/代码/workspace_robo4/robocode.samples/src/main/resources/sampleteam/MyFirstTeam.team deleted file mode 100644 index f9878e8..0000000 --- a/代码/workspace_robo4/robocode.samples/src/main/resources/sampleteam/MyFirstTeam.team +++ /dev/null @@ -1,7 +0,0 @@ -#Robocode robot team -#Sun Aug 20 23:26:53 EST 2006 -team.members=sampleteam.MyFirstLeader,sampleteam.MyFirstDroid,sampleteam.MyFirstDroid,sampleteam.MyFirstDroid,sampleteam.MyFirstDroid -team.author.name=Mathew Nelson and Flemming N. Larsen -robocode.version=1.1.2 -team.webpage= -team.description=\ A sample team.\n MyFirstLeader scans for enemies,\n and orders the 4 droids to fire. diff --git a/代码/workspace_robo4/robocode.sound/.classpath b/代码/workspace_robo4/robocode.sound/.classpath deleted file mode 100644 index f924dfd..0000000 --- a/代码/workspace_robo4/robocode.sound/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.sound/.project b/代码/workspace_robo4/robocode.sound/.project deleted file mode 100644 index d9a53a7..0000000 --- a/代码/workspace_robo4/robocode.sound/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - robocode.sound - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.core - robocode.api - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.sound/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.sound/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.sound/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.sound/pom.xml b/代码/workspace_robo4/robocode.sound/pom.xml deleted file mode 100644 index b10ad26..0000000 --- a/代码/workspace_robo4/robocode.sound/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - robocode.sound - Robocode Sound - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.core - ${project.version} - - - diff --git a/代码/workspace_robo4/robocode.sound/robocode.sound.iml b/代码/workspace_robo4/robocode.sound/robocode.sound.iml deleted file mode 100644 index be8c06b..0000000 --- a/代码/workspace_robo4/robocode.sound/robocode.sound.iml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/Module.java b/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/Module.java deleted file mode 100644 index 2cb58c0..0000000 --- a/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/Module.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.sound; - - -import net.sf.robocode.core.BaseModule; -import net.sf.robocode.core.Container; - - -/** - * @author Pavel Savara (original) - */ -public class Module extends BaseModule { - static { - Container.cache.addComponent(ISoundManager.class, SoundManager.class); - } -} diff --git a/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundCache.java b/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundCache.java deleted file mode 100644 index fae8191..0000000 --- a/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundCache.java +++ /dev/null @@ -1,219 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.sound; - - -import net.sf.robocode.io.Logger; - -import javax.sound.sampled.*; -import java.io.IOException; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; - - -/** - * SoundCache maintains a table of sound clips. More than one instance of the same - * sample can be stored, so a given sound effect can be played more than once - * symultaneously. - * - * @author Luis Crespo (original) - * @author Flemming N. Larsen (contributor) - */ -class SoundCache { - - /** - * Table containing all sound clips - */ - private final Map soundTable; - - /** - * Mixer used for creating clip instances - */ - private final Mixer mixer; - - /** - * Holds data, length and format for a given sound effect, which can be used to create - * multiple instances of the same clip. - */ - private static class SoundData { - private final AudioFormat format; - private final int length; - private final byte[] byteData; - - private SoundData(AudioInputStream ais) throws IOException { - int bytesRead, pos; - - format = ais.getFormat(); - length = (int) (ais.getFrameLength() * format.getFrameSize()); - byteData = new byte[length]; - pos = 0; - - do { - bytesRead = ais.read(byteData, pos, length - pos); - if (bytesRead > 0) { - pos += bytesRead; - } - } while (bytesRead > 0 && pos < length); - - ais.close(); - } - } - - - /** - * Holds an array of clips from the same sample stream, and takes care of - * returning the next available clip. If all clips are active, the least - * recently used clip will be returned. - */ - private static class ClipClones { - private final Clip[] clips; - private int idx; - - private ClipClones(Mixer mixer, SoundData soundData, int size) throws LineUnavailableException { - idx = 0; - clips = new Clip[size]; - - DataLine.Info info = new DataLine.Info(Clip.class, soundData.format); - - if (!AudioSystem.isLineSupported(info)) { - throw new LineUnavailableException("Required data line is not supported by the audio system"); - } - - for (int i = 0; i < size; i++) { - clips[i] = (Clip) mixer.getLine(info); - clips[i].open(soundData.format, soundData.byteData, 0, soundData.length); - } - } - - private void dispose() { - for (Clip c : clips) { - c.close(); - } - } - - private Clip next() { - Clip c = clips[idx]; - - idx = (idx + 1) % clips.length; - c.stop(); - c.setFramePosition(0); - return c; - } - } - - /** - * Constructs a sound cache to hold sound clips that is created based on the - * specified mixer. - * - * @param mixer the mixer to be used for creating the clip instances - */ - public SoundCache(Mixer mixer) { - this.mixer = mixer; - soundTable = new HashMap(); - } - - /** - * Adds a number of clip clones for a given resource holding the audio data. - * If there is any error, the method returns silently, and clip instances will - * not be found later for the provided key. - * - * @param key the key to be used for later retrieval of the sound - * @param resourceName the resource holding the audio data - * @param numClones the number of copies of the clip to be created - */ - public void addSound(Object key, String resourceName, int numClones) { - if (mixer == null || resourceName == null || (resourceName.trim().length() == 0)) { - return; - } - - SoundData data = createSoundData(resourceName); - - if (data == null) { - return; - } - - ClipClones clones; - - try { - clones = new ClipClones(mixer, data, numClones); - soundTable.put(key, clones); - } catch (LineUnavailableException e) { - Logger.logError( - "The audio mixer " + mixer.getMixerInfo().getName() - + " does not support the audio format of the sound clip: " + resourceName); - } - } - - /** - * Creates an instance of SoundData, to be used later for creating the clip clones. - * - * @param resourceName the name of the resource holding the audio data - * @return the newly created sound data - */ - private SoundData createSoundData(String resourceName) { - SoundData data; - URL url = SoundCache.class.getResource(resourceName); - - if (url == null) { - Logger.logError("Could not load sound because of invalid resource name: " + resourceName); - return null; - } - try { - AudioInputStream ais = AudioSystem.getAudioInputStream(url); - - data = new SoundData(ais); - } catch (Exception e) { - Logger.logError("Error while reading sound from resource: " + resourceName, e); - data = null; - } - return data; - } - - /** - * Gets the next available clip instance of a given sound. If all clips for that - * sound are active (playing), the least recently used will be returned. - * - * @param key the key that was used when adding the sound - * @return a clip instance ready to be played through Clip.start() - */ - public Clip getSound(Object key) { - ClipClones clones = soundTable.get(key); - - if (clones == null) { - return null; - } - return clones.next(); - } - - /** - * Removes all clip copies of a given sound, closing all its dependent resources - * - * @param key the key that was used when adding the sound - */ - public void removeSound(Object key) { - ClipClones clones = soundTable.get(key); - - if (clones == null) { - return; - } - clones.dispose(); - - soundTable.remove(key); - } - - /** - * Empties all clips from the sound cache - */ - public void clear() { - for (ClipClones clones : soundTable.values()) { - clones.dispose(); - } - soundTable.clear(); - } -} diff --git a/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundManager.java b/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundManager.java deleted file mode 100644 index 9886d13..0000000 --- a/代码/workspace_robo4/robocode.sound/src/main/java/net/sf/robocode/sound/SoundManager.java +++ /dev/null @@ -1,376 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.sound; - - -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.settings.ISettingsListener; -import net.sf.robocode.settings.ISettingsManager; -import robocode.control.events.BattleAdaptor; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.BattleStartedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IBulletSnapshot; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.RobotState; - -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.Clip; -import javax.sound.sampled.FloatControl; -import javax.sound.sampled.Mixer; - - -/** - * The sound manager is responsible of keeping a table of sound effects and - * play the appropriate sound for each bullet or robot event that is supposed - * to make any noise. - * - * @author Luis Crespo (original) - * @author Flemming N. Larsen (contributor) - * @author Titus Chen (contributor) - */ -public class SoundManager implements ISoundManager { - - // Cache containing sound clips - private SoundCache sounds; - - // Access to properties - private final ISettingsManager properties; - private final IBattleManager battleManager; - private boolean isSoundEnabled = true; - BattleObserver observer; - - public SoundManager(final ISettingsManager properties, IBattleManager battleManager) { - this.battleManager = battleManager; - this.properties = properties; - if (isSoundEnabled()) { - observer = new BattleObserver(); - battleManager.addListener(observer); - } - - properties.addPropertyListener(new ISettingsListener() { - public void settingChanged(String property) { - if (property.equals(ISettingsManager.OPTIONS_SOUND_ENABLESOUND)) { - updateListener(); - } - } - }); - - } - - /** - * Returns the current mixer selected from the Robocode properties. - * - * @return the current Mixer instance - */ - public Mixer getMixer() { - return findMixer(properties.getOptionsSoundMixer()); - } - - private boolean isSoundEnabled() { - return isSoundEnabled && properties.getOptionsSoundEnableSound(); - } - - public void setEnableSound(boolean enable) { - isSoundEnabled = enable; - updateListener(); - } - - private void updateListener() { - if (observer == null && isSoundEnabled()) { - observer = new BattleObserver(); - battleManager.addListener(observer); - } else if (observer != null && !isSoundEnabled()) { - battleManager.removeListener(observer); - observer = null; - } - } - - /** - * Returns the cache containing sound clips. - * - * @return a SoundCache instance - */ - private SoundCache getSounds() { - if (sounds == null) { - sounds = new SoundCache(getMixer()); - - // Sound effects - sounds.addSound("gunshot", properties.getFileGunshotSfx(), 5); - sounds.addSound("robot death", properties.getRobotDeathSfx(), 3); - sounds.addSound("bullet hits robot", properties.getBulletHitsRobotSfx(), 3); - sounds.addSound("bullet hits bullet", properties.getBulletHitsBulletSfx(), 2); - sounds.addSound("robot collision", properties.getRobotCollisionSfx(), 2); - sounds.addSound("wall collision", properties.getWallCollisionSfx(), 2); - - // Music - sounds.addSound("theme", properties.getFileThemeMusic(), 1); - sounds.addSound("background", properties.getFileBackgroundMusic(), 1); - sounds.addSound("endOfBattle", properties.getFileEndOfBattleMusic(), 1); - } - return sounds; - } - - /** - * Iterates over the available mixers, looking for the one that matches a given - * class name. - * - * @param mixerClassName the class name of the mixer to be used. - * @return the requested mixer, if found. Otherwise, it returns null. - */ - private Mixer findMixer(String mixerClassName) { - if (mixerClassName == null) { - return null; - } - for (Mixer.Info mi : AudioSystem.getMixerInfo()) { - Mixer m = AudioSystem.getMixer(mi); - - if (m.getClass().getSimpleName().equals(mixerClassName)) { - return m; - } - } - return null; - } - - /** - * Performs shutdown, by liberating the sound table - */ - public void dispose() { - if (sounds != null) { // Do not call getSounds()! - sounds.clear(); - } - } - - /** - * Plays a specific sound at a given volume, panning and loop count - * - * @param key the sound name, as stored in the sound table - * @param pan panning to be used (-1=left, 0=middle, +1=right) - * @param volume volume to be used, from 0 to 1 - * @param loop the number of times to loop the sound - */ - private void playSound(Object key, float pan, float volume, int loop) { - Clip c = getSounds().getSound(key); - - if (c == null) { - return; - } - - if (properties.getOptionsSoundEnableMixerPan() && c.isControlSupported(FloatControl.Type.PAN)) { - FloatControl panCtrl = (FloatControl) c.getControl(FloatControl.Type.PAN); - - panCtrl.setValue(pan); - } - if (properties.getOptionsSoundEnableMixerVolume() && c.isControlSupported(FloatControl.Type.MASTER_GAIN)) { - FloatControl volCtrl = (FloatControl) c.getControl(FloatControl.Type.MASTER_GAIN); - - float min = volCtrl.getMinimum() / 4; - - if (volume != 1) { - volCtrl.setValue(min * (1 - volume)); - } - } - c.loop(loop); - } - - /** - * Plays a specific sound at a given panning with max. volume and without looping. - * - * @param key the sound name, as stored in the sound table - * @param pan panning to be used (-1=left, 0=middle, +1=right) - */ - private void playSound(Object key, float pan) { - playSound(key, pan, 1, 0); - } - - /** - * Plays a specific piece of music with a given loop count with no panning and - * max. volume. - * - * @param key the sound name, as stored in the sound table - * @param loop the number of times to loop the music - */ - private void playMusic(Object key, int loop) { - playSound(key, 0, 1, loop); - } - - /** - * Plays a bullet sound depending on the bullet's state - * - * @param bp the bullet peer - * @param battleFieldWidth the width of the battle field used for panning. - */ - public void playBulletSound(IBulletSnapshot bp, int battleFieldWidth) { - float pan = 0; - - if (properties.getOptionsSoundEnableMixerPan()) { - pan = calcPan((float) bp.getPaintX(), battleFieldWidth); - } - switch (bp.getState()) { - case FIRED: - if (properties.getOptionsSoundEnableGunshot()) { - playSound("gunshot", pan, calcBulletVolume(bp), 0); - } - break; - - case HIT_VICTIM: - if (properties.getOptionsSoundEnableBulletHit()) { - playSound("bullet hits robot", pan); - } - break; - - case HIT_BULLET: - if (properties.getOptionsSoundEnableBulletHit()) { - playSound("bullet hits bullet", pan); - } - break; - - case HIT_WALL: - // Currently, no sound - break; - - case EXPLODED: - if (properties.getOptionsSoundEnableRobotDeath()) { - playSound("robot death", pan); - } - break; - - default: - } - } - - /** - * Plays a robot sound depending on the robot's state - * - * @param robotPeer the robot peer - * @param battleFieldWidth the battle field width used for panning - */ - public void playRobotSound(IRobotSnapshot robotPeer, int battleFieldWidth) { - float pan = 0; - - if (properties.getOptionsSoundEnableMixerPan()) { - pan = calcPan((float) robotPeer.getX(), battleFieldWidth); - } - switch (robotPeer.getState()) { - case HIT_ROBOT: - if (properties.getOptionsSoundEnableRobotCollision()) { - playSound("robot collision", pan); - } - break; - - case HIT_WALL: - if (properties.getOptionsSoundEnableWallCollision()) { - playSound("wall collision", pan); - } - break; - - default: - } - } - - /** - * Plays the theme music once. - */ - public void playThemeMusic() { - if (isSoundEnabled()) { - playMusic("theme", 0); - } - } - - /** - * Plays the background music, which is looping forever until stopped. - */ - public void playBackgroundMusic() { - playMusic("background", -1); - } - - /** - * Stops the background music. - */ - public void stopBackgroundMusic() { - Clip c = getSounds().getSound("background"); - - if (c != null) { - c.stop(); - } - } - - /** - * Plays the end of battle music once. - */ - public void playEndOfBattleMusic() { - playMusic("endOfBattle", 0); - } - - /** - * Determines pan based on the relative position to the battlefield's width - * - * @param x the bullet or robot position - * @param width the battlefield's width - * @return the panning value, ranging from -1 to +1 - */ - private float calcPan(float x, float width) { - float semiWidth = width / 2; - - return (x - semiWidth) / semiWidth; - } - - /** - * Determines volume based on the bullets's energy - * - * @param bp the bullet peer - * @return the volume value, ranging from 0 to 1 - */ - private float calcBulletVolume(IBulletSnapshot bp) { - return (float) (bp.getPower() / robocode.Rules.MAX_BULLET_POWER); - } - - private class BattleObserver extends BattleAdaptor { - @Override - public void onBattleStarted(BattleStartedEvent event) { - if (isSoundEnabled()) { - playBackgroundMusic(); - } - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - stopBackgroundMusic(); - if (isSoundEnabled()) { - playEndOfBattleMusic(); - } - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - if (isSoundEnabled()) { - int battleFieldWidth = battleManager.getBattleProperties().getBattlefieldWidth(); - - for (IBulletSnapshot bp : event.getTurnSnapshot().getBullets()) { - if (bp.getFrame() == 0) { - playBulletSound(bp, battleFieldWidth); - } - } - - boolean playedRobotHitRobot = false; - - for (IRobotSnapshot rp : event.getTurnSnapshot().getRobots()) { - // Make sure that robot-hit-robot events do not play twice (one per colliding robot) - if (rp.getState() == RobotState.HIT_ROBOT) { - if (playedRobotHitRobot) { - continue; - } - playedRobotHitRobot = true; - } - - playRobotSound(rp, battleFieldWidth); - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/13831_adcbicycle_22.wav b/代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/13831_adcbicycle_22.wav deleted file mode 100644 index a721580df68c3da6f4d4df54ffc5b9d00d1a4ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74240 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 diff --git a/代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/shellhit.wav b/代码/workspace_robo4/robocode.sound/src/main/resources/net/sf/robocode/sound/sounds/shellhit.wav deleted file mode 100644 index c077a22f520d2c76de28e4790bea05f1b8755b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46496 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 diff --git a/代码/workspace_robo4/robocode.tests.robots/.classpath b/代码/workspace_robo4/robocode.tests.robots/.classpath deleted file mode 100644 index fa51e61..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.tests.robots/.project b/代码/workspace_robo4/robocode.tests.robots/.project deleted file mode 100644 index e9d65ce..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - robocode.tests.robots - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.samples - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.tests.robots/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.tests.robots/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.tests.robots/pom.xml b/代码/workspace_robo4/robocode.tests.robots/pom.xml deleted file mode 100644 index 4c61b0f..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - robocode.tests.robots - Robocode Tested Robots - - robocode - net.sf.robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.samples - ${project.version} - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - unpack-dependencies - test - - unpack-dependencies - - - sample*/** - ${project.build.directory}/classes - - - - - - - diff --git a/代码/workspace_robo4/robocode.tests.robots/robocode.tests.robots.iml b/代码/workspace_robo4/robocode.tests.robots/robocode.tests.robots.iml deleted file mode 100644 index d39c655..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/robocode.tests.robots.iml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger.java deleted file mode 100644 index 002d5f8..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -import robocode.Robot; - - -/** - * @author Pavel Savara (original) - */ -public class NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger extends Robot { - @Override - public void run() { - while (true) { - ahead(1); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(1); // Move back 100 - turnGunRight(360); // Spin gun around - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageShortName.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageShortName.java deleted file mode 100644 index ccc98f9..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/NoPackageShortName.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -import robocode.Robot; - - -/** - * @author Pavel Savara (original) - */ -public class NoPackageShortName extends Robot { - @Override - public void run() { - while (true) { - ahead(1); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(1); // Move back 100 - turnGunRight(360); // Spin gun around - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/robocode/BadNamespace.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/robocode/BadNamespace.java deleted file mode 100644 index d18c589..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/robocode/BadNamespace.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package robocode; - - -/** - * @author Pavel Savara (original) - */ -public class BadNamespace extends Robot { - @Override - public void run() { - while (true) { - ahead(1); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(1); // Move back 100 - turnGunRight(360); // Spin gun around - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Ahead.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Ahead.java deleted file mode 100644 index 67d4bd8..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Ahead.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; - - -/** - * @author Pavel Savara (original) - */ -public class Ahead extends AdvancedRobot { - - @Override - public void run() { - ahead(100); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/AwtAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/AwtAttack.java deleted file mode 100644 index 5722779..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/AwtAttack.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.ScannedRobotEvent; - -import javax.swing.*; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - - -/** - * @author Pavel Savara (original) - */ -public class AwtAttack extends AdvancedRobot { - - @Override - public void run() { - // noinspection InfiniteLoopStatement - for (;;) { - turnLeft(100); - ahead(10); - turnLeft(100); - back(10); - } - } - - @Override - public void onScannedRobot(ScannedRobotEvent event) { - awtAttack(); - } - - private void awtAttack() { - try { - Runnable doHack = new Runnable() { - public void run() { - writeAttack(); - - JFrame frame; - - frame = new JFrame(); - frame.setName("Hack"); - frame.setVisible(true); - - } - }; - - javax.swing.SwingUtilities.invokeLater(doHack); - } catch (RuntimeException e) { - // swalow security exception - e.printStackTrace(out); - } - } - - private void writeAttack() { - FileOutputStream fs; - - try { - fs = new FileOutputStream("C:\\Robocode.attack"); - fs.write(0xBA); - fs.write(0xDF); - fs.write(0x00); - fs.write(0xD0); - fs.close(); - out.println("Hacked!!!"); - } catch (FileNotFoundException e) { - e.printStackTrace(out); - } catch (IOException e) { - e.printStackTrace(out); - } catch (RuntimeException e) { - // swalow security exception - e.printStackTrace(out); - } - } - -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BadFirePower.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BadFirePower.java deleted file mode 100644 index 7bdd393..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BadFirePower.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.Bullet; - - -/** - * From Bug 2410856 - * @author Pavel Savara (original) - */ -public class BadFirePower extends AdvancedRobot { - - public void run() { - while (true) { - Bullet bullet = setFireBullet(getTime() - 12.0); - - if (bullet != null) { - out.println(getTime() + " Bullet power: " + bullet.getPower()); - } else { - out.println(getTime() + " No bullet"); - } - execute(); - } - } - -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleLost.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleLost.java deleted file mode 100644 index 35226d9..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleLost.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.BattleEndedEvent; -import robocode.DeathEvent; -import robocode.Robot; -import robocode.WinEvent; - - -/** - * @author Pavel Savara (original) - */ -public class BattleLost extends Robot { - @Override - public void run() { - while (true) { - ahead(1); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(1); // Move back 100 - turnGunRight(360); // Spin gun around - } - } - - @Override - public void onWin(WinEvent e) { - out.println("Win!"); - } - - @Override - public void onDeath(DeathEvent e) { - out.println("Death!"); - } - - @Override - public void onBattleEnded(BattleEndedEvent event) { - out.println("BattleEnded!"); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleWin.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleWin.java deleted file mode 100644 index b37d4c1..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BattleWin.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.*; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class BattleWin extends Robot { - - @Override - public void run() { - while (true) { - ahead(100); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(100); // Move back 100 - turnGunRight(360); // Spin gun around - } - } - - @Override - public void onScannedRobot(ScannedRobotEvent e) { - fire(1); - } - - @Override - public void onHitByBullet(HitByBulletEvent e) { - turnLeft(90 - e.getBearing()); - } - - @Override - public void onWin(WinEvent e) { - out.println("Win!"); - } - - @Override - public void onDeath(DeathEvent e) { - out.println("Death!"); - } - - @Override - public void onRoundEnded(RoundEndedEvent event) { - out.println("RoundEnded!"); - } - - @Override - public void onBattleEnded(BattleEndedEvent event) { - out.println("BattleEnded!"); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BodyTurnRate.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BodyTurnRate.java deleted file mode 100644 index 7bed86e..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/BodyTurnRate.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -/** - * @author Flemming N. Larsen (original) - */ -public class BodyTurnRate extends robocode.AdvancedRobot { - - public void run() { - // Test turn rate at all speed moving ahead and turning left - - setAhead(1000); - setTurnLeft(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - - // Test turn rate at all speed moving ahead and turning right - - setAhead(1000); - setTurnRight(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - - // Test turn rate at all speed moving back and turning right - - setBack(1000); - setTurnRight(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - - // Test turn rate at all speed moving back and turning left - - setBack(1000); - setTurnLeft(360); - executeAndDumpTurnRate9turns(); - - stopMoving(); - } - - private void executeAndDumpTurnRate9turns() { - for (int i = 0; i < 9; i++) { - executeAndDumpTurnRate(); - } - } - - private void executeAndDumpTurnRate() { - double lastHeading = getHeading(); - double lastVelocity = getVelocity(); - - execute(); - - double turnRate = robocode.util.Utils.normalRelativeAngleDegrees(getHeading() - lastHeading); - - out.println(getTime() + ": " + lastVelocity + ", " + turnRate); - } - - private void stopMoving() { - setAhead(0); - setTurnLeft(0); - - for (int i = 0; i < 6; i++) { - executeAndDumpTurnRate(); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorAwtAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorAwtAttack.java deleted file mode 100644 index 47ae244..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorAwtAttack.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import javax.swing.*; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - - -/** - * @author Flemming N. Larsen (original) - */ -public class ConstructorAwtAttack extends robocode.AdvancedRobot { - - public ConstructorAwtAttack() { - awtAttack(); - } - - private void awtAttack() { - try { - Runnable doHack = new Runnable() { - public void run() { - writeAttack(); - - JFrame frame; - - frame = new JFrame(); - frame.setName("Hack"); - frame.setVisible(true); - - } - }; - - javax.swing.SwingUtilities.invokeLater(doHack); - } catch (RuntimeException e) { - // swallow security exception - e.printStackTrace(out); - } - } - - private void writeAttack() { - FileOutputStream fs; - - try { - fs = new FileOutputStream("C:\\Robocode.attack"); - fs.write(0xBA); - fs.write(0xDF); - fs.write(0x00); - fs.write(0xD0); - fs.close(); - out.println("Hacked!!!"); - } catch (FileNotFoundException e) { - e.printStackTrace(out); - } catch (IOException e) { - e.printStackTrace(out); - } catch (RuntimeException e) { - // swallow security exception - e.printStackTrace(out); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorHttpAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorHttpAttack.java deleted file mode 100644 index c124fea..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorHttpAttack.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; - - -/** - * @author Flemming N. Larsen (original) - */ -public class ConstructorHttpAttack extends AdvancedRobot { - - static final String HTTP_ADDR = "http://robocode.sourceforge.net/"; - - public ConstructorHttpAttack() { - try { - URL url = new URL(HTTP_ADDR); - - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - - if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream is = conn.getInputStream(); - - is.read(); - } - } catch (IOException e) { - e.printStackTrace(out); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorReflectionAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorReflectionAttack.java deleted file mode 100644 index c884f07..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorReflectionAttack.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.lang.reflect.*; - - -/** - * @author Flemming N. Larsen (original) - */ -public class ConstructorReflectionAttack extends robocode.AdvancedRobot { - - static ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - static { - try { - Field field = System.class.getField("out"); - - field.setAccessible(true); - Object obj = field.get(null); - Method method = obj.getClass().getMethod("print", new Class[] { String.class }); - - method.setAccessible(true); - method.invoke(obj, new Object[] { "Hello World" }); - - } catch (Exception e) { - // The stack trace from the exception is redirected to a temporary buffer, - // which is read and written out to the robot's output in the run() method. - - PrintStream ps = new PrintStream(baos); - - e.printStackTrace(ps); - ps.flush(); - } - } - - public void run() { - // Write out the buffered output - out.append(baos.toString()); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorSocketAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorSocketAttack.java deleted file mode 100644 index a509dae..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorSocketAttack.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import java.io.*; -import java.net.*; - - -/** - * @author Flemming N. Larsen (original) - */ -public class ConstructorSocketAttack extends AdvancedRobot { - - static ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - static { - ServerSocket server = null; - Socket client = null; - - try { - server = new ServerSocket(9999); - client = server.accept(); - - InputStream is = new DataInputStream(client.getInputStream()); - OutputStream os = new PrintStream(client.getOutputStream()); - - os.write(1); - is.read(); - } catch (IOException e) { - // The stack trace from the exception is redirected to a temporary buffer, - // which is read and written out to the robot's output in the run() method. - - PrintStream ps = new PrintStream(baos); - - e.printStackTrace(ps); - ps.flush(); - } finally { - if (server != null) { - try { - server.close(); - } catch (IOException e) {} - } - if (client != null) { - try { - client.close(); - } catch (IOException e) {} - } - } - } - - public void run() { - // Write out the buffered output - out.append(baos.toString()); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorThreadAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorThreadAttack.java deleted file mode 100644 index 0c5a0f8..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorThreadAttack.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -/** - * @author Flemming N. Larsen (original) - */ -public class ConstructorThreadAttack extends robocode.AdvancedRobot { - - public ConstructorThreadAttack() { - runAttack(); - runAttack2(); - } - - private void runAttack() { - try { - Attacker a = new Attacker(); - Thread t = new Thread(a); - - t.start(); - } catch (RuntimeException e) { - // swallow security exception - e.printStackTrace(out); - } - } - - private void runAttack2() { - try { - Attacker a = new Attacker(); - ThreadGroup tg = new ThreadGroup("MyAttack"); - - tg.setMaxPriority(10); - Thread t = new Thread(tg, a); - - t.start(); - } catch (RuntimeException e) { - // swallow security exception - e.printStackTrace(out); - } - } - - private class Attacker implements Runnable { - - public synchronized void run() { - if (Thread.currentThread().getPriority() > 4) { - out.println("Priority attack"); - } - runAttack2(); - - try { - this.wait(); - } catch (InterruptedException e) {} - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/CustomEvents.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/CustomEvents.java deleted file mode 100644 index 7cc0415..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/CustomEvents.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.Condition; -import robocode.CustomEvent; -import robocode.ScannedRobotEvent; - - -/** - * @author Pavel Savara (original) - */ -public class CustomEvents extends AdvancedRobot { - @Override - public void run() { - - addCustomEvent(new Condition("onTick99", 99) { - public boolean test() { - return true; - } - }); - - addCustomEvent(new Condition("onTick30", 30) { - public boolean test() { - return true; - } - }); - - addCustomEvent(new Condition("onLowEnergy98", 98) { - public boolean test() { - return getEnergy() < 20; - } - }); - while (true) { - ahead(100); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(100); // Move back 100 - turnGunRight(360); // Spin gun around - } - } - - public void onCustomEvent(CustomEvent e) { - out.println(getTime() + " " + e.getCondition().getName()); - } - - public void onScannedRobot(ScannedRobotEvent e) { - out.println(getTime() + " onScannedRobot10"); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat1.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat1.java deleted file mode 100644 index 77ef9cc..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat1.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; - - -/** - * This test robot is based on Eric Simonton's 3 caveats on the RoboWiki - * where Robocode did not work as expected when updating the robot movements - * with deceleration. - * - * @author Flemming N. Larsen (original) - */ -public class DecelerationCaveat1 extends AdvancedRobot { - - @Override - public void run() { - setAhead(100); - for (int i = 1; i <= 8; i++) { - execute(); - } - - setAhead(22.8); - for (int i = 1; i <= 5; i++) { - execute(); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat2.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat2.java deleted file mode 100644 index 72beece..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat2.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; - - -/** - * This test robot is based on Eric Simonton's 3 caveats on the RoboWiki - * where Robocode did not work as expected when updating the robot movements - * with deceleration. - * - * @author Flemming N. Larsen (original) - */ -public class DecelerationCaveat2 extends AdvancedRobot { - - @Override - public void run() { - setAhead(100); - for (int i = 1; i <= 8; i++) { - execute(); - } - - setAhead(22.5); - for (int i = 1; i <= 6; i++) { - execute(); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat3.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat3.java deleted file mode 100644 index 3fa6a50..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DecelerationCaveat3.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; - - -/** - * This test robot is based on Eric Simonton's 3 caveats on the RoboWiki - * where Robocode did not work as expected when updating the robot movements - * with deceleration. - * - * @author Flemming N. Larsen (original) - */ -public class DecelerationCaveat3 extends AdvancedRobot { - - @Override - public void run() { - setAhead(100); - for (int i = 1; i <= 8; i++) { - execute(); - } - - setAhead(-200); - setMaxVelocity(7); - execute(); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DieFast.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DieFast.java deleted file mode 100644 index 580309c..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/DieFast.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.Robot; -import robocode.exception.RobotException; - - -/** - * @author Pavel Savara (original) - */ -public class DieFast extends Robot { - public void run() { - throw new RobotException(); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EnvAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EnvAttack.java deleted file mode 100644 index d662243..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EnvAttack.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; - - -/** - * @author Pavel Savara (original) - */ -public class EnvAttack extends AdvancedRobot { - @Override - public void run() { - - // attack - System.setProperty("NOSECURITY", "true"); - - // noinspection InfiniteLoopStatement - for (;;) { - turnLeft(100); - ahead(10); - turnLeft(100); - back(10); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EventPriorityFilter.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EventPriorityFilter.java deleted file mode 100644 index 5e7ab7a..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/EventPriorityFilter.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.HitWallEvent; -import robocode.ScannedRobotEvent; - - -/** - * @author Pavel Savara (original) - */ -public class EventPriorityFilter extends AdvancedRobot { - - @Override - public void run() { - // noinspection InfiniteLoopStatement - for (;;) { - ahead(10); // make sure we eventually hits a wall to receive onHitWall - } - } - - @Override - public void onScannedRobot(ScannedRobotEvent event) { - out.println("Scanned!!!"); // a robot was scanned -> problem! - } - - @Override - public void onHitWall(HitWallEvent e) { - // when the radar is turned here, at least another robot should be scanned - // but event should not be dispatched because we are in handler with higher priority - turnRadarRight(360); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FairPlay.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FairPlay.java deleted file mode 100644 index 1de6b99..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FairPlay.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.*; - - -/** - * @author Nat Pavasant (original) - */ -public class FairPlay extends AdvancedRobot { - public void run() { - setTurnRadarRightRadians(1d / 0d); - } - - public void onScannedRobot(ScannedRobotEvent e) { - setTurnRadarLeft(getRadarTurnRemaining()); - setTurnGunRightRadians( - robocode.util.Utils.normalRelativeAngle(e.getBearingRadians() + getHeadingRadians() - getGunHeadingRadians())); - setFire(3); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileAttack.java deleted file mode 100644 index 9f76ccf..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileAttack.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.ScannedRobotEvent; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - - -/** - * @author Pavel Savara (original) - */ -public class FileAttack extends AdvancedRobot { - - @Override - public void run() { - // noinspection InfiniteLoopStatement - for (;;) { - turnLeft(100); - ahead(10); - turnLeft(100); - back(10); - } - } - - @Override - public void onScannedRobot(ScannedRobotEvent event) { - readAttack(); - writeAttack(); - } - - private void readAttack() { - try { - FileInputStream fs = new FileInputStream("C:\\MSDOS.SYS"); - - System.out.print(fs.read()); - System.out.print(fs.read()); - System.out.print(fs.read()); - System.out.print(fs.read()); - fs.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(out); - } catch (IOException e) { - e.printStackTrace(out); - } catch (RuntimeException e) { - // swalow security exception - e.printStackTrace(out); - } - } - - private void writeAttack() { - FileOutputStream fs; - - try { - fs = new FileOutputStream("C:\\Robocode.attack"); - fs.write(0xBA); - fs.write(0xDF); - fs.write(0x00); - fs.write(0xD0); - fs.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(out); - } catch (IOException e) { - e.printStackTrace(out); - } catch (RuntimeException e) { - // swalow security exception - e.printStackTrace(out); - } - } - -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileOutputStreamAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileOutputStreamAttack.java deleted file mode 100644 index 689f1ae..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileOutputStreamAttack.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - - -/** - * @author Flemming N. Larsen (original) - */ -public class FileOutputStreamAttack extends AdvancedRobot { - - public void run() { - File file = null; - FileOutputStream fis = null; - try { - file = getDataFile("test"); - fis = new FileOutputStream(file); - fis.write(1); - } catch (IOException e) { - e.printStackTrace(out); - } finally { - if (fis != null) { - try { - fis.close(); - } catch (IOException ignore) {} - } - if (file != null) { - file.delete(); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileWriteSize.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileWriteSize.java deleted file mode 100644 index ed89564..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileWriteSize.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.RobocodeFileOutputStream; -import java.io.File; -import java.io.IOException; - - -/** - * @author Flemming N. Larsen (original) - */ -public class FileWriteSize extends AdvancedRobot { - - public void run() { - out.println("Data directory: " + getDataDirectory()); - out.println("Data quota: " + getDataQuotaAvailable()); - - byte[] buf = new byte[100000]; - - File file = null; - RobocodeFileOutputStream rfos = null; - - try { - file = getDataFile("test"); - out.println("Data file: " + file.getCanonicalPath()); - file.delete(); - - rfos = new RobocodeFileOutputStream(file); - - for (int i = 0; i < 3; i++) { - rfos.write(buf); - } - } catch (IOException e) { - e.printStackTrace(out); - } finally { - if (rfos != null) { - try { - rfos.close(); - } catch (IOException e) { - e.printStackTrace(out); - } - } - if (file != null) { - if (!file.delete()) { - out.println("Could not delete the file: " + file); - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunHeat.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunHeat.java deleted file mode 100644 index 06ce045..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunHeat.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; - - -/** - * @author Pavel Savara (original) - * From bug 2405844 - */ -public class GunHeat extends AdvancedRobot { - - public void run() { - while (true) { - setFireBullet(3.0); - out.println(getTime() + " gunHeat after fire: " + getGunHeat()); - execute(); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunTurnRate.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunTurnRate.java deleted file mode 100644 index 3b265aa..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/GunTurnRate.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -/** - * @author Flemming N. Larsen (original) - */ -public class GunTurnRate extends robocode.AdvancedRobot { - public void run() { - setMaxTurnRate(5); - - setTurnGunLeft(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - setTurnGunRight(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - setTurnLeft(Double.POSITIVE_INFINITY); - setTurnGunLeft(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - setTurnRight(Double.POSITIVE_INFINITY); - setTurnGunRight(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - setMaxTurnRate(20); - - setTurnLeft(Double.POSITIVE_INFINITY); - setTurnGunLeft(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - setTurnRight(Double.POSITIVE_INFINITY); - setTurnGunRight(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - setAdjustGunForRobotTurn(false); - - setTurnRight(Double.POSITIVE_INFINITY); - setTurnGunLeft(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - - setTurnLeft(Double.POSITIVE_INFINITY); - setTurnGunRight(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - executeAndDumpTurnRate(); - } - - private void executeAndDumpTurnRate() { - double lastHeading = getGunHeading(); - - execute(); - - double turnRate = robocode.util.Utils.normalRelativeAngleDegrees(getGunHeading() - lastHeading); - - out.println(getTime() + ": " + turnRate); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/HttpAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/HttpAttack.java deleted file mode 100644 index ea0c97c..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/HttpAttack.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; - - -/** - * @author Flemming N. Larsen (original) - */ -public class HttpAttack extends AdvancedRobot { - - static final String HTTP_ADDR = "http://robocode.sourceforge.net/"; - - public void run() { - try { - URL url = new URL(HTTP_ADDR); - - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - - if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream is = conn.getInputStream(); - - is.read(); - } - } catch (IOException e) { - e.printStackTrace(out); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/IncludeNamespaceAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/IncludeNamespaceAttack.java deleted file mode 100644 index c5ecdb9..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/IncludeNamespaceAttack.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import net.sf.robocode.security.HiddenAccess; -import robocode.AdvancedRobot; -import robocode.ScannedRobotEvent; - - -/** - * @author Pavel Savara (original) - */ -public class IncludeNamespaceAttack extends AdvancedRobot { - - @Override - public void run() { - // noinspection InfiniteLoopStatement - for (;;) { - turnLeft(100); - ahead(10); - turnLeft(100); - back(10); - } - } - - @Override - public void onScannedRobot(ScannedRobotEvent event) { - namespaceAttack(); - } - - private void namespaceAttack() { - try { - HiddenAccess.createRules(10, 10, 10, 10, 1, false, 100); - } catch (RuntimeException e) { - // Swallow security exception - e.printStackTrace(out); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/InteruptibleEvent.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/InteruptibleEvent.java deleted file mode 100644 index d3a306f..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/InteruptibleEvent.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.HitWallEvent; -import robocode.ScannedRobotEvent; - - -/** - * Based on bug 2212289. - * - * Robot provided for the test named TestScanForRobotsWhenHitWall, which tests if onScannedRobot() - * is called when the radar is turned from within a onHitWall() event. - * - * @author Flemming N. Larsen (original) - */ -public class InteruptibleEvent extends AdvancedRobot { - - @Override - public void run() { - setEventPriority("HitWallEvent", getEventPriority("ScannedRobotEvent")); // make same as scan - - // noinspection InfiniteLoopStatement - for (;;) { - ahead(10); // make sure we eventually hits a wall to receive onHitWall - } - } - - @Override - public void onScannedRobot(ScannedRobotEvent event) { - out.println("Scanned!!!"); // a robot was scanned -> success! - } - - @Override - public void onHitWall(HitWallEvent e) { - setInterruptible(true); // make sure that the event handler can be interrupted and restarted - turnRadarRight(360); // when the radar is turned here, at least another robot should be scanned - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/JuniorEvents.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/JuniorEvents.java deleted file mode 100644 index cd126f8..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/JuniorEvents.java +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.*; -import robocode.Event; -import robocode.robotinterfaces.IBasicEvents; -import robocode.robotinterfaces.IJuniorRobot; -import robocode.robotinterfaces.peer.IBasicRobotPeer; -import robocode.util.Utils; - -import java.awt.*; -import java.io.PrintStream; -import java.util.HashMap; -import java.util.Map; - - -/** - * @author Pavel Savara (original) - */ -public class JuniorEvents implements IJuniorRobot, IBasicEvents, Runnable { - - IBasicRobotPeer peer; - PrintStream out; - final Map counts = new HashMap(); - Bullet bullet; - - public void run() { - // noinspection InfiniteLoopStatement - while (true) { - peer.move(100); // Move ahead 100 - peer.turnGun(Math.PI * 2); // Spin gun around - peer.move(-100); // Move back 100 - peer.turnGun(Math.PI * 2); // Spin gun around - } - } - - public Runnable getRobotRunnable() { - return this; - } - - public IBasicEvents getBasicEventListener() { - return this; - } - - public void setPeer(IBasicRobotPeer peer) { - this.peer = peer; - } - - public void setOut(PrintStream out) { - this.out = out; - } - - public void onStatus(StatusEvent event) { - count(event); - final Graphics2D g = peer.getGraphics(); - - g.setColor(Color.orange); - g.drawOval((int) (peer.getX() - 55), (int) (peer.getY() - 55), 110, 110); - } - - public void onBulletHit(BulletHitEvent event) { - count(event); - } - - public void onBulletHitBullet(BulletHitBulletEvent event) { - count(event); - } - - public void onBulletMissed(BulletMissedEvent event) { - count(event); - } - - public void onDeath(DeathEvent event) { - count(event); - } - - public void onHitByBullet(HitByBulletEvent event) { - count(event); - } - - public void onHitRobot(HitRobotEvent event) { - count(event); - } - - public void onHitWall(HitWallEvent event) { - count(event); - } - - public void onRobotDeath(RobotDeathEvent event) { - count(event); - } - - public void onWin(WinEvent event) { - count(event); - - // this is tested output - for (Map.Entry s : counts.entrySet()) { - out.println(s.getKey() + " " + s.getValue()); - } - out.println("last bullet heading " + bullet.getHeadingRadians()); - } - - public void onScannedRobot(ScannedRobotEvent event) { - count(event); - - // Turn gun to point at the scanned robot - peer.turnGun(Utils.normalAbsoluteAngle(peer.getBodyHeading() + event.getBearingRadians() - peer.getGunHeading())); // - - // Fire! - double power = 1; - - Bullet firedBullet = peer.fire(power); - - if (firedBullet != null) { - this.bullet = firedBullet; - } - } - - private void count(Event event) { - final String name = event.getClass().getName(); - Integer curr = counts.get(name); - - if (curr == null) { - curr = 0; - } - counts.put(name, curr + 1); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxTurnRate.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxTurnRate.java deleted file mode 100644 index 858e625..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxTurnRate.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -/** - * @author Flemming N. Larsen (original) - */ -public class MaxTurnRate extends robocode.AdvancedRobot { - public void run() { - - setTurnLeft(Double.POSITIVE_INFINITY); - - for (int i = 0; i < 13; i++) { - setMaxTurnRate(i); - executeAndDumpTurnRate(); - } - - setTurnRight(Double.POSITIVE_INFINITY); - - for (int i = 0; i < 13; i++) { - setMaxTurnRate(i); - executeAndDumpTurnRate(); - } - } - - private void executeAndDumpTurnRate() { - double lastHeading = getHeading(); - - execute(); - - double turnRate = robocode.util.Utils.normalRelativeAngleDegrees(getHeading() - lastHeading); - - out.println(getTime() + ": " + getVelocity() + ", " + turnRate); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxVelocity.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxVelocity.java deleted file mode 100644 index fec7a11..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/MaxVelocity.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -/** - * @author Flemming N. Larsen (original) - */ -public class MaxVelocity extends robocode.AdvancedRobot { - - public void run() { - for (;;) { - int time = (int) getTime(); - - if (time < 200) { - out.println(time + ": " + getVelocity()); - } - - switch (time) { - case 1: - setAhead(1000); - break; - - case 20: - setBack(1000); - break; - - case 40: - setMaxVelocity(4.2); - setAhead(1000); - break; - - case 60: - setBack(1000); - break; - - case 80: - setMaxVelocity(100); - setAhead(1000); - break; - - case 100: - setBack(1000); - break; - - case 120: - setMaxVelocity(-2); - setAhead(1000); - break; - - case 140: - setBack(1000); - break; - - case 160: - setMaxVelocity(0); - setAhead(1000); - break; - - case 180: - setBack(1000); - break; - } - execute(); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/PrivateConstructor.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/PrivateConstructor.java deleted file mode 100644 index 505eb51..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/PrivateConstructor.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.Robot; - - -/** - * @author Pavel Savara (original) - */ -public class PrivateConstructor extends Robot { - private PrivateConstructor() {// private - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RadarTurnRateAndSetAdjust.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RadarTurnRateAndSetAdjust.java deleted file mode 100644 index 6e9ddf1..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RadarTurnRateAndSetAdjust.java +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -/** - * @author Flemming N. Larsen (original) - */ -public class RadarTurnRateAndSetAdjust extends robocode.AdvancedRobot { - public void run() { - // -- Turn 1 -- - setTurnRadarRight(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. radar turn rate = 45 - - // -- Turn 2 -- - setTurnGunRight(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. gun + radar turn rate = 20 + 45 = 65 - - // -- Turn 3 -- - setTurnRight(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun + radar turn rate = 10 + 20 + 45 = 75 - - // -- Turn 4 -- - setTurnRadarLeft(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun - radar turn rate = 10 + 20 - 45 = -15 - - // -- Turn 5 -- - setTurnGunLeft(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun - radar turn rate = 10 - 20 - 45 = -55 - - // -- Turn 6 -- - setTurnLeft(1000); - executeAndDumpTurnRate(); - // Expected turn rate: max. robot + gun - radar turn rate = -10 - 20 - 45 = -75 - - // -- Turn 7 -- - setAdjustRadarForGunTurn(false); - setTurnRight(14); - setTurnGunRight(15); - setTurnRadarRight(7); - executeAndDumpTurnRate(); - // Expected turn rate: robot + gun + radar turn rate = 14 + 15 + 7 = 32 - - // -- Turn 8 -- - setAdjustGunForRobotTurn(false); - setAdjustRadarForRobotTurn(false); - setAdjustRadarForGunTurn(true); - setTurnRight(14); - setTurnGunLeft(15); - setTurnRadarRight(7); - executeAndDumpTurnRate(); - // Expected turn rate: robot (max) + radar turn rate (ignoring gun turn rate, but not robot turn rate) = 10 + 7 = 17 - - // -- Turn 9 -- - setAdjustGunForRobotTurn(false); - setAdjustRadarForRobotTurn(true); - setAdjustRadarForGunTurn(true); - setTurnRight(14); - setTurnGunLeft(15); - setTurnRadarRight(35); - executeAndDumpTurnRate(); - // Expected turn rate: robot turn rate (ignoring both gun and body turn rate) = 35 - - // -- Turn 10 -- - setAdjustGunForRobotTurn(false); - setAdjustRadarForRobotTurn(false); - setAdjustRadarForGunTurn(true); - setTurnRight(14); - setTurnGunLeft(15); - setTurnRadarLeft(7); - executeAndDumpTurnRate(); - // Expected turn rate: robot (max) + radar turn rate (ignoring gun turn rate, but not robot turn rate) = 10 - 7 = 3 - - // -- Turn 11 -- - setAdjustGunForRobotTurn(false); - setAdjustRadarForRobotTurn(true); - setAdjustRadarForGunTurn(true); - setTurnRight(4); - setTurnGunRight(60); - setTurnRadarLeft(100); - executeAndDumpTurnRate(); - // Expected turn rate: robot (max) turn rate (ignoring both gun and body turn rate) = -20 - - // -- Turn 12 -- - setAdjustGunForRobotTurn(false); - setAdjustRadarForRobotTurn(false); - setAdjustRadarForGunTurn(true); - setTurnRight(Double.POSITIVE_INFINITY); - setTurnGunRight(Double.POSITIVE_INFINITY); - setTurnRadarRight(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - // Expected turn rate: setAdjusts are all ignored, max. robot + gun + radar turn rate = 10 + 20 + 45 = 75 - - // -- Turn 13 -- - setAdjustGunForRobotTurn(true); - setAdjustRadarForRobotTurn(false); - setAdjustRadarForGunTurn(true); - setTurnRight(Double.NEGATIVE_INFINITY); - setTurnGunRight(Double.NEGATIVE_INFINITY); - setTurnRadarRight(Double.NEGATIVE_INFINITY); - executeAndDumpTurnRate(); - // Expected turn rate: setAdjusts are all ignored, max. robot + gun + radar turn rate = -10 - 20 - 45 = -75 - - // -- Turn 14 -- - setAdjustGunForRobotTurn(true); - setAdjustRadarForRobotTurn(true); - setAdjustRadarForGunTurn(true); - setTurnLeft(Double.NEGATIVE_INFINITY); - setTurnGunLeft(Double.NEGATIVE_INFINITY); - setTurnRadarLeft(Double.POSITIVE_INFINITY); - executeAndDumpTurnRate(); - // Expected turn rate: setAdjusts are all ignored, max. robot + gun + radar turn rate = -(-10) - (-20) - 45 = -15 - } - - private void executeAndDumpTurnRate() { - double lastHeading = getRadarHeading(); - - execute(); - - double turnRate = robocode.util.Utils.normalRelativeAngleDegrees(getRadarHeading() - lastHeading); - - out.println(getTime() + ": " + turnRate); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Random.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Random.java deleted file mode 100644 index c9415b5..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/Random.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.Robot; - - -/** - * @author Pavel Savara (original) - */ -public class Random extends Robot { - - @Override - public void run() { - - while (true) { - ahead(100 * Math.random()); - turnRight(180 * Math.random()); - back(100 * Math.random()); - turnLeft(360 * Math.random()); - } - } -} - diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RateControl.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RateControl.java deleted file mode 100644 index bf97c6f..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RateControl.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.RateControlRobot; - - -/** - * @author Joshua Galecki (original) - */ -public class RateControl extends RateControlRobot { - @Override - public void run() { - for (int turnNumber = 0; turnNumber < 80; turnNumber++) { - if (turnNumber == 0) { - setTurnRate(4.5); - } else if (turnNumber == 10) { - setTurnRate(-9); - } else if (turnNumber == 20) { - setTurnRate(0); - setVelocityRate(2); - } else if (turnNumber == 25) { - setVelocityRate(-8); - } else if (turnNumber == 35) { - setVelocityRate(0); - setGunRotationRate(9); - } else if (turnNumber == 45) { - setGunRotationRate(-4.5); - } else if (turnNumber == 55) { - setGunRotationRate(0); - setRadarRotationRate(9); - } else if (turnNumber == 65) { - setRadarRotationRate(-4.5); - } else if (turnNumber == 75) { - setRadarRotationRate(0); - } - execute(); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReflectionAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReflectionAttack.java deleted file mode 100644 index 37355c0..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReflectionAttack.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import java.lang.reflect.*; - - -/** - * @author Flemming N. Larsen (original) - */ -public class ReflectionAttack extends robocode.AdvancedRobot { - - public void run() { - try { - Field field = System.class.getField("out"); - - field.setAccessible(true); - Object obj = field.get(null); - Method method = obj.getClass().getMethod("print", new Class[] { String.class }); - - method.setAccessible(true); - method.invoke(obj, new Object[] { "Hello World" }); - - } catch (Exception e) { - e.printStackTrace(out); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReverseDirection.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReverseDirection.java deleted file mode 100644 index de7cc0b..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ReverseDirection.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -/** - * @author Flemming N. Larsen (original) - */ -public class ReverseDirection extends robocode.AdvancedRobot { - public void run() { - setAhead(Double.POSITIVE_INFINITY); - setMaxVelocity(1.0); - execute(); - // robot has a positive velocity of 1.0 - - out.println(getVelocity()); - - setMaxVelocity(0.5); - setAhead(Double.NEGATIVE_INFINITY); - execute(); - // robot should have a negative velocity of -0.5 - - out.println(getVelocity()); - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RobotDeathEvents.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RobotDeathEvents.java deleted file mode 100644 index d057416..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/RobotDeathEvents.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.DeathEvent; -import robocode.RobotDeathEvent; -import robocode.AdvancedRobot; - - -/** - * @author Flemming N. Larsen (original) - */ -public class RobotDeathEvents extends AdvancedRobot { - private boolean dead; - private long enemyCount; - - public void run() { - enemyCount = getOthers(); - while (!dead) { - if (enemyCount != getOthers()) { - throw new RuntimeException("enemyCount != getOthers()"); - } - execute(); - } - } - - public void onRobotDeath(RobotDeathEvent e) { - enemyCount--; - } - - public void onDeath(DeathEvent e) { - dead = true; - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SkipTurns.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SkipTurns.java deleted file mode 100644 index 09b562e..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SkipTurns.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.SkippedTurnEvent; -import robocode.StatusEvent; - - -/** - * @author Pavel Savara (original) - */ -public class SkipTurns extends AdvancedRobot { - private volatile int skipped = 0; - - static final int LIMIT = 5; - - @Override - public void run() { - // noinspection InfiniteLoopStatement - for (;;) { - if (skipped > LIMIT) { - throw new Error("satisfied, end battle please"); - } - turnLeft(10); - if (skipped > LIMIT) { - // satisfied, end battle please - throw new Error(); - } - ahead(1); - if (skipped > LIMIT) { - // satisfied, end battle please - throw new Error(); - } - turnLeft(10); - if (skipped > LIMIT) { - // satisfied, end battle please - throw new Error(); - } - back(1); - } - } - - @Override - public void onStatus(StatusEvent e) { - out.println("live"); - slowResponse(); - } - - @Override - public void onSkippedTurn(SkippedTurnEvent event) { - out.println("Skipped!!!"); - - skipped++; - } - - private final Object w = new Object(); - - private void slowResponse() { - - synchronized (w) { - try { - if (skipped > 3) { - w.wait(3000); - } else { - w.wait(130); - } - } catch (InterruptedException e) { - // eat interrupt - e.printStackTrace(out); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SocketAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SocketAttack.java deleted file mode 100644 index 5109c10..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/SocketAttack.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import java.io.*; -import java.net.*; - - -/** - * @author Flemming N. Larsen (original) - */ -public class SocketAttack extends AdvancedRobot { - - public void run() { - ServerSocket server = null; - Socket client = null; - - try { - server = new ServerSocket(9999); - client = server.accept(); - - InputStream is = new DataInputStream(client.getInputStream()); - OutputStream os = new PrintStream(client.getOutputStream()); - - os.write(1); - is.read(); - } catch (IOException e) { - e.printStackTrace(out); - } finally { - if (server != null) { - try { - server.close(); - } catch (IOException e) {} - } - if (client != null) { - try { - client.close(); - } catch (IOException e) {} - } - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadAttack.java deleted file mode 100644 index bb21f8c..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadAttack.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; -import robocode.ScannedRobotEvent; - -import java.util.concurrent.atomic.AtomicInteger; - - -/** - * @author Pavel Savara (original) - */ -public class ThreadAttack extends AdvancedRobot { - - @Override - public void run() { - // noinspection InfiniteLoopStatement - for (;;) { - turnLeft(100); - ahead(10); - turnLeft(100); - back(10); - } - } - - @Override - public void onScannedRobot(ScannedRobotEvent event) { - runAttack(); - runAttack2(); - } - - private void runAttack() { - try { - Attacker a = new Attacker(); - Thread t = new Thread(a); - - t.start(); - } catch (RuntimeException e) { - // swallow security exception - e.printStackTrace(out); - } - } - - private void runAttack2() { - try { - Attacker a = new Attacker(); - ThreadGroup tg = new ThreadGroup("MyAttack"); - - tg.setMaxPriority(10); - Thread t = new Thread(tg, a); - - t.start(); - } catch (RuntimeException e) { - // swallow security exception - e.printStackTrace(out); - } - } - - private AtomicInteger counter = new AtomicInteger(); - - private class Attacker implements Runnable { - - public synchronized void run() { - final int id = counter.incrementAndGet(); - - out.println("Running id:" + id); - - if (Thread.currentThread().getPriority() > 4) { - out.println("Priority attack"); - } - runAttack2(); - - try { - this.wait(); - } catch (InterruptedException e) { - out.println("Interrupted id:" + id); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadGroupAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadGroupAttack.java deleted file mode 100644 index 963b549..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadGroupAttack.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.*; - - -/** - * This nasty robot tries to interrupt the thread of each opponent robot that it scans. - * It enumerates the threads recursively of thread group that is a parent of its own - * thread group to find out, which threads that are active. These threads are all robot - * threads. - * - * This robot is inspired by the hacker.Destroyer 1.3, which proved a security breach in - * Robocode 1.7.2.1 Beta. The security breach was reported with: - * Bug [3021140] Possible for robot to kill other robot threads. - * - * The security manager of Robocode must make sure that unsafe (robot) threads cannot - * access thread groups other than its own thread group within checkAccess(Thread). - * - * @author Flemming N. Larsen (original) - */ -public class ThreadGroupAttack extends Robot { - private Thread[] threads = new Thread[100]; - - public void run() { - runAttack(); - - while (true) { - turnGunLeft(30); - } - } - - private void runAttack() { - try { - new Thread(new Runnable() { - public void run() { - ThreadGroup parentGroup = Thread.currentThread().getThreadGroup().getParent(); - - while (true) { - parentGroup.enumerate(threads, true); - try { - Thread.sleep(0); - } catch (InterruptedException ignore) {} - } - } - }).start(); - } catch (RuntimeException t) { - t.printStackTrace(out); - } - } - - public void onScannedRobot(ScannedRobotEvent e) { - attackRobotThread(e.getName()); - } - - private void attackRobotThread(String robotName) { - for (Thread t : threads) { - if (t != null && robotName.equals(t.getName())) { - t.interrupt(); - out.println("Interrupted: " + robotName); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/TooLongNameThisIsReallyTooLongName.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/TooLongNameThisIsReallyTooLongName.java deleted file mode 100644 index 77cb808..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/TooLongNameThisIsReallyTooLongName.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.Robot; - - -/** - * @author Pavel Savara (original) - */ -public class TooLongNameThisIsReallyTooLongName extends Robot { - @Override - public void run() { - while (true) { - ahead(1); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(1); // Move back 100 - turnGunRight(360); // Spin gun around - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/UndeadThread.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/UndeadThread.java deleted file mode 100644 index 75fcbfa..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/UndeadThread.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.AdvancedRobot; - - -/** - * @author Pavel Savara (original) - */ -public class UndeadThread extends AdvancedRobot { - - @Override - public void run() { - out.println("I will live forever!"); - // noinspection InfiniteLoopStatement - while (true) { - try { - body(); - } catch (RuntimeException t) { - // spamming the console - out.println("Swalowed it, HA HA HA HA HAAAAA !!!!!"); - out.println(t); - } - } - } - - private void body() { - // noinspection InfiniteLoopStatement - for (;;) { - turnLeft(100); - ahead(10); - turnLeft(100); - back(10); - } - } - -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/WatchBullets.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/WatchBullets.java deleted file mode 100644 index 16bcee8..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/WatchBullets.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tested.robots; - - -import robocode.*; -import static robocode.util.Utils.normalRelativeAngle; - - -/** - * @author Pavel Savara (original) - */ -public class WatchBullets extends AdvancedRobot { - public void run() { - while (true) { - ahead(100); - turnGunRight(360); - back(100); - turnGunRight(360); - } - } - - Bullet bullet; - - public void onStatus(StatusEvent event) { - dump(); - } - - @Override - public void onScannedRobot(ScannedRobotEvent e) { - // Calculate exact location of the robot - double absoluteBearing = getHeading() + e.getBearing(); - double bearingFromGun = normalRelativeAngle(absoluteBearing - getGunHeading()); - - // If it's close enough, fire! - if (Math.abs(bearingFromGun) <= 3) { - turnGunRight(bearingFromGun); - // We check gun heat here, because calling fire() - // uses a turn, which could cause us to lose track - // of the other robot. - if (getGunHeat() == 0 && bullet == null) { - final Bullet lbullet = fireBullet(Math.min(3 - Math.abs(bearingFromGun), getEnergy() - .1)); - - bullet = lbullet; - } - } // otherwise just set the gun to turn. - // Note: This will have no effect until we call scan() - else { - turnGunRight(bearingFromGun); - } - // Generates another scan event if we see a robot. - // We only need to call this if the gun (and therefore radar) - // are not turning. Otherwise, scan is called automatically. - if (bearingFromGun == 0) { - scan(); - } - } - - private void dump() { - if (bullet != null) { - out.println( - getTime() + " " + bullet.getX() + " " + bullet.getY() + " " + bullet.getHeading() + " " - + bullet.isActive()); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespace.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespace.java deleted file mode 100644 index 0fc2fb2..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/java/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespace.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package tooLongNamespaceThisIsReallyTooLongNamespace; - - -import robocode.Robot; - - -/** - * @author Pavel Savara (original) - */ -public class TooLongNamespace extends Robot { - @Override - public void run() { - while (true) { - ahead(1); // Move ahead 100 - turnGunRight(360); // Spin gun around - back(1); // Move back 100 - turnGunRight(360); // Spin gun around - } - } -} diff --git a/代码/workspace_robo4/robocode.tests.robots/src/main/resources/tested/robots/TestTeam.team b/代码/workspace_robo4/robocode.tests.robots/src/main/resources/tested/robots/TestTeam.team deleted file mode 100644 index fd3a223..0000000 --- a/代码/workspace_robo4/robocode.tests.robots/src/main/resources/tested/robots/TestTeam.team +++ /dev/null @@ -1,7 +0,0 @@ -#Robocode robot team -#Sat Oct 25 22:23:58 CEST 2008 -team.members=sampleteam.MyFirstLeader,sampleteam.MyFirstDroid,sample.Fire -team.author.name= -robocode.version=unknown -uuid=8abd63e8-1156-4fb4-a81f-eb10fca9596d -team.description=testteam diff --git a/代码/workspace_robo4/robocode.tests/.classpath b/代码/workspace_robo4/robocode.tests/.classpath deleted file mode 100644 index 54fd109..0000000 --- a/代码/workspace_robo4/robocode.tests/.classpath +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.tests/.project b/代码/workspace_robo4/robocode.tests/.project deleted file mode 100644 index 96f238f..0000000 --- a/代码/workspace_robo4/robocode.tests/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - robocode.tests - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.tests.robots - robocode.samples - robocode.core - robocode.host - robocode.battle - robocode.repository - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.tests/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.tests/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.tests/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.tests/config/robocode.properties b/代码/workspace_robo4/robocode.tests/config/robocode.properties deleted file mode 100644 index ad5840f..0000000 --- a/代码/workspace_robo4/robocode.tests/config/robocode.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Robocode Properties -#Thu Mar 12 00:15:08 CET 2009 -robocode.cpu.constant=9994115 diff --git a/代码/workspace_robo4/robocode.tests/pom.xml b/代码/workspace_robo4/robocode.tests/pom.xml deleted file mode 100644 index d84174f..0000000 --- a/代码/workspace_robo4/robocode.tests/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - robocode.tests - Robocode Tests - - net.sf.robocode - robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.tests.robots - ${project.version} - - - junit - junit - 4.11 - - - net.sf.robocode - robocode.core - ${project.version} - test - - - net.sf.robocode - robocode.samples - ${project.version} - test - - - net.sf.robocode - robocode.host - ${project.version} - test - - - net.sf.robocode - robocode.battle - ${project.version} - test - - - net.sf.robocode - robocode.repository - ${project.version} - test - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.tests/robocode.tests.iml b/代码/workspace_robo4/robocode.tests/robocode.tests.iml deleted file mode 100644 index 7cffb25..0000000 --- a/代码/workspace_robo4/robocode.tests/robocode.tests.iml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/Assert.java b/代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/Assert.java deleted file mode 100644 index 27c29dd..0000000 --- a/代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/Assert.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.helpers; - - -import robocode.util.Utils; - - -/** - * @author Pavel Savara (original) - */ -public class Assert extends org.junit.Assert { - public static void assertNear(double v1, double v2) { - org.junit.Assert.assertEquals(v1, v2, Utils.NEAR_DELTA); - } - - public static void allAssertNear(double v1, double v2) { - try { - assertNear(v1, v2); - } catch (RuntimeException ex) { - ex.printStackTrace(System.err); - } - } - - public static void allAssertThat(T t, org.hamcrest.Matcher tMatcher) { - try { - org.junit.Assert.assertThat(t, tMatcher); - } catch (RuntimeException ex) { - ex.printStackTrace(System.err); - } - } - -} diff --git a/代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/RobocodeTestBed.java b/代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/RobocodeTestBed.java deleted file mode 100644 index ad034fb..0000000 --- a/代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/RobocodeTestBed.java +++ /dev/null @@ -1,209 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.helpers; - - -import net.sf.robocode.io.Logger; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import robocode.control.*; -import robocode.control.events.*; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.util.Utils; - -import java.io.File; -import java.io.IOException; -import java.util.Random; - - -/** - * @author Pavel Savara (original) - */ -public abstract class RobocodeTestBed extends BattleAdaptor { - protected static final IRobocodeEngine engine; - protected final BattlefieldSpecification battleFieldSpec = new BattlefieldSpecification(); - protected static int errors = 0; - protected static StringBuilder errorText = new StringBuilder(); - protected static int messages = 0; - protected static String robotsPath; - - public static boolean isDumpingPositions = false; - public static boolean isDumpingTurns = false; - public static boolean isDumpingOutput = true; - public static boolean isDumpingErrors = true; - public static boolean isDumpingMessages = true; - public static boolean hasJavaNetURLPermission = isClassAvailable("java.net.URLPermission"); - - private static boolean isClassAvailable(String name) { - try { - return Class.forName(name) != null; - } catch (ClassNotFoundException e) { - return false; - } - } - - static { - System.setProperty("EXPERIMENTAL", "true"); - System.setProperty("TESTING", "true"); - System.setProperty("WORKINGDIRECTORY", "target/test-classes"); - try { - String currentDirAbsolutePath = new File("").getAbsolutePath(); - if (currentDirAbsolutePath.endsWith("robocode.tests")) { - robotsPath = new File("../robocode.tests.robots").getCanonicalPath(); - } else if (currentDirAbsolutePath.endsWith("robocode.dotnet.tests")) { - robotsPath = new File("../../../robocode.tests.robots").getCanonicalPath(); - } else if (new File("robocode.tests.robots").isDirectory()) { - robotsPath = new File("robocode.tests.robots").getCanonicalPath(); - } else { - throw new Error("Unknown directory: " + currentDirAbsolutePath); - } - } catch (IOException e) { - e.printStackTrace(Logger.realErr); - } - System.setProperty("ROBOTPATH", robotsPath + "/target/classes"); - - engine = new RobocodeEngine(new BattleAdaptor() { - public void onBattleMessage(BattleMessageEvent event) { - if (isDumpingMessages) { - Logger.realOut.println(event.getMessage()); - } - messages++; - } - - public void onBattleError(BattleErrorEvent event) { - if (isDumpingErrors) { - Logger.realErr.println(event.getError()); - } - errorText.append("----------err #"); - errorText.append(errors); - errorText.append("--------------------------------------------------\n"); - errorText.append(event.getError()); - errorText.append("\n"); - errors++; - } - }); - } - - public RobocodeTestBed() { - // silent when running in maven - if (System.getProperty("surefire.test.class.path", null) != null) { - isDumpingOutput = false; - isDumpingErrors = false; - isDumpingMessages = false; - } - errors = 0; - messages = 0; - } - - public void onTurnEnded(TurnEndedEvent event) { - if (isDumpingTurns) { - Logger.realOut.println("turn " + event.getTurnSnapshot().getTurn()); - } - for (IRobotSnapshot robot : event.getTurnSnapshot().getRobots()) { - if (isDumpingPositions) { - Logger.realOut.print(robot.getVeryShortName()); - Logger.realOut.print(" X:"); - Logger.realOut.print(robot.getX()); - Logger.realOut.print(" Y:"); - Logger.realOut.print(robot.getY()); - Logger.realOut.print(" V:"); - Logger.realOut.print(robot.getVelocity()); - Logger.realOut.println(); - } - if (isDumpingOutput) { - Logger.realOut.print(robot.getOutputStreamSnapshot()); - } - } - } - - public void onBattleStarted(BattleStartedEvent event) { - if (isDeterministic() && isCheckOnBattleStart()) { - final Random random = Utils.getRandom(); - - if (event.getRobotsCount() == 2) { - Assert.assertNear(0.98484154, random.nextDouble()); - } - } - } - - public abstract String getRobotNames(); - - public int getNumRounds() { - return 1; - } - - public String getInitialPositions() { - return null; - } - - public int getExpectedRobotCount(String robotList) { - return robotList.split("[\\s,;]+").length; - } - - public boolean isDeterministic() { - return true; - } - - public boolean isCheckOnBattleStart() { - return false; - } - - @Before - public void setup() { - engine.addBattleListener(this); - if (isDeterministic()) { - RandomFactory.resetDeterministic(0); - if (isCheckOnBattleStart()) { - Assert.assertNear(0.730967, RandomFactory.getRandom().nextDouble()); - } - } - errors = 0; - errorText = new StringBuilder(); - messages = 0; - } - - @After - public void tearDown() { - engine.removeBattleListener(this); - } - - @Test - public void run() { - runSetup(); - runBattle(getRobotNames(), getNumRounds(), getInitialPositions()); - runTeardown(); - final int expectedErrors = getExpectedErrors(); - - if (errors != expectedErrors) { - throw new AssertionError( - "Number of errors " + errors + " is different than expected " + expectedErrors + "\n" + errorText - + "======================================================================"); - } - } - - protected int getExpectedErrors() { - return 0; - } - - protected void runSetup() {} - - protected void runTeardown() {} - - protected void runBattle(String robotList, int numRounds, String initialPositions) { - final RobotSpecification[] robotSpecifications = engine.getLocalRepository(robotList); - - if (getExpectedRobotCount(robotList) > 0) { - Assert.assertNotNull("Robot were not loaded", robotSpecifications); - Assert.assertEquals("Robot were not loaded", getExpectedRobotCount(robotList), robotSpecifications.length); - engine.runBattle(new BattleSpecification(numRounds, battleFieldSpec, robotSpecifications), initialPositions, - true); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/core/util/AlphanumericComparatorTest.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/core/util/AlphanumericComparatorTest.java deleted file mode 100644 index 255fbd2..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/core/util/AlphanumericComparatorTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.core.util; - - -import java.util.Arrays; - -import net.sf.robocode.util.AlphanumericComparator; - -import org.junit.Assert; -import org.junit.Test; - - -/** - * @author Flemming N. Larsen (original) - */ -public class AlphanumericComparatorTest { - @Test - public void correctSorting() { - - // Our unsorted strings that must be sorted - final String[] unsortedStrings = { - null, "", " ", "alpha2", "alpha1", "bEtA", "BeTa", "alpha", "Alpha2", "Alpha1", "Alpha", "1.2", "1.22", - "1.22A", "1.3", "2.10a.1", "2.1.1", "2.10", "2.1a", "2.10.2", "1c", "1h", "1p", "alpha", "beta", "alPHA", - "beTA", "ALpha", "BEta", "ALPHA", "BETA" - }; - - // The expected result, when the unsorted strings have been sorted correctly - final String[] correctlySortedStrings = { - "1.2", "1.3", "1.22A", "1.22", "1c", "1h", "1p", "2.1.1", "2.1a", "2.10.2", "2.10a.1", "2.10", " ", "ALPHA", - "ALpha", "Alpha1", "Alpha2", "Alpha", "alPHA", "alpha1", "alpha2", "alpha", "alpha", "BETA", "BEta", "BeTa", - "bEtA", "beTA", "beta", "", null - }; - - // Make sure the input and expected output string arrays have the same length - Assert.assertEquals(unsortedStrings.length, correctlySortedStrings.length); - - // Sort the unsorted strings - Arrays.sort(unsortedStrings, new AlphanumericComparator()); - - // Check the result against our expected result - boolean sortedCorrectly = true; - - for (int i = 0; i < unsortedStrings.length; i++) { - String str1 = unsortedStrings[i]; - String str2 = correctlySortedStrings[i]; - - if (!(str1 == null && str2 == null) && !str1.equals(str2)) { - sortedCorrectly = false; - break; - } - } - Assert.assertTrue(sortedCorrectly); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/host/security/RobotClassLoaderTest.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/host/security/RobotClassLoaderTest.java deleted file mode 100644 index 13cd254..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/host/security/RobotClassLoaderTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.host.security; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.core.EngineClassLoader; -import net.sf.robocode.host.security.RobotClassLoader; -import net.sf.robocode.security.HiddenAccess; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; -import java.net.URL; - - -/** - * @author Pavel Savara (original) - */ -public class RobotClassLoaderTest { - static URL classPath; - final String badRobot = "tested.robots.IncludeNamespaceAttack"; - final String goodRobot = "tested.robots.Ahead"; - - @BeforeClass - public static void init() throws IOException { - HiddenAccess.initContainer(); - classPath = new File("../robocode.tests.robots/target/classes").getCanonicalFile().toURI().toURL(); - } - - @Test - public void engineAllowed() throws ClassNotFoundException { - final ClassLoader engineLoader = new EngineClassLoader(ClassLoader.getSystemClassLoader()); - - engineLoader.loadClass("net.sf.robocode.host.proxies.BasicRobotProxy"); - final Class c = engineLoader.loadClass("net.sf.robocode.host.proxies.BasicRobotProxy"); - - Assert.assertEquals(engineLoader, c.getClassLoader()); - } - - @Test - public void robotAllowed() throws ClassNotFoundException { - RobotClassLoader cl = new RobotClassLoader(classPath, goodRobot); - final Class c = cl.loadClass("robocode.Robot", true); - - Assert.assertEquals(Container.systemLoader, c.getClassLoader()); - } - - @Test - public void robotAllowedMain() throws ClassNotFoundException { - RobotClassLoader cl = new RobotClassLoader(classPath, goodRobot); - final Class c = cl.loadRobotMainClass(true); - - Assert.assertEquals(cl, c.getClassLoader()); - } - - @Test(expected = ClassNotFoundException.class) - public void robotBlockedBad() throws ClassNotFoundException { - RobotClassLoader cl = new RobotClassLoader(classPath, badRobot); - - cl.loadRobotMainClass(true); - } - - @Test(expected = ClassNotFoundException.class) - public void robotBlockedRobocode() throws ClassNotFoundException { - RobotClassLoader cl = new RobotClassLoader(classPath, goodRobot); - - cl.loadClass("net.sf.robocode.host.proxies.BasicRobotProxy"); - } - - @Test(expected = ClassNotFoundException.class) - public void robotBlockedControl() throws ClassNotFoundException { - RobotClassLoader cl = new RobotClassLoader(classPath, goodRobot); - - cl.loadClass("robocode.control.RobocodeEngine"); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAcceleration.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAcceleration.java deleted file mode 100644 index 4afd20c..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAcceleration.java +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; - -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class TestAcceleration extends RobocodeTestBed { - - private double[] startX = new double[3]; - private double[] startY = new double[3]; - - @Test - public void run() { - super.run(); - } - - @Override - public String getRobotNames() { - return "tested.robots.DecelerationCaveat1,tested.robots.DecelerationCaveat2,tested.robots.DecelerationCaveat3"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (100,50,0), (150,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot caveat1 = event.getTurnSnapshot().getRobots()[0]; - IRobotSnapshot caveat2 = event.getTurnSnapshot().getRobots()[1]; - IRobotSnapshot caveat3 = event.getTurnSnapshot().getRobots()[2]; - - switch (event.getTurnSnapshot().getTurn()) { - case 1: - resetStartPositions(event.getTurnSnapshot()); - - Assert.assertNear(1, caveat1.getVelocity()); - Assert.assertNear(1, caveat2.getVelocity()); - Assert.assertNear(1, caveat3.getVelocity()); - - Assert.assertNear(1 - 1, distance(0, caveat1)); - Assert.assertNear(1 - 1, distance(1, caveat2)); - Assert.assertNear(1 - 1, distance(2, caveat3)); - break; - - case 2: - Assert.assertNear(2, caveat1.getVelocity()); - Assert.assertNear(2, caveat2.getVelocity()); - Assert.assertNear(2, caveat3.getVelocity()); - - Assert.assertNear(3 - 1, distance(0, caveat1)); - Assert.assertNear(3 - 1, distance(1, caveat2)); - Assert.assertNear(3 - 1, distance(2, caveat3)); - break; - - case 3: - Assert.assertNear(3, caveat1.getVelocity()); - Assert.assertNear(3, caveat2.getVelocity()); - Assert.assertNear(3, caveat3.getVelocity()); - - Assert.assertNear(6 - 1, distance(0, caveat1)); - Assert.assertNear(6 - 1, distance(1, caveat2)); - Assert.assertNear(6 - 1, distance(2, caveat3)); - break; - - case 4: - Assert.assertNear(4, caveat1.getVelocity()); - Assert.assertNear(4, caveat2.getVelocity()); - Assert.assertNear(4, caveat3.getVelocity()); - - Assert.assertNear(10 - 1, distance(0, caveat1)); - Assert.assertNear(10 - 1, distance(1, caveat2)); - Assert.assertNear(10 - 1, distance(2, caveat3)); - break; - - case 5: - Assert.assertNear(5, caveat1.getVelocity()); - Assert.assertNear(5, caveat2.getVelocity()); - Assert.assertNear(5, caveat3.getVelocity()); - - Assert.assertNear(15 - 1, distance(0, caveat1)); - Assert.assertNear(15 - 1, distance(1, caveat2)); - Assert.assertNear(15 - 1, distance(2, caveat3)); - break; - - case 6: - Assert.assertNear(6, caveat1.getVelocity()); - Assert.assertNear(6, caveat2.getVelocity()); - Assert.assertNear(6, caveat3.getVelocity()); - - Assert.assertNear(21 - 1, distance(0, caveat1)); - Assert.assertNear(21 - 1, distance(1, caveat2)); - Assert.assertNear(21 - 1, distance(2, caveat3)); - break; - - case 7: - Assert.assertNear(7, caveat1.getVelocity()); - Assert.assertNear(7, caveat2.getVelocity()); - Assert.assertNear(7, caveat3.getVelocity()); - - Assert.assertNear(28 - 1, distance(0, caveat1)); - Assert.assertNear(28 - 1, distance(1, caveat2)); - Assert.assertNear(28 - 1, distance(2, caveat3)); - break; - - case 8: - Assert.assertNear(8, caveat1.getVelocity()); - Assert.assertNear(8, caveat2.getVelocity()); - Assert.assertNear(8, caveat3.getVelocity()); - - Assert.assertNear(36 - 1, distance(0, caveat1)); - Assert.assertNear(36 - 1, distance(1, caveat2)); - Assert.assertNear(36 - 1, distance(2, caveat3)); - - resetStartPositions(event.getTurnSnapshot()); - break; - - case 9: - Assert.assertNear(8, caveat1.getVelocity()); - Assert.assertNear(8, caveat2.getVelocity()); - - Assert.assertNear(6, caveat3.getVelocity()); // Caveat 3 (max. speed is set to 6) - - Assert.assertNear(8, distance(0, caveat1)); - Assert.assertNear(8, distance(1, caveat2)); - - resetStartPositions(event.getTurnSnapshot()); - break; - - case 10: - Assert.assertNear(caveat1.getVelocity(), distance(0, caveat1)); - Assert.assertNear(caveat2.getVelocity(), distance(1, caveat2)); - - resetStartPositions(event.getTurnSnapshot()); - break; - - case 11: - Assert.assertNear(caveat1.getVelocity(), distance(0, caveat1)); - Assert.assertNear(caveat2.getVelocity(), distance(1, caveat2)); - - resetStartPositions(event.getTurnSnapshot()); - break; - - case 12: - Assert.assertNear(caveat1.getVelocity(), distance(0, caveat1)); - Assert.assertNear(caveat2.getVelocity(), distance(1, caveat2)); - - resetStartPositions(event.getTurnSnapshot()); - break; - - case 13: - Assert.assertNear(caveat1.getVelocity(), distance(0, caveat1)); // Caveat 1 (distance should be = velocity) - Assert.assertNear(caveat2.getVelocity(), distance(1, caveat2)); - - resetStartPositions(event.getTurnSnapshot()); - break; - - case 14: - Assert.assertNear(0, caveat1.getVelocity()); - Assert.assertNear(0, caveat2.getVelocity()); - - Assert.assertNear(0, distance(1, caveat2)); // Caveat 2 (distance should be 0) - break; - } - } - - private void resetStartPositions(ITurnSnapshot turnSnapshot) { - for (int i = 0; i < 3; i++) { - IRobotSnapshot robot = turnSnapshot.getRobots()[i]; - - startX[i] = robot.getX(); - startY[i] = robot.getY(); - } - } - - private double distance(int index, IRobotSnapshot robotSnapshot) { - return Math.hypot(robotSnapshot.getX() - startX[index], robotSnapshot.getY() - startY[index]); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAwtAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAwtAttack.java deleted file mode 100644 index a53be8b..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestAwtAttack.java +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; - -import javax.swing.*; - - -/** - * @author Pavel Savara (original) - */ -public class TestAwtAttack extends RobocodeTestBed { - // in case: boolean messagedAttack; - boolean messagedBreakthru; - - @Test - public void run() { - super.run(); - } - - /* in case that we don't block JFrame by classloader - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Hacked!!!")) { - messagedBreakthru = true; - } - if (out.contains("Robots are not allowed to reference javax.swing package")) { - messagedAttack = true; - } - } */ - - @Override - public String getRobotNames() { - return "tested.robots.BattleLost,tested.robots.AwtAttack"; - } - - JFrame frame; - - @Override - protected void runSetup() { - frame = new JFrame(); - frame.setVisible(true); - } - - @Override - protected int getExpectedErrors() { - return 2; - } - - @Override - public int getExpectedRobotCount(String list) { - return 1; - } - - @Override - protected void runTeardown() { - - Runnable doCheck = new Runnable() { - public void run() { - Logger.logMessage("works still!!!"); - } - }; - - javax.swing.SwingUtilities.invokeLater(doCheck); - - frame.setVisible(false); - Assert.assertFalse(messagedBreakthru); - // in case: Assert.assertTrue(messagedAttack); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBodyTurnRate.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBodyTurnRate.java deleted file mode 100644 index 5ec9dc7..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBodyTurnRate.java +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestBodyTurnRate extends RobocodeTestBed { - - StringBuffer buf = new StringBuffer(); - - @Override - public String getRobotNames() { - return "tested.robots.BodyTurnRate,sample.Target"; - } - - @Override - public String getInitialPositions() { - return "(600,200,0), (50,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - buf.append(event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot()); - - if (event.getTurnSnapshot().getTurn() == 60) { - final String out = buf.toString(); - - Assert.assertTrue(out.contains("1: 0.0, -10.0") | out.contains("1: 0.0, -9.9999999999")); - Assert.assertTrue(out.contains("2: 1.0, -9.25") | out.contains("2: 1.0, -9.2499999999")); - Assert.assertTrue(out.contains("3: 2.0, -8.5") | out.contains("3: 2.0, -8.4999999999")); - Assert.assertTrue(out.contains("4: 3.0, -7.75") | out.contains("4: 3.0, -7.7499999999")); - Assert.assertTrue(out.contains("5: 4.0, -7.0") | out.contains("5: 4.0, -6.9999999999")); - Assert.assertTrue(out.contains("6: 5.0, -6.25") | out.contains("6: 5.0, -6.2499999999")); - Assert.assertTrue(out.contains("7: 6.0, -5.5") | out.contains("7: 6.0, -5.4999999999")); - Assert.assertTrue(out.contains("8: 7.0, -4.75") | out.contains("8: 7.0, -4.7499999999")); - Assert.assertTrue(out.contains("9: 8.0, -4.0") | out.contains("9: 8.0, -3.9999999999")); - - Assert.assertTrue(out.contains("10: 8.0, 0.0") | out.contains("10: 8.0, -0.0")); - Assert.assertTrue(out.contains("11: 6.0, 0.0") | out.contains("11: 6.0, -0.0")); - Assert.assertTrue(out.contains("12: 4.0, 0.0") | out.contains("12: 4.0, -0.0")); - Assert.assertTrue(out.contains("13: 2.0, 0.0") | out.contains("13: 2.0, -0.0")); - Assert.assertTrue( - out.contains("14: 0.0, 0.0") | out.contains("14: 0.0, -0.0") | out.contains("14: -0.0, 0.0") - | out.contains("14: -0.0, -0.0")); - Assert.assertTrue( - out.contains("15: 0.0, 0.0") | out.contains("15: 0.0, -0.0") | out.contains("15: -0.0, 0.0") - | out.contains("15: -0.0, -0.0")); - - Assert.assertTrue(out.contains("16: 0.0, 10.0") | out.contains("16: 0.0, 9.9999999999")); - Assert.assertTrue(out.contains("17: 1.0, 9.25") | out.contains("17: 1.0, 9.2499999999")); - Assert.assertTrue(out.contains("18: 2.0, 8.5") | out.contains("18: 2.0, 8.4999999999")); - Assert.assertTrue(out.contains("19: 3.0, 7.75") | out.contains("19: 3.0, 7.7499999999")); - Assert.assertTrue(out.contains("20: 4.0, 7.0") | out.contains("20: 4.0, 6.9999999999")); - Assert.assertTrue(out.contains("21: 5.0, 6.25") | out.contains("21: 5.0, 6.2499999999")); - Assert.assertTrue(out.contains("22: 6.0, 5.5") | out.contains("22: 6.0, 5.4999999999")); - Assert.assertTrue(out.contains("23: 7.0, 4.75") | out.contains("23: 7.0, 4.7499999999")); - Assert.assertTrue(out.contains("24: 8.0, 4.0") | out.contains("24: 8.0, 3.9999999999")); - - Assert.assertTrue(out.contains("25: 8.0, 0.0") | out.contains("25: 8.0, -0.0")); - Assert.assertTrue(out.contains("26: 6.0, 0.0") | out.contains("26: 6.0, -0.0")); - Assert.assertTrue(out.contains("27: 4.0, 0.0") | out.contains("27: 4.0, -0.0")); - Assert.assertTrue(out.contains("28: 2.0, 0.0") | out.contains("28: 2.0, -0.0")); - Assert.assertTrue( - out.contains("29: 0.0, 0.0") | out.contains("29: 0.0, -0.0") | out.contains("29: -0.0, 0.0") - | out.contains("29: -0.0, -0.0")); - Assert.assertTrue( - out.contains("30: 0.0, 0.0") | out.contains("30: 0.0, -0.0") | out.contains("30: -0.0, 0.0") - | out.contains("30: -0.0, -0.0")); - - Assert.assertTrue(out.contains("31: 0.0, 10.0") | out.contains("31: 0.0, 9.9999999999")); - Assert.assertTrue(out.contains("32: -1.0, 9.25") | out.contains("32: -1.0, 9.2499999999")); - Assert.assertTrue(out.contains("33: -2.0, 8.5") | out.contains("33: -2.0, 8.4999999999")); - Assert.assertTrue(out.contains("34: -3.0, 7.75") | out.contains("34: -3.0, 7.7499999999")); - Assert.assertTrue(out.contains("35: -4.0, 7.0") | out.contains("35: -4.0, 6.9999999999")); - Assert.assertTrue(out.contains("36: -5.0, 6.25") | out.contains("36: -5.0, 6.2499999999")); - Assert.assertTrue(out.contains("37: -6.0, 5.5") | out.contains("37: -6.0, 5.4999999999")); - Assert.assertTrue(out.contains("38: -7.0, 4.75") | out.contains("38: -7.0, 4.7499999999")); - Assert.assertTrue(out.contains("39: -8.0, 4.0") | out.contains("39: -8.0, 3.9999999999")); - - Assert.assertTrue(out.contains("40: -8.0, 0.0") | out.contains("40: -8.0, -0.0")); - Assert.assertTrue(out.contains("41: -6.0, 0.0") | out.contains("41: -6.0, -0.0")); - Assert.assertTrue(out.contains("42: -4.0, 0.0") | out.contains("42: -4.0, -0.0")); - Assert.assertTrue(out.contains("43: -2.0, 0.0") | out.contains("43: -2.0, -0.0")); - Assert.assertTrue( - out.contains("44: -0.0, 0.0") | out.contains("44: -0.0, -0.0") | out.contains("44: 0.0, 0.0") - | out.contains("44: 0.0, -0.0")); - Assert.assertTrue( - out.contains("45: -0.0, 0.0") | out.contains("45: -0.0, -0.0") | out.contains("45: 0.0, 0.0") - | out.contains("45: 0.0, -0.0")); - - Assert.assertTrue(out.contains("46: 0.0, -10.0") | out.contains("46: 0.0, -9.9999999999")); - Assert.assertTrue(out.contains("47: -1.0, -9.25") | out.contains("47: -1.0, -9.2499999999")); - Assert.assertTrue(out.contains("48: -2.0, -8.5") | out.contains("48: -2.0, -8.4999999999")); - Assert.assertTrue(out.contains("49: -3.0, -7.75") | out.contains("49: -3.0, -7.7499999999")); - Assert.assertTrue(out.contains("50: -4.0, -7.0") | out.contains("50: -4.0, -6.9999999999")); - Assert.assertTrue(out.contains("51: -5.0, -6.25") | out.contains("51: -5.0, -6.2499999999")); - Assert.assertTrue(out.contains("52: -6.0, -5.5") | out.contains("52: -6.0, -5.4999999999")); - Assert.assertTrue(out.contains("53: -7.0, -4.75") | out.contains("53: -7.0, -4.7499999999")); - Assert.assertTrue(out.contains("54: -8.0, -4.0") | out.contains("54: -8.0, -3.9999999999")); - - Assert.assertTrue(out.contains("55: -8.0, 0.0") | out.contains("55: -8.0, -0.0")); - Assert.assertTrue(out.contains("56: -6.0, 0.0") | out.contains("56: -6.0, -0.0")); - Assert.assertTrue(out.contains("57: -4.0, 0.0") | out.contains("57: -4.0, -0.0")); - Assert.assertTrue(out.contains("58: -2.0, 0.0") | out.contains("58: -2.0, -0.0")); - Assert.assertTrue( - out.contains("59: -0.0, 0.0") | out.contains("59: -0.0, -0.0") | out.contains("59: 0.0, 0.0") - | out.contains("59: 0.0, -0.0")); - Assert.assertTrue( - out.contains("60: -0.0, 0.0") | out.contains("60: -0.0, -0.0") | out.contains("60: 0.0, 0.0") - | out.contains("60: 0.0, -0.0")); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBulletPower.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBulletPower.java deleted file mode 100644 index b37b24f..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestBulletPower.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestBulletPower extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "sample.Target,tested.robots.BadFirePower"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot bp = event.getTurnSnapshot().getRobots()[1]; - - final int time = event.getTurnSnapshot().getTurn(); - - switch (time) { - case 30: - case 46: - case 62: - case 78: - case 94: - case 110: - test(bp, "Bullet power: 3.0"); - break; - - default: - if (time > 1 && time < 115) { - test(bp, "No bullet"); - } - break; - } - } - - private void test(IRobotSnapshot gh, String s) { - Assert.assertTrue(gh.getOutputStreamSnapshot() + " expected " + s, gh.getOutputStreamSnapshot().contains(s)); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorAwtAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorAwtAttack.java deleted file mode 100644 index be70e57..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorAwtAttack.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import javax.swing.*; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestConstructorAwtAttack extends RobocodeTestBed { - // in case: boolean messagedAttack; - boolean messagedBreakthru; - - JFrame frame; - - @Override - public String getRobotNames() { - return "tested.robots.ConstructorAwtAttack,tested.robots.BattleLost"; - } - - /* in case that we don't block JFrame by classloader - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("Hacked!!!")) { - messagedBreakthru = true; - } - if (out.contains("Robots are not allowed to reference javax.swing package")) { - messagedAttack = true; - } - } */ - - @Override - protected void runSetup() { - frame = new JFrame(); - frame.setVisible(true); - } - - @Override - protected int getExpectedErrors() { - return 2; - } - - @Override - public int getExpectedRobotCount(String list) { - return 1; - } - - @Override - protected void runTeardown() { - Runnable doCheck = new Runnable() { - public void run() { - Logger.logMessage("works still!!!"); - } - }; - - javax.swing.SwingUtilities.invokeLater(doCheck); - - frame.setVisible(false); - Assert.assertFalse(messagedBreakthru); - // in case: Assert.assertTrue(messagedAttack); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorHttpAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorHttpAttack.java deleted file mode 100644 index 8a613fa..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorHttpAttack.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestConstructorHttpAttack extends RobocodeTestBed { - - private boolean messagedInitialization; - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robots.ConstructorHttpAttack,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("An error occurred during initialization")) { - messagedInitialization = true; - } - - if (out.contains("access denied (java.net.SocketPermission") - || out.contains("access denied (\"java.net.SocketPermission\"")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Error during initialization", messagedInitialization); - Assert.assertTrue("HTTP connection is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return hasJavaNetURLPermission ? 3 : 2; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorReflectionAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorReflectionAttack.java deleted file mode 100644 index 9dd6718..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorReflectionAttack.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestConstructorReflectionAttack extends RobocodeTestBed { - - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robots.ConstructorReflectionAttack,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("access denied (java.lang.reflect.ReflectPermission") - || out.contains("access denied (\"java.lang.reflect.ReflectPermission\"")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Reflection is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorSocketAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorSocketAttack.java deleted file mode 100644 index 74ced61..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorSocketAttack.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestConstructorSocketAttack extends RobocodeTestBed { - - private boolean messagedInitialization; - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robots.ConstructorSocketAttack,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("An error occurred during initialization")) { - messagedInitialization = true; - } - - if (out.contains("access denied (java.net.SocketPermission") - || out.contains("access denied (\"java.net.SocketPermission\"")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Error during initialization", messagedInitialization); - Assert.assertTrue("Socket connection is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return 2; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorThreadAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorThreadAttack.java deleted file mode 100644 index 48bae71..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestConstructorThreadAttack.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestConstructorThreadAttack extends RobocodeTestBed { - boolean messagedUnknown; - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("Preventing Thread-") && out.contains("from access to MyAttack")) { - messagedUnknown = true; - } - } - - @Override - public String getRobotNames() { - return "tested.robots.ConstructorThreadAttack,sample.Target"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedUnknown); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestCustomEvents.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestCustomEvents.java deleted file mode 100644 index 8446b86..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestCustomEvents.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import org.junit.Test; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import net.sf.robocode.test.helpers.Assert; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestCustomEvents extends RobocodeTestBed { - - @Test - public void run() { - super.run(); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot gh = event.getTurnSnapshot().getRobots()[1]; - - switch (event.getTurnSnapshot().getTurn()) { - case 130: - test(gh, "130 onTick99\n130 onTick30"); - break; - - case 1451: - test(gh, "1451 onTick99\n1451 onLowEnergy98\n1451 onTick30\n1451 onScannedRobot10"); - break; - - default: - break; - } - } - - private void test(IRobotSnapshot gh, String s) { - Assert.assertTrue("got: " + gh.getOutputStreamSnapshot() + ", expected: " + s, - gh.getOutputStreamSnapshot().contains(s)); - } - - @Override - public String getRobotNames() { - return "sample.Target,tested.robots.CustomEvents"; - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestDuplicatesAndScore.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestDuplicatesAndScore.java deleted file mode 100644 index 0ce124d..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestDuplicatesAndScore.java +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import org.junit.Test; -import robocode.BattleResults; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.RoundStartedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestDuplicatesAndScore extends RobocodeTestBed { - private IRobotSnapshot[] robots; - private BattleResults[] results; - private int lastTurn; - - @Test - public void run() { - super.run(); - } - - @Override - public int getExpectedRobotCount(String list) { - return 8; - } - - @Override - public String getRobotNames() { - return "sample.Fire,tested.robots.TestTeam,tested.robots.TestTeam,sample.Crazy"; - } - - @Override - public void onRoundStarted(final RoundStartedEvent event) { - super.onRoundStarted(event); - if (event.getRound() == 0) { - robots = event.getStartSnapshot().getRobots(); - Assert.assertEquals(8, robots.length); - - net.sf.robocode.test.helpers.Assert.assertNear(568.1445492, robots[0].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(436.7181397, robots[1].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(316.4177265, robots[2].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(721.2294027, robots[3].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(142.7260067, robots[4].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(738.1464346, robots[5].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(335.0596303, robots[6].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(390.7055126, robots[7].getX()); - - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[0].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(200.000, robots[1].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(120.000, robots[2].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[3].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(200.000, robots[4].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(120.000, robots[5].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[6].getEnergy()); - net.sf.robocode.test.helpers.Assert.assertNear(100.000, robots[7].getEnergy()); - } - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - lastTurn = event.getTurnSnapshot().getTurn(); - robots = event.getTurnSnapshot().getRobots(); - - if (lastTurn == 1) { - net.sf.robocode.test.helpers.Assert.assertNear(568.1445492, robots[0].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(437.5845260, robots[1].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(316.4177265, robots[2].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(721.2294027, robots[3].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(142.4365354, robots[4].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(738.1464346, robots[5].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(335.0596303, robots[6].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(389.7078698, robots[7].getX()); - } - - if (lastTurn == 1365) { - net.sf.robocode.test.helpers.Assert.assertNear(468.5942997, robots[0].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(415.4262123, robots[1].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(317.3362130, robots[2].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(671.1937618, robots[3].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(365.6640401, robots[4].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(734.4305396, robots[5].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(368.6778268, robots[6].getX()); - net.sf.robocode.test.helpers.Assert.assertNear(112.8133694, robots[7].getX()); - } - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - if (event.isAborted()) { - results = null; - } - } - - @Override - public void onBattleCompleted(BattleCompletedEvent event) { - results = event.getSortedResults(); - } - - @Override - protected void runTeardown() { - Assert.assertNotNull(results); - Assert.assertNotNull(robots); - Assert.assertThat(robots[0].getName(), is("sample.Fire (1)")); - Assert.assertThat(robots[1].getName(), is("sampleteam.MyFirstLeader (1)")); - Assert.assertThat(robots[2].getName(), is("sampleteam.MyFirstDroid (1)")); - Assert.assertThat(robots[3].getName(), is("sample.Fire (2)")); - Assert.assertThat(robots[4].getName(), is("sampleteam.MyFirstLeader (2)")); - Assert.assertThat(robots[5].getName(), is("sampleteam.MyFirstDroid (2)")); - Assert.assertThat(robots[6].getName(), is("sample.Fire (3)")); - Assert.assertThat(robots[7].getName(), is("sample.Crazy")); - - Assert.assertThat(results[0].getTeamLeaderName(), is("tested.robots.TestTeam (2)")); - Assert.assertThat(results[1].getTeamLeaderName(), is("tested.robots.TestTeam (1)")); - Assert.assertThat(results[2].getTeamLeaderName(), is("sample.Fire (1)")); - Assert.assertThat(results[3].getTeamLeaderName(), is("sample.Crazy")); - - Assert.assertThat(results[0].getLastSurvivorBonus(), is(100)); - Assert.assertThat(results[1].getLastSurvivorBonus(), is(0)); - Assert.assertThat(results[2].getLastSurvivorBonus(), is(0)); - Assert.assertThat(results[3].getLastSurvivorBonus(), is(0)); - - Assert.assertThat(results[0].getRamDamage(), is(0)); - Assert.assertThat(results[1].getRamDamage(), is(2)); - Assert.assertThat(results[2].getRamDamage(), is(2)); - Assert.assertThat(results[3].getRamDamage(), is(10)); - - Assert.assertThat(results[0].getBulletDamageBonus(), is(93)); - Assert.assertThat(results[1].getBulletDamageBonus(), is(18)); - Assert.assertThat(results[2].getBulletDamageBonus(), is(0)); - Assert.assertThat(results[3].getBulletDamageBonus(), is(0)); - - Assert.assertThat(results[0].getBulletDamage(), is(513)); - Assert.assertThat(results[1].getBulletDamage(), is(280)); - Assert.assertThat(results[2].getBulletDamage(), is(89)); - Assert.assertThat(results[3].getBulletDamage(), is(48)); - - Assert.assertThat(results[0].getScore(), is(1206)); - Assert.assertThat(results[1].getScore(), is(650)); - Assert.assertThat(results[2].getScore(), is(242)); - Assert.assertThat(results[3].getScore(), is(158)); - - Assert.assertThat(lastTurn, is(893)); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEnvAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEnvAttack.java deleted file mode 100644 index f1c05ed..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEnvAttack.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -public class TestEnvAttack extends RobocodeTestBed { - boolean messagedAttack; - - @Test - public void run() { - super.run(); - } - - @Override - public String getRobotNames() { - return "tested.robots.BattleLost,tested.robots.EnvAttack"; - } - - @Override - protected int getExpectedErrors() { - return 1; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("AccessControlException: access denied")) { - messagedAttack = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedAttack); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEventPriorityFilter.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEventPriorityFilter.java deleted file mode 100644 index 4800756..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestEventPriorityFilter.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -public class TestEventPriorityFilter extends RobocodeTestBed { - boolean messagedScanned; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Scanned!!!")) { - messagedScanned = true; - } - } - - @Override - public String getRobotNames() { - return "tested.robots.EventPriorityFilter,tested.robots.EventPriorityFilter"; - } - - @Override - protected void runTeardown() { - Assert.assertFalse(messagedScanned); - } -} - diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFairPlay.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFairPlay.java deleted file mode 100644 index 39769a6..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFairPlay.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import org.junit.Assert; -import org.junit.Test; - -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IScoreSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestFairPlay extends RobocodeTestBed { - - ITurnSnapshot lastTurnSnapshot; - - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "tested.robots.FairPlay,tested.robots.FairPlay"; - } - - @Override - public int getNumRounds() { - return 200; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - lastTurnSnapshot = event.getTurnSnapshot(); - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - final IScoreSnapshot[] scores = lastTurnSnapshot.getSortedTeamScores(); - final IScoreSnapshot score1 = scores[0]; - final IScoreSnapshot score2 = scores[1]; - - double minTotal = Math.min(score1.getTotalScore(), score2.getTotalScore()); - double maxTotal = Math.max(score1.getTotalScore(), score2.getTotalScore()); - - Assert.assertTrue("The total scores should be almost the same", maxTotal / minTotal <= 1.05); - - double minFirsts = Math.min(score1.getTotalFirsts(), score2.getTotalFirsts()); - double maxFirsts = Math.max(score1.getTotalFirsts(), score2.getTotalFirsts()); - - Assert.assertTrue("The total firsts should be almost the same", maxFirsts / minFirsts <= 1.05); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileAttack.java deleted file mode 100644 index a7085d0..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileAttack.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - -import java.io.File; - - -/** - * @author Pavel Savara (original) - */ -public class TestFileAttack extends RobocodeTestBed { - boolean messagedWrite; - boolean messagedRead; - - @Test - public void run() { - super.run(); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Preventing tested.robots.FileAttack from access: (java.io.FilePermission C:\\MSDOS.SYS read)") - || out.contains( - "Preventing tested.robots.FileAttack from access: (\"java.io.FilePermission\" \"C:\\MSDOS.SYS\" \"read\")")) { - messagedRead = true; - } - if (out.contains( - "Preventing tested.robots.FileAttack from access: (java.io.FilePermission C:\\Robocode.attack write)") - || out.contains( - "Preventing tested.robots.FileAttack from access: (\"java.io.FilePermission\" \"C:\\Robocode.attack\" \"write\")")) { - messagedWrite = true; - } - } - - @Override - public String getRobotNames() { - return "sample.Fire,tested.robots.FileAttack"; - } - - @Override - protected void runSetup() { - File attack = new File("C:\\Robocode.attack"); - - if (attack.exists()) { - Assert.assertTrue(attack.delete()); - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Didn't seen preventing read", messagedRead); - Assert.assertTrue("Didn't seen preventing write", messagedWrite); - Assert.assertFalse("Found attack file", new File("C:\\Robocode.attack").exists()); - } - - @Override - protected int getExpectedErrors() { - return 2; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileOutputStreamAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileOutputStreamAttack.java deleted file mode 100644 index cc64e98..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileOutputStreamAttack.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestFileOutputStreamAttack extends RobocodeTestBed { - - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robots.FileOutputStreamAttack,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("access denied (java.io.FilePermission") - || out.contains("access denied (\"java.io.FilePermission\"")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("FileOutputStream is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWrite.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWrite.java deleted file mode 100644 index d59c722..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWrite.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; - - -/** - * @author Pavel Savara (original) - */ -public class TestFileWrite extends RobocodeTestBed { - - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "sample.Walls,sample.SittingDuck"; - } - - File file = new File(robotsPath, "/target/classes/sample/SittingDuck.data/count.dat"); - - @Override - protected void runSetup() { - if (file.exists()) { - if (!file.delete()) { - Logger.logError("Can't delete" + file); - } - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue(file.exists()); - if (!file.delete()) { - Logger.logError("Can't delete" + file); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWriteSize.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWriteSize.java deleted file mode 100644 index 12dac22..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestFileWriteSize.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import java.io.File; - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestFileWriteSize extends RobocodeTestBed { - - boolean messagedDataQuota; - boolean messagedDataDirectory; - boolean messagedDataFile; - boolean messageQuotaReached; - boolean robotTerminated; - - @Override - public String getRobotNames() { - return "tested.robots.FileWriteSize,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - String path = robotsPath; - - if (File.separatorChar == '\\') { - out = out.replaceAll("[\\\\]", "/"); - path = path.replaceAll("[\\\\]", "/"); - } - if (out.contains("Data quota: 200000\n")) { - messagedDataQuota = true; - } - if (out.contains("Data directory: " + path + "/target/classes/tested/robots/FileWriteSize.data")) { - messagedDataDirectory = true; - } - if (out.contains("Data file: " + path + "/target/classes/tested/robots/FileWriteSize.data/test")) { - messagedDataFile = true; - } - if (out.contains("You have reached your filesystem quota of: 200000 bytes")) { - messageQuotaReached = true; - } - if (event.getTurnSnapshot().getRobots()[0].getEnergy() == 0) { - robotTerminated = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Data quota must be 200000", messagedDataQuota); - Assert.assertTrue("Data directory path is wrong", messagedDataDirectory); - Assert.assertTrue("Data file path is wrong", messagedDataFile); - Assert.assertTrue("Error must be output that file quota has been exceeded", messageQuotaReached); - Assert.assertTrue("Game must terminate the robot", robotTerminated); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunHeat.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunHeat.java deleted file mode 100644 index f19ea6d..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunHeat.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestGunHeat extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "sample.Target,tested.robots.GunHeat"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot gh = event.getTurnSnapshot().getRobots()[1]; - - switch (event.getTurnSnapshot().getTurn()) { - case 1: - test(gh, "3.0"); - break; - - case 2: - test(gh, "2.8"); - break; - - case 3: - test(gh, "2.699999"); - break; - - case 4: - test(gh, "2.599999"); - break; - - case 9: - test(gh, "2.09999999"); - break; - - case 20: - test(gh, "0.9999999"); - break; - - case 28: - test(gh, "0.19999999"); - break; - - case 29: - test(gh, "0.09999999"); - break; - - case 30: - test(gh, "1.6"); - break; - - case 570: - test(gh, "2.77555"); - break; - - case 571: - test(gh, "0.0"); - break; - - default: - break; - } - } - - private void test(IRobotSnapshot gh, String s) { - Assert.assertTrue(gh.getOutputStreamSnapshot() + " expected " + s, - gh.getOutputStreamSnapshot().contains("after fire: " + s)); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunTurnRate.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunTurnRate.java deleted file mode 100644 index c19543e..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestGunTurnRate.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestGunTurnRate extends RobocodeTestBed { - - StringBuffer buf = new StringBuffer(); - - @Override - public String getRobotNames() { - return "tested.robots.GunTurnRate,sample.Target"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (150,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - buf.append(event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot()); - - if (event.getTurnSnapshot().getTurn() == 16) { - final String out = buf.toString(); - - Assert.assertTrue(out.contains("1: -20.0") | out.contains("1: -19.9999999999")); - Assert.assertTrue(out.contains("2: -20.0") | out.contains("2: -19.9999999999")); - Assert.assertTrue(out.contains("3: 20.0") | out.contains("3: 19.9999999999")); - Assert.assertTrue(out.contains("4: 20.0") | out.contains("4: 19.9999999999")); - Assert.assertTrue(out.contains("5: -25.0") | out.contains("5: -24.9999999999")); - Assert.assertTrue(out.contains("6: -25.0") | out.contains("6: -24.9999999999")); - Assert.assertTrue(out.contains("7: 25.0") | out.contains("7: 24.9999999999")); - Assert.assertTrue(out.contains("8: 25.0") | out.contains("8: 24.9999999999")); - Assert.assertTrue(out.contains("9: -30.0") | out.contains("9: -29.9999999999")); - Assert.assertTrue(out.contains("10: -30.0") | out.contains("10: -29.9999999999")); - Assert.assertTrue(out.contains("11: 30.0") | out.contains("11: 29.9999999999")); - Assert.assertTrue(out.contains("12: 30.0") | out.contains("12: 29.9999999999")); - Assert.assertTrue(out.contains("13: -10.0") | out.contains("13: -9.9999999999")); - Assert.assertTrue(out.contains("14: -10.0") | out.contains("14: -9.9999999999")); - Assert.assertTrue(out.contains("15: 10.0") | out.contains("15: 9.9999999999")); - Assert.assertTrue(out.contains("16: 10.0") | out.contains("16: 9.9999999999")); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestHttpAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestHttpAttack.java deleted file mode 100644 index bd097be..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestHttpAttack.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestHttpAttack extends RobocodeTestBed { - - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robots.HttpAttack,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("access denied (java.net.SocketPermission") - || out.contains("access denied (\"java.net.SocketPermission\"")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("HTTP connection is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return hasJavaNetURLPermission ? 2 : 1; // Security error must be reported as an error. Java 8 reports two errors. - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestIncludeNamespaceAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestIncludeNamespaceAttack.java deleted file mode 100644 index 200d715..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestIncludeNamespaceAttack.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; - - -/** - * @author Pavel Savara (original) - */ -public class TestIncludeNamespaceAttack extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - @Override - protected int getExpectedErrors() { - return 2; - } - - @Override - public int getExpectedRobotCount(String list) { - return 1; - } - - @Override - public String getRobotNames() { - return "tested.robots.DieFast,tested.robots.IncludeNamespaceAttack"; - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestInteruptibleEvent.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestInteruptibleEvent.java deleted file mode 100644 index 8faacad..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestInteruptibleEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; - - -/** - * Test if onScannedRobot() is called when the radar is turned from within a onHitWall() event. - * - * @author Flemming N. Larsen (original) - */ -public class TestInteruptibleEvent extends RobocodeTestBed { - boolean messagedScanned; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Scanned!!!")) { - messagedScanned = true; - } - } - - @Override - public String getRobotNames() { - return "tested.robots.InteruptibleEvent,tested.robots.InteruptibleEvent"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedScanned); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestJunior.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestJunior.java deleted file mode 100644 index 3d8d21c..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestJunior.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import org.junit.Assert; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestJunior extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "tested.robots.JuniorEvents,sample.SittingDuck"; - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[0]; - - if (event.getTurnSnapshot().getTurn() == 590) { - String out = robot.getOutputStreamSnapshot(); - - test(out, "robocode.BulletMissedEvent 5"); - test(out, "robocode.ScannedRobotEvent 100"); - test(out, "robocode.BulletHitEvent 24"); - test(out, "robocode.StatusEvent 590"); - test(out, "robocode.WinEvent 1"); - test(out, "last bullet heading 6.06794172"); - } - } - - private void test(String out, String in) { - Assert.assertTrue(in, out.contains(in)); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestLost.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestLost.java deleted file mode 100644 index cb49cbb..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestLost.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestLost extends RobocodeTestBed { - private int lost = 0; - private int end = 0; - - @Test - public void run() { - super.run(); - } - - @Override - public int getNumRounds() { - return 5; - } - - @Override - public String getRobotNames() { - return "sample.Fire,tested.robots.BattleLost"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[1]; - final String streamSnapshot = robot.getOutputStreamSnapshot(); - - if (streamSnapshot.contains("Death!")) { - lost++; - } - if (streamSnapshot.contains("BattleEnded!")) { - end++; - } - } - - @Override - protected void runTeardown() { - Assert.assertThat("always should loose", lost, is(getNumRounds())); - Assert.assertThat("should get BattleEnded event", end, is(1)); - } - -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxTurnRate.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxTurnRate.java deleted file mode 100644 index b139c08..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxTurnRate.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestMaxTurnRate extends RobocodeTestBed { - - StringBuffer buf = new StringBuffer(); - - @Override - public String getRobotNames() { - return "tested.robots.MaxTurnRate,sample.Target"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (150,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - buf.append(event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot()); - - if (event.getTurnSnapshot().getTurn() == 26) { - final String out = buf.toString(); - - Assert.assertTrue(out.contains("1: 0.0, 0.0") | out.contains("1: 0.0, -0.0")); - Assert.assertTrue(out.contains("2: 0.0, -1.0") | out.contains("2: 0.0, -0.999999999")); - Assert.assertTrue(out.contains("3: 0.0, -2.0") | out.contains("3: 0.0, -1.999999999")); - Assert.assertTrue(out.contains("4: 0.0, -3.0") | out.contains("4: 0.0, -2.999999999")); - Assert.assertTrue(out.contains("5: 0.0, -4.0") | out.contains("5: 0.0, -3.999999999")); - Assert.assertTrue(out.contains("6: 0.0, -5.0") | out.contains("6: 0.0, -4.999999999")); - Assert.assertTrue(out.contains("7: 0.0, -6.0") | out.contains("7: 0.0, -5.999999999")); - Assert.assertTrue(out.contains("8: 0.0, -7.0") | out.contains("8: 0.0, -6.999999999")); - Assert.assertTrue(out.contains("9: 0.0, -8.0") | out.contains("9: 0.0, -7.999999999")); - Assert.assertTrue(out.contains("10: 0.0, -9.0") | out.contains("10: 0.0, -8.999999999")); - Assert.assertTrue(out.contains("11: 0.0, -10.0") | out.contains("11: 0.0, -9.999999999")); - Assert.assertTrue(out.contains("12: 0.0, -10.0") | out.contains("12: 0.0, -9.999999999")); - Assert.assertTrue(out.contains("13: 0.0, -10.0") | out.contains("13: 0.0, -9.999999999")); - - Assert.assertTrue(out.contains("14: 0.0, 0.0") | out.contains("14: 0.0, -0.0")); - Assert.assertTrue(out.contains("15: 0.0, 1.0") | out.contains("15: 0.0, 0.999999999")); - Assert.assertTrue(out.contains("16: 0.0, 2.0") | out.contains("16: 0.0, 1.999999999")); - Assert.assertTrue(out.contains("17: 0.0, 3.0") | out.contains("17: 0.0, 2.999999999")); - Assert.assertTrue(out.contains("18: 0.0, 4.0") | out.contains("18: 0.0, 3.999999999")); - Assert.assertTrue(out.contains("19: 0.0, 5.0") | out.contains("19: 0.0, 4.999999999")); - Assert.assertTrue(out.contains("20: 0.0, 6.0") | out.contains("20: 0.0, 5.999999999")); - Assert.assertTrue(out.contains("21: 0.0, 7.0") | out.contains("21: 0.0, 6.999999999")); - Assert.assertTrue(out.contains("22: 0.0, 8.0") | out.contains("22: 0.0, 7.999999999")); - Assert.assertTrue(out.contains("23: 0.0, 9.0") | out.contains("23: 0.0, 8.999999999")); - Assert.assertTrue(out.contains("24: 0.0, 10.0") | out.contains("24: 0.0, 9.999999999")); - Assert.assertTrue(out.contains("25: 0.0, 10.0") | out.contains("25: 0.0, 9.999999999")); - Assert.assertTrue(out.contains("26: 0.0, 10.0") | out.contains("26: 0.0, 9.999999999")); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxVelocity.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxVelocity.java deleted file mode 100644 index ac28d8b..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestMaxVelocity.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; -import robocode.util.Utils; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestMaxVelocity extends RobocodeTestBed { - - @Override - public String getRobotNames() { - return "tested.robots.MaxVelocity,sample.Target"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (600,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final int time = (int) event.getTurnSnapshot().getTurn(); - final double velocity = event.getTurnSnapshot().getRobots()[0].getVelocity(); - - switch (time) { - case 10: - case 20: - case 100: - Assert.assertTrue(Utils.isNear(velocity, 8)); - break; - - case 32: - case 40: - case 120: - Assert.assertTrue(Utils.isNear(velocity, -8)); - break; - - case 50: - case 60: - Assert.assertTrue(Utils.isNear(velocity, 4.2)); - break; - - case 70: - case 80: - Assert.assertTrue(Utils.isNear(velocity, -4.2)); - break; - - case 130: - case 140: - Assert.assertTrue(Utils.isNear(velocity, 2)); - break; - - case 150: - case 160: - Assert.assertTrue(Utils.isNear(velocity, -2)); - break; - - case 170: - case 180: - case 190: - case 199: - Assert.assertTrue(Utils.isNear(velocity, 0)); - break; - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestNames.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestNames.java deleted file mode 100644 index 3eacb74..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestNames.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; - - -/** - * @author Pavel Savara (original) - */ -public class TestNames extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - @Override - protected int getExpectedErrors() { - return 4; - } - - @Override - public int getExpectedRobotCount(String list) { - return 2; - } - - @Override - public String getRobotNames() { - return "sample.Fire,robocode.BadNamespace,tested.robots.TooLongNameThisIsReallyTooLongName,tooLongNamespaceThisIsReallyTooLongNamespace.TooLongNamespace,NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger,NoPackageShortName"; - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPosition.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPosition.java deleted file mode 100644 index b8055e2..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPosition.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Test; -import robocode.control.events.RoundStartedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * Repeatable robot possition test - * - * @author Pavel Savara (original) - */ -public class TestPosition extends RobocodeTestBed { - int lastTurn; - - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "sample.Crazy,sample.Target"; - } - - @Override - public void onRoundStarted(final RoundStartedEvent event) { - super.onRoundStarted(event); - if (event.getRound() == 0) { - IRobotSnapshot crazy = event.getStartSnapshot().getRobots()[0]; - IRobotSnapshot target = event.getStartSnapshot().getRobots()[1]; - - Assert.assertNear(568.1445492, crazy.getX()); - Assert.assertNear(163.0032275, crazy.getY()); - Assert.assertNear(436.7181397, target.getX()); - Assert.assertNear(351.5039067, target.getY()); - } - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - lastTurn = event.getTurnSnapshot().getTurn(); - - IRobotSnapshot crazy = event.getTurnSnapshot().getRobots()[0]; - IRobotSnapshot target = event.getTurnSnapshot().getRobots()[1]; - - if (lastTurn == 1) { - Assert.assertNear(567.2831835, crazy.getX()); - Assert.assertNear(162.4952421, crazy.getY()); - Assert.assertNear(436.7181397, target.getX()); - Assert.assertNear(351.5039067, target.getY()); - } - - if (lastTurn == 1700) { - Assert.assertNear(373.9958377, crazy.getX()); - Assert.assertNear(196.1380677, crazy.getY()); - Assert.assertNear(340.3212984, target.getX()); - Assert.assertNear(456.5502002, target.getY()); - } - } - - @Override - protected void runTeardown() { - Assert.assertThat(lastTurn, is(2080)); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPrivateConstructor.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPrivateConstructor.java deleted file mode 100644 index 5c9b5c9..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestPrivateConstructor.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestPrivateConstructor extends RobocodeTestBed { - boolean messaged; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(final TurnEndedEvent event) { - super.onTurnEnded(event); - final IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[1]; - - if (robot.getOutputStreamSnapshot().contains("SYSTEM: Is your constructor marked public?")) { - messaged = true; - } - Assert.assertNear(0, robot.getEnergy()); - } - - @Override - public String getRobotNames() { - return "sample.Fire,tested.robots.PrivateConstructor"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messaged); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} - diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRadarTurnRateAndSetAdjust.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRadarTurnRateAndSetAdjust.java deleted file mode 100644 index f5b28bc..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRadarTurnRateAndSetAdjust.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestRadarTurnRateAndSetAdjust extends RobocodeTestBed { - - StringBuffer buf = new StringBuffer(); - - @Override - public String getRobotNames() { - return "tested.robots.RadarTurnRateAndSetAdjust,sample.Target"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (150,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - buf.append(event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot()); - - if (event.getTurnSnapshot().getTurn() == 14) { - final String out = buf.toString(); - - Assert.assertTrue(out.contains("1: 45.0") | out.contains("1: 44.999999999")); - Assert.assertTrue(out.contains("2: 65.0") | out.contains("2: 64.999999999")); - Assert.assertTrue(out.contains("3: 75.0") | out.contains("3: 74.999999999")); - Assert.assertTrue(out.contains("4: -15.0") | out.contains("4: -14.999999999")); - Assert.assertTrue(out.contains("5: -55.0") | out.contains("5: -54.999999999")); - Assert.assertTrue(out.contains("6: -75.0") | out.contains("6: -74.999999999")); - Assert.assertTrue(out.contains("7: 32.0") | out.contains("7: 31.999999999")); - Assert.assertTrue(out.contains("8: 17.0") | out.contains("8: 16.999999999")); - Assert.assertTrue(out.contains("9: 35.0") | out.contains("9: 34.999999999")); - Assert.assertTrue(out.contains("10: 3.0") | out.contains("10: 2.999999999")); - Assert.assertTrue(out.contains("11: -21.0") | out.contains("11: -20.999999999")); - Assert.assertTrue(out.contains("12: 75.0") | out.contains("12: 74.999999999")); - Assert.assertTrue(out.contains("13: -75.0") | out.contains("13: -74.999999999")); - Assert.assertTrue(out.contains("14: -15.0") | out.contains("14: -14.999999999")); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRandom.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRandom.java deleted file mode 100644 index f5d846a..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRandom.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * Repeatable random test - * - * @author Pavel Savara (original) - */ -public class TestRandom extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "sample.Fire,tested.robots.Random"; - } - - @Override - public boolean isCheckOnBattleStart() { - return true; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - Assert.assertTrue(event.getTurnSnapshot().getTurn() <= 1407); - IRobotSnapshot fire = event.getTurnSnapshot().getRobots()[0]; - IRobotSnapshot random = event.getTurnSnapshot().getRobots()[1]; - - if (event.getTurnSnapshot().getTurn() == 1241) { - Assert.assertNear(213.18621928, fire.getX()); - Assert.assertNear(371.45706118, fire.getY()); - Assert.assertNear(782.0, random.getX()); - Assert.assertNear(230.95479253, random.getY()); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRankingsWithTargetRobots.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRankingsWithTargetRobots.java deleted file mode 100644 index 3536f0f..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRankingsWithTargetRobots.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IScoreSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - - -/** - * This test is used for checking the rankings of two sample.Target robots, i.e. - * robots that does not shot, but is just waiting for someone to shot them. As - * two sample.Targets robots are not fighting each other, the battles are - * expected to end fairly even, but not necessarily due to collisions between - * the robots and the wall. - * - * @author Flemming N. Larsen (original) - */ -public class TestRankingsWithTargetRobots extends RobocodeTestBed { - - ITurnSnapshot lastTurnSnapshot; - - @Override - public String getRobotNames() { - return "sample.Target,sample.Target"; - } - - @Override - public int getNumRounds() { - return 20; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - lastTurnSnapshot = event.getTurnSnapshot(); - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - final IScoreSnapshot[] scores = lastTurnSnapshot.getSortedTeamScores(); - final IScoreSnapshot score1 = scores[0]; - final IScoreSnapshot score2 = scores[1]; - - // 1sts + 2nds = number of rounds, e.g. 4 + 6 = 10 (where 4 is 1st places, and 6 is 2nd places) - Assert.assertThat("1st ranked robot's total 1st and 2nd places must be equal to the number of rounds", - score1.getTotalFirsts() + score1.getTotalSeconds(), is(getNumRounds())); - Assert.assertThat("2nd ranked robot's total 1st and 2nd places must be equal to the number of rounds", - score2.getTotalFirsts() + score2.getTotalSeconds(), is(getNumRounds())); - - // If 1st robot's 1sts = 6, 2nds = 4, then 2nd robot's 1sts = 4, 2nds = 6 - /* Assert.assertThat( - "1st ranked robot's number of 1st places must be equal to the 2nd ranked robot's number of 2nd places", - score1.getTotalFirsts(), is(score2.getTotalSeconds())); - Assert.assertThat( - "2nd ranked robot's number of 1st places must be equal to the 1st ranked robot's number of 2nd places", - score2.getTotalFirsts(), is(score1.getTotalSeconds()));*/ - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRateControl.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRateControl.java deleted file mode 100644 index efbd12d..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRateControl.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import static robocode.util.Utils.normalRelativeAngle; - -import org.junit.Test; - -import robocode.control.events.RoundStartedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - - -/** - * @author Joshua Galecki (original) - */ -public class TestRateControl extends RobocodeTestBed { - int turnNumber; - double originalHeading; - double originalX; - double originalGunHeading; - double originalRadarHeading; - - @Test - public void run() { - super.run(); - } - - @Override - public String getRobotNames() { - return "tested.robots.RateControl,sample.Target"; - } - - @Override - public String getInitialPositions() { - return "(320,220,0), (50,50,0)"; // Make sure the robot doesn't start too near to a wall - } - - @Override - public void onRoundStarted(final RoundStartedEvent event) { - super.onRoundStarted(event); - IRobotSnapshot rate = event.getStartSnapshot().getRobots()[0]; - - originalHeading = rate.getBodyHeading(); - originalX = rate.getX(); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - turnNumber = event.getTurnSnapshot().getTurn(); - - IRobotSnapshot rate = event.getTurnSnapshot().getRobots()[0]; - - // Test turnRate - if (turnNumber == 10) { - Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getBodyHeading() - originalHeading)); - } - if (turnNumber == 20) { - Assert.assertNear(-Math.PI / 4, normalRelativeAngle(rate.getBodyHeading() - originalHeading)); - } - if (turnNumber == 25) { - // Test that turnRate was set to zero - Assert.assertNear(-Math.PI / 4, normalRelativeAngle(rate.getBodyHeading() - originalHeading)); - - // Test velocityRate - double theta = rate.getBodyHeading(); - double deltaX = rate.getX() - originalX; - double distanceTravelled = deltaX / Math.sin(theta); - - Assert.assertNear(9, distanceTravelled); - } - if (turnNumber == 35) { - double theta = rate.getBodyHeading(); - double deltaX = rate.getX() - originalX; - double distanceTravelled = deltaX / Math.sin(theta); - - Assert.assertNear(-35, distanceTravelled); - originalGunHeading = rate.getGunHeading(); - } - if (turnNumber == 45) { - // Test that velocityRate was set to zero - double theta = rate.getBodyHeading(); - double deltaX = rate.getX() - originalX; - double distanceTravelled = deltaX / Math.sin(theta); - - Assert.assertNear(-47, distanceTravelled); - - // test gunRotationRate - Assert.assertNear(Math.PI / 2, normalRelativeAngle(rate.getGunHeading() - originalGunHeading)); - } - if (turnNumber == 55) { - Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getGunHeading() - originalGunHeading)); - originalRadarHeading = rate.getRadarHeading(); - } - - if (turnNumber == 65) { - // test that gunRotationRate was set to zero - Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getGunHeading() - originalGunHeading)); - - // test radarRotationRate - Assert.assertNear(Math.PI / 2, normalRelativeAngle(rate.getRadarHeading() - originalRadarHeading)); - } - if (turnNumber == 75) { - Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getRadarHeading() - originalRadarHeading)); - } - if (turnNumber == 76) { - // test that radarRotationRate was set to zero - Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getRadarHeading() - originalRadarHeading)); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReflectionAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReflectionAttack.java deleted file mode 100644 index 218f2de..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReflectionAttack.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestReflectionAttack extends RobocodeTestBed { - - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robots.ReflectionAttack,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("access denied (java.lang.reflect.ReflectPermission") - || out.contains("access denied (\"java.lang.reflect.ReflectPermission\"")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Reflection is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReverseDirection.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReverseDirection.java deleted file mode 100644 index 2b0da8b..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestReverseDirection.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; -import robocode.util.Utils; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestReverseDirection extends RobocodeTestBed { - - @Override - public String getRobotNames() { - return "tested.robots.ReverseDirection,sample.Target"; - } - - @Override - public String getInitialPositions() { - return "(50,50,0), (600,50,0)"; // Make sure the robots do not collide! - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final int time = (int) event.getTurnSnapshot().getTurn(); - final double velocity = event.getTurnSnapshot().getRobots()[0].getVelocity(); - - switch (time) { - case 1: - Assert.assertTrue(Utils.isNear(velocity, 1.0)); - break; - - case 2: - Assert.assertTrue(Utils.isNear(velocity, -0.5)); - break; - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRobotDeathEvents.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRobotDeathEvents.java deleted file mode 100644 index 45b0781..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestRobotDeathEvents.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestRobotDeathEvents extends RobocodeTestBed { - - @Override - public String getRobotNames() { - return "tested.robots.RobotDeathEvents,sample.Crazy,sample.Target,sample.Target,sample.Target"; - } - - @Override - public int getNumRounds() { - return 5; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("enemyCount != getOthers()")) { - Assert.fail("Robot is missing RobotDeathEvent"); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestScoring.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestScoring.java deleted file mode 100644 index 5fb08f3..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestScoring.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.RoundEndedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IScoreSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - - -/** - * This test is used for testing if the current scores and total scores are - * calculated correctly. Current scores are tested at each turn, and the total - * scores are tested per round and per battle. - * - * @author Flemming N. Larsen (original) - */ -public class TestScoring extends RobocodeTestBed { - - ITurnSnapshot lastTurnSnapshot; - - @Override - public String getRobotNames() { - return "sample.Corners,sample.Crazy,sample.Fire,sample.RamFire,sample.SittingDuck,sample.SpinBot,sample.Tracker,sample.TrackFire,sample.Walls"; - } - - @Override - public int getNumRounds() { - return 10; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - lastTurnSnapshot = event.getTurnSnapshot(); - - for (IScoreSnapshot score : lastTurnSnapshot.getSortedTeamScores()) { - // Notice that the is no such thing as a 'current total last - // survivor bonus' - double currentScore = score.getCurrentSurvivalScore() + score.getCurrentBulletDamageScore() - + score.getCurrentBulletKillBonus() + score.getCurrentRammingDamageScore() - + score.getCurrentRammingKillBonus() + score.getCurrentSurvivalBonus(); - - Assert.assertNear(currentScore, score.getCurrentScore()); - } - } - - @Override - public void onRoundEnded(RoundEndedEvent event) { - super.onRoundEnded(event); - - for (IScoreSnapshot score : lastTurnSnapshot.getSortedTeamScores()) { - - double totalScore = score.getTotalSurvivalScore() + score.getTotalLastSurvivorBonus() - + score.getTotalBulletDamageScore() + score.getTotalBulletKillBonus() + score.getTotalRammingDamageScore() - + score.getTotalRammingKillBonus(); - - Assert.assertNear(totalScore, score.getTotalScore()); - } - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - for (IScoreSnapshot score : lastTurnSnapshot.getSortedTeamScores()) { - - double totalScore = score.getTotalSurvivalScore() + score.getTotalLastSurvivorBonus() - + score.getTotalBulletDamageScore() + score.getTotalBulletKillBonus() + score.getTotalRammingDamageScore() - + score.getTotalRammingKillBonus(); - - Assert.assertNear(totalScore, score.getTotalScore()); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSkippedTurns.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSkippedTurns.java deleted file mode 100644 index c0f9959..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSkippedTurns.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import org.junit.Ignore; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -@Ignore("is very timing sensitive test, so it usually fails on different machines, please run explicitly if you did something to security or timing") -public class TestSkippedTurns extends RobocodeTestBed { - boolean messagedBattle; - boolean messagedEvent; - - @Test - public void run() { - super.run(); - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[1].getOutputStreamSnapshot(); - - if (out.contains("Skipped!!!")) { - messagedEvent = true; - } - if (out.contains("not performed any actions in a reasonable")) { - messagedBattle = true; - } - } - - @Override - public String getRobotNames() { - return "sample.TrackFire,tested.robots.SkipTurns"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedEvent); - Assert.assertTrue(messagedBattle); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSocketAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSocketAttack.java deleted file mode 100644 index da634ac..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestSocketAttack.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Assert; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Flemming N. Larsen (original) - */ -public class TestSocketAttack extends RobocodeTestBed { - - private boolean messagedAccessDenied; - - @Override - public String getRobotNames() { - return "tested.robots.SocketAttack,sample.Target"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("access denied (java.net.SocketPermission") - || out.contains("access denied (\"java.net.SocketPermission\"")) { - messagedAccessDenied = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue("Socket connection is not allowed", messagedAccessDenied); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadAttack.java deleted file mode 100644 index e4233fa..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadAttack.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import org.junit.Ignore; - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import robocode.control.events.TurnEndedEvent; - - -/** - * @author Pavel Savara (original) - */ -@Ignore("Please run explicitly if you did something to security or timing") -public class TestThreadAttack extends RobocodeTestBed { - boolean messagedMax; - boolean messagedUnknown; - - @Override - public String getRobotNames() { - return "tested.robots.ThreadAttack,sample.SittingDuck"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("Robots are only allowed to create up to 5 threads!")) { - messagedMax = true; - } - - if (out.contains("Preventing Thread-") && out.contains("from access to MyAttack")) { - messagedUnknown = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedMax); - Assert.assertTrue(messagedUnknown); - } - - @Override - protected int getExpectedErrors() { - return 1; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadGroupAttack.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadGroupAttack.java deleted file mode 100644 index efd019d..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestThreadGroupAttack.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import robocode.control.events.TurnEndedEvent; - - -/** - * This test was made due to hacker.Destroyer 1.3, which proved a security breach in - * Robocode 1.7.2.1 Beta. The security breach was reported with: - * Bug [3021140] Possible for robot to kill other robot threads. - * - * The security manager of Robocode must make sure that unsafe (robot) threads cannot - * access thread groups other than its own thread group within checkAccess(Thread). - * - * @author Flemming N. Larsen (original) - */ -public class TestThreadGroupAttack extends RobocodeTestBed { - boolean messagedInterrupted; - boolean messagedPreventing; - - @Override - public String getRobotNames() { - return "tested.robots.ThreadGroupAttack,sample.SittingDuck"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final String out = event.getTurnSnapshot().getRobots()[0].getOutputStreamSnapshot(); - - if (out.contains("Interrupted: sample.SittingDuck")) { - messagedInterrupted = true; - } - - if (out.contains("Preventing tested.robots.ThreadGroupAttack from access to sample.SittingDuck")) { - messagedPreventing = true; - } - } - - @Override - protected void runTeardown() { - Assert.assertFalse(messagedInterrupted); - Assert.assertTrue(messagedPreventing); - } - - @Override - protected int getExpectedErrors() { - return 3; // Security error must be reported as an error - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestUndeadThread.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestUndeadThread.java deleted file mode 100644 index 5e76bad..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestUndeadThread.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.Assert; -import net.sf.robocode.test.helpers.RobocodeTestBed; -import org.junit.Test; -import org.junit.Ignore; -import robocode.control.events.BattleErrorEvent; - - -/** - * @author Pavel Savara (original) - */ -@Ignore("is very time consuming test, please run explicitly if you did something to security or timing") -public class TestUndeadThread extends RobocodeTestBed { - boolean messagedStop; - boolean messagedForcing; - - @Test - public void run() { - super.run(); - } - - public void onBattleError(BattleErrorEvent event) { - super.onBattleError(event); - final String error = event.getError(); - - if (error.contains("is not stopping. Forcing a stop.")) { - messagedForcing = true; - } - if (error.contains("Unable to stop thread")) { - messagedStop = true; - } - } - - @Override - protected int getExpectedErrors() { - return 3; - } - - @Override - public String getRobotNames() { - return "sample.SittingDuck,tested.robots.UndeadThread"; - } - - @Override - protected void runTeardown() { - Assert.assertTrue(messagedForcing); - Assert.assertTrue(messagedStop); - } - -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWatchBullet.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWatchBullet.java deleted file mode 100644 index 7f3cbe0..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWatchBullet.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; - -import org.junit.Assert; -import org.junit.Test; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - */ -public class TestWatchBullet extends RobocodeTestBed { - @Test - public void run() { - super.run(); - } - - public String getRobotNames() { - return "tested.robots.WatchBullets,sample.SittingDuck"; - } - - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - final IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[0]; - - final String out = robot.getOutputStreamSnapshot(); - final int time = event.getTurnSnapshot().getTurn(); - - test(out, time, 33, "33 487.438779505497 119.51131582855926 347.66745091446046 true"); - test(out, time, 45, "45 459.24550664858225 248.46533618316306 347.66745091446046 true"); - test(out, time, 52, "52 442.799430815382 323.6885147233484 347.66745091446046 true"); - test(out, time, 53, "53 440.4499914106391 334.43468308623204 347.66745091446046 false"); - } - - private void test(String out, int timecurr, int timeWatch, String in) { - if (timecurr == timeWatch) { - Assert.assertTrue("got: " + out + ", expected: " + in, out.contains(in)); - } - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWin.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWin.java deleted file mode 100644 index c16b99c..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/robots/TestWin.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.robots; - - -import net.sf.robocode.test.helpers.RobocodeTestBed; -import static org.hamcrest.CoreMatchers.is; -import org.junit.Assert; -import org.junit.Test; -import robocode.BattleResults; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; - - -/** - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public class TestWin extends RobocodeTestBed { - private BattleResults[] results; - private StringBuffer outputBuf = new StringBuffer(); - - @Test - public void run() { - super.run(); - } - - @Override - public int getNumRounds() { - return 5; - } - - @Override - public String getRobotNames() { - return "sample.MyFirstRobot,tested.robots.BattleWin"; - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - super.onTurnEnded(event); - IRobotSnapshot robot = event.getTurnSnapshot().getRobots()[1]; - final String streamSnapshot = robot.getOutputStreamSnapshot(); - - outputBuf.append(streamSnapshot); - } - - public void onBattleCompleted(BattleCompletedEvent event) { - results = event.getSortedResults(); - } - - @Override - protected void runTeardown() { - String[] lines = outputBuf.toString().split("\\n"); - - Assert.assertThat(lines[1], is("Round 1 of 5")); - Assert.assertThat(lines[3], is("RoundEnded!")); - Assert.assertThat(lines[4], is("SYSTEM: tested.robots.BattleWin has died")); - Assert.assertThat(lines[5], is("Death!")); - Assert.assertThat(lines[7], is("Round 2 of 5")); - Assert.assertThat(lines[9], is("RoundEnded!")); - Assert.assertThat(lines[10], is("SYSTEM: tested.robots.BattleWin has died")); - Assert.assertThat(lines[11], is("Death!")); - Assert.assertThat(lines[13], is("Round 3 of 5")); - Assert.assertThat(lines[15], is("SYSTEM: Bonus for killing sample.MyFirstRobot: 1")); - Assert.assertThat(lines[16], is("SYSTEM: tested.robots.BattleWin wins the round.")); - Assert.assertThat(lines[17], is("RoundEnded!")); - Assert.assertThat(lines[18], is("Win!")); - Assert.assertThat(lines[20], is("Round 4 of 5")); - Assert.assertThat(lines[22], is("SYSTEM: Bonus for killing sample.MyFirstRobot: 3")); - Assert.assertThat(lines[23], is("SYSTEM: tested.robots.BattleWin wins the round.")); - Assert.assertThat(lines[24], is("RoundEnded!")); - Assert.assertThat(lines[25], is("Win!")); - Assert.assertThat(lines[27], is("Round 5 of 5")); - Assert.assertThat(lines[29], is("SYSTEM: tested.robots.BattleWin wins the round.")); - Assert.assertThat(lines[30], is("RoundEnded!")); - Assert.assertThat(lines[31], is("Win!")); - Assert.assertThat(lines[32], is("BattleEnded!")); - - Assert.assertThat("1st robot should get right score", results[0].getScore(), is(233)); - Assert.assertThat("2nd robot should get right score", results[1].getScore(), is(216)); - } -} diff --git a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/samples/RobocodeRunner.java b/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/samples/RobocodeRunner.java deleted file mode 100644 index 3bb11f0..0000000 --- a/代码/workspace_robo4/robocode.tests/src/test/java/net/sf/robocode/test/samples/RobocodeRunner.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.test.samples; - - -import robocode.BattleResults; -import robocode.control.*; -import robocode.control.events.*; - - -/** - * Sample application that runs two sample robots in Robocode. - * - * @author Flemming N. Larsen (original) - */ -public class RobocodeRunner { - - public static void main(String[] args) { - - // Battle listener used for receiving battle events - BattleObserver battleListener = new BattleObserver(); - - // Create the RobocodeEngine - // IRobocodeEngine engine = new RobocodeEngine(new java.io.File("C:/Robocode")); // Run from C:/Robocode - RobocodeEngine engine = new RobocodeEngine(); // Run from current working directory - - // Add battle listener to our RobocodeEngine - engine.addBattleListener(battleListener); - - // Show the battles - engine.setVisible(true); - - // Setup the battle specification - - int numberOfRounds = 5; - BattlefieldSpecification battlefield = new BattlefieldSpecification(800, 600); // 800x600 - RobotSpecification[] selectedRobots = engine.getLocalRepository("sample.RamFire, sample.Corners"); - - BattleSpecification battleSpec = new BattleSpecification(numberOfRounds, battlefield, selectedRobots); - - // Run our specified battle and let it run till it's over - engine.runBattle(battleSpec, true/* wait till the battle is over */); - - // Cleanup our RobocodeEngine - engine.close(); - - // Make sure that the Java VM is shut down properly - System.exit(0); - } - - /** - * BattleListener for handling the battle event we are interested in. - */ - static class BattleObserver extends BattleAdaptor { - - public void onBattleStarted(BattleStartedEvent e) { - System.out.println("-- Battle was started --"); - } - - public void onBattleFinished(BattleFinishedEvent e) { - if (e.isAborted()) { - System.out.println("-- Battle was aborted --"); - } else { - System.out.println("-- Battle was finished succesfully --"); - } - } - - public void onBattleCompleted(BattleCompletedEvent e) { - System.out.println("-- Battle has completed --"); - - // Print out the sorted results with the robot names - System.out.println("\n-- Battle results --"); - for (BattleResults result : e.getSortedResults()) { - System.out.println(" " + result.getTeamLeaderName() + ": " + result.getScore()); - } - } - - public void onBattleMessage(BattleMessageEvent e) { - System.out.println("Msg> " + e.getMessage()); - } - - public void onBattleError(BattleErrorEvent e) { - System.out.println("Err> " + e.getError()); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/.classpath b/代码/workspace_robo4/robocode.ui.editor/.classpath deleted file mode 100644 index b053438..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/.classpath +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.ui.editor/.project b/代码/workspace_robo4/robocode.ui.editor/.project deleted file mode 100644 index 10502cc..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - robocode.ui.editor - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.ui - robocode.api - robocode.core - robocode.battle - robocode.host - robocode.repository - robocode.sound - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.ui.editor/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.ui.editor/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.ui.editor/pom.xml b/代码/workspace_robo4/robocode.ui.editor/pom.xml deleted file mode 100644 index 1554dfa..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - robocode.ui.editor - Robocode UI Robot editor - - robocode - net.sf.robocode - ${robocode.version} - - - - net.sf.robocode - robocode.ui - ${project.version} - - - diff --git a/代码/workspace_robo4/robocode.ui.editor/robocode.ui.editor.iml b/代码/workspace_robo4/robocode.ui.editor/robocode.ui.editor.iml deleted file mode 100644 index 45f9610..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/robocode.ui.editor.iml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerPreferencesDialog.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerPreferencesDialog.java deleted file mode 100644 index 3286733..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerPreferencesDialog.java +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.FileOutputStream; -import java.io.IOException; - - -/** - * @author Mathew A. Nelson (original) - * @author Matthew Reeder (contributor) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class CompilerPreferencesDialog extends JDialog { - - private JButton cancelButton; - private JTextField compilerBinaryField; - private JTextField compilerClasspathField; - private JTextField compilerOptionsField; - private JPanel compilerPreferencesContentPane; - private CompilerProperties compilerProperties; - private JButton okButton; - - private final EventHandler eventHandler = new EventHandler(); - - private class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (e.getSource().equals(getOkButton())) { - if (compilerProperties == null) { - compilerProperties = new CompilerProperties(); - } - compilerProperties.setCompilerBinary(getCompilerBinaryField().getText()); - compilerProperties.setCompilerOptions(getCompilerOptionsField().getText()); - compilerProperties.setCompilerClasspath(getCompilerClasspathField().getText()); - saveCompilerProperties(); - dispose(); - } - if (e.getSource().equals(getCancelButton())) { - dispose(); - } - } - } - - public CompilerPreferencesDialog(JFrame owner) { - super(owner, true); - this.compilerProperties = net.sf.robocode.core.Container.getComponent(RobocodeCompilerFactory.class).getCompilerProperties(); - initialize(); - } - - private void initialize() { - setTitle("Compiler Preferences"); - setContentPane(getCompilerPreferencesContentPane()); - } - - public JButton getCancelButton() { - if (cancelButton == null) { - cancelButton = new JButton("Cancel"); - cancelButton.setMnemonic('C'); - cancelButton.addActionListener(eventHandler); - } - return cancelButton; - } - - public JTextField getCompilerBinaryField() { - if (compilerBinaryField == null) { - compilerBinaryField = new JTextField(40); - compilerBinaryField.setText(compilerProperties.getCompilerBinary()); - } - return compilerBinaryField; - } - - public JTextField getCompilerClasspathField() { - if (compilerClasspathField == null) { - compilerClasspathField = new JTextField(40); - compilerClasspathField.setText(compilerProperties.getCompilerClasspath()); - } - return compilerClasspathField; - } - - public JTextField getCompilerOptionsField() { - if (compilerOptionsField == null) { - compilerOptionsField = new JTextField(40); - compilerOptionsField.setText(compilerProperties.getCompilerOptions()); - } - return compilerOptionsField; - } - - private JPanel getCompilerPreferencesContentPane() { - if (compilerPreferencesContentPane == null) { - compilerPreferencesContentPane = new JPanel(); - compilerPreferencesContentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - compilerPreferencesContentPane.setLayout(new BoxLayout(compilerPreferencesContentPane, BoxLayout.Y_AXIS)); - JLabel label = new JLabel("Compiler Binary:"); - - label.setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(label); - - getCompilerBinaryField().setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(getCompilerBinaryField()); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(label); - label = new JLabel("Compiler Options:"); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(label); - getCompilerOptionsField().setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(getCompilerOptionsField()); - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(label); - label = new JLabel("Compiler Classpath:"); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(label); - getCompilerClasspathField().setAlignmentX(Component.LEFT_ALIGNMENT); - compilerPreferencesContentPane.add(getCompilerClasspathField()); - JPanel panel = new JPanel(); - - panel.setAlignmentX(Component.LEFT_ALIGNMENT); - panel.add(getOkButton()); - panel.add(getCancelButton()); - compilerPreferencesContentPane.add(panel); - } - return compilerPreferencesContentPane; - } - - public JButton getOkButton() { - if (okButton == null) { - okButton = new JButton("OK"); - okButton.setMnemonic('O'); - okButton.addActionListener(eventHandler); - } - return okButton; - } - - public void saveCompilerProperties() { - if (compilerProperties == null) { - Logger.logError("Cannot save null compiler properties"); - return; - } - FileOutputStream out = null; - - try { - out = new FileOutputStream(FileUtil.getCompilerConfigFile()); - - compilerProperties.store(out, "Robocode Compiler Properties"); - } catch (IOException e) { - Logger.logError(e); - } finally { - if (out != null) { - try { - out.close(); - } catch (IOException ignored) {} - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerProperties.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerProperties.java deleted file mode 100644 index d105f54..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompilerProperties.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Properties; - - -/** - * @author Mathew A. Nelson (original) - */ -public class CompilerProperties { - public final static String COMPILER_BINARY = "compiler.binary"; - public final static String COMPILER_OPTIONS = "compiler.options"; - public final static String COMPILER_CLASSPATH = "compiler.classpath"; - public final static String ROBOCODE_VERSION = "robocode.version"; - - private String compilerBinary; - private String compilerOptions; - private String compilerClasspath; - private String robocodeVersion; - - private final Properties props = new Properties(); - - public CompilerProperties() { - super(); - } - - /** - * Returns the compilerBinary. - * - * @return String - */ - public String getCompilerBinary() { - if (compilerBinary == null) { - setCompilerBinary(""); - } - return compilerBinary; - } - - /** - * Returns the compilerClasspath. - * - * @return String - */ - public String getCompilerClasspath() { - if (compilerClasspath == null) { - setCompilerClasspath(""); - } - return compilerClasspath; - } - - /** - * Returns the compilerOptions. - * - * @return String - */ - public String getCompilerOptions() { - if (compilerOptions == null) { - setCompilerOptions(""); - } - return compilerOptions; - } - - /** - * Returns the robocodeVersion. - * - * @return String - */ - public String getRobocodeVersion() { - return robocodeVersion; - } - - public void resetCompiler() { - this.compilerBinary = null; - props.remove(COMPILER_BINARY); - } - - /** - * Sets the compilerBinary. - * - * @param compilerBinary The compilerBinary to set - */ - public void setCompilerBinary(String compilerBinary) { - this.compilerBinary = compilerBinary; - props.setProperty(COMPILER_BINARY, compilerBinary); - } - - /** - * Sets the compilerClasspath. - * - * @param compilerClasspath The compilerClasspath to set - */ - public void setCompilerClasspath(String compilerClasspath) { - this.compilerClasspath = compilerClasspath; - props.setProperty(COMPILER_CLASSPATH, compilerClasspath); - } - - /** - * Sets the compilerOptions. - * - * @param compilerOptions The compilerOptions to set - */ - public void setCompilerOptions(String compilerOptions) { - this.compilerOptions = compilerOptions; - props.setProperty(COMPILER_OPTIONS, compilerOptions); - } - - /** - * Sets the robocodeVersion. - * - * @param robocodeVersion The robocodeVersion to set - */ - public void setRobocodeVersion(String robocodeVersion) { - this.robocodeVersion = robocodeVersion; - props.setProperty(ROBOCODE_VERSION, robocodeVersion); - } - - public void load(InputStream is) throws IOException { - props.load(is); - this.compilerBinary = props.getProperty(COMPILER_BINARY); - this.compilerOptions = props.getProperty(COMPILER_OPTIONS); - this.compilerClasspath = props.getProperty(COMPILER_CLASSPATH); - this.robocodeVersion = props.getProperty(ROBOCODE_VERSION); - } - - public void store(OutputStream os, String header) throws IOException { - props.store(os, header); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompoundUndoManager.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompoundUndoManager.java deleted file mode 100644 index efa4ebf..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/CompoundUndoManager.java +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import javax.swing.event.UndoableEditEvent; -import javax.swing.event.DocumentEvent.EventType; -import javax.swing.text.AbstractDocument.DefaultDocumentEvent; -import javax.swing.text.BadLocationException; -import javax.swing.undo.CannotUndoException; -import javax.swing.undo.CompoundEdit; -import javax.swing.undo.UndoableEdit; - - -/** - * Undo manager that compounds undo and redo edits. - * - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class CompoundUndoManager extends UndoManagerWithActions { - - private CompoundEdit currentCompoundEdit; - private EventType lastEventType; - private boolean isCompoundMarkStart; - - public CompoundUndoManager() { - super(); - reset(); - } - - @Override - public void undoableEditHappened(UndoableEditEvent undoableEditEvent) { - UndoableEdit edit = undoableEditEvent.getEdit(); - - // Make sure this event is a document event - if (edit instanceof DefaultDocumentEvent) { - // Get the event type - DefaultDocumentEvent event = (DefaultDocumentEvent) edit; - EventType eventType = event.getType(); - - // Check if the event type is not a change on character attributes, but instead an insertion or removal of - // text. - if (eventType != EventType.CHANGE) { - boolean isEndCompoundEdit = false; - - // Check if current compound edit must be ended as it contains at least one new line - if (eventType == EventType.INSERT) { - try { - // Check if the inserted text contains a new line character - String insertedText = event.getDocument().getText(event.getOffset(), event.getLength()); - isEndCompoundEdit = insertedText.contains("\n"); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - - // Make sure we are not in an explicit marked compound edit - if (!isCompoundMarkStart) { - // Check if current compound edit must be ended due to change between insertion or removal change - isEndCompoundEdit |= (eventType != lastEventType); - - // Check if the current compound edit should be ended and a new one started - if (isEndCompoundEdit) { - endCurrentCompoundEdit(); - } - // Save the last event type - lastEventType = eventType; - } - - // Create new compound edit if the current one has been ended or does not exist - if (currentCompoundEdit == null) { - newCurrentCompoundEdit(); - } - } - // Added event edit to the current compound edit - if (currentCompoundEdit != null) { - currentCompoundEdit.addEdit(edit); - } - } - // Update the state of the actions - updateUndoRedoState(); - } - - @Override - public void discardAllEdits() { - super.discardAllEdits(); - reset(); - } - - /** - * Ends the current compound edit, and mark the start for combining the next insertions or removals of text to be - * put into the same compound edit so that these combined operations acts like as one single edit. - * - * @see #markCompoundEnd() - */ - public void markCompoundStart() { - endCurrentCompoundEdit(); - isCompoundMarkStart = true; - } - - /** - * Ends the current compound edit so that previous edits acts like a single edit. - * - * @see #markCompoundStart() - */ - public void markCompoundEnd() { - endCurrentCompoundEdit(); - isCompoundMarkStart = false; - } - - private void reset() { - currentCompoundEdit = null; - lastEventType = EventType.INSERT; // important - } - - private void endCurrentCompoundEdit() { - if (currentCompoundEdit != null) { - currentCompoundEdit.end(); - currentCompoundEdit = null; - } - } - - private void newCurrentCompoundEdit() { - // Set current compound edit to a new one - currentCompoundEdit = new CompoundEdit() { - // Make sure canUndo() and canRedo() works - @Override - public boolean isInProgress() { - return false; - } - - @Override - public void undo() throws CannotUndoException { - endCurrentCompoundEdit(); - super.undo(); - } - }; - // Add the current compound edit to the internal edits - addEdit(currentCompoundEdit); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditWindow.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditWindow.java deleted file mode 100644 index a0f8e9b..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditWindow.java +++ /dev/null @@ -1,485 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.ui.editor.theme.EditorThemeProperties; -import net.sf.robocode.ui.editor.theme.EditorThemePropertiesManager; -import net.sf.robocode.ui.editor.theme.EditorThemePropertyChangeAdapter; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.event.InternalFrameAdapter; -import javax.swing.event.InternalFrameEvent; -import javax.swing.filechooser.FileFilter; - -import java.awt.Font; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.StringTokenizer; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - */ -@SuppressWarnings("serial") -public class EditWindow extends JInternalFrame { - - private String fileName; - private String robotName; - public boolean modified; - private final RobocodeEditor editor; - private final IRepositoryManager repositoryManager; - private final File robotsDirectory; - private EditorPanel editorPanel; - private EditorPane editorPane; - - public EditWindow(IRepositoryManager repositoryManager, RobocodeEditor editor, File robotsDirectory) { - super("Edit Window", true, true, true, true); - this.editor = editor; - this.robotsDirectory = robotsDirectory; - this.repositoryManager = repositoryManager; - initialize(); - } - - public EditorPane getEditorPane() { - if (editorPane == null) { - editorPane = editorPanel.getEditorPane(); - InputMap im = editorPane.getInputMap(); - - // FIXME: Replace hack with better solution than using 'ctrl H' - im.put(KeyStroke.getKeyStroke("ctrl H"), editor.getReplaceAction()); - } - return editorPane; - } - - public String getFileName() { - return fileName; - } - - public String getRobotName() { - return robotName; - } - - private void initialize() { - try { - addInternalFrameListener(new InternalFrameAdapter() { - @Override - public void internalFrameClosing(InternalFrameEvent e) { - if (!modified || fileSave(true)) { - editor.setLineStatus(-1); - dispose(); - } - editor.removeFromWindowMenu(EditWindow.this); - } - - @Override - public void internalFrameDeactivated(InternalFrameEvent e) { - editor.setLineStatus(-1); - } - - @Override - public void internalFrameIconified(InternalFrameEvent e) { - editor.setLineStatus(-1); - } - }); - setFrameIcon(new ImageIcon(EditWindow.class.getResource("/net/sf/robocode/ui/icons/robocode-icon.png"))); - setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - - setSize(750, 500); - - editor.addToWindowMenu(this); - - editorPanel = new EditorPanel(); - setContentPane(editorPanel); - - EditorThemeProperties currentThemeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - Font font = currentThemeProps.getFont(); - editorPanel.setFont(font); - - // Make sure the source editor window gets focus with a blinking cursor - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - editorPanel.getEditorPane().requestFocus(); - } - }); - - EditorThemePropertiesManager.addListener(new EditorThemePropertyChangeAdapter() { - @Override - public void onFontChanged(Font newFont) { - editorPanel.setFont(newFont); - } - }); - - final JavaDocument document = (JavaDocument) editorPanel.getEditorPane().getDocument(); - - document.addDocumentListener(new DocumentListener() { - public void removeUpdate(DocumentEvent e) { - updateModificationState(); - } - - public void insertUpdate(DocumentEvent e) { - updateModificationState(); - } - - public void changedUpdate(DocumentEvent e) { - updateModificationState(); - } - - // Bug-361 Problem in the text editor related with the .java file modification - private void updateModificationState() { - setModified(editorPanel.getEditorPane().isModified()); - } - }); - } catch (RuntimeException e) { - Logger.logError(e); - } - } - - public void setFileName(String newFileName) { - fileName = newFileName; - updateTitle(); - } - - public void setRobotName(String newRobotName) { - robotName = newRobotName; - updateTitle(); - } - - private void updateTitle() { - StringBuffer titleBuf = new StringBuffer("Editing"); - if (fileName != null) { - titleBuf.append(" - ").append(fileName); - } else if (robotName != null) { - titleBuf.append(" - ").append(robotName); - } - if (modified) { - titleBuf.append(" *"); - } - setTitle(titleBuf.toString()); - } - - private void setModified(boolean modified) { - boolean updated = (modified != this.modified); - if (updated) { - this.modified = modified; - updateTitle(); - editor.setSaveFileMenuItemsEnabled(modified); - } - } - - public void compile() { - if (!fileSave(true, true)) { - error("You must save before compiling."); - return; - } - if (editor.getCompiler() != null) { - // The compiler + refresh of the repository is done in a thread in order to avoid the compiler - // window hanging while compiling. The SwingUtilities.invokeLater() does not do a good job here - // (window is still hanging). Hence, a real thread running beside the EDT is used, which does a - // great job, where each each new print from the compiler is written out as soon as it is ready - // in the output stream. - new Thread(new Runnable() { - public void run() { - if (fileName == null) { - error("You must save before compiling."); - return; - } - editor.getCompiler().compile(getRobotDir(), fileName); - repositoryManager.refresh(fileName); - } - }).start(); - } else { - JOptionPane.showMessageDialog(editor, "No compiler installed.", "Error", JOptionPane.ERROR_MESSAGE); - } - } - - private void error(String msg) { - Object[] options = { - "OK" - }; - - JOptionPane.showOptionDialog(this, msg, "Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, - options, options[0]); - } - - public boolean fileSave(boolean confirm) { - return fileSave(confirm, false); - } - - private boolean fileSave(boolean confirm, boolean mustSave) { - if (confirm) { - if (!modified) { - return true; - } - String s = fileName; - - if (s == null) { - s = robotName; - } - if (s == null) { - s = "This file"; - } - int ok = JOptionPane.showConfirmDialog(this, s + " has been modified. Do you wish to save it?", - "Modified file", JOptionPane.YES_NO_CANCEL_OPTION); - - if (ok == JOptionPane.NO_OPTION) { - return !mustSave; - } - if (ok == JOptionPane.CANCEL_OPTION) { - return false; - } - } - String fileName = getFileName(); - - if (fileName == null) { - return fileSaveAs(); - } - - String reasonableFilename = getReasonableFilename(); - - if (reasonableFilename != null) { - try { - String a = new File(reasonableFilename).getCanonicalPath(); - String b = new File(fileName).getCanonicalPath(); - - if (!a.equals(b)) { - int ok = JOptionPane.showConfirmDialog(this, - fileName + " should be saved in: \n" + reasonableFilename - + "\n Would you like to save it there instead?", - "Name has changed", - JOptionPane.YES_NO_CANCEL_OPTION); - - if (ok == JOptionPane.CANCEL_OPTION) { - return false; - } - if (ok == JOptionPane.YES_OPTION) { - return fileSaveAs(); - } - } - } catch (IOException e) { - Logger.logError("Unable to check reasonable filename: ", e); - } - } - - BufferedWriter bufferedWriter = null; - OutputStreamWriter outputStreamWriter = null; - FileOutputStream fileOutputStream = null; - - try { - fileOutputStream = new FileOutputStream(fileName); - outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF8"); - bufferedWriter = new BufferedWriter(outputStreamWriter); - - getEditorPane().write(bufferedWriter); - setModified(false); - } catch (IOException e) { - error("Cannot write file: " + e); - return false; - } finally { - FileUtil.cleanupStream(bufferedWriter); - } - return true; - } - - private String getRobotDir() { - String saveDir = robotsDirectory.getPath() + File.separatorChar; - - String text = getEditorPane().getText(); - int pIndex = text.indexOf("package "); - - if (pIndex >= 0) { - int pEIndex = text.indexOf(";", pIndex); - - if (pEIndex > 0) { - String packageTree = text.substring(pIndex + 8, pEIndex) + File.separatorChar; - - packageTree = packageTree.replace('.', File.separatorChar); - - saveDir += packageTree; - } - } - return saveDir; - } - - public boolean fileSaveAs() { - String javaFileName = null; - String saveDir = getRobotDir(); - - String text = getEditorPane().getText(); - - int pIndex = text.indexOf("public class "); - - if (pIndex >= 0) { - int pEIndex = text.indexOf(" ", pIndex + 13); - - if (pEIndex > 0) { - int pEIndex2 = text.indexOf("\n", pIndex + 13); - - if (pEIndex2 > 0 && pEIndex2 < pEIndex) { - pEIndex = pEIndex2; - } - javaFileName = text.substring(pIndex + 13, pEIndex).trim() + ".java"; - } else { - pEIndex = text.indexOf("\n", pIndex + 13); - if (pEIndex > 0) { - javaFileName = text.substring(pIndex + 13, pEIndex).trim() + ".java"; - } - } - } - - File f = new File(saveDir); - - if (!f.exists()) { - int ok = JOptionPane.showConfirmDialog(this, - "Your robot should be saved in the directory: " + saveDir - + "\nThis directory does not exist, would you like to create it?", - "Create Directory", - JOptionPane.YES_NO_CANCEL_OPTION); - - if (ok == JOptionPane.YES_OPTION) { - if (!f.exists() && !f.mkdirs()) { - Logger.logError("Cannot create: " + f); - } - f = new File(saveDir); - } - if (ok == JOptionPane.CANCEL_OPTION) { - return false; - } - } - - JFileChooser chooser; - - chooser = new JFileChooser(f); - chooser.setCurrentDirectory(f); - - FileFilter filter = new FileFilter() { - @Override - public boolean accept(File pathname) { - if (pathname.isDirectory()) { - return true; - } - String fn = pathname.getName(); - int idx = fn.lastIndexOf('.'); - String extension = ""; - - if (idx >= 0) { - extension = fn.substring(idx); - } - return extension.equalsIgnoreCase(".java"); - } - - @Override - public String getDescription() { - return "Robots"; - } - }; - - chooser.setFileFilter(filter); - - boolean done = false; - - while (!done) { - done = true; - if (javaFileName != null) { - chooser.setSelectedFile(new File(f, javaFileName)); - } - int rv = chooser.showSaveDialog(this); - String robotFileName; - - if (rv == JFileChooser.APPROVE_OPTION) { - robotFileName = chooser.getSelectedFile().getPath(); - File outFile = new File(robotFileName); - - if (outFile.exists()) { - int ok = JOptionPane.showConfirmDialog(this, - robotFileName + " already exists. Are you sure you want to replace it?", "Warning", - JOptionPane.YES_NO_CANCEL_OPTION); - - if (ok == JOptionPane.NO_OPTION) { - done = false; - continue; - } - if (ok == JOptionPane.CANCEL_OPTION) { - return false; - } - } - setFileName(robotFileName); - fileSave(false); - } else { - return false; - } - } - - return true; - } - - public String getPackage() { - String text = getEditorPane().getText(); - int pIndex = text.indexOf("package "); - - if (pIndex >= 0) { - int pEIndex = text.indexOf(";", pIndex); - - if (pEIndex > 0) { - return text.substring(pIndex + 8, pEIndex); - } - } - return ""; - } - - private String getReasonableFilename() { - StringBuffer fileName = new StringBuffer(robotsDirectory.getPath()).append(File.separatorChar); - String javaFileName; - String packageTree = null; - - String text = getEditorPane().getText(); - StringTokenizer tokenizer = new StringTokenizer(text, " \t\r\n;"); - String token; - boolean inComment = false; - - while (tokenizer.hasMoreTokens()) { - token = tokenizer.nextToken(); - if (!inComment && (token.equals("/*") || token.equals("/**"))) { - inComment = true; - } - if (inComment && (token.equals("*/") || token.equals("**/"))) { - inComment = false; - } - if (inComment) { - continue; - } - - if (packageTree == null && token.equals("package")) { - packageTree = tokenizer.nextToken(); - if (packageTree == null || packageTree.length() == 0) { - return null; - } - packageTree = packageTree.replace('.', File.separatorChar); - packageTree += File.separator; - fileName.append(packageTree); - } - if (token.equals("class")) { - javaFileName = tokenizer.nextToken() + ".java"; - fileName.append(javaFileName); - return fileName.toString(); - } - } - return null; - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPane.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPane.java deleted file mode 100644 index ec856d2..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPane.java +++ /dev/null @@ -1,374 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.awt.Event; -import java.awt.FontMetrics; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.IOException; -import java.io.Reader; - -import javax.swing.InputMap; -import javax.swing.JTextPane; -import javax.swing.JViewport; -import javax.swing.KeyStroke; -import javax.swing.SwingUtilities; -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; -import javax.swing.text.DefaultCaret; -import javax.swing.text.DefaultEditorKit; -import javax.swing.text.Document; -import javax.swing.text.EditorKit; -import javax.swing.text.SimpleAttributeSet; -import javax.swing.text.StyleConstants; -import javax.swing.text.StyledEditorKit; -import javax.swing.text.TabSet; -import javax.swing.text.TabStop; - - -/** - * Editor pane used for editing source code. - * - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class EditorPane extends JTextPane { - - private int tabSize = 4; // Default - - // Key bindings - private static final KeyStroke CUT_KEYSTROKE = KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK); - private static final KeyStroke COPY_KEYSTROKE = KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK); - private static final KeyStroke PASTE_KEYSTROKE = KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK); - private static final KeyStroke UNDO_KEYSTROKE = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK); - private static final KeyStroke REDO_KEYSTROKE = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK); - - private final JavaDocument document; - - private final CompoundUndoManager undoManager = new CompoundUndoManager(); - - private final TextTool textTool = new TextTool(); - - private JViewport viewport; - - public EditorPane(JViewport viewport) { - super(); - this.viewport = viewport; - document = new JavaDocument(this); - - DefaultCaret caret = (DefaultCaret) getCaret(); - caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); - - new LineNumberArea(this); - - LineHighlighter.install(this); - - EditorKit editorKit = new StyledEditorKit() { - @Override - public Document createDefaultDocument() { - return document; - } - }; - - setEditorKitForContentType("text/java", editorKit); - setContentType("text/java"); - - addPropertyChangeListener("font", new FontHandler()); - addKeyListener(new KeyHandler()); - - setKeyBindings(); - setActionBindings(); - - getDocument().addUndoableEditListener(undoManager); - } - - public JViewport getViewport() { - return viewport; - } - - // No line wrapping! - @Override - public boolean getScrollableTracksViewportWidth() { - return getUI().getPreferredSize(this).width <= getParent().getSize().width; - } - - // Don't enforce height -> Avoid line height changes - @Override - public boolean getScrollableTracksViewportHeight() { - return false; - } - - // Make sure to discard all undo/redo edits when text completely replaced - @Override - public void setText(final String text) { - // Adding this call to the EDT prevents problems with deleting text that eats text before the deletion - SwingUtilities.invokeLater(new Runnable() { - public void run() { - JavaDocument javaDocument = (JavaDocument) getDocument(); - - // Bug-357: Tab characters are inserted in the last line of a robot source file when opening it. - // This bug was fixed by disabling auto-indentation while reading the file. - javaDocument.setReplacingText(true); - EditorPane.super.setText(text); - javaDocument.setReplacingText(false); - - resetCaretPosition(); - - undoManager.discardAllEdits(); - } - }); - } - - // Make sure to discard all undo/redo edits when text is read as one block - @Override - public void read(Reader in, Object desc) throws IOException { - JavaDocument javaDocument = (JavaDocument) getDocument(); - - // Bug-357: Tab characters are inserted in the last line of a robot source file when opening it. - // This bug was fixed by disabling auto-indentation while reading the file. - javaDocument.setReplacingText(true); - super.read(in, desc); - javaDocument.setReplacingText(false); - - resetCaretPosition(); - - undoManager.discardAllEdits(); - } - - public boolean isModified() { - return undoManager.canUndo(); - } - - public void undo() { - if (undoManager.canUndo()) { - undoManager.undo(); - } - } - - public void redo() { - if (undoManager.canRedo()) { - undoManager.redo(); - } - } - - private void setKeyBindings() { - InputMap inputMap = this.getInputMap(); - - inputMap.put(CUT_KEYSTROKE, DefaultEditorKit.cutAction); - inputMap.put(COPY_KEYSTROKE, DefaultEditorKit.copyAction); - inputMap.put(PASTE_KEYSTROKE, DefaultEditorKit.pasteAction); - inputMap.put(UNDO_KEYSTROKE, undoManager.getUndoAction()); - inputMap.put(REDO_KEYSTROKE, undoManager.getRedoAction()); - } - - private void setActionBindings() { - getActionMap().put("undo-keystroke", undoManager.getUndoAction()); - getActionMap().put("redo-keystroke", undoManager.getRedoAction()); - } - - private void setTabSize(int tabSize) { - document.setTabSize(tabSize); - - FontMetrics fm = getFontMetrics(getFont()); - - int charWidth = fm.charWidth('#'); - int tabWidth = charWidth * tabSize; - - TabStop[] tabs = new TabStop[100]; - for (int j = 0; j < tabs.length; j++) { - tabs[j] = new TabStop((j + 1) * tabWidth); - } - - SimpleAttributeSet attributes = new SimpleAttributeSet(); - - StyleConstants.setTabSet(attributes, new TabSet(tabs)); - - getDocument().removeUndoableEditListener(undoManager); // Avoid this change to be undone - getStyledDocument().setParagraphAttributes(0, getDocument().getLength(), attributes, false); - getDocument().addUndoableEditListener(undoManager); - } - - private void resetCaretPosition() { - // Make sure to put this request on the EDT or the caret position might not be reset after all. - SwingUtilities.invokeLater(new Runnable() { - public void run() { - setCaretPosition(0); - } - }); - } - - private void onTabCharPressed(boolean isUnindent) { - - int selectionStart = getSelectionStart(); - int selectionEnd = getSelectionEnd(); - - if (selectionStart == selectionEnd) { - // No selection -> Handle normal tab indentation - - if (isUnindent) { - textTool.removeLastTab(getCaretPosition()); - } else { - textTool.insertString(getCaretPosition(), "\t"); - } - } else { - // Start block indentation - - // Make sure that the start selection is lesser than the end selection - if (selectionStart > selectionEnd) { - // Swap selection start and selection end - int tmp = selectionStart; - - selectionStart = selectionEnd; - selectionEnd = tmp; - } - - StringBuilder newText = new StringBuilder(); - int count = 0; - boolean stopUnindent = false; - - // Handle each line - - String selectedText = textTool.getSelectedText(); - - selectedText = selectedText.replaceAll("\\s*$", ""); - - String[] lines = selectedText.split(String.valueOf('\n')); - - // iterate lines, rebuilding tabs and newlines - for (int i = 0; i < lines.length; i++) { - String line = lines[i]; - - if (isUnindent) { - if (line.charAt(0) != '\t') { - stopUnindent = true; - break; - } else { - newText.append(line.substring(1, line.length())); - count++; - } - } else { - newText.append('\t').append(line); - count++; - } - if (i != lines.length - 1) { - newText.append('\n'); - } - } - - if (!stopUnindent) { - try { - // Replace the indented/unindented text in one single compound edit - undoManager.markCompoundStart(); - getDocument().remove(selectionStart, selectedText.length()); - textTool.insertString(selectionStart, newText.toString()); - undoManager.markCompoundStart(); - } catch (BadLocationException e) { - e.printStackTrace(); - } - - // Compute the new selection - int mod = isUnindent ? -1 : 1; - - // Make new selection using the EDT, as replacing the text above must run before a new selection can be made - - final int newSelectionStart = selectionStart; - final int newSelectionEnd = selectionStart + selectedText.length() + count * mod; - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - setSelectionStart(newSelectionStart); - setSelectionEnd(newSelectionEnd); - } - }); - } - } - } - - private class FontHandler implements PropertyChangeListener { - public void propertyChange(PropertyChangeEvent e) { - setTabSize(tabSize); - } - } - - - private class KeyHandler extends KeyAdapter { - - @Override - public void keyPressed(KeyEvent e) { - switch (e.getKeyCode()) { - case KeyEvent.VK_TAB: - onTabCharPressed(e.isShiftDown()); - e.consume(); - break; - } - } - } - - - /** - * Handy text tool. - */ - private class TextTool { - - String getSelectedText() { - int start = getSelectionStart(); - int end = getSelectionEnd(); - - try { - return getDocument().getText(start, end - start); - } catch (BadLocationException e) { - e.printStackTrace(); - } - return null; - } - - void insertString(int offset, String str) { - insertString(offset, str, null); - } - - void insertString(final int offset, final String str, final AttributeSet a) { - try { - getDocument().insertString(offset, str, a); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - - void removeLastTab(int offset) { - int pos = offset; - - while (--pos >= 0) { - try { - char ch = getDocument().getText(pos, 1).charAt(0); - - if (ch == '\t') { - remove(pos, 1); - return; - } - if (ch == '\n') { - return; - } - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - } - - void remove(final int offset, final int len) { - try { - getDocument().remove(offset, len); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPanel.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPanel.java deleted file mode 100644 index 0ffd6c4..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorPanel.java +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; - -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; -import javax.swing.border.Border; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.JTextComponent; -import javax.swing.text.Utilities; - -import net.sf.robocode.ui.editor.theme.EditorThemeProperties; -import net.sf.robocode.ui.editor.theme.EditorThemePropertiesManager; -import net.sf.robocode.ui.editor.theme.EditorThemePropertyChangeAdapter; - - -/** - * Editor panel containing editor pane in a scroll pane, a line number area, and a statusTextField text field. - * - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class EditorPanel extends JPanel { - - private JTextField statusTextField; - private final JScrollPane scrollPane; - private final EditorPane editorPane; - private final LineNumberArea lineNumberArea; - - public EditorPanel() { - super(); - - setLayout(new BorderLayout()); - - statusTextField = new JTextField(); - statusTextField.setEditable(false); - - scrollPane = new JScrollPane(); - - editorPane = new EditorPane(scrollPane.getViewport()); - editorPane.addCaretListener(new CaretListener() { - public void caretUpdate(CaretEvent e) { - updateStatus(getRow(e.getDot(), editorPane), getColumn(e.getDot(), editorPane)); - } - }); - - scrollPane.setViewportView(editorPane); - - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - setBackgroundColor(themeProps.getBackgroundColor()); - setSelectionColor(themeProps.getSelectionColor()); - setSelectedTextColor(themeProps.getSelectedTextColor()); - - lineNumberArea = new LineNumberArea(editorPane); - scrollPane.setRowHeaderView(lineNumberArea); - - add(scrollPane, BorderLayout.CENTER); - add(statusTextField, BorderLayout.SOUTH); - - updateStatus(1, 1); - - EditorThemePropertiesManager.addListener(new EditorThemePropertyChangeAdapter() { - @Override - public void onBackgroundColorChanged(Color newColor) { - setBackgroundColor(newColor); - } - - @Override - public void onSelectionColorChanged(Color newColor) { - setSelectionColor(newColor); - } - - @Override - public void onSelectedTextColorChanged(Color newColor) { - setSelectedTextColor(newColor); - } - }); - } - - @Override - public void requestFocus() { - super.requestFocus(); - if (editorPane != null) { - editorPane.requestFocus(); - editorPane.requestFocusInWindow(); - } - } - - @Override - public void setFont(Font font) { - super.setFont(font); - if (editorPane != null) { - editorPane.setFont(font); - - Border border = BorderFactory.createEmptyBorder(3, 3, 3, 3); - editorPane.setBorder(border); - } - if (lineNumberArea != null) { - lineNumberArea.setFont(font); - - FontMetrics fm = getFontMetrics(font); - int delta = fm.getHeight() - fm.getDescent() - fm.getAscent(); - Border border = BorderFactory.createEmptyBorder(delta + 3, 3, 3, 3); - lineNumberArea.setBorder(border); - } - } - - public EditorPane getEditorPane() { - return editorPane; - } - - private void updateStatus(int linenumber, int columnnumber) { - statusTextField.setText("Line: " + linenumber + " Column: " + columnnumber); - } - - private static int getRow(int pos, JTextComponent editor) { - int rn = (pos == 0) ? 1 : 0; - - try { - int offs = pos; - - while (offs > 0) { - offs = Utilities.getRowStart(editor, offs) - 1; - rn++; - } - } catch (BadLocationException e) { - e.printStackTrace(); - } - return rn; - } - - private static int getColumn(int pos, JTextComponent editor) { - try { - return pos - Utilities.getRowStart(editor, pos) + 1; - } catch (BadLocationException e) { - e.printStackTrace(); - } - return -1; - } - - private void setBackgroundColor(final Color backgroundColor) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - scrollPane.getViewport().setBackground(backgroundColor); - editorPane.setBackground(backgroundColor); - } - }); - } - - private void setSelectionColor(final Color selectionColor) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - editorPane.setSelectionColor(selectionColor); - } - }); - } - - private void setSelectedTextColor(final Color selectedTextColor) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - editorPane.setSelectedTextColor(selectedTextColor); - } - }); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorThemeConfigDialog.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorThemeConfigDialog.java deleted file mode 100644 index a773203..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditorThemeConfigDialog.java +++ /dev/null @@ -1,978 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import javax.swing.*; -import javax.swing.filechooser.FileFilter; - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.ui.editor.theme.ColorAndStyle; -import net.sf.robocode.ui.editor.theme.ColorAndStyleAdapter; -import net.sf.robocode.ui.editor.theme.ComboBoxUtil; -import net.sf.robocode.ui.editor.theme.EditorPropertiesManager; -import net.sf.robocode.ui.editor.theme.EditorThemeProperties; -import net.sf.robocode.ui.editor.theme.EditorThemePropertiesManager; -import net.sf.robocode.ui.editor.theme.IEditorThemeProperties; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.GraphicsEnvironment; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - - -/** - * @author Flemming N. Larsen (original) - * - * @since 1.8.3.0 - */ -@SuppressWarnings("serial") -public class EditorThemeConfigDialog extends JDialog { - - private static final boolean ONLY_MONOSPACED = true; - - private static final String[] FONT_SIZES = { - "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72" - }; - - private JButton saveButton; - private JButton closeButton; - - private JComboBox fontNameComboBox; - private JComboBox fontStyleComboBox; - private JComboBox fontSizeComboBox; - - private JLabel previewLabel; - - private JComboBox themeComboBox; - - private ColorAndStyle backgroundColorAndStyle; - private ColorAndStyle lineNumberBackgroundColorAndStyle; - private ColorAndStyle lineNumberTextColorAndStyle; - private ColorAndStyle highlightedLineColorAndStyle; - private ColorAndStyle selectionColorAndStyle; - private ColorAndStyle selectedTextColorAndStyle; - private ColorAndStyle normalTextColorAndStyle; - private ColorAndStyle quotedTextColorAndStyle; - private ColorAndStyle keywordTextColorAndStyle; - private ColorAndStyle literalTextColorAndStyle; - private ColorAndStyle annotationTextColorAndStyle; - private ColorAndStyle commentTextColorAndStyle; - - private final EventHandler eventHandler = new EventHandler(); - - public EditorThemeConfigDialog(JFrame owner) { - super(owner, true); - initialize(); - } - - private void initialize() { - setTitle("Editor Theme Configurator"); - setLayout(new GridBagLayout()); - setResizable(false); - - // Initialize the font and theme ---- - initializeFontAndTheme(); - - getSaveButton().setEnabled(false); - - // ---- General font settings ---- - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.insets = new Insets(5, 5, 5, 5); - gbc.anchor = GridBagConstraints.WEST; - - int gridy = 0; - - gbc.gridx = 0; - gbc.gridy = gridy; - gbc.fill = GridBagConstraints.HORIZONTAL; - - gbc.weightx = 0.6; - add(getFontNamePanel(), gbc); - - gbc.gridx = 1; - gbc.weightx = 0.3; - add(getFontStylePanel(), gbc); - - gbc.gridx = 2; - gbc.weightx = 0.1; - add(getFontSizePanel(), gbc); - - gbc.gridx = 0; - gbc.gridy = ++gridy; - gbc.gridwidth = 3; - gbc.gridheight = 1; - - gbc.fill = GridBagConstraints.BOTH; - gbc.weightx = 1.0; - gbc.weighty = 1.0; - add(getPreviewPanel(), gbc); - - // ----- Theme settings ---- - - gbc.weightx = 0; - gbc.weighty = 0; - - gbc.gridx = 0; - gbc.gridy = ++gridy; - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.gridwidth = 1; - add(getThemeComboBox(), gbc); - - // ---- Color buttons and font styles ---- - - gbc.gridwidth = 1; - - gbc.gridx = 0; - gbc.gridy = ++gridy; - gbc.gridwidth = 1; - - gbc.fill = GridBagConstraints.NONE; - - JPanel colorButtonsPanel = new JPanel(); - colorButtonsPanel.setLayout(new GridBagLayout()); - add(colorButtonsPanel, gbc); - - GridBagConstraints gbc2 = new GridBagConstraints(); - gbc2.insets = new Insets(5, 5, 5, 5); - gbc2.anchor = GridBagConstraints.WEST; - - int gridy2 = 0; - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getBackgroundColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getLineNumberBackgroundColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getLineNumberTextColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getHighlightedLineColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getSelectionColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getSelectedTextColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getNormalTextColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getCommentTextColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getQuotedTextColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getKeywordTextColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getLiteralTextColorAndStyle(), colorButtonsPanel, gbc2); - - gbc2.gridy = gridy2++; - addColoredButtonAndFontStyleToPanel(getAnnotationTextColorAndStyle(), colorButtonsPanel, gbc2); - - // ------ OK & Cancel buttons ---- - - JPanel okCancelPanel = new JPanel(); - okCancelPanel.add(getSaveButton()); - okCancelPanel.add(getCloseButton(), gbc); - - gbc.gridy = ++gridy; - add(okCancelPanel, gbc); - } - - private JButton getSaveButton() { - if (saveButton == null) { - saveButton = new JButton("Save & Close"); - saveButton.setMnemonic('S'); - saveButton.addActionListener(eventHandler); - } - return saveButton; - } - - private JButton getCloseButton() { - if (closeButton == null) { - closeButton = new JButton("Close"); - closeButton.setMnemonic('C'); - closeButton.addActionListener(eventHandler); - } - return closeButton; - } - - private JComboBox getFontNameComboBox() { - if (fontNameComboBox == null) { - String[] fontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); - List fontFamilyNameList = Arrays.asList(fontFamilyNames); - - List fontNameList = new ArrayList(); - - if (ONLY_MONOSPACED) { - for (String monospacedFontName : getMonospacedFontNames()) { - if (fontFamilyNameList.contains(monospacedFontName)) { - fontNameList.add(monospacedFontName); - } - } - } else { - fontNameList.addAll(fontFamilyNameList); - } - if (!fontNameList.contains("Monospaced")) { - fontNameList.add("Monospaced"); - } - Collections.sort(fontNameList); - - fontNameComboBox = new JComboBox(fontNameList.toArray()); - fontNameComboBox.setRenderer(new FontCellRenderer()); - - fontNameComboBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - - String oldFontName = themeProps.getFontName(); - String newFontName = ComboBoxUtil.getSelectedName(fontNameComboBox); - if (!newFontName.equals(oldFontName)) { - String oldThemeName = themeProps.getThemeName(); - String newThemeName = ComboBoxUtil.getSelectedName(getThemeComboBox()); - if (newThemeName.equals(oldThemeName)) { - themeProps.setFontName(newFontName); - updateSaveButton(); - } - } - } - }); - } - return fontNameComboBox; - } - - private JComboBox getFontStyleComboBox() { - if (fontStyleComboBox == null) { - fontStyleComboBox = ComboBoxUtil.createFontStyleComboBox(FontStyle.PLAIN); - - fontStyleComboBox.addActionListener( - new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - - FontStyle oldFontStyle = themeProps.getNormalTextStyle(); - FontStyle newFontStyle = ComboBoxUtil.getSelectedStyle(getFontStyleComboBox()); - if (newFontStyle != oldFontStyle) { - themeProps.setNormalTextStyle(newFontStyle); - - ComboBoxUtil.setSelected(getNormalTextColorAndStyle().getFontStyleComboBox(), - (String) getFontStyleComboBox().getSelectedItem()); - - updateSaveButton(); - } - } - }); - } - return fontStyleComboBox; - } - - private JComboBox getFontSizeComboBox() { - if (fontSizeComboBox == null) { - fontSizeComboBox = new JComboBox(FONT_SIZES); - fontSizeComboBox.setSelectedIndex(5); - - fontSizeComboBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - - int oldFontSize = themeProps.getFontSize(); - int newFontSize = Integer.parseInt((String) getFontSizeComboBox().getSelectedItem()); - if (newFontSize != oldFontSize) { - themeProps.setFontSize(newFontSize); - updateSaveButton(); - } - } - }); - } - return fontSizeComboBox; - } - - private JPanel getFontNamePanel() { - JPanel panel = new JPanel(); - JLabel label = new JLabel("Font Name"); - - panel.setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - - gbc.gridx = 0; - gbc.gridy = 0; - gbc.anchor = GridBagConstraints.NORTHWEST; - panel.add(label, gbc); - - gbc.gridx = 0; - gbc.gridy = 1; - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weightx = 1.0; - panel.add(getFontNameComboBox(), gbc); - - return panel; - } - - private JPanel getFontStylePanel() { - JPanel panel = new JPanel(); - JLabel label = new JLabel("Style"); - - panel.setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - - gbc.gridx = 0; - gbc.gridy = 0; - gbc.anchor = GridBagConstraints.NORTHWEST; - panel.add(label, gbc); - - gbc.gridx = 0; - gbc.gridy = 1; - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weightx = 1.0; - panel.add(getFontStyleComboBox(), gbc); - - return panel; - } - - private JPanel getFontSizePanel() { - JPanel panel = new JPanel(); - JLabel label = new JLabel("Size"); - - panel.setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - - gbc.gridx = 0; - gbc.gridy = 0; - gbc.anchor = GridBagConstraints.NORTHWEST; - panel.add(label, gbc); - - gbc.gridx = 0; - gbc.gridy = 1; - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weightx = 1.0; - panel.add(getFontSizeComboBox(), gbc); - - return panel; - } - - private JLabel getPreviewLabel() { - if (previewLabel == null) { - previewLabel = new JLabel("AaBbYyZz"); - } - return previewLabel; - } - - private JPanel getPreviewPanel() { - final JPanel panel = new JPanel(); - panel.setLayout(new GridBagLayout()); - - panel.setBorder(BorderFactory.createEtchedBorder()); - panel.setBackground(Color.WHITE); - panel.setForeground(Color.BLACK); - panel.setPreferredSize(new Dimension(400, 120)); - - ActionListener actionListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - setPreviewLabelFont(panel); - panel.repaint(); - } - }; - - getFontNameComboBox().addActionListener(actionListener); - getFontStyleComboBox().addActionListener(actionListener); - getFontSizeComboBox().addActionListener(actionListener); - - setPreviewLabelFont(panel); - panel.add(getPreviewLabel(), SwingConstants.CENTER); - - return panel; - } - - private ColorAndStyle getBackgroundColorAndStyle() { - if (backgroundColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - backgroundColorAndStyle = new ColorAndStyle("Background Color", props.getBackgroundColor(), null); - backgroundColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setBackgroundColor(newColor); - - updateSaveButton(); - } - }); - } - return backgroundColorAndStyle; - } - - private ColorAndStyle getLineNumberBackgroundColorAndStyle() { - if (lineNumberBackgroundColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - lineNumberBackgroundColorAndStyle = new ColorAndStyle("Line Number Background Color", - props.getLineNumberBackgroundColor(), null); - lineNumberBackgroundColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setLineNumberBackgroundColor(newColor); - - updateSaveButton(); - } - }); - } - return lineNumberBackgroundColorAndStyle; - } - - private ColorAndStyle getLineNumberTextColorAndStyle() { - if (lineNumberTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - lineNumberTextColorAndStyle = new ColorAndStyle("Line Number Text Color", props.getLineNumberTextColor(), - null); - lineNumberTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setLineNumberTextColor(newColor); - - updateSaveButton(); - } - }); - } - return lineNumberTextColorAndStyle; - } - - private ColorAndStyle getHighlightedLineColorAndStyle() { - if (highlightedLineColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - highlightedLineColorAndStyle = new ColorAndStyle("Highlighted Line Color", props.getHighlightedLineColor(), - null); - highlightedLineColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setHighlightedLineColor(newColor); - - updateSaveButton(); - } - }); - } - return highlightedLineColorAndStyle; - } - - private ColorAndStyle getSelectionColorAndStyle() { - if (selectionColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - selectionColorAndStyle = new ColorAndStyle("Selection Color", props.getSelectionColor(), null); - selectionColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setSelectionColor(newColor); - - updateSaveButton(); - } - }); - } - return selectionColorAndStyle; - } - - private ColorAndStyle getSelectedTextColorAndStyle() { - if (selectedTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - selectedTextColorAndStyle = new ColorAndStyle("Selected Text Color", props.getSelectedTextColor(), null); - selectedTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setSelectedTextColor(newColor); - } - }); - } - return selectedTextColorAndStyle; - } - - private ColorAndStyle getNormalTextColorAndStyle() { - if (normalTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - normalTextColorAndStyle = new ColorAndStyle("Normal Text Color", props.getNormalTextColor(), - props.getNormalTextStyle()); - normalTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setNormalTextColor(newColor); - - updateSaveButton(); - } - - @Override - public void styleChanged(FontStyle newStyle) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setNormalTextStyle(newStyle); - - updateSaveButton(); - - // Make sure to update the font style combo box - ComboBoxUtil.setSelected(getFontStyleComboBox(), newStyle); - } - }); - } - return normalTextColorAndStyle; - } - - private ColorAndStyle getQuotedTextColorAndStyle() { - if (quotedTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - quotedTextColorAndStyle = new ColorAndStyle("Quoted Text Color", props.getQuotedTextColor(), - props.getQuotedTextStyle()); - quotedTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setQuotedTextColor(newColor); - - updateSaveButton(); - } - - @Override - public void styleChanged(FontStyle newStyle) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setQuotedTextStyle(newStyle); - - updateSaveButton(); - } - }); - } - return quotedTextColorAndStyle; - } - - private ColorAndStyle getKeywordTextColorAndStyle() { - if (keywordTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - keywordTextColorAndStyle = new ColorAndStyle("Keyword Color", props.getKeywordTextColor(), - props.getKeywordTextStyle()); - keywordTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setKeywordTextColor(newColor); - - updateSaveButton(); - } - - @Override - public void styleChanged(FontStyle newStyle) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setKeywordTextStyle(newStyle); - - updateSaveButton(); - } - }); - } - return keywordTextColorAndStyle; - } - - private ColorAndStyle getLiteralTextColorAndStyle() { - if (literalTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - literalTextColorAndStyle = new ColorAndStyle("Literal Color", props.getLiteralTextColor(), - props.getLiteralTextStyle()); - literalTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setLiteralTextColor(newColor); - - updateSaveButton(); - } - - @Override - public void styleChanged(FontStyle newStyle) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setLiteralTextStyle(newStyle); - - updateSaveButton(); - } - }); - } - return literalTextColorAndStyle; - } - - private ColorAndStyle getAnnotationTextColorAndStyle() { - if (annotationTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - annotationTextColorAndStyle = new ColorAndStyle("Annotation Color", props.getAnnotationTextColor(), - props.getAnnotationTextStyle()); - annotationTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setAnnotationTextColor(newColor); - - updateSaveButton(); - } - - @Override - public void styleChanged(FontStyle newStyle) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setAnnotationTextStyle(newStyle); - - updateSaveButton(); - } - }); - } - return annotationTextColorAndStyle; - } - - private ColorAndStyle getCommentTextColorAndStyle() { - if (commentTextColorAndStyle == null) { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - commentTextColorAndStyle = new ColorAndStyle("Comment Color", props.getCommentTextColor(), - props.getCommentTextStyle()); - commentTextColorAndStyle.addListener(new ColorAndStyleAdapter() { - @Override - public void colorChanged(Color newColor) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setCommentTextColor(newColor); - - updateSaveButton(); - } - - @Override - public void styleChanged(FontStyle newStyle) { - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setCommentTextStyle(newStyle); - - updateSaveButton(); - } - }); - } - return commentTextColorAndStyle; - } - - private JComboBox getThemeComboBox() { - if (themeComboBox == null) { - final String fileExt = EditorThemePropertiesManager.getFileExt(); - - File[] themeFiles = FileUtil.getEditorThemeConfigDir().listFiles(new java.io.FileFilter() { - public boolean accept(File filepath) { - return filepath.getName().endsWith(fileExt); - } - }); - - List themeNames = new ArrayList(); - for (File file : themeFiles) { - String themeName = file.getName(); - themeName = themeName.substring(0, themeName.lastIndexOf(fileExt)); - themeNames.add(themeName); - } - - themeComboBox = new JComboBox(themeNames.toArray()); - themeComboBox.addActionListener(eventHandler); - } - return themeComboBox; - } - - private void setPreviewLabelFont(JPanel panel) { - String fontName = (String) getFontNameComboBox().getSelectedItem(); - int fontStyleFlags = FontStyle.fromName((String) getFontStyleComboBox().getSelectedItem()).getFontStyleFlags(); - int fontSize = Integer.parseInt((String) getFontSizeComboBox().getSelectedItem()); - - Font font = new Font(fontName, fontStyleFlags, fontSize); - - getPreviewLabel().setFont(font); - - FontMetrics fontMetrics = panel.getFontMetrics(font); - - int width = fontMetrics.stringWidth(getPreviewLabel().getText()); - int height = fontMetrics.getHeight(); - - getPreviewLabel().setPreferredSize(new Dimension(width, height)); - } - - private void initializeFontAndTheme() { - // Read the theme properties - IEditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - - // Set selected theme - ComboBoxUtil.setSelected(getThemeComboBox(), themeProps.getThemeName()); - - // Set selected font name - ComboBoxUtil.setSelected(getFontNameComboBox(), themeProps.getFontName()); - - // Set selected font style - ComboBoxUtil.setSelected(getFontStyleComboBox(), themeProps.getNormalTextStyle()); - - // Set selected font size - ComboBoxUtil.setSelected(getFontSizeComboBox(), "" + themeProps.getFontSize()); - } - - private class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - Object source = e.getSource(); - if (source.equals(getThemeComboBox())) { - performThemeComboBoxAction(); - } else if (e.getSource().equals(getSaveButton())) { - performSaveButtonAction(); - } else if (e.getSource().equals(getCloseButton())) { - dispose(); - } - } - } - - private List getMonospacedFontNames() { - List monospacedFontNames = new ArrayList(); - - Font[] allFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); - for (Font font : allFonts) { - if (isMonospaced(font)) { - monospacedFontNames.add(font.getFontName()); - } - } - return monospacedFontNames; - } - - private boolean isMonospaced(Font font) { - FontMetrics fontMetrics = getFontMetrics(font); - - int lastCharWidth = -1; - - for (int charCode = 0; charCode < 128; charCode++) { - if (Character.isValidCodePoint(charCode) && (Character.isLetter(charCode) || Character.isDigit(charCode))) { - int charWidth = fontMetrics.charWidth((char) charCode); - if (lastCharWidth >= 0 && charWidth != lastCharWidth) { - return false; // font is not mono-spaced - } - lastCharWidth = charWidth; - } - } - return true; // font is mono-spaced - } - - private static void addColoredButtonAndFontStyleToPanel(ColorAndStyle group, JPanel panel, GridBagConstraints gbc) { - gbc.gridx = 0; - panel.add(group.getColoredButton(), gbc); - - gbc.gridx = 1; - panel.add(group.getLabel(), gbc); - - if (group.getFontStyleComboBox() != null) { - gbc.gridx = 2; - panel.add(group.getFontStyleComboBox(), gbc); - } - } - - private void udateComponentsTheme(final String themeName) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - // Store current theme name - EditorPropertiesManager.getEditorProperties().setThemeName(themeName); - EditorPropertiesManager.saveEditorProperties(); - - // Load theme properties - File filepath = EditorThemePropertiesManager.getFilepath(themeName); - EditorThemePropertiesManager.loadEditorThemeProperties(filepath); - - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - - ComboBoxUtil.setSelected(getFontNameComboBox(), themeProps.getFontName()); - ComboBoxUtil.setSelected(getFontSizeComboBox(), "" + themeProps.getFontSize()); - - getBackgroundColorAndStyle().setSelectedColor(themeProps.getBackgroundColor()); - - getLineNumberBackgroundColorAndStyle().setSelectedColor(themeProps.getLineNumberBackgroundColor()); - getLineNumberTextColorAndStyle().setSelectedColor(themeProps.getLineNumberTextColor()); - - getHighlightedLineColorAndStyle().setSelectedColor(themeProps.getHighlightedLineColor()); - - getSelectionColorAndStyle().setSelectedColor(themeProps.getSelectionColor()); - getSelectedTextColorAndStyle().setSelectedColor(themeProps.getSelectedTextColor()); - - getNormalTextColorAndStyle().setSelectedColor(themeProps.getNormalTextColor()); - getNormalTextColorAndStyle().setSelectedStyle(themeProps.getNormalTextStyle()); - - getCommentTextColorAndStyle().setSelectedColor(themeProps.getCommentTextColor()); - getCommentTextColorAndStyle().setSelectedStyle(themeProps.getCommentTextStyle()); - - getQuotedTextColorAndStyle().setSelectedColor(themeProps.getQuotedTextColor()); - getQuotedTextColorAndStyle().setSelectedStyle(themeProps.getQuotedTextStyle()); - - getKeywordTextColorAndStyle().setSelectedColor(themeProps.getKeywordTextColor()); - getKeywordTextColorAndStyle().setSelectedStyle(themeProps.getKeywordTextStyle()); - - getLiteralTextColorAndStyle().setSelectedColor(themeProps.getLiteralTextColor()); - getLiteralTextColorAndStyle().setSelectedStyle(themeProps.getLiteralTextStyle()); - - getAnnotationTextColorAndStyle().setSelectedColor(themeProps.getAnnotationTextColor()); - getAnnotationTextColorAndStyle().setSelectedStyle(themeProps.getAnnotationTextStyle()); - - updateSaveButton(); - } - }); - } - - private void updateSaveButton() { - EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - boolean enabled = props.isChanged(); - getSaveButton().setEnabled(enabled); - } - - private void performThemeComboBoxAction() { - EditorThemeProperties currentThemeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - - String oldThemeName = currentThemeProps.getThemeName(); - String newThemeName = (String) getThemeComboBox().getSelectedItem(); - if (!oldThemeName.equals(newThemeName)) { - if (currentThemeProps.isChanged()) { - Object[] options = { "Yes, save changes", "No, forget changes", "Cancel"}; - - int option = JOptionPane.showOptionDialog(null, - "Changes have been made to the theme:\n" + oldThemeName - + "\nDo you want save the changes to this theme?", - "Warning", - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, - options, - options[2]); - - if (option == JOptionPane.YES_OPTION) { - File filepath = EditorThemePropertiesManager.getFilepath(oldThemeName); - if (filepath != null && !filepath.exists()) { - try { - filepath.createNewFile(); - } catch (IOException e) { - Logger.logError(e); - return; - } - } - EditorThemePropertiesManager.saveEditorThemeProperties(filepath); - - } else if (option == JOptionPane.CANCEL_OPTION) { - ComboBoxUtil.setSelected(getThemeComboBox(), oldThemeName); - return; - } - } - // Switch to new theme - udateComponentsTheme(newThemeName); - } - } - - private void performSaveButtonAction() { - String themeName = "My theme"; - File file = EditorThemePropertiesManager.getFilepath(themeName); - - JFileChooser saveThemeDialog = new JFileChooser(FileUtil.getEditorThemeConfigDir()); - saveThemeDialog.setDialogTitle("Save Theme"); - saveThemeDialog.setSelectedFile(file); - - FileFilter fileFilter = new FileFilter() { - @Override - public boolean accept(File filepath) { - return filepath.getName().endsWith(EditorThemePropertiesManager.getFileExt()); - } - - @Override - public String getDescription() { - return "Robocode Editor Theme properties"; - } - }; - - saveThemeDialog.addChoosableFileFilter(fileFilter); - saveThemeDialog.setAcceptAllFileFilterUsed(false); - - int returnState = saveThemeDialog.showSaveDialog(this); - - file = saveThemeDialog.getSelectedFile(); - - if (!file.getName().endsWith(EditorThemePropertiesManager.getFileExt())) { - file = new File(file.getAbsolutePath() + EditorThemePropertiesManager.getFileExt()); - } - - if (!FileUtil.isFilenameValid(file.getName())) { - JOptionPane.showMessageDialog(this, "Not a valid file name:\n" + file.getName(), "Error", - JOptionPane.ERROR_MESSAGE); - - } else if (returnState == JFileChooser.APPROVE_OPTION) { - - if (file.exists()) { - Object[] options = { "Yes, overwrite", "No, do not overwrite"}; - - int option = JOptionPane.showOptionDialog(this, - "File already exists:\n" + file.getName() + "\nDo you want to overwrite this file?", "Warning", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); - - if (option == JOptionPane.NO_OPTION) { - return; - } - } else { - try { - file.createNewFile(); // File must be created if it does not exist already - } catch (IOException e) { - Logger.logError(e); - return; - } - } - - ComboBoxUtil.setSelected(getThemeComboBox(), themeName); - EditorPropertiesManager.getEditorProperties().setThemeName(themeName); - EditorPropertiesManager.saveEditorProperties(); - - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - themeProps.setThemeName(themeName); - - themeProps.setFontName(ComboBoxUtil.getSelectedName(getFontNameComboBox())); - themeProps.setFontSize(Integer.parseInt(ComboBoxUtil.getSelectedName(getFontSizeComboBox()))); - - EditorThemePropertiesManager.saveEditorThemeProperties(file); - - dispose(); // Only when save was successful - - } else if (returnState == JFileChooser.ERROR_OPTION) { - JOptionPane.showMessageDialog(this, "The editor theme was not saved.", "Warning", - JOptionPane.WARNING_MESSAGE); - } - } - - private class FontCellRenderer extends DefaultListCellRenderer { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - - Font font = new Font((String) value, Font.PLAIN, 20); - if (font.canDisplayUpTo(label.getText()) == -1) { // -1 means, can display all of the string - label.setFont(font); - } - return label; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FindReplaceDialog.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FindReplaceDialog.java deleted file mode 100644 index fedc9c9..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FindReplaceDialog.java +++ /dev/null @@ -1,386 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import static javax.swing.GroupLayout.Alignment.*; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -/** - * @author Matthew Reeder (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class FindReplaceDialog extends JDialog implements ActionListener { - private JTextField findTextField; - private JTextField replaceTextField; - private JButton findNextButton; - private JButton replaceFindButton; - private JButton replaceButton; - private JButton replaceAllButton; - private JButton closeButton; - private JCheckBox caseSensitiveCheckBox; - private JCheckBox wholeWordCheckBox; - private JRadioButton regexButton; - private JRadioButton wildCardsButton; - private JRadioButton literalButton; - private JLabel findLabel; - private JLabel replaceLabel; - private boolean initLoc; - private final RobocodeEditor editor; - - public FindReplaceDialog(RobocodeEditor owner) { - super(owner, false); - editor = owner; - - GroupLayout layout = new GroupLayout(getContentPane()); - - getContentPane().setLayout(layout); - layout.setAutoCreateGaps(true); - layout.setAutoCreateContainerGaps(true); - - JPanel optionsPanel = new JPanel(); - - optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS)); - optionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Options")); - optionsPanel.add(getCaseSensitiveCheckBox()); - optionsPanel.add(getWholeWordCheckBox()); - optionsPanel.setAlignmentY(TOP_ALIGNMENT); - - JPanel usePanel = new JPanel(); - - usePanel.setLayout(new BoxLayout(usePanel, BoxLayout.Y_AXIS)); - usePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Use")); - usePanel.add(getLiteralButton()); - usePanel.add(getWildCardsButton()); - usePanel.add(getRegexButton()); - usePanel.setAlignmentY(TOP_ALIGNMENT); - - ButtonGroup buttonGroup = new ButtonGroup(); - - buttonGroup.add(getLiteralButton()); - buttonGroup.add(getWildCardsButton()); - buttonGroup.add(getRegexButton()); - - layout.setHorizontalGroup( - layout.createSequentialGroup().addGroup(layout.createParallelGroup(LEADING).addGroup(layout.createSequentialGroup().addComponent(getFindLabel()).addComponent(getFindTextField())).addGroup(layout.createSequentialGroup().addComponent(getReplaceLabel()).addComponent(getReplaceTextField())).addGroup(layout.createSequentialGroup().addComponent(optionsPanel).addComponent(usePanel))).addGroup( - layout.createParallelGroup(LEADING).addComponent(getFindNextButton()).addComponent(getReplaceFindButton()).addComponent(getReplaceButton()).addComponent(getReplaceAllButton()).addComponent( - getCloseButton()))); - - layout.linkSize(SwingConstants.HORIZONTAL, getFindLabel(), getReplaceLabel()); - layout.linkSize(SwingConstants.HORIZONTAL, getFindNextButton(), getReplaceFindButton(), getReplaceButton(), - getReplaceAllButton(), getCloseButton()); - - layout.setVerticalGroup( - layout.createSequentialGroup().addGroup(layout.createParallelGroup(BASELINE).addComponent(getFindLabel()).addComponent(getFindTextField()).addComponent(getFindNextButton())).addGroup(layout.createParallelGroup(BASELINE).addComponent(getReplaceLabel()).addComponent(getReplaceTextField()).addComponent(getReplaceButton())).addGroup( - layout.createParallelGroup(BASELINE).addComponent(optionsPanel).addComponent(usePanel).addGroup( - layout.createSequentialGroup().addComponent(getReplaceFindButton()).addComponent(getReplaceAllButton()).addComponent( - getCloseButton())))); - - pack(); - setResizable(false); - } - - public void showDialog(boolean showReplace) { - getReplaceLabel().setVisible(showReplace); - getReplaceTextField().setVisible(showReplace); - getReplaceButton().setVisible(showReplace); - getReplaceAllButton().setVisible(showReplace); - if (showReplace) { - setTitle("Replace"); - getRootPane().setDefaultButton(getReplaceButton()); - getReplaceFindButton().setText("Find..."); - getReplaceFindButton().setMnemonic('d'); - getReplaceFindButton().setDisplayedMnemonicIndex(3); - } else { - setTitle("Find"); - getRootPane().setDefaultButton(getFindNextButton()); - getReplaceFindButton().setText("Replace..."); - getReplaceFindButton().setMnemonic('R'); - getReplaceFindButton().setDisplayedMnemonicIndex(0); - } - - pack(); - - if (!initLoc && editor != null) { - Rectangle bounds = editor.getBounds(); - Dimension size = getSize(); - - setLocation((int) (bounds.getX() + (bounds.getWidth() - size.getWidth()) / 2), - (int) (bounds.getY() + (bounds.getHeight() - size.getHeight()) / 2)); - initLoc = true; - } - - // Bugfix [2664844] - Editor: Find (set cursor position) - getFindTextField().requestFocus(); - - setVisible(true); - } - - public JLabel getFindLabel() { - if (findLabel == null) { - findLabel = new JLabel(); - findLabel.setText("Find:"); - findLabel.setDisplayedMnemonicIndex(3); - } - return findLabel; - } - - public JLabel getReplaceLabel() { - if (replaceLabel == null) { - replaceLabel = new JLabel(); - replaceLabel.setText("Replace:"); - replaceLabel.setDisplayedMnemonicIndex(3); - } - return replaceLabel; - } - - public JTextField getFindTextField() { - if (findTextField == null) { - findTextField = new JTextField(); - findTextField.setFocusAccelerator('n'); - findTextField.addActionListener(this); - } - return findTextField; - } - - public JTextField getReplaceTextField() { - if (replaceTextField == null) { - replaceTextField = new JTextField(); - replaceTextField.setFocusAccelerator('p'); - replaceTextField.addActionListener(this); - } - return replaceTextField; - } - - public JButton getFindNextButton() { - if (findNextButton == null) { - findNextButton = new JButton(); - findNextButton.setText("Find Next"); - findNextButton.setMnemonic('F'); - findNextButton.setDefaultCapable(true); - findNextButton.addActionListener(this); - } - return findNextButton; - } - - public JButton getReplaceFindButton() { - if (replaceFindButton == null) { - replaceFindButton = new JButton("Replace..."); - replaceFindButton.setMnemonic('R'); - replaceFindButton.addActionListener(this); - } - return replaceFindButton; - } - - public JButton getReplaceButton() { - if (replaceButton == null) { - replaceButton = new JButton(); - replaceButton.setText("Replace"); - replaceButton.setMnemonic('R'); - replaceButton.setDefaultCapable(true); - replaceButton.addActionListener(this); - } - return replaceButton; - } - - public JButton getReplaceAllButton() { - if (replaceAllButton == null) { - replaceAllButton = new JButton(); - replaceAllButton.setText("Replace All"); - replaceAllButton.setMnemonic('A'); - replaceAllButton.setDisplayedMnemonicIndex(8); - replaceAllButton.addActionListener(this); - } - return replaceAllButton; - } - - public JButton getCloseButton() { - if (closeButton == null) { - closeButton = new JButton(); - closeButton.setText("Close"); - closeButton.setMnemonic('C'); - closeButton.addActionListener(this); - } - return closeButton; - } - - public JCheckBox getCaseSensitiveCheckBox() { - if (caseSensitiveCheckBox == null) { - caseSensitiveCheckBox = new JCheckBox(); - caseSensitiveCheckBox.setText("Case Sensitive"); - caseSensitiveCheckBox.setMnemonic('v'); - caseSensitiveCheckBox.setDisplayedMnemonicIndex(12); - caseSensitiveCheckBox.addActionListener(this); - } - return caseSensitiveCheckBox; - } - - public JCheckBox getWholeWordCheckBox() { - if (wholeWordCheckBox == null) { - wholeWordCheckBox = new JCheckBox(); - wholeWordCheckBox.setText("Whole Words Only"); - wholeWordCheckBox.setMnemonic('W'); - wholeWordCheckBox.addActionListener(this); - } - return wholeWordCheckBox; - } - - public JRadioButton getLiteralButton() { - if (literalButton == null) { - literalButton = new JRadioButton(); - literalButton.setText("Literal"); - literalButton.setMnemonic('L'); - literalButton.setSelected(true); - literalButton.addActionListener(this); - } - return literalButton; - } - - public JRadioButton getWildCardsButton() { - if (wildCardsButton == null) { - wildCardsButton = new JRadioButton(); - wildCardsButton.setText("Wild Cards"); - wildCardsButton.setMnemonic('i'); - wildCardsButton.setDisplayedMnemonicIndex(1); - wildCardsButton.addActionListener(this); - } - return wildCardsButton; - } - - public JRadioButton getRegexButton() { - if (regexButton == null) { - regexButton = new JRadioButton(); - regexButton.setText("Regular Expressions"); - regexButton.setMnemonic('x'); - regexButton.setDisplayedMnemonicIndex(9); - regexButton.addActionListener(this); - } - return regexButton; - } - - public void actionPerformed(ActionEvent e) { - Object source = e.getSource(); - - if (source == getFindNextButton()) { - findNext(); - } else if (source == getReplaceButton()) { - doReplacement(); - findNext(); - } else if (source == getReplaceAllButton()) { - doReplaceAll(); - } else if (source == getCloseButton()) { - setVisible(false); - } else if (source == getReplaceFindButton()) { - showDialog(!getReplaceButton().isVisible()); - } else if (source instanceof JTextField) { - getRootPane().getDefaultButton().doClick(); - } - } - - private Pattern getCurrentPattern() { - String pattern = getFindTextField().getText(); - int flags = Pattern.DOTALL; - - if (!getRegexButton().isSelected()) { - StringBuffer newpattern = new StringBuffer(); - - // 'quote' the pattern - for (int i = 0; i < pattern.length(); i++) { - if ("\\[]^$&|().*+?{}".indexOf(pattern.charAt(i)) >= 0) { - newpattern.append('\\'); - } - newpattern.append(pattern.charAt(i)); - } - pattern = newpattern.toString(); - - // make "*" .* and "?" . - if (getWildCardsButton().isSelected()) { - pattern = pattern.replaceAll("\\\\\\*", ".+?"); - pattern = pattern.replaceAll("\\\\\\?", "."); - } - } - if (!getCaseSensitiveCheckBox().isSelected()) { - flags |= Pattern.CASE_INSENSITIVE; - } - if (getWholeWordCheckBox().isSelected()) { - pattern = "\\b" + pattern + "\\b"; - } - return Pattern.compile(pattern, flags); - } - - public void findNext() { - EditWindow currentWindow = editor.getActiveWindow(); - - if (currentWindow == null || getFindTextField().getText().length() == 0) { - // launch error dialog? - return; - } - Pattern p = getCurrentPattern(); - JEditorPane editorPane = currentWindow.getEditorPane(); - - // for some reason, getText() trims off \r but the indexes in - // the editor pane don't. - String text = editorPane.getText().replaceAll("\\r", ""); - Matcher m = p.matcher(text); - int index = editorPane.getSelectionEnd(); - - if (!(m.find(index) || m.find())) { - return; - } - editorPane.setSelectionStart(m.start()); - editorPane.setSelectionEnd(m.end()); - } - - public void doReplacement() { - EditWindow currentWindow = editor.getActiveWindow(); - - if (currentWindow == null || getFindTextField().getText().length() == 0) { - // launch error dialog? - return; - } - JEditorPane editorPane = currentWindow.getEditorPane(); - String text = editorPane.getSelectedText(); - - if (text == null) { - // no selection - return; - } - Matcher m = getCurrentPattern().matcher(text); - - if (m.matches()) { - String replacement = getReplaceTextField().getText(); - - if (getRegexButton().isSelected()) { - replacement = m.replaceFirst(replacement); - } - editorPane.replaceSelection(replacement); - } - } - - public void doReplaceAll() { - EditWindow currentWindow = editor.getActiveWindow(); - - if (currentWindow == null || getFindTextField().getText().length() == 0) { - // launch error dialog? - return; - } - JEditorPane editorPane = currentWindow.getEditorPane(); - String text = editorPane.getText(); - - String replacement = getReplaceTextField().getText(); - - editorPane.setText(getCurrentPattern().matcher(text).replaceAll(replacement)); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FontStyle.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FontStyle.java deleted file mode 100644 index c593c2e..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/FontStyle.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.awt.Font; - - -/** - * Font style enumeration type, which provides an abstraction over the style flags from - * the integer flags from the {@link Font#getStyle()} method. - * - * @author Flemming N. Larsen (original) - */ -public enum FontStyle { - - PLAIN(Font.PLAIN, "Plain"), - BOLD(Font.BOLD, "Bold"), - ITALIC(Font.ITALIC, "Italic"), - BOLD_ITALIC(Font.BOLD + Font.ITALIC, "Bold Italic"); - - private final int fontStyleFlags; - private final String name; - - private FontStyle(int fontStyleFlags, String name) { - this.fontStyleFlags = fontStyleFlags; - this.name = name; - } - - public static FontStyle fromName(String name) { - for (FontStyle value : values()) { - if (value.name.equalsIgnoreCase(name)) { - return value; - } - } - return null; - } - - public static FontStyle fromStyleFlags(int flags) { - for (FontStyle value : values()) { - if (value.fontStyleFlags == flags) { - return value; - } - } - return null; - } - - public int getFontStyleFlags() { - return fontStyleFlags; - } - - public String getName() { - return name; - } - - public boolean isBold() { - return this == BOLD || this == BOLD_ITALIC; - } - - public boolean isItalic() { - return this == ITALIC || this == BOLD_ITALIC; - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/IEditorProperties.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/IEditorProperties.java deleted file mode 100644 index 40f090d..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/IEditorProperties.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -/** - * Interface for editor properties. - * - * @author Flemming N. Larsen (original) - * - * @since 1.8.3.0 - */ -public interface IEditorProperties { - - String getThemeName(); -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/JavaDocument.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/JavaDocument.java deleted file mode 100644 index 7497f42..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/JavaDocument.java +++ /dev/null @@ -1,1137 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Point; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import javax.swing.JViewport; -import javax.swing.SwingUtilities; -import javax.swing.event.ChangeListener; -import javax.swing.event.ChangeEvent; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.*; - -import net.sf.robocode.ui.editor.theme.EditorThemePropertiesManager; -import net.sf.robocode.ui.editor.theme.EditorThemePropertyChangeAdapter; -import net.sf.robocode.ui.editor.theme.IEditorThemeProperties; -import net.sf.robocode.util.StringUtil; - - -// FIXME: Column in status bar does not take tab size into account - -// TODO: Make it configurable to extend the Java keywords. -// TODO: Highlight methods from Robocode API? -// TODO: Highlight numbers? -// TODO: Method names and method invocations in bold? -// TODO: Trim trailing white-spaces from all lines? - -/** - * Represents a styled Java document used for syntax high-lightning. - * - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class JavaDocument extends StyledDocument { - - /** The text pane this document is used with necessary for setting the caret position when auto indenting */ - private final EditorPane textPane; - - /** Flag defining if the contained text is being loaded or replaced externally */ - private boolean isReplacingText; - - // Indentation // - - /** Flag defining if auto indentation is enabled */ - private boolean isAutoIndentEnabled = true; - - /** Flag defining if spaces must be used for indentation; otherwise tabulation characters are being used */ - private boolean useSpacesForIndentation = false; - - /** Tab size (column width) */ - private int tabSize = 4; // Default is every 4th column - - /** Java language quote delimiter characters represented in a string */ - private static final String QUOTE_DELIMITERS = "\"'"; - - /** Java keywords */ - private static final Set KEYWORDS = new HashSet( - Arrays.asList( - new String[] { - "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", - "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if", - "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private", - "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", - "throw", "throws", "transient", "try", "void", "volatile", "while" })); - - /** Predefined Java literals */ - private static final Set PREDEFINED_LITERALS = new HashSet( - Arrays.asList(new String[] { "false", "true", "null" })); - - /** Normal text attribute set */ - private final SimpleAttributeSet normalAttrSet = new SimpleAttributeSet(); - - /** Quoted text attribute set */ - private final SimpleAttributeSet quoteAttrSet = new SimpleAttributeSet(); - - /** Keyword attribute set */ - private final SimpleAttributeSet keywordAttrSet = new SimpleAttributeSet(); - - /** Predefined literal attribute set */ - private final SimpleAttributeSet literalAttrSet = new SimpleAttributeSet(); - - /** Annotation attribute set */ - private final SimpleAttributeSet annotationAttrSet = new SimpleAttributeSet(); - - /** Comment attribute set */ - private SimpleAttributeSet commentAttrSet = new SimpleAttributeSet(); - - /** String buffer holding only space characters for fast replacement of tabulator characters */ - private String spaceBuffer; - - /** Old start offset for syntax highlighting */ - private int lastSyntaxHighlightStartOffset; - - /** Old end offset for syntax highlighting */ - private int lastSyntaxHighlightEndOffset; - - private int autoIndentationCaretPos = -1; - - private boolean updateSyntaxHighlightingEDTidle = true; - - /** - * Constructor that creates a Java document. - * - * @param textPane - * is the text pane that this Java documents must apply to. - */ - public JavaDocument(EditorPane textPane) { - super(); - this.textPane = textPane; - - // Setup text colors and styles - setTextColorsAndStyles(null); - - // Setup document listener in order to update caret position and update syntax highlighting - addDocumentListener(new JavaDocumentListener()); - - // Setup editor properties change listener - EditorThemePropertiesManager.addListener(new EditorThemePropertyChangeAdapter() { - @Override - public void onNormalTextColorChanged(Color newColor) { - setNormalTextColor(newColor); - updateSyntaxHighlighting(true); - } - - @Override - public void onNormalTextStyleChanged(FontStyle newStyle) { - setNormalTextStyle(newStyle); - updateSyntaxHighlighting(true); - } - - @Override - public void onQuotedTextColorChanged(Color newColor) { - setQuotedTextColor(newColor); - updateSyntaxHighlighting(true); - } - - @Override - public void onQuotedTextStyleChanged(FontStyle newStyle) { - setQuotedTextStyle(newStyle); - updateSyntaxHighlighting(true); - } - - @Override - public void onKeywordTextColorChanged(Color newColor) { - setKeywordTextColor(newColor); - updateSyntaxHighlighting(true); - } - - @Override - public void onKeywordTextStyleChanged(FontStyle newStyle) { - setKeywordTextStyle(newStyle); - updateSyntaxHighlighting(true); - } - - @Override - public void onLiteralTextColorChanged(Color newColor) { - setLiteralTextColor(newColor); - updateSyntaxHighlighting(true); - } - - @Override - public void onLiteralTextStyleChanged(FontStyle newStyle) { - setLiteralTextStyle(newStyle); - updateSyntaxHighlighting(true); - } - - @Override - public void onAnnotationTextColorChanged(Color newColor) { - setAnnotationTextColor(newColor); - updateSyntaxHighlighting(true); - } - - @Override - public void onAnnotationTextStyleChanged(FontStyle newStyle) { - setAnnotationTextStyle(newStyle); - updateSyntaxHighlighting(true); - } - - @Override - public void onCommentTextColorChanged(Color newColor) { - setCommentTextColor(newColor); - updateSyntaxHighlighting(true); - } - - @Override - public void onCommentTextStyleChanged(FontStyle newStyle) { - setCommentTextStyle(newStyle); - updateSyntaxHighlighting(true); - } - }); - - // Setup change listener and focus listener on the viewport of the text pane - - JViewport viewport = textPane.getViewport(); - - viewport.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - updateSyntaxHighlighting(false); - } - }); - - viewport.addFocusListener(new FocusListener() { - public void focusGained(FocusEvent e) { - updateSyntaxHighlighting(false); - } - - public void focusLost(FocusEvent e) {} - }); - } - - /** - * Checks if auto indentation is enabled. - * - * @return true if auto indentation is enabled; false otherwise. - */ - public boolean isAutoIndentEnabled() { - return isReplacingText ? false : isAutoIndentEnabled; - } - - /** - * Enable or disable auto indentation. - * - * @param enable is set to true, if auto indentation must be enabled; false is auto indentation must be disabled. - */ - public void setAutoIndentEnabled(boolean enable) { - isAutoIndentEnabled = enable; - } - - /** - * Checks if the contained text is currently being replaced externally. - * - * @return true if the text is being replaced; false otherwise. - */ - public boolean isReplacingText() { - return isReplacingText; - } - - /** - * Sets the flag if the contained text is currently being replaced externally or not. - * - * @param isReplacingText is true if the text is currently being replaced; false otherwise. - */ - public void setReplacingText(boolean isReplacingText) { - this.isReplacingText = isReplacingText; - } - - @Override - public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { - // Process auto indentation on inserted string - final Indentation indent = applyAutoIndentation(offset, str); - - // Replace indentation tabulation characters with spaces if spaces must be used instead of tabulation characters - str = replaceTabulatorCharacters(getEndOffset(getElementFromOffset(offset)), indent.text); - - // Set the new caret position on the text pane if the caret position has been set - autoIndentationCaretPos = indent.caretPos; - - // Insert the modified string using the original method for inserting string into this document - super.insertString(offset, str, a); - } - - /** - * Sets the tabulation column size. - * - * @param tabSize - * is the new tabulation column size, which must be >= 1. - */ - public void setTabSize(int tabSize) { - this.tabSize = tabSize; - } - - private void setTextColorsAndStyles(IEditorThemeProperties themeProps) { - if (themeProps == null) { - themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - } - setNormalTextColor(themeProps.getNormalTextColor()); - setNormalTextStyle(themeProps.getNormalTextStyle()); - setQuotedTextColor(themeProps.getQuotedTextColor()); - setQuotedTextStyle(themeProps.getQuotedTextStyle()); - setKeywordTextColor(themeProps.getKeywordTextColor()); - setKeywordTextStyle(themeProps.getKeywordTextStyle()); - setLiteralTextColor(themeProps.getLiteralTextColor()); - setLiteralTextStyle(themeProps.getLiteralTextStyle()); - setAnnotationTextColor(themeProps.getAnnotationTextColor()); - setAnnotationTextStyle(themeProps.getAnnotationTextStyle()); - setCommentTextColor(themeProps.getCommentTextColor()); - setCommentTextStyle(themeProps.getCommentTextStyle()); - } - - private void setNormalTextColor(Color newColor) { - StyleConstants.setForeground(normalAttrSet, newColor); - } - - private void setNormalTextStyle(FontStyle newStyle) { - StyleConstants.setBold(normalAttrSet, newStyle.isBold()); - StyleConstants.setItalic(normalAttrSet, newStyle.isItalic()); - } - - private void setQuotedTextColor(Color newColor) { - StyleConstants.setForeground(quoteAttrSet, newColor); - } - - private void setQuotedTextStyle(FontStyle newStyle) { - StyleConstants.setBold(quoteAttrSet, newStyle.isBold()); - StyleConstants.setItalic(quoteAttrSet, newStyle.isItalic()); - } - - private void setKeywordTextColor(Color newColor) { - StyleConstants.setForeground(keywordAttrSet, newColor); - } - - private void setKeywordTextStyle(FontStyle newStyle) { - StyleConstants.setBold(keywordAttrSet, newStyle.isBold()); - StyleConstants.setItalic(keywordAttrSet, newStyle.isItalic()); - } - - private void setLiteralTextColor(Color newColor) { - StyleConstants.setForeground(literalAttrSet, newColor); - } - - private void setLiteralTextStyle(FontStyle newStyle) { - StyleConstants.setBold(literalAttrSet, newStyle.isBold()); - StyleConstants.setItalic(literalAttrSet, newStyle.isItalic()); - } - - private void setAnnotationTextColor(Color newColor) { - StyleConstants.setForeground(annotationAttrSet, newColor); - } - - private void setAnnotationTextStyle(FontStyle newStyle) { - StyleConstants.setBold(annotationAttrSet, newStyle.isBold()); - StyleConstants.setItalic(annotationAttrSet, newStyle.isItalic()); - } - - private void setCommentTextColor(Color newColor) { - StyleConstants.setForeground(commentAttrSet, newColor); - } - - private void setCommentTextStyle(FontStyle newStyle) { - StyleConstants.setBold(commentAttrSet, newStyle.isBold()); - StyleConstants.setItalic(commentAttrSet, newStyle.isItalic()); - } - - /** - * Applies indentation for an inserted string at a given offset if auto indentation is enabled. - * - * @param offset - * is the offset of the inserted string. - * @param str - * is the inserted string. - * @return an Indentation container with indentation details. - * @throws BadLocationException - */ - private Indentation applyAutoIndentation(int offset, String str) throws BadLocationException { - // Prepare indentation container - Indentation indentation = new Indentation(); - - indentation.caretPos = -1; // Meaning that caret position is not changed - indentation.text = str; - - // Apply auto indentation if it is enabled, and the new line character has been entered - if (isAutoIndentEnabled() && str.equals("\n")) { - - // Save the current indentation for later, as it might change from here on - int currentIndentation = getIndentationLengthFromOffset(offset); - - // Read the line content from the offset - String line = getLineFromOffset(offset); - - // Calculate the end offset of the line - int lineEndOffset = getElementFromOffset(offset).getStartOffset() + line.length(); - - // Continue if the line has content and the offset is after the line end offset - if (line.length() > 0 && offset >= lineEndOffset) { - - // Check/compose and return a body start indentation a '{' is found - if (composeBodyStartIndentation(offset, line, indentation)) { - return indentation; - } - // Check/compose and return a multiline comment start indentation if a '/*' is found - if (composeMultilineCommentStartIndentation(offset, line, indentation)) { - return indentation; - } - // Check/compose and return a continued multiline comment if a '*' is found inside a multiline comment - if (composeMultilineCommentContinuedIndentation(offset, line, indentation)) { - return indentation; - } - // Check/compose and return a multiline comment end indentation if a '*/' is found - if (composeMultilineCommentEndIndentation(offset, line, indentation)) { - return indentation; - } - // Extend the current indentation text based on the current indentation - // Note: Will replace tabulator characters with spaces etc. if this must be done. - indentation.text += getStartIndentation(currentIndentation); // FIXME - } - } - return indentation; - } - - /** - * Returns a string where tabulator characters in the given string is replaced with spaces, but only if these must - * be replaced with spaces by configuration. - * - * @param startIndex - * is the start index of the string in a line used for determine the current tabulator column. - * @param str - * is the string containing tabulator characters that might need to be replaced with spaces. - * @return a string where tabulator characters might have been replaced with spaces. - */ - private String replaceTabulatorCharacters(int startIndex, String str) { - // Check if tabulator characters needs to be replaced with space characters - if (useSpacesForIndentation) { - // Prepare string buffer containing replaced text - StringBuilder sb = new StringBuilder(); - - int tabIndex; // Index of current tabulator character - - // Run loop as long as we find a tabulator character from the start index - while ((tabIndex = str.indexOf('\t', startIndex)) >= 0) { - // Put the current text (non tabulator characters) into the string buffer - sb.append(str.substring(startIndex, tabIndex)); - - // Calculate the number of spaces that remain before the next tabulator column - int numSpaces = tabSize - (sb.length() % tabSize); - - // Run loop while the follower character is a tabulator character - while (++tabIndex < str.length() && str.charAt(tabIndex) == '\t') { - // Increment the number of spaces that to use to replace tabulator characters with the tabulator - // column size. - numSpaces += tabSize; - } - // Append the calculated number of space characters to replace the tabulator characters - sb.append(getSpaces(numSpaces)); - - // The new start index is the current tabulator index - startIndex = tabIndex; - } - // Append the text that remain to the string buffer from the current start index - sb.append(str.substring(startIndex)); - - // Set the result to the build string from the string buffer - str = sb.toString(); - } - // Return the resulting string - return str; - } - - /** - * Returns a string containing a specific number of spaces only. - * - * @param count - * is the number of spaces the the string should contain. - * @return a string containing only the given number of space characters. - */ - private String getSpaces(int count) { - if (count == 0) { - return ""; - } - // Determine the current buffer size - int bufferSize = (spaceBuffer == null) ? 0 : spaceBuffer.length(); - - // Check if we need to reallocate the buffer to accommodate the given number of spaces - if (count > bufferSize) { - // Determine the new buffer size, which is set to twice the number of spaces, but minimum 100 characters - bufferSize = Math.max(2 * count, 100); - // Create a new string containing spaces with the new buffer size - char[] chars = new char[bufferSize]; - - Arrays.fill(chars, ' '); - spaceBuffer = new String(chars); - } - // Return a string containing the given number of spaces - return spaceBuffer.substring(0, count); - } - - /** - * Composes a body start indentation block starting with a '{' and ending with a '}' and update the caret position. - * - * @param offset - * is the offset of the inserted string. - * @param line - * is the line, where the indentation block must be appended to. - * @param indentation - * is containing the current indentation date. - * @return true if a body start indentation block should be inserted after the given line; false otherwise. - * @throws BadLocationException - */ - private boolean composeBodyStartIndentation(int offset, String line, Indentation indentation) - throws BadLocationException { - // Check if the given line ends with a body start character, i.e. '{' - if (line.endsWith("{")) { - // We only start a new body indentation if the number of body start characters in the first part of the - // text up to specified offset lesser than the number of body end characters in the last part of the text - String textFirstHalf = getText(0, offset); - String textLastHalf = getText(offset, getLength() - offset); - if (StringUtil.countChar(textLastHalf, '}') >= StringUtil.countChar(textFirstHalf, '{')) { - return false; - } - // Calculated current start indentation length from the given offset - int startIndentLen = getIndentationLengthFromOffset(offset); - // Calculate the start indentation string - String startIndent = getStartIndentation(startIndentLen); - // Prapare buffer for containing the indentation block - StringBuilder sb = new StringBuilder("\n"); - - // Append new indented line to the buffer, that is indented based on the start indentation - sb.append(getStartIndentation(startIndentLen + tabSize)).append('\n'); - // Update the caret position to be placed in the end of the new indented line - indentation.caretPos = offset + sb.toString().length() - 1; - // Append the body end character on a new line - sb.append(startIndent).append('}'); - // Set the indentation block text to the string containing from the buffer - indentation.text = sb.toString(); - // Indentation block was created - return true; - } - // Indentation block was not created - return false; - } - - /** - * Composes a multiline comment start indentation block. - * - * @param offset - * is the offset of the inserted string. - * @param line - * is the line, where the indentation block must be appended to. - * @param indentation - * is containing the current indentation date. - * @return true if a multiline comment start indentation block should be inserted after the given line; false - * otherwise. - * @throws BadLocationException - */ - private boolean composeMultilineCommentStartIndentation(int offset, String line, Indentation indentation) - throws BadLocationException { - - // Check if the given line contains a multiline start string, i.e. '/*' - if (line.trim().startsWith("/*")) { - // Calculated current start indentation length from the given offset - int startIndentLen = getIndentationLengthFromOffset(offset); - // Calculate the start indentation string - String startIndent = getStartIndentation(startIndentLen); - // Prepare buffer for containing the indentation block - StringBuilder sb = new StringBuilder("\n"); - - // Append new indented multiline comment line to the buffer, that is indented based on the start indentation - sb.append(startIndent).append(" * \n"); - // Update the caret position to be placed in the end of the new indented line - indentation.caretPos = offset + sb.toString().length() - 1; - // Append the multiline comment end character on a new line - sb.append(startIndent).append(" */"); - // Set the indentation block text to the string containing from the buffer - indentation.text = sb.toString(); - // Indentation block was created - return true; - } - // Indentation block was not created - return false; - } - - /** - * Composes a continued multiline comment indentation block. - * - * @param offset - * is the offset of the inserted string. - * @param line - * is the line, where the indentation block must be appended to. - * @param indentation - * is containing the current indentation date. - * @return true if a continued multiline comment indentation block should be inserted after the given line; false - * otherwise. - * @throws BadLocationException - */ - private boolean composeMultilineCommentContinuedIndentation(int offset, String line, Indentation indentation) - throws BadLocationException { - - // Check if the given line contains a '*' and is located inside of a multiline comment - if (line.trim().startsWith("*") && isInMultilineComment(offset)) { - // Calculated current start indentation length from the given offset - int startIndentLen = getIndentationLengthFromOffset(offset); - // Calculate the start indentation string - String startIndent = getStartIndentation(startIndentLen); - // Prepare buffer for containing the indentation block - StringBuilder sb = new StringBuilder("\n"); - - // Append new indented multiline comment line to the buffer, that is indented based on the start indentation - sb.append(startIndent).append("* "); - // Update the caret position to be placed in the end of the new indented line - indentation.caretPos = offset + sb.toString().length(); - // Set the indentation block text to the string containing from the buffer - indentation.text = sb.toString(); - // Indentation block was created - return true; - } - // Indentation block was not created - return false; - } - - /** - * Composes a multiline end start indentation block. - * - * @param offset - * is the offset of the inserted string. - * @param line - * is the line, where the indentation block must be appended to. - * @param indentation - * is containing the current indentation date. - * @return true if a multiline comment end indentation block should be inserted after the given line; false - * otherwise. - * @throws BadLocationException - */ - private boolean composeMultilineCommentEndIndentation(int offset, String line, Indentation indentation) - throws BadLocationException { - - // Check if the given line contains a multiline end string, i.e. '*/' - if (line.trim().endsWith("*/")) { - // Get the line index from the current offset - int lineIndex = getElementIndex(offset); - - // Run loop as long as the line index is still positive (till the start of the document text) - while (lineIndex >= 0) { - // Check if the current line line is not in a multiline comment - int lineOffset = getElement(lineIndex).getStartOffset(); - - if (!isInMultilineComment(lineOffset)) { - // Append indentation that matches the start offset of the current line - indentation.text += getStartIndentation(getIndentationLengthFromOffset(lineOffset)); - break; - } - // Move to previous line - lineIndex--; - } - // Indentation block was created - return true; - } - // Indentation block was not created - return false; - } - - /** - * Returns line from the specified offset where trailing white spaces are removed. Note: The white spaces in the - * beginning of the line is not removed as these serve to determine start indentation for inserted lines following - * this line. - * - * @param offset - * is the offset to retrieve the line from. - * @return the line at the given offset where trailing white spaces have been trimmed. - * @throws BadLocationException - */ - private String getLineFromOffset(int offset) throws BadLocationException { - // Get the start and end index of the line - Element element = getElementFromOffset(offset); - int start = element.getStartOffset(); - int end = getEndOffset(element); - - if (end == start) { - return ""; - } - - // Get the line content - String origLine = getText(start, end - start); - // Trim trailing white spaces - String trimmedLine = origLine.replaceAll("\\s*$", ""); - - // Return the trimmed line, but only if it did not contain only white spaces as we need the white spaces for - // indentation for lines inserted after this line. - return trimmedLine.length() > 0 ? trimmedLine : origLine; - } - - /** - * Calculates and returns the indentation length (number of space characters) of the line at the given offset. - * - * @param offset - * is the document offset of the line. - * @return the calculated indentation length of the line at the given offset. - * @throws BadLocationException - */ - private int getIndentationLengthFromOffset(int offset) throws BadLocationException { - // Gets the start offset of the line at the given offset - int startOffset = getElementFromOffset(offset).getStartOffset(); - - // Run loop while the next character is a space of tabulator character. - int length = 0; - - for (;;) { - // Get the next character - char ch = getText(startOffset++, 1).charAt(0); - - if (ch == ' ') { - // Increment the length by 1 if the character is a space - length++; - } else if (ch == '\t') { - // Increment the length by the number of spaces the remain in order to reach the next tabulator column, - // if the character is a tabulator character. - length = tabSize * (length / tabSize + 1); - } else { - // Otherwise, stop looping - break; - } - } - // Return the calculated indentation length - return length; - } - - /** - * Returns a start indentation string of the given length. - * - * @param length - * is the length of the indentation measured in number of spaces. - * @return a string to apply to the start of a line in order to indent the line. - */ - private String getStartIndentation(int length) { - if (length == 0) { - return ""; - } - - // Prepare string buffer for containing the indentation string - StringBuilder sb = new StringBuilder(); - - // Check if tabulator characters must be used for indentation - if (!useSpacesForIndentation) { - // Append as many tabulator characters to the indentation string that fits into the given length - for (int i = length / tabSize; i > 0; i--) { - sb.append('\t'); - } - // Set the length to the spaces remaining to reach the input length - length %= tabSize; - } - // Apply spaces to the string buffer (might be the spaces that remain to fit the given length) - sb.append(getSpaces(length)); - // Return the indentation string contained in the string buffer - return sb.toString(); - } - - /** - * Updates the syntax highlighting on the document using the EDT. - */ - private void updateSyntaxHighlighting(final boolean force) { - // Only invoke the EDT, if this operation is not already initiated - if (updateSyntaxHighlightingEDTidle) { - updateSyntaxHighlightingEDTidle = false; - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - try { - // Apply syntax highlighting from the current offset - performSyntaxHighlighting(force); - updateSyntaxHighlightingEDTidle = true; - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - }); - } - } - - /** - * Perform syntax highlighting on the document. This implementation only performs syntax highlighting on the current - * visible text in the view port of the text pane, and detects if the text has been changed before performing the - * syntax highlighting. - * - * @throws BadLocationException - */ - private void performSyntaxHighlighting(boolean force) throws BadLocationException { - // Return if there is nothing to highlight - if (getLength() == 0 && !force) { - return; - } - - // Get the start and end offset of the visible text - - JViewport viewport = textPane.getViewport(); - Point startPoint = viewport.getViewPosition(); - Dimension size = viewport.getExtentSize(); - Point endPoint = new Point(startPoint.x + size.width, startPoint.y + size.height); - - int startOffset = textPane.viewToModel(startPoint); - int endOffset = textPane.viewToModel(endPoint); - - // Return if the current start and end offset is equal to the last ones - if (!force && startOffset == lastSyntaxHighlightStartOffset && endOffset == lastSyntaxHighlightEndOffset) { - return; - } - - lastSyntaxHighlightStartOffset = startOffset; - lastSyntaxHighlightEndOffset = endOffset; - - setCharacterAttributes(startOffset, endOffset - startOffset, normalAttrSet, true); - - // Get start and end line - int startLine = getElementIndex(startOffset); - int endLine = getElementIndex(endOffset); - - // Process each changed line one by one from the start line to the end line - for (int line = startLine; line <= endLine; line++) { - processChangedLine(line); - } - } - - /** - * Process changed line by applying syntax highlighting on the entire line at the given index. - * - * @param lineIndex - * is the index of the line. - * @throws BadLocationException - */ - private void processChangedLine(int lineIndex) throws BadLocationException { - // Process the syntax tokens on the given line - Element element = getElement(lineIndex); - - processLineTokens(element.getStartOffset(), getEndOffset(element)); - } - - /** - * Process the syntax tokens contained in a line. - * - * @param startOffset - * is the document start offset of the line to process. - * @param endOffset - * is the document end offset of the line to process. - * @throws BadLocationException - */ - private void processLineTokens(int startOffset, int endOffset) throws BadLocationException { - // Calculate the length of the line based on the given start and end offset - int len = endOffset - startOffset; - - // Process tokens one by one - String textFragment = getText(startOffset, len); - int index = 0; - - while (index < len) { - index += processToken(textFragment.substring(index), startOffset + index); - } - } - - /** - * Process the syntax token contained in a text fragment. - * - * @param textFragment - * is the text fragment. - * @param startOffset - * is the start offset of the text fragment to process. - * @return the number of processed characters. - * @throws BadLocationException - */ - private int processToken(final String textFragment, final int startOffset) throws BadLocationException { - // Process quote token if the first character in the text fragment is a quote delimiter - if (isQuoteDelimiter(textFragment.charAt(0))) { - return processQuoteToken(textFragment, startOffset); - } - int len; - - // Check if the token is a single line comment - // Note: Single line comment has higher precedence than a multiline comment. - if (textFragment.startsWith("//")) { - len = textFragment.length(); - setCharacterAttributes(startOffset, len, commentAttrSet, true); - return len; - } - // Check if the token is a multiline comment - if (textFragment.startsWith("/*")) { - return processStartMultilineCommentToken(textFragment, startOffset); - } - // Check if the token is in the middle of a multiline comment - if (isInMultilineComment(startOffset)) { - // Check if the token contains the end mark of the multiline comment - int endCommentIndex = textFragment.indexOf("*/"); - - if (endCommentIndex >= 0) { - len = endCommentIndex + 2; // Limit length to the end mark - } else { - len = textFragment.length(); // Use the whole token - } - setCharacterAttributes(startOffset, len, commentAttrSet, true); - return len; - } - - // Skip delimiter characters - len = 1; - while (len < textFragment.length()) { - char ch = textFragment.charAt(len); - - if (!Character.isLetter(ch)) { - break; - } - len++; - } - - // Limit token to current length, e.g. if it contained delimiter characters - String token = textFragment.substring(0, len); - - // Check if the token is a keyword or an annotation - if (startOffset > 0 && !Character.isLetter(getText(startOffset - 1, 1).charAt(0)) || startOffset == 0) { - if (isKeyword(token)) { - setCharacterAttributes(startOffset, len, keywordAttrSet, true); - } else if (isPredefinedLiteral(token)) { - setCharacterAttributes(startOffset, len, literalAttrSet, true); - } else if (isAnnotation(token)) { - setCharacterAttributes(startOffset, len, annotationAttrSet, true); - } else { - len = 1; - } - } else { - len = 1; - } - // Return the number of processed characters - return len; - } - - /** - * Process a quote token. - * - * @param textFragment - * is the text fragment. - * @param startOffset - * is the start offset of the text fragment to process. - * @return the number of processed characters. - * @throws BadLocationException - */ - private int processQuoteToken(final String textFragment, final int startOffset) { - char quoteDelimiter = textFragment.charAt(0); - - // Find end quote if it exists. Ignore escaped quotes - int indexQuote = 1; - int quoteEndIndex = -1; - - for (;;) { - indexQuote = textFragment.indexOf(quoteDelimiter, indexQuote); - if (indexQuote <= 0 || indexQuote > textFragment.length()) { - break; - } - if (textFragment.charAt(indexQuote - 1) != '\\') { - quoteEndIndex = indexQuote; - break; - } - indexQuote++; - } - - // Set length of token, if end quote was found - int len = quoteEndIndex >= 0 ? quoteEndIndex + 1 : textFragment.length(); - - // Set quote attribute set - setCharacterAttributes(startOffset, len, quoteAttrSet, true); - - return len; - } - - /** - * Process a multiline comment token. - * - * @param textFragment - * is the text fragment. - * @param startOffset - * is the start offset of the text fragment to process. - * @return the number of processed characters. - * @throws BadLocationException - */ - private int processStartMultilineCommentToken(final String textFragment, final int startOffset) { - int endIndex = textFragment.indexOf("*/", 1); - int len = endIndex >= 0 ? endIndex + 2 : textFragment.length(); - - setCharacterAttributes(startOffset, len, commentAttrSet, true); - - return len; - } - - /** - * Checks if the current text offset is within a multiline comment. - * - * @param offset - * is the text offset. - * @return true if the given offset is within a multiline comment; false otherwise. - * @throws BadLocationException - */ - private boolean isInMultilineComment(final int offset) throws BadLocationException { - return isInMultilineComment(getElementIndex(offset), offset); - } - - /** - * Checks if the current text offset is within a multiline comment. - * - * @oaram lineIndex is the element index of a line. - * @param offset - * is the text offset. - * @return true if the given line element index and offset is within a multiline comment; false otherwise. - * @throws BadLocationException - */ - private boolean isInMultilineComment(final int lineIndex, final int offset) throws BadLocationException { - int startOffset = getElement(lineIndex).getStartOffset(); - String lineText = getLineFromOffset(startOffset); - int len = Math.min((offset - startOffset), lineText.length()); - - lineText = lineText.substring(0, len); - - int commentStart = lineText.lastIndexOf("/*"); - int commentEnd = lineText.lastIndexOf("*/"); - - if (commentStart >= 0) { - if (commentEnd >= 0) { - if (commentEnd > commentStart) { - return (len < commentEnd); - } - } else { - return true; - } - } - if (commentEnd >= 0) { - return false; - } - - int prevLine = lineIndex - 1; - - return (prevLine >= 0) ? isInMultilineComment(prevLine, offset) : false; - } - - /** - * Checks if a character is a quote delimiter character. - * - * @param ch - * is the character. - * @return true if the given character is a quote delimiter character; false otherwise. - */ - private static boolean isQuoteDelimiter(char ch) { - return QUOTE_DELIMITERS.indexOf(ch) >= 0; - } - - /** - * Checks if a token is a keyword. - * - * @param token - * is the token. - * @return true if the given token is a keyword; false otherwise. - */ - private static boolean isKeyword(String token) { - return KEYWORDS.contains(token); - } - - /** - * Checks if a token is a predefined literal. - * - * @param token - * is the token. - * @return true if the given token is a predefined literal; false otherwise. - */ - private static boolean isPredefinedLiteral(String token) { - return PREDEFINED_LITERALS.contains(token); - } - - /** - * Checks if a token is an annotation. - * - * @param token - * is the token. - * @return true if the given token is an annotation; false otherwise. - */ - private static boolean isAnnotation(String token) { - return token.matches("@\\w.*"); - } - - /** - * Class containing data for indentation. - */ - private class Indentation { - // Is the new caret position after the indentation has been made. -1 means no change. - int caretPos; - // Is the indentation text - String text; - } - - - /** - * This document listener is used for updating the caret position and update syntax highlighting when the contents - * of the document is changed. - */ - private class JavaDocumentListener implements DocumentListener { - - // Caret position updater - final CaretPositionUpdater caretPositionUpdater = new CaretPositionUpdater(); - - public void insertUpdate(final DocumentEvent e) { - int newCaretPosition; - - // Check if the caret position has been changed by auto indentation - if (autoIndentationCaretPos >= 0) { - // Set the new caret position to the one set for auto indentation - newCaretPosition = autoIndentationCaretPos; - // Signal that the caret position for auto indentation has been set - autoIndentationCaretPos = -1; - } else { - // Set the new caret position to the end of the inserted text - newCaretPosition = e.getOffset() + e.getLength(); - } - // Update the caret position to the new position - caretPositionUpdater.updateCaretPosition(newCaretPosition); - - // Apply syntax highlighting from the current offset - updateSyntaxHighlighting(false); - } - - public void removeUpdate(final DocumentEvent e) { - // Set the caret position where the text was removed. - caretPositionUpdater.updateCaretPosition(e.getOffset()); - - // Apply syntax highlighting from the current offset - updateSyntaxHighlighting(false); - } - - public void changedUpdate(DocumentEvent e) {} - - private final class CaretPositionUpdater { - - /** - * Updates the caret position via the EDT. - * - * @param newCaretPosition is the new caret position. - */ - public void updateCaretPosition(int newCaretPosition) { - // Set the caret position, and take care that it is not out of range - textPane.setCaretPosition(Math.min(newCaretPosition, getLength())); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineHighlighter.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineHighlighter.java deleted file mode 100644 index 6f8a7e1..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineHighlighter.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.Shape; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionAdapter; -import java.awt.event.MouseMotionListener; - -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.Highlighter; -import javax.swing.text.JTextComponent; - -import net.sf.robocode.ui.editor.theme.EditorThemePropertiesManager; -import net.sf.robocode.ui.editor.theme.EditorThemePropertyChangeAdapter; - - -/** - * Class used for highlighting the current line for a JTextComponent. - * - * @author Santhosh Kumar T (original) - * @author Peter De Bruycker (contributor) - * @author Flemming N. Larsen (contributor) - */ -public final class LineHighlighter { - private static final String LINE_HIGHLIGHT = "line-highlight"; - private static final String PREVIOUS_CARET = "previous-caret"; - - private static Color color; // Color used for highlighting the line - - private LineHighlighter() {} - - /** - * Installs CurrentLineHilighter for the given JTextComponent. - * @param c is the text component - */ - public static void install(JTextComponent c) { - try { - Object obj = c.getHighlighter().addHighlight(0, 0, painter); - c.putClientProperty(LINE_HIGHLIGHT, obj); - c.putClientProperty(PREVIOUS_CARET, new Integer(c.getCaretPosition())); - c.addCaretListener(caretListener); - c.addMouseListener(mouseListener); - c.addMouseMotionListener(mouseMotionListener); - - color = EditorThemePropertiesManager.getCurrentEditorThemeProperties().getHighlightedLineColor(); - EditorThemePropertiesManager.addListener(editorThemePropertyChangeListener); - } catch (BadLocationException ex) {} - } - - /** - * Uninstalls CurrentLineHighligher for the given JTextComponent. - * @param c is the text component - */ - public static void uninstall(JTextComponent c) { - c.putClientProperty(LINE_HIGHLIGHT, null); - c.putClientProperty(PREVIOUS_CARET, null); - c.removeCaretListener(caretListener); - c.removeMouseListener(mouseListener); - c.removeMouseMotionListener(mouseMotionListener); - EditorThemePropertiesManager.removeListener(editorThemePropertyChangeListener); - } - - /** - * Fetches the previous caret location, stores the current caret location, - * If the caret is on another line, repaint the previous line and the current line - * @param c is the text component - */ - private static void caretUpdate(JTextComponent c) { - try { - int previousCaret = ((Integer) c.getClientProperty(PREVIOUS_CARET)).intValue(); - final int actualCaretPosition = c.getCaretPosition(); - c.putClientProperty(PREVIOUS_CARET, new Integer(actualCaretPosition)); - Rectangle prev = c.modelToView(previousCaret); - Rectangle r = c.modelToView(actualCaretPosition); - // c.putClientProperty(PREVIOUS_CARET, new Integer(actualCaretPosition)); - - if (prev != null && prev.y != r.y) { - c.repaint(0, prev.y, c.getWidth(), r.height); - c.repaint(0, r.y, c.getWidth(), r.height); - } - } catch (BadLocationException ignore) {} - } - - private static CaretListener caretListener = new CaretListener() { - @Override - public void caretUpdate(CaretEvent e) { - JTextComponent c = (JTextComponent) e.getSource(); - LineHighlighter.caretUpdate(c); - } - }; - - private static MouseListener mouseListener = new MouseAdapter() { - // highlight the line the user clicks on - @Override - public void mousePressed(MouseEvent e) { - JTextComponent c = (JTextComponent) e.getSource(); - caretUpdate(c); - } - }; - - private static MouseMotionListener mouseMotionListener = new MouseMotionAdapter() { - @Override - public void mouseDragged(MouseEvent e) { - JTextComponent c = (JTextComponent) e.getSource(); - caretUpdate(c); - } - }; - - private static EditorThemePropertyChangeAdapter editorThemePropertyChangeListener = new EditorThemePropertyChangeAdapter() { - public void onHighlightedLineColorChanged(Color newColor) { - if (!color.equals(newColor)) { - color = newColor; - } - } - }; - - private static Highlighter.HighlightPainter painter = new Highlighter.HighlightPainter() { - @Override - public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) { - try { - Rectangle r = c.modelToView(c.getCaretPosition()); - g.setColor(color); - g.fillRect(0, r.y, c.getWidth(), r.height); - } catch (BadLocationException ignore) {} - } - }; -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineNumberArea.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineNumberArea.java deleted file mode 100644 index 675ea1f..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/LineNumberArea.java +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.awt.Color; -import java.awt.Rectangle; - -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.Document; -import javax.swing.text.JTextComponent; - -import net.sf.robocode.ui.editor.theme.EditorThemeProperties; -import net.sf.robocode.ui.editor.theme.EditorThemePropertiesManager; -import net.sf.robocode.ui.editor.theme.EditorThemePropertyChangeAdapter; - - -/** - * A text area containing line numbers for the editor pane and editor panel. - * - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class LineNumberArea extends JTextArea { - - private final DocumentListener documentListener = new TextDocumentListener(); - - public LineNumberArea(JTextComponent textComponent) { - super("1"); - - setEditable(false); - setLineWrap(false); - - EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties(); - setBackgroundColor(themeProps.getLineNumberBackgroundColor()); - setTextColor(themeProps.getLineNumberTextColor()); - - textComponent.getDocument().addDocumentListener(documentListener); - - EditorThemePropertiesManager.addListener(new EditorThemePropertyChangeAdapter() { - @Override - public void onLineNumberBackgroundColorChanged(Color newColor) { - setBackgroundColor(newColor); - } - - @Override - public void onLineNumberTextColorChanged(Color newColor) { - setTextColor(newColor); - } - }); - } - - private class TextDocumentListener implements DocumentListener { - int lastNumLines = 1; - - public void insertUpdate(DocumentEvent e) { - updateText(e.getDocument()); - } - - public void removeUpdate(DocumentEvent e) { - updateText(e.getDocument()); - } - - public void changedUpdate(DocumentEvent e) { - updateText(e.getDocument()); - } - - private void updateText(final Document doc) { - - final int numLines = getNumLines(doc); - - if (numLines == lastNumLines) { - return; - } - lastNumLines = numLines; - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - final Rectangle visibleRect = getVisibleRect(); - - setIgnoreRepaint(true); // avoid flickering - setText(generateLinesText(numLines)); - - // Must be done this way to keep aligned with scroll bar! - SwingUtilities.invokeLater(new Runnable() { - public void run() { - scrollRectToVisible(visibleRect); - setIgnoreRepaint(false); // avoid flickering - } - }); - } - }); - } - - /** - * Returns a string containing text lines for all line numbers. - * Each line number is right-aligned and ended a space + a new-line character. - * - * @param numLines is the number of lines to create the line number text for. - * @return a string containing line numbers. - */ - private String generateLinesText(int numLines) { - String format = "%" + ("" + (numLines + 1)).length() + "s "; - - StringBuilder lines = new StringBuilder(); - int i = 1; - while (i <= numLines) { - String s = String.format(format, "" + i++); - lines.append(s).append('\n'); - } - lines.append(String.format(format, "" + i)); - return lines.toString(); - } - - private int getNumLines(Document doc) { - return doc.getDefaultRootElement().getElementIndex(doc.getLength()); - } - } - - private void setBackgroundColor(Color newBackgroundColor) { - setBackground(newBackgroundColor); - setSelectionColor(newBackgroundColor); - } - - private void setTextColor(Color newTextColor) { - setForeground(newTextColor); - setSelectedTextColor(newTextColor); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/Module.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/Module.java deleted file mode 100644 index 17a07cf..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/Module.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import net.sf.robocode.core.BaseModule; -import net.sf.robocode.core.Container; - - -/** - * @author Pavel Savara (original) - */ -public class Module extends BaseModule { - static { - Container.cache.addComponent(RobocodeCompilerFactory.class); - Container.cache.addComponent(RobocodeEditor.class); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/MoreWindowsDialog.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/MoreWindowsDialog.java deleted file mode 100644 index 0154521..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/MoreWindowsDialog.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.Vector; - - -/** - * @author Matthew Reeder (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class MoreWindowsDialog extends JDialog implements ActionListener, MouseListener { - private JButton activateButton; - private JButton cancelButton; - private JButton closeButton; - private JList windowList; - private final Vector windowListItems; - - public MoreWindowsDialog(RobocodeEditor window) { - super(window, "More Windows...", false); - windowListItems = new Vector(); - JPanel listPanel = new JPanel(new GridLayout(1, 1)); - - listPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Open Windows")); - listPanel.add(new JScrollPane(getWindowList())); - JPanel buttonPanel = new JPanel(); - - buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); - buttonPanel.add(getActivateButton()); - buttonPanel.add(getCancelButton()); - buttonPanel.add(getCloseButton()); - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(buttonPanel, BorderLayout.SOUTH); - getContentPane().add(listPanel); - setSize(400, 400); - } - - public void addWindowItem(WindowMenuItem item) { - windowListItems.add(item); - getWindowList().setListData(windowListItems); - } - - public void removeWindowItem(WindowMenuItem item) { - windowListItems.remove(item); - getWindowList().setListData(windowListItems); - } - - public JButton getActivateButton() { - if (activateButton == null) { - activateButton = new JButton(); - activateButton.setText("Activate"); - activateButton.setMnemonic('A'); - activateButton.setDefaultCapable(true); - activateButton.addActionListener(this); - } - return activateButton; - } - - public JButton getCancelButton() { - if (cancelButton == null) { - cancelButton = new JButton(); - cancelButton.setText("Cancel"); - cancelButton.setMnemonic('C'); - cancelButton.addActionListener(this); - } - return cancelButton; - } - - public JButton getCloseButton() { - if (closeButton == null) { - closeButton = new JButton(); - closeButton.setText("Close"); - closeButton.setMnemonic('l'); - closeButton.setDisplayedMnemonicIndex(1); - closeButton.addActionListener(this); - } - return closeButton; - } - - public JList getWindowList() { - if (windowList == null) { - windowList = new JList(); - windowList.addMouseListener(this); - windowList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - } - return windowList; - } - - public void actionPerformed(ActionEvent e) { - if (e.getSource() == closeButton) { - WindowMenuItem item = (WindowMenuItem) windowList.getSelectedValue(); - - if (item != null && item.getEditWindow() != null) { - item.getEditWindow().doDefaultCloseAction(); - } - } else { - if (e.getSource() == activateButton) { - WindowMenuItem item = (WindowMenuItem) windowList.getSelectedValue(); - - if (item != null) { - item.actionPerformed(null); - } - } - setVisible(false); - } - } - - public void mouseClicked(MouseEvent e) { - if (e.getSource() == getWindowList() && e.getClickCount() == 2) { - WindowMenuItem item = windowListItems.get(windowList.locationToIndex(e.getPoint())); - - item.actionPerformed(null); // Good thing WindowMenuItem doesn't - // reference the ActionEvent? - setVisible(false); - } - } - - public void mousePressed(MouseEvent e) {} - - public void mouseReleased(MouseEvent e) {} - - public void mouseEntered(MouseEvent e) {} - - public void mouseExited(MouseEvent e) {} -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompiler.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompiler.java deleted file mode 100644 index 2a4f649..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompiler.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.CodeSizeCalculator; -import net.sf.robocode.ui.dialog.ConsoleDialog; -import net.sf.robocode.ui.dialog.WindowUtil; - -import java.io.File; -import java.io.IOException; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobocodeCompiler { - - private final String compilerBinary; - private final RobocodeEditor editor; - private final String compilerOptions; - private final String compilerClassPath; - - protected RobocodeCompiler(RobocodeEditor editor, String binary, String options, String classPath) { - super(); - this.compilerBinary = binary; - this.compilerOptions = options; - this.compilerClassPath = classPath; - this.editor = editor; - } - - public void compile(String directory, String fileName) { - fileName = FileUtil.quoteFileName(fileName); - - ConsoleDialog console; - - if (editor != null) { - console = new ConsoleDialog(editor, "Compiling", false); - } else { - console = new ConsoleDialog(); - } - console.setSize(500, 400); - console.setText("Compiling...\n"); - WindowUtil.centerShow(editor, console); - - try { - StringBuffer command = new StringBuffer(compilerBinary).append(' ').append(compilerOptions).append(' ').append(compilerClassPath).append(' ').append( - fileName); - - Logger.logMessage("Compile command: " + command); - - ProcessBuilder pb = new ProcessBuilder(command.toString().split(" ")); - - pb.redirectErrorStream(true); - pb.directory(FileUtil.getCwd()); - Process p = pb.start(); - - // The waitFor() must done after reading the input and error stream of the process - console.processStream(p.getInputStream()); - p.waitFor(); - - if (p.exitValue() == 0) { - console.append("Compiled successfully.\n"); - console.setTitle("Compiled successfully."); - } else { - console.append("Compile Failed (" + p.exitValue() + ")\n"); - console.setTitle("Compile failed."); - } - } catch (IOException e) { - console.append("Unable to compile!\n"); - console.append("Exception was: " + e.toString() + "\n"); - console.append("Does " + compilerBinary + " exist?\n"); - console.setTitle("Exception while compiling"); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - console.append("Compile interrupted.\n"); - console.setTitle("Compile interrupted."); - } - - Integer codesize = CodeSizeCalculator.getDirectoryCodeSize(new File(directory)); - if (codesize != null) { - String weightClass = null; - - if (codesize >= 1500) { - weightClass = "MegaBot (codesize >= 1500 bytes)"; - } else if (codesize > 750) { - weightClass = "MiniBot (codesize < 1500 bytes)"; - } else if (codesize > 250) { - weightClass = "MicroBot (codesize < 750 bytes)"; - } else { - weightClass = "NanoBot (codesize < 250 bytes)"; - } - StringBuilder sb = new StringBuilder(); - - sb.append("\n\n---- Codesize ----\n"); - sb.append("Codesize: ").append(codesize).append(" bytes\n"); - sb.append("Robot weight class: ").append(weightClass).append('\n'); - - console.append(sb.toString()); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompilerFactory.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompilerFactory.java deleted file mode 100644 index 2d515ee..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeCompilerFactory.java +++ /dev/null @@ -1,219 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import net.sf.robocode.core.ContainerBase; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.manager.IVersionManagerBase; -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logMessage; -import net.sf.robocode.ui.dialog.ConsoleDialog; -import net.sf.robocode.ui.dialog.WindowUtil; - -import javax.swing.*; -import java.io.*; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class RobocodeCompilerFactory { - - private static final String COMPILER_CLASSPATH = "-classpath " + getJavaLib() + File.pathSeparator + "libs" - + File.separator + "robocode.jar" + File.pathSeparator - + FileUtil.quoteFileName(FileUtil.getRobotsDir().toString()); - - private CompilerProperties compilerProperties; - - public RobocodeCompiler createCompiler(RobocodeEditor editor) { - compilerProperties = null; - if (getCompilerProperties().getCompilerBinary() == null - || getCompilerProperties().getCompilerBinary().length() == 0) { - if (configureCompiler(editor)) { - return new RobocodeCompiler(editor, getCompilerProperties().getCompilerBinary(), - getCompilerProperties().getCompilerOptions(), getCompilerProperties().getCompilerClasspath()); - } - logError("Unable to create compiler."); - return null; - } - return new RobocodeCompiler(editor, getCompilerProperties().getCompilerBinary(), - getCompilerProperties().getCompilerOptions(), getCompilerProperties().getCompilerClasspath()); - } - - public CompilerProperties getCompilerProperties() { - if (compilerProperties == null) { - compilerProperties = new CompilerProperties(); - - FileInputStream in = null; - File file = null; - - try { - file = FileUtil.getCompilerConfigFile(); - in = new FileInputStream(file); - compilerProperties.load(in); - if (compilerProperties.getRobocodeVersion() == null) { - logMessage("Setting up new compiler."); - compilerProperties.setCompilerBinary(""); - } - } catch (FileNotFoundException e) { - logMessage("Compiler configuration file was not found. A new one will be created."); - } catch (IOException e) { - logError("Error while reading " + file, e); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) {} - } - } - } - return compilerProperties; - } - - private static String getJavaLib() { - String javahome = System.getProperty("java.home"); - String javalib; - if (System.getProperty("os.name").indexOf("Mac") == 0) { - javalib = new File(javahome).getParentFile().getPath() + "/Classes/classes.jar"; - } else { - javalib = javahome + "/lib/rt.jar"; - } - - return FileUtil.quoteFileName(javalib); - } - - public boolean configureCompiler(RobocodeEditor editor) { - ConsoleDialog console = new ConsoleDialog(editor, "Setting up compiler", false); - - console.setSize(500, 400); - console.getOkButton().setEnabled(false); - console.setText("Please wait while Robocode sets up a compiler for you...\n\n"); - WindowUtil.centerShow(editor, console); - - console.append("Setting up compiler\n"); - console.append("Java home is " + System.getProperty("java.home") + "\n\n"); - - String compilerName = "Java Compiler (javac)"; - String compilerBinary = "javac"; - String compilerOptions = "-deprecation -g -source 1.6 -encoding UTF-8"; - - boolean javacOK = testCompiler(compilerName, compilerBinary, console); - boolean ecjOK = false; - - if (javacOK) { - int rc = JOptionPane.showConfirmDialog(editor, - "Robocode has found a working javac (Java Compiler) on this system.\nWould you like to use it?\n" - + "(If you click No, Robocode will use the build-in Eclipse Compiler for Java (ECJ))", - "Confirm javac", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (rc == JOptionPane.NO_OPTION) { - javacOK = false; - } - } - - if (!javacOK) { - compilerName = "Eclipse Compiler for Java (ECJ)"; - compilerBinary = "java -cp compilers/ecj.jar org.eclipse.jdt.internal.compiler.batch.Main"; - - ecjOK = testCompiler("Eclipse Compiler for Java (ECJ)", compilerBinary, console); - } - - boolean compilerOK = javacOK || ecjOK; - - if (compilerOK) { - console.append("\nCompiler has been set up successfully.\nClick OK to continue.\n"); - - } else { - final String errorText = "Could not set up a working compiler for Robocode.\n" - + "Please consult the console window for errors.\n\n" - + "For help with this, please post to Help forum here:\n" - + "http://sourceforge.net/projects/robocode/forums/forum/116459"; - - console.append("\nUnable to set up a working compiler for Robocode.\n"); - - JOptionPane.showMessageDialog(editor, errorText, "Error", JOptionPane.ERROR_MESSAGE); - - compilerBinary = ""; - compilerOptions = ""; - } - - getCompilerProperties().setRobocodeVersion(ContainerBase.getComponent(IVersionManagerBase.class).getVersion()); - getCompilerProperties().setCompilerBinary(compilerBinary); - getCompilerProperties().setCompilerOptions(compilerOptions); - getCompilerProperties().setCompilerClasspath(COMPILER_CLASSPATH); - saveCompilerProperties(); - - console.scrollToBottom(); - console.getOkButton().setEnabled(true); - - return compilerOK; - } - - public void saveCompilerProperties() { - FileOutputStream out = null; - - try { - out = new FileOutputStream(FileUtil.getCompilerConfigFile()); - - getCompilerProperties().store(out, "Robocode Compiler Properties"); - } catch (IOException e) { - Logger.logError(e); - } finally { - FileUtil.cleanupStream(out); - } - } - - /** - * Tests a compiler by trying to let it compile the CompilerTest.java file. - * - * @param friendlyName friendly name of the compiler to test. - * @param filepath the file path of the compiler. - * @param console the console which outputs the result. - * @return true if the compiler was found and did compile the test file; false otherwise. - */ - private static boolean testCompiler(String friendlyName, String filepath, ConsoleDialog console) { - console.append("Testing compile with " + friendlyName + "\n"); - - boolean result = false; - - try { - String cmdAndArgs = filepath + " compilers/CompilerTest.java"; - - // Must be split command and arguments individually - ProcessBuilder pb = new ProcessBuilder(cmdAndArgs.split(" ")); - - pb.directory(FileUtil.getCwd()); - pb.redirectErrorStream(true); // we can use p.getInputStream() - Process p = pb.start(); - - // The waitFor() must done after reading the input and error stream of the process - console.processStream(p.getInputStream()); - p.waitFor(); - - result = (p.exitValue() == 0); - - } catch (IOException e) { - logError(e); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - } - - if (result) { - console.append(friendlyName + " was found and is working.\n"); - } else { - console.append(friendlyName + " does not exists or cannot compile.\n"); - } - return result; - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditor.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditor.java deleted file mode 100644 index 2a13525..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditor.java +++ /dev/null @@ -1,664 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.ui.BrowserManager; -import net.sf.robocode.ui.IWindowManager; -import net.sf.robocode.ui.IWindowManagerExt; -import net.sf.robocode.ui.gfx.ImageUtil; - -import javax.swing.*; -import javax.swing.filechooser.FileFilter; -import java.awt.*; -import java.awt.event.*; -import java.beans.PropertyVetoException; -import java.io.*; - - -/** - * The source code editor window containing all components. - * - * @author Mathew A. Nelson (original) - * @author Matthew Reeder (contributor) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class RobocodeEditor extends JFrame implements Runnable, IRobocodeEditor { - private static final int MAX_PACKAGE_NAME_LENGTH = 16; - private static final int MAX_ROBOT_NAME_LENGTH = 32; - - private JPanel robocodeEditorContentPane; - - private RobocodeEditorMenuBar robocodeEditorMenuBar; - private JDesktopPane desktopPane; - - private final Point origin = new Point(); - private final File robotsDirectory; - - private JToolBar statusBar; - private JLabel lineLabel; - - private File editorDirectory; - private final IRepositoryManager repositoryManager; - private final IWindowManagerExt windowManager; - - private FindReplaceDialog findReplaceDialog; - private ReplaceAction replaceAction; - - final EventHandler eventHandler = new EventHandler(); - - class EventHandler implements ComponentListener { - public void componentMoved(ComponentEvent e) {} - - public void componentHidden(ComponentEvent e) {} - - public void componentShown(ComponentEvent e) { - new Thread(RobocodeEditor.this).start(); - } - - public void componentResized(ComponentEvent e) {} - } - - - /** - * Action that launches the Replace dialog. - *

- * The reason this is needed (and the menubar isn't sufficient) is that - * ctrl+H is bound in JTextComponents at a lower level to backspace and in - * order to override this, I need to rebind it to an Action when the - * JEditorPane is created. - */ - class ReplaceAction extends AbstractAction { - public void actionPerformed(ActionEvent e) { - replaceDialog(); - } - } - - public RobocodeEditor(IRepositoryManager repositoryManager, IWindowManager windowManager) { - super(); - this.windowManager = (IWindowManagerExt) windowManager; - this.repositoryManager = repositoryManager; - robotsDirectory = FileUtil.getRobotsDir(); - initialize(); - } - - public void addPlaceShowFocus(JInternalFrame internalFrame) { - getDesktopPane().add(internalFrame); - - // Center a window - Dimension screenSize = getDesktopPane().getSize(); - Dimension size = internalFrame.getSize(); - - if (size.height > screenSize.height) { - size.height = screenSize.height; - } - if (size.width > screenSize.width) { - size.width = screenSize.width; - } - - if (origin.x + size.width > screenSize.width) { - origin.x = 0; - } - if (origin.y + size.height > screenSize.height) { - origin.y = 0; - } - internalFrame.setLocation(origin); - origin.x += 10; - origin.y += 10; - - internalFrame.setVisible(true); - getDesktopPane().moveToFront(internalFrame); - if (internalFrame instanceof EditWindow) { - ((EditWindow) internalFrame).getEditorPane().requestFocus(); - } else { - internalFrame.requestFocus(); - } - - // Make sure the internal frame is being maximized to fit the window when it is opened - try { - internalFrame.setMaximum(true); - } catch (PropertyVetoException e) { - Logger.logError(e); - } - } - - public boolean close() { - JInternalFrame[] frames = getDesktopPane().getAllFrames(); - if (frames != null) { - for (JInternalFrame frame : frames) { - if (frame != null) { - frame.moveToFront(); - if ((frame instanceof EditWindow) && !((EditWindow) frame).fileSave(true)) { - return false; - } - } - } - } - dispose(); - return true; - } - - public void createNewJavaFile() { - String packageName = null; - - if (getActiveWindow() != null) { - packageName = getActiveWindow().getPackage(); - } - if (packageName == null) { - packageName = "mypackage"; - } - - EditWindow editWindow = new EditWindow(repositoryManager, this, robotsDirectory); - - String templateName = "templates" + File.separatorChar + "newjavafile.tpt"; - - String template = ""; - - File f = new File(FileUtil.getCwd(), templateName); - int size = (int) (f.length()); - byte buff[] = new byte[size]; - - FileInputStream fis = null; - DataInputStream dis = null; - - try { - fis = new FileInputStream(f); - dis = new DataInputStream(fis); - - dis.readFully(buff); - template = new String(buff); - } catch (IOException e) { - template = "Unable to read template file: " + FileUtil.getCwd() + File.separatorChar + templateName; - } finally { - FileUtil.cleanupStream(fis); - FileUtil.cleanupStream(dis); - } - - String name = "MyClass"; - - int index = template.indexOf("$"); - - while (index >= 0) { - if (template.substring(index, index + 10).equals("$CLASSNAME")) { - template = template.substring(0, index) + name + template.substring(index + 10); - index += name.length(); - } else if (template.substring(index, index + 8).equals("$PACKAGE")) { - template = template.substring(0, index) + packageName + template.substring(index + 8); - index += packageName.length(); - } else { - index++; - } - index = template.indexOf("$", index); - } - - EditorPane editorPane = editWindow.getEditorPane(); - - editorPane.setText(template); - editorPane.setCaretPosition(0); - - addPlaceShowFocus(editWindow); - } - - public void createNewRobot() { - createNewRobot("Robot"); - } - - public void createNewJuniorRobot() { - createNewRobot("JuniorRobot"); - } - - private void createNewRobot(final String robotType) { - String message = "Enter the name of your new robot.\nExample: MyFirst" + robotType - + "\nNote that the name cannot contain spaces."; - String name = ""; - - boolean done = false; - - while (!done) { - name = (String) JOptionPane.showInputDialog(this, message, "New " + robotType, JOptionPane.PLAIN_MESSAGE, - null, null, name); - name = (name == null) ? "" : name.trim(); - if (name.length() == 0) { - return; - } - if (name.length() > MAX_ROBOT_NAME_LENGTH) { - name = name.substring(0, MAX_ROBOT_NAME_LENGTH); - message = "Please choose a shorter name (up to " + MAX_ROBOT_NAME_LENGTH + " characters)"; - continue; - } - - done = true; - - char firstLetter = name.charAt(0); - - if (firstLetter == '$' || firstLetter == '_') { - name = name.substring(1); - done = false; - } - int firstLetterCodePoint = name.codePointAt(0); // used for supporting Unicode methods - - if (!Character.isJavaIdentifierStart(firstLetterCodePoint) || Character.isLowerCase(firstLetterCodePoint)) { - name = (char) Character.toUpperCase(firstLetterCodePoint) + name.substring(1); - done = false; - } - if (!done) { - message = "Please start your robot name with a big letter,\n" - + "as should the first letter of every word in the name.\nExample: MyFirstRobot"; - continue; - } - - char ch = 0; - - for (int i = 1; i < name.length(); i++) { - ch = name.charAt(i); - int codePoint = name.codePointAt(i); - - if (!Character.isJavaIdentifierPart(codePoint) || ch == '$') { - done = false; - break; - } - } - if (!done) { - message = "Your robot name contains an invalid character: '" + ch - + "'\nPlease use only letters and digits."; - continue; - } - } - - message = "Enter a short package name for your new robot and without spaces (lower-case letters are prefered).\n" - + "Your initials will work well here.\n" - + "Your robot will be put into this package to avoid name conflict with other robots.\n" - + "The package name is used to identify your robot(s) in the game, especially if you\n" - + "want to let your robot(s) participate in competitions like e.g. RoboRumble@Home.\n" - + "Hence, you should enter the same package name for all of your robots."; - - String packageName = ""; - - done = false; - while (!done) { - packageName = (String) JOptionPane.showInputDialog(this, message, "Package name for " + name, - JOptionPane.PLAIN_MESSAGE, null, null, packageName); - packageName = (packageName == null) ? "" : packageName.trim(); - if (packageName.length() == 0) { - return; - } - if (packageName.length() > MAX_PACKAGE_NAME_LENGTH) { - packageName = packageName.substring(0, MAX_PACKAGE_NAME_LENGTH); - message = "Please choose a shorter name (up to " + MAX_PACKAGE_NAME_LENGTH + " characters)"; - continue; - } - - done = true; - - char firstLetter = packageName.charAt(0); - - if (firstLetter == '$' || firstLetter == '_') { - packageName = packageName.substring(1); - done = false; - } - int firstLetterCodePoint = packageName.codePointAt(0); // used for supporting Unicode methods - - if (!Character.isJavaIdentifierStart(firstLetterCodePoint)) { - done = false; - } - if (!done) { - message = "Please start the package name with a small letter.\n" - + "The entire package name should be written in lower-case letters\n" - + "(Java convention), although Robocode will accept big case letters as well."; - continue; - } - - char ch = 0; - - for (int i = 1; i < packageName.length(); i++) { - ch = packageName.charAt(i); - int codePoint = packageName.codePointAt(i); - - if (!(Character.isJavaIdentifierPart(codePoint) || ch == '.') || ch == '$') { - done = false; - break; - } - } - if (!done) { - message = "Your package name contains an invalid character: '" + ch - + "'\nPlease use only small letters and digits."; - continue; - } - - if (packageName.charAt(packageName.length() - 1) == '.') { - message = "The package name cannot end with a dot"; - done = false; - continue; - } - - boolean wrong_dot_combination = false; - int lastDotIndex = -1; - - for (int i = 0; i < packageName.length(); i++) { - if (packageName.charAt(i) == '.') { - if (i - lastDotIndex == 1) { - wrong_dot_combination = true; - break; - } - lastDotIndex = i; - } - } - if (wrong_dot_combination) { - message = "The package name contain two dots next to each other"; - done = false; - continue; - } - - if (repositoryManager != null) { - done = repositoryManager.verifyRobotName(packageName + "." + name, name); - } - if (!done) { - message = "The package name is reserved:\n" + packageName + "\nPlease enter a different package name."; - continue; - } - } - - EditWindow editWindow = new EditWindow(repositoryManager, this, robotsDirectory); - editWindow.setRobotName(name); - - String templateName = "templates" + File.separatorChar + "new" + robotType.toLowerCase() + ".tpt"; - - String template = ""; - - File f = new File(FileUtil.getCwd(), templateName); - int size = (int) (f.length()); - byte buff[] = new byte[size]; - FileInputStream fis = null; - DataInputStream dis = null; - - try { - fis = new FileInputStream(f); - dis = new DataInputStream(fis); - dis.readFully(buff); - template = new String(buff); - } catch (IOException e) { - template = "Unable to read template file: " + FileUtil.getCwd() + File.separatorChar + templateName; - } finally { - FileUtil.cleanupStream(fis); - FileUtil.cleanupStream(dis); - } - - int index = template.indexOf("$"); - - while (index >= 0) { - if (template.substring(index, index + 10).equals("$CLASSNAME")) { - template = template.substring(0, index) + name + template.substring(index + 10); - index += name.length(); - } else if (template.substring(index, index + 8).equals("$PACKAGE")) { - template = template.substring(0, index) + packageName + template.substring(index + 8); - index += packageName.length(); - } else { - index++; - } - index = template.indexOf("$", index); - } - - EditorPane editorPane = editWindow.getEditorPane(); - editorPane.setText(template); - editorPane.setCaretPosition(0); - - addPlaceShowFocus(editWindow); - if (repositoryManager != null) { - repositoryManager.refresh(); - } - } - - public void findDialog() { - getFindReplaceDialog().showDialog(false); - } - - public void replaceDialog() { - getFindReplaceDialog().showDialog(true); - } - - public EditWindow getActiveWindow() { - JInternalFrame[] frames = getDesktopPane().getAllFrames(); - EditWindow editWindow = null; - - if (frames != null) { - for (JInternalFrame frame : frames) { - if (frame.isSelected()) { - if (frame instanceof EditWindow) { - editWindow = (EditWindow) frame; - } - break; - } - } - } - return editWindow; - } - - public RobocodeCompiler getCompiler() { - return Container.getComponent(RobocodeCompilerFactory.class).createCompiler(this); - } - - public JDesktopPane getDesktopPane() { - if (desktopPane == null) { - desktopPane = new JDesktopPane(); - desktopPane.setBackground(Color.GRAY); - desktopPane.setPreferredSize(new Dimension(750, 550)); - } - return desktopPane; - } - - private JLabel getLineLabel() { - if (lineLabel == null) { - lineLabel = new JLabel(); - } - return lineLabel; - } - - private JPanel getRobocodeEditorContentPane() { - if (robocodeEditorContentPane == null) { - robocodeEditorContentPane = new JPanel(); - robocodeEditorContentPane.setLayout(new BorderLayout()); - robocodeEditorContentPane.add(getDesktopPane(), "Center"); - robocodeEditorContentPane.add(getStatusBar(), "South"); - } - return robocodeEditorContentPane; - } - - private RobocodeEditorMenuBar getRobocodeEditorMenuBar() { - if (robocodeEditorMenuBar == null) { - robocodeEditorMenuBar = new RobocodeEditorMenuBar(this); - } - return robocodeEditorMenuBar; - } - - private JToolBar getStatusBar() { - if (statusBar == null) { - statusBar = new JToolBar(); - statusBar.setLayout(new BorderLayout()); - statusBar.add(getLineLabel(), BorderLayout.WEST); - } - return statusBar; - } - - public FindReplaceDialog getFindReplaceDialog() { - if (findReplaceDialog == null) { - findReplaceDialog = new FindReplaceDialog(this); - } - return findReplaceDialog; - } - - public Action getReplaceAction() { - if (replaceAction == null) { - replaceAction = new ReplaceAction(); - } - return replaceAction; - } - - public void addToWindowMenu(EditWindow window) { - WindowMenuItem item = new WindowMenuItem(window, getRobocodeEditorMenuBar().getWindowMenu()); - - getRobocodeEditorMenuBar().getMoreWindowsDialog().addWindowItem(item); - } - - public void removeFromWindowMenu(EditWindow window) { - for (Component c : getRobocodeEditorMenuBar().getWindowMenu().getMenuComponents()) { - if (c instanceof WindowMenuItem) { - WindowMenuItem item = (WindowMenuItem) c; - - if (item.getEditWindow() == window) { - getRobocodeEditorMenuBar().getWindowMenu().remove(item); - getRobocodeEditorMenuBar().getMoreWindowsDialog().removeWindowItem(item); - break; - } - } - } - } - - private void initialize() { - addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - close(); - } - }); - setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - setIconImage(ImageUtil.getImage("/net/sf/robocode/ui/icons/robocode-icon.png")); - setTitle("Robot Editor"); - setJMenuBar(getRobocodeEditorMenuBar()); - setContentPane(getRobocodeEditorContentPane()); - addComponentListener(eventHandler); - } - - public void openRobot() { - if (editorDirectory == null) { - editorDirectory = robotsDirectory; - } - JFileChooser chooser; - - chooser = new JFileChooser(editorDirectory); - FileFilter filter = new FileFilter() { - @Override - public boolean accept(File pathname) { - if (pathname.isHidden()) { - return false; - } - if (pathname.isDirectory()) { - return true; - } - String fn = pathname.getName(); - int idx = fn.lastIndexOf('.'); - String extension = ""; - - if (idx >= 0) { - extension = fn.substring(idx); - } - return extension.equalsIgnoreCase(".java"); - } - - @Override - public String getDescription() { - return "Robots"; - } - }; - - chooser.setFileFilter(filter); - int rv = chooser.showOpenDialog(this); - - if (rv == JFileChooser.APPROVE_OPTION) { - String robotFilename = chooser.getSelectedFile().getPath(); - - editorDirectory = chooser.getSelectedFile().getParentFile(); - - BufferedReader bufferedReader = null; - InputStreamReader inputStreamReader = null; - FileInputStream fileInputStream = null; - - try { - fileInputStream = new FileInputStream(robotFilename); - inputStreamReader = new InputStreamReader(fileInputStream, "UTF8"); - bufferedReader = new BufferedReader(inputStreamReader); - - EditWindow editWindow = new EditWindow(repositoryManager, this, robotsDirectory); - - EditorPane editorPane = editWindow.getEditorPane(); - - editorPane.read(bufferedReader, new File(robotFilename)); - - editWindow.setFileName(robotFilename); - - addPlaceShowFocus(editWindow); - } catch (Exception e) { - JOptionPane.showMessageDialog(this, e.toString()); - Logger.logError(e); - } finally { - FileUtil.cleanupStream(bufferedReader); - } - } - } - - public void extractRobot() { - windowManager.showRobotExtractor(this); - } - - public void run() { - getCompiler(); - } - - public void saveAsRobot() { - EditWindow editWindow = getActiveWindow(); - - if (editWindow != null) { - editWindow.fileSaveAs(); - } - } - - public void resetCompilerProperties() { - CompilerProperties props = Container.getComponent(RobocodeCompilerFactory.class).getCompilerProperties(); - - props.resetCompiler(); - Container.getComponent(RobocodeCompilerFactory.class).saveCompilerProperties(); - getCompiler(); - } - - public void saveRobot() { - EditWindow editWindow = getActiveWindow(); - - if (editWindow != null) { - editWindow.fileSave(false); - } - } - - public void setLineStatus(int line) { - if (line >= 0) { - getLineLabel().setText("Line: " + (line + 1)); - } else { - getLineLabel().setText(""); - } - } - - public void showHelpApi() { - String helpurl = "file:" + new File(FileUtil.getCwd(), "").getAbsoluteFile() + File.separator + "javadoc" - + File.separator + "index.html"; - - try { - BrowserManager.openURL(helpurl); - } catch (IOException e) { - JOptionPane.showMessageDialog(this, e.getMessage(), "Unable to open browser!", - JOptionPane.INFORMATION_MESSAGE); - } - } - - public void setSaveFileMenuItemsEnabled(boolean enabled) { - robocodeEditorMenuBar.getFileSaveAsMenuItem().setEnabled(enabled); - robocodeEditorMenuBar.getFileSaveMenuItem().setEnabled(enabled); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditorMenuBar.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditorMenuBar.java deleted file mode 100644 index e3bde6a..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/RobocodeEditorMenuBar.java +++ /dev/null @@ -1,722 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import net.sf.robocode.ui.dialog.WindowUtil; -import static net.sf.robocode.ui.util.ShortcutUtil.MENU_SHORTCUT_KEY_MASK; - -import javax.swing.*; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; - - -/** - * Menu bar for the Robocode source code editor. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - */ -@SuppressWarnings("serial") -public class RobocodeEditorMenuBar extends JMenuBar { - - private final RobocodeEditor editor; - private final EventHandler eventHandler = new EventHandler(); - - private class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - final Object source = e.getSource(); - - if (source == RobocodeEditorMenuBar.this.getFileNewRobotMenuItem()) { - fileNewRobotActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getFileNewJuniorRobotMenuItem()) { - fileNewJuniorRobotActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getFileNewJavaFileMenuItem()) { - fileNewJavaFileActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getFileOpenMenuItem()) { - fileOpenActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getFileExtractMenuItem()) { - fileExtractActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getFileSaveMenuItem()) { - fileSaveActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getFileSaveAsMenuItem()) { - fileSaveAsActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getFileExitMenuItem()) { - fileExitActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getCompilerCompileMenuItem()) { - compilerCompileActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getCompilerOptionsPreferencesMenuItem()) { - compilerOptionsPreferencesActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getCompilerOptionsResetCompilerMenuItem()) { - compilerOptionsResetCompilerActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getHelpRobocodeApiMenuItem()) { - helpRobocodeApiActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditUndoMenuItem()) { - editUndoActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditRedoMenuItem()) { - editRedoActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditCutMenuItem()) { - editCutActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditCopyMenuItem()) { - editCopyActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditPasteMenuItem()) { - editPasteActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditDeleteMenuItem()) { - editDeleteActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditSelectAllMenuItem()) { - editSelectAllActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditFindMenuItem()) { - editFindActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditFindNextMenuItem()) { - editFindNextActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getEditReplaceMenuItem()) { - editReplaceActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getWindowCloseMenuItem()) { - windowCloseActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getWindowCloseAllMenuItem()) { - windowCloseAllActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getWindowWindowsDialogMenuItem()) { - windowMoreWindowsActionPerformed(); - } else if (source == RobocodeEditorMenuBar.this.getViewEditorThemeConfigDialogMenuItem()) { - viewEditorThemeConfigDialogActionPerformed(); - } - } - } - - // File menu - private JMenu fileMenu; - private JMenuItem fileOpenMenuItem; - private JMenuItem fileExtractMenuItem; - private JMenuItem fileSaveMenuItem; - private JMenuItem fileSaveAsMenuItem; - private JMenuItem fileExitMenuItem; - private JMenuItem fileNewJavaFileMenuItem; - private JMenu fileNewMenu; - private JMenuItem fileNewRobotMenuItem; - private JMenuItem fileNewJuniorRobotMenuItem; - - // Compiler menu - private JMenuItem compilerCompileMenuItem; - private JMenu compilerMenu; - private JMenu compilerOptionsMenu; - private JMenuItem compilerOptionsPreferencesMenuItem; - private JMenuItem compilerOptionsResetCompilerMenuItem; - - // Edit menu - private JMenu editMenu; - private JMenuItem editUndoMenuItem; - private JMenuItem editRedoMenuItem; - private JMenuItem editCutMenuItem; - private JMenuItem editCopyMenuItem; - private JMenuItem editPasteMenuItem; - private JMenuItem editDeleteMenuItem; - private JMenuItem editFindMenuItem; - private JMenuItem editFindNextMenuItem; - private JMenuItem editReplaceMenuItem; - private JMenuItem editSelectAllMenuItem; - - // View menu - private JMenu viewMenu; - private JMenuItem viewEditorThemeConfigDialogMenuItem; - - // Window menu - private JMenu windowMenu; - private JMenuItem windowCloseMenuItem; - private JMenuItem windowCloseAllMenuItem; - private JMenuItem windowWindowsDialogMenuItem; - private MoreWindowsDialog moreWindowsDialog; - - // Help menu - private JMenu helpMenu; - private JMenuItem helpRobocodeApiMenuItem; - - public RobocodeEditorMenuBar(RobocodeEditor editor) { - super(); - this.editor = editor; - initialize(); - } - - private void initialize() { - add(getFileMenu()); - add(getEditMenu()); - add(getViewMenu()); - add(getCompilerMenu()); - add(getWindowMenu()); - add(getHelpMenu()); - } - - private void compilerCompileActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.compile(); - } - } - - private void compilerOptionsPreferencesActionPerformed() { - CompilerPreferencesDialog dialog = new CompilerPreferencesDialog(editor); - WindowUtil.packCenterShow(editor, dialog); - } - - private void compilerOptionsResetCompilerActionPerformed() { - if (JOptionPane.showConfirmDialog(editor, - "You are about to reset the compiler preferences. Do you wish to proceed?", "Reset Compiler Preferences", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) - == JOptionPane.NO_OPTION) { - return; - } - - new Thread(new Runnable() { - public void run() { - editor.resetCompilerProperties(); - } - }).start(); - } - - private void fileExitActionPerformed() { - editor.dispose(); - } - - private void fileNewJavaFileActionPerformed() { - editor.createNewJavaFile(); - - getFileSaveMenuItem().setEnabled(true); - getFileSaveAsMenuItem().setEnabled(true); - } - - private void fileNewRobotActionPerformed() { - editor.createNewRobot(); - - getFileSaveMenuItem().setEnabled(true); - getFileSaveAsMenuItem().setEnabled(true); - } - - private void fileNewJuniorRobotActionPerformed() { - editor.createNewJuniorRobot(); - - getFileSaveMenuItem().setEnabled(true); - getFileSaveAsMenuItem().setEnabled(true); - } - - private void fileOpenActionPerformed() { - editor.openRobot(); - } - - private void fileExtractActionPerformed() { - editor.extractRobot(); - } - - private void fileSaveActionPerformed() { - editor.saveRobot(); - } - - private void fileSaveAsActionPerformed() { - editor.saveAsRobot(); - } - - private void editUndoActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.getEditorPane().undo(); - } - } - - private void editRedoActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.getEditorPane().redo(); - } - } - - private void editCutActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - - if (editWindow != null) { - editWindow.getEditorPane().cut(); - } - } - - private void editCopyActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.getEditorPane().copy(); - } - } - - private void editPasteActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.getEditorPane().paste(); - } - } - - private void editDeleteActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.getEditorPane().replaceSelection(null); - } - } - - private void editSelectAllActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.getEditorPane().selectAll(); - } - } - - private void editFindActionPerformed() { - editor.findDialog(); - } - - private void editReplaceActionPerformed() { - editor.replaceDialog(); - } - - private void editFindNextActionPerformed() { - editor.getFindReplaceDialog().findNext(); - } - - private void windowCloseActionPerformed() { - EditWindow editWindow = editor.getActiveWindow(); - if (editWindow != null) { - editWindow.doDefaultCloseAction(); - } - } - - private void windowCloseAllActionPerformed() { - JInternalFrame[] frames = editor.getDesktopPane().getAllFrames(); - if (frames != null) { - for (JInternalFrame frame : frames) { - frame.doDefaultCloseAction(); - } - } - } - - private void windowMoreWindowsActionPerformed() { - getMoreWindowsDialog().setVisible(true); - } - - private void viewEditorThemeConfigDialogActionPerformed() { - EditorThemeConfigDialog dialog = new EditorThemeConfigDialog(editor); - WindowUtil.packCenterShow(dialog); - } - - private JMenuItem getCompilerCompileMenuItem() { - if (compilerCompileMenuItem == null) { - compilerCompileMenuItem = new JMenuItem(); - compilerCompileMenuItem.setText("Compile"); - compilerCompileMenuItem.setMnemonic('m'); - compilerCompileMenuItem.setDisplayedMnemonicIndex(2); - compilerCompileMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, MENU_SHORTCUT_KEY_MASK)); - compilerCompileMenuItem.addActionListener(eventHandler); - } - return compilerCompileMenuItem; - } - - private JMenu getCompilerMenu() { - if (compilerMenu == null) { - compilerMenu = new JMenu(); - compilerMenu.setText("Compiler"); - compilerMenu.setMnemonic('C'); - compilerMenu.add(getCompilerCompileMenuItem()); - compilerMenu.add(getCompilerOptionsMenu()); - } - return compilerMenu; - } - - private JMenu getCompilerOptionsMenu() { - if (compilerOptionsMenu == null) { - compilerOptionsMenu = new JMenu(); - compilerOptionsMenu.setText("Options"); - compilerOptionsMenu.setMnemonic('O'); - compilerOptionsMenu.add(getCompilerOptionsPreferencesMenuItem()); - compilerOptionsMenu.add(getCompilerOptionsResetCompilerMenuItem()); - } - return compilerOptionsMenu; - } - - private JMenuItem getCompilerOptionsPreferencesMenuItem() { - if (compilerOptionsPreferencesMenuItem == null) { - compilerOptionsPreferencesMenuItem = new JMenuItem(); - compilerOptionsPreferencesMenuItem.setText("Preferences"); - compilerOptionsPreferencesMenuItem.setMnemonic('P'); - compilerOptionsPreferencesMenuItem.addActionListener(eventHandler); - } - return compilerOptionsPreferencesMenuItem; - } - - private JMenuItem getCompilerOptionsResetCompilerMenuItem() { - if (compilerOptionsResetCompilerMenuItem == null) { - compilerOptionsResetCompilerMenuItem = new JMenuItem(); - compilerOptionsResetCompilerMenuItem.setText("Reset Compiler"); - compilerOptionsResetCompilerMenuItem.setMnemonic('R'); - compilerOptionsResetCompilerMenuItem.addActionListener(eventHandler); - } - return compilerOptionsResetCompilerMenuItem; - } - - private JMenuItem getFileExitMenuItem() { - if (fileExitMenuItem == null) { - fileExitMenuItem = new JMenuItem(); - fileExitMenuItem.setText("Exit"); - fileExitMenuItem.setMnemonic('x'); - fileExitMenuItem.setDisplayedMnemonicIndex(1); - fileExitMenuItem.addActionListener(eventHandler); - } - return fileExitMenuItem; - } - - private JMenu getFileMenu() { - if (fileMenu == null) { - fileMenu = new JMenu(); - fileMenu.setText("File"); - fileMenu.setMnemonic('F'); - fileMenu.add(getFileNewMenu()); - fileMenu.add(getFileOpenMenuItem()); - fileMenu.add(getFileExtractMenuItem()); - fileMenu.add(getFileSaveMenuItem()); - fileMenu.add(getFileSaveAsMenuItem()); - fileMenu.add(new JSeparator()); - fileMenu.add(getFileExitMenuItem()); - } - return fileMenu; - } - - private JMenuItem getFileNewJavaFileMenuItem() { - if (fileNewJavaFileMenuItem == null) { - fileNewJavaFileMenuItem = new JMenuItem(); - fileNewJavaFileMenuItem.setText("Java File"); - fileNewJavaFileMenuItem.setMnemonic('J'); - fileNewJavaFileMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_N, MENU_SHORTCUT_KEY_MASK | Event.SHIFT_MASK)); - fileNewJavaFileMenuItem.addActionListener(eventHandler); - } - return fileNewJavaFileMenuItem; - } - - private JMenu getFileNewMenu() { - if (fileNewMenu == null) { - fileNewMenu = new JMenu(); - fileNewMenu.setText("New"); - fileNewMenu.setMnemonic('N'); - fileNewMenu.add(getFileNewRobotMenuItem()); - fileNewMenu.add(getFileNewJuniorRobotMenuItem()); - fileNewMenu.add(getFileNewJavaFileMenuItem()); - } - return fileNewMenu; - } - - private JMenuItem getFileNewRobotMenuItem() { - if (fileNewRobotMenuItem == null) { - fileNewRobotMenuItem = new JMenuItem(); - fileNewRobotMenuItem.setText("Robot"); - fileNewRobotMenuItem.setMnemonic('R'); - fileNewRobotMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, MENU_SHORTCUT_KEY_MASK)); - fileNewRobotMenuItem.addActionListener(eventHandler); - } - return fileNewRobotMenuItem; - } - - private JMenuItem getFileNewJuniorRobotMenuItem() { - if (fileNewJuniorRobotMenuItem == null) { - fileNewJuniorRobotMenuItem = new JMenuItem(); - fileNewJuniorRobotMenuItem.setText("JuniorRobot"); - fileNewJuniorRobotMenuItem.setMnemonic('J'); - fileNewJuniorRobotMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J, MENU_SHORTCUT_KEY_MASK)); - fileNewJuniorRobotMenuItem.addActionListener(eventHandler); - } - return fileNewJuniorRobotMenuItem; - } - - private JMenuItem getFileOpenMenuItem() { - if (fileOpenMenuItem == null) { - fileOpenMenuItem = new JMenuItem(); - fileOpenMenuItem.setText("Open"); - fileOpenMenuItem.setMnemonic('O'); - fileOpenMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, MENU_SHORTCUT_KEY_MASK)); - fileOpenMenuItem.addActionListener(eventHandler); - } - return fileOpenMenuItem; - } - - private JMenuItem getFileExtractMenuItem() { - if (fileExtractMenuItem == null) { - fileExtractMenuItem = new JMenuItem(); - fileExtractMenuItem.setText("Extract downloaded robot for editing"); - fileExtractMenuItem.setMnemonic('t'); - fileExtractMenuItem.setDisplayedMnemonicIndex(2); - fileExtractMenuItem.addActionListener(eventHandler); - } - return fileExtractMenuItem; - } - - public JMenuItem getFileSaveAsMenuItem() { - if (fileSaveAsMenuItem == null) { - fileSaveAsMenuItem = new JMenuItem(); - fileSaveAsMenuItem.setText("Save As"); - fileSaveAsMenuItem.setMnemonic('A'); - fileSaveAsMenuItem.setDisplayedMnemonicIndex(5); - fileSaveAsMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_SHORTCUT_KEY_MASK | Event.SHIFT_MASK)); - fileSaveAsMenuItem.addActionListener(eventHandler); - fileSaveAsMenuItem.setEnabled(false); - } - return fileSaveAsMenuItem; - } - - public JMenuItem getFileSaveMenuItem() { - if (fileSaveMenuItem == null) { - fileSaveMenuItem = new JMenuItem(); - fileSaveMenuItem.setText("Save"); - fileSaveMenuItem.setMnemonic('S'); - fileSaveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_SHORTCUT_KEY_MASK)); - fileSaveMenuItem.addActionListener(eventHandler); - fileSaveMenuItem.setEnabled(false); - } - return fileSaveMenuItem; - } - - @Override - public JMenu getHelpMenu() { - if (helpMenu == null) { - helpMenu = new JMenu(); - helpMenu.setText("Help"); - helpMenu.setMnemonic('H'); - helpMenu.add(getHelpRobocodeApiMenuItem()); - } - return helpMenu; - } - - private JMenuItem getHelpRobocodeApiMenuItem() { - if (helpRobocodeApiMenuItem == null) { - helpRobocodeApiMenuItem = new JMenuItem(); - helpRobocodeApiMenuItem.setText("Robocode API"); - helpRobocodeApiMenuItem.setMnemonic('A'); - helpRobocodeApiMenuItem.setDisplayedMnemonicIndex(9); - helpRobocodeApiMenuItem.addActionListener(eventHandler); - } - return helpRobocodeApiMenuItem; - } - - private JMenu getEditMenu() { - if (editMenu == null) { - editMenu = new JMenu(); - editMenu.setText("Edit"); - editMenu.setMnemonic('E'); - editMenu.add(getEditUndoMenuItem()); - editMenu.add(getEditRedoMenuItem()); - editMenu.addSeparator(); - editMenu.add(getEditCutMenuItem()); - editMenu.add(getEditCopyMenuItem()); - editMenu.add(getEditPasteMenuItem()); - editMenu.add(getEditDeleteMenuItem()); - editMenu.addSeparator(); - editMenu.add(getEditFindMenuItem()); - editMenu.add(getEditFindNextMenuItem()); - editMenu.add(getEditReplaceMenuItem()); - editMenu.addSeparator(); - editMenu.add(getEditSelectAllMenuItem()); - } - return editMenu; - } - - private JMenuItem getEditUndoMenuItem() { - if (editUndoMenuItem == null) { - editUndoMenuItem = new JMenuItem(); - editUndoMenuItem.setText("Undo"); - editUndoMenuItem.setMnemonic('U'); - editUndoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, MENU_SHORTCUT_KEY_MASK)); - editUndoMenuItem.addActionListener(eventHandler); - } - return editUndoMenuItem; - } - - private JMenuItem getEditRedoMenuItem() { - if (editRedoMenuItem == null) { - editRedoMenuItem = new JMenuItem(); - editRedoMenuItem.setText("Redo"); - editRedoMenuItem.setMnemonic('R'); - editRedoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, MENU_SHORTCUT_KEY_MASK)); - editRedoMenuItem.addActionListener(eventHandler); - } - return editRedoMenuItem; - } - - private JMenuItem getEditCutMenuItem() { - if (editCutMenuItem == null) { - editCutMenuItem = new JMenuItem(); - editCutMenuItem.setText("Cut"); - editCutMenuItem.setMnemonic('t'); - editCutMenuItem.setDisplayedMnemonicIndex(2); - editCutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, MENU_SHORTCUT_KEY_MASK)); - editCutMenuItem.addActionListener(eventHandler); - } - return editCutMenuItem; - } - - private JMenuItem getEditCopyMenuItem() { - if (editCopyMenuItem == null) { - editCopyMenuItem = new JMenuItem(); - editCopyMenuItem.setText("Copy"); - editCopyMenuItem.setMnemonic('C'); - editCopyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, MENU_SHORTCUT_KEY_MASK)); - editCopyMenuItem.addActionListener(eventHandler); - } - return editCopyMenuItem; - } - - private JMenuItem getEditPasteMenuItem() { - if (editPasteMenuItem == null) { - editPasteMenuItem = new JMenuItem(); - editPasteMenuItem.setText("Paste"); - editPasteMenuItem.setMnemonic('P'); - editPasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, MENU_SHORTCUT_KEY_MASK)); - editPasteMenuItem.addActionListener(eventHandler); - } - return editPasteMenuItem; - } - - private JMenuItem getEditDeleteMenuItem() { - if (editDeleteMenuItem == null) { - editDeleteMenuItem = new JMenuItem(); - editDeleteMenuItem.setText("Delete"); - editDeleteMenuItem.setMnemonic('l'); - editDeleteMenuItem.setDisplayedMnemonicIndex(2); - editDeleteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)); - editDeleteMenuItem.addActionListener(eventHandler); - } - return editDeleteMenuItem; - } - - private JMenuItem getEditFindMenuItem() { - if (editFindMenuItem == null) { - editFindMenuItem = new JMenuItem(); - editFindMenuItem.setText("Find..."); - editFindMenuItem.setMnemonic('F'); - editFindMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, MENU_SHORTCUT_KEY_MASK)); - editFindMenuItem.addActionListener(eventHandler); - } - return editFindMenuItem; - } - - private JMenuItem getEditFindNextMenuItem() { - if (editFindNextMenuItem == null) { - editFindNextMenuItem = new JMenuItem(); - editFindNextMenuItem.setText("Find Next"); - editFindNextMenuItem.setMnemonic('N'); - editFindNextMenuItem.setDisplayedMnemonicIndex(5); - editFindNextMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, MENU_SHORTCUT_KEY_MASK)); - editFindNextMenuItem.addActionListener(eventHandler); - } - return editFindNextMenuItem; - } - - private JMenuItem getEditReplaceMenuItem() { - if (editReplaceMenuItem == null) { - editReplaceMenuItem = new JMenuItem(); - editReplaceMenuItem.setText("Replace..."); - editReplaceMenuItem.setMnemonic('R'); - editReplaceMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, MENU_SHORTCUT_KEY_MASK)); - editReplaceMenuItem.addActionListener(eventHandler); - } - return editReplaceMenuItem; - } - - private JMenuItem getEditSelectAllMenuItem() { - if (editSelectAllMenuItem == null) { - editSelectAllMenuItem = new JMenuItem(); - editSelectAllMenuItem.setText("Select All"); - editSelectAllMenuItem.setMnemonic('A'); - editSelectAllMenuItem.setDisplayedMnemonicIndex(7); - editSelectAllMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, MENU_SHORTCUT_KEY_MASK)); - editSelectAllMenuItem.addActionListener(eventHandler); - } - return editSelectAllMenuItem; - } - - public JMenu getWindowMenu() { - if (windowMenu == null) { - windowMenu = new JMenu(); - windowMenu.setText("Window"); - windowMenu.setMnemonic('W'); - // If you add more items to this menu, you need to update the - // constants in WindowMenuItem, too, or the dynamic part of the - // window menu won't operate correctly. - windowMenu.add(getWindowCloseMenuItem()); - windowMenu.add(getWindowCloseAllMenuItem()); - windowMenu.addSeparator(); - // stuff will be inserted here... - windowMenu.add(getWindowWindowsDialogMenuItem()); - } - return windowMenu; - } - - private JMenuItem getWindowCloseMenuItem() { - if (windowCloseMenuItem == null) { - windowCloseMenuItem = new JMenuItem(); - windowCloseMenuItem.setText("Close"); - windowCloseMenuItem.setMnemonic('C'); - windowCloseMenuItem.addActionListener(eventHandler); - } - return windowCloseMenuItem; - } - - private JMenuItem getWindowCloseAllMenuItem() { - if (windowCloseAllMenuItem == null) { - windowCloseAllMenuItem = new JMenuItem(); - windowCloseAllMenuItem.setText("Close All"); - windowCloseAllMenuItem.setMnemonic('A'); - windowCloseAllMenuItem.setDisplayedMnemonicIndex(6); - windowCloseAllMenuItem.addActionListener(eventHandler); - } - return windowCloseAllMenuItem; - } - - private JMenuItem getWindowWindowsDialogMenuItem() { - if (windowWindowsDialogMenuItem == null) { - windowWindowsDialogMenuItem = new WindowMenuItem(); - windowWindowsDialogMenuItem.addActionListener(eventHandler); - } - return windowWindowsDialogMenuItem; - } - - public MoreWindowsDialog getMoreWindowsDialog() { - if (moreWindowsDialog == null) { - moreWindowsDialog = new MoreWindowsDialog(editor); - } - return moreWindowsDialog; - } - - private void helpRobocodeApiActionPerformed() { - editor.showHelpApi(); - } - - private JMenu getViewMenu() { - if (viewMenu == null) { - viewMenu = new JMenu(); - viewMenu.setText("View"); - viewMenu.setMnemonic('V'); - - viewMenu.add(getViewEditorThemeConfigDialogMenuItem()); - } - return viewMenu; - } - - private JMenuItem getViewEditorThemeConfigDialogMenuItem() { - if (viewEditorThemeConfigDialogMenuItem == null) { - viewEditorThemeConfigDialogMenuItem = new JMenuItem(); - viewEditorThemeConfigDialogMenuItem.setText("Change Editor Theme"); - viewEditorThemeConfigDialogMenuItem.setMnemonic('T'); - viewEditorThemeConfigDialogMenuItem.addActionListener(eventHandler); - } - return viewEditorThemeConfigDialogMenuItem; - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/StyledDocument.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/StyledDocument.java deleted file mode 100644 index 9a66fbf..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/StyledDocument.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import javax.swing.text.DefaultStyledDocument; -import javax.swing.text.Element; - - -/** - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class StyledDocument extends DefaultStyledDocument { - - /** - * Returns the element index from an offset. - * - * @param offset - * is the offset to retrieve the element index from. - * @return the element index >= 0. - */ - protected int getElementIndex(int offset) { - return getDefaultRootElement().getElementIndex(offset); - } - - /** - * Returns the end offset of an element. - * Notice, that the end offset is off-by-one, and hence this method wraps the Element.getEndOffset() - * - * @param element is the element to get the end offset from. - * @return the end offset of the element. - */ - protected int getEndOffset(Element element) { - return Math.min(getLength(), element.getEndOffset()); - } - - /** - * Returns the child element at the given element index. - * - * @param index - * is the element index. - * @return the child element. - */ - protected Element getElement(int index) { - return getDefaultRootElement().getElement(index); - } - - /** - * Returns the child element at the given document offset. - * - * @param offset - * is the document offset. - * @return the child element. - */ - protected Element getElementFromOffset(int offset) { - return getElement(getElementIndex(offset)); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/UndoManagerWithActions.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/UndoManagerWithActions.java deleted file mode 100644 index 4293351..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/UndoManagerWithActions.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.event.UndoableEditEvent; -import javax.swing.undo.CannotUndoException; -import javax.swing.undo.CannotRedoException; -import javax.swing.undo.UndoManager; - - -/** - * Undo manager containing actions for performing undo and redo edits. - * - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class UndoManagerWithActions extends UndoManager { - - private Action undoAction = new UndoAction(); - private Action redoAction = new RedoAction(); - - public UndoManagerWithActions() { - super(); - updateUndoRedoState(); - } - - @Override - public synchronized void undo() throws CannotUndoException { - super.undo(); - updateUndoRedoState(); - } - - @Override - public synchronized void redo() throws CannotRedoException { - super.redo(); - updateUndoRedoState(); - } - - @Override - public void undoableEditHappened(UndoableEditEvent undoableEditEvent) { - super.undoableEditHappened(undoableEditEvent); - updateUndoRedoState(); - } - - public Action getUndoAction() { - return undoAction; - } - - public Action getRedoAction() { - return redoAction; - } - - protected void updateUndoRedoState() { - undoAction.setEnabled(canUndo()); - redoAction.setEnabled(canRedo()); - } - - private class UndoAction extends AbstractAction { - public UndoAction() { - super("Undo"); - } - - public void actionPerformed(ActionEvent ae) { - try { - undo(); - } catch (CannotUndoException e) { - Toolkit.getDefaultToolkit().beep(); - } - } - } - - - private class RedoAction extends AbstractAction { - public RedoAction() { - super("Redo"); - } - - public void actionPerformed(ActionEvent ae) { - try { - redo(); - } catch (CannotRedoException e) { - Toolkit.getDefaultToolkit().beep(); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/WindowMenuItem.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/WindowMenuItem.java deleted file mode 100644 index bda1627..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/WindowMenuItem.java +++ /dev/null @@ -1,291 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.io.File; - - -/** - * Customized JMenuItem where each item is bound to a specific JInternalFrame, - * so we can have a dynamic menu of open windows. - * - * @author Matthew Reeder (original) - */ -@SuppressWarnings("serial") -public class WindowMenuItem extends JCheckBoxMenuItem implements ActionListener { - - // Maximum number of windows that will be shown on the menu (to get the rest, you'll - // have to open the dialog). The number 9 is also the number of most recently used - // files that normally show up in other applications. The reason is so that you can - // give them dynamic hotkeys from 1 to 9. Otherwise, there's no reason (besides - // avoiding taking up way too much space) to limit the size of the menu. - public static final int WINDOW_MENU_MAX_SIZE = 9; - // Number of static menu items before the dynamic menu (including seperators) - public static final int PRECEDING_WINDOW_MENU_ITEMS = 3; - // Number of static menu items after the dynamic menu (including seperators - // and the More Windows... menu item) - public static final int SUBSEQUENT_WINDOW_MENU_ITEMS = 1; - // Normal max length of a window name - public static final int MAX_WINDOW_NAME_LENGTH = 30; - // I make one "special" menu item that isn't tied to a window. Since it has - // similar needs for enabling/visibility and labeling, I made it the same class. - public static final int REGULAR_WINDOW = 0, SPECIAL_MORE = 2; - private EditWindow window; - private JMenu parentMenu; - private final int type; - - public WindowMenuItem(EditWindow window, JMenu parentMenu) { - super(); - this.window = window; - this.parentMenu = parentMenu; - type = REGULAR_WINDOW; - parentMenu.add(this, parentMenu.getMenuComponentCount() - SUBSEQUENT_WINDOW_MENU_ITEMS); - addActionListener(this); - } - - /** - * WindowMenuItem Constructor for "More Windows..." menu. - */ - public WindowMenuItem() { - type = SPECIAL_MORE; - } - - /** - * Event handler for the menu item - *

- * Brings the window to the front. This should be called for the "More - * Windows..." Item, because it doesn't make itself its own ActionListener. - *

- * Note that e can be null, and this menu item might not be showing (if this - * is called from the "More Windows" dialog). - */ - public void actionPerformed(ActionEvent e) { - if (window.isIcon()) { - try { - window.setIcon(false); - } catch (RuntimeException ignored) {} - } - if (window.getDesktopPane() != null) { - window.getDesktopPane().setSelectedFrame(window); - } - window.toFront(); - window.grabFocus(); - try { - window.setSelected(true); - } catch (RuntimeException ignored) {} - } - - /** - * Returns the label that should be used. If the menu item is supposed to be - * hidden, this may not be a real valid label. - */ - @Override - public String getText() { - if (type == SPECIAL_MORE) { - Container parent = getParent(); - - if (parent == null) { - return ""; - } - - int numWindows = parent.getComponentCount() - PRECEDING_WINDOW_MENU_ITEMS - SUBSEQUENT_WINDOW_MENU_ITEMS; - - if (numWindows <= 0) { - return "No Windows Open"; - } - - return "More Windows..."; - } - if (window == null || parentMenu == null) { - return ""; - } - String text = (getIndex() + 1) + " " + getFileName(); - - if (window.modified) { - text += " *"; - } - return text; - } - - protected String getFileName() { - if (window.getFileName() == null) { - return "Untitled " + (getPrecedingNewFiles() + 1); - } - - String name = window.getFileName(); - - if (name.length() < MAX_WINDOW_NAME_LENGTH) { - return name; - } - if (name.indexOf(File.separatorChar) < 0) { - return name; - } // If there are no separators, I can't really intelligently truncate. - int startLength = name.indexOf(File.separatorChar, 1) + 1; - int endLength = name.length() - name.lastIndexOf(File.separatorChar); - - if (endLength + startLength + 3 > name.length()) { - return name; - } // return name anyways, since we're not getting it any shorter. - - boolean change; - - do { - change = false; - int newEndLength = name.length() - name.lastIndexOf(File.separatorChar, name.length() - endLength - 1); - - if (newEndLength + startLength + 3 <= MAX_WINDOW_NAME_LENGTH) { - endLength = newEndLength; - change = true; - } - int newStartLength = name.indexOf(File.separatorChar, startLength + 1) + 1; - - if (endLength + startLength + 3 <= MAX_WINDOW_NAME_LENGTH) { - startLength = newStartLength; - change = true; - } - } while (change); - - return name.substring(0, startLength) + "..." + name.substring(name.length() - endLength); - } - - /** - * @return how many nameless windows occur before this one in the parent. - */ - protected int getPrecedingNewFiles() { - int count = 0; - - for (int i = 0; i < WINDOW_MENU_MAX_SIZE - && i < parentMenu.getMenuComponentCount() - PRECEDING_WINDOW_MENU_ITEMS - SUBSEQUENT_WINDOW_MENU_ITEMS - && parentMenu.getMenuComponent(i + PRECEDING_WINDOW_MENU_ITEMS) != this; i++) { - if (parentMenu.getMenuComponent(i + PRECEDING_WINDOW_MENU_ITEMS) instanceof WindowMenuItem - && ((WindowMenuItem) parentMenu.getMenuComponent(i + PRECEDING_WINDOW_MENU_ITEMS)).window.getFileName() - == null) { - count++; - } - } - return count; - } - - /** - * Figures out what index (from 0 to WINDOW_MENU_MAX_SIZE-1) this item is in - * the window menu. - *

- * @return -1 if this item isn't showing. - */ - protected int getIndex() { - for (int i = 0; i < WINDOW_MENU_MAX_SIZE - && i < parentMenu.getMenuComponentCount() - PRECEDING_WINDOW_MENU_ITEMS - SUBSEQUENT_WINDOW_MENU_ITEMS; i++) { - if (this == parentMenu.getMenuComponent(i + PRECEDING_WINDOW_MENU_ITEMS)) { - return i; - } - } - return -1; - } - - /** - * Returns the index of the character in the label that should be underlined - */ - @Override - public int getDisplayedMnemonicIndex() { - return (type == SPECIAL_MORE) ? 11 : 0; - } - - /** - * Returns the keyboard mnemonic for this item, which is the virtual key - * code for its 1-based index. - */ - @Override - public int getMnemonic() { - return (type == SPECIAL_MORE) ? KeyEvent.VK_S : KeyEvent.VK_1 + getIndex(); - } - - /** - * Returns true if this item should be showing. - *

- * Returns false if there are more than WINDOW_MENU_MAX_SIZE items before it - * in the menu. - */ - @Override - public boolean isVisible() { - if (type == SPECIAL_MORE) { - Container parent = getParent(); - - if (parent == null) { - return true; - } - int numWindows = parent.getComponentCount() - PRECEDING_WINDOW_MENU_ITEMS - SUBSEQUENT_WINDOW_MENU_ITEMS; - - updateSelection(); - return (numWindows <= 0) || (numWindows > WINDOW_MENU_MAX_SIZE); - } - updateSelection(); - return getIndex() >= 0; - } - - /** - * Returns true if this item should be enabled (selectable). - *

- * Returns false if it is a More Windows... item and there are no windows. - */ - @Override - public boolean isEnabled() { - if (type == SPECIAL_MORE) { - Container parent = getParent(); - - if (parent == null) { - return true; - } - int numWindows = parent.getComponentCount() - PRECEDING_WINDOW_MENU_ITEMS - SUBSEQUENT_WINDOW_MENU_ITEMS; - - return (numWindows > 0); - } - return true; - } - - /** - * Determines if this menu item should currently show as "selected". - *

- * The item should be seleced if the window it's tied to has focus. - */ - @Override - public boolean isSelected() { - return (type != SPECIAL_MORE) && (window != null && window.getDesktopPane() != null) - && window.getDesktopPane().getSelectedFrame() == window; - } - - /** - * Makes sure the underlying menu item knows if we're selected. - */ - public void updateSelection() { - setSelected(isSelected()); // Sort of a silly thing to do... - setEnabled(isEnabled()); - } - - /** - * @return the EditWindow that this menu item is tied to. - */ - public EditWindow getEditWindow() { - return window; - } - - /** - * Creates a string representation of this object. - *

- * Handy for repurposing the menu items as list items :-) - */ - @Override - public String toString() { - return (type == SPECIAL_MORE) ? "" : getFileName(); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyle.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyle.java deleted file mode 100644 index bbdedc1..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyle.java +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JColorChooser; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.border.BevelBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.sf.robocode.ui.editor.FontStyle; - - -/** - * Class that is used for maintaining a text color and font style for an editor. - * - * @author Flemming N. Larsen (original) - * @since 1.8.3.0 - */ -public class ColorAndStyle { - private final JLabel label; - private final JButton coloredButton; - private final JComboBox fontStyleComboBox; - private final List listeners = new ArrayList(); - - private Color oldColor; - private FontStyle oldStyle; - - public ColorAndStyle(String label, final Color color, final FontStyle fontStyle) { - this.label = new JLabel(label); - - coloredButton = createColoredButton(color); - if (coloredButton != null) { - coloredButton.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - if (!coloredButton.getBackground().equals(color)) { - notifyColorChanged(coloredButton.getBackground()); - } - } - }); - } - - fontStyleComboBox = fontStyle == null ? null : ComboBoxUtil.createFontStyleComboBox(fontStyle); - if (fontStyleComboBox != null) { - fontStyleComboBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - FontStyle newStyle = ComboBoxUtil.getSelectedStyle(fontStyleComboBox); - if (oldStyle != newStyle) { - notifyStyleChanged(newStyle); - oldStyle = newStyle; - } - } - }); - } - } - - public JLabel getLabel() { - return label; - } - - public JButton getColoredButton() { - return coloredButton; - } - - public JComboBox getFontStyleComboBox() { - return fontStyleComboBox; - } - - public void addListener(IColorAndStyleListener listener) { - listeners.add(listener); - } - - public void removeListener(IColorAndStyleListener listener) { - listeners.remove(listener); - } - - public Color getSelectedColor() { - return (coloredButton == null) ? null : coloredButton.getBackground(); - } - - public void setSelectedColor(Color newColor) { - if (coloredButton != null) { - coloredButton.setBackground(newColor); - } - notifyColorChanged(newColor); - } - - public FontStyle getSelectedStyle() { - return (fontStyleComboBox == null) ? null : ComboBoxUtil.getSelectedStyle(fontStyleComboBox); - } - - public void setSelectedStyle(FontStyle newStyle) { - if (fontStyleComboBox != null) { - ComboBoxUtil.setSelected(fontStyleComboBox, newStyle); - } - notifyStyleChanged(newStyle); - } - - private void notifyColorChanged(Color newColor) { - if (newColor == null || !newColor.equals(oldColor)) { - for (IColorAndStyleListener listener : listeners) { - listener.colorChanged(newColor); - } - oldColor = newColor; - } - } - - private void notifyStyleChanged(FontStyle newStyle) { - if (newStyle == null || !newStyle.equals(oldStyle)) { - for (IColorAndStyleListener listener : listeners) { - listener.styleChanged(newStyle); - } - oldStyle = newStyle; - } - } - - private static JButton createColoredButton(Color color) { - final JButton button = new JButton(); - button.setBackground(color); - button.setContentAreaFilled(false); - button.setOpaque(true); - Dimension size = new Dimension(24, 24); - button.setPreferredSize(size); - button.setSize(size); - button.setMaximumSize(size); - button.setMinimumSize(size); - button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); - - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Color selectedColor = JColorChooser.showDialog(null, "Pick a color", button.getBackground()); - if (selectedColor != null) { - button.setBackground(selectedColor); - } - } - }); - - return button; - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyleAdapter.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyleAdapter.java deleted file mode 100644 index 270f58c..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ColorAndStyleAdapter.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Color; - -import net.sf.robocode.ui.editor.FontStyle; - - -/** - * Adapter class for the {@link IColorAndStyleListener} interface. - * - * @author Flemming N. Larsen (original) - * @since 1.8.3.0 - */ -public abstract class ColorAndStyleAdapter implements IColorAndStyleListener { - @Override - public void colorChanged(Color newColor) {} - - @Override - public void styleChanged(FontStyle newStyle) {} -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ComboBoxUtil.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ComboBoxUtil.java deleted file mode 100644 index 853df84..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/ComboBoxUtil.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Component; -import java.awt.Font; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.ComboBoxModel; -import javax.swing.DefaultListCellRenderer; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JList; - -import net.sf.robocode.ui.editor.FontStyle; - - -/** - * Class for utilizing JComboBoxes. - * - * @author Flemming N. Larsen (original) - * @since 1.8.3.0 - */ -public class ComboBoxUtil { - - public static void setSelected(JComboBox comboBox, String name) { - ComboBoxModel model = comboBox.getModel(); - for (int i = 0; i < model.getSize(); i++) { - String itemName = (String) model.getElementAt(i); - if (itemName.equalsIgnoreCase(name)) { - model.setSelectedItem(itemName); - break; - } - } - } - - public static void setSelected(JComboBox comboBox, FontStyle fontStyle) { - ComboBoxModel model = comboBox.getModel(); - for (int i = 0; i < model.getSize(); i++) { - String name = (String) model.getElementAt(i); - FontStyle style = FontStyle.fromName(name); - if (style != null && style == fontStyle) { - model.setSelectedItem(name); - break; - } - } - } - - public static String getSelectedName(JComboBox comboBox) { - return (String) comboBox.getSelectedItem(); - } - - public static JComboBox createFontStyleComboBox(FontStyle fontStyle) { - List fontStyles = new ArrayList(); - for (FontStyle style : FontStyle.values()) { - fontStyles.add(style.getName()); - } - JComboBox comboBox = new JComboBox(fontStyles.toArray()); - comboBox.setRenderer(new FontStyleCellRenderer()); - - ComboBoxUtil.setSelected(comboBox, fontStyle); - - return comboBox; - } - - public static FontStyle getSelectedStyle(JComboBox comboBox) { - return FontStyle.fromName((String) comboBox.getSelectedItem()); - } - - private static class FontStyleCellRenderer extends DefaultListCellRenderer { - private static final long serialVersionUID = 1L; - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - - FontStyle fontStyle = FontStyle.fromName((String) value); - int styleFlags = (fontStyle == null) ? Font.PLAIN : fontStyle.getFontStyleFlags(); - - Font font = new Font((String) value, styleFlags, 12); - label.setFont(font); - return label; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorProperties.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorProperties.java deleted file mode 100644 index 8843551..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorProperties.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Properties; - -import net.sf.robocode.ui.editor.IEditorProperties; - - -/** - * Handles the editor properties. - * - * @author Flemming N. Larsen (original) - * - * @since 1.8.3.0 - */ -public class EditorProperties implements IEditorProperties { - - private static final String DEFAULT_THEME_NAME = "Robocode White Theme"; - - private static final String THEME_NAME = "editor.theme"; - - private String themeName; - - private final Properties props = new Properties(); - - @Override - public String getThemeName() { - String themeName = this.themeName; - if (themeName == null) { - themeName = props.getProperty(THEME_NAME); - } - if (themeName == null) { - themeName = DEFAULT_THEME_NAME; - } else { - File file = EditorThemePropertiesManager.getFilepath(themeName); - if (!file.exists()) { - themeName = DEFAULT_THEME_NAME; - } - } - this.themeName = themeName; - return themeName; - } - - public void setThemeName(String themeName) { - this.themeName = themeName; - } - - public void load(InputStream is) throws IOException { - props.load(is); - - themeName = props.getProperty(THEME_NAME); - } - - public void store(OutputStream os, String header) throws IOException { - props.setProperty(THEME_NAME, themeName); - - props.store(os, header); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorPropertiesManager.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorPropertiesManager.java deleted file mode 100644 index 0b5add2..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorPropertiesManager.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import static net.sf.robocode.io.Logger.logError; -import static net.sf.robocode.io.Logger.logMessage; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; - - -/** - * Manages the editor property file. - * - * @author Flemming N. Larsen (original) - * - * @since 1.8.3.0 - */ -public class EditorPropertiesManager { - - private static EditorProperties editorProperties; - - public static EditorProperties getEditorProperties() { - if (editorProperties == null) { - editorProperties = new EditorProperties(); - - FileInputStream in = null; - File file = null; - try { - in = new FileInputStream(FileUtil.getEditorConfigFile()); - getEditorProperties().load(in); - } catch (FileNotFoundException e) { - logMessage("Editor properties file was not found. A new one will be created."); - } catch (IOException e) { - logError("Error while reading file: " + file, e); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) {} - } - } - } - return editorProperties; - } - - public static void saveEditorProperties() { - FileOutputStream out = null; - try { - out = new FileOutputStream(FileUtil.getEditorConfigFile()); - getEditorProperties().store(out, "Robocode Editor Properties"); - } catch (IOException e) { - Logger.logError(e); - } finally { - if (out != null) { - try { - out.close(); - } catch (IOException ignored) {} - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemeProperties.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemeProperties.java deleted file mode 100644 index b1ac011..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemeProperties.java +++ /dev/null @@ -1,541 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Color; -import java.awt.Font; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Properties; - -import net.sf.robocode.ui.editor.FontStyle; - - -/** - * Handles the editor theme properties. - * - * @author Flemming N. Larsen (original) - * - * @since 1.8.3.0 - */ -public class EditorThemeProperties implements IEditorThemeProperties { - - // ---- Default Colors and Styles ---- - - private static final String DEFAULT_THEME_NAME = EditorPropertiesManager.getEditorProperties().getThemeName(); - - private static final String DEFAULT_FONT_NAME = "Monospaced"; - private static final int DEFAULT_FONT_SIZE = 14; - - private static final Color DEFAULT_BACKGROUND_COLOR = Color.WHITE; - - private static final Color DEFAULT_LINE_NUMBER_BACKGROUND_COLOR = new Color(0xDD, 0xDD, 0xDD); - private static final Color DEFAULT_LINE_NUMBER_TEXT_COLOR = Color.BLACK; - - private static final Color DEFAULT_HIGHLIGHTED_LINE_COLOR = new Color(0xFF, 0xFF, 0x7F); - private static final Color DEFAULT_SELECTION_COLOR = new Color(0x33, 0x99, 0xFF); - private static final Color DEFAULT_SELECTED_TEXT_COLOR = Color.WHITE; - - private static final Color DEFAULT_NORMAL_TEXT_COLOR = Color.BLACK; - private static final FontStyle DEFAULT_NORMAL_TEXT_STYLE = FontStyle.PLAIN; - - private static final Color DEFAULT_COMMENT_TEXT_COLOR = new Color(0x00, 0xAF, 0x00); - private static final FontStyle DEFAULT_COMMENT_TEXT_STYLE = FontStyle.PLAIN; - - private static final Color DEFAULT_QUOTED_TEXT_COLOR = new Color(0x7f, 0x00, 0x00); - private static final FontStyle DEFAULT_QUOTED_TEXT_STYLE = FontStyle.PLAIN; - - private static final Color DEFAULT_KEYWORD_TEXT_COLOR = new Color(0x00, 0x00, 0xAF); - private static final FontStyle DEFAULT_KEYWORD_TEXT_STYLE = FontStyle.BOLD; - - private static final Color DEFAULT_LITERAL_TEXT_COLOR = new Color(0x00, 0x00, 0xAF); - private static final FontStyle DEFAULT_LITERAL_TEXT_STYLE = FontStyle.BOLD; - - private static final Color DEFAULT_ANNOTATION_TEXT_COLOR = new Color(0x7F, 0x7F, 0x7F); - private static final FontStyle DEFAULT_ANNOTATION_TEXT_STYLE = FontStyle.BOLD; - - // ---- Property Names ---- - - private static final String THEME_NAME = "editor.theme"; - - private static final String FONT_NAME = "editor.font.name"; - private static final String FONT_SIZE = "editor.font.size"; - - private static final String BACKGROUND_COLOR = "editor.background.color"; - - private static final String LINE_NUMBER_BACKGROUND_COLOR = "editor.lineNumber.background.color"; - private static final String LINE_NUMBER_TEXT_COLOR = "editor.lineNumber.text.color"; - - private static final String HIGHLIGHTED_LINE_COLOR = "editor.highlighted.line.color"; - - private static final String SELECTION_COLOR = "editor.selected.background.color"; - private static final String SELECTED_TEXT_COLOR = "editor.selected.text.color"; - - private static final String NORMAL_TEXT_COLOR = "editor.text.color.normal"; - private static final String NORMAL_TEXT_STYLE = "editor.text.style.normal"; - - private static final String COMMENT_TEXT_COLOR = "editor.text.color.comment"; - private static final String COMMENT_TEXT_STYLE = "editor.text.style.comment"; - - private static final String QUOTED_TEXT_COLOR = "editor.text.color.quoted"; - private static final String QUOTED_TEXT_STYLE = "editor.text.style.quoted"; - - private static final String KEYWORD_TEXT_COLOR = "editor.text.color.keyword"; - private static final String KEYWORD_TEXT_STYLE = "editor.text.style.keyword"; - - private static final String LITERAL_TEXT_COLOR = "editor.text.color.literal"; - private static final String LITERAL_TEXT_STYLE = "editor.text.style.literal"; - - private static final String ANNOTATION_TEXT_COLOR = "editor.text.color.annotation"; - private static final String ANNOTATION_TEXT_STYLE = "editor.text.style.annotation"; - - private String themeName; - - private String fontName; - private Integer fontSize; - - private ColorPropertyStrategy backgroundColor = new ColorPropertyStrategy(BACKGROUND_COLOR, DEFAULT_BACKGROUND_COLOR); - private ColorPropertyStrategy lineNumberBackgroundColor = new ColorPropertyStrategy(LINE_NUMBER_BACKGROUND_COLOR, - DEFAULT_LINE_NUMBER_BACKGROUND_COLOR); - private ColorPropertyStrategy lineNumberTextColor = new ColorPropertyStrategy(LINE_NUMBER_TEXT_COLOR, - DEFAULT_LINE_NUMBER_TEXT_COLOR); - private ColorPropertyStrategy highlightedLineColor = new ColorPropertyStrategy(HIGHLIGHTED_LINE_COLOR, - DEFAULT_HIGHLIGHTED_LINE_COLOR); - private ColorPropertyStrategy selectionColor = new ColorPropertyStrategy(SELECTION_COLOR, DEFAULT_SELECTION_COLOR); - private ColorPropertyStrategy selectedTextColor = new ColorPropertyStrategy(SELECTED_TEXT_COLOR, - DEFAULT_SELECTED_TEXT_COLOR); - private ColorPropertyStrategy normalTextColor = new ColorPropertyStrategy(NORMAL_TEXT_COLOR, - DEFAULT_NORMAL_TEXT_COLOR); - private FontStylePropertyStrategy normalTextStyle = new FontStylePropertyStrategy(NORMAL_TEXT_STYLE, - DEFAULT_NORMAL_TEXT_STYLE); - private ColorPropertyStrategy commentTextColor = new ColorPropertyStrategy(COMMENT_TEXT_COLOR, - DEFAULT_COMMENT_TEXT_COLOR); - private FontStylePropertyStrategy commentTextStyle = new FontStylePropertyStrategy(COMMENT_TEXT_STYLE, - DEFAULT_COMMENT_TEXT_STYLE); - private ColorPropertyStrategy quotedTextColor = new ColorPropertyStrategy(QUOTED_TEXT_COLOR, - DEFAULT_QUOTED_TEXT_COLOR); - private FontStylePropertyStrategy quotedTextStyle = new FontStylePropertyStrategy(QUOTED_TEXT_STYLE, - DEFAULT_QUOTED_TEXT_STYLE); - private ColorPropertyStrategy keywordTextColor = new ColorPropertyStrategy(KEYWORD_TEXT_COLOR, - DEFAULT_KEYWORD_TEXT_COLOR); - private FontStylePropertyStrategy keywordTextStyle = new FontStylePropertyStrategy(KEYWORD_TEXT_STYLE, - DEFAULT_KEYWORD_TEXT_STYLE); - private ColorPropertyStrategy literalTextColor = new ColorPropertyStrategy(LITERAL_TEXT_COLOR, - DEFAULT_LITERAL_TEXT_COLOR); - private FontStylePropertyStrategy literalTextStyle = new FontStylePropertyStrategy(LITERAL_TEXT_STYLE, - DEFAULT_LITERAL_TEXT_STYLE); - private ColorPropertyStrategy annotationTextColor = new ColorPropertyStrategy(ANNOTATION_TEXT_COLOR, - DEFAULT_ANNOTATION_TEXT_COLOR); - private FontStylePropertyStrategy annotationTextStyle = new FontStylePropertyStrategy(ANNOTATION_TEXT_STYLE, - DEFAULT_ANNOTATION_TEXT_STYLE); - - private IPropertyStrategy[] colorAndStyleProps = new IPropertyStrategy[] { - backgroundColor, lineNumberBackgroundColor, lineNumberTextColor, highlightedLineColor, selectionColor, - selectedTextColor, normalTextColor, normalTextStyle, commentTextColor, commentTextStyle, quotedTextColor, - quotedTextStyle, keywordTextColor, keywordTextStyle, literalTextColor, literalTextStyle, annotationTextColor, - annotationTextStyle - }; - - private final Properties props = new Properties(); - - private boolean isChanged; - - public String getThemeName() { - String themeName = this.themeName; - if (themeName == null) { - themeName = props.getProperty(THEME_NAME); - } - if (themeName == null) { - themeName = DEFAULT_THEME_NAME; - } - this.themeName = themeName; - return themeName; - } - - public void setThemeName(String newName) { - this.themeName = newName; - EditorThemePropertiesManager.notifyThemeNameChanged(newName); - } - - public Font getFont() { - return new Font(getFontName(), getNormalTextStyle().getFontStyleFlags(), getFontSize()); - } - - public void setFontName(String newName) { - this.fontName = newName; - EditorThemePropertiesManager.notifyFontNameChanged(newName); - isChanged = true; - } - - @Override - public String getFontName() { - String fontName = this.fontName; - if (fontName == null) { - fontName = props.getProperty(FONT_NAME); - } - if (fontName == null) { - fontName = DEFAULT_FONT_NAME; - } - this.fontName = fontName; - return fontName; - } - - public void setFontSize(int newSize) { - this.fontSize = newSize; - EditorThemePropertiesManager.notifyFontSizeChanged(newSize); - isChanged = true; - } - - @Override - public int getFontSize() { - Integer fontSize = this.fontSize; - if (fontSize == null) { - String value = props.getProperty(FONT_SIZE); - try { - fontSize = Integer.parseInt(value); - } catch (NumberFormatException ignore) {} - } - if (fontSize == null) { - fontSize = DEFAULT_FONT_SIZE; - } - this.fontSize = fontSize; - return fontSize; - } - - public void setBackgroundColor(Color newColor) { - backgroundColor.set(newColor); - EditorThemePropertiesManager.notifyBackgroundColorChanged(newColor); - } - - @Override - public Color getBackgroundColor() { - return backgroundColor.get(); - } - - public void setLineNumberBackgroundColor(Color newColor) { - lineNumberBackgroundColor.set(newColor); - EditorThemePropertiesManager.notifyLineNumberBackgroundColorChanged(newColor); - } - - @Override - public Color getLineNumberBackgroundColor() { - return lineNumberBackgroundColor.get(); - } - - public void setLineNumberTextColor(Color newColor) { - lineNumberTextColor.set(newColor); - EditorThemePropertiesManager.notifyLineNumberTextColorChanged(newColor); - } - - @Override - public Color getLineNumberTextColor() { - return lineNumberTextColor.get(); - } - - public void setHighlightedLineColor(Color newColor) { - highlightedLineColor.set(newColor); - EditorThemePropertiesManager.notifyHighlightedLineColorChanged(newColor); - } - - @Override - public Color getHighlightedLineColor() { - return highlightedLineColor.get(); - } - - public void setSelectionColor(Color newColor) { - selectionColor.set(newColor); - EditorThemePropertiesManager.notifySelectionColorChanged(newColor); - } - - @Override - public Color getSelectionColor() { - return selectionColor.get(); - } - - public void setSelectedTextColor(Color newColor) { - selectedTextColor.set(newColor); - EditorThemePropertiesManager.notifySelectedTextColorChanged(newColor); - } - - @Override - public Color getSelectedTextColor() { - return selectedTextColor.get(); - } - - public void setNormalTextColor(Color newColor) { - normalTextColor.set(newColor); - EditorThemePropertiesManager.notifyNormalTextColorChanged(newColor); - } - - @Override - public Color getNormalTextColor() { - return normalTextColor.get(); - } - - public void setNormalTextStyle(FontStyle newStyle) { - normalTextStyle.set(newStyle); - EditorThemePropertiesManager.notifyNormalTextStyleChanged(newStyle); - } - - @Override - public FontStyle getNormalTextStyle() { - return normalTextStyle.get(); - } - - public void setCommentTextColor(Color newColor) { - commentTextColor.set(newColor); - EditorThemePropertiesManager.notifyCommentTextColorChanged(newColor); - } - - @Override - public Color getCommentTextColor() { - return commentTextColor.get(); - } - - public void setCommentTextStyle(FontStyle newStyle) { - commentTextStyle.set(newStyle); - EditorThemePropertiesManager.notifyCommentTextStyleChanged(newStyle); - } - - @Override - public FontStyle getCommentTextStyle() { - return commentTextStyle.get(); - } - - public void setQuotedTextColor(Color newColor) { - quotedTextColor.set(newColor); - EditorThemePropertiesManager.notifyQuotedTextColorChanged(newColor); - } - - @Override - public Color getQuotedTextColor() { - return quotedTextColor.get(); - } - - public void setQuotedTextStyle(FontStyle newStyle) { - quotedTextStyle.set(newStyle); - EditorThemePropertiesManager.notifyQuotedTextStyleChanged(newStyle); - } - - @Override - public FontStyle getQuotedTextStyle() { - return quotedTextStyle.get(); - } - - public void setKeywordTextColor(Color newColor) { - keywordTextColor.set(newColor); - EditorThemePropertiesManager.notifyKeywordTextColorChanged(newColor); - } - - @Override - public Color getKeywordTextColor() { - return keywordTextColor.get(); - } - - public void setKeywordTextStyle(FontStyle newStyle) { - keywordTextStyle.set(newStyle); - EditorThemePropertiesManager.notifyKeywordTextStyleChanged(newStyle); - } - - @Override - public FontStyle getKeywordTextStyle() { - return keywordTextStyle.get(); - } - - public void setLiteralTextColor(Color newColor) { - literalTextColor.set(newColor); - EditorThemePropertiesManager.notifyLiteralTextColorChanged(newColor); - } - - @Override - public Color getLiteralTextColor() { - return literalTextColor.get(); - } - - public void setLiteralTextStyle(FontStyle newStyle) { - literalTextStyle.set(newStyle); - EditorThemePropertiesManager.notifyLiteralTextStyleChanged(newStyle); - } - - @Override - public FontStyle getLiteralTextStyle() { - return literalTextStyle.get(); - } - - public void setAnnotationTextColor(Color newColor) { - annotationTextColor.set(newColor); - EditorThemePropertiesManager.notifyAnnotationTextColorChanged(newColor); - } - - @Override - public Color getAnnotationTextColor() { - return annotationTextColor.get(); - } - - public void setAnnotationTextStyle(FontStyle newStyle) { - annotationTextStyle.set(newStyle); - EditorThemePropertiesManager.notifyAnnotationTextStyleChanged(newStyle); - } - - @Override - public FontStyle getAnnotationTextStyle() { - return annotationTextStyle.get(); - } - - public void load(InputStream is) throws IOException { - // Reset (clean) the property values before loading them - for (IPropertyStrategy propertyStrategy : colorAndStyleProps) { - propertyStrategy.set(null); // clean value - propertyStrategy.save(); // store cleaned value in property - } - - props.load(is); - - themeName = props.getProperty(THEME_NAME, DEFAULT_THEME_NAME); - fontName = props.getProperty(FONT_NAME, DEFAULT_FONT_NAME); - try { - fontSize = Integer.parseInt(props.getProperty(FONT_SIZE, "" + DEFAULT_FONT_SIZE)); - } catch (NumberFormatException e) { - fontSize = DEFAULT_FONT_SIZE; - } - - for (IPropertyStrategy propertyStrategy : colorAndStyleProps) { - propertyStrategy.load(); - } - - // Reset 'changed' flag - isChanged = false; - } - - public void store(OutputStream os, String header) throws IOException { - props.setProperty(THEME_NAME, themeName); - props.setProperty(FONT_NAME, fontName); - props.setProperty(FONT_SIZE, "" + fontSize); - - for (IPropertyStrategy propertyStrategy : colorAndStyleProps) { - propertyStrategy.save(); - } - - props.store(os, header); - - // Reset 'changed' flag - isChanged = false; - } - - public boolean isChanged() { - return isChanged; - } - - interface IPropertyStrategy { - V get(); - void set(V value); - void load(); - void save(); - } - - - class ColorPropertyStrategy implements IPropertyStrategy { - - final String propertyName; - final Color defaultColor; - Color color; - - ColorPropertyStrategy(String propertyName, Color defaultColor) { - this.propertyName = propertyName; - this.defaultColor = defaultColor; - this.color = defaultColor; - } - - @Override - public Color get() { - return color == null ? defaultColor : color; - } - - @Override - public void set(Color color) { - if ((color == null && this.color == null) || (color != null && color.equals(this.color))) { - return; - } - this.color = color; - isChanged = true; - } - - @Override - public void load() { - color = fromPropertyToColor(propertyName); - } - - @Override - public void save() { - props.setProperty(propertyName, toHexString(get())); - } - - private Color fromPropertyToColor(String propertyName) { - String hexValue = props.getProperty(propertyName); - if (hexValue != null) { - try { - // Yes, we need to use a Long instead of an Integer here + - // we mask out the alpha channel - int rgb = (int) Long.parseLong(hexValue, 16) & 0x00FFFFFF; - return new Color(rgb); - } catch (NumberFormatException ignore) {} - } - return null; - } - } - - - class FontStylePropertyStrategy implements IPropertyStrategy { - - final String propertyName; - final FontStyle defaultStyle; - FontStyle style; - - FontStylePropertyStrategy(String propertyName, FontStyle defaultStyle) { - this.propertyName = propertyName; - this.defaultStyle = defaultStyle; - this.style = defaultStyle; - } - - @Override - public FontStyle get() { - return style == null ? defaultStyle : style; - } - - @Override - public void set(FontStyle style) { - if ((style == null && this.style == null) || (style != null && style.equals(this.style))) { - return; - } - this.style = style; - isChanged = true; - } - - @Override - public void load() { - style = fromPropertyToFontStyle(propertyName); - } - - @Override - public void save() { - props.setProperty(propertyName, "" + get().getName()); - } - - private FontStyle fromPropertyToFontStyle(String propertyName) { - String styleName = props.getProperty(propertyName); - return (styleName == null) ? null : FontStyle.fromName(styleName); - } - } - - private static String toHexString(Color color) { - // We mask out the alpha channel and format as RRGGBB - return String.format("%06X", color.getRGB() & 0x00FFFFFF); - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertiesManager.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertiesManager.java deleted file mode 100644 index d696438..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertiesManager.java +++ /dev/null @@ -1,248 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import static net.sf.robocode.io.Logger.logError; - -import java.awt.Color; -import java.awt.Font; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.ui.editor.FontStyle; - - -/** - * Manages the editor theme property files. - * - * @author Flemming N. Larsen (original) - * - * @since 1.8.3.0 - */ -public class EditorThemePropertiesManager { - - private static final String EDITOR_THEME_PROPERTIES_FILE_EXT = ".properties"; - - private static final List listeners = new ArrayList(); - - private static EditorThemeProperties editorThemeProperties; - - public static void addListener(IEditorThemePropertyChangeListener listener) { - if (!listeners.contains(listener)) { - listeners.add(listener); - } - } - - public static void removeListener(IEditorThemePropertyChangeListener listener) { - listeners.remove(listener); - } - - public static void notifyThemeNameChanged(String newThemeName) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onThemeNameChanged(newThemeName); - } - } - - public static void notifyFontChanged(Font newFont) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onFontChanged(newFont); - } - } - - public static void notifyFontNameChanged(String newFontName) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onFontNameChanged(newFontName); - } - } - - public static void notifyFontSizeChanged(int newFontSize) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onFontSizeChanged(newFontSize); - } - } - - public static void notifyBackgroundColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onBackgroundColorChanged(newColor); - } - } - - public static void notifyLineNumberBackgroundColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onLineNumberBackgroundColorChanged(newColor); - } - } - - public static void notifyLineNumberTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onLineNumberTextColorChanged(newColor); - } - } - - public static void notifyHighlightedLineColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onHighlightedLineColorChanged(newColor); - } - } - - public static void notifySelectionColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onSelectionColorChanged(newColor); - } - } - - public static void notifySelectedTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onSelectedTextColorChanged(newColor); - } - } - - public static void notifyNormalTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onNormalTextColorChanged(newColor); - } - } - - public static void notifyNormalTextStyleChanged(FontStyle newStyle) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onNormalTextStyleChanged(newStyle); - } - } - - public static void notifyQuotedTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onQuotedTextColorChanged(newColor); - } - } - - public static void notifyQuotedTextStyleChanged(FontStyle newStyle) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onQuotedTextStyleChanged(newStyle); - } - } - - public static void notifyKeywordTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onKeywordTextColorChanged(newColor); - } - } - - public static void notifyKeywordTextStyleChanged(FontStyle newStyle) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onKeywordTextStyleChanged(newStyle); - } - } - - public static void notifyLiteralTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onLiteralTextColorChanged(newColor); - } - } - - public static void notifyLiteralTextStyleChanged(FontStyle newStyle) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onLiteralTextStyleChanged(newStyle); - } - } - - public static void notifyAnnotationTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onAnnotationTextColorChanged(newColor); - } - } - - public static void notifyAnnotationTextStyleChanged(FontStyle newStyle) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onAnnotationTextStyleChanged(newStyle); - } - } - - public static void notifyCommentTextColorChanged(Color newColor) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onCommentTextColorChanged(newColor); - } - } - - public static void notifyCommentTextStyleChanged(FontStyle newStyle) { - for (IEditorThemePropertyChangeListener listener : listeners) { - listener.onCommentTextStyleChanged(newStyle); - } - } - - public static EditorThemeProperties getCurrentEditorThemeProperties() { - if (editorThemeProperties == null) { - editorThemeProperties = new EditorThemeProperties(); - - String themeName = EditorPropertiesManager.getEditorProperties().getThemeName(); - File filepath = EditorThemePropertiesManager.getFilepath(themeName); - - loadEditorThemeProperties(filepath); - } - return editorThemeProperties; - } - - public static void loadEditorThemeProperties(File filepath) { - if (filepath != null) { - FileInputStream in = null; - File file = null; - try { - in = new FileInputStream(filepath); - getCurrentEditorThemeProperties().load(in); - } catch (FileNotFoundException e) { - logError("Could not find file: " + file, e); - } catch (IOException e) { - logError("Error while reading file: " + file, e); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) {} - } - } - } - } - - public static void saveEditorThemeProperties(File filepath) { - FileOutputStream out = null; - try { - out = new FileOutputStream(filepath); - getCurrentEditorThemeProperties().store(out, "Robocode Editor Theme Properties"); - } catch (IOException e) { - Logger.logError(e); - } finally { - if (out != null) { - try { - out.close(); - } catch (IOException ignored) {} - } - } - } - - public static File getFilepath(String themeName) { - if (themeName == null) { - return null; - } - File configDirPath = FileUtil.getEditorThemeConfigDir(); - - String themeFileName = themeName + EDITOR_THEME_PROPERTIES_FILE_EXT; - - return new File(configDirPath, themeFileName); - } - - public static String getFileExt() { - return EDITOR_THEME_PROPERTIES_FILE_EXT; - } -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertyChangeAdapter.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertyChangeAdapter.java deleted file mode 100644 index fa8f21c..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/EditorThemePropertyChangeAdapter.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Color; -import java.awt.Font; - -import net.sf.robocode.ui.editor.FontStyle; - - -public class EditorThemePropertyChangeAdapter implements IEditorThemePropertyChangeListener { - - public void onThemeNameChanged(String newThemeName) {} - - public void onFontChanged(Font newFont) {} - - public void onFontNameChanged(String newFontName) {} - - public void onFontSizeChanged(int newFontSize) {} - - public void onBackgroundColorChanged(Color newColor) {} - - public void onLineNumberBackgroundColorChanged(Color newColor) {} - - public void onLineNumberTextColorChanged(Color newColor) {} - - public void onHighlightedLineColorChanged(Color newColor) {} - - public void onSelectionColorChanged(Color newColor) {} - - public void onSelectedTextColorChanged(Color newColor) {} - - public void onNormalTextColorChanged(Color newColor) {} - - public void onNormalTextStyleChanged(FontStyle newStyle) {} - - public void onQuotedTextColorChanged(Color newColor) {} - - public void onQuotedTextStyleChanged(FontStyle newStyle) {} - - public void onKeywordTextColorChanged(Color newColor) {} - - public void onKeywordTextStyleChanged(FontStyle newStyle) {} - - public void onLiteralTextColorChanged(Color newColor) {} - - public void onLiteralTextStyleChanged(FontStyle newStyle) {} - - public void onAnnotationTextColorChanged(Color newColor) {} - - public void onAnnotationTextStyleChanged(FontStyle newStyle) {} - - public void onCommentTextColorChanged(Color newColor) {} - - public void onCommentTextStyleChanged(FontStyle newStyle) {} -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IColorAndStyleListener.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IColorAndStyleListener.java deleted file mode 100644 index 21b7721..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IColorAndStyleListener.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Color; - -import net.sf.robocode.ui.editor.FontStyle; - - -/** - * Listener interface for the {@link ColorAndStyle} class. - * - * @author Flemming N. Larsen (original) - * @since 1.8.3.0 - */ -public interface IColorAndStyleListener { - void colorChanged(Color newColor); - void styleChanged(FontStyle newStyle); -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemeProperties.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemeProperties.java deleted file mode 100644 index 785ff89..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemeProperties.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Color; -import java.awt.Font; - -import net.sf.robocode.ui.editor.FontStyle; - - -/** - * Interface for editor theme properties. - * - * @author Flemming N. Larsen (original) - * - * @since 1.8.3.0 - */ -public interface IEditorThemeProperties { - - String getThemeName(); - - Font getFont(); - String getFontName(); - int getFontSize(); - - Color getBackgroundColor(); - - Color getLineNumberBackgroundColor(); - Color getLineNumberTextColor(); - - Color getHighlightedLineColor(); - - Color getSelectionColor(); - Color getSelectedTextColor(); - - Color getNormalTextColor(); - FontStyle getNormalTextStyle(); - - Color getQuotedTextColor(); - FontStyle getQuotedTextStyle(); - - Color getKeywordTextColor(); - FontStyle getKeywordTextStyle(); - - Color getLiteralTextColor(); - FontStyle getLiteralTextStyle(); - - Color getAnnotationTextColor(); - FontStyle getAnnotationTextStyle(); - - Color getCommentTextColor(); - FontStyle getCommentTextStyle(); -} diff --git a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemePropertyChangeListener.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemePropertyChangeListener.java deleted file mode 100644 index fd650c3..0000000 --- a/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/theme/IEditorThemePropertyChangeListener.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor.theme; - - -import java.awt.Color; -import java.awt.Font; - -import net.sf.robocode.ui.editor.FontStyle; - - -public interface IEditorThemePropertyChangeListener { - - void onThemeNameChanged(String newThemeName); - - void onFontChanged(Font newFont); - void onFontNameChanged(String newFontName); - void onFontSizeChanged(int newFontSize); - - void onBackgroundColorChanged(Color newColor); - - void onLineNumberBackgroundColorChanged(Color newColor); - void onLineNumberTextColorChanged(Color newColor); - - void onHighlightedLineColorChanged(Color newColor); - - void onSelectionColorChanged(Color newColor); - void onSelectedTextColorChanged(Color newColor); - - void onNormalTextColorChanged(Color newColor); - void onNormalTextStyleChanged(FontStyle newStyle); - - void onQuotedTextColorChanged(Color newColor); - void onQuotedTextStyleChanged(FontStyle newStyle); - - void onKeywordTextColorChanged(Color newColor); - void onKeywordTextStyleChanged(FontStyle newStyle); - - void onLiteralTextColorChanged(Color newColor); - void onLiteralTextStyleChanged(FontStyle newStyle); - - void onAnnotationTextColorChanged(Color newColor); - void onAnnotationTextStyleChanged(FontStyle newStyle); - - void onCommentTextColorChanged(Color newColor); - void onCommentTextStyleChanged(FontStyle newStyle); -} diff --git a/代码/workspace_robo4/robocode.ui/.classpath b/代码/workspace_robo4/robocode.ui/.classpath deleted file mode 100644 index aab3303..0000000 --- a/代码/workspace_robo4/robocode.ui/.classpath +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.ui/.project b/代码/workspace_robo4/robocode.ui/.project deleted file mode 100644 index c5e1c83..0000000 --- a/代码/workspace_robo4/robocode.ui/.project +++ /dev/null @@ -1,21 +0,0 @@ - - - robocode.ui - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - robocode.api - robocode.core - robocode.battle - robocode.host - robocode.repository - robocode.sound - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature - - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.ui/.settings/org.eclipse.jdt.core.prefs b/代码/workspace_robo4/robocode.ui/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b12a989..0000000 --- a/代码/workspace_robo4/robocode.ui/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Tue Nov 27 22:12:09 CET 2012 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -eclipse.preferences.version=1 -encoding/src/main/java=8859_1 -org.eclipse.jdt.core.compiler.source=1.6 -encoding/src/test/resources=8859_1 -encoding/src/main/resources=8859_1 -encoding/src/test/java=8859_1 -org.eclipse.jdt.core.compiler.compliance=1.6 diff --git a/代码/workspace_robo4/robocode.ui/pom.xml b/代码/workspace_robo4/robocode.ui/pom.xml deleted file mode 100644 index 3355ac3..0000000 --- a/代码/workspace_robo4/robocode.ui/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - robocode.ui - Robocode UI - - robocode - net.sf.robocode - ${robocode.version} - - - - net.sf.robocode - robocode.api - ${project.version} - - - net.sf.robocode - robocode.core - ${project.version} - - - net.sf.robocode - robocode.battle - ${project.version} - - - net.sf.robocode - robocode.sound - ${project.version} - runtime - - - diff --git a/代码/workspace_robo4/robocode.ui/robocode.ui.iml b/代码/workspace_robo4/robocode.ui/robocode.ui.iml deleted file mode 100644 index 1e3dce7..0000000 --- a/代码/workspace_robo4/robocode.ui/robocode.ui.iml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/BrowserManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/BrowserManager.java deleted file mode 100644 index c5671dc..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/BrowserManager.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; - -import java.awt.Desktop; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (original) - */ -public class BrowserManager { - - public static void openURL(String url) throws IOException { - - // Plan A: try to open the URL using the Java 6 Desktop class - if (Desktop.isDesktopSupported()) { - Desktop desktop = Desktop.getDesktop(); - if (desktop.isSupported(Desktop.Action.BROWSE)) { - try { - desktop.browse(new URI(url)); - return; // success - } catch (URISyntaxException e) { - Logger.logError(e); - } - } - // Fall thru to plan B - } - - // Plan B: try to open URL by calling a command-line tool for the specific OS - url = FileUtil.quoteFileName(url); - - Runtime rt = Runtime.getRuntime(); - String os = System.getProperty("os.name").toLowerCase(); - - if (os.startsWith("windows")) { - rt.exec("rundll32 url.dll, FileProtocolHandler " + url); - - } else if (os.startsWith("mac")) { - rt.exec("open " + url); - - } else if (os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0) { - // Do a best guess on Unix until we get a platform independent way. - // Build a list of browsers to try, in this order. - final String[] browsers = { - "epiphany", "firefox", "mozilla", "konqueror", "galeon", "netscape", "opera", "links", "lynx" }; - - // Build a command string which looks like - // "browser1 "url" || browser2 "url" || ..." - StringBuffer cmd = new StringBuffer(); - - for (int i = 0; i < browsers.length; i++) { - cmd.append((i == 0 ? "" : " || ") + browsers[i] + " \"" + url + "\" "); - } - - rt.exec(new String[] { "sh", "-c", cmd.toString() }); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/CheckList.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/CheckList.java deleted file mode 100644 index 114079b..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/CheckList.java +++ /dev/null @@ -1,220 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import java.awt.Component; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; - -import javax.swing.DefaultListModel; -import javax.swing.JCheckBox; -import javax.swing.JList; -import javax.swing.ListCellRenderer; - -import net.sf.robocode.util.AlphanumericComparator; - - -/** - * A JList containing JCheckBox items. - * - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class CheckList extends JList { - - private DefaultListModel model; - - public CheckList() { - super(); - - initialize(); - } - - private void initialize() { - model = new DefaultListModel(); - setModel(model); - - // Use a CheckListRenderer (see below) to renderer list cells - setCellRenderer(new CheckListRenderer()); - - // Add a mouse listener to handle changing selection - addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent event) { - JList list = (JList) event.getSource(); - - // Get index of item clicked - int index = list.locationToIndex(event.getPoint()); - - if (index >= 0) { - if (event.getClickCount() == 2) { - CheckListItem item = (CheckListItem) model.getElementAt(index); - - // Toggle selected state - item.setSelected(!item.isSelected()); - - // Repaint cell - list.repaint(list.getCellBounds(index, index)); - } - } - } - }); - } - - public void clear() { - model.clear(); - } - - public int getLength() { - return model.getSize(); - } - - public String get(int index) { - return ((CheckListItem) model.getElementAt(index)).toString(); - } - - public void add(String label) { - model.addElement(new CheckListItem(label)); - } - - public void remove(int index) { - model.remove(index); - } - - public boolean contains(String label) { - if (label == null) { - return false; - } - for (int i = 0; i < model.getSize(); i++) { - CheckListItem item = (CheckListItem) model.getElementAt(i); - - if (label.equals(item.toString())) { - return true; - } - } - return false; - } - - public void sort() { - int size = model.getSize(); - - if (size > 0) { - CheckListItem[] items = new CheckListItem[size]; - - model.copyInto(items); - Arrays.sort(items); - - for (int i = 0; i < items.length; i++) { - model.setElementAt(items[i], i); - } - } - } - - public void setChecked(String label, boolean isChecked) { - if (label != null) { - for (int i = 0; i < model.getSize(); i++) { - CheckListItem item = (CheckListItem) model.getElementAt(i); - - if (label.equals(item.toString())) { - item.setSelected(isChecked); - break; - } - } - } - } - - public Collection getUnchecked() { - Collection unchecked = new HashSet(); - - for (int i = 0; i < model.getSize(); i++) { - CheckListItem item = (CheckListItem) model.getElementAt(i); - - if (!item.isSelected()) { - unchecked.add(item.toString()); - } - } - return unchecked; - } - - public Collection getAll() { - Collection all = new HashSet(); - - for (int i = 0; i < model.getSize(); i++) { - CheckListItem item = (CheckListItem) model.getElementAt(i); - - all.add(item.toString()); - } - return all; - } -} - - -/** - * Represents items in the list that can be selected. - */ -class CheckListItem implements Cloneable, Comparable { - private String label; - private boolean isSelected = true; - - public CheckListItem(String label) { - this.label = label; - } - - private CheckListItem(CheckListItem item) { - label = item.label; - isSelected = item.isSelected; - } - - public boolean isSelected() { - return isSelected; - } - - public void setSelected(boolean isSelected) { - this.isSelected = isSelected; - } - - // Must be here - public String toString() { - return label; - } - - // Must be here (for sorting) - public Object clone() { - return new CheckListItem(this); - } - - // Must be here (for sorting) - public int compareTo(CheckListItem item) { - return new AlphanumericComparator().compare(label, item.label); - } -} - - -/** - * CheckListRenderer handles rendering cells in the list using a check box. - */ -@SuppressWarnings("serial") -class CheckListRenderer extends JCheckBox implements ListCellRenderer { - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) { - setEnabled(list.isEnabled()); - setSelected(((CheckListItem) value).isSelected()); - setFont(list.getFont()); - if (isSelected) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } - setText(value.toString()); - return this; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IImageManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IImageManager.java deleted file mode 100644 index 9272c68..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IImageManager.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.ui.gfx.RenderImage; - -import java.awt.*; - - -/** - * @author Pavel Savara (original) - */ -public interface IImageManager { - void initialize(); - - Image getGroundTileImage(int index); - - RenderImage getExplosionRenderImage(int which, int frame); - - RenderImage getExplosionDebriseRenderImage(); - - RenderImage getColoredBodyRenderImage(Integer color); - - RenderImage getColoredGunRenderImage(Integer color); - - RenderImage getColoredRadarRenderImage(Integer color); -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IRobotDialogManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IRobotDialogManager.java deleted file mode 100644 index d028cce..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IRobotDialogManager.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.ui.dialog.BattleButton; -import net.sf.robocode.ui.dialog.BattleDialog; -import net.sf.robocode.ui.dialog.RobotButton; -import net.sf.robocode.ui.dialog.RobotDialog; -import robocode.control.snapshot.IRobotSnapshot; - -import java.util.List; - - -/** - * @author Pavel Savara (original) - */ -public interface IRobotDialogManager { - void trim(List robots); - - void reset(); - - RobotDialog getRobotDialog(RobotButton robotButton, String name, boolean create); - BattleDialog getBattleDialog(BattleButton battleButton, boolean create); -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IWindowManagerExt.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IWindowManagerExt.java deleted file mode 100644 index f42eb4a..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/IWindowManagerExt.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.battle.BattleProperties; -import net.sf.robocode.battle.BattleResultsTableModel; -import robocode.control.events.BattleCompletedEvent; - -import javax.swing.*; - - -/** - * @author Pavel Savara (original) - */ -public interface IWindowManagerExt extends IWindowManager { - void showAboutBox(); - - String showBattleOpenDialog(String defExt, String name); - - String saveBattleDialog(String path, String defExt, String name); - - void showReadMe(); - - void showVersionsTxt(); - - void showHelpApi(); - - void showFaq(); - - void showOnlineHelp(); - - void showJavaDocumentation(); - - void showRobocodeHome(); - - void showRoboWiki(); - - void showGoogleGroupRobocode(); - - void showRobocodeRepository(); - - void showOptionsPreferences(); - - void showResultsDialog(BattleCompletedEvent event); - - void showRankingDialog(boolean visible); - - void showRobocodeEditor(); - - void showRobotPackager(); - - void showRobotExtractor(JFrame owner); - - void showNewBattleDialog(BattleProperties battleProperties); - - boolean closeRobocodeEditor(); - - void showCreateTeamDialog(); - - void showImportRobotDialog(); - - void showSaveResultsDialog(BattleResultsTableModel tableModel); - - int getFPS(); -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/ImageManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/ImageManager.java deleted file mode 100644 index 2482c80..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/ImageManager.java +++ /dev/null @@ -1,236 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.gfx.ImageUtil; -import net.sf.robocode.ui.gfx.RenderImage; - -import java.awt.*; -import java.util.*; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Titus Chen (contributor) - */ -public class ImageManager implements IImageManager { - - private final ISettingsManager properties; - - private Image[] groundImages; - - private RenderImage[][] explosionRenderImages; - private RenderImage debriseRenderImage; - - private Image bodyImage; - private Image gunImage; - private Image radarImage; - - private static final int MAX_NUM_COLORS = 256; - - private HashMap robotBodyImageCache; - private HashMap robotGunImageCache; - private HashMap robotRadarImageCache; - - public ImageManager(ISettingsManager properties) { - this.properties = properties; - } - - public void initialize() { - // Note that initialize could be called in order to reset all images (image buffering) - - // Reset image cache - groundImages = new Image[5]; - explosionRenderImages = null; - debriseRenderImage = null; - bodyImage = null; - gunImage = null; - radarImage = null; - robotBodyImageCache = new RenderCache(); - robotGunImageCache = new RenderCache(); - robotRadarImageCache = new RenderCache(); - - // Read images into the cache - getBodyImage(); - getGunImage(); - getRadarImage(); - getExplosionRenderImage(0, 0); - } - - public Image getGroundTileImage(int index) { - if (groundImages[index] == null) { - groundImages[index] = getImage("/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_" + index + ".png"); - } - return groundImages[index]; - } - - public RenderImage getExplosionRenderImage(int which, int frame) { - if (explosionRenderImages == null) { - int numExplosion, numFrame; - String filename; - - List> explosions = new ArrayList>(); - - boolean done = false; - - for (numExplosion = 1; !done; numExplosion++) { - List frames = new ArrayList(); - - for (numFrame = 1;; numFrame++) { - filename = "/net/sf/robocode/ui/images/explosion/explosion" + numExplosion + '-' + numFrame + ".png"; - - if (ImageManager.class.getResource(filename) == null) { - if (numFrame == 1) { - done = true; - } else { - explosions.add(frames); - } - break; - } - - frames.add(new RenderImage(getImage(filename))); - } - } - - numExplosion = explosions.size(); - explosionRenderImages = new RenderImage[numExplosion][]; - - for (int i = numExplosion - 1; i >= 0; i--) { - explosionRenderImages[i] = explosions.get(i).toArray(new RenderImage[explosions.size()]); - } - } - return explosionRenderImages[which][frame]; - } - - public RenderImage getExplosionDebriseRenderImage() { - if (debriseRenderImage == null) { - debriseRenderImage = new RenderImage(getImage("/net/sf/robocode/ui/images/ground/explode_debris.png")); - } - return debriseRenderImage; - } - - private Image getImage(String filename) { - Image image = ImageUtil.getImage(filename); - - if (properties.getOptionsRenderingBufferImages()) { - image = ImageUtil.getBufferedImage(image); - } - return image; - } - - /** - * Gets the body image - * Loads from disk if necessary. - * - * @return the body image - */ - private Image getBodyImage() { - if (bodyImage == null) { - bodyImage = getImage("/net/sf/robocode/ui/images/body.png"); - } - return bodyImage; - } - - /** - * Gets the gun image - * Loads from disk if necessary. - * - * @return the gun image - */ - private Image getGunImage() { - if (gunImage == null) { - gunImage = getImage("/net/sf/robocode/ui/images/turret.png"); - } - return gunImage; - } - - /** - * Gets the radar image - * Loads from disk if necessary. - * - * @return the radar image - */ - private Image getRadarImage() { - if (radarImage == null) { - radarImage = getImage("/net/sf/robocode/ui/images/radar.png"); - } - return radarImage; - } - - public RenderImage getColoredBodyRenderImage(Integer color) { - RenderImage img = robotBodyImageCache.get(color); - - if (img == null) { - img = new RenderImage(ImageUtil.createColouredRobotImage(getBodyImage(), new Color(color, true))); - robotBodyImageCache.put(color, img); - } - return img; - } - - public RenderImage getColoredGunRenderImage(Integer color) { - RenderImage img = robotGunImageCache.get(color); - - if (img == null) { - img = new RenderImage(ImageUtil.createColouredRobotImage(getGunImage(), new Color(color, true))); - robotGunImageCache.put(color, img); - } - return img; - } - - public RenderImage getColoredRadarRenderImage(Integer color) { - RenderImage img = robotRadarImageCache.get(color); - - if (img == null) { - img = new RenderImage(ImageUtil.createColouredRobotImage(getRadarImage(), new Color(color, true))); - robotRadarImageCache.put(color, img); - } - return img; - } - - /** - * Class used for caching rendered robot parts in various colors. - * - * @author Titus Chen - */ - @SuppressWarnings("serial") - private static class RenderCache extends LinkedHashMap { - - /* Note about initial capacity: - * To avoid rehashing (inefficient though probably unavoidable), initial - * capacity must be at least 1 greater than the maximum capacity. - * However, initial capacities are set to the smallest power of 2 greater - * than or equal to the passed argument, resulting in 512 with this code. - * I was not aware of this before, but notice: the current implementation - * behaves similarly. The simple solution would be to set maximum capacity - * to 255, but the problem with doing so is that in a battle of 256 robots - * of different colors, the net result would end up being real-time - * rendering due to the nature of access ordering. However, 256 robot - * battles are rarely fought. - */ - private static final int INITIAL_CAPACITY = MAX_NUM_COLORS + 1; - - private static final float LOAD_FACTOR = 1; - - public RenderCache() { - - /* The "true" parameter needed for access-order: - * when cache fills, the least recently accessed entry is removed - */ - super(INITIAL_CAPACITY, LOAD_FACTOR, true); - } - - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > MAX_NUM_COLORS; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/Module.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/Module.java deleted file mode 100644 index 3d20542..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/Module.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.core.BaseModule; -import net.sf.robocode.core.Container; -import net.sf.robocode.ui.battleview.BattleView; -import net.sf.robocode.ui.battleview.InteractiveHandler; -import net.sf.robocode.ui.dialog.*; -import net.sf.robocode.ui.packager.RobotPackager; - - -/** - * @author Pavel Savara (original) - */ -public class Module extends BaseModule { - static { - Container.cache.addComponent(AboutBox.class); - Container.cache.addComponent(BattleButton.class); - Container.cache.addComponent(BattleView.class); - Container.cache.addComponent(BattleDialog.class); - Container.cache.addComponent(IImageManager.class, ImageManager.class); - Container.cache.addComponent(IRobotDialogManager.class, RobotDialogManager.class); - Container.cache.addComponent(IWindowManagerExt.class, WindowManager.class); - Container.cache.addComponent(InteractiveHandler.class); - Container.cache.addComponent(PreferencesDialog.class); - Container.cache.addComponent(RankingDialog.class); - Container.cache.addComponent(RcSplashScreen.class); - Container.cache.addComponent(ResultsDialog.class); - Container.cache.addComponent(MenuBar.class); - Container.cache.addComponent(TeamCreator.class); - Container.cache.addComponent(RobocodeFrame.class); - - // new instance for every lookup - Container.factory.addComponent(RobotSelectionPanel.class); - Container.factory.addComponent(RobotDialog.class); - Container.factory.addComponent(RobotButton.class); - Container.factory.addComponent(RobotPackager.class); - Container.factory.addComponent(NewBattleDialog.class); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/RobotDialogManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/RobotDialogManager.java deleted file mode 100644 index ad8ea5c..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/RobotDialogManager.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.ui.dialog.*; -import robocode.control.snapshot.IRobotSnapshot; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - - -/** - * @author Mathew A. Nelson (orinal) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -public class RobotDialogManager implements IRobotDialogManager { - - public static final int MAX_PRE_ATTACHED = 25; - - private final Map robotDialogMap = new ConcurrentHashMap(); - private BattleDialog battleDialog = null; - - public RobotDialogManager() { - super(); - } - - public void trim(List robots) { - - // new ArrayList in order to prevent ConcurrentModificationException - for (String name : new ArrayList(robotDialogMap.keySet())) { - boolean found = false; - - for (IRobotSnapshot robot : robots) { - if (robot.getName().equals(name)) { - found = true; - break; - } - } - if (!found) { - RobotDialog dialog = robotDialogMap.get(name); - - robotDialogMap.remove(name); - dialog.dispose(); - dialog.detach(); - } - } - } - - public void reset() { - for (String name : robotDialogMap.keySet()) { - RobotDialog dialog = robotDialogMap.get(name); - - if (!dialog.isVisible()) { - robotDialogMap.remove(name); - dialog.detach(); - dialog.dispose(); - } - } - } - - public RobotDialog getRobotDialog(RobotButton robotButton, String name, boolean create) { - RobotDialog robotDialog = robotDialogMap.get(name); - - if (create && robotDialog == null) { - if (robotDialogMap.size() > MAX_PRE_ATTACHED) { - reset(); - } - robotDialog = Container.createComponent(RobotDialog.class); - robotDialog.setup(robotButton); - robotDialog.pack(); - WindowUtil.place(robotDialog); - robotDialogMap.put(name, robotDialog); - } - return robotDialog; - } - - public BattleDialog getBattleDialog(BattleButton battleButton, boolean create) { - - if (create && battleDialog == null) { - battleDialog = Container.getComponent(BattleDialog.class); - battleDialog.pack(); - WindowUtil.place(battleDialog); - } - return battleDialog; - } - -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/WindowManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/WindowManager.java deleted file mode 100644 index bbdae95..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/WindowManager.java +++ /dev/null @@ -1,632 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui; - - -import net.sf.robocode.battle.BattleProperties; -import net.sf.robocode.battle.BattleResultsTableModel; -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.core.Container; -import net.sf.robocode.host.ICpuManager; -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.battle.AwtBattleAdaptor; -import net.sf.robocode.ui.dialog.*; -import net.sf.robocode.ui.packager.RobotPackager; -import net.sf.robocode.ui.editor.IRobocodeEditor; -import net.sf.robocode.version.IVersionManager; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.IBattleListener; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; -import javax.swing.filechooser.FileFilter; -import java.awt.*; -import java.io.File; -import java.io.IOException; -import java.util.Locale; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Luis Crespo (contributor) - */ -public class WindowManager implements IWindowManagerExt { - - private final static int TIMER_TICKS_PER_SECOND = 50; - private final AwtBattleAdaptor awtAdaptor; - private RobotPackager robotPackager; - private RobotExtractor robotExtractor; - private final ISettingsManager settingsManager; - private final IBattleManager battleManager; - private final ICpuManager cpuManager; - private final IRepositoryManager repositoryManager; - private final IVersionManager versionManager; - private final IImageManager imageManager; - private IRobotDialogManager robotDialogManager; - private RobocodeFrame robocodeFrame; - - private boolean isGUIEnabled = true; - private boolean isSlave; - private boolean centerRankings = true; - private boolean oldRankingHideState = true; - private boolean showResults = true; - - public WindowManager(ISettingsManager settingsManager, IBattleManager battleManager, ICpuManager cpuManager, IRepositoryManager repositoryManager, IImageManager imageManager, IVersionManager versionManager) { - this.settingsManager = settingsManager; - this.battleManager = battleManager; - this.repositoryManager = repositoryManager; - this.cpuManager = cpuManager; - this.versionManager = versionManager; - this.imageManager = imageManager; - awtAdaptor = new AwtBattleAdaptor(battleManager, TIMER_TICKS_PER_SECOND, true); - - // we will set UI better priority than robots and battle have - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - Thread.currentThread().setPriority(Thread.NORM_PRIORITY + 2); - } catch (SecurityException ex) {// that's a pity - } - } - }); - } - - public void setBusyPointer(boolean enabled) { - robocodeFrame.setBusyPointer(enabled); - } - - public synchronized void addBattleListener(IBattleListener listener) { - awtAdaptor.addListener(listener); - } - - public synchronized void removeBattleListener(IBattleListener listener) { - awtAdaptor.removeListener(listener); - } - - public boolean isGUIEnabled() { - return isGUIEnabled; - } - - public void setEnableGUI(boolean enable) { - isGUIEnabled = enable; - - // Set the system property so the AWT headless mode. - // Read more about headless mode here: - // http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ - System.setProperty("java.awt.headless", "" + !enable); - } - - public void setSlave(boolean value) { - isSlave = value; - } - - public boolean isSlave() { - return isSlave; - } - - public boolean isIconified() { - return robocodeFrame.isIconified(); - } - - public boolean isShowResultsEnabled() { - return settingsManager.getOptionsCommonShowResults() && showResults; - } - - public void setEnableShowResults(boolean enable) { - showResults = enable; - } - - public ITurnSnapshot getLastSnapshot() { - return awtAdaptor.getLastSnapshot(); - } - - public int getFPS() { - return isIconified() ? 0 : awtAdaptor.getFPS(); - } - - public RobocodeFrame getRobocodeFrame() { - if (robocodeFrame == null) { - this.robocodeFrame = Container.getComponent(RobocodeFrame.class); - } - return robocodeFrame; - } - - public void showRobocodeFrame(boolean visible, boolean iconified) { - RobocodeFrame frame = getRobocodeFrame(); - - if (iconified) { - frame.setState(Frame.ICONIFIED); - } - - if (visible) { - // Pack frame to size all components - WindowUtil.packCenterShow(frame); - - WindowUtil.setStatusLabel(frame.getStatusLabel()); - - frame.checkUpdateOnStart(); - - } else { - frame.setVisible(false); - } - } - - public void showAboutBox() { - packCenterShow(Container.getComponent(AboutBox.class), true); - } - - public String showBattleOpenDialog(final String defExt, final String name) { - JFileChooser chooser = new JFileChooser(battleManager.getBattlePath()); - - chooser.setFileFilter( - new FileFilter() { - @Override - public boolean accept(File pathname) { - return pathname.isDirectory() - || pathname.getName().toLowerCase().lastIndexOf(defExt.toLowerCase()) - == pathname.getName().length() - defExt.length(); - } - - @Override - public String getDescription() { - return name; - } - }); - - if (chooser.showOpenDialog(getRobocodeFrame()) == JFileChooser.APPROVE_OPTION) { - return chooser.getSelectedFile().getPath(); - } - return null; - } - - public String saveBattleDialog(String path, final String defExt, final String name) { - File f = new File(path); - - JFileChooser chooser; - - chooser = new JFileChooser(f); - - javax.swing.filechooser.FileFilter filter = new javax.swing.filechooser.FileFilter() { - @Override - public boolean accept(File pathname) { - return pathname.isDirectory() - || pathname.getName().toLowerCase().lastIndexOf(defExt.toLowerCase()) - == pathname.getName().length() - defExt.length(); - } - - @Override - public String getDescription() { - return name; - } - }; - - chooser.setFileFilter(filter); - int rv = chooser.showSaveDialog(getRobocodeFrame()); - String result = null; - - if (rv == JFileChooser.APPROVE_OPTION) { - result = chooser.getSelectedFile().getPath(); - int idx = result.lastIndexOf('.'); - String extension = ""; - - if (idx > 0) { - extension = result.substring(idx); - } - if (!(extension.equalsIgnoreCase(defExt))) { - result += defExt; - } - } - return result; - } - - public void showVersionsTxt() { - showInBrowser("file://" + new File(FileUtil.getCwd(), "").getAbsoluteFile() + File.separator + "versions.md"); - } - - public void showHelpApi() { - showInBrowser( - "file://" + new File(FileUtil.getCwd(), "").getAbsoluteFile() + File.separator + "javadoc" + File.separator - + "index.html"); - } - - public void showReadMe() { - showInBrowser("file://" + new File(FileUtil.getCwd(), "ReadMe.html").getAbsoluteFile()); - } - - public void showFaq() { - showInBrowser("http://robowiki.net/w/index.php?title=Robocode/FAQ"); - } - - public void showOnlineHelp() { - showInBrowser("http://robowiki.net/w/index.php?title=Robocode/Getting_Started"); - } - - public void showJavaDocumentation() { - showInBrowser("http://docs.oracle.com/javase/6/docs/api/"); - } - - public void showRobocodeHome() { - showInBrowser("http://robocode.sourceforge.net"); - } - - public void showRoboWiki() { - showInBrowser("http://robowiki.net"); - } - - public void showGoogleGroupRobocode() { - showInBrowser("https://groups.google.com/forum/?fromgroups#!forum/robocode"); - } - - public void showRobocodeRepository() { - showInBrowser("http://robocoderepository.com"); - } - - public void showOptionsPreferences() { - try { - battleManager.pauseBattle(); - - WindowUtil.packCenterShow(getRobocodeFrame(), Container.getComponent(PreferencesDialog.class)); - } finally { - battleManager.resumeIfPausedBattle(); // THIS is just dirty hack-fix of more complex problem with desiredTPS and pausing. resumeBattle() belongs here. - } - } - - public void showResultsDialog(BattleCompletedEvent event) { - final ResultsDialog dialog = Container.getComponent(ResultsDialog.class); - - dialog.setup(event.getSortedResults(), event.getBattleRules().getNumRounds()); - packCenterShow(dialog, true); - } - - public void showRankingDialog(boolean visible) { - boolean currentRankingHideState = settingsManager.getOptionsCommonDontHideRankings(); - - // Check if the Ranking hide states has changed - if (currentRankingHideState != oldRankingHideState) { - // Remove current visible RankingDialog, if it is there - Container.getComponent(RankingDialog.class).dispose(); - - // Replace old RankingDialog, as the owner window must be replaced from the constructor - Container.cache.removeComponent(RankingDialog.class); - Container.cache.addComponent(RankingDialog.class); - - // Reset flag for centering the dialog the first time it is shown - centerRankings = true; - } - - RankingDialog rankingDialog = Container.getComponent(RankingDialog.class); - - if (visible) { - packCenterShow(rankingDialog, centerRankings); - centerRankings = false; // only center the first time Rankings are shown - } else { - rankingDialog.dispose(); - } - - // Save current Ranking hide state - oldRankingHideState = currentRankingHideState; - } - - public void showRobocodeEditor() { - JFrame editor = (JFrame) net.sf.robocode.core.Container.getComponent(IRobocodeEditor.class); - - if (!editor.isVisible()) { - WindowUtil.packCenterShow(editor); - } else { - editor.setVisible(true); - } - } - - public void showRobotPackager() { - if (robotPackager != null) { - robotPackager.dispose(); - robotPackager = null; - } - - robotPackager = net.sf.robocode.core.Container.factory.getComponent(RobotPackager.class); - WindowUtil.packCenterShow(robotPackager); - } - - public void showRobotExtractor(JFrame owner) { - if (robotExtractor != null) { - robotExtractor.dispose(); - robotExtractor = null; - } - - robotExtractor = new net.sf.robocode.ui.dialog.RobotExtractor(owner, this, repositoryManager); - WindowUtil.packCenterShow(robotExtractor); - } - - public void showSplashScreen() { - RcSplashScreen splashScreen = Container.getComponent(RcSplashScreen.class); - - packCenterShow(splashScreen, true); - - WindowUtil.setStatusLabel(splashScreen.getSplashLabel()); - - repositoryManager.reload(versionManager.isLastRunVersionChanged()); - - WindowUtil.setStatusLabel(splashScreen.getSplashLabel()); - cpuManager.getCpuConstant(); - - WindowUtil.setStatus(""); - WindowUtil.setStatusLabel(null); - - splashScreen.dispose(); - } - - public void showNewBattleDialog(BattleProperties battleProperties) { - try { - battleManager.pauseBattle(); - final NewBattleDialog battleDialog = Container.createComponent(NewBattleDialog.class); - - battleDialog.setup(settingsManager, battleProperties); - WindowUtil.packCenterShow(getRobocodeFrame(), battleDialog); - } finally { - battleManager.resumeBattle(); - } - } - - public boolean closeRobocodeEditor() { - IRobocodeEditor editor = net.sf.robocode.core.Container.getComponent(IRobocodeEditor.class); - - return editor == null || !((JFrame) editor).isVisible() || editor.close(); - } - - public void showCreateTeamDialog() { - TeamCreator teamCreator = Container.getComponent(TeamCreator.class); - - WindowUtil.packCenterShow(teamCreator); - } - - public void showImportRobotDialog() { - JFileChooser chooser = new JFileChooser(); - - chooser.setFileFilter(new FileFilter() { - @Override - public boolean accept(File pathname) { - if (pathname.isHidden()) { - return false; - } - if (pathname.isDirectory()) { - return true; - } - String filename = pathname.getName(); - - if (filename.equals("robocode.jar")) { - return false; - } - int idx = filename.lastIndexOf('.'); - - String extension = ""; - - if (idx >= 0) { - extension = filename.substring(idx); - } - return extension.equalsIgnoreCase(".jar") || extension.equalsIgnoreCase(".zip"); - } - - @Override - public String getDescription() { - return "Jar Files"; - } - }); - - chooser.setDialogTitle("Select the robot .jar file to copy to " + repositoryManager.getRobotsDirectory()); - - if (chooser.showDialog(getRobocodeFrame(), "Import") == JFileChooser.APPROVE_OPTION) { - File inputFile = chooser.getSelectedFile(); - String fileName = inputFile.getName(); - String extension = ""; - - int idx = fileName.lastIndexOf('.'); - - if (idx >= 0) { - extension = fileName.substring(idx); - } - if (!extension.equalsIgnoreCase(".jar")) { - fileName += ".jar"; - } - File outputFile = new File(repositoryManager.getRobotsDirectory(), fileName); - - if (inputFile.equals(outputFile)) { - JOptionPane.showMessageDialog(getRobocodeFrame(), - outputFile.getName() + " is already in the robots directory!"); - return; - } - if (outputFile.exists()) { - if (JOptionPane.showConfirmDialog(getRobocodeFrame(), outputFile + " already exists. Overwrite?", - "Warning", JOptionPane.YES_NO_OPTION) - == JOptionPane.NO_OPTION) { - return; - } - } - if (JOptionPane.showConfirmDialog(getRobocodeFrame(), - "Robocode will now copy " + inputFile.getName() + " to " + outputFile.getParent(), "Import robot", - JOptionPane.OK_CANCEL_OPTION) - == JOptionPane.OK_OPTION) { - try { - FileUtil.copy(inputFile, outputFile); - repositoryManager.refresh(); - JOptionPane.showMessageDialog(getRobocodeFrame(), "Robot imported successfully."); - } catch (IOException e) { - JOptionPane.showMessageDialog(getRobocodeFrame(), "Import failed: " + e); - } - } - } - } - - /** - * Shows a web page using the browser manager. - * - * @param url The URL of the web page - */ - private void showInBrowser(String url) { - try { - BrowserManager.openURL(url); - } catch (IOException e) { - JOptionPane.showMessageDialog(getRobocodeFrame(), e.getMessage(), "Unable to open browser!", - JOptionPane.ERROR_MESSAGE); - } - } - - public void showSaveResultsDialog(BattleResultsTableModel tableModel) { - JFileChooser chooser = new JFileChooser(); - - chooser.setFileFilter(new FileFilter() { - - @Override - public boolean accept(File pathname) { - if (pathname.isHidden()) { - return false; - } - if (pathname.isDirectory()) { - return true; - } - String filename = pathname.getName(); - int idx = filename.lastIndexOf('.'); - - String extension = ""; - - if (idx >= 0) { - extension = filename.substring(idx); - } - return extension.equalsIgnoreCase(".csv"); - } - - @Override - public String getDescription() { - return "Comma Separated Value (CSV) File Format"; - } - }); - - chooser.setDialogTitle("Save battle results"); - - if (chooser.showSaveDialog(getRobocodeFrame()) == JFileChooser.APPROVE_OPTION) { - - String filename = chooser.getSelectedFile().getPath(); - - if (!filename.endsWith(".csv")) { - filename += ".csv"; - } - - boolean append = settingsManager.getOptionsCommonAppendWhenSavingResults(); - - tableModel.saveToFile(filename, append); - } - } - - /** - * Packs, centers, and shows the specified window on the screen. - * @param window the window to pack, center, and show - * @param center {@code true} if the window must be centered; {@code false} otherwise - */ - private void packCenterShow(Window window, boolean center) { - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - window.pack(); - if (center) { - window.setLocation((screenSize.width - window.getWidth()) / 2, (screenSize.height - window.getHeight()) / 2); - } - window.setVisible(true); - } - - public void cleanup() { - if (isGUIEnabled()) { - getRobocodeFrame().dispose(); - } - } - - public void setStatus(String s) { - WindowUtil.setStatus(s); - } - - public void messageWarning(String s) { - WindowUtil.messageWarning(s); - } - - public IRobotDialogManager getRobotDialogManager() { - if (robotDialogManager == null) { - robotDialogManager = new RobotDialogManager(); - } - return robotDialogManager; - } - - public void init() { - setLookAndFeel(); - imageManager.initialize(); // Make sure this one is initialized so all images are available - awtAdaptor.subscribe(isGUIEnabled); - } - - /** - * Sets the Look and Feel (LAF). This method first try to set the LAF to the - * system's LAF. If this fails, it try to use the cross platform LAF. - * If this also fails, the LAF will not be changed. - */ - private void setLookAndFeel() { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (RuntimeException t) { - // Work-around for problems with setting Look and Feel described here: - // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6468089 - Locale.setDefault(Locale.US); - - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (RuntimeException t2) { - // For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF - System.err.println("Could not set the Look and Feel (LAF). The default LAF is used instead"); - } - } - // Java 1.6 provide system specific anti-aliasing. Enable it, if it has not been set - if (new Double(System.getProperty("java.specification.version")) >= 1.6) { - String aaFontSettings = System.getProperty("awt.useSystemAAFontSettings"); - - if (aaFontSettings == null) { - System.setProperty("awt.useSystemAAFontSettings", "on"); - } - } - } - - public void runIntroBattle() { - final File intro = new File(FileUtil.getCwd(), "battles/intro.battle"); - if (intro.exists()) { - battleManager.setBattleFilename(intro.getPath()); - battleManager.loadBattleProperties(); - - final boolean origShowResults = showResults; // save flag for showing the results - - showResults = false; - try { - battleManager.startNewBattle(battleManager.loadBattleProperties(), true, false); - battleManager.setDefaultBattleProperties(); - robocodeFrame.afterIntroBattle(); - } finally { - showResults = origShowResults; // always restore the original flag for showing the results - } - } - } - - public void setVisibleForRobotEngine(boolean visible) { - if (visible && !isGUIEnabled()) { - // The GUI must be enabled in order to show the window - setEnableGUI(true); - - // Set the Look and Feel (LAF) - init(); - } - - if (isGUIEnabled()) { - showRobocodeFrame(visible, false); - showResults = visible; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battle/AwtBattleAdaptor.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battle/AwtBattleAdaptor.java deleted file mode 100644 index 11436ae..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battle/AwtBattleAdaptor.java +++ /dev/null @@ -1,335 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.battle; - - -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.battle.events.BattleEventDispatcher; -import net.sf.robocode.battle.snapshot.RobotSnapshot; -import net.sf.robocode.io.Logger; -import robocode.control.events.*; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.atomic.AtomicInteger; - - -/** - * @author Pavel Savara (original) - */ -public final class AwtBattleAdaptor { - private boolean isEnabled; - private final IBattleManager battleManager; - private final BattleEventDispatcher battleEventDispatcher = new BattleEventDispatcher(); - private final BattleObserver observer; - private final Timer timerTask; - - private final AtomicReference snapshot; - private final AtomicBoolean isRunning; - private final AtomicBoolean isPaused; - private final AtomicInteger majorEvent; - private final AtomicInteger lastMajorEvent; - private ITurnSnapshot lastSnapshot; - private StringBuilder[] outCache; - - public AwtBattleAdaptor(IBattleManager battleManager, int maxFps, boolean skipSameFrames) { - this.battleManager = battleManager; - snapshot = new AtomicReference(null); - - this.skipSameFrames = skipSameFrames; - timerTask = new Timer(1000 / maxFps, new TimerTask()); - isRunning = new AtomicBoolean(false); - isPaused = new AtomicBoolean(false); - majorEvent = new AtomicInteger(0); - lastMajorEvent = new AtomicInteger(0); - - observer = new BattleObserver(); - } - - protected void finalize() throws Throwable { - try { - timerTask.stop(); - battleManager.removeListener(observer); - } finally { - super.finalize(); - } - } - - public void subscribe(boolean isEnabled) { - if (this.isEnabled && !isEnabled) { - battleManager.removeListener(observer); - timerTask.stop(); - isEnabled = false; - } else if (!this.isEnabled && isEnabled) { - battleManager.addListener(observer); - isEnabled = true; - } - } - - public synchronized void addListener(IBattleListener listener) { - battleEventDispatcher.addListener(listener); - } - - public synchronized void removeListener(IBattleListener listener) { - battleEventDispatcher.removeListener(listener); - } - - public ITurnSnapshot getLastSnapshot() { - return lastSnapshot; - } - - // this is always dispatched on AWT thread - private void awtOnTurnEnded(boolean forceRepaint, boolean readoutText) { - try { - ITurnSnapshot current = snapshot.get(); - - if (current == null) { // !isRunning.get() || - // paint logo - lastSnapshot = null; - battleEventDispatcher.onTurnEnded(new TurnEndedEvent(null)); - } else { - if (lastSnapshot != current || !skipSameFrames || forceRepaint) { - lastSnapshot = current; - - IRobotSnapshot[] robots = null; - - if (readoutText) { - synchronized (snapshot) { - robots = lastSnapshot.getRobots(); - - for (int i = 0; i < robots.length; i++) { - RobotSnapshot robot = (RobotSnapshot) robots[i]; - - final StringBuilder cache = outCache[i]; - - if (cache.length() > 0) { - robot.setOutputStreamSnapshot(cache.toString()); - outCache[i].setLength(0); - } - } - } - } - - battleEventDispatcher.onTurnEnded(new TurnEndedEvent(lastSnapshot)); - - if (readoutText) { - for (IRobotSnapshot robot : robots) { - ((RobotSnapshot) robot).setOutputStreamSnapshot(null); - } - } - - calculateFPS(); - } - } - } catch (RuntimeException t) { - Logger.logError(t); - } - } - - public int getFPS() { - return fps; - } - - // FPS (frames per second) calculation - private int fps; - private long measuredFrameCounter; - private long measuredFrameStartTime; - private final boolean skipSameFrames; - - private void calculateFPS() { - // Calculate the current frames per second (FPS) - - if (measuredFrameCounter++ == 0) { - measuredFrameStartTime = System.nanoTime(); - } - - long deltaTime = System.nanoTime() - measuredFrameStartTime; - - if (deltaTime / 1000000000 >= 1) { - fps = (int) (measuredFrameCounter * 1000000000L / deltaTime); - measuredFrameCounter = 0; - } - } - - private class TimerTask implements ActionListener { - public void actionPerformed(ActionEvent e) { - awtOnTurnEnded(false, true); - } - } - - - // BattleObserver methods are always called by battle thread - // but everything inside invokeLater {} block in on AWT thread - private class BattleObserver extends BattleAdaptor { - - @Override - public void onTurnEnded(final TurnEndedEvent event) { - if (lastMajorEvent.get() == majorEvent.get()) { - // snapshot is updated out of order, but always within the same major event - snapshot.set(event.getTurnSnapshot()); - } - - final IRobotSnapshot[] robots = event.getTurnSnapshot().getRobots(); - - for (int i = 0; i < robots.length; i++) { - RobotSnapshot robot = (RobotSnapshot) robots[i]; - final int r = i; - final String text = robot.getOutputStreamSnapshot(); - - if (text != null && text.length() != 0) { - robot.setOutputStreamSnapshot(null); - EventQueue.invokeLater(new Runnable() { - public void run() { - synchronized (snapshot) { - outCache[r].append(text); - } - } - }); - } - } - if (isPaused.get()) { - EventQueue.invokeLater(new Runnable() { - public void run() { - awtOnTurnEnded(false, true); - } - }); - } - } - - @Override - public void onRoundStarted(final RoundStartedEvent event) { - if (lastMajorEvent.get() == majorEvent.get()) { - snapshot.set(event.getStartSnapshot()); - } - majorEvent.incrementAndGet(); - EventQueue.invokeLater(new Runnable() { - public void run() { - awtOnTurnEnded(true, false); - battleEventDispatcher.onRoundStarted(event); - lastMajorEvent.incrementAndGet(); - } - }); - } - - @Override - public void onBattleStarted(final BattleStartedEvent event) { - majorEvent.incrementAndGet(); - EventQueue.invokeLater(new Runnable() { - public void run() { - isRunning.set(true); - isPaused.set(false); - synchronized (snapshot) { - outCache = new StringBuilder[event.getRobotsCount()]; - for (int i = 0; i < event.getRobotsCount(); i++) { - outCache[i] = new StringBuilder(1024); - } - } - snapshot.set(null); - battleEventDispatcher.onBattleStarted(event); - lastMajorEvent.incrementAndGet(); - awtOnTurnEnded(true, false); - timerTask.start(); - } - }); - } - - @Override - public void onBattleFinished(final BattleFinishedEvent event) { - majorEvent.incrementAndGet(); - EventQueue.invokeLater(new Runnable() { - public void run() { - isRunning.set(false); - isPaused.set(false); - timerTask.stop(); - // flush text cache - awtOnTurnEnded(true, true); - - battleEventDispatcher.onBattleFinished(event); - lastMajorEvent.incrementAndGet(); - snapshot.set(null); - - // paint logo - awtOnTurnEnded(true, true); - } - }); - } - - @Override - public void onBattleCompleted(final BattleCompletedEvent event) { - majorEvent.incrementAndGet(); - EventQueue.invokeLater(new Runnable() { - public void run() { - battleEventDispatcher.onBattleCompleted(event); - lastMajorEvent.incrementAndGet(); - awtOnTurnEnded(true, true); - } - }); - } - - @Override - public void onRoundEnded(final RoundEndedEvent event) { - majorEvent.incrementAndGet(); - EventQueue.invokeLater(new Runnable() { - public void run() { - battleEventDispatcher.onRoundEnded(event); - lastMajorEvent.incrementAndGet(); - awtOnTurnEnded(true, true); - } - }); - } - - @Override - public void onBattlePaused(final BattlePausedEvent event) { - EventQueue.invokeLater(new Runnable() { - public void run() { - timerTask.stop(); - battleEventDispatcher.onBattlePaused(event); - awtOnTurnEnded(true, true); - isPaused.set(true); - } - }); - } - - @Override - public void onBattleResumed(final BattleResumedEvent event) { - EventQueue.invokeLater(new Runnable() { - public void run() { - battleEventDispatcher.onBattleResumed(event); - if (isRunning.get()) { - timerTask.start(); - isPaused.set(false); - } - } - }); - } - - @Override - public void onBattleMessage(final BattleMessageEvent event) { - EventQueue.invokeLater(new Runnable() { - public void run() { - battleEventDispatcher.onBattleMessage(event); - } - }); - } - - @Override - public void onBattleError(final BattleErrorEvent event) { - EventQueue.invokeLater(new Runnable() { - public void run() { - battleEventDispatcher.onBattleError(event); - } - }); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleField.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleField.java deleted file mode 100644 index e9781f1..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleField.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.battleview; - - -import net.sf.robocode.battle.BoundingRectangle; - -import java.io.Serializable; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (original) - */ -public class BattleField implements Serializable { - private static final long serialVersionUID = 1L; - - private final BoundingRectangle boundingBox; - - public BattleField(int width, int height) { - super(); - this.boundingBox = new BoundingRectangle(0, 0, width, height); - } - - public BoundingRectangle getBoundingBox() { - return boundingBox; - } - - public int getWidth() { - return (int) boundingBox.width; - } - - public void setWidth(int newWidth) { - boundingBox.width = newWidth; - } - - public int getHeight() { - return (int) boundingBox.height; - } - - public void setHeight(int newHeight) { - boundingBox.height = newHeight; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleView.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleView.java deleted file mode 100644 index aebdf06..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/BattleView.java +++ /dev/null @@ -1,698 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.battleview; - - -import net.sf.robocode.battle.snapshot.RobotSnapshot; -import net.sf.robocode.robotpaint.Graphics2DSerialized; -import net.sf.robocode.robotpaint.IGraphicsProxy; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.settings.ISettingsListener; -import net.sf.robocode.ui.IImageManager; -import net.sf.robocode.ui.IWindowManager; -import net.sf.robocode.ui.IWindowManagerExt; -import net.sf.robocode.ui.gfx.GraphicsState; -import net.sf.robocode.ui.gfx.RenderImage; -import net.sf.robocode.ui.gfx.RobocodeLogo; -import robocode.BattleRules; -import robocode.control.events.BattleAdaptor; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.BattleStartedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IBulletSnapshot; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.geom.*; -import java.awt.image.BufferStrategy; -import java.awt.image.BufferedImage; -import static java.lang.Math.*; -import java.util.Random; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (original) - * @author Pavel Savara (contributor) - */ -@SuppressWarnings("serial") -public class BattleView extends Canvas { - - private final static String ROBOCODE_SLOGAN = "Build the best, destroy the rest!"; - - private final static Color CANVAS_BG_COLOR = SystemColor.controlDkShadow; - - private final static Area BULLET_AREA = new Area(new Ellipse2D.Double(-0.5, -0.5, 1, 1)); - - private final static int ROBOT_TEXT_Y_OFFSET = 24; - - private BattleRules battleRules; - - // The battle and battlefield, - private BattleField battleField; - - private boolean initialized; - private double scale = 1.0; - - // Ground - private int[][] groundTiles; - - private final int groundTileWidth = 64; - private final int groundTileHeight = 64; - - private Image groundImage; - - // Draw option related things - private boolean drawRobotName; - private boolean drawRobotEnergy; - private boolean drawScanArcs; - private boolean drawExplosions; - private boolean drawGround; - private boolean drawExplosionDebris; - - private int numBuffers = 2; // defaults to double buffering - - private RenderingHints renderingHints; - - // Fonts and the like - private Font smallFont; - private FontMetrics smallFontMetrics; - - private final IImageManager imageManager; - private final ISettingsManager properties; - private final IWindowManagerExt windowManager; - - private BufferStrategy bufferStrategy; - - private final GeneralPath robocodeTextPath = new RobocodeLogo().getRobocodeText(); - - private static final MirroredGraphics mirroredGraphics = new MirroredGraphics(); - - private final GraphicsState graphicsState = new GraphicsState(); - private IGraphicsProxy[] robotGraphics; - - public BattleView(ISettingsManager properties, IWindowManager windowManager, IImageManager imageManager) { - this.properties = properties; - this.windowManager = (IWindowManagerExt) windowManager; - this.imageManager = imageManager; - - battleField = new BattleField(800, 600); - - new BattleObserver(windowManager); - - properties.addPropertyListener(new ISettingsListener() { - public void settingChanged(String property) { - loadDisplayOptions(); - if (property.startsWith("robocode.options.rendering")) { - initialized = false; - reinitialize(); - } - } - }); - - addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent e) { - initialized = false; - reinitialize(); - } - }); - } - - @Override - public void update(Graphics g) { - paint(g); - } - - @Override - public void paint(Graphics g) { - final ITurnSnapshot lastSnapshot = windowManager.getLastSnapshot(); - if (lastSnapshot != null) { - update(lastSnapshot); - } else { - paintRobocodeLogo((Graphics2D) g); - } - } - - public BufferedImage getScreenshot() { - BufferedImage screenshot = getGraphicsConfiguration().createCompatibleImage(getWidth(), getHeight()); - - if (windowManager.getLastSnapshot() == null) { - paintRobocodeLogo((Graphics2D) screenshot.getGraphics()); - } else { - drawBattle((Graphics2D) screenshot.getGraphics(), windowManager.getLastSnapshot()); - } - return screenshot; - } - - private void update(ITurnSnapshot snapshot) { - if (!initialized) { - initialize(); - } - - if (windowManager.isIconified() || !isDisplayable() || (getWidth() <= 0) || (getHeight() <= 0)) { - return; - } - - if (bufferStrategy != null) { - try { - Graphics2D g2 = (Graphics2D) bufferStrategy.getDrawGraphics(); - - if (g2 != null) { - do { - try { - g2.setRenderingHints(renderingHints); - - drawBattle(g2, snapshot); - } finally { - g2.dispose(); - } - bufferStrategy.show(); - } while (bufferStrategy.contentsLost()); - - Toolkit.getDefaultToolkit().sync(); // Update like... now! - } - } catch (NullPointerException e) {} - } - } - - private void loadDisplayOptions() { - ISettingsManager props = properties; - - drawRobotName = props.getOptionsViewRobotNames(); - drawRobotEnergy = props.getOptionsViewRobotEnergy(); - drawScanArcs = props.getOptionsViewScanArcs(); - drawGround = props.getOptionsViewGround(); - drawExplosions = props.getOptionsViewExplosions(); - drawExplosionDebris = props.getOptionsViewExplosionDebris(); - - renderingHints = props.getRenderingHints(); - numBuffers = props.getOptionsRenderingNoBuffers(); - } - - private void reinitialize() { - initialized = false; - bufferStrategy = null; - } - - private void initialize() { - loadDisplayOptions(); - - if (bufferStrategy == null) { - createBufferStrategy(numBuffers); - bufferStrategy = getBufferStrategy(); - } - - // If we are scaled... - if (getWidth() < battleField.getWidth() || getHeight() < battleField.getHeight()) { - // Use the smaller scale. - // Actually we don't need this, since - // the RobocodeFrame keeps our aspect ratio intact. - - scale = min((double) getWidth() / battleField.getWidth(), (double) getHeight() / battleField.getHeight()); - } else { - scale = 1; - } - - // Scale font - smallFont = new Font("Dialog", Font.PLAIN, (int) (10 / scale)); - smallFontMetrics = bufferStrategy.getDrawGraphics().getFontMetrics(); - - // Initialize ground image - if (drawGround) { - createGroundImage(); - } else { - groundImage = null; - } - - initialized = true; - } - - private void createGroundImage() { - // Reinitialize ground tiles - - Random r = new Random(); // independent - - final int NUM_HORZ_TILES = battleField.getWidth() / groundTileWidth + 1; - final int NUM_VERT_TILES = battleField.getHeight() / groundTileHeight + 1; - - if ((groundTiles == null) || (groundTiles.length != NUM_VERT_TILES) || (groundTiles[0].length != NUM_HORZ_TILES)) { - - groundTiles = new int[NUM_VERT_TILES][NUM_HORZ_TILES]; - for (int y = NUM_VERT_TILES - 1; y >= 0; y--) { - for (int x = NUM_HORZ_TILES - 1; x >= 0; x--) { - groundTiles[y][x] = (int) round(r.nextDouble() * 4); - } - } - } - - // Create new buffered image with the ground pre-rendered - - int groundWidth = (int) (battleField.getWidth() * scale); - int groundHeight = (int) (battleField.getHeight() * scale); - - groundImage = new BufferedImage(groundWidth, groundHeight, BufferedImage.TYPE_INT_RGB); - - Graphics2D groundGfx = (Graphics2D) groundImage.getGraphics(); - - groundGfx.setRenderingHints(renderingHints); - - groundGfx.setTransform(AffineTransform.getScaleInstance(scale, scale)); - - for (int y = NUM_VERT_TILES - 1; y >= 0; y--) { - for (int x = NUM_HORZ_TILES - 1; x >= 0; x--) { - Image img = imageManager.getGroundTileImage(groundTiles[y][x]); - - if (img != null) { - groundGfx.drawImage(img, x * groundTileWidth, y * groundTileHeight, null); - } - } - } - } - - private void drawBattle(Graphics2D g, ITurnSnapshot snapShot) { - // Save the graphics state - graphicsState.save(g); - - // Reset transform - g.setTransform(new AffineTransform()); - - // Reset clip - g.setClip(null); - - // Clear canvas - g.setColor(CANVAS_BG_COLOR); - g.fillRect(0, 0, getWidth(), getHeight()); - - // Calculate border space - double dx = (getWidth() - scale * battleField.getWidth()) / 2; - double dy = (getHeight() - scale * battleField.getHeight()) / 2; - - // Scale and translate the graphics - AffineTransform at = AffineTransform.getTranslateInstance(dx, dy); - - at.concatenate(AffineTransform.getScaleInstance(scale, scale)); - g.setTransform(at); - - // Set the clip rectangle - g.setClip(0, 0, battleField.getWidth(), battleField.getHeight()); - - // Draw ground - drawGround(g); - - if (snapShot != null) { - // Draw scan arcs - drawScanArcs(g, snapShot); - - // Draw robots - drawRobots(g, snapShot); - - // Draw robot (debug) paintings - drawRobotPaint(g, snapShot); - } - - // Draw the border of the battlefield - drawBorderEdge(g); - - if (snapShot != null) { - // Draw all bullets - drawBullets(g, snapShot); - - // Draw all text - drawText(g, snapShot); - } - - // Restore the graphics state - graphicsState.restore(g); - } - - private void drawGround(Graphics2D g) { - if (drawGround) { - // Create pre-rendered ground image if it is not available - if (groundImage == null) { - createGroundImage(); - } - // Draw the pre-rendered ground if it is available - if (groundImage != null) { - int groundWidth = (int) (battleField.getWidth() * scale) + 1; - int groundHeight = (int) (battleField.getHeight() * scale) + 1; - - int dx = (getWidth() - groundWidth) / 2; - int dy = (getHeight() - groundHeight) / 2; - - final AffineTransform savedTx = g.getTransform(); - - g.setTransform(new AffineTransform()); - g.drawImage(groundImage, dx, dy, groundWidth, groundHeight, null); - - g.setTransform(savedTx); - } - } else { - // Ground should not be drawn - g.setColor(Color.BLACK); - g.fillRect(0, 0, battleField.getWidth(), battleField.getHeight()); - } - - // Draw Sentry Border if it is enabled visually - if (properties.getOptionsViewSentryBorder()) { - drawSentryBorder(g); - } - } - - private void drawSentryBorder(Graphics2D g) { - int borderSentrySize = battleRules.getSentryBorderSize(); - - g.setColor(new Color(0xff, 0x00, 0x00, 0x80)); - g.fillRect(0, 0, borderSentrySize, battleField.getHeight()); - g.fillRect(battleField.getWidth() - borderSentrySize, 0, borderSentrySize, battleField.getHeight()); - g.fillRect(borderSentrySize, 0, battleField.getWidth() - 2 * borderSentrySize, borderSentrySize); - g.fillRect(borderSentrySize, battleField.getHeight() - borderSentrySize, - battleField.getWidth() - 2 * borderSentrySize, borderSentrySize); - } - - private void drawBorderEdge(Graphics2D g) { - final Shape savedClip = g.getClip(); - - g.setClip(null); - - g.setColor(Color.RED); - g.drawRect(-1, -1, battleField.getWidth() + 2, battleField.getHeight() + 2); - - g.setClip(savedClip); - } - - private void drawScanArcs(Graphics2D g, ITurnSnapshot snapShot) { - if (drawScanArcs) { - for (IRobotSnapshot robotSnapshot : snapShot.getRobots()) { - if (robotSnapshot.getState().isAlive()) { - drawScanArc(g, robotSnapshot); - } - } - } - } - - private void drawRobots(Graphics2D g, ITurnSnapshot snapShot) { - double x, y; - AffineTransform at; - int battleFieldHeight = battleField.getHeight(); - - if (drawGround && drawExplosionDebris) { - RenderImage explodeDebrise = imageManager.getExplosionDebriseRenderImage(); - - for (IRobotSnapshot robotSnapshot : snapShot.getRobots()) { - if (robotSnapshot.getState().isDead()) { - x = robotSnapshot.getX(); - y = battleFieldHeight - robotSnapshot.getY(); - - at = AffineTransform.getTranslateInstance(x, y); - - explodeDebrise.setTransform(at); - explodeDebrise.paint(g); - } - } - } - - for (IRobotSnapshot robotSnapshot : snapShot.getRobots()) { - if (robotSnapshot.getState().isAlive()) { - x = robotSnapshot.getX(); - y = battleFieldHeight - robotSnapshot.getY(); - - at = AffineTransform.getTranslateInstance(x, y); - at.rotate(robotSnapshot.getBodyHeading()); - - RenderImage robotRenderImage = imageManager.getColoredBodyRenderImage(robotSnapshot.getBodyColor()); - - robotRenderImage.setTransform(at); - robotRenderImage.paint(g); - - at = AffineTransform.getTranslateInstance(x, y); - at.rotate(robotSnapshot.getGunHeading()); - - RenderImage gunRenderImage = imageManager.getColoredGunRenderImage(robotSnapshot.getGunColor()); - - gunRenderImage.setTransform(at); - gunRenderImage.paint(g); - - if (!robotSnapshot.isDroid()) { - at = AffineTransform.getTranslateInstance(x, y); - at.rotate(robotSnapshot.getRadarHeading()); - - RenderImage radarRenderImage = imageManager.getColoredRadarRenderImage(robotSnapshot.getRadarColor()); - - radarRenderImage.setTransform(at); - radarRenderImage.paint(g); - } - } - } - } - - private void drawText(Graphics2D g, ITurnSnapshot snapShot) { - final Shape savedClip = g.getClip(); - - g.setClip(null); - - for (IRobotSnapshot robotSnapshot : snapShot.getRobots()) { - if (robotSnapshot.getState().isDead()) { - continue; - } - int x = (int) robotSnapshot.getX(); - int y = battleField.getHeight() - (int) robotSnapshot.getY(); - - if (drawRobotEnergy) { - g.setColor(Color.white); - int ll = (int) robotSnapshot.getEnergy(); - int rl = (int) ((robotSnapshot.getEnergy() - ll + .001) * 10.0); - - if (rl == 10) { - rl = 9; - } - String energyString = ll + "." + rl; - - if (robotSnapshot.getEnergy() == 0 && robotSnapshot.getState().isAlive()) { - energyString = "Disabled"; - } - centerString(g, energyString, x, y - ROBOT_TEXT_Y_OFFSET - smallFontMetrics.getHeight() / 2, smallFont, - smallFontMetrics); - } - if (drawRobotName) { - g.setColor(Color.white); - centerString(g, robotSnapshot.getVeryShortName(), x, - y + ROBOT_TEXT_Y_OFFSET + smallFontMetrics.getHeight() / 2, smallFont, smallFontMetrics); - } - } - - g.setClip(savedClip); - } - - private void drawRobotPaint(Graphics2D g, ITurnSnapshot turnSnapshot) { - - int robotIndex = 0; - - for (IRobotSnapshot robotSnapshot : turnSnapshot.getRobots()) { - final Object graphicsCalls = ((RobotSnapshot) robotSnapshot).getGraphicsCalls(); - - if (graphicsCalls == null || !robotSnapshot.isPaintEnabled()) { - continue; - } - - // Save the graphics state - GraphicsState gfxState = new GraphicsState(); - - gfxState.save(g); - - g.setClip(null); - g.setComposite(AlphaComposite.SrcAtop); - - IGraphicsProxy gfxProxy = getRobotGraphics(robotIndex); - - if (robotSnapshot.isSGPaintEnabled()) { - gfxProxy.processTo(g, graphicsCalls); - } else { - mirroredGraphics.bind(g, battleField.getHeight()); - gfxProxy.processTo(mirroredGraphics, graphicsCalls); - mirroredGraphics.release(); - } - - // Restore the graphics state - gfxState.restore(g); - - robotIndex++; - } - } - - private IGraphicsProxy getRobotGraphics(int robotIndex) { - if (robotGraphics[robotIndex] == null) { - robotGraphics[robotIndex] = new Graphics2DSerialized(); - robotGraphics[robotIndex].setPaintingEnabled(true); - } - return robotGraphics[robotIndex]; - } - - private void drawBullets(Graphics2D g, ITurnSnapshot snapShot) { - final Shape savedClip = g.getClip(); - - g.setClip(null); - - double x, y; - - for (IBulletSnapshot bulletSnapshot : snapShot.getBullets()) { - x = bulletSnapshot.getPaintX(); - y = battleField.getHeight() - bulletSnapshot.getPaintY(); - - AffineTransform at = AffineTransform.getTranslateInstance(x, y); - - if (bulletSnapshot.getState().isActive()) { - - // radius = sqrt(x^2 / 0.1 * power), where x is the width of 1 pixel for a minimum 0.1 bullet - double scale = max(2 * sqrt(2.5 * bulletSnapshot.getPower()), 2 / this.scale); - - at.scale(scale, scale); - Area bulletArea = BULLET_AREA.createTransformedArea(at); - - Color bulletColor; - - if (properties.getOptionsRenderingForceBulletColor()) { - bulletColor = Color.WHITE; - } else { - bulletColor = new Color(bulletSnapshot.getColor()); - } - g.setColor(bulletColor); - g.fill(bulletArea); - - } else if (drawExplosions) { - int explosionIndex = bulletSnapshot.getExplosionImageIndex(); - int frame = bulletSnapshot.getFrame(); - - // Sanity check to avoid bug-354 - Replaying an XML record can cause an ArrayIndexOutOfBoundsException - if (explosionIndex >= 0 && frame >= 0) { - if (!bulletSnapshot.isExplosion()) { - double scale = sqrt(1000 * bulletSnapshot.getPower()) / 128; - at.scale(scale, scale); - } - RenderImage explosionRenderImage = imageManager.getExplosionRenderImage(explosionIndex, frame); - explosionRenderImage.setTransform(at); - explosionRenderImage.paint(g); - } - } - } - g.setClip(savedClip); - } - - private void centerString(Graphics2D g, String s, int x, int y, Font font, FontMetrics fm) { - g.setFont(font); - - int width = fm.stringWidth(s); - int height = fm.getHeight(); - int descent = fm.getDescent(); - - double left = x - width / 2; - double top = y - height / 2; - - double scaledViewWidth = getWidth() / scale; - double scaledViewHeight = getHeight() / scale; - - double borderWidth = (scaledViewWidth - battleField.getWidth()) / 2; - double borderHeight = (scaledViewHeight - battleField.getHeight()) / 2; - - if (left + width > scaledViewWidth) { - left = scaledViewWidth - width; - } - if (top + height > scaledViewHeight) { - top = scaledViewHeight - height; - } - if (left < -borderWidth) { - left = -borderWidth; - } - if (top < -borderHeight) { - top = -borderHeight; - } - g.drawString(s, (int) (left + 0.5), (int) (top + height - descent + 0.5)); - } - - private void drawScanArc(Graphics2D g, IRobotSnapshot robotSnapshot) { - Arc2D.Double scanArc = (Arc2D.Double) ((RobotSnapshot) robotSnapshot).getScanArc(); - - if (scanArc == null) { - return; - } - - final Composite savedComposite = g.getComposite(); - - g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f)); - - scanArc.setAngleStart((360 - scanArc.getAngleStart() - scanArc.getAngleExtent()) % 360); - scanArc.y = battleField.getHeight() - robotSnapshot.getY() - robocode.Rules.RADAR_SCAN_RADIUS; - - int scanColor = robotSnapshot.getScanColor(); - - g.setColor(new Color(scanColor, true)); - - if (abs(scanArc.getAngleExtent()) >= .5) { - g.fill(scanArc); - } else { - g.draw(scanArc); - } - - g.setComposite(savedComposite); - } - - private void paintRobocodeLogo(Graphics2D g) { - setBackground(Color.BLACK); - g.clearRect(0, 0, getWidth(), getHeight()); - - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - g.transform(AffineTransform.getTranslateInstance((getWidth() - 320) / 2.0, (getHeight() - 46) / 2.0)); - g.setColor(new Color(0, 0x40, 0)); - g.fill(robocodeTextPath); - - Font font = new Font("Dialog", Font.BOLD, 14); - int width = g.getFontMetrics(font).stringWidth(ROBOCODE_SLOGAN); - - g.setTransform(new AffineTransform()); - g.setFont(font); - g.setColor(new Color(0, 0x50, 0)); - g.drawString(ROBOCODE_SLOGAN, (float) ((getWidth() - width) / 2.0), (float) (getHeight() / 2.0 + 50)); - } - - private class BattleObserver extends BattleAdaptor { - public BattleObserver(IWindowManager windowManager) { - windowManager.addBattleListener(this); - } - - @Override - public void onBattleStarted(BattleStartedEvent event) { - battleRules = event.getBattleRules(); - - battleField = new BattleField(battleRules.getBattlefieldWidth(), battleRules.getBattlefieldHeight()); - - initialized = false; - setVisible(true); - - super.onBattleStarted(event); - - robotGraphics = new IGraphicsProxy[event.getRobotsCount()]; - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - super.onBattleFinished(event); - robotGraphics = null; - } - - public void onTurnEnded(final TurnEndedEvent event) { - if (event.getTurnSnapshot() == null) { - repaint(); - } else { - update(event.getTurnSnapshot()); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/InteractiveHandler.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/InteractiveHandler.java deleted file mode 100644 index a10cc6f..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/InteractiveHandler.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.battleview; - - -import net.sf.robocode.battle.BattleProperties; -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.security.SafeComponent; -import robocode.*; - -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.event.*; -import static java.lang.Math.min; - - -/** - * This handler is used for observing keyboard and mouse events from the battle view, - * which must be process to the all robots interactive event handlers. - * The mouse events y coordinates are mirrored to comply to the coordinate system - * used in Robocode. - * - * @author Pavel Savara (original) - * @author Flemming N. Larsen (contributor) - */ -public final class InteractiveHandler implements KeyEventDispatcher, MouseListener, MouseMotionListener, MouseWheelListener { - private final IBattleManager battleManager; - private final BattleView battleView; - - public InteractiveHandler(IBattleManager battleManager, BattleView battleView) { - this.battleManager = battleManager; - this.battleView = battleView; - } - - public boolean dispatchKeyEvent(java.awt.event.KeyEvent e) { - switch (e.getID()) { - case KeyEvent.KEY_TYPED: - handleInteractiveEvent(new KeyTypedEvent(cloneKeyEvent(e))); - break; - - case KeyEvent.KEY_PRESSED: - handleInteractiveEvent(new KeyPressedEvent(cloneKeyEvent(e))); - break; - - case KeyEvent.KEY_RELEASED: - handleInteractiveEvent(new KeyReleasedEvent(cloneKeyEvent(e))); - break; - } - - // Allow KeyboardFocusManager to take further action with regard to the KeyEvent. - // This way the InteractiveHandler does not steal the event, but is only a keyboard observer. - return false; - } - - public void mouseClicked(MouseEvent e) { - handleInteractiveEvent(new MouseClickedEvent(mirroredMouseEvent(e))); - } - - public void mouseEntered(MouseEvent e) { - handleInteractiveEvent(new MouseEnteredEvent(mirroredMouseEvent(e))); - } - - public void mouseExited(MouseEvent e) { - handleInteractiveEvent(new MouseExitedEvent(mirroredMouseEvent(e))); - } - - public void mousePressed(MouseEvent e) { - handleInteractiveEvent(new MousePressedEvent(mirroredMouseEvent(e))); - } - - public void mouseReleased(MouseEvent e) { - handleInteractiveEvent(new MouseReleasedEvent(mirroredMouseEvent(e))); - } - - public void mouseMoved(MouseEvent e) { - handleInteractiveEvent(new MouseMovedEvent(mirroredMouseEvent(e))); - } - - public void mouseDragged(MouseEvent e) { - handleInteractiveEvent(new MouseDraggedEvent(mirroredMouseEvent(e))); - } - - public void mouseWheelMoved(MouseWheelEvent e) { - handleInteractiveEvent(new MouseWheelMovedEvent(mirroredMouseWheelEvent(e))); - } - - public static KeyEvent cloneKeyEvent(final KeyEvent e) { - return new KeyEvent(SafeComponent.getSafeEventComponent(), e.getID(), e.getWhen(), e.getModifiersEx(), - e.getKeyCode(), e.getKeyChar(), e.getKeyLocation()); - } - - private void handleInteractiveEvent(robocode.Event event) { - battleManager.sendInteractiveEvent(event); - } - - private MouseEvent mirroredMouseEvent(final MouseEvent e) { - - double scale; - BattleProperties battleProps = battleManager.getBattleProperties(); - - int vWidth = battleView.getWidth(); - int vHeight = battleView.getHeight(); - int fWidth = battleProps.getBattlefieldWidth(); - int fHeight = battleProps.getBattlefieldHeight(); - - if (vWidth < fWidth || vHeight < fHeight) { - scale = min((double) vWidth / fWidth, (double) fHeight / fHeight); - } else { - scale = 1; - } - - double dx = (vWidth - scale * fWidth) / 2; - double dy = (vHeight - scale * fHeight) / 2; - - int x = (int) ((e.getX() - dx) / scale + 0.5); - int y = (int) (fHeight - (e.getY() - dy) / scale + 0.5); - - return new MouseEvent(SafeComponent.getSafeEventComponent(), e.getID(), e.getWhen(), e.getModifiersEx(), x, y, - e.getClickCount(), e.isPopupTrigger(), e.getButton()); - } - - private MouseWheelEvent mirroredMouseWheelEvent(final MouseWheelEvent e) { - - double scale; - BattleProperties battleProps = battleManager.getBattleProperties(); - - int vWidth = battleView.getWidth(); - int vHeight = battleView.getHeight(); - int fWidth = battleProps.getBattlefieldWidth(); - int fHeight = battleProps.getBattlefieldHeight(); - - if (vWidth < fWidth || vHeight < fHeight) { - scale = min((double) vWidth / fWidth, (double) fHeight / fHeight); - } else { - scale = 1; - } - - double dx = (vWidth - scale * fWidth) / 2; - double dy = (vHeight - scale * fHeight) / 2; - - int x = (int) ((e.getX() - dx) / scale + 0.5); - int y = (int) (fHeight - (e.getY() - dy) / scale + 0.5); - - return new MouseWheelEvent(SafeComponent.getSafeEventComponent(), e.getID(), e.getWhen(), e.getModifiersEx(), x, - y, e.getClickCount(), e.isPopupTrigger(), e.getScrollType(), e.getScrollAmount(), e.getWheelRotation()); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/MirroredGraphics.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/MirroredGraphics.java deleted file mode 100644 index 2264a3c..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/MirroredGraphics.java +++ /dev/null @@ -1,567 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.battleview; - - -import net.sf.robocode.ui.gfx.GraphicsState; - -import java.awt.*; -import java.awt.RenderingHints.Key; -import java.awt.font.FontRenderContext; -import java.awt.font.GlyphVector; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; -import java.awt.image.BufferedImageOp; -import java.awt.image.ImageObserver; -import java.awt.image.RenderedImage; -import java.awt.image.renderable.RenderableImage; -import java.text.AttributedCharacterIterator; -import java.util.Map; - - -/** - * This class is a Graphics2D wrapper class used for mirroring graphics on - * the Y-axis. This class ensures that strings that are painted using the - * drawBytes(), drawChars(), and drawString() methods are painted on the - * right location but that the text itself is not mirrored when painted. - * - * @author Flemming N. Larsen (original) - */ -public class MirroredGraphics extends Graphics2D { - - // The wrapped Graphics object - private Graphics2D g; - - // Save/restore of Graphics object - private final GraphicsState graphicsState = new GraphicsState(); - - // The original transform mirrored - private final AffineTransform origTxMirrored = new AffineTransform(); - - // A transform used for temporary transform operations (is reused) - private final AffineTransform tmpTx = new AffineTransform(); - - /** - * Binds a Graphics2D object to this wrapper object. - * When painting using this wrapper has finished the - * {@link #release() } method must be called. - * - * @param g the Graphics2D object to wrap - * @param height the height of the battlefield to mirror - * @see #release() - */ - public void bind(Graphics2D g, int height) { - this.g = g; - - graphicsState.save(g); - - origTxMirrored.setTransform(g.getTransform()); - origTxMirrored.translate(0, height); - origTxMirrored.scale(1, -1); - - g.setTransform(origTxMirrored); - } - - /** - * Releases the bounded Graphics2D object from this wrapper. - * - * @see #bind(Graphics2D, int) - */ - public void release() { - graphicsState.restore(g); - } - - // -------------------------------------------------------------------------- - // Overriding all methods from the extended Graphics class - // -------------------------------------------------------------------------- - - // Methods that should not be overridden or implemented: - // - finalize() - // - toString() - - @Override - public Graphics create() { - return g.create(); - } - - @Override - public Graphics create(int x, int y, int width, int height) { - return g.create(x, y, width, height); - } - - @Override - public void translate(int x, int y) { - g.translate(x, y); - } - - @Override - public Color getColor() { - return g.getColor(); - } - - @Override - public void setColor(Color c) { - g.setColor(c); - } - - @Override - public void setPaintMode() { - g.setPaintMode(); - } - - @Override - public void setXORMode(Color c1) { - g.setXORMode(c1); - } - - @Override - public Font getFont() { - return g.getFont(); - } - - @Override - public void setFont(Font font) { - g.setFont(font); - } - - @Override - public FontMetrics getFontMetrics(Font f) { - return g.getFontMetrics(f); - } - - @Override - public Rectangle getClipBounds() { - return g.getClipBounds(); - } - - @Override - public void clipRect(int x, int y, int width, int height) { - g.clipRect(x, y, width, height); - } - - @Override - public void setClip(int x, int y, int width, int height) { - g.setClip(x, y, width, height); - } - - @Override - public Shape getClip() { - return g.getClip(); - } - - @Override - public void setClip(Shape clip) { - g.setClip(clip); - } - - @Override - public void copyArea(int x, int y, int width, int height, int dx, int dy) { - g.copyArea(x, y, width, height, dx, dy); - } - - @Override - public void drawLine(int x1, int y1, int x2, int y2) { - g.drawLine(x1, y1, x2, y2); - } - - @Override - public void fillRect(int x, int y, int width, int height) { - g.fillRect(x, y, width, height); - } - - @Override - public void drawRect(int x, int y, int width, int height) { - g.drawRect(x, y, width, height); - } - - @Override - public void clearRect(int x, int y, int width, int height) { - g.clearRect(x, y, width, height); - } - - @Override - public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - g.drawRoundRect(x, y, width, height, arcWidth, arcHeight); - } - - @Override - public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - g.fillRoundRect(x, y, width, height, arcWidth, arcHeight); - } - - @Override - public void draw3DRect(int x, int y, int width, int height, boolean raised) { - g.draw3DRect(x, y, width, height, raised); - } - - @Override - public void fill3DRect(int x, int y, int width, int height, boolean raised) { - g.fill3DRect(x, y, width, height, raised); - } - - @Override - public void drawOval(int x, int y, int width, int height) { - g.drawOval(x, y, width, height); - } - - @Override - public void fillOval(int x, int y, int width, int height) { - g.fillOval(x, y, width, height); - } - - @Override - public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - g.drawArc(x, y, width, height, startAngle - 90, arcAngle); // Translated into the Robocode coordinate system - } - - @Override - public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - g.fillArc(x, y, width, height, startAngle - 90, arcAngle); // Translated into the Robocode coordinate system - } - - @Override - public void drawPolyline(int[] xPoints, int[] yPoints, int npoints) { - g.drawPolyline(xPoints, yPoints, npoints); - } - - @Override - public void drawPolygon(int[] xPoints, int[] yPoints, int npoints) { - g.drawPolyline(xPoints, yPoints, npoints); - } - - @Override - public void drawPolygon(Polygon p) { - g.drawPolygon(p); - } - - @Override - public void fillPolygon(int[] xPoints, int[] yPoints, int npoints) { - g.fillPolygon(xPoints, yPoints, npoints); - } - - @Override - public void fillPolygon(Polygon p) { - g.fillPolygon(p); - } - - // Modified so that the y-axis is mirrored - @Override - public void drawString(String str, int x, int y) { - // Change the transform to use the mirrored transform and save the current one - AffineTransform saveTx = setToMirroredTransform(); - - g.drawString(str, x, -y); - - // Restore the transform - g.setTransform(saveTx); - } - - // Modified so that the y-axis is mirrored - @Override - public void drawString(AttributedCharacterIterator iterator, int x, int y) { - // Change the transform to use the mirrored transform and save the current one - AffineTransform saveTx = setToMirroredTransform(); - - g.drawString(iterator, x, -y); - - // Restore the transform - g.setTransform(saveTx); - } - - // Modified so that the y-axis is mirrored - @Override - public void drawChars(char[] data, int offset, int length, int x, int y) { - // Change the transform to use the mirrored transform and save the current one - AffineTransform saveTx = setToMirroredTransform(); - - g.drawChars(data, offset, length, x, -y); - - // Restore the transform - g.setTransform(saveTx); - } - - // Modified so that the y-axis is mirrored - @Override - public void drawBytes(byte[] data, int offset, int length, int x, int y) { - // Change the transform to use the mirrored transform and save the current one - AffineTransform saveTx = setToMirroredTransform(); - - g.drawBytes(data, offset, length, x, -y); - - // Restore the transform - g.setTransform(saveTx); - } - - @Override - public boolean drawImage(Image img, int x, int y, ImageObserver observer) { - return g.drawImage(img, x, y, observer); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { - return g.drawImage(img, x, y, width, height, observer); - } - - @Override - public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) { - return g.drawImage(img, x, y, bgcolor, observer); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { - return g.drawImage(img, x, y, width, height, bgcolor, observer); - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, - ImageObserver observer) { - return g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, - Color bgcolor, ImageObserver observer) { - return g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer); - } - - @Override - public void dispose() { - g.dispose(); - } - - @Override - @Deprecated - public Rectangle getClipRect() { - return g.getClipBounds(); // Must use getClipBounds() instead of the deprecated getClipRect() method - } - - @Override - public boolean hitClip(int x, int y, int width, int height) { - return g.hitClip(x, y, width, height); - } - - @Override - public Rectangle getClipBounds(Rectangle r) { - return g.getClipBounds(r); - } - - // -------------------------------------------------------------------------- - // Overriding all methods from the extended Graphics2D class - // -------------------------------------------------------------------------- - - @Override - public void draw(Shape s) { - g.draw(s); - } - - @Override - public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { - return g.drawImage(img, xform, obs); - } - - @Override - public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { - g.drawImage(img, op, x, y); - } - - @Override - public void drawRenderedImage(RenderedImage img, AffineTransform xform) { - g.drawRenderedImage(img, xform); - } - - @Override - public void drawRenderableImage(RenderableImage img, AffineTransform xform) { - g.drawRenderableImage(img, xform); - } - - // Modified so that the y-axis is mirrored - @Override - public void drawString(String str, float x, float y) { - // Change the transform to use the mirrored transform and save the current one - AffineTransform saveTx = setToMirroredTransform(); - - g.drawString(str, x, -y); - - // Restore the transform - g.setTransform(saveTx); - } - - // Modified so that the y-axis is mirrored - @Override - public void drawString(AttributedCharacterIterator iterator, float x, float y) { - // Change the transform to use the mirrored transform and save the current one - AffineTransform saveTx = setToMirroredTransform(); - - g.drawString(iterator, x, -y); - - // Restore the transform - g.setTransform(saveTx); - } - - @Override - public void drawGlyphVector(GlyphVector gv, float x, float y) { - g.drawGlyphVector(gv, x, y); - } - - @Override - public void fill(Shape s) { - g.fill(s); - } - - @Override - public boolean hit(Rectangle rect, Shape s, boolean onStroke) { - return g.hit(rect, s, onStroke); - } - - @Override - public GraphicsConfiguration getDeviceConfiguration() { - return g.getDeviceConfiguration(); - } - - @Override - public void setComposite(Composite comp) { - g.setComposite(comp); - } - - @Override - public void setPaint(Paint paint) { - g.setPaint(paint); - } - - @Override - public void setStroke(Stroke s) { - g.setStroke(s); - } - - @Override - public void setRenderingHint(Key hintKey, Object hintValue) { - g.setRenderingHint(hintKey, hintValue); - } - - @Override - public Object getRenderingHint(Key hintKey) { - return g.getRenderingHint(hintKey); - } - - @Override - public void setRenderingHints(Map hints) { - g.setRenderingHints(hints); - } - - @Override - public void addRenderingHints(Map hints) { - g.addRenderingHints(hints); - } - - @Override - public RenderingHints getRenderingHints() { - return g.getRenderingHints(); - } - - @Override - public void translate(double tx, double ty) { - g.translate(tx, ty); - } - - @Override - public void rotate(double theta) { - g.rotate(theta); - } - - @Override - public void rotate(double theta, double x, double y) { - g.rotate(theta, x, y); - } - - @Override - public void scale(double sx, double sy) { - g.scale(sx, sy); - } - - @Override - public void shear(double shx, double shy) { - g.shear(shx, shy); - } - - @Override - public void transform(AffineTransform Tx) { - g.transform(Tx); - } - - // Transforming is handled on the y-axis mirrored transform - @Override - public void setTransform(AffineTransform Tx) { - // Set the current transform to by the original mirrored transform - // concatenated with the input transform. This way the new transform - // will automatically be mirrored around the y-axis - tmpTx.setTransform(origTxMirrored); - tmpTx.concatenate(Tx); - g.setTransform(tmpTx); - } - - @Override - public AffineTransform getTransform() { - return g.getTransform(); - } - - @Override - public Paint getPaint() { - return g.getPaint(); - } - - @Override - public Composite getComposite() { - return g.getComposite(); - } - - @Override - public void setBackground(Color color) { - g.setBackground(color); - } - - @Override - public Color getBackground() { - return g.getBackground(); - } - - @Override - public Stroke getStroke() { - return g.getStroke(); - } - - @Override - public void clip(Shape s) { - g.clip(s); - } - - @Override - public FontRenderContext getFontRenderContext() { - return g.getFontRenderContext(); - } - - // -------------------------------------------------------------------------- - // Private worker methods - // -------------------------------------------------------------------------- - - /** - * This methods translates the current transform on the internal Graphics2D - * object into a transform that is mirrored around the y-axis. - * - * @return the AffineTransform before calling this method, which must be - * used for restoring the AffineTransform later. - */ - private AffineTransform setToMirroredTransform() { - AffineTransform saveTx = g.getTransform(); - - tmpTx.setTransform(saveTx); - tmpTx.scale(1, -1); - g.setTransform(tmpTx); - - return saveTx; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/ScreenshotUtil.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/ScreenshotUtil.java deleted file mode 100644 index 62cbefd..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battleview/ScreenshotUtil.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.battleview; - - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Iterator; - -import javax.imageio.IIOImage; -import javax.imageio.ImageIO; -import javax.imageio.ImageWriteParam; -import javax.imageio.ImageWriter; -import javax.imageio.stream.FileImageOutputStream; - -import net.sf.robocode.io.FileUtil; - - -/** - * This utility class for saving screenshots of the battle view. - * - * @author Flemming N. Larsen (original) - * - * @since 1.7.2 - */ -public class ScreenshotUtil { - - private final static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH.mm.ss.SSS"); - - public static void saveScreenshot(BufferedImage screenshot, String format, float compressionQuality) { - FileImageOutputStream output = null; - ImageWriter writer = null; - - File screenshotDir = FileUtil.getScreenshotsDir(); - - FileUtil.createDir(screenshotDir); - - File file = new File(screenshotDir, DATE_FORMAT.format(new Date()) + '.' + format.toLowerCase()); - - try { - // Instantiate an ImageWriteParam object with default compression options - Iterator it = ImageIO.getImageWritersByFormatName(format); - - writer = (ImageWriter) it.next(); - ImageWriteParam iwp = writer.getDefaultWriteParam(); - - // If compression is supported, then set the compression mode - if (iwp.canWriteCompressed()) { - // Use explicit compression mode - iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - - // Set compression quality, where 1 specifies minimum compression and maximum quality - iwp.setCompressionQuality(compressionQuality); // float between 0 and 1 - } - // Write the screen shot to file - output = new FileImageOutputStream(file); - writer.setOutput(output); - IIOImage image = new IIOImage(screenshot, null, null); - - writer.write(null, image, iwp); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (writer != null) { - writer.dispose(); - } - if (output != null) { - try { - output.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AboutBox.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AboutBox.java deleted file mode 100644 index 4ac7bad..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AboutBox.java +++ /dev/null @@ -1,225 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.ui.BrowserManager; -import net.sf.robocode.version.IVersionManager; - -import javax.swing.*; -import javax.swing.event.HyperlinkEvent; -import javax.swing.event.HyperlinkListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.IOException; -import java.net.URL; -import java.net.URLConnection; - - -/** - * The About box. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public final class AboutBox extends JDialog { - // Tag used for background color replacement - private final static Color BG_COLOR = new Color(0xF0, 0xF0, 0xF0); - // Tag used for Robocode version replacement - private final static String TAG_ROBOCODE_VERSION = "\\Q{$robocode-version}\\E"; - // Tag used for Robocode icon source replacement - private final static String TAG_ROBOCODE_ICON_SRC = "\\Q{$robocode-icon-url}\\E"; - // Tag used for background color replacement - private final static String TAG_BG_COLOR = "\\Q{$background-color}\\E"; - // Tag used for Java version replacement - private final static String TAG_JAVA_VERSION = "\\Q{$java-version}\\E"; - // Tag used for Java vendor replacement - private final static String TAG_JAVA_VENDOR = "\\Q{$java-vendor}\\E"; - // Tag used for transparent.png 1x1 px url replacement - private final static String TAG_TRANSPARENT = "\\Q{$transparent}\\E"; - - // Robocode version - private final String robocodeVersion; - // Robocode icon URL - private final java.net.URL iconURL; - // Transparent URL - private final java.net.URL transparentURL; - - // Content pane - private JPanel aboutBoxContentPane; - // Main panel - private JEditorPane mainPanel; - // Button panel - private JPanel buttonPanel; - // OK button - private JButton okButton; - // HTML text after tag replacements - private String html; - - private static String getHtmlTemplate() { - URL url = AboutBox.class.getResource("/net/sf/robocode/ui/html/about.html"); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - try { - URLConnection connection = url.openConnection(); - int contentLength = connection.getContentLength(); - InputStream in = url.openStream(); - byte[] buf = new byte[contentLength]; - int len; - - while (true) { - len = in.read(buf); - if (len == -1) { - break; - } - baos.write(buf, 0, len); - } - baos.close(); - } catch (IOException ignore) {} - return baos.toString(); - } - - // General event handler - private final transient ActionListener eventHandler = new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (e.getSource() == AboutBox.this.getOkButton()) { - AboutBox.this.dispose(); - } - } - }; - - // Hyperlink event handler - private final transient HyperlinkListener hyperlinkHandler = new HyperlinkListener() { - public void hyperlinkUpdate(HyperlinkEvent event) { - if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { - try { - BrowserManager.openURL(event.getURL().toExternalForm()); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - }; - - public AboutBox(RobocodeFrame owner, IVersionManager versionManager) { - super(owner, true); - - robocodeVersion = versionManager.getVersion(); - - iconURL = AboutBox.class.getResource("/net/sf/robocode/ui/icons/robocode-icon.png"); - transparentURL = AboutBox.class.getResource("/net/sf/robocode/ui/html/transparent.png"); - - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setTitle("About Robocode"); - setContentPane(getAboutBoxContentPane()); - setResizable(false); - } - - private JPanel getAboutBoxContentPane() { - if (aboutBoxContentPane == null) { - aboutBoxContentPane = new JPanel(); - aboutBoxContentPane.setLayout(new BorderLayout()); - aboutBoxContentPane.add(getButtonPanel(), BorderLayout.SOUTH); - aboutBoxContentPane.add(getMainPanel(), BorderLayout.CENTER); - } - return aboutBoxContentPane; - } - - private JEditorPane getMainPanel() { - if (mainPanel == null) { - String aaFontSettings = System.getProperty("awt.useSystemAAFontSettings"); - - if (aaFontSettings != null) { - mainPanel = new JEditorPane("text/html; charset=ISO-8859-1", getHtmlText()); - System.out.println(aaFontSettings); - } else { - mainPanel = new JEditorPane("text/html; charset=ISO-8859-1", getHtmlText()) { - @Override - public void paintComponent(Graphics g) { - Graphics2D g2 = (Graphics2D) g; - - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - super.paintComponent(g); - } - }; - } - mainPanel.setBackground(BG_COLOR); - mainPanel.setEditable(false); - mainPanel.addHyperlinkListener(hyperlinkHandler); - } - return mainPanel; - } - - private JPanel getButtonPanel() { - if (buttonPanel == null) { - buttonPanel = new JPanel(); - buttonPanel.setBackground(BG_COLOR); - buttonPanel.setLayout(new FlowLayout()); - buttonPanel.add(getOkButton()); - } - return buttonPanel; - } - - private JButton getOkButton() { - if (okButton == null) { - okButton = new JButton(); - okButton.setText("OK"); - okButton.addActionListener(eventHandler); - } - return okButton; - } - - private String getHtmlText() { - if (html == null) { - html = getHtmlTemplate(); - html = html.replaceAll(TAG_ROBOCODE_VERSION, robocodeVersion); - html = html.replaceAll(TAG_ROBOCODE_ICON_SRC, iconURL.toString()); - html = html.replaceAll(TAG_BG_COLOR, toHtmlColor(BG_COLOR)); - html = html.replaceAll(TAG_JAVA_VERSION, getJavaVersion()); - html = html.replaceAll(TAG_JAVA_VENDOR, System.getProperty("java.vendor")); - html = html.replaceAll(TAG_TRANSPARENT, transparentURL.toString()); - } - return html; - } - - private static String toHtmlColor(Color color) { - return "#" + toHexDigits(color.getRed()) + toHexDigits(color.getGreen()) + toHexDigits(color.getBlue()); - } - - private static String toHexDigits(int value) { - return "" + toHexDigit(value >> 4) + toHexDigit(value & 0x0f); - } - - private static char toHexDigit(int value) { - int v = (value & 0xf); - - if (v < 10) { - return (char) ('0' + v); - } - return (char) ('A' + (v - 10)); - } - - private static String getJavaVersion() { - String javaVersion = System.getProperty("java.version"); - String javaArchModel = System.getProperty("sun.arch.data.model"); - - if (javaArchModel != null) { - try { - int numBits = Integer.parseInt(javaArchModel); - - javaVersion += " (" + numBits + "-bit)"; - } catch (NumberFormatException ignore) {} - } - return javaVersion; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AvailableRobotsPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AvailableRobotsPanel.java deleted file mode 100644 index 5d97c2b..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/AvailableRobotsPanel.java +++ /dev/null @@ -1,421 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.ui.util.ShortcutUtil; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -@SuppressWarnings("serial") -public class AvailableRobotsPanel extends JPanel { - - private final List availableRobots = new CopyOnWriteArrayList(); - private List robotList = new CopyOnWriteArrayList(); - private final List availablePackages = new CopyOnWriteArrayList(); - - private JScrollPane availableRobotsScrollPane; - private JList availableRobotsList; - - private final JButton actionButton; - - private final JList actionList; - private JList availablePackagesList; - - private JScrollPane availablePackagesScrollPane; - - private RobotNameCellRenderer robotNameCellRenderer; - - private final RobotSelectionPanel robotSelectionPanel; - - private final String title; - - private final EventHandler eventHandler = new EventHandler(); - - public AvailableRobotsPanel(JButton actionButton, String title, JList actionList, - RobotSelectionPanel robotSelectionPanel) { - super(); - this.title = title; - this.actionButton = actionButton; - this.actionList = actionList; - this.robotSelectionPanel = robotSelectionPanel; - initialize(); - } - - private void initialize() { - setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), title)); - setLayout(new BorderLayout()); - - JPanel top = new JPanel(); - - top.setLayout(new GridLayout(1, 2)); - - JPanel a = new JPanel(); - - a.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "Packages")); - a.setLayout(new BorderLayout()); - a.add(getAvailablePackagesScrollPane()); - a.setPreferredSize(new Dimension(120, 100)); - top.add(a); - - JPanel b = new JPanel(); - - b.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "Robots")); - b.setLayout(new BorderLayout()); - b.add(getAvailableRobotsScrollPane()); - b.setPreferredSize(new Dimension(120, 100)); - top.add(b); - - add(top, BorderLayout.CENTER); - - JLabel refreshLabel = new JLabel("Press " + ShortcutUtil.getModifierKeyText() + "+R to refresh"); - - refreshLabel.setHorizontalAlignment(SwingConstants.CENTER); - add(refreshLabel, BorderLayout.SOUTH); - } - - public List getAvailableRobots() { - return availableRobots; - } - - public List getRobotList() { - return robotList; - } - - public List getSelectedRobots() { - List selected = new ArrayList(); - - for (int i : getAvailableRobotsList().getSelectedIndices()) { - selected.add(availableRobots.get(i)); - } - return selected; - } - - /** - * Return the availableRobotsList. - * - * @return JList - */ - public JList getAvailableRobotsList() { - if (availableRobotsList == null) { - availableRobotsList = new JList(); - availableRobotsList.setModel(new AvailableRobotsModel()); - availableRobotsList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - - availableRobotsList.setCellRenderer(getRobotNameCellRenderer()); - - MouseListener mouseListener = new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - // This does not work in Linux under IBM JRE 1.3.0... - if (e.getClickCount() >= 2) { - if (e.getClickCount() % 2 == 0) { - if (actionButton != null) { - actionButton.doClick(); - } - } - } - } - }; - - availableRobotsList.addMouseListener(mouseListener); - availableRobotsList.addListSelectionListener(eventHandler); - } - return availableRobotsList; - } - - /** - * Return the JScrollPane1 property value. - * - * @return JScrollPane - */ - private JScrollPane getAvailableRobotsScrollPane() { - if (availableRobotsScrollPane == null) { - availableRobotsScrollPane = new JScrollPane(); - availableRobotsScrollPane.setViewportView(getAvailableRobotsList()); - - // Bug fix [2975871] - Minor visual bug - Currently selected robot gets covered - availableRobotsScrollPane.addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent e) { - getAvailableRobotsList().ensureIndexIsVisible(getAvailableRobotsList().getSelectedIndex()); - } - }); - } - return availableRobotsScrollPane; - } - - public void setRobotList(List robotListList) { - robotList = robotListList; - SwingUtilities.invokeLater(new Runnable() { - public void run() { - availablePackages.clear(); - availableRobots.clear(); - - if (robotList == null) { - robotList = new CopyOnWriteArrayList(); - availablePackages.add("One moment please..."); - ((AvailablePackagesModel) getAvailablePackagesList().getModel()).changed(); - getAvailablePackagesList().clearSelection(); - ((AvailableRobotsModel) getAvailableRobotsList().getModel()).changed(); - } else { - availablePackages.add("(All)"); - String packageName; - - for (IRobotSpecItem robotSpec : robotList) { - packageName = robotSpec.getFullPackage(); - if (packageName == null) { - continue; - } - if (!availablePackages.contains(packageName)) { - availablePackages.add(packageName); - } - } - availablePackages.add("(No package)"); - - for (IRobotSpecItem robotSpec : robotList) { - availableRobots.add(new ItemWrapper(robotSpec)); - } - ((AvailablePackagesModel) getAvailablePackagesList().getModel()).changed(); - getAvailablePackagesList().setSelectedIndex(0); - ((AvailableRobotsModel) getAvailableRobotsList().getModel()).changed(); - getAvailablePackagesList().requestFocus(); - } - } - }); - } - - private void availablePackagesListSelectionChanged() { - int sel[] = getAvailablePackagesList().getSelectedIndices(); - - boolean useShortName = false; - - availableRobots.clear(); - if (sel.length == 1) { - useShortName = true; - getAvailablePackagesList().scrollRectToVisible(getAvailablePackagesList().getCellBounds(sel[0], sel[0])); - } - - for (int element : sel) { - String selectedPackage = availablePackages.get(element); - - if (selectedPackage.equals("(All)")) { - useShortName = false; - availableRobots.clear(); - for (IRobotSpecItem robotItem : robotList) { - getRobotNameCellRenderer().setUseShortName(useShortName); - availableRobots.add(new ItemWrapper(robotItem)); - } - break; - } - // Single package. - for (IRobotSpecItem robotItem : robotList) { - getRobotNameCellRenderer().setUseShortName(useShortName); - - if ((robotItem.getFullPackage() == null && selectedPackage.equals("(No package)")) - || selectedPackage.equals(robotItem.getFullPackage())) { - availableRobots.add(new ItemWrapper(robotItem)); - } - } - } - ((AvailableRobotsModel) getAvailableRobotsList().getModel()).changed(); - if (availableRobots.size() > 0) { - availableRobotsList.setSelectedIndex(0); - availableRobotsListSelectionChanged(); - } - } - - private void availableRobotsListSelectionChanged() { - int sel[] = getAvailableRobotsList().getSelectedIndices(); - - if (sel.length == 1) { - if (actionList != null) { - actionList.clearSelection(); - } - IRobotSpecItem robotSpecification = ((ItemWrapper) getAvailableRobotsList().getModel().getElementAt(sel[0])).getItem(); - - if (robotSelectionPanel != null) { - robotSelectionPanel.showDescription(robotSpecification); - } - } else { - if (robotSelectionPanel != null) { - robotSelectionPanel.showDescription(null); - } - } - } - - public void clearSelection() { - getAvailableRobotsList().clearSelection(); - ((AvailableRobotsModel) getAvailableRobotsList().getModel()).changed(); - } - - /** - * Return the availableRobotsList. - * - * @return JList - */ - private JList getAvailablePackagesList() { - if (availablePackagesList == null) { - availablePackagesList = new JList(); - availablePackagesList.setModel(new AvailablePackagesModel()); - availablePackagesList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); - availablePackagesList.addListSelectionListener(eventHandler); - } - return availablePackagesList; - } - - /** - * Return the availablePackagesScrollPane - * - * @return JScrollPane - */ - private JScrollPane getAvailablePackagesScrollPane() { - if (availablePackagesScrollPane == null) { - availablePackagesScrollPane = new JScrollPane(); - availablePackagesScrollPane.setViewportView(getAvailablePackagesList()); - } - return availablePackagesScrollPane; - } - - private RobotNameCellRenderer getRobotNameCellRenderer() { - if (robotNameCellRenderer == null) { - robotNameCellRenderer = new RobotNameCellRenderer(); - } - return robotNameCellRenderer; - } - - private class EventHandler implements ListSelectionListener { - public void valueChanged(ListSelectionEvent e) { - if (e.getValueIsAdjusting()) { - return; - } - if (e.getSource() == getAvailableRobotsList()) { - availableRobotsListSelectionChanged(); - } else if (e.getSource() == getAvailablePackagesList()) { - availablePackagesListSelectionChanged(); - } - } - } - - - private class AvailablePackagesModel extends AbstractListModel { - public void changed() { - fireContentsChanged(this, 0, getSize()); - } - - public int getSize() { - return availablePackages.size(); - } - - public String getElementAt(int which) { - return availablePackages.get(which); - } - } - - - private class AvailableRobotsModel extends AbstractListModel { - public void changed() { - fireContentsChanged(this, 0, getSize()); - } - - public int getSize() { - return availableRobots.size(); - } - - public ItemWrapper getElementAt(int which) { - return availableRobots.get(which); - } - } - - - /** - * Is there because of keyboard navigation is tied to toString() method - */ - public static class ItemWrapper { - private final IRobotSpecItem item; - - public ItemWrapper(IRobotSpecItem item) { - this.item = item; - } - - public IRobotSpecItem getItem() { - return item; - } - - // Used writing the robot name in JList. Is used for keyboard typing in JList to find robot. Bugfix for [2658090] - public String toString() { - return item.getUniqueShortClassNameWithVersion(); - } - } - - - /** - * RobotNameCellRender, which renders the list cells with "Team: " prefix, and with or without package names. - * This is cheating, as the ItemWrapper.toString() delivers the string used for keyboard navigation etc. - */ - private static class RobotNameCellRenderer extends JLabel implements ListCellRenderer { - private boolean useShortName = false; - - public RobotNameCellRenderer() { - setOpaque(true); - } - - public void setUseShortName(boolean useShortNames) { - this.useShortName = useShortNames; - } - - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - - setComponentOrientation(list.getComponentOrientation()); - - if (isSelected) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } - - String text; - - if (value instanceof ItemWrapper) { - IRobotSpecItem item = ((ItemWrapper) value).getItem(); - - text = (item.isTeam() ? "Team: " : ""); - text += useShortName - ? item.getUniqueShortClassNameWithVersion() - : item.getUniqueFullClassNameWithVersion(); - } else { - text = value.toString(); - } - setText(text); - - setEnabled(list.isEnabled()); - setFont(list.getFont()); - - return this; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BaseScoreDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BaseScoreDialog.java deleted file mode 100644 index a451d95..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BaseScoreDialog.java +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.ui.IWindowManager; -import net.sf.robocode.ui.IWindowManagerExt; - -import javax.swing.*; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableColumn; -import java.awt.*; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; - - -/** - * @author Pavel Savara (original) - */ -@SuppressWarnings("serial") -public abstract class BaseScoreDialog extends JDialog { - protected final IWindowManagerExt windowManager; - - private final EventHandler eventHandler = new EventHandler(); - protected JPanel contentPane; - protected JScrollPane scrollPane; - protected JTable table; - protected Dimension tableSize; - - public BaseScoreDialog(IWindowManager windowManager, boolean modal) { - // In order to prevent the dialog from hiding, null must be given as 'owner' parameter - super(windowManager != null ? windowManager.getRobocodeFrame() : null, modal); - this.windowManager = (IWindowManagerExt) windowManager; - } - - protected void initialize() { - addComponentListener(eventHandler); - setContentPane(getDialogContentPane()); - } - - /** - * Return the content pane. - * - * @return JPanel - */ - protected JPanel getDialogContentPane() { - if (contentPane == null) { - contentPane = new JPanel(); - contentPane.setLayout(new BorderLayout()); - contentPane.add(getScrollPane(), "Center"); - } - return contentPane; - } - - /** - * Return the scroll pane - * - * @return JScrollPane - */ - protected JScrollPane getScrollPane() { - if (scrollPane == null) { - scrollPane = new JScrollPane(); - scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.getViewport().setScrollMode(JViewport.BLIT_SCROLL_MODE); - scrollPane.setViewportView(getTable()); - scrollPane.setColumnHeaderView(table.getTableHeader()); - scrollPane.addComponentListener(eventHandler); - - tableSize = new Dimension(getTable().getColumnModel().getTotalColumnWidth(), - getTable().getModel().getRowCount() * (getTable().getRowHeight())); - table.setPreferredScrollableViewportSize(tableSize); - table.setPreferredSize(tableSize); - table.setMinimumSize(tableSize); - } - return scrollPane; - } - - /** - * Return the table. - * - * @return JTable - */ - protected JTable getTable() { - if (table == null) { - table = new JTable(); - table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - table.setColumnSelectionAllowed(true); - table.setRowSelectionAllowed(true); - table.getTableHeader().setReorderingAllowed(false); - } - return table; - } - - private class EventHandler implements ComponentListener { - public void componentShown(ComponentEvent e) { - onDialogShown(); - } - - public void componentHidden(ComponentEvent e) { - onDialogHidden(); - } - - public void componentResized(ComponentEvent e) { - if (e.getSource() == BaseScoreDialog.this.getScrollPane()) { - scrollPaneComponentResized(); - } - } - - public void componentMoved(ComponentEvent e) {} - } - - protected abstract AbstractTableModel getTableModel(); - - protected void onDialogShown() {} - - protected void onDialogHidden() { - dispose(); - } - - protected void scrollPaneComponentResized() { - // This code is not working... - Dimension scrollPaneExtent = getScrollPane().getViewport().getExtentSize(); - - if (tableSize != null && (tableSize.width < scrollPaneExtent.width)) { - getTable().setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); - getTable().setSize(scrollPaneExtent); - getTable().sizeColumnsToFit(-1); - } else { - if (tableSize != null) { - getTable().setSize(tableSize); - getTable().sizeColumnsToFit(-1); - } - table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - } - validate(); - repaint(); - } - - protected void setResultsData() { - getTable().setModel(getTableModel()); - int maxScoreColWidth = 0; - - for (int x = 0; x < getTableModel().getColumnCount(); x++) { - if (x != 1) { - getTable().getColumnModel().getColumn(x).setCellRenderer(new ResultsTableCellRenderer(false)); - } - TableColumn column = getTable().getColumnModel().getColumn(x); - Component comp; - - column.setHeaderRenderer(new ResultsTableCellRenderer(true)); - comp = column.getHeaderRenderer().getTableCellRendererComponent(null, column.getHeaderValue(), false, false, - 0, 0); - int width = comp.getPreferredSize().width; - - for (int y = 0; y < getTableModel().getRowCount(); y++) { - comp = getTable().getDefaultRenderer(getTableModel().getColumnClass(x)).getTableCellRendererComponent( - getTable(), getTableModel().getValueAt(y, x), false, false, 0, x); - if (comp.getPreferredSize().width > width) { - width = comp.getPreferredSize().width; - } - } - TableColumn col = getTable().getColumnModel().getColumn(x); - - col.setPreferredWidth(width); - col.setMinWidth(width); - col.setWidth(width); - - if (x >= 3 && width > maxScoreColWidth) { - maxScoreColWidth = width; - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleButton.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleButton.java deleted file mode 100644 index 0e506b8..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleButton.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Pavel Savara (original) - */ -public class BattleButton extends JButton implements ActionListener { - private static final long serialVersionUID = 1L; - - private final BattleDialog battleDialog; - - public BattleButton(BattleDialog battleDialog) { - this.battleDialog = battleDialog; - - initialize(); - } - - public void actionPerformed(ActionEvent e) { - attach(); - if (!battleDialog.isVisible() || battleDialog.getState() != Frame.NORMAL) { - WindowUtil.packPlaceShow(battleDialog); - } else { - battleDialog.setVisible(true); - } - } - - /** - * Initialize the class. - */ - private void initialize() { - addActionListener(this); - setPreferredSize(new Dimension(110, 25)); - setMinimumSize(new Dimension(110, 25)); - setMaximumSize(new Dimension(110, 25)); - setHorizontalAlignment(SwingConstants.CENTER); - setMargin(new Insets(0, 0, 0, 0)); - setText("Main battle log"); - setToolTipText("Main battle log"); - } - - public void attach() { - battleDialog.attach(); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleDialog.java deleted file mode 100644 index 7f5b58f..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/BattleDialog.java +++ /dev/null @@ -1,244 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.serialization.IXmlSerializable; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.serialization.XmlWriter; -import net.sf.robocode.ui.IWindowManager; -import robocode.control.events.*; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; -import java.io.StringWriter; - - -/** - * @author Pavel Savara (original) - */ -public class BattleDialog extends JFrame { - private static final long serialVersionUID = 1L; - - private final BattleObserver battleObserver = new BattleObserver(); - - private ConsoleScrollPane consoleScrollPane; - private ConsoleScrollPane turnSnapshotScrollPane; - private JTabbedPane tabbedPane; - private JButton okButton; - private JButton clearButton; - private JPanel battleDialogContentPane; - private JPanel buttonPanel; - - private final IWindowManager windowManager; - private boolean isListening; - private ITurnSnapshot lastSnapshot; - private boolean paintSnapshot; - - public BattleDialog(IWindowManager windowManager) { - this.windowManager = windowManager; - initialize(); - } - - private void initialize() { - this.setTitle("Main battle log"); - this.add(getBattleDialogContentPane()); - pack(); - } - - public void detach() { - if (isListening) { - windowManager.removeBattleListener(battleObserver); - isListening = false; - } - } - - public void reset() { - getConsoleScrollPane().setText(null); - getTurnSnapshotScrollPane().setText(null); - lastSnapshot = null; - } - - public void attach() { - if (!isListening) { - isListening = true; - windowManager.addBattleListener(battleObserver); - } - } - - /** - * When robotDialog is packed, we want to set a reasonable size. However, - * after that, we need a null preferred size so the scroll pane will scroll. - * (preferred size should be based on the text inside) - */ - @Override - public void pack() { - getConsoleScrollPane().setPreferredSize(new Dimension(426, 200)); - super.pack(); - getTabbedPane().setPreferredSize(null); - } - - private JPanel getBattleDialogContentPane() { - if (battleDialogContentPane == null) { - battleDialogContentPane = new JPanel(); - battleDialogContentPane.setLayout(new BorderLayout()); - battleDialogContentPane.add(getTabbedPane()); - battleDialogContentPane.add(getButtonPanel(), BorderLayout.SOUTH); - } - return battleDialogContentPane; - } - - private JPanel getButtonPanel() { - if (buttonPanel == null) { - buttonPanel = new JPanel(); - buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); - buttonPanel.add(getOkButton()); - buttonPanel.add(getClearButton()); - } - return buttonPanel; - } - - private JButton getOkButton() { - if (okButton == null) { - okButton = getNewButton("OK"); - } - return okButton; - } - - private JButton getClearButton() { - if (clearButton == null) { - clearButton = getNewButton("Clear"); - } - return clearButton; - } - - private JButton getNewButton(String text) { - JButton button = new JButton(text); - - button.addActionListener(eventHandler); - return button; - } - - private final transient ActionListener eventHandler = new ActionListener() { - public void actionPerformed(ActionEvent e) { - Object src = e.getSource(); - - if (src == BattleDialog.this.getOkButton()) { - okButtonActionPerformed(); - } else if (src == BattleDialog.this.getClearButton()) { - clearButtonActionPerformed(); - } - } - }; - - private JTabbedPane getTabbedPane() { - if (tabbedPane == null) { - tabbedPane = new JTabbedPane(); - tabbedPane.setLayout(new BorderLayout()); - tabbedPane.addTab("Console", getConsoleScrollPane()); - tabbedPane.addTab("Turn Snapshot", getTurnSnapshotScrollPane()); - tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); - - tabbedPane.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - paintSnapshot = (tabbedPane.getSelectedIndex() == 1); - paintSnapshot(); - } - }); - } - return tabbedPane; - } - - private ConsoleScrollPane getConsoleScrollPane() { - if (consoleScrollPane == null) { - consoleScrollPane = new ConsoleScrollPane(); - } - return consoleScrollPane; - } - - private ConsoleScrollPane getTurnSnapshotScrollPane() { - if (turnSnapshotScrollPane == null) { - turnSnapshotScrollPane = new ConsoleScrollPane(); - } - return turnSnapshotScrollPane; - } - - private void okButtonActionPerformed() { - dispose(); - } - - private void clearButtonActionPerformed() { - reset(); - } - - private void paintSnapshot() { - if (paintSnapshot) { - String text = null; - - if (lastSnapshot != null) { - final StringWriter writer = new StringWriter(); - final XmlWriter xmlWriter = new XmlWriter(writer, true); - - try { - ((IXmlSerializable) lastSnapshot).writeXml(xmlWriter, new SerializableOptions(false)); - writer.close(); - } catch (IOException e) { - Logger.logError(e); - } - text = writer.toString(); - } - getTurnSnapshotScrollPane().setText(text); - } - } - - private class BattleObserver extends BattleAdaptor { - - @Override - public void onBattleMessage(BattleMessageEvent event) { - final String text = event.getMessage(); - - if (text != null && text.length() > 0) { - getConsoleScrollPane().append(text + "\n"); - getConsoleScrollPane().scrollToBottom(); - } - } - - @Override - public void onBattleError(BattleErrorEvent event) { - final String text = event.getError(); - - if (text != null && text.length() > 0) { - getConsoleScrollPane().append(text + "\n"); - getConsoleScrollPane().scrollToBottom(); - } - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - lastSnapshot = event.getTurnSnapshot(); - paintSnapshot(); - } - - public void onBattleStarted(final BattleStartedEvent event) { - reset(); - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - lastSnapshot = null; - paintSnapshot(); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleDialog.java deleted file mode 100644 index c72fb18..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleDialog.java +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import java.awt.*; -import java.awt.datatransfer.StringSelection; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class ConsoleDialog extends JDialog { - private JPanel consoleDialogContentPane; - private JPanel buttonsPanel; - private ConsoleScrollPane scrollPane; - private JButton okButton; - private JMenu editMenu; - private JMenuItem editCopyMenuItem; - private JMenuBar consoleDialogMenuBar; - private final EventHandler eventHandler = new EventHandler(); - - private class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (e.getSource() == ConsoleDialog.this.getOkButton() || e.getSource() == getConsoleDialogContentPane()) { - okButtonActionPerformed(); - } - if (e.getSource() == getEditCopyMenuItem()) { - editCopyActionPerformed(); - } - } - } - - public ConsoleDialog() { - super(); - initialize(); - } - - public ConsoleDialog(Frame owner, String title, boolean modal) { - super(owner, title, modal); - initialize(); - } - - public void append(String text) { - getScrollPane().append(text); - } - - public void editCopyActionPerformed() { - StringSelection ss; - String s = getScrollPane().getSelectedText(); - - if (s == null) { - s = getScrollPane().getText(); - } - ss = new StringSelection(s); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); - } - - private JPanel getButtonsPanel() { - if (buttonsPanel == null) { - buttonsPanel = new JPanel(); - buttonsPanel.setPreferredSize(new Dimension(100, 30)); - buttonsPanel.setLayout(new GridBagLayout()); - buttonsPanel.setMinimumSize(new Dimension(20, 20)); - buttonsPanel.setMaximumSize(new Dimension(1000, 30)); - - GridBagConstraints constraintsOKButton = new GridBagConstraints(); - - constraintsOKButton.gridx = 1; - constraintsOKButton.gridy = 1; - constraintsOKButton.ipadx = 34; - constraintsOKButton.insets = new Insets(2, 173, 3, 168); - getButtonsPanel().add(getOkButton(), constraintsOKButton); - } - return buttonsPanel; - } - - private JPanel getConsoleDialogContentPane() { - if (consoleDialogContentPane == null) { - consoleDialogContentPane = new JPanel(); - consoleDialogContentPane.setLayout(new BorderLayout()); - consoleDialogContentPane.add(getButtonsPanel(), "South"); - consoleDialogContentPane.add(getScrollPane(), "Center"); - consoleDialogContentPane.registerKeyboardAction(eventHandler, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), - JComponent.WHEN_FOCUSED); - } - return consoleDialogContentPane; - } - - public JMenuBar getConsoleDialogMenuBar() { - if (consoleDialogMenuBar == null) { - consoleDialogMenuBar = new JMenuBar(); - consoleDialogMenuBar.add(getEditMenu()); - } - return consoleDialogMenuBar; - } - - public JMenuItem getEditCopyMenuItem() { - if (editCopyMenuItem == null) { - editCopyMenuItem = new JMenuItem("Copy"); - editCopyMenuItem.addActionListener(eventHandler); - } - return editCopyMenuItem; - } - - public JMenu getEditMenu() { - if (editMenu == null) { - editMenu = new JMenu("Edit"); - editMenu.add(getEditCopyMenuItem()); - } - return editMenu; - } - - public JButton getOkButton() { - if (okButton == null) { - okButton = new JButton(); - okButton.setText("OK"); - okButton.addActionListener(eventHandler); - } - return okButton; - } - - private ConsoleScrollPane getScrollPane() { - if (scrollPane == null) { - scrollPane = new ConsoleScrollPane(); - } - return scrollPane; - } - - private void initialize() { - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setSize(500, 400); - setContentPane(getConsoleDialogContentPane()); - setJMenuBar(getConsoleDialogMenuBar()); - } - - public void okButtonActionPerformed() { - dispose(); - } - - public void processStream(java.io.InputStream in) { - scrollPane.processStream(in); - } - - public void scrollToBottom() { - getScrollPane().scrollToBottom(); - } - - public void setText(String text) { - getScrollPane().setText(text); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleScrollPane.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleScrollPane.java deleted file mode 100644 index 267d4dd..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ConsoleScrollPane.java +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import javax.swing.text.DefaultCaret; - -import java.awt.*; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Pavel Savara (contributor) - */ -@SuppressWarnings("serial") -public class ConsoleScrollPane extends JScrollPane { - - private static final int MAX_ROWS = 500; - private static final String TEXT_TRUNCATED_MSG = "^^^ TEXT TRUNCATED ^^^"; - - private JTextArea textArea; - private int lines; - private int maxRows; - - public ConsoleScrollPane() { - super(); - setViewportView(getTextPane()); - } - - public JTextArea getTextPane() { - if (textArea == null) { - textArea = new JTextArea(); - - textArea.setEditable(false); - textArea.setTabSize(4); - textArea.setBackground(Color.DARK_GRAY); - textArea.setForeground(Color.WHITE); - textArea.setBounds(0, 0, 1000, 1000); - textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); - - // Make sure the caret is not reset every time text is updated, meaning that - // the view will not reset it's position until we want it to. - ((DefaultCaret) textArea.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE); - } - return textArea; - } - - public void append(String str) { - // Return if the string is null or empty - if (str == null || str.length() == 0) { - return; - } - // Append the new string to the text pane - getTextPane().append(str); - - // Count number of new lines, i.e. lines ended with '\n' - int numNewLines = str.replaceAll("[^\\n]", "").length(); - - // Increment the current number of lines with the new lines - lines += numNewLines; - - // Calculate number lines exceeded compared to the max. number of lines - int linesExceeded = lines - MAX_ROWS; - - // Check if we exceeded the number of max. lines - if (linesExceeded > 0) { - // We use a rolling buffer so that the oldest lines are removed first. - // Remove the number of lines we are exceeding in the beginning of the contained text. - - // Cut down the number of lines to max. number of lines - lines = MAX_ROWS; - - // Find the index where to cut the number of exceeding lines in the beginning of the text - String text = getText(); - int cutIndex = -1; - - for (int c = 0; c < linesExceeded; c++) { - cutIndex = text.indexOf('\n', cutIndex + 1); - } - // Replace the first lines of the contained text till the cut index - textArea.replaceRange(null, 0, cutIndex + 1); - - // Replace first line with a message that text has been truncated - textArea.replaceRange(TEXT_TRUNCATED_MSG, 0, getText().indexOf('\n')); - } - - // Set the max. number of lines text pane - maxRows = Math.max(maxRows, lines); - textArea.setRows(maxRows); - } - - public String getSelectedText() { - return getTextPane().getSelectedText(); - } - - public String getText() { - return getTextPane().getText(); - } - - public void setText(String t) { - // Return if the string is null or empty - if (t == null || t.length() == 0) { - t = null; - lines = 0; - maxRows = 0; - } else { - // Calculate and set the new number of lines for the text pane - lines = t.replaceAll("[^\\n]", "").length(); - - // Calculate number lines exceeded compared to the max. number of lines - int linesExceeded = lines - MAX_ROWS; - - // Check if we exceeded the number of max. lines - if (linesExceeded > 0) { - // We use a rolling buffer so that the oldest lines are removed first. - // Remove the number of lines we are exceeding in the beginning of the contained text. - - // Cut down the number of lines to max. number of lines - lines = MAX_ROWS; - - // Find the index where to cut the number of exceeding lines in the beginning of the text - int index = -1; - - for (int c = 0; c < linesExceeded; c++) { - index = t.indexOf('\n', index + 1); - } - // Replace the first lines of the contained text till the cut index - t = t.substring(index + 1); - - // Replace first line with a message that text has been truncated - t = TEXT_TRUNCATED_MSG + t.substring(t.indexOf('\n') + 1); - } - } - // Set the text on the text pane - textArea.setText(t); - - // Set the max. number of lines text pane - maxRows = Math.max(maxRows, lines); - textArea.setRows(maxRows); - } - - public void processStream(InputStream input) { - BufferedReader br = new BufferedReader(new InputStreamReader(input)); - String line; - - try { - while ((line = br.readLine()) != null) { - append(line + "\n"); - } - } catch (IOException e) { - append("SYSTEM: IOException: " + e); - } - scrollToBottom(); - } - - public void scrollToBottom() { - textArea.setCaretPosition(textArea.getDocument().getLength()); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/MenuBar.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/MenuBar.java deleted file mode 100644 index ea9e7ab..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/MenuBar.java +++ /dev/null @@ -1,939 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.host.ICpuManager; -import net.sf.robocode.recording.BattleRecordFormat; -import net.sf.robocode.recording.IRecordManager; -import net.sf.robocode.serialization.SerializableOptions; -import net.sf.robocode.settings.ISettingsListener; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.IWindowManagerExt; -import net.sf.robocode.ui.editor.IRobocodeEditor; -import static net.sf.robocode.ui.util.ShortcutUtil.MENU_SHORTCUT_KEY_MASK; - -import javax.swing.*; -import javax.swing.event.MenuEvent; -import javax.swing.event.MenuListener; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; - - -/** - * Handles menu display and interaction for Robocode. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - * @author Luis Crespo (contributor) - */ -@SuppressWarnings("serial") -public class MenuBar extends JMenuBar { - - // Battle menu - private JMenu battleMenu; - private JMenuItem battleNewMenuItem; - private JMenuItem battleOpenMenuItem; - private JMenuItem battleSaveMenuItem; - private JMenuItem battleSaveAsMenuItem; - private JMenuItem battleExitMenuItem; - private JMenuItem battleOpenRecordMenuItem; - private JMenuItem battleSaveRecordAsMenuItem; - private JMenuItem battleExportRecordMenuItem; - private JMenuItem battleImportRecordMenuItem; - private JMenuItem battleTakeScreenshotMenuItem; - - // Robot menu - private JMenu robotMenu; - private JMenuItem robotEditorMenuItem; - private JMenuItem robotImportMenuItem; - private JMenuItem robotPackagerMenuItem; - private JMenuItem robotCreateTeamMenuItem; - - // Options menu - private JMenu optionsMenu; - private JMenuItem optionsPreferencesMenuItem; - private JMenuItem optionsFitWindowMenuItem; - private JCheckBoxMenuItem optionsShowRankingCheckBoxMenuItem; - private JMenuItem optionsRecalculateCpuConstantMenuItem; - private JMenuItem optionsCleanRobotCacheMenuItem; - - // Help Menu - private JMenu helpMenu; - private JMenuItem helpReadMeMenuItem; - private JMenuItem helpOnlineHelpMenuItem; - private JMenuItem helpCheckForNewVersionMenuItem; - private JMenuItem helpVersionsTxtMenuItem; - private JMenuItem helpRobocodeApiMenuItem; - private JMenuItem helpJavaDocumentationMenuItem; - private JMenuItem helpFaqMenuItem; - private JMenuItem helpAboutMenuItem; - private JMenuItem helpRobocodeMenuItem; - private JMenuItem helpRoboWikiMenuItem; - private JMenuItem helpGoogleGroupRobocodeMenuItem; - private JMenuItem helpRobocodeRepositoryMenuItem; - - private class EventHandler implements ActionListener, MenuListener { - public void actionPerformed(ActionEvent e) { - Object source = e.getSource(); - MenuBar mb = MenuBar.this; - - // Battle menu - if (source == mb.getBattleNewMenuItem()) { - battleNewActionPerformed(); - } else if (source == mb.getBattleOpenMenuItem()) { - battleOpenActionPerformed(); - } else if (source == mb.getBattleSaveMenuItem()) { - battleSaveActionPerformed(); - } else if (source == mb.getBattleSaveAsMenuItem()) { - battleSaveAsActionPerformed(); - } else if (source == mb.getBattleOpenRecordMenuItem()) { - battleOpenRecordActionPerformed(); - } else if (source == mb.getBattleImportRecordMenuItem()) { - battleImportRecordActionPerformed(); - } else if (source == mb.getBattleSaveRecordAsMenuItem()) { - battleSaveRecordAsActionPerformed(); - } else if (source == mb.getBattleExportRecordMenuItem()) { - battleExportRecordActionPerformed(); - } else if (source == mb.getBattleTakeScreenshotMenuItem()) { - battleTakeScreenshotActionPerformed(); - } else if (source == mb.getBattleExitMenuItem()) { - battleExitActionPerformed(); - - // Robot Editor menu - } else if (source == mb.getRobotEditorMenuItem()) { - robotEditorActionPerformed(); - } else if (source == mb.getRobotImportMenuItem()) { - robotImportActionPerformed(); - } else if (source == mb.getRobotPackagerMenuItem()) { - robotPackagerActionPerformed(); - - // Team / Create Team menu - } else if (source == mb.getRobotCreateTeamMenuItem()) { - teamCreateTeamActionPerformed(); - - // Options / Preferences menu - } else if (source == mb.getOptionsPreferencesMenuItem()) { - optionsPreferencesActionPerformed(); - } else if (source == mb.getOptionsFitWindowMenuItem()) { - optionsFitWindowActionPerformed(); - } else if (source == mb.getOptionsShowRankingCheckBoxMenuItem()) { - optionsShowRankingActionPerformed(); - } else if (source == mb.getOptionsRecalculateCpuConstantMenuItem()) { - optionsRecalculateCpuConstantPerformed(); - } else if (source == mb.getOptionsCleanRobotCacheMenuItem()) { - optionsCleanRobotCachePerformed(); - - // Help menu - } else if (source == mb.getReadMeMenuItem()) { - helpReadMeActionPerformed(); - } else if (source == mb.getHelpOnlineHelpMenuItem()) { - helpOnlineHelpActionPerformed(); - } else if (source == mb.getHelpRobocodeApiMenuItem()) { - helpRobocodeApiActionPerformed(); - } else if (source == mb.getHelpJavaDocumentationMenuItem()) { - helpJavaDocumentationActionPerformed(); - } else if (source == mb.getHelpFaqMenuItem()) { - helpFaqActionPerformed(); - } else if (source == mb.getHelpRobocodeMenuItem()) { - helpRobocodeHomeMenuItemActionPerformed(); - } else if (source == mb.getHelpRoboWikiMenuItem()) { - helpRoboWikiMenuItemActionPerformed(); - } else if (source == mb.getHelpGoogleGroupRobocodeMenuItem()) { - helpGoogleGroupRobocodeActionPerformed(); - } else if (source == mb.getHelpRobocodeRepositoryMenuItem()) { - helpRobocodeRepositoryActionPerformed(); - } else if (source == mb.getHelpCheckForNewVersionMenuItem()) { - helpCheckForNewVersionActionPerformed(); - } else if (source == mb.getHelpVersionsTxtMenuItem()) { - helpVersionsTxtActionPerformed(); - } else if (source == mb.getHelpAboutMenuItem()) { - helpAboutActionPerformed(); - } - } - - public void menuDeselected(MenuEvent e) { - battleManager.resumeBattle(); - } - - public void menuSelected(MenuEvent e) { - battleManager.pauseBattle(); - } - - public void menuCanceled(MenuEvent e) {} - } - - public final MenuBar.EventHandler eventHandler = new EventHandler(); - - private RobocodeFrame robocodeFrame; - private final ISettingsManager properties; - private final IWindowManagerExt windowManager; - private final IBattleManager battleManager; - private final IRecordManager recordManager; - private final ICpuManager cpuManager; - - public MenuBar(ISettingsManager properties, - IWindowManagerExt windowManager, - IBattleManager battleManager, - IRecordManager recordManager, - ICpuManager cpuManager) { - this.properties = properties; - this.windowManager = windowManager; - this.battleManager = battleManager; - this.recordManager = recordManager; - this.cpuManager = cpuManager; - - // FNL: Make sure that menus are heavy-weight components so that the menus are not painted - // behind the BattleView which is a heavy-weight component. This must be done before - // adding any menu to the menubar. - JPopupMenu.setDefaultLightWeightPopupEnabled(false); - - add(getBattleMenu()); - add(getRobotMenu()); - add(getOptionsMenu()); - add(getHelpMenu()); - } - - public void setup(RobocodeFrame robocodeFrame) { - this.robocodeFrame = robocodeFrame; - } - - private void battleExitActionPerformed() { - robocodeFrame.dispose(); - } - - /** - * Handle battleNew menu item action - */ - private void battleNewActionPerformed() { - windowManager.showNewBattleDialog(battleManager.getBattleProperties()); - } - - private void battleOpenActionPerformed() { - try { - battleManager.pauseBattle(); - - String path = windowManager.showBattleOpenDialog(".battle", "Battles"); - if (path != null) { - battleManager.setBattleFilename(path); - windowManager.showNewBattleDialog(battleManager.loadBattleProperties()); - } - } finally { - battleManager.resumeBattle(); - } - } - - private void battleSaveActionPerformed() { - try { - battleManager.pauseBattle(); - String path = battleManager.getBattleFilename(); - - if (path == null) { - path = windowManager.saveBattleDialog(battleManager.getBattlePath(), ".battle", "Battles"); - } - if (path != null) { - battleManager.setBattleFilename(path); - battleManager.saveBattleProperties(); - } - } finally { - battleManager.resumeBattle(); - } - } - - private void battleSaveAsActionPerformed() { - try { - battleManager.pauseBattle(); - - String path = windowManager.saveBattleDialog(battleManager.getBattlePath(), ".battle", "Battles"); - - if (path != null) { - battleManager.setBattleFilename(path); - battleManager.saveBattleProperties(); - } - } finally { - battleManager.resumeBattle(); - } - } - - private void battleOpenRecordActionPerformed() { - try { - battleManager.pauseBattle(); - - String path = windowManager.showBattleOpenDialog(".br", "Records"); - - if (path != null) { - battleManager.stop(true); - - robocodeFrame.getReplayButton().setVisible(true); - robocodeFrame.getReplayButton().setEnabled(true); - - getBattleSaveRecordAsMenuItem().setEnabled(true); - getBattleExportRecordMenuItem().setEnabled(true); - - try { - robocodeFrame.setBusyPointer(true); - recordManager.loadRecord(path, BattleRecordFormat.BINARY_ZIP); - } finally { - robocodeFrame.setBusyPointer(false); - } - battleManager.replay(); - } - } finally { - battleManager.resumeBattle(); - } - } - - private void battleImportRecordActionPerformed() { - try { - battleManager.pauseBattle(); - - String path = windowManager.showBattleOpenDialog(".br.xml", "XML Records"); - - if (path != null) { - battleManager.stop(true); - - robocodeFrame.getReplayButton().setVisible(true); - robocodeFrame.getReplayButton().setEnabled(true); - - getBattleSaveRecordAsMenuItem().setEnabled(true); - getBattleExportRecordMenuItem().setEnabled(true); - - try { - robocodeFrame.setBusyPointer(true); - recordManager.loadRecord(path, BattleRecordFormat.XML); - } finally { - robocodeFrame.setBusyPointer(false); - } - battleManager.replay(); - } - } finally { - battleManager.resumeBattle(); - } - } - - private void battleSaveRecordAsActionPerformed() { - if (recordManager.hasRecord()) { - try { - battleManager.pauseBattle(); - - String path = windowManager.saveBattleDialog(battleManager.getBattlePath(), ".br", "Records"); - - if (path != null) { - try { - robocodeFrame.setBusyPointer(true); - recordManager.saveRecord(path, BattleRecordFormat.BINARY_ZIP, new SerializableOptions(false)); - } finally { - robocodeFrame.setBusyPointer(false); - } - } - } finally { - battleManager.resumeBattle(); - } - } - } - - private void battleExportRecordActionPerformed() { - if (recordManager.hasRecord()) { - try { - battleManager.pauseBattle(); - - String path = windowManager.saveBattleDialog(battleManager.getBattlePath(), ".br.xml", "XML Records"); - - if (path != null) { - try { - robocodeFrame.setBusyPointer(true); - recordManager.saveRecord(path, BattleRecordFormat.XML, new SerializableOptions(false)); - } finally { - robocodeFrame.setBusyPointer(false); - } - } - } finally { - battleManager.resumeBattle(); - } - } - } - - private void battleTakeScreenshotActionPerformed() { - robocodeFrame.takeScreenshot(); - } - - private JMenuItem getBattleExitMenuItem() { - if (battleExitMenuItem == null) { - battleExitMenuItem = new JMenuItem(); - battleExitMenuItem.setText("Exit"); - battleExitMenuItem.setMnemonic('x'); - battleExitMenuItem.setDisplayedMnemonicIndex(1); - battleExitMenuItem.addActionListener(eventHandler); - } - return battleExitMenuItem; - } - - public JMenu getBattleMenu() { - if (battleMenu == null) { - battleMenu = new JMenu(); - battleMenu.setText("Battle"); - battleMenu.setMnemonic('B'); - battleMenu.add(getBattleNewMenuItem()); - battleMenu.add(getBattleOpenMenuItem()); - battleMenu.add(new JSeparator()); - battleMenu.add(getBattleSaveMenuItem()); - battleMenu.add(getBattleSaveAsMenuItem()); - battleMenu.add(new JSeparator()); - battleMenu.add(getBattleOpenRecordMenuItem()); - battleMenu.add(getBattleSaveRecordAsMenuItem()); - battleMenu.add(getBattleImportRecordMenuItem()); - battleMenu.add(getBattleExportRecordMenuItem()); - battleMenu.add(new JSeparator()); - battleMenu.add(getBattleTakeScreenshotMenuItem()); - battleMenu.add(new JSeparator()); - battleMenu.add(getBattleExitMenuItem()); - battleMenu.addMenuListener(eventHandler); - } - return battleMenu; - } - - private JMenuItem getBattleNewMenuItem() { - if (battleNewMenuItem == null) { - battleNewMenuItem = new JMenuItem(); - battleNewMenuItem.setText("New"); - battleNewMenuItem.setMnemonic('N'); - battleNewMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, MENU_SHORTCUT_KEY_MASK, false)); - battleNewMenuItem.addActionListener(eventHandler); - } - return battleNewMenuItem; - } - - private JMenuItem getBattleOpenMenuItem() { - if (battleOpenMenuItem == null) { - battleOpenMenuItem = new JMenuItem(); - battleOpenMenuItem.setText("Open"); - battleOpenMenuItem.setMnemonic('O'); - battleOpenMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, MENU_SHORTCUT_KEY_MASK, false)); - battleOpenMenuItem.addActionListener(eventHandler); - } - return battleOpenMenuItem; - } - - public JMenuItem getBattleSaveAsMenuItem() { - if (battleSaveAsMenuItem == null) { - battleSaveAsMenuItem = new JMenuItem(); - battleSaveAsMenuItem.setText("Save As"); - battleSaveAsMenuItem.setMnemonic('A'); - battleSaveAsMenuItem.setDisplayedMnemonicIndex(5); - battleSaveAsMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_SHORTCUT_KEY_MASK | InputEvent.SHIFT_MASK, false)); - battleSaveAsMenuItem.setEnabled(false); - battleSaveAsMenuItem.addActionListener(eventHandler); - } - return battleSaveAsMenuItem; - } - - public JMenuItem getBattleSaveMenuItem() { - if (battleSaveMenuItem == null) { - battleSaveMenuItem = new JMenuItem(); - battleSaveMenuItem.setText("Save"); - battleSaveMenuItem.setMnemonic('S'); - battleSaveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_SHORTCUT_KEY_MASK, false)); - battleSaveMenuItem.setEnabled(false); - battleSaveMenuItem.addActionListener(eventHandler); - } - return battleSaveMenuItem; - } - - private JMenuItem getBattleOpenRecordMenuItem() { - if (battleOpenRecordMenuItem == null) { - battleOpenRecordMenuItem = new JMenuItem(); - battleOpenRecordMenuItem.setText("Open Record"); - battleOpenRecordMenuItem.setMnemonic('d'); - battleOpenRecordMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_O, MENU_SHORTCUT_KEY_MASK | InputEvent.SHIFT_MASK, false)); - battleOpenRecordMenuItem.addActionListener(eventHandler); - } - return battleOpenRecordMenuItem; - } - - private JMenuItem getBattleImportRecordMenuItem() { - if (battleImportRecordMenuItem == null) { - battleImportRecordMenuItem = new JMenuItem(); - battleImportRecordMenuItem.setText("Import XML Record"); - battleImportRecordMenuItem.setMnemonic('I'); - battleImportRecordMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_I, MENU_SHORTCUT_KEY_MASK, false)); - battleImportRecordMenuItem.addActionListener(eventHandler); - } - return battleImportRecordMenuItem; - } - - public JMenuItem getBattleSaveRecordAsMenuItem() { - if (battleSaveRecordAsMenuItem == null) { - battleSaveRecordAsMenuItem = new JMenuItem(); - battleSaveRecordAsMenuItem.setText("Save Record"); - battleSaveRecordAsMenuItem.setMnemonic('R'); - battleSaveRecordAsMenuItem.setDisplayedMnemonicIndex(5); - battleSaveRecordAsMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK, false)); - battleSaveRecordAsMenuItem.setEnabled(false); - battleSaveRecordAsMenuItem.addActionListener(eventHandler); - - ISettingsManager props = properties; - - props.addPropertyListener( - new ISettingsListener() { - public void settingChanged(String property) { - if (property.equals(ISettingsManager.OPTIONS_COMMON_ENABLE_REPLAY_RECORDING)) { - final boolean canReplayRecord = recordManager.hasRecord(); - final boolean enableSaveRecord = properties.getOptionsCommonEnableReplayRecording() - & canReplayRecord; - - battleSaveRecordAsMenuItem.setEnabled(enableSaveRecord); - } - } - }); - } - return battleSaveRecordAsMenuItem; - } - - public JMenuItem getBattleExportRecordMenuItem() { - if (battleExportRecordMenuItem == null) { - battleExportRecordMenuItem = new JMenuItem(); - battleExportRecordMenuItem.setText("Export XML Record"); - battleExportRecordMenuItem.setMnemonic('E'); - battleExportRecordMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_X, MENU_SHORTCUT_KEY_MASK, false)); - battleExportRecordMenuItem.setEnabled(false); - battleExportRecordMenuItem.addActionListener(eventHandler); - - ISettingsManager props = properties; - - props.addPropertyListener( - new ISettingsListener() { - public void settingChanged(String property) { - if (property.equals(ISettingsManager.OPTIONS_COMMON_ENABLE_REPLAY_RECORDING)) { - final boolean canReplayRecord = recordManager.hasRecord(); - final boolean enableSaveRecord = properties.getOptionsCommonEnableReplayRecording() - & canReplayRecord; - - battleExportRecordMenuItem.setEnabled(enableSaveRecord); - } - } - }); - } - return battleExportRecordMenuItem; - } - - private JMenuItem getBattleTakeScreenshotMenuItem() { - if (battleTakeScreenshotMenuItem == null) { - battleTakeScreenshotMenuItem = new JMenuItem(); - battleTakeScreenshotMenuItem.setText("Take Screenshot"); - battleTakeScreenshotMenuItem.setMnemonic('T'); - battleTakeScreenshotMenuItem.setAccelerator( - KeyStroke.getKeyStroke(KeyEvent.VK_T, MENU_SHORTCUT_KEY_MASK, false)); - battleTakeScreenshotMenuItem.addActionListener(eventHandler); - } - return battleTakeScreenshotMenuItem; - } - - private JMenuItem getHelpAboutMenuItem() { - if (helpAboutMenuItem == null) { - helpAboutMenuItem = new JMenuItem(); - helpAboutMenuItem.setText("About"); - helpAboutMenuItem.setMnemonic('A'); - helpAboutMenuItem.addActionListener(eventHandler); - } - return helpAboutMenuItem; - } - - private JMenuItem getHelpCheckForNewVersionMenuItem() { - if (helpCheckForNewVersionMenuItem == null) { - helpCheckForNewVersionMenuItem = new JMenuItem(); - helpCheckForNewVersionMenuItem.setText("Check for new version"); - helpCheckForNewVersionMenuItem.setMnemonic('C'); - helpCheckForNewVersionMenuItem.addActionListener(eventHandler); - } - return helpCheckForNewVersionMenuItem; - } - - @Override - public JMenu getHelpMenu() { - if (helpMenu == null) { - helpMenu = new JMenu(); - helpMenu.setText("Help"); - helpMenu.setMnemonic('H'); - helpMenu.add(getReadMeMenuItem()); - helpMenu.add(getHelpRobocodeApiMenuItem()); - helpMenu.add(getHelpJavaDocumentationMenuItem()); - helpMenu.add(new JSeparator()); - helpMenu.add(getHelpOnlineHelpMenuItem()); - helpMenu.add(getHelpRoboWikiMenuItem()); - helpMenu.add(getHelpGoogleGroupRobocodeMenuItem()); - helpMenu.add(getHelpFaqMenuItem()); - helpMenu.add(new JSeparator()); - helpMenu.add(getHelpRobocodeMenuItem()); - helpMenu.add(getHelpRobocodeRepositoryMenuItem()); - helpMenu.add(new JSeparator()); - helpMenu.add(getHelpCheckForNewVersionMenuItem()); - helpMenu.add(getHelpVersionsTxtMenuItem()); - helpMenu.add(new JSeparator()); - helpMenu.add(getHelpAboutMenuItem()); - helpMenu.addMenuListener(eventHandler); - } - return helpMenu; - } - - private JMenuItem getHelpFaqMenuItem() { - if (helpFaqMenuItem == null) { - helpFaqMenuItem = new JMenuItem(); - helpFaqMenuItem.setText("Robocode FAQ"); - helpFaqMenuItem.setMnemonic('F'); - helpFaqMenuItem.setDisplayedMnemonicIndex(9); - helpFaqMenuItem.addActionListener(eventHandler); - } - return helpFaqMenuItem; - } - - private JMenuItem getReadMeMenuItem() { - if (helpReadMeMenuItem == null) { - helpReadMeMenuItem = new JMenuItem(); - helpReadMeMenuItem.setText("ReadMe"); - helpReadMeMenuItem.setMnemonic('M'); - helpReadMeMenuItem.setDisplayedMnemonicIndex(4); - helpReadMeMenuItem.addActionListener(eventHandler); - } - return helpReadMeMenuItem; - } - - private JMenuItem getHelpOnlineHelpMenuItem() { - if (helpOnlineHelpMenuItem == null) { - helpOnlineHelpMenuItem = new JMenuItem(); - helpOnlineHelpMenuItem.setText("Online help"); - helpOnlineHelpMenuItem.setMnemonic('O'); - helpOnlineHelpMenuItem.addActionListener(eventHandler); - } - return helpOnlineHelpMenuItem; - } - - private JMenuItem getHelpVersionsTxtMenuItem() { - if (helpVersionsTxtMenuItem == null) { - helpVersionsTxtMenuItem = new JMenuItem(); - helpVersionsTxtMenuItem.setText("Version info"); - helpVersionsTxtMenuItem.setMnemonic('V'); - helpVersionsTxtMenuItem.addActionListener(eventHandler); - } - return helpVersionsTxtMenuItem; - } - - private JMenuItem getHelpRobocodeApiMenuItem() { - if (helpRobocodeApiMenuItem == null) { - helpRobocodeApiMenuItem = new JMenuItem(); - helpRobocodeApiMenuItem.setText("Robocode API"); - helpRobocodeApiMenuItem.setMnemonic('I'); - helpRobocodeApiMenuItem.setDisplayedMnemonicIndex(11); - helpRobocodeApiMenuItem.addActionListener(eventHandler); - } - return helpRobocodeApiMenuItem; - } - - private JMenuItem getHelpRobocodeMenuItem() { - if (helpRobocodeMenuItem == null) { - helpRobocodeMenuItem = new JMenuItem(); - helpRobocodeMenuItem.setText("Robocode home page"); - helpRobocodeMenuItem.setMnemonic('H'); - helpRobocodeMenuItem.setDisplayedMnemonicIndex(9); - helpRobocodeMenuItem.addActionListener(eventHandler); - } - return helpRobocodeMenuItem; - } - - private JMenuItem getHelpJavaDocumentationMenuItem() { - if (helpJavaDocumentationMenuItem == null) { - helpJavaDocumentationMenuItem = new JMenuItem(); - helpJavaDocumentationMenuItem.setText("Java 6 documentation"); - helpJavaDocumentationMenuItem.setMnemonic('J'); - helpJavaDocumentationMenuItem.addActionListener(eventHandler); - } - return helpJavaDocumentationMenuItem; - } - - private JMenuItem getHelpRoboWikiMenuItem() { - if (helpRoboWikiMenuItem == null) { - helpRoboWikiMenuItem = new JMenuItem(); - helpRoboWikiMenuItem.setText("RoboWiki site"); - helpRoboWikiMenuItem.setMnemonic('W'); - helpRoboWikiMenuItem.setDisplayedMnemonicIndex(4); - helpRoboWikiMenuItem.addActionListener(eventHandler); - } - return helpRoboWikiMenuItem; - } - - private JMenuItem getHelpGoogleGroupRobocodeMenuItem() { - if (helpGoogleGroupRobocodeMenuItem == null) { - helpGoogleGroupRobocodeMenuItem = new JMenuItem(); - helpGoogleGroupRobocodeMenuItem.setText("Google Group for Robocode"); - helpGoogleGroupRobocodeMenuItem.setMnemonic('Y'); - helpGoogleGroupRobocodeMenuItem.addActionListener(eventHandler); - } - return helpGoogleGroupRobocodeMenuItem; - } - - private JMenuItem getHelpRobocodeRepositoryMenuItem() { - if (helpRobocodeRepositoryMenuItem == null) { - helpRobocodeRepositoryMenuItem = new JMenuItem(); - helpRobocodeRepositoryMenuItem.setText("Robocode Repository"); - helpRobocodeRepositoryMenuItem.setMnemonic('R'); - helpRobocodeRepositoryMenuItem.setDisplayedMnemonicIndex(9); - helpRobocodeRepositoryMenuItem.addActionListener(eventHandler); - } - return helpRobocodeRepositoryMenuItem; - } - - private JMenuItem getOptionsFitWindowMenuItem() { - if (optionsFitWindowMenuItem == null) { - optionsFitWindowMenuItem = new JMenuItem(); - optionsFitWindowMenuItem.setText("Default window size"); - optionsFitWindowMenuItem.setMnemonic('D'); - optionsFitWindowMenuItem.addActionListener(eventHandler); - } - return optionsFitWindowMenuItem; - } - - public JCheckBoxMenuItem getOptionsShowRankingCheckBoxMenuItem() { - if (optionsShowRankingCheckBoxMenuItem == null) { - optionsShowRankingCheckBoxMenuItem = new JCheckBoxMenuItem(); - optionsShowRankingCheckBoxMenuItem.setText("Show current rankings"); - optionsShowRankingCheckBoxMenuItem.setMnemonic('r'); - optionsShowRankingCheckBoxMenuItem.setDisplayedMnemonicIndex(13); - optionsShowRankingCheckBoxMenuItem.addActionListener(eventHandler); - optionsShowRankingCheckBoxMenuItem.setEnabled(false); - } - return optionsShowRankingCheckBoxMenuItem; - } - - private JMenuItem getOptionsRecalculateCpuConstantMenuItem() { - if (optionsRecalculateCpuConstantMenuItem == null) { - optionsRecalculateCpuConstantMenuItem = new JMenuItem(); - optionsRecalculateCpuConstantMenuItem.setText("Recalculate CPU constant"); - optionsRecalculateCpuConstantMenuItem.setMnemonic('e'); - optionsRecalculateCpuConstantMenuItem.setDisplayedMnemonicIndex(1); - optionsRecalculateCpuConstantMenuItem.addActionListener(eventHandler); - } - return optionsRecalculateCpuConstantMenuItem; - } - - private JMenuItem getOptionsCleanRobotCacheMenuItem() { - if (optionsCleanRobotCacheMenuItem == null) { - optionsCleanRobotCacheMenuItem = new JMenuItem(); - optionsCleanRobotCacheMenuItem.setText("Clean robot cache"); - optionsCleanRobotCacheMenuItem.setMnemonic('C'); - optionsCleanRobotCacheMenuItem.addActionListener(eventHandler); - } - return optionsCleanRobotCacheMenuItem; - } - - private JMenu getOptionsMenu() { - if (optionsMenu == null) { - optionsMenu = new JMenu(); - optionsMenu.setText("Options"); - optionsMenu.setMnemonic('O'); - optionsMenu.add(getOptionsPreferencesMenuItem()); - optionsMenu.add(getOptionsFitWindowMenuItem()); - optionsMenu.add(new JSeparator()); - optionsMenu.add(getOptionsShowRankingCheckBoxMenuItem()); - optionsMenu.add(new JSeparator()); - optionsMenu.add(getOptionsRecalculateCpuConstantMenuItem()); - optionsMenu.add(getOptionsCleanRobotCacheMenuItem()); - optionsMenu.addMenuListener(eventHandler); - } - return optionsMenu; - } - - private JMenuItem getOptionsPreferencesMenuItem() { - if (optionsPreferencesMenuItem == null) { - optionsPreferencesMenuItem = new JMenuItem(); - optionsPreferencesMenuItem.setText("Preferences"); - optionsPreferencesMenuItem.setMnemonic('P'); - optionsPreferencesMenuItem.addActionListener(eventHandler); - } - return optionsPreferencesMenuItem; - } - - private JMenuItem getRobotEditorMenuItem() { - if (robotEditorMenuItem == null) { - robotEditorMenuItem = new JMenuItem(); - robotEditorMenuItem.setText("Source Editor"); - robotEditorMenuItem.setMnemonic('E'); - robotEditorMenuItem.setVisible(net.sf.robocode.core.Container.getComponent(IRobocodeEditor.class) != null); - robotEditorMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, MENU_SHORTCUT_KEY_MASK, false)); - robotEditorMenuItem.addActionListener(eventHandler); - } - return robotEditorMenuItem; - } - - private JMenuItem getRobotImportMenuItem() { - if (robotImportMenuItem == null) { - robotImportMenuItem = new JMenuItem(); - robotImportMenuItem.setText("Import robot or team"); - robotImportMenuItem.setMnemonic('I'); - robotImportMenuItem.addActionListener(eventHandler); - } - return robotImportMenuItem; - } - - public JMenu getRobotMenu() { - if (robotMenu == null) { - robotMenu = new JMenu(); - robotMenu.setText("Robot"); - robotMenu.setMnemonic('R'); - robotMenu.add(getRobotEditorMenuItem()); - robotMenu.add(new JSeparator()); - robotMenu.add(getRobotImportMenuItem()); - robotMenu.add(getRobotPackagerMenuItem()); - robotMenu.add(new JSeparator()); - robotMenu.add(getRobotCreateTeamMenuItem()); - robotMenu.addMenuListener(eventHandler); - } - return robotMenu; - } - - private JMenuItem getRobotPackagerMenuItem() { - if (robotPackagerMenuItem == null) { - robotPackagerMenuItem = new JMenuItem(); - robotPackagerMenuItem.setText("Package robot or team"); - robotPackagerMenuItem.setMnemonic('P'); - robotPackagerMenuItem.addActionListener(eventHandler); - } - return robotPackagerMenuItem; - } - - private JMenuItem getRobotCreateTeamMenuItem() { - if (robotCreateTeamMenuItem == null) { - robotCreateTeamMenuItem = new JMenuItem(); - robotCreateTeamMenuItem.setText("Create a robot team"); - robotCreateTeamMenuItem.setMnemonic('C'); - robotCreateTeamMenuItem.addActionListener(eventHandler); - } - return robotCreateTeamMenuItem; - } - - private void teamCreateTeamActionPerformed() { - windowManager.showCreateTeamDialog(); - } - - private void helpAboutActionPerformed() { - windowManager.showAboutBox(); - } - - private void helpCheckForNewVersionActionPerformed() { - if (!robocodeFrame.checkForNewVersion(true)) { - WindowUtil.messageError("Unable to check for new version "); - } - } - - private void helpFaqActionPerformed() { - windowManager.showFaq(); - } - - private void helpReadMeActionPerformed() { - windowManager.showReadMe(); - } - - private void helpOnlineHelpActionPerformed() { - windowManager.showOnlineHelp(); - } - - private void helpVersionsTxtActionPerformed() { - windowManager.showVersionsTxt(); - } - - private void helpRobocodeApiActionPerformed() { - windowManager.showHelpApi(); - } - - private void helpRobocodeHomeMenuItemActionPerformed() { - windowManager.showRobocodeHome(); - } - - private void helpJavaDocumentationActionPerformed() { - windowManager.showJavaDocumentation(); - } - - private void helpRoboWikiMenuItemActionPerformed() { - windowManager.showRoboWiki(); - } - - private void helpGoogleGroupRobocodeActionPerformed() { - windowManager.showGoogleGroupRobocode(); - } - - private void helpRobocodeRepositoryActionPerformed() { - windowManager.showRobocodeRepository(); - } - - private void optionsFitWindowActionPerformed() { - JFrame robocodeFrame = windowManager.getRobocodeFrame(); - - robocodeFrame.setSize(robocodeFrame.getPreferredSize()); - WindowUtil.fitWindow(robocodeFrame); - } - - private void optionsShowRankingActionPerformed() { - windowManager.showRankingDialog(getOptionsShowRankingCheckBoxMenuItem().getState()); - } - - private void optionsRecalculateCpuConstantPerformed() { - int ok = JOptionPane.showConfirmDialog(this, "Do you want to recalculate the CPU constant?", - "Recalculate CPU constant", JOptionPane.YES_NO_OPTION); - - if (ok == JOptionPane.YES_OPTION) { - try { - robocodeFrame.setBusyPointer(true); - cpuManager.calculateCpuConstant(); - } finally { - robocodeFrame.setBusyPointer(false); - } - - long cpuConstant = cpuManager.getCpuConstant(); - - JOptionPane.showMessageDialog(this, "CPU constant: " + cpuConstant + " nanoseconds per turn", - "New CPU constant", JOptionPane.INFORMATION_MESSAGE); - } - } - - private void optionsCleanRobotCachePerformed() { - int ok = JOptionPane.showConfirmDialog(this, "Do you want to clean the robot cache?", "Clean Robot Cache", - JOptionPane.YES_NO_OPTION); - - if (ok == JOptionPane.YES_OPTION) { - try { - robocodeFrame.setBusyPointer(true); - net.sf.robocode.cachecleaner.CacheCleaner.clean(); - } finally { - robocodeFrame.setBusyPointer(false); - } - } - } - - private void optionsPreferencesActionPerformed() { - windowManager.showOptionsPreferences(); - } - - private void robotEditorActionPerformed() { - windowManager.showRobocodeEditor(); - } - - private void robotImportActionPerformed() { - windowManager.showImportRobotDialog(); - } - - private void robotPackagerActionPerformed() { - windowManager.showRobotPackager(); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleDialog.java deleted file mode 100644 index b76dbd8..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleDialog.java +++ /dev/null @@ -1,204 +0,0 @@ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.battle.BattleProperties; -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.core.Container; -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.IWindowManager; -import static net.sf.robocode.ui.util.ShortcutUtil.MENU_SHORTCUT_KEY_MASK; - -import javax.swing.*; -import javax.swing.event.AncestorEvent; -import javax.swing.event.AncestorListener; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.util.List; - - -@SuppressWarnings("serial") -public class NewBattleDialog extends JDialog implements WizardListener { - - private final static int MAX_ROBOTS = 256; // 64; - private final static int MIN_ROBOTS = 1; - - private final EventHandler eventHandler = new EventHandler(); - - private ISettingsManager settingsManager; - private BattleProperties battleProperties; - - private WizardTabbedPane tabbedPane; - private NewBattleRulesTab battleFieldTab; - - private WizardController wizardController; - - private RobotSelectionPanel robotSelectionPanel; - - private final IBattleManager battleManager; - - public NewBattleDialog(IWindowManager windowManager, IBattleManager battleManager) { - super(windowManager.getRobocodeFrame(), true); - this.battleManager = battleManager; - } - - public void setup(ISettingsManager settingsManager, BattleProperties battleProperties) { // XXX - this.settingsManager = settingsManager; - this.battleProperties = battleProperties; - - robotSelectionPanel = null; - - setTitle("New Battle"); - setPreferredSize(new Dimension(850, 650)); - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - - addCancelByEscapeKey(); - - add(createNewBattleDialogPanel()); - } - - - public void cancelButtonActionPerformed() { - dispose(); - } - public void finishButtonActionPerformed() { - if (robotSelectionPanel.getSelectedRobotsCount() > 24) { - if (JOptionPane.showConfirmDialog(this, - "Warning: The battle you are about to start (" + robotSelectionPanel.getSelectedRobotsCount() - + " robots) " + " is very large and will consume a lot of CPU and memory. Do you wish to proceed?", - "Large Battle Warning", - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE) - == JOptionPane.NO_OPTION) { - return; - } - } - if (robotSelectionPanel.getSelectedRobotsCount() == 1) { - if (JOptionPane.showConfirmDialog(this, - "You have only selected one robot. For normal battles you should select at least 2.\nDo you wish to proceed anyway?", - "Just one robot?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) - == JOptionPane.NO_OPTION) { - return; - } - } - // Dispose this dialog before starting the battle due to pause/resume battle state - dispose(); - - // Start new battle after the dialog has been disposed and hence has called resumeBattle() - battleManager.startNewBattle(battleProperties, false, false); - } - - private NewBattleRulesTab getBattleFieldTab() { - if (battleFieldTab == null) { - battleFieldTab = new NewBattleRulesTab(); - battleFieldTab.setup(settingsManager, battleProperties); - } - return battleFieldTab; - } - - private JPanel createNewBattleDialogPanel() { - JPanel panel = new JPanel(); - - panel.setLayout(new BorderLayout()); - panel.add(getWizardController(), BorderLayout.SOUTH); - panel.add(getTabbedPane(), BorderLayout.CENTER); - panel.registerKeyboardAction(eventHandler, "Refresh", - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - return panel; - } - - public List getSelectedRobots() { - return getRobotSelectionPanel().getSelectedRobots(); - } - - private void addCancelByEscapeKey() { - String CANCEL_ACTION_KEY = "CANCEL_ACTION_KEY"; - int noModifiers = 0; - KeyStroke escapeKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, noModifiers, false); - InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - - inputMap.put(escapeKey, CANCEL_ACTION_KEY); - AbstractAction cancelAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - cancelButtonActionPerformed(); - } - }; - - getRootPane().getActionMap().put(CANCEL_ACTION_KEY, cancelAction); - } - - /** - * Return the wizardController - * - * @return JButton - */ - private WizardController getWizardController() { - if (wizardController == null) { - wizardController = getTabbedPane().getWizardController(); - wizardController.setFinishButtonTextAndMnemonic("Start Battle", 'S', 0); - wizardController.setFocusOnEnabled(true); - } - return wizardController; - } - - /** - * Return the Page property value. - * - * @return JPanel - */ - private RobotSelectionPanel getRobotSelectionPanel() { - if (robotSelectionPanel == null) { - robotSelectionPanel = Container.createComponent(RobotSelectionPanel.class); - robotSelectionPanel.addAncestorListener(eventHandler); - - final boolean ignoreTeamRobots = false; // TODO do we really want to have this !properties.getOptionsTeamShowTeamRobots(); - String selectedRobots = (battleProperties == null) ? "" : battleProperties.getSelectedRobots(); - - robotSelectionPanel.setup(MIN_ROBOTS, MAX_ROBOTS, true, "Select robots for the battle", false, false, false, - false, false, ignoreTeamRobots, selectedRobots); - } - return robotSelectionPanel; - } - - /** - * Return the tabbedPane. - * - * @return JTabbedPane - */ - private WizardTabbedPane getTabbedPane() { - if (tabbedPane == null) { - tabbedPane = new WizardTabbedPane(this); - tabbedPane.insertTab("Robots", null, getRobotSelectionPanel(), null, 0); - tabbedPane.setMnemonicAt(0, KeyEvent.VK_R); - tabbedPane.setDisplayedMnemonicIndexAt(0, 0); - tabbedPane.insertTab("Rules", null, getBattleFieldTab(), null, 1); - tabbedPane.setMnemonicAt(1, KeyEvent.VK_U); - tabbedPane.setDisplayedMnemonicIndexAt(1, 1); - } - return tabbedPane; - } - - private class EventHandler implements AncestorListener, ActionListener { - @Override - public void ancestorAdded(AncestorEvent event) {} - - @Override - public void ancestorRemoved(AncestorEvent event) { - battleProperties.setSelectedRobots(getRobotSelectionPanel().getSelectedRobotsAsString()); - } - - @Override - public void ancestorMoved(AncestorEvent event) {} - - @Override - public void actionPerformed(ActionEvent event) { - if (event.getActionCommand().equals("Refresh")) { - getRobotSelectionPanel().refreshRobotList(true); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleRulesTab.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleRulesTab.java deleted file mode 100644 index 45ee473..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/NewBattleRulesTab.java +++ /dev/null @@ -1,492 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import javax.swing.GroupLayout.Alignment; -import javax.swing.border.Border; -import javax.swing.event.AncestorEvent; -import javax.swing.event.AncestorListener; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.sf.robocode.battle.BattleProperties; -import net.sf.robocode.settings.ISettingsManager; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class NewBattleRulesTab extends JPanel { - - private final static int MIN_BATTLEFIELD_SIZE = 400; - private final static int MAX_BATTLEFIELD_SIZE = 5000; - private final static int BATTLEFIELD_STEP_SIZE = 100; - - private ISettingsManager settingsManager; - private BattleProperties battleProperties; - - private final EventHandler eventHandler = new EventHandler(); - - private SizeButton[] predefinedSizeButtons = { - new SizeButton(400, 400), new SizeButton(600, 400), new SizeButton(600, 600), new SizeButton(800, 600), - new SizeButton(800, 800), new SizeButton(1000, 800), new SizeButton(1000, 1000), new SizeButton(1200, 1200), - new SizeButton(2000, 2000), new SizeButton(5000, 5000) - }; - - private final JLabel numberOfRoundsLabel = new JLabel("Number of Rounds:"); - private final JLabel gunCoolingRateLabel = new JLabel("Gun Cooling Rate:"); - private final JLabel inactivityTimeLabel = new JLabel("Inactivity Time:"); - private final JLabel sentryBorderSizeLabel = new JLabel("Sentry Border Size"); - private final JLabel hideEnemyNamesLabel = new JLabel("Hide Enemy Names:"); - - private final JButton restoreDefaultsButton = new JButton("Restore Defaults"); - - private JTextField numberOfRoundsTextField; - private JTextField gunCoolingRateTextField; - private JTextField inactivityTimeTextField; - private JTextField sentryBorderSizeTextField; - private final JCheckBox hideEnemyNamesCheckBox = new JCheckBox(); - - private JSlider battlefieldWidthSlider; - private JSlider battlefieldHeightSlider; - private JLabel battlefieldSizeLabel; - - public NewBattleRulesTab() { - super(); - } - - public void setup(ISettingsManager settingsManager, BattleProperties battleProperties) { - this.settingsManager = settingsManager; - this.battleProperties = battleProperties; - - EventHandler eventHandler = new EventHandler(); - - battlefieldWidthSlider = createBattlefieldSizeSlider(); - battlefieldWidthSlider.setOrientation(SwingConstants.HORIZONTAL); - - battlefieldHeightSlider = createBattlefieldSizeSlider(); - battlefieldHeightSlider.setOrientation(SwingConstants.VERTICAL); - battlefieldHeightSlider.setInverted(true); - - battlefieldSizeLabel = new BattlefieldSizeLabel(); - battlefieldSizeLabel.setHorizontalAlignment(SwingConstants.CENTER); - battlefieldSizeLabel.setMinimumSize(new Dimension(50, 50)); - battlefieldSizeLabel.setMaximumSize(new Dimension(500, 500)); - - battlefieldWidthSlider.addChangeListener(eventHandler); - battlefieldHeightSlider.addChangeListener(eventHandler); - - JPanel rulesPanel = createRulesPanel(); - rulesPanel.addAncestorListener(eventHandler); - - restoreDefaultsButton.addActionListener(eventHandler); - - setLayout(new BorderLayout()); - - add(rulesPanel, BorderLayout.WEST); - add(restoreDefaultsButton, BorderLayout.SOUTH); - add(createBattlefieldSizePanel(), BorderLayout.CENTER); - } - - private JPanel createBattlefieldSizePanel() { - JPanel panel = new JPanel(); - panel.addAncestorListener(eventHandler); - - Border border = BorderFactory.createCompoundBorder( - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Battlefield Size"), - BorderFactory.createEmptyBorder(10, 10, 10, 10)); - panel.setBorder(border); - - panel.setLayout(new BorderLayout()); - - JPanel sliderPanel = createBattlefieldSlidersPanel(); - panel.add(sliderPanel, BorderLayout.CENTER); - - JPanel buttonsPanel = createPredefinedSizesPanel(); - panel.add(buttonsPanel, BorderLayout.EAST); - - return panel; - } - - private JPanel createBattlefieldSlidersPanel() { - JPanel panel = new JPanel(); - - GroupLayout layout = new GroupLayout(panel); - panel.setLayout(layout); - - GroupLayout.SequentialGroup leftToRight = layout.createSequentialGroup(); - - GroupLayout.ParallelGroup left = layout.createParallelGroup(); - left.addComponent(battlefieldSizeLabel); - left.addComponent(battlefieldWidthSlider); - leftToRight.addGroup(left); - - GroupLayout.ParallelGroup right = layout.createParallelGroup(); - right.addComponent(battlefieldHeightSlider); - leftToRight.addGroup(right); - - GroupLayout.SequentialGroup topToBottom = layout.createSequentialGroup(); - - GroupLayout.ParallelGroup top = layout.createParallelGroup(); - top.addComponent(battlefieldSizeLabel); - top.addComponent(battlefieldHeightSlider); - topToBottom.addGroup(top); - - GroupLayout.ParallelGroup bottom = layout.createParallelGroup(); - bottom.addComponent(battlefieldWidthSlider); - topToBottom.addGroup(bottom); - - layout.setHorizontalGroup(leftToRight); - layout.setVerticalGroup(topToBottom); - - return panel; - } - - private JPanel createPredefinedSizesPanel() { - JPanel panel = new JPanel(); - - Border border = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0), - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Predefined Sizes")); - panel.setBorder(border); - - panel.setLayout(new GridLayout(predefinedSizeButtons.length, 1)); - - for (SizeButton button : predefinedSizeButtons) { - panel.add(button); - } - return panel; - } - - private JPanel createRulesPanel() { - JPanel panel = new JPanel(); - - panel.addAncestorListener(new EventHandler()); - panel.setBorder(BorderFactory.createEtchedBorder()); - - GroupLayout layout = new GroupLayout(panel); - layout.setAutoCreateContainerGaps(true); - layout.setAutoCreateGaps(true); - panel.setLayout(layout); - - GroupLayout.SequentialGroup leftToRight = layout.createSequentialGroup(); - - GroupLayout.ParallelGroup left = layout.createParallelGroup(); - left.addComponent(numberOfRoundsLabel); - left.addComponent(gunCoolingRateLabel); - left.addComponent(inactivityTimeLabel); - left.addComponent(sentryBorderSizeLabel); - left.addComponent(hideEnemyNamesLabel); - leftToRight.addGroup(left); - - GroupLayout.ParallelGroup right = layout.createParallelGroup(); - right.addComponent(getNumberOfRoundsTextField()); - right.addComponent(getGunCoolingRateTextField()); - right.addComponent(getInactivityTimeTextField()); - right.addComponent(getSentryBorderSizeTextField()); - right.addComponent(hideEnemyNamesCheckBox); - leftToRight.addGroup(right); - - GroupLayout.SequentialGroup topToBottom = layout.createSequentialGroup(); - - GroupLayout.ParallelGroup row0 = layout.createParallelGroup(Alignment.BASELINE); - row0.addComponent(numberOfRoundsLabel); - row0.addComponent(numberOfRoundsTextField); - topToBottom.addGroup(row0); - - GroupLayout.ParallelGroup row1 = layout.createParallelGroup(Alignment.BASELINE); - row1.addComponent(gunCoolingRateLabel); - row1.addComponent(getGunCoolingRateTextField()); - topToBottom.addGroup(row1); - - GroupLayout.ParallelGroup row2 = layout.createParallelGroup(Alignment.BASELINE); - row2.addComponent(inactivityTimeLabel); - row2.addComponent(inactivityTimeTextField); - topToBottom.addGroup(row2); - - GroupLayout.ParallelGroup row3 = layout.createParallelGroup(Alignment.BASELINE); - row3.addComponent(sentryBorderSizeLabel); - row3.addComponent(sentryBorderSizeTextField); - topToBottom.addGroup(row3); - - GroupLayout.ParallelGroup row4 = layout.createParallelGroup(Alignment.CENTER); - row4.addComponent(hideEnemyNamesLabel); - row4.addComponent(hideEnemyNamesCheckBox); - topToBottom.addGroup(row4); - - layout.setHorizontalGroup(leftToRight); - layout.setVerticalGroup(topToBottom); - - return panel; - } - - private JTextField getNumberOfRoundsTextField() { - if (numberOfRoundsTextField == null) { - numberOfRoundsTextField = new JTextField(5); - numberOfRoundsTextField.setText("" + battleProperties.getNumRounds()); - numberOfRoundsTextField.setInputVerifier( - new InputVerifier() { - @Override - public boolean verify(JComponent input) { - boolean isValid = false; - - String text = ((JTextField) input).getText(); - if (text != null && text.matches("\\d+")) { - int numRounds = Integer.parseInt(text); - isValid = (numRounds > 0); - } - if (!isValid) { - WindowUtil.messageError( - "'Number of Rounds' must be an integer value > 0.\n" + "Default value is 10."); - numberOfRoundsTextField.setText("" + battleProperties.getNumRounds()); - } - return isValid; - } - }); - } - return numberOfRoundsTextField; - } - - private JTextField getGunCoolingRateTextField() { - if (gunCoolingRateTextField == null) { - gunCoolingRateTextField = new JTextField(5); - gunCoolingRateTextField.setText("" + battleProperties.getGunCoolingRate()); - gunCoolingRateTextField.setInputVerifier( - new InputVerifier() { - @Override - public boolean verify(JComponent input) { - boolean isValid = false; - - String text = ((JTextField) input).getText(); - if (text != null && text.matches("\\d*(\\.\\d+)?")) { - double gunCoolingRate = Double.parseDouble(text); - isValid = (gunCoolingRate > 0 && gunCoolingRate <= 0.7); - } - if (!isValid) { - WindowUtil.messageError( - "'Gun Cooling Rate' must be a floating point number > 0 and <= 0.7.\n" - + "Default value is 0.1."); - gunCoolingRateTextField.setText("" + battleProperties.getGunCoolingRate()); - } - return isValid; - } - }); - } - return gunCoolingRateTextField; - } - - private JTextField getInactivityTimeTextField() { - if (inactivityTimeTextField == null) { - inactivityTimeTextField = new JTextField(5); - inactivityTimeTextField.setText("" + battleProperties.getInactivityTime()); - inactivityTimeTextField.setInputVerifier( - new InputVerifier() { - @Override - public boolean verify(JComponent input) { - boolean isValid = false; - - String text = ((JTextField) input).getText(); - if (text != null && text.matches("\\d+")) { - int inactivityTime = Integer.parseInt(text); - isValid = (inactivityTime >= 0); - } - if (!isValid) { - WindowUtil.messageError( - "'Inactivity Time' must be an integer value >= 0.\n" + "Default value is 450."); - inactivityTimeTextField.setText("" + battleProperties.getInactivityTime()); - } - return isValid; - } - }); - } - return inactivityTimeTextField; - } - - private JTextField getSentryBorderSizeTextField() { - if (sentryBorderSizeTextField == null) { - sentryBorderSizeTextField = new JTextField(5); - sentryBorderSizeTextField.setText("" + battleProperties.getSentryBorderSize()); - sentryBorderSizeTextField.setInputVerifier( - new InputVerifier() { - @Override - public boolean verify(JComponent input) { - boolean isValid = false; - - String text = ((JTextField) input).getText(); - if (text != null && text.matches("\\d+")) { - int borderSize = Integer.parseInt(text); - isValid = (borderSize >= 50); - } - if (!isValid) { - WindowUtil.messageError( - "'Sentry Border Size' must be an integer value >= 50.\n" + "Default value is 100."); - sentryBorderSizeTextField.setText("" + battleProperties.getSentryBorderSize()); - } - return isValid; - } - }); - } - return sentryBorderSizeTextField; - } - - private JSlider createBattlefieldSizeSlider() { - JSlider slider = new JSlider(); - slider.setMinimum(MIN_BATTLEFIELD_SIZE); - slider.setMaximum(MAX_BATTLEFIELD_SIZE); - slider.setMajorTickSpacing(BATTLEFIELD_STEP_SIZE); - slider.setSnapToTicks(true); - slider.setPaintTicks(true); - return slider; - } - - private void updateBattlefieldSizeLabel() { - int w = battlefieldWidthSlider.getValue(); - int h = battlefieldHeightSlider.getValue(); - battlefieldSizeLabel.setText(w + " x " + h); - } - - private class SizeButton extends JButton { - final int width; - final int height; - - public SizeButton(int width, int height) { - super(width + "x" + height); - this.width = width; - this.height = height; - addActionListener(eventHandler); - } - } - - - private class EventHandler implements AncestorListener, ActionListener, ChangeListener { - @Override - public void ancestorAdded(AncestorEvent event) { - pushBattlePropertiesToUIComponents(); - } - - @Override - public void ancestorRemoved(AncestorEvent event) { - Integer numberOfRounds; - try { - numberOfRounds = Integer.parseInt(getNumberOfRoundsTextField().getText()); - } catch (NumberFormatException e) { - numberOfRounds = null; - } - if (numberOfRounds != null) { - settingsManager.setBattleDefaultNumberOfRounds(numberOfRounds); - battleProperties.setNumRounds(numberOfRounds); - } - Double gunCoolingRate; - try { - gunCoolingRate = Double.parseDouble(getGunCoolingRateTextField().getText()); - } catch (NumberFormatException e) { - gunCoolingRate = null; - } - if (gunCoolingRate != null) { - settingsManager.setBattleDefaultGunCoolingRate(gunCoolingRate); - battleProperties.setGunCoolingRate(gunCoolingRate); - } - Integer inactivityTime; - try { - inactivityTime = Integer.parseInt(getInactivityTimeTextField().getText()); - } catch (NumberFormatException e) { - inactivityTime = null; - } - if (inactivityTime != null) { - settingsManager.setBattleDefaultInactivityTime(inactivityTime); - battleProperties.setInactivityTime(inactivityTime); - } - Integer sentryBorderSize; - try { - sentryBorderSize = Integer.parseInt(getSentryBorderSizeTextField().getText()); - } catch (NumberFormatException e) { - sentryBorderSize = null; - } - if (sentryBorderSize != null) { - settingsManager.setBattleDefaultSentryBorderSize(sentryBorderSize); - battleProperties.setSentryBorderSize(sentryBorderSize); - } - boolean hideEnemyNames = hideEnemyNamesCheckBox.isSelected(); - settingsManager.setBattleDefaultHideEnemyNames(hideEnemyNames); - battleProperties.setHideEnemyNames(hideEnemyNames); - - int weight = battlefieldWidthSlider.getValue(); - int height = battlefieldHeightSlider.getValue(); - - settingsManager.setBattleDefaultBattlefieldWidth(weight); - settingsManager.setBattleDefaultBattlefieldHeight(height); - - battleProperties.setBattlefieldWidth(weight); - battleProperties.setBattlefieldHeight(height); - } - - @Override - public void ancestorMoved(AncestorEvent event) {} - - @Override - public void actionPerformed(ActionEvent event) { - if (event.getSource() instanceof SizeButton) { - SizeButton button = (SizeButton) event.getSource(); - battlefieldWidthSlider.setValue(button.width); - battlefieldHeightSlider.setValue(button.height); - updateBattlefieldSizeLabel(); - - } else if (event.getSource() == restoreDefaultsButton) { - battleProperties.setBattlefieldWidth(800); - battleProperties.setBattlefieldHeight(600); - battleProperties.setNumRounds(10); - battleProperties.setGunCoolingRate(0.1); - battleProperties.setInactivityTime(450); - battleProperties.setHideEnemyNames(false); - battleProperties.setSentryBorderSize(100); - - pushBattlePropertiesToUIComponents(); - } - } - - @Override - public void stateChanged(ChangeEvent event) { - if ((event.getSource() == battlefieldWidthSlider) || (event.getSource() == battlefieldHeightSlider)) { - updateBattlefieldSizeLabel(); - } - } - - private void pushBattlePropertiesToUIComponents() { - battlefieldWidthSlider.setValue(battleProperties.getBattlefieldWidth()); - battlefieldHeightSlider.setValue(battleProperties.getBattlefieldHeight()); - updateBattlefieldSizeLabel(); - - getNumberOfRoundsTextField().setText("" + battleProperties.getNumRounds()); - getGunCoolingRateTextField().setText("" + battleProperties.getGunCoolingRate()); - getInactivityTimeTextField().setText("" + battleProperties.getInactivityTime()); - getSentryBorderSizeTextField().setText("" + battleProperties.getSentryBorderSize()); - hideEnemyNamesCheckBox.setSelected(battleProperties.getHideEnemyNames()); - } - } - - - private class BattlefieldSizeLabel extends JLabel { - @Override - public void paintComponent(Graphics g) { - g.setColor(SystemColor.activeCaption); - - int width = getWidth() * battlefieldWidthSlider.getValue() / MAX_BATTLEFIELD_SIZE; - int height = getHeight() * battlefieldHeightSlider.getValue() / MAX_BATTLEFIELD_SIZE; - - g.fillRect(0, 0, width, height); - super.paintComponent(g); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesCommonOptionsTab.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesCommonOptionsTab.java deleted file mode 100644 index 3bc8795..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesCommonOptionsTab.java +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.settings.ISettingsManager; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class PreferencesCommonOptionsTab extends WizardPanel { - - private JPanel optionsPanel; - - private JCheckBox notifyAboutBetaVersionsCheckBox; - private JCheckBox showResultsCheckBox; - private JCheckBox dontHideRankingsCheckBox; - private JCheckBox appendWhenSavingResultsCheckBox; - private JCheckBox enableReplayRecordingCheckBox; - private JCheckBox enableAutoRecordingCheckBox; - - private final ISettingsManager properties; - - public PreferencesCommonOptionsTab(ISettingsManager properties) { - super(); - this.properties = properties; - initialize(); - } - - private void initialize() { - setLayout(new GridLayout(1, 2)); - add(getOptionsPanel()); - loadPreferences(properties); - } - - private JPanel getOptionsPanel() { - if (optionsPanel == null) { - optionsPanel = new JPanel(); - optionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Common")); - optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS)); - optionsPanel.add(getNotifyAboutBetaVersionsCheckBox()); - optionsPanel.add(new JLabel(" ")); - optionsPanel.add(getShowResultsCheckBox()); - optionsPanel.add(getDontHideRankingsCheckBox()); - optionsPanel.add(getAppendWhenSavingResultsCheckBox()); - optionsPanel.add(new JLabel(" ")); - optionsPanel.add(getEnableReplayRecordingCheckBox()); - optionsPanel.add(getEnableAutoRecordingCheckBox()); - } - return optionsPanel; - } - - private JCheckBox getNotifyAboutBetaVersionsCheckBox() { - if (notifyAboutBetaVersionsCheckBox == null) { - notifyAboutBetaVersionsCheckBox = new JCheckBox("Notify about new Beta versions of Robocode"); - notifyAboutBetaVersionsCheckBox.setMnemonic('B'); - notifyAboutBetaVersionsCheckBox.setDisplayedMnemonicIndex(17); - } - return notifyAboutBetaVersionsCheckBox; - } - - private JCheckBox getShowResultsCheckBox() { - if (showResultsCheckBox == null) { - showResultsCheckBox = new JCheckBox("Show results when battle(s) ends"); - showResultsCheckBox.setMnemonic('h'); - showResultsCheckBox.setDisplayedMnemonicIndex(1); - } - return showResultsCheckBox; - } - - private JCheckBox getDontHideRankingsCheckBox() { - if (dontHideRankingsCheckBox == null) { - dontHideRankingsCheckBox = new JCheckBox("Don't hide current rankings when main window is minimized"); - dontHideRankingsCheckBox.setMnemonic('t'); - dontHideRankingsCheckBox.setDisplayedMnemonicIndex(4); - } - return dontHideRankingsCheckBox; - } - - private JCheckBox getAppendWhenSavingResultsCheckBox() { - if (appendWhenSavingResultsCheckBox == null) { - appendWhenSavingResultsCheckBox = new JCheckBox("Append when saving results"); - appendWhenSavingResultsCheckBox.setMnemonic('A'); - } - return appendWhenSavingResultsCheckBox; - } - - private JCheckBox getEnableReplayRecordingCheckBox() { - if (enableReplayRecordingCheckBox == null) { - enableReplayRecordingCheckBox = new JCheckBox("Enable replay recording (uses memory and disk space)"); - enableReplayRecordingCheckBox.setMnemonic('E'); - } - return enableReplayRecordingCheckBox; - } - - private JCheckBox getEnableAutoRecordingCheckBox() { - if (enableAutoRecordingCheckBox == null) { - enableAutoRecordingCheckBox = new JCheckBox( - "Enable auto recording (every finished battle is automatically saved into battles folder)"); - enableAutoRecordingCheckBox.setMnemonic('u'); - enableAutoRecordingCheckBox.setDisplayedMnemonicIndex(8); - - enableAutoRecordingCheckBox.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - boolean isSelected = enableAutoRecordingCheckBox.isSelected(); - - enableReplayRecordingCheckBox.setEnabled(!isSelected); - enableReplayRecordingCheckBox.setSelected( - isSelected ? true : properties.getOptionsCommonEnableReplayRecording()); - } - }); - } - return enableAutoRecordingCheckBox; - } - - private void loadPreferences(ISettingsManager props) { - getNotifyAboutBetaVersionsCheckBox().setSelected(props.getOptionsCommonNotifyAboutNewBetaVersions()); - getShowResultsCheckBox().setSelected(props.getOptionsCommonShowResults()); - getDontHideRankingsCheckBox().setSelected(props.getOptionsCommonDontHideRankings()); - getAppendWhenSavingResultsCheckBox().setSelected(props.getOptionsCommonAppendWhenSavingResults()); - getEnableReplayRecordingCheckBox().setSelected(props.getOptionsCommonEnableReplayRecording()); - getEnableAutoRecordingCheckBox().setSelected(props.getOptionsCommonEnableAutoRecording()); - } - - public void storePreferences() { - ISettingsManager props = properties; - - props.setOptionsCommonNotifyAboutNewBetaVersions(getNotifyAboutBetaVersionsCheckBox().isSelected()); - props.setOptionsCommonShowResults(getShowResultsCheckBox().isSelected()); - props.setOptionsCommonDontHideRankings(getDontHideRankingsCheckBox().isSelected()); - props.setOptionsCommonAppendWhenSavingResults(getAppendWhenSavingResultsCheckBox().isSelected()); - props.setOptionsCommonEnableReplayRecording(getEnableReplayRecordingCheckBox().isSelected()); - props.setOptionsCommonEnableAutoRecording(getEnableAutoRecordingCheckBox().isSelected()); - - properties.saveProperties(); - } - - @Override - public boolean isReady() { - return true; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDevelopmentOptionsTab.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDevelopmentOptionsTab.java deleted file mode 100644 index 29ac579..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDevelopmentOptionsTab.java +++ /dev/null @@ -1,198 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.CheckList; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Ruben Moreno Montoliu (contributor) - */ -@SuppressWarnings("serial") -public class PreferencesDevelopmentOptionsTab extends WizardPanel { - - private JPanel optionsPanel; - - private JButton addButton; - private JButton removeButton; - private CheckList pathList; - - public final ISettingsManager properties; - - private final EventHandler eventHandler = new EventHandler(); - - private class EventHandler implements ActionListener, ListSelectionListener { - public void actionPerformed(ActionEvent e) { - if (e.getSource() == getAddButton()) { - handleAddAction(); - } else if (e.getSource() == getRemoveButton()) { - handleRemoveAction(); - } - } - - public void valueChanged(ListSelectionEvent e) { - updateRemoveButton(); - } - } - - public PreferencesDevelopmentOptionsTab(ISettingsManager properties) { - super(); - this.properties = properties; - initialize(); - } - - private void initialize() { - setLayout(new GridLayout(1, 2)); - add(getOptionsPanel()); - loadPreferences(properties); - } - - private JPanel getOptionsPanel() { - if (optionsPanel == null) { - optionsPanel = new JPanel(); - optionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Development")); - - GridBagLayout layout = new GridBagLayout(); - - optionsPanel.setLayout(layout); - GridBagConstraints c = new GridBagConstraints(); - - c.insets = new Insets(0, 5, 5, 5); - c.anchor = GridBagConstraints.NORTHWEST; - - c.fill = GridBagConstraints.HORIZONTAL; - c.gridwidth = 2; - c.weightx = 0; - c.gridy = 1; - - optionsPanel.add( - new JLabel( - "If you are using an external IDE to develop robots, you may enter the classpath(s) to those robots here."), - c); - c.gridy++; - optionsPanel.add( - new JLabel( - "If you are using Eclipse, you can enter the root dir of robot projects inside a workspace as well (recommended)"), - c); - c.gridy++; - optionsPanel.add(new JLabel("Double-click the path(s) the enable or disable it (checked means enabled)"), c); - - c.gridwidth = 1; - c.gridy++; - c.insets = new Insets(3, 3, 3, 3); - optionsPanel.add(getAddButton(), c); - - c.gridy++; - optionsPanel.add(getRemoveButton(), c); - - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 1; - c.gridx = 1; - c.gridy--; - c.gridheight = 3; - c.insets = new Insets(5, 5, 5, 5); - JScrollPane pathListScroller = new JScrollPane(getPathList()); - - optionsPanel.add(pathListScroller, c); - } - return optionsPanel; - } - - private JButton getAddButton() { - if (addButton == null) { - addButton = new JButton("Add"); - addButton.setDisplayedMnemonicIndex(2); - addButton.addActionListener(eventHandler); - } - return addButton; - } - - private JButton getRemoveButton() { - if (removeButton == null) { - removeButton = new JButton("Remove"); - removeButton.setDisplayedMnemonicIndex(3); - removeButton.addActionListener(eventHandler); - } - return removeButton; - } - - private CheckList getPathList() { - if (pathList == null) { - pathList = new CheckList(); - pathList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - pathList.setLayoutOrientation(JList.VERTICAL); - pathList.setVisibleRowCount(-1); - pathList.addListSelectionListener(eventHandler); - } - return pathList; - } - - private void loadPreferences(ISettingsManager robocodeProperties) { - getPathList().clear(); - - for (String path : robocodeProperties.getOptionsDevelopmentPaths()) { - getPathList().add(path); - } - for (String excludedPath : robocodeProperties.getOptionsExcludedDevelopmentPaths()) { - getPathList().setChecked(excludedPath, false); - } - updateRemoveButton(); - } - - public void storePreferences() { - properties.setOptionsDevelopmentPaths(getPathList().getAll()); - properties.setOptionsExcludedDevelopmentPaths(getPathList().getUnchecked()); - properties.saveProperties(); - } - - @Override - public boolean isReady() { - return true; - } - - private void handleAddAction() { - JFileChooser chooser = new JFileChooser(); - - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - if (chooser.showOpenDialog(optionsPanel) == JFileChooser.APPROVE_OPTION) { - String path = chooser.getSelectedFile().getAbsolutePath(); - - if (!getPathList().contains(path)) { - getPathList().add(path); - getPathList().sort(); - } - } - updateRemoveButton(); - } - - private void handleRemoveAction() { - int[] indices = getPathList().getSelectedIndices(); - - for (int i = indices.length - 1; i >= 0; i--) { - getPathList().remove(indices[i]); - } - updateRemoveButton(); - } - - private void updateRemoveButton() { - getRemoveButton().setEnabled(getPathList().getSelectedIndex() >= 0); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDialog.java deleted file mode 100644 index 903ab26..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesDialog.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.IImageManager; -import net.sf.robocode.ui.IWindowManager; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - */ -@SuppressWarnings("serial") -public class PreferencesDialog extends JDialog implements WizardListener { - - private JPanel preferencesDialogContentPane; - private WizardTabbedPane tabbedPane; - private WizardController buttonsPanel; - - private PreferencesCommonOptionsTab commonOptionsTab; - private PreferencesDevelopmentOptionsTab developmentOptionsTab; - private PreferencesViewOptionsTab viewOptionsTab; - private PreferencesRenderingOptionsTab renderingOptionsTab; - private PreferencesSoundOptionsTab soundOptionsTab; - - private final ISettingsManager properties; - private final IImageManager imageManager; - - public PreferencesDialog(ISettingsManager properties, IWindowManager windowManager, IImageManager imageManager) { - super(windowManager.getRobocodeFrame(), true); - this.properties = properties; - this.imageManager = imageManager; - initialize(); - } - - private void initialize() { - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setTitle("Preferences"); - setContentPane(getPreferencesDialogContentPane()); - } - - public void cancelButtonActionPerformed() { - dispose(); - } - - private WizardController getButtonsPanel() { - if (buttonsPanel == null) { - buttonsPanel = getTabbedPane().getWizardController(); - } - return buttonsPanel; - } - - private JPanel getPreferencesDialogContentPane() { - getButtonsPanel(); - if (preferencesDialogContentPane == null) { - preferencesDialogContentPane = new JPanel(); - preferencesDialogContentPane.setLayout(new BorderLayout()); - preferencesDialogContentPane.add(getTabbedPane(), BorderLayout.CENTER); - preferencesDialogContentPane.add(getButtonsPanel(), BorderLayout.SOUTH); - } - return preferencesDialogContentPane; - } - - private WizardTabbedPane getTabbedPane() { - if (tabbedPane == null) { - tabbedPane = new WizardTabbedPane(this); - - int tabIndex = 0; - - tabbedPane.insertTab("Common Options", null, getCommonOptionsTab(), null, tabIndex); - tabbedPane.setMnemonicAt(tabIndex, KeyEvent.VK_O); - tabbedPane.setDisplayedMnemonicIndexAt(tabIndex++, 1); - - tabbedPane.insertTab("Development Options", null, getDevelopmentOptionsTab(), null, tabIndex); - tabbedPane.setMnemonicAt(tabIndex, KeyEvent.VK_D); - tabbedPane.setDisplayedMnemonicIndexAt(tabIndex++, 0); - - tabbedPane.insertTab("View Options", null, getViewOptionsTab(), null, tabIndex); - tabbedPane.setMnemonicAt(tabIndex, KeyEvent.VK_W); - tabbedPane.setDisplayedMnemonicIndexAt(tabIndex++, 3); - - tabbedPane.insertTab("Rendering Options", null, getRenderingOptionsTab(), null, tabIndex); - tabbedPane.setMnemonicAt(tabIndex, KeyEvent.VK_R); - tabbedPane.setDisplayedMnemonicIndexAt(tabIndex++, 0); - - tabbedPane.insertTab("Sound Options", null, getSoundOptionsTab(), null, tabIndex); - tabbedPane.setMnemonicAt(tabIndex, KeyEvent.VK_S); - tabbedPane.setDisplayedMnemonicIndexAt(tabIndex++, 0); - } - return tabbedPane; - } - - private JPanel getCommonOptionsTab() { - if (commonOptionsTab == null) { - commonOptionsTab = new PreferencesCommonOptionsTab(properties); - } - return commonOptionsTab; - } - - private JPanel getDevelopmentOptionsTab() { - if (developmentOptionsTab == null) { - developmentOptionsTab = new PreferencesDevelopmentOptionsTab(properties); - } - return developmentOptionsTab; - } - - private JPanel getViewOptionsTab() { - if (viewOptionsTab == null) { - viewOptionsTab = new PreferencesViewOptionsTab(properties); - } - return viewOptionsTab; - } - - private JPanel getRenderingOptionsTab() { - if (renderingOptionsTab == null) { - renderingOptionsTab = new PreferencesRenderingOptionsTab(properties, imageManager); - } - return renderingOptionsTab; - } - - private JPanel getSoundOptionsTab() { - if (soundOptionsTab == null) { - soundOptionsTab = new PreferencesSoundOptionsTab(properties); - } - return soundOptionsTab; - } - - public void finishButtonActionPerformed() { - commonOptionsTab.storePreferences(); - developmentOptionsTab.storePreferences(); - viewOptionsTab.storePreferences(); - renderingOptionsTab.storePreferences(); - soundOptionsTab.storePreferences(); - - dispose(); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesRenderingOptionsTab.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesRenderingOptionsTab.java deleted file mode 100644 index 34fc834..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesRenderingOptionsTab.java +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.IImageManager; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class PreferencesRenderingOptionsTab extends WizardPanel { - - private final ISettingsManager properties; - - private JPanel specificSettingsPanel; - private JPanel predefinedSettingsPanel; - private JPanel otherSettingsPanel; - - private JComboBox optionsRenderingAntialiasingComboBox; - private JComboBox optionsRenderingTextAntialiasingComboBox; - private JComboBox optionsRenderingMethodComboBox; - private JComboBox optionsRenderingNoBuffersComboBox; - private JCheckBox optionsRenderingBufferImagesCheckBox; - private JCheckBox optionsRenderingForceBulletColorCheckBox; - - private JButton predefinedPlaformDefaultButton; - private JButton predefinedSpeedButton; - private JButton predefinedQualityButton; - - private EventHandler eventHandler; - private final IImageManager imageManager; - - public PreferencesRenderingOptionsTab(ISettingsManager properties, IImageManager imageManager) { - super(); - this.properties = properties; - this.imageManager = imageManager; - initialize(); - } - - private void initialize() { - eventHandler = new EventHandler(); - - setLayout(new GridLayout(1, 3)); - - add(getSpecificSettingsPanel()); - add(getPredefinedSettingsPanel()); - add(getOtherSettingsPanel()); - - loadPreferences(properties); - } - - private JPanel getSpecificSettingsPanel() { - if (specificSettingsPanel == null) { - specificSettingsPanel = new JPanel(); - specificSettingsPanel.setBorder( - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Specific settings")); - specificSettingsPanel.setLayout(new GridBagLayout()); - - GridBagConstraints c = new GridBagConstraints(); - - c.fill = GridBagConstraints.HORIZONTAL; - c.insets = new Insets(5, 5, 5, 5); - c.anchor = GridBagConstraints.PAGE_START; - - c.weightx = 0; - - c.gridwidth = 2; - - c.gridx = 0; - c.gridy = 0; - specificSettingsPanel.add(new JLabel("Set individual rendering options:"), c); - - c.gridwidth = 1; - - c.gridy = 1; - specificSettingsPanel.add(new JLabel("Antialiasing", SwingConstants.RIGHT), c); - c.gridx = 1; - specificSettingsPanel.add(getOptionsRenderingAntialiasingComboBox(), c); - - c.gridx = 0; - c.gridy = 2; - specificSettingsPanel.add(new JLabel("Text Antialiasing", SwingConstants.RIGHT), c); - c.gridx = 1; - specificSettingsPanel.add(getOptionsRenderingTextAntialiasingComboBox(), c); - - c.gridx = 0; - c.gridy = 3; - specificSettingsPanel.add(new JLabel("Rendering Method", SwingConstants.RIGHT), c); - c.gridx = 1; - specificSettingsPanel.add(getOptionsRenderingMethodComboBox(), c); - - c.gridx = 0; - c.gridy = 4; - specificSettingsPanel.add(new JLabel(" "), c); - - c.gridx = 0; - c.gridy = 5; - specificSettingsPanel.add(new JLabel("Number of buffers", SwingConstants.RIGHT), c); - c.gridx = 1; - specificSettingsPanel.add(getOptionsRenderingNoBuffersComboBox(), c); - } - return specificSettingsPanel; - } - - private JPanel getPredefinedSettingsPanel() { - if (predefinedSettingsPanel == null) { - predefinedSettingsPanel = new JPanel(); - predefinedSettingsPanel.setBorder( - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Predefined settings")); - predefinedSettingsPanel.setLayout(new GridBagLayout()); - - GridBagConstraints c = new GridBagConstraints(); - - c.fill = GridBagConstraints.HORIZONTAL; - c.insets = new Insets(5, 5, 5, 5); - c.anchor = GridBagConstraints.PAGE_START; - - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 3; - predefinedSettingsPanel.add(new JLabel("Set all rendering settings towards:"), c); - - c.weightx = 1f / 3; - c.gridwidth = 1; - c.gridy = 2; - predefinedSettingsPanel.add(getPredefinedPlatformDefaultButton(), c); - c.gridx = 1; - predefinedSettingsPanel.add(getPredefinedSpeedButton(), c); - c.gridx = 2; - predefinedSettingsPanel.add(getPredefinedQualityButton(), c); - } - return predefinedSettingsPanel; - } - - private JPanel getOtherSettingsPanel() { - if (otherSettingsPanel == null) { - otherSettingsPanel = new JPanel(); - otherSettingsPanel.setBorder( - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Other settings")); - otherSettingsPanel.setLayout(new BoxLayout(otherSettingsPanel, BoxLayout.Y_AXIS)); - otherSettingsPanel.add(getOptionsRenderingBufferImagesCheckBox()); - otherSettingsPanel.add(getOptionsRenderingForceBulletColorCheckBox()); - } - return otherSettingsPanel; - } - - private JComboBox getOptionsRenderingAntialiasingComboBox() { - if (optionsRenderingAntialiasingComboBox == null) { - optionsRenderingAntialiasingComboBox = new JComboBox(new String[] { "Default", "On", "Off"}); - optionsRenderingAntialiasingComboBox.addActionListener(eventHandler); - } - return optionsRenderingAntialiasingComboBox; - } - - private JComboBox getOptionsRenderingTextAntialiasingComboBox() { - if (optionsRenderingTextAntialiasingComboBox == null) { - optionsRenderingTextAntialiasingComboBox = new JComboBox(new String[] { "Default", "On", "Off"}); - optionsRenderingTextAntialiasingComboBox.addActionListener(eventHandler); - } - return optionsRenderingTextAntialiasingComboBox; - } - - private JComboBox getOptionsRenderingMethodComboBox() { - if (optionsRenderingMethodComboBox == null) { - optionsRenderingMethodComboBox = new JComboBox(new String[] { "Default", "Quality", "Speed"}); - optionsRenderingMethodComboBox.addActionListener(eventHandler); - } - return optionsRenderingMethodComboBox; - } - - private JComboBox getOptionsRenderingNoBuffersComboBox() { - if (optionsRenderingNoBuffersComboBox == null) { - optionsRenderingNoBuffersComboBox = new JComboBox( - new String[] { "Single buffering", "Double buffering", "Triple buffering"}); - optionsRenderingNoBuffersComboBox.addActionListener(eventHandler); - } - return optionsRenderingNoBuffersComboBox; - } - - private JButton getPredefinedPlatformDefaultButton() { - if (predefinedPlaformDefaultButton == null) { - predefinedPlaformDefaultButton = new JButton("Default"); - predefinedPlaformDefaultButton.setMnemonic('u'); - predefinedPlaformDefaultButton.setDisplayedMnemonicIndex(4); - predefinedPlaformDefaultButton.addActionListener(eventHandler); - } - return predefinedPlaformDefaultButton; - } - - private JButton getPredefinedSpeedButton() { - if (predefinedSpeedButton == null) { - predefinedSpeedButton = new JButton("Speed"); - predefinedSpeedButton.setMnemonic('p'); - predefinedSpeedButton.setDisplayedMnemonicIndex(1); - predefinedSpeedButton.addActionListener(eventHandler); - } - return predefinedSpeedButton; - } - - private JButton getPredefinedQualityButton() { - if (predefinedQualityButton == null) { - predefinedQualityButton = new JButton("Quality"); - predefinedQualityButton.setMnemonic('Q'); - predefinedQualityButton.addActionListener(eventHandler); - } - return predefinedQualityButton; - } - - private JCheckBox getOptionsRenderingBufferImagesCheckBox() { - if (optionsRenderingBufferImagesCheckBox == null) { - optionsRenderingBufferImagesCheckBox = new JCheckBox("Buffer images (uses memory)"); - optionsRenderingBufferImagesCheckBox.setMnemonic('i'); - optionsRenderingBufferImagesCheckBox.setDisplayedMnemonicIndex(7); - optionsRenderingBufferImagesCheckBox.addActionListener(eventHandler); - } - return optionsRenderingBufferImagesCheckBox; - } - - private JCheckBox getOptionsRenderingForceBulletColorCheckBox() { - if (optionsRenderingForceBulletColorCheckBox == null) { - optionsRenderingForceBulletColorCheckBox = new JCheckBox("Make all bullets white"); - optionsRenderingForceBulletColorCheckBox.setMnemonic('M'); - optionsRenderingForceBulletColorCheckBox.addActionListener(eventHandler); - } - return optionsRenderingForceBulletColorCheckBox; - } - - private void loadPreferences(ISettingsManager props) { - getOptionsRenderingAntialiasingComboBox().setSelectedIndex(props.getOptionsRenderingAntialiasing()); - getOptionsRenderingTextAntialiasingComboBox().setSelectedIndex(props.getOptionsRenderingTextAntialiasing()); - getOptionsRenderingMethodComboBox().setSelectedIndex(props.getOptionsRenderingMethod()); - getOptionsRenderingNoBuffersComboBox().setSelectedIndex(props.getOptionsRenderingNoBuffers() - 1); - getOptionsRenderingBufferImagesCheckBox().setSelected(props.getOptionsRenderingBufferImages()); - getOptionsRenderingForceBulletColorCheckBox().setSelected(props.getOptionsRenderingForceBulletColor()); - } - - public void storePreferences() { - ISettingsManager props = properties; - - props.setOptionsRenderingAntialiasing(optionsRenderingAntialiasingComboBox.getSelectedIndex()); - props.setOptionsRenderingTextAntialiasing(optionsRenderingTextAntialiasingComboBox.getSelectedIndex()); - props.setOptionsRenderingMethod(optionsRenderingMethodComboBox.getSelectedIndex()); - props.setOptionsRenderingNoBuffers(optionsRenderingNoBuffersComboBox.getSelectedIndex() + 1); - props.setOptionsRenderingBufferImages(optionsRenderingBufferImagesCheckBox.isSelected()); - props.setOptionsRenderingForceBulletColor(optionsRenderingForceBulletColorCheckBox.isSelected()); - properties.saveProperties(); - } - - @Override - public boolean isReady() { - return true; - } - - private void setPredefinedSettings(int index) { - optionsRenderingAntialiasingComboBox.setSelectedIndex(index); - optionsRenderingTextAntialiasingComboBox.setSelectedIndex(index); - optionsRenderingMethodComboBox.setSelectedIndex(index); - } - - private class EventHandler implements ActionListener { - - public void actionPerformed(ActionEvent e) { - Object src = e.getSource(); - - if (src == predefinedPlaformDefaultButton) { - setPredefinedSettings(0); - } else if (src == predefinedQualityButton) { - setPredefinedSettings(1); - } else if (src == predefinedSpeedButton) { - setPredefinedSettings(2); - } else if (src == optionsRenderingBufferImagesCheckBox) { - // Reset images so they are reloaded and gets buffered or unbuffered - new Thread() { - @Override - public void run() { - storePreferences(); - imageManager.initialize(); - } - }.start(); - return; - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesSoundOptionsTab.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesSoundOptionsTab.java deleted file mode 100644 index 37a71e3..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesSoundOptionsTab.java +++ /dev/null @@ -1,397 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.settings.ISettingsManager; - -import javax.sound.sampled.*; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Vector; - - -/** - * @author Flemming N. Larsen (original) - */ -@SuppressWarnings("serial") -public class PreferencesSoundOptionsTab extends WizardPanel { - - private final ISettingsManager properties; - - private final EventHandler eventHandler = new EventHandler(); - - private JPanel soundOptionsPanel; - private JPanel mixerOptionsPanel; - - private JCheckBox enableSoundCheckBox; - private JCheckBox enableGunshotCheckBox; - private JCheckBox enableBulletHitCheckBox; - private JCheckBox enableRobotDeathCheckBox; - private JCheckBox enableWallCollisionCheckBox; - private JCheckBox enableRobotCollisionCheckBox; - - private JButton enableAllSoundsButton; - private JButton disableAllSoundsButton; - - private JComboBox mixerComboBox; - private JButton mixerDefaultButton; - - private JCheckBox enableMixerVolumeCheckBox; - private JCheckBox enableMixerPanCheckBox; - - public PreferencesSoundOptionsTab(ISettingsManager properties) { - super(); - this.properties = properties; - initialize(); - } - - private void initialize() { - setLayout(new GridLayout(1, 2)); - - add(getSoundOptionsPanel()); - add(getMixerOptionsPanel()); - - loadPreferences(properties); - } - - private JPanel getSoundOptionsPanel() { - if (soundOptionsPanel == null) { - soundOptionsPanel = new JPanel(); - soundOptionsPanel.setBorder( - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Sound Effects")); - - soundOptionsPanel.setLayout(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - c.fill = 1; - c.weightx = 1; - c.anchor = GridBagConstraints.NORTHWEST; - - c.gridwidth = GridBagConstraints.REMAINDER; - soundOptionsPanel.add(getEnableSoundCheckBox(), c); - soundOptionsPanel.add(getEnableGunshotCheckBox(), c); - soundOptionsPanel.add(getEnableBulletHitCheckBox(), c); - soundOptionsPanel.add(getEnableRobotDeathCheckBox(), c); - soundOptionsPanel.add(getEnableWallCollisionCheckBox(), c); - soundOptionsPanel.add(getEnableRobotCollisionCheckBox(), c); - - c.insets = new Insets(10, 0, 0, 10); - c.gridwidth = 1; - c.fill = 0; - c.weighty = 1; - c.weightx = 0; - soundOptionsPanel.add(getEnableAllSoundsButton(), c); - c.weightx = 1; - c.gridwidth = GridBagConstraints.REMAINDER; - soundOptionsPanel.add(getDisableAllSoundsButton(), c); - - if (AudioSystem.getMixerInfo().length == 0) { - for (Component child : soundOptionsPanel.getComponents()) { - child.setEnabled(false); - } - } - } - return soundOptionsPanel; - } - - private JCheckBox getEnableSoundCheckBox() { - if (enableSoundCheckBox == null) { - enableSoundCheckBox = new JCheckBox("Enable Sound"); - enableSoundCheckBox.setMnemonic('E'); - } - return enableSoundCheckBox; - } - - private JCheckBox getEnableGunshotCheckBox() { - if (enableGunshotCheckBox == null) { - enableGunshotCheckBox = new JCheckBox("Gun Shots"); - enableGunshotCheckBox.setMnemonic('G'); - } - return enableGunshotCheckBox; - } - - private JCheckBox getEnableBulletHitCheckBox() { - if (enableBulletHitCheckBox == null) { - enableBulletHitCheckBox = new JCheckBox("Bullet Hit"); - enableBulletHitCheckBox.setMnemonic('H'); - enableBulletHitCheckBox.setDisplayedMnemonicIndex(7); - } - return enableBulletHitCheckBox; - } - - private JCheckBox getEnableRobotDeathCheckBox() { - if (enableRobotDeathCheckBox == null) { - enableRobotDeathCheckBox = new JCheckBox("Robot Death Explosions"); - enableRobotDeathCheckBox.setMnemonic('x'); - enableRobotDeathCheckBox.setDisplayedMnemonicIndex(13); - } - return enableRobotDeathCheckBox; - } - - private JCheckBox getEnableRobotCollisionCheckBox() { - if (enableRobotCollisionCheckBox == null) { - enableRobotCollisionCheckBox = new JCheckBox("Robot Collisions"); - enableRobotCollisionCheckBox.setMnemonic('t'); - enableRobotCollisionCheckBox.setDisplayedMnemonicIndex(4); - } - return enableRobotCollisionCheckBox; - } - - private JCheckBox getEnableWallCollisionCheckBox() { - if (enableWallCollisionCheckBox == null) { - enableWallCollisionCheckBox = new JCheckBox("Wall Collisions"); - enableWallCollisionCheckBox.setMnemonic('l'); - enableWallCollisionCheckBox.setDisplayedMnemonicIndex(2); - } - return enableWallCollisionCheckBox; - } - - private JButton getEnableAllSoundsButton() { - if (enableAllSoundsButton == null) { - enableAllSoundsButton = new JButton("Enable all"); - enableAllSoundsButton.setMnemonic('a'); - enableAllSoundsButton.setDisplayedMnemonicIndex(7); - enableAllSoundsButton.addActionListener(eventHandler); - } - return enableAllSoundsButton; - } - - private JButton getDisableAllSoundsButton() { - if (disableAllSoundsButton == null) { - disableAllSoundsButton = new JButton("Disable all"); - disableAllSoundsButton.setMnemonic('i'); - disableAllSoundsButton.setDisplayedMnemonicIndex(1); - disableAllSoundsButton.addActionListener(eventHandler); - } - return disableAllSoundsButton; - } - - private JPanel getMixerOptionsPanel() { - if (mixerOptionsPanel == null) { - mixerOptionsPanel = new JPanel(); - mixerOptionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Mixer")); - - mixerOptionsPanel.setLayout(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 1; - - c.insets = new Insets(8, 4, 0, 0); - mixerOptionsPanel.add(new JLabel("Select mixer:"), c); - - c.gridy = 1; - mixerOptionsPanel.add(getMixerComboBox(), c); - - c.gridy = 2; - mixerOptionsPanel.add(getMixerDefaultButton(), c); - - c.insets = new Insets(16, 4, 0, 0); - c.gridy = 3; - mixerOptionsPanel.add(new JLabel("Enable mixer features:"), c); - - c.insets = new Insets(6, 0, 0, 0); - c.gridy = 4; - mixerOptionsPanel.add(getEnableMixerVolumeCheckBox(), c); - - c.insets = new Insets(0, 0, 0, 0); - c.gridy = 5; - mixerOptionsPanel.add(getEnableMixerPanCheckBox(), c); - - if (AudioSystem.getMixerInfo().length == 0) { - for (Component child : mixerOptionsPanel.getComponents()) { - child.setEnabled(false); - } - } - } - return mixerOptionsPanel; - } - - private JComboBox getMixerComboBox() { - if (mixerComboBox == null) { - Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); - - Line.Info clipLineInfo = new Line.Info(Clip.class); - - Vector mixers = new Vector(); - - for (Mixer.Info mi : mixerInfo) { - if (AudioSystem.getMixer(mi).getSourceLineInfo(clipLineInfo).length > 0) { - mixers.add(mi); - } - } - - mixerComboBox = new JComboBox(mixers); - mixerComboBox.setRenderer(new MixerInfoCellRenderer()); - mixerComboBox.addActionListener(eventHandler); - } - return mixerComboBox; - } - - private JButton getMixerDefaultButton() { - if (mixerDefaultButton == null) { - mixerDefaultButton = new JButton("Default"); - mixerDefaultButton.setMnemonic('u'); - mixerDefaultButton.setDisplayedMnemonicIndex(4); - mixerDefaultButton.addActionListener(eventHandler); - } - return mixerDefaultButton; - } - - private JCheckBox getEnableMixerVolumeCheckBox() { - if (enableMixerVolumeCheckBox == null) { - enableMixerVolumeCheckBox = new JCheckBox("Volume"); - enableMixerVolumeCheckBox.setMnemonic('V'); - enableMixerVolumeCheckBox.addActionListener(eventHandler); - } - return enableMixerVolumeCheckBox; - } - - private JCheckBox getEnableMixerPanCheckBox() { - if (enableMixerPanCheckBox == null) { - enableMixerPanCheckBox = new JCheckBox("Pan"); - enableMixerPanCheckBox.setMnemonic('P'); - enableMixerPanCheckBox.addActionListener(eventHandler); - } - return enableMixerPanCheckBox; - } - - private void loadPreferences(ISettingsManager robocodeProperties) { - getEnableSoundCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableSound()); - getEnableGunshotCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableGunshot()); - getEnableBulletHitCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableBulletHit()); - getEnableRobotDeathCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableRobotDeath()); - getEnableRobotCollisionCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableRobotCollision()); - getEnableWallCollisionCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableWallCollision()); - getEnableMixerVolumeCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableMixerVolume()); - getEnableMixerPanCheckBox().setSelected(robocodeProperties.getOptionsSoundEnableMixerPan()); - - setMixerCompoBox(robocodeProperties.getOptionsSoundMixer()); - } - - public void storePreferences() { - ISettingsManager props = properties; - - props.setOptionsSoundEnableSound(getEnableSoundCheckBox().isSelected()); - props.setOptionsSoundEnableGunshot(getEnableGunshotCheckBox().isSelected()); - props.setOptionsSoundEnableBulletHit(getEnableBulletHitCheckBox().isSelected()); - props.setOptionsSoundEnableRobotDeath(getEnableRobotDeathCheckBox().isSelected()); - props.setOptionsSoundEnableRobotCollision(getEnableRobotCollisionCheckBox().isSelected()); - props.setOptionsSoundEnableWallCollision(getEnableWallCollisionCheckBox().isSelected()); - props.setOptionsSoundEnableMixerVolume(getEnableMixerVolumeCheckBox().isSelected()); - props.setOptionsSoundEnableMixerPan(getEnableMixerPanCheckBox().isSelected()); - - String mixerClassName = null; - Mixer.Info mixerInfo = (Mixer.Info) getMixerComboBox().getSelectedItem(); - - if (mixerInfo != null) { - Mixer mixer = AudioSystem.getMixer((Mixer.Info) getMixerComboBox().getSelectedItem()); - - if (mixer != null) { - mixerClassName = mixer.getClass().getSimpleName(); - } - } - if (mixerClassName != null) { - props.setOptionsSoundMixer(mixerClassName); - } - - properties.saveProperties(); - } - - @Override - public boolean isReady() { - return true; - } - - private void setMixerCompoBox(String mixerName) { - for (Mixer.Info mi : AudioSystem.getMixerInfo()) { - if (AudioSystem.getMixer(mi).getClass().getSimpleName().equals(mixerName)) { - getMixerComboBox().setSelectedItem(mi); - break; - } - } - } - - private class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - Object src = e.getSource(); - - if (src == enableAllSoundsButton) { - setAllSoundsButtonsEnabled(true); - } else if (src == disableAllSoundsButton) { - setAllSoundsButtonsEnabled(false); - } else if (src == mixerComboBox) { - mixerComboBoxActionPerformed(); - } else if (src == mixerDefaultButton) { - mixerDefaultButtonActionPerformed(); - } - } - } - - private void setAllSoundsButtonsEnabled(boolean enabled) { - enableSoundCheckBox.setSelected(enabled); - enableGunshotCheckBox.setSelected(enabled); - enableBulletHitCheckBox.setSelected(enabled); - enableRobotDeathCheckBox.setSelected(enabled); - enableWallCollisionCheckBox.setSelected(enabled); - enableRobotCollisionCheckBox.setSelected(enabled); - } - - private void mixerComboBoxActionPerformed() { - Mixer mixer = AudioSystem.getMixer((Mixer.Info) mixerComboBox.getSelectedItem()); - - Line.Info lineInfo = mixer.getSourceLineInfo(new Line.Info(Clip.class))[0]; - - boolean volumeSupported; - boolean panSupported; - - try { - Line line = mixer.getLine(lineInfo); - - volumeSupported = line.isControlSupported(FloatControl.Type.MASTER_GAIN); - panSupported = line.isControlSupported(FloatControl.Type.PAN); - } catch (LineUnavailableException e) { - volumeSupported = false; - panSupported = false; - } - - enableMixerVolumeCheckBox.setEnabled(volumeSupported); - enableMixerPanCheckBox.setEnabled(panSupported); - } - - private void mixerDefaultButtonActionPerformed() { - setMixerCompoBox("DirectAudioDevice"); - } - - private static class MixerInfoCellRenderer extends javax.swing.plaf.basic.BasicComboBoxRenderer { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - - Mixer.Info mi = (Mixer.Info) value; - - if (mi != null) { - String text = mi.getName(); - - if (!"Unknown Version".equals(mi.getVersion())) { - text += ' ' + mi.getVersion(); - } - if (!"Unknown Vendor".equals(mi.getVendor())) { - text += " by " + mi.getVendor(); - } - setText(text); - } - return component; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesViewOptionsTab.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesViewOptionsTab.java deleted file mode 100644 index e064903..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/PreferencesViewOptionsTab.java +++ /dev/null @@ -1,470 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.settings.ISettingsListener; -import net.sf.robocode.settings.ISettingsManager; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - */ -@SuppressWarnings("serial") -public class PreferencesViewOptionsTab extends WizardPanel { - - private static final int MIN_TPS = 1; - private static final int DEFAULT_TPS = 30; - private static final int FAST_TPS = 45; - private static final int MAX_TPS = 10000; - - private final EventHandler eventHandler = new EventHandler(); - - private JCheckBox visibleRobotEnergyCheckBox; - private JCheckBox visibleRobotNameCheckBox; - private JCheckBox visibleScanArcsCheckBox; - private JCheckBox visibleExplosionsCheckBox; - private JCheckBox visibleGroundCheckBox; - private JCheckBox visibleExplosionDebrisCheckBox; - private JCheckBox visibleSentryBorderCheckBox; - - private JButton defaultViewOptionsButton; - private JButton enableAllViewOptionsButton; - private JButton disableAllViewOptionsButton; - - private JTextField desiredTpsTextField; - private JLabel desiredTpsLabel; - private JCheckBox displayFpsCheckBox; - private JCheckBox displayTpsCheckBox; - - private JPanel visibleOptionsPanel; - private JPanel tpsOptionsPanel; - - private JButton minTpsButton; - private JButton defaultTpsButton; - private JButton fastTpsButton; - private JButton maxTpsButton; - - private JCheckBox preventSpeedupWhenMinimizedCheckBox; - - private final ISettingsManager properties; - - private class EventHandler implements ActionListener, DocumentListener { - public void actionPerformed(ActionEvent e) { - Object src = e.getSource(); - - if (src == enableAllViewOptionsButton) { - setAllViewOptionsButtonsEnabled(true); - } else if (src == disableAllViewOptionsButton) { - setAllViewOptionsButtonsEnabled(false); - } else if (src == defaultViewOptionsButton) { - defaultViewOptionsButtonActionPerformed(); - } else if (src == defaultTpsButton) { - defaultTpsButtonActionPerformed(); - } else if (src == minTpsButton) { - minTpsButtonActionPerformed(); - } else if (src == fastTpsButton) { - fastTpsButtonActionPerformed(); - } else if (src == maxTpsButton) { - maxTpsButtonActionPerformed(); - } - } - - public void changedUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void insertUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void removeUpdate(DocumentEvent e) { - fireStateChanged(); - } - } - - public PreferencesViewOptionsTab(ISettingsManager properties) { - super(); - this.properties = properties; - initialize(); - } - - private void defaultViewOptionsButtonActionPerformed() { - setAllViewOptionsButtonsEnabled(true); - getVisibleScanArcsCheckBox().setSelected(false); - } - - private void setAllViewOptionsButtonsEnabled(boolean enabled) { - getVisibleRobotEnergyCheckBox().setSelected(enabled); - getVisibleRobotNameCheckBox().setSelected(enabled); - getVisibleScanArcsCheckBox().setSelected(enabled); - getVisibleExplosionsCheckBox().setSelected(enabled); - getVisibleGroundCheckBox().setSelected(enabled); - getVisibleExplosionDebrisCheckBox().setSelected(enabled); - getVisibleSentryBorderCheckBox().setSelected(enabled); - } - - private void maxTpsButtonActionPerformed() { - getDesiredTpsTextField().setText("" + MAX_TPS); - } - - private void minTpsButtonActionPerformed() { - getDesiredTpsTextField().setText("" + MIN_TPS); - } - - private void fastTpsButtonActionPerformed() { - getDesiredTpsTextField().setText("" + FAST_TPS); - } - - private void defaultTpsButtonActionPerformed() { - getDesiredTpsTextField().setText("" + DEFAULT_TPS); - } - - private JButton getDefaultViewOptionsButton() { - if (defaultViewOptionsButton == null) { - defaultViewOptionsButton = new JButton("Defaults"); - defaultViewOptionsButton.setMnemonic('u'); - defaultViewOptionsButton.setDisplayedMnemonicIndex(4); - defaultViewOptionsButton.addActionListener(eventHandler); - } - return defaultViewOptionsButton; - } - - private JButton getEnableAllViewOptionsButton() { - if (enableAllViewOptionsButton == null) { - enableAllViewOptionsButton = new JButton("Enable all"); - enableAllViewOptionsButton.setMnemonic('a'); - enableAllViewOptionsButton.setDisplayedMnemonicIndex(7); - enableAllViewOptionsButton.addActionListener(eventHandler); - } - return enableAllViewOptionsButton; - } - - private JButton getDisableAllViewOptionsButton() { - if (disableAllViewOptionsButton == null) { - disableAllViewOptionsButton = new JButton("Disable all"); - disableAllViewOptionsButton.setMnemonic('i'); - disableAllViewOptionsButton.setDisplayedMnemonicIndex(1); - disableAllViewOptionsButton.addActionListener(eventHandler); - } - return disableAllViewOptionsButton; - } - - private JLabel getDesiredTpsLabel() { - if (desiredTpsLabel == null) { - desiredTpsLabel = new JLabel("Desired TPS (" + MIN_TPS + '-' + MAX_TPS + "): "); - } - return desiredTpsLabel; - } - - private JTextField getDesiredTpsTextField() { - if (desiredTpsTextField == null) { - desiredTpsTextField = new JTextField(); - desiredTpsTextField.setColumns(5); - desiredTpsTextField.getDocument().addDocumentListener(eventHandler); - - desiredTpsTextField.setInputVerifier( - new InputVerifier() { - @Override - public boolean verify(JComponent c) { - String text = desiredTpsTextField.getText(); - - int inputTps; - - try { - inputTps = new Integer(text); - } catch (NumberFormatException e) { - inputTps = -1; - } - return inputTps >= MIN_TPS && inputTps <= MAX_TPS; - } - - public boolean shouldYieldFocus(JComponent input) { - if (verify(input)) { - return true; - } - JOptionPane.showMessageDialog(null, - "The specified value for 'Desired TPS' (" + MIN_TPS + '-' + MAX_TPS + ") is invalid.", - "Invalid input", JOptionPane.ERROR_MESSAGE); - return false; - } - }); - } - return desiredTpsTextField; - } - - private JCheckBox getDisplayFpsCheckBox() { - if (displayFpsCheckBox == null) { - displayFpsCheckBox = new JCheckBox("Display FPS in titlebar"); - displayFpsCheckBox.setMnemonic('P'); - displayFpsCheckBox.setDisplayedMnemonicIndex(9); - } - return displayFpsCheckBox; - } - - private JCheckBox getDisplayTpsCheckBox() { - if (displayTpsCheckBox == null) { - displayTpsCheckBox = new JCheckBox("Display TPS in titlebar"); - displayTpsCheckBox.setMnemonic('T'); - displayTpsCheckBox.setDisplayedMnemonicIndex(8); - } - return displayTpsCheckBox; - } - - private JButton getDefaultTpsButton() { - if (defaultTpsButton == null) { - defaultTpsButton = new JButton("Default"); - defaultTpsButton.addActionListener(eventHandler); - } - return defaultTpsButton; - } - - private JButton getMinTpsButton() { - if (minTpsButton == null) { - minTpsButton = new JButton("Minimum"); - minTpsButton.addActionListener(eventHandler); - } - return minTpsButton; - } - - private JButton getMaxTpsButton() { - if (maxTpsButton == null) { - maxTpsButton = new JButton("Max"); - maxTpsButton.addActionListener(eventHandler); - } - return maxTpsButton; - } - - private JButton getFastTpsButton() { - if (fastTpsButton == null) { - fastTpsButton = new JButton("Fast"); - fastTpsButton.addActionListener(eventHandler); - } - return fastTpsButton; - } - - private JCheckBox getPreventSpeedupWhenMinimizedCheckBox() { - if (preventSpeedupWhenMinimizedCheckBox == null) { - preventSpeedupWhenMinimizedCheckBox = new JCheckBox("Prevent speedup when minimized"); - } - return preventSpeedupWhenMinimizedCheckBox; - } - - private JPanel getTpsOptionsPanel() { - if (tpsOptionsPanel == null) { - tpsOptionsPanel = new JPanel(); - tpsOptionsPanel.setBorder( - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Turns Per Second (TPS)")); - tpsOptionsPanel.setLayout(new GridBagLayout()); - - GridBagConstraints c = new GridBagConstraints(); - - c.anchor = GridBagConstraints.NORTHWEST; - c.gridwidth = 4; - - tpsOptionsPanel.add(getDisplayTpsCheckBox(), c); - c.gridy = 1; - tpsOptionsPanel.add(getDisplayFpsCheckBox(), c); - - JPanel tpsPanel = new JPanel(); - - tpsPanel.add(getDesiredTpsLabel()); - tpsPanel.add(getDesiredTpsTextField()); - - c.fill = GridBagConstraints.VERTICAL; - c.gridy = 2; - c.insets = new Insets(10, 0, 0, 0); - tpsOptionsPanel.add(tpsPanel, c); - - c.fill = GridBagConstraints.NONE; - c.gridx = 0; - c.gridy = 3; - c.gridwidth = 1; - c.weightx = 0.25; - tpsOptionsPanel.add(getMinTpsButton(), c); - c.gridx = 1; - tpsOptionsPanel.add(getDefaultTpsButton(), c); - c.gridx = 2; - tpsOptionsPanel.add(getFastTpsButton(), c); - c.gridx = 3; - tpsOptionsPanel.add(getMaxTpsButton(), c); - - c.insets = new Insets(20, 0, 0, 0); - c.gridwidth = 4; - c.gridx = 0; - c.gridy = 4; - c.weighty = 1; - tpsOptionsPanel.add(getPreventSpeedupWhenMinimizedCheckBox(), c); - } - return tpsOptionsPanel; - } - - private JPanel getVisibleOptionsPanel() { - if (visibleOptionsPanel == null) { - visibleOptionsPanel = new JPanel(); - visibleOptionsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Arena")); - visibleOptionsPanel.setLayout(new GridBagLayout()); - - GridBagConstraints c = new GridBagConstraints(); - - c.anchor = GridBagConstraints.NORTHWEST; - c.gridwidth = GridBagConstraints.REMAINDER; - c.weightx = 1; - - visibleOptionsPanel.add(getVisibleRobotEnergyCheckBox(), c); - visibleOptionsPanel.add(getVisibleRobotNameCheckBox(), c); - visibleOptionsPanel.add(getVisibleScanArcsCheckBox(), c); - visibleOptionsPanel.add(getVisibleExplosionsCheckBox(), c); - visibleOptionsPanel.add(getVisibleGroundCheckBox(), c); - visibleOptionsPanel.add(getVisibleExplosionDebrisCheckBox(), c); - visibleOptionsPanel.add(getVisibleSentryBorderCheckBox(), c); - - c.insets = new Insets(10, 0, 0, 10); - c.gridwidth = 1; - c.fill = GridBagConstraints.NONE; - c.weighty = 1; - c.weightx = 0; - visibleOptionsPanel.add(getEnableAllViewOptionsButton(), c); - visibleOptionsPanel.add(getDisableAllViewOptionsButton(), c); - visibleOptionsPanel.add(getDefaultViewOptionsButton(), c); - } - return visibleOptionsPanel; - } - - private JCheckBox getVisibleRobotEnergyCheckBox() { - if (visibleRobotEnergyCheckBox == null) { - visibleRobotEnergyCheckBox = new JCheckBox("Visible Robot Energy"); - visibleRobotEnergyCheckBox.setMnemonic('y'); - visibleRobotEnergyCheckBox.setDisplayedMnemonicIndex(19); - } - return visibleRobotEnergyCheckBox; - } - - private JCheckBox getVisibleRobotNameCheckBox() { - if (visibleRobotNameCheckBox == null) { - visibleRobotNameCheckBox = new JCheckBox("Visible Robot Name"); - visibleRobotNameCheckBox.setMnemonic('V'); - } - return visibleRobotNameCheckBox; - } - - private JCheckBox getVisibleScanArcsCheckBox() { - if (visibleScanArcsCheckBox == null) { - visibleScanArcsCheckBox = new JCheckBox("Visible Scan Arcs"); - visibleScanArcsCheckBox.setMnemonic('b'); - visibleScanArcsCheckBox.setDisplayedMnemonicIndex(4); - } - return visibleScanArcsCheckBox; - } - - private JCheckBox getVisibleExplosionsCheckBox() { - if (visibleExplosionsCheckBox == null) { - visibleExplosionsCheckBox = new JCheckBox("Visible Explosions"); - visibleExplosionsCheckBox.setMnemonic('x'); - visibleExplosionsCheckBox.setDisplayedMnemonicIndex(9); - } - return visibleExplosionsCheckBox; - } - - private JCheckBox getVisibleGroundCheckBox() { - if (visibleGroundCheckBox == null) { - visibleGroundCheckBox = new JCheckBox("Visible Ground"); - visibleGroundCheckBox.setMnemonic('G'); - visibleGroundCheckBox.setDisplayedMnemonicIndex(8); - } - return visibleGroundCheckBox; - } - - private JCheckBox getVisibleExplosionDebrisCheckBox() { - if (visibleExplosionDebrisCheckBox == null) { - visibleExplosionDebrisCheckBox = new JCheckBox("Visible Explosion Debris"); - visibleExplosionDebrisCheckBox.setMnemonic('E'); - visibleExplosionDebrisCheckBox.setDisplayedMnemonicIndex(8); - } - return visibleExplosionDebrisCheckBox; - } - - private JCheckBox getVisibleSentryBorderCheckBox() { - if (visibleSentryBorderCheckBox == null) { - visibleSentryBorderCheckBox = new JCheckBox("Visible Sentry Border"); - visibleSentryBorderCheckBox.setMnemonic('l'); - visibleSentryBorderCheckBox.setDisplayedMnemonicIndex(5); - } - return visibleSentryBorderCheckBox; - } - - private void initialize() { - setLayout(new GridLayout(1, 2)); - add(getVisibleOptionsPanel()); - add(getTpsOptionsPanel()); - - final ISettingsManager props = properties; - - loadPreferences(props); - - props.addPropertyListener(new ISettingsListener() { - public void settingChanged(String property) { - if (property.equals(ISettingsManager.OPTIONS_BATTLE_DESIREDTPS)) { - PreferencesViewOptionsTab.this.desiredTpsTextField.setText("" + props.getOptionsBattleDesiredTPS()); - } - } - }); - } - - private void loadPreferences(ISettingsManager robocodeProperties) { - getDisplayFpsCheckBox().setSelected(robocodeProperties.getOptionsViewFPS()); - getDisplayTpsCheckBox().setSelected(robocodeProperties.getOptionsViewTPS()); - getVisibleRobotNameCheckBox().setSelected(robocodeProperties.getOptionsViewRobotNames()); - getVisibleRobotEnergyCheckBox().setSelected(robocodeProperties.getOptionsViewRobotEnergy()); - getVisibleScanArcsCheckBox().setSelected(robocodeProperties.getOptionsViewScanArcs()); - getVisibleExplosionsCheckBox().setSelected(robocodeProperties.getOptionsViewExplosions()); - getVisibleGroundCheckBox().setSelected(robocodeProperties.getOptionsViewGround()); - getVisibleExplosionDebrisCheckBox().setSelected(robocodeProperties.getOptionsViewExplosionDebris()); - getVisibleSentryBorderCheckBox().setSelected(robocodeProperties.getOptionsViewSentryBorder()); - getDesiredTpsTextField().setText("" + robocodeProperties.getOptionsBattleDesiredTPS()); - getPreventSpeedupWhenMinimizedCheckBox().setSelected( - robocodeProperties.getOptionsViewPreventSpeedupWhenMinimized()); - } - - public void storePreferences() { - ISettingsManager props = properties; - - props.setOptionsViewFPS(getDisplayFpsCheckBox().isSelected()); - props.setOptionsViewTPS(getDisplayTpsCheckBox().isSelected()); - props.setOptionsViewRobotNames(getVisibleRobotNameCheckBox().isSelected()); - props.setOptionsViewRobotEnergy(getVisibleRobotEnergyCheckBox().isSelected()); - props.setOptionsViewScanArcs(getVisibleScanArcsCheckBox().isSelected()); - props.setOptionsViewExplosions(getVisibleExplosionsCheckBox().isSelected()); - props.setOptionsViewGround(getVisibleGroundCheckBox().isSelected()); - props.setOptionsViewExplosionDebris(getVisibleExplosionDebrisCheckBox().isSelected()); - props.setOptionsViewSentryBorder(getVisibleSentryBorderCheckBox().isSelected()); - props.setOptionsBattleDesiredTPS(Integer.parseInt(getDesiredTpsTextField().getText())); - props.setOptionsViewPreventSpeedupWhenMinimized(getPreventSpeedupWhenMinimizedCheckBox().isSelected()); - properties.saveProperties(); - } - - @Override - public boolean isReady() { - try { - int tps = Integer.parseInt(getDesiredTpsTextField().getText()); - - return (tps >= MIN_TPS && tps <= MAX_TPS); - } catch (Exception e) { - return false; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RankingDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RankingDialog.java deleted file mode 100644 index 66db429..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RankingDialog.java +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.battle.BattleRankingTableModel; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.ui.IWindowManager; -import robocode.control.events.BattleAdaptor; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; -import javax.swing.table.AbstractTableModel; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.concurrent.atomic.AtomicReference; - - -/** - * Frame to display the battle results or ranking during battles. - * - * @author Mathew A. Nelson (original) - * @author Luis Crespo (original) - * @author Flemming N. Larsen (contributor) - * @author Nathaniel Troutman (contributor) - */ -@SuppressWarnings("serial") -public class RankingDialog extends BaseScoreDialog { - private final BattleRankingTableModel tableModel; - private final Timer timerTask; - private final BattleObserver battleObserver; - private final AtomicReference snapshot; - private ITurnSnapshot lastSnapshot; - private int lastRows; - private final MenuBar menu; - private final IWindowManager windowManager; - - public RankingDialog(IWindowManager windowManager, ISettingsManager settingsManager, MenuBar menu) { - super(settingsManager.getOptionsCommonDontHideRankings() ? null : windowManager, false); - - initialize(); - - this.windowManager = windowManager; - battleObserver = new BattleObserver(); - timerTask = new Timer(1000 / 2, new TimerTask()); - snapshot = new AtomicReference(); - lastRows = 0; - tableModel = new BattleRankingTableModel(); - this.menu = menu; - setTitle("Ranking"); - } - - @Override - protected AbstractTableModel getTableModel() { - return tableModel; - } - - private void update() { - final ITurnSnapshot current = snapshot.get(); - - if (lastSnapshot != current) { - setResultsData(); - - lastSnapshot = current; - tableModel.updateSource(lastSnapshot); - if (table.getModel().getRowCount() != lastRows) { - lastRows = table.getModel().getRowCount(); - - table.setPreferredSize( - new Dimension(table.getColumnModel().getTotalColumnWidth(), - table.getModel().getRowCount() * table.getRowHeight())); - table.setPreferredScrollableViewportSize(table.getPreferredSize()); - pack(); - } - repaint(); - } - } - - protected void onDialogShown() { - windowManager.addBattleListener(battleObserver); - timerTask.start(); - } - - protected void onDialogHidden() { - menu.getOptionsShowRankingCheckBoxMenuItem().setState(false); - timerTask.stop(); - windowManager.removeBattleListener(battleObserver); - dispose(); - } - - private class BattleObserver extends BattleAdaptor { - @Override - public void onBattleFinished(BattleFinishedEvent event) { - snapshot.set(null); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - snapshot.set(event.getTurnSnapshot()); - } - } - - - private class TimerTask implements ActionListener { - public void actionPerformed(ActionEvent e) { - update(); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RcSplashScreen.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RcSplashScreen.java deleted file mode 100644 index 89f9729..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RcSplashScreen.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.ui.gfx.RobocodeLogo; -import net.sf.robocode.version.IVersionManager; - -import javax.swing.*; -import javax.swing.border.EtchedBorder; -import java.awt.*; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -import java.awt.image.BufferedImage; - - -/** - * The splash screen. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class RcSplashScreen extends JWindow { - - private final static Color LABEL_COLOR = Color.WHITE; - - private JLabel splashLabel; - private JPanel splashPanel; - private JPanel splashScreenContentPane; - private Image splashImage; - private final String version; - - private final transient WindowListener eventHandler = new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - if (e.getSource() == RcSplashScreen.this) { - RcSplashScreen.this.dispose(); - } - } - }; - - public RcSplashScreen(IVersionManager versionManager) { - super(); - this.version = versionManager.getVersion(); - initialize(); - } - - public JLabel getSplashLabel() { - if (splashLabel == null) { - splashLabel = new JLabel(); - splashLabel.setText(""); - splashLabel.setForeground(LABEL_COLOR); - splashLabel.setOpaque(false); - } - return splashLabel; - } - - private JPanel getSplashPanel() { - if (splashPanel == null) { - splashPanel = new JPanel() { - @Override - public void paintComponent(Graphics g) { - g.drawImage(splashImage, 0, 0, null); - g.setColor(LABEL_COLOR); - g.setFont(new Font("Arial", 1, 12)); - FontMetrics fm = g.getFontMetrics(); - - g.drawString("Version: " + version, - splashImage.getWidth(null) - fm.stringWidth("Version: " + version), - splashImage.getHeight(null) - 4); - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(splashImage.getWidth(null), splashImage.getHeight(null)); - } - }; - splashPanel.setLayout(new BorderLayout()); - splashPanel.add(getSplashLabel(), BorderLayout.NORTH); - } - return splashPanel; - } - - private JPanel getSplashScreenContentPane() { - if (splashScreenContentPane == null) { - splashScreenContentPane = new JPanel(); - splashScreenContentPane.setBorder(new EtchedBorder()); - splashScreenContentPane.setLayout(new BorderLayout()); - splashScreenContentPane.add(getSplashPanel(), "Center"); - } - return splashScreenContentPane; - } - - private void initialize() { - splashImage = new BufferedImage(RobocodeLogo.WIDTH, RobocodeLogo.HEIGHT, BufferedImage.TYPE_INT_RGB); - new RobocodeLogo().paintLogoWithTanks(splashImage.getGraphics()); - - setContentPane(getSplashScreenContentPane()); - addWindowListener(eventHandler); - } - - @Override - public void paint(Graphics g) { - super.paint(g); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsDialog.java deleted file mode 100644 index 1c40a64..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsDialog.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.battle.BattleResultsTableModel; -import net.sf.robocode.ui.IWindowManager; -import robocode.BattleResults; - -import javax.swing.*; -import javax.swing.table.AbstractTableModel; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; - - -/** - * Dialog to display results (scores) of a battle. - *

- * This class is just a wrapper class used for storing the window position and - * dimension. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class ResultsDialog extends BaseScoreDialog { - - private JPanel buttonPanel; - private JButton okButton; - private JButton saveButton; - private BattleResultsTableModel tableModel; - private final ButtonEventHandler buttonEventHandler; - - public ResultsDialog(IWindowManager manager) { - super(manager, true); - buttonEventHandler = new ButtonEventHandler(); - initialize(); - addCancelByEscapeKey(); - } - - public void setup(BattleResults[] results, int numRounds) { - tableModel = new BattleResultsTableModel(results, numRounds); - setTitle(((BattleResultsTableModel) getTableModel()).getTitle()); - setResultsData(); - - table.setPreferredSize( - new Dimension(table.getColumnModel().getTotalColumnWidth(), - table.getModel().getRowCount() * table.getRowHeight())); - table.setPreferredScrollableViewportSize(table.getPreferredSize()); - } - - private void saveButtonActionPerformed() { - windowManager.showSaveResultsDialog(tableModel); - } - - private void okButtonActionPerformed() { - setVisible(false); - } - - @Override - protected AbstractTableModel getTableModel() { - return tableModel; - } - - @Override - protected JPanel getDialogContentPane() { - if (contentPane == null) { - contentPane = new JPanel(); - contentPane.setLayout(new BorderLayout()); - contentPane.add(getScrollPane(), "Center"); - contentPane.add(getButtonPanel(), "South"); - } - return contentPane; - } - - private JPanel getButtonPanel() { - if (buttonPanel == null) { - buttonPanel = new JPanel(); - buttonPanel.setLayout(new BorderLayout()); - buttonPanel.add(getOkButton(), "East"); - buttonPanel.add(getSaveButton(), "West"); - } - return buttonPanel; - } - - private JButton getOkButton() { - if (okButton == null) { - okButton = new JButton(); - okButton.setText("OK"); - okButton.addActionListener(buttonEventHandler); - WindowUtil.setFixedSize(okButton, new Dimension(80, 25)); - } - return okButton; - } - - private JButton getSaveButton() { - if (saveButton == null) { - saveButton = new JButton(); - saveButton.setText("Save"); - saveButton.addActionListener(buttonEventHandler); - WindowUtil.setFixedSize(saveButton, new Dimension(80, 25)); - } - return saveButton; - } - - private void addCancelByEscapeKey() { - String CANCEL_ACTION_KEY = "CANCEL_ACTION_KEY"; - int noModifiers = 0; - KeyStroke escapeKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, noModifiers, false); - InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - - inputMap.put(escapeKey, CANCEL_ACTION_KEY); - AbstractAction cancelAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - okButtonActionPerformed(); - } - }; - - getRootPane().getActionMap().put(CANCEL_ACTION_KEY, cancelAction); - } - - private class ButtonEventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - Object source = e.getSource(); - - if (source == ResultsDialog.this.getOkButton()) { - okButtonActionPerformed(); - } else if (source == ResultsDialog.this.getSaveButton()) { - saveButtonActionPerformed(); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsTableCellRenderer.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsTableCellRenderer.java deleted file mode 100644 index 1d99f65..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/ResultsTableCellRenderer.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import javax.swing.border.EtchedBorder; -import javax.swing.table.DefaultTableCellRenderer; -import java.awt.*; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class ResultsTableCellRenderer extends DefaultTableCellRenderer { - - private final boolean isBordered; - - public ResultsTableCellRenderer(boolean isBordered) { - super(); - this.isBordered = isBordered; - setHorizontalAlignment(SwingConstants.CENTER); - setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); - } - - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { - if (isBordered) { - setBorder(new EtchedBorder(EtchedBorder.RAISED)); - setBackground(SystemColor.menu); - setForeground(SystemColor.menuText); - } else if (isSelected) { - setBackground(SystemColor.textHighlight); - setForeground(SystemColor.textHighlightText); - } else { - setBackground(SystemColor.text); - setForeground(SystemColor.textText); - } - setText(value.toString()); - - return this; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobocodeFrame.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobocodeFrame.java deleted file mode 100644 index 23f6f82..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobocodeFrame.java +++ /dev/null @@ -1,1011 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.recording.IRecordManager; -import net.sf.robocode.settings.ISettingsManager; -import net.sf.robocode.settings.ISettingsListener; -import net.sf.robocode.ui.*; -import net.sf.robocode.ui.battleview.BattleView; -import net.sf.robocode.ui.battleview.InteractiveHandler; -import net.sf.robocode.ui.battleview.ScreenshotUtil; -import net.sf.robocode.ui.gfx.ImageUtil; -import net.sf.robocode.version.IVersionManager; -import net.sf.robocode.version.Version; -import robocode.control.events.*; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.*; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryUsage; -import java.util.*; -import java.util.List; - - -/** - * @author Mathew Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Matthew Reeder (contributor) - * @author Luis Crespo (contributor) - * @author Pavel Savara (contributor) - */ -@SuppressWarnings("serial") -public class RobocodeFrame extends JFrame { - - private final static int MAX_TPS = 10000; - private final static int MAX_TPS_SLIDER_VALUE = 61; - - private final static int UPDATE_TITLE_INTERVAL = 500; // milliseconds - private final static String INSTALL_URL = "http://robocode.sourceforge.net/installer"; - - private static final Cursor BUSY_CURSOR = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); - private static final Cursor DEFAULT_CURSOR = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); - - private final EventHandler eventHandler = new EventHandler(); - private BattleObserver battleObserver; - - private final InteractiveHandler interactiveHandler; - - private JPanel robocodeContentPane; - private JLabel statusLabel; - - private JScrollPane robotButtonsScrollPane; - - private JPanel mainPanel; - private JPanel battleViewPanel; - private JPanel sidePanel; - private JPanel robotButtonsPanel; - - private JToolBar toolBar; - - private JToggleButton pauseButton; - private JButton nextTurnButton; - private JButton stopButton; - private JButton restartButton; - private JButton replayButton; - - private JSlider tpsSlider; - private JLabel tpsLabel; - - private boolean iconified; - private boolean exitOnClose = true; - - private final ISettingsManager properties; - - private final IWindowManagerExt windowManager; - private final IVersionManager versionManager; - private final IBattleManager battleManager; - private final IRobotDialogManager dialogManager; - private final IRecordManager recordManager; - private final BattleView battleView; - private final MenuBar menuBar; - - final List robotButtons = new ArrayList(); - - public RobocodeFrame(ISettingsManager properties, - IWindowManager windowManager, - IRobotDialogManager dialogManager, - IVersionManager versionManager, - IBattleManager battleManager, - IRecordManager recordManager, - InteractiveHandler interactiveHandler, - MenuBar menuBar, - BattleView battleView - ) { - this.windowManager = (IWindowManagerExt) windowManager; - this.properties = properties; - this.interactiveHandler = interactiveHandler; - this.versionManager = versionManager; - this.battleManager = battleManager; - this.dialogManager = dialogManager; - this.recordManager = recordManager; - this.battleView = battleView; - this.menuBar = menuBar; - menuBar.setup(this); - initialize(); - } - - protected void finalize() throws Throwable { - try { - windowManager.removeBattleListener(battleObserver); - } finally { - super.finalize(); - } - } - - public void setBusyPointer(boolean enabled) { - setCursor(enabled ? BUSY_CURSOR : DEFAULT_CURSOR); - } - - public void addRobotButton(JButton b) { - if (b instanceof RobotButton) { - robotButtons.add((RobotButton) b); - } - getRobotButtonsPanel().add(b); - b.setVisible(true); - getRobotButtonsPanel().validate(); - } - - public void checkUpdateOnStart() { - if (!isIconified()) { - Date lastCheckedDate = properties.getVersionChecked(); - - Date today = new Date(); - - if (lastCheckedDate == null) { - lastCheckedDate = today; - properties.setVersionChecked(lastCheckedDate); - properties.saveProperties(); - } - Calendar checkDate = Calendar.getInstance(); - - checkDate.setTime(lastCheckedDate); - checkDate.add(Calendar.DATE, 5); - - if (checkDate.getTime().before(today) && checkForNewVersion(false)) { - properties.setVersionChecked(today); - properties.saveProperties(); - } - } - } - - public boolean checkForNewVersion(boolean notifyNoUpdate) { - String currentVersion = versionManager.getVersion(); - String newVersion = versionManager.checkForNewVersion(); - - boolean newVersionAvailable = false; - - if (newVersion != null && currentVersion != null) { - if (Version.compare(newVersion, currentVersion) > 0) { - newVersionAvailable = true; - if (Version.isFinal(newVersion) - || (Version.isBeta(newVersion) && properties.getOptionsCommonNotifyAboutNewBetaVersions())) { - showNewVersion(newVersion); - } - } - } - if (notifyNoUpdate && !newVersionAvailable) { - showLatestVersion(currentVersion); - } - return true; - } - - public void takeScreenshot() { - setBusyPointer(true); - try { - ScreenshotUtil.saveScreenshot(battleView.getScreenshot(), "PNG", 1); - } finally { - setBusyPointer(false); - } - } - - private void showLatestVersion(String version) { - JOptionPane.showMessageDialog(this, "You have version " + version + ". This is the latest version of Robocode.", - "No update available", JOptionPane.INFORMATION_MESSAGE); - } - - private void showNewVersion(String newVersion) { - if (JOptionPane.showConfirmDialog(this, - "Version " + newVersion + " of Robocode is now available. Would you like to download it?", - "Version " + newVersion + " available", JOptionPane.YES_NO_OPTION) - == JOptionPane.YES_OPTION) { - try { - BrowserManager.openURL(INSTALL_URL); - } catch (IOException e) { - JOptionPane.showMessageDialog(this, e.getMessage(), "Unable to open browser!", - JOptionPane.INFORMATION_MESSAGE); - } - } else if (Version.isFinal(newVersion)) { - JOptionPane.showMessageDialog(this, - "It is highly recommended that you always download the latest version. You may get it at " + INSTALL_URL, - "Update when you can!", JOptionPane.INFORMATION_MESSAGE); - } - } - - /** - * Rather than use a layout manager for the battleview panel, we just - * calculate the proper aspect ratio and set the battleview's size. We could - * use a layout manager if someone wants to write one... - */ - private void battleViewPanelResized() { - battleView.setBounds(getBattleViewPanel().getBounds()); - } - - /** - * Return the MainPanel (which contains the BattleView and the robot - * buttons) - * - * @return JPanel - */ - private JPanel getMainPanel() { - if (mainPanel == null) { - mainPanel = new JPanel(); - mainPanel.setLayout(new BorderLayout()); - mainPanel.add(getSidePanel(), BorderLayout.EAST); - mainPanel.add(getBattleViewPanel()); - } - return mainPanel; - } - - /** - * Return the BattleViewMainPanel (which contains the BattleView and a - * spacer) - * - * @return JPanel - */ - private JPanel getBattleViewPanel() { - if (battleViewPanel == null) { - battleViewPanel = new JPanel(); - battleViewPanel.setPreferredSize(new Dimension(800, 600)); - battleViewPanel.setLayout(null); - battleViewPanel.add(battleView); - battleViewPanel.addComponentListener(eventHandler); - } - return battleViewPanel; - } - - /** - * Return the JFrameContentPane. - * - * @return JPanel - */ - private JPanel getRobocodeContentPane() { - if (robocodeContentPane == null) { - robocodeContentPane = new JPanel(); - robocodeContentPane.setLayout(new BorderLayout()); - robocodeContentPane.add(getToolBar(), "South"); - robocodeContentPane.add(getMainPanel(), "Center"); - } - return robocodeContentPane; - } - - /** - * Return the sidePanel. - * - * @return JPanel - */ - private JPanel getSidePanel() { - if (sidePanel == null) { - sidePanel = new JPanel(); - sidePanel.setLayout(new BorderLayout()); - sidePanel.add(getRobotButtonsScrollPane(), BorderLayout.CENTER); - final BattleButton btn = net.sf.robocode.core.Container.getComponent(BattleButton.class); - - btn.attach(); - sidePanel.add(btn, BorderLayout.SOUTH); - } - return sidePanel; - } - - /** - * Return the robotButtons panel. - * - * @return JPanel - */ - private JPanel getRobotButtonsPanel() { - if (robotButtonsPanel == null) { - robotButtonsPanel = new JPanel(); - robotButtonsPanel.setLayout(new BoxLayout(robotButtonsPanel, BoxLayout.Y_AXIS)); - robotButtonsPanel.addContainerListener(eventHandler); - } - return robotButtonsPanel; - } - - /** - * Return the robotButtonsScrollPane - * - * @return JScrollPane - */ - private JScrollPane getRobotButtonsScrollPane() { - if (robotButtonsScrollPane == null) { - robotButtonsScrollPane = new JScrollPane(); - robotButtonsScrollPane.setAutoscrolls(false); - robotButtonsScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); - robotButtonsScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - robotButtonsScrollPane.setAlignmentY(Component.TOP_ALIGNMENT); - robotButtonsScrollPane.setMaximumSize(new Dimension(113, 32767)); - robotButtonsScrollPane.setPreferredSize(new Dimension(113, 28)); - robotButtonsScrollPane.setAlignmentX(Component.CENTER_ALIGNMENT); - robotButtonsScrollPane.setMinimumSize(new Dimension(113, 53)); - robotButtonsScrollPane.setViewportView(getRobotButtonsPanel()); - } - return robotButtonsScrollPane; - } - - /** - * Return the statusLabel - * - * @return JLabel - */ - public JLabel getStatusLabel() { - if (statusLabel == null) { - statusLabel = new JLabel(); - statusLabel.setText(""); - } - return statusLabel; - } - - /** - * Return the pauseButton - * - * @return JToggleButton - */ - private JToggleButton getPauseButton() { - if (pauseButton == null) { - pauseButton = new JToggleButton("Pause/Debug"); - pauseButton.setMnemonic('P'); - pauseButton.setHorizontalTextPosition(SwingConstants.CENTER); - pauseButton.setVerticalTextPosition(SwingConstants.BOTTOM); - pauseButton.addActionListener(eventHandler); - } - return pauseButton; - } - - /** - * Return the nextTurnButton - * - * @return JButton - */ - private Component getNextTurnButton() { - if (nextTurnButton == null) { - nextTurnButton = new JButton("Next Turn"); - nextTurnButton.setMnemonic('N'); - nextTurnButton.setHorizontalTextPosition(SwingConstants.CENTER); - nextTurnButton.setVerticalTextPosition(SwingConstants.BOTTOM); - nextTurnButton.addActionListener(eventHandler); - - nextTurnButton.setEnabled(false); - } - return nextTurnButton; - } - - /** - * Return the stopButton - * - * @return JButton - */ - private JButton getStopButton() { - if (stopButton == null) { - stopButton = new JButton("Stop"); - stopButton.setMnemonic('S'); - stopButton.setHorizontalTextPosition(SwingConstants.CENTER); - stopButton.setVerticalTextPosition(SwingConstants.BOTTOM); - stopButton.addActionListener(eventHandler); - - stopButton.setEnabled(false); - } - return stopButton; - } - - /** - * Return the restartButton - * - * @return JButton - */ - private JButton getRestartButton() { - if (restartButton == null) { - restartButton = new JButton("Restart"); - restartButton.setMnemonic('t'); - restartButton.setDisplayedMnemonicIndex(3); - restartButton.setHorizontalTextPosition(SwingConstants.CENTER); - restartButton.setVerticalTextPosition(SwingConstants.BOTTOM); - restartButton.addActionListener(eventHandler); - - restartButton.setEnabled(false); - } - return restartButton; - } - - /** - * Return the replayButton - * - * @return JButton - */ - public JButton getReplayButton() { - if (replayButton == null) { - replayButton = new JButton("Replay"); - replayButton.setMnemonic('y'); - replayButton.setDisplayedMnemonicIndex(5); - replayButton.setHorizontalTextPosition(SwingConstants.CENTER); - replayButton.setVerticalTextPosition(SwingConstants.BOTTOM); - replayButton.addActionListener(eventHandler); - - ISettingsManager props = properties; - - replayButton.setVisible(props.getOptionsCommonEnableReplayRecording()); - - props.addPropertyListener(new ISettingsListener() { - public void settingChanged(String property) { - if (property.equals(ISettingsManager.OPTIONS_COMMON_ENABLE_REPLAY_RECORDING)) { - replayButton.setVisible(properties.getOptionsCommonEnableReplayRecording()); - } - } - }); - - replayButton.setEnabled(false); - } - return replayButton; - } - - /** - * Return the tpsSlider - * - * @return JSlider - */ - private JSlider getTpsSlider() { - if (tpsSlider == null) { - final ISettingsManager props = properties; - - int tps = Math.max(props.getOptionsBattleDesiredTPS(), 1); - - tpsSlider = new JSlider(0, MAX_TPS_SLIDER_VALUE, tpsToSliderValue(tps)); - tpsSlider.setPaintLabels(true); - tpsSlider.setPaintTicks(true); - tpsSlider.setMinorTickSpacing(1); - - tpsSlider.addChangeListener(eventHandler); - - Dictionary labels = new Hashtable(); - - labels.put(0, new JLabel("0")); - labels.put(5, new JLabel("5")); - labels.put(10, new JLabel("10")); - labels.put(15, new JLabel("15")); - labels.put(20, new JLabel("20")); - labels.put(25, new JLabel("25")); - labels.put(30, new JLabel("30")); - labels.put(35, new JLabel("40")); - labels.put(40, new JLabel("50")); - labels.put(45, new JLabel("65")); - labels.put(50, new JLabel("90")); - labels.put(55, new JLabel("150")); - labels.put(60, new JLabel("1000")); - - tpsSlider.setMajorTickSpacing(5); - tpsSlider.setLabelTable(labels); - - WindowUtil.setFixedSize(tpsSlider, new Dimension((MAX_TPS_SLIDER_VALUE + 1) * 6, 40)); - - props.addPropertyListener(new ISettingsListener() { - public void settingChanged(String property) { - if (property.equals(ISettingsManager.OPTIONS_BATTLE_DESIREDTPS)) { - setTpsOnSlider(props.getOptionsBattleDesiredTPS()); - } - } - }); - } - return tpsSlider; - } - - /** - * Return the tpsLabel - * - * @return JLabel - */ - private JLabel getTpsLabel() { - if (tpsLabel == null) { - tpsLabel = new JLabel(getTpsFromSliderAsString()); - } - return tpsLabel; - } - - /** - * Return the toolBar. - * - * @return JToolBar - */ - private JToolBar getToolBar() { - if (toolBar == null) { - toolBar = new JToolBar(); - toolBar.add(getPauseButton()); - toolBar.add(getNextTurnButton()); - toolBar.add(getStopButton()); - toolBar.add(getRestartButton()); - toolBar.add(getReplayButton()); - - toolBar.addSeparator(); - - toolBar.add(getTpsSlider()); - toolBar.add(getTpsLabel()); - - toolBar.addSeparator(); - - toolBar.add(getStatusLabel()); - WindowUtil.setDefaultStatusLabel(getStatusLabel()); - } - return toolBar; - } - - /** - * Initialize the class. - */ - private void initialize() { - setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - setTitle("Robocode"); - setIconImage(ImageUtil.getImage("/net/sf/robocode/ui/icons/robocode-icon.png")); - setResizable(true); - setVisible(false); - - setContentPane(getRobocodeContentPane()); - setJMenuBar(menuBar); - - battleObserver = new BattleObserver(); - - addWindowListener(eventHandler); - - battleView.addMouseListener(interactiveHandler); - battleView.addMouseMotionListener(interactiveHandler); - battleView.addMouseWheelListener(interactiveHandler); - battleView.setFocusable(true); - KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(interactiveHandler); - - if (windowManager.isSlave()) { - menuBar.getBattleMenu().setEnabled(false); - menuBar.getRobotMenu().setEnabled(false); - getStopButton().setEnabled(false); - getPauseButton().setEnabled(false); - getNextTurnButton().setEnabled(false); - getRestartButton().setEnabled(false); - getReplayButton().setEnabled(false); - exitOnClose = false; - } - } - - private void pauseResumeButtonActionPerformed() { - battleManager.togglePauseResumeBattle(); - } - - /** - * Gets the iconified. - * - * @return Returns a boolean - */ - public boolean isIconified() { - return iconified; - } - - public void afterIntroBattle() { - getRestartButton().setEnabled(false); - getRobotButtonsPanel().removeAll(); - getRobotButtonsPanel().repaint(); - } - - /** - * Sets the iconified. - * - * @param iconified The iconified to set - */ - private void setIconified(boolean iconified) { - this.iconified = iconified; - } - - private int getTpsFromSlider() { - final int value = getTpsSlider().getValue(); - - if (value <= 30) { - return value; - } - if (value <= 40) { - return 2 * value - 30; - } - if (value <= 45) { - return 3 * value - 70; - } - if (value <= 52) { - return 5 * value - 160; - } - switch (value) { - case 53: - return 110; - - case 54: - return 130; - - case 55: - return 150; - - case 56: - return 200; - - case 57: - return 300; - - case 58: - return 500; - - case 59: - return 750; - - case 60: - return 1000; - } - return MAX_TPS; - } - - private void setTpsOnSlider(int tps) { - tpsSlider.setValue(tpsToSliderValue(tps)); - } - - private int tpsToSliderValue(int tps) { - if (tps <= 30) { - return tps; - } - if (tps <= 50) { - return (tps + 30) / 2; - } - if (tps <= 65) { - return (tps + 70) / 3; - } - if (tps <= 100) { - return (tps + 160) / 5; - } - if (tps <= 110) { - return 53; - } - if (tps <= 130) { - return 54; - } - if (tps <= 150) { - return 55; - } - if (tps <= 200) { - return 56; - } - if (tps <= 300) { - return 57; - } - if (tps <= 500) { - return 58; - } - if (tps <= 750) { - return 59; - } - if (tps <= 1000) { - return 60; - } - return MAX_TPS_SLIDER_VALUE; - } - - private String getTpsFromSliderAsString() { - int tps = getTpsFromSlider(); - - return " " + ((tps == MAX_TPS) ? "max" : "" + tps) + " "; - } - - private class EventHandler implements ComponentListener, ActionListener, ContainerListener, WindowListener, - ChangeListener { - - public void actionPerformed(ActionEvent e) { - final Object source = e.getSource(); - - if (source == getPauseButton()) { - pauseResumeButtonActionPerformed(); - } else if (source == getStopButton()) { - battleManager.stop(false); - } else if (source == getRestartButton()) { - battleManager.restart(); - } else if (source == getNextTurnButton()) { - battleManager.nextTurn(); - } else if (source == getReplayButton()) { - battleManager.replay(); - } - } - - public void componentResized(ComponentEvent e) { - if (e.getSource() == getBattleViewPanel()) { - battleViewPanelResized(); - } - } - - public void componentShown(ComponentEvent e) {} - - public void componentHidden(ComponentEvent e) {} - - public void componentRemoved(ContainerEvent e) {} - - public void componentAdded(ContainerEvent e) {} - - public void componentMoved(ComponentEvent e) {} - - public void windowActivated(WindowEvent e) {} - - public void windowClosed(WindowEvent e) { - if (exitOnClose) { - System.exit(0); - } - } - - public void windowClosing(WindowEvent e) { - exitOnClose = true; - if (windowManager.isSlave()) { - WindowUtil.message("If you wish to exit Robocode, please exit the program controlling it."); - exitOnClose = false; - return; - } - if (windowManager.closeRobocodeEditor()) { - WindowUtil.saveWindowPositions(); - battleObserver = null; - dispose(); - } - properties.saveProperties(); - } - - public void windowDeactivated(WindowEvent e) {} - - public void windowDeiconified(WindowEvent e) { - setIconified(false); - battleManager.setManagedTPS(true); - } - - public void windowIconified(WindowEvent e) { - setIconified(true); - battleManager.setManagedTPS(properties.getOptionsViewPreventSpeedupWhenMinimized()); - } - - public void windowOpened(WindowEvent e) { - battleManager.setManagedTPS(true); - } - - public void stateChanged(ChangeEvent e) { - if (e.getSource() == getTpsSlider()) { - int tps = getTpsFromSlider(); - - // TODO refactor - if (tps == 0) { - battleManager.pauseIfResumedBattle(); - } else { - // Only set desired TPS if it is not set to zero - properties.setOptionsBattleDesiredTPS(tps); - battleManager.resumeIfPausedBattle(); // TODO causing problems when called from PreferencesViewOptionsTab.storePreferences() - } - - tpsLabel.setText(getTpsFromSliderAsString()); - } - } - } - - - private class BattleObserver extends BattleAdaptor { - private int tps; - private int currentRound; - private int numberOfRounds; - private int currentTurn; - private boolean isBattleRunning; - private boolean isBattlePaused; - private boolean isBattleReplay; - private long lastTitleUpdateTime; - - public BattleObserver() { - windowManager.addBattleListener(this); - } - - protected void finalize() throws Throwable { - try { - windowManager.removeBattleListener(this); - } finally { - super.finalize(); - } - } - - @Override - public void onBattleStarted(BattleStartedEvent event) { - numberOfRounds = event.getBattleRules().getNumRounds(); - isBattleRunning = true; - isBattleReplay = event.isReplay(); - - getStopButton().setEnabled(true); - getRestartButton().setEnabled(battleManager.getBattleProperties().getSelectedRobots() != null); - getReplayButton().setEnabled(event.isReplay()); - menuBar.getBattleSaveRecordAsMenuItem().setEnabled(false); - menuBar.getBattleExportRecordMenuItem().setEnabled(false); - menuBar.getBattleSaveAsMenuItem().setEnabled(true); - menuBar.getBattleSaveMenuItem().setEnabled(true); - - JCheckBoxMenuItem rankingCheckBoxMenuItem = menuBar.getOptionsShowRankingCheckBoxMenuItem(); - - rankingCheckBoxMenuItem.setEnabled(!isBattleReplay); - if (rankingCheckBoxMenuItem.isSelected()) { - windowManager.showRankingDialog(!isBattleReplay); - } - - validate(); - - updateTitle(); - } - - public void onRoundStarted(final RoundStartedEvent event) { - if (event.getRound() == 0) { - getRobotButtonsPanel().removeAll(); - - final List robots = Arrays.asList(event.getStartSnapshot().getRobots()); - - dialogManager.trim(robots); - - int maxEnergy = 0; - - for (IRobotSnapshot robot : robots) { - if (maxEnergy < robot.getEnergy()) { - maxEnergy = (int) robot.getEnergy(); - } - } - if (maxEnergy == 0) { - maxEnergy = 1; - } - for (int index = 0; index < robots.size(); index++) { - final IRobotSnapshot robot = robots.get(index); - final boolean attach = index < RobotDialogManager.MAX_PRE_ATTACHED; - final RobotButton button = net.sf.robocode.core.Container.createComponent(RobotButton.class); - - button.setup(robot.getName(), maxEnergy, index, robot.getContestantIndex(), attach); - button.setText(robot.getShortName()); - addRobotButton(button); - } - getRobotButtonsPanel().repaint(); - } - } - - @Override - public void onBattleFinished(BattleFinishedEvent event) { - isBattleRunning = false; - - for (RobotButton robotButton : robotButtons) { - robotButton.detach(); - } - robotButtons.clear(); - - final boolean canReplayRecord = recordManager.hasRecord(); - final boolean enableSaveRecord = (properties.getOptionsCommonEnableReplayRecording() & canReplayRecord); - - getStopButton().setEnabled(false); - getReplayButton().setEnabled(canReplayRecord); - getNextTurnButton().setEnabled(false); - - menuBar.getBattleSaveRecordAsMenuItem().setEnabled(enableSaveRecord); - menuBar.getBattleExportRecordMenuItem().setEnabled(enableSaveRecord); - menuBar.getOptionsShowRankingCheckBoxMenuItem().setEnabled(false); - - updateTitle(); - } - - @Override - public void onBattlePaused(BattlePausedEvent event) { - isBattlePaused = true; - - getPauseButton().setSelected(true); - getNextTurnButton().setEnabled(true); - - updateTitle(); - } - - @Override - public void onBattleResumed(BattleResumedEvent event) { - isBattlePaused = false; - - getPauseButton().setSelected(false); - getNextTurnButton().setEnabled(false); - - // TODO: Refactor? - if (getTpsFromSlider() == 0) { - setTpsOnSlider(1); - } - - updateTitle(); - } - - public void onTurnEnded(TurnEndedEvent event) { - if (event == null) { - return; - } - final ITurnSnapshot turn = event.getTurnSnapshot(); - - if (turn == null) { - return; - } - - tps = event.getTurnSnapshot().getTPS(); - currentRound = event.getTurnSnapshot().getRound(); - currentTurn = event.getTurnSnapshot().getTurn(); - - // Only update every half second to spare CPU cycles - if ((System.currentTimeMillis() - lastTitleUpdateTime) >= UPDATE_TITLE_INTERVAL) { - updateTitle(); - } - } - - private void updateTitle() { - StringBuffer title = new StringBuffer("Robocode"); - - if (isBattleRunning) { - title.append(": "); - - if (currentTurn == 0) { - title.append("Starting round"); - } else { - if (isBattleReplay) { - title.append("Replaying: "); - } - title.append("Turn "); - title.append(currentTurn); - - title.append(", Round "); - title.append(currentRound + 1).append(" of ").append(numberOfRounds); - - if (!isBattlePaused) { - boolean dispTps = properties.getOptionsViewTPS(); - boolean dispFps = properties.getOptionsViewFPS(); - - if (dispTps | dispFps) { - title.append(", "); - - if (dispTps) { - title.append(tps).append(" TPS"); - } - if (dispTps & dispFps) { - title.append(", "); - } - if (dispFps) { - title.append(windowManager.getFPS()).append(" FPS"); - } - } - } - } - } - if (isBattlePaused) { - title.append(" (paused)"); - } - - MemoryUsage memUsage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); - - long usedMem = memUsage.getUsed() / (1024 * 1024); - - title.append(", Used mem: ").append(usedMem); - - long maxMem = memUsage.getMax(); - - if (maxMem >= 0) { - maxMem /= (1024 * 1024); - title.append(" of ").append(maxMem); - } - title.append(" MB"); - - setTitle(title.toString()); - - lastTitleUpdateTime = System.currentTimeMillis(); - } - - @Override - public void onBattleCompleted(BattleCompletedEvent event) { - if (windowManager.isShowResultsEnabled()) { - // show on ATW thread - ResultsTask resultTask = new ResultsTask(event); - - EventQueue.invokeLater(resultTask); - } - } - - private class ResultsTask implements Runnable { - final BattleCompletedEvent event; - - ResultsTask(BattleCompletedEvent event) { - this.event = event; - } - - public void run() { - windowManager.showResultsDialog(event); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotButton.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotButton.java deleted file mode 100644 index 16e5e38..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotButton.java +++ /dev/null @@ -1,228 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.ui.IRobotDialogManager; -import net.sf.robocode.ui.IWindowManager; -import net.sf.robocode.ui.IWindowManagerExt; -import robocode.BattleResults; -import robocode.control.events.BattleAdaptor; -import robocode.control.events.BattleCompletedEvent; -import robocode.control.events.BattleFinishedEvent; -import robocode.control.events.TurnEndedEvent; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.IScoreSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class RobotButton extends JButton implements ActionListener { - - private static final int BAR_MARGIN = 2; - private static final int BAR_HEIGHT = 3; - - private final IWindowManagerExt windowManager; - private final IBattleManager battleManager; - private final BattleObserver battleObserver = new BattleObserver(); - private final IRobotDialogManager dialogManager; - private RobotDialog robotDialog; - private String name; - private int robotIndex; - private int contestantIndex; - private int maxEnergy = 1; - private int maxScore = 1; - private int lastEnergy; - private int lastScore; - private boolean isListening; - - public RobotButton(IWindowManager windowManager, IBattleManager battleManager, IRobotDialogManager dialogManager) { - this.windowManager = (IWindowManagerExt) windowManager; - this.battleManager = battleManager; - this.dialogManager = dialogManager; - } - - public void setup(String name, int maxEnergy, int robotIndex, int contestantIndex, boolean attach) { - this.name = name; - this.robotIndex = robotIndex; - this.contestantIndex = contestantIndex; - this.lastEnergy = maxEnergy; - this.maxEnergy = maxEnergy; - initialize(); - if (attach) { - attach(); - robotDialog.reset(); - battleManager.setPaintEnabled(robotIndex, robotDialog.isPaintEnabled()); - battleManager.setSGPaintEnabled(robotIndex, robotDialog.isSGPaintEnabled()); - } - } - - public void actionPerformed(ActionEvent e) { - if (robotDialog == null) { - attach(); - if (!robotDialog.isVisible() || robotDialog.getState() != Frame.NORMAL) { - WindowUtil.packPlaceShow(robotDialog); - } - } else { - robotDialog.setVisible(true); - } - } - - @Override - public void paint(Graphics g) { - super.paint(g); - - Graphics2D g2 = (Graphics2D) g; - - final int barMaxWidth = getWidth() - (2 * BAR_MARGIN); - - g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.75f)); - - if (lastEnergy > 0) { - Color color; - - if (lastEnergy > 50) { - color = Color.GREEN; - } else if (lastEnergy > 25) { - color = Color.YELLOW; - } else { - color = Color.RED; - } - g.setColor(color); - - final int widthLife = Math.max(Math.min(barMaxWidth * lastEnergy / maxEnergy, barMaxWidth), 0); - - g.fillRect(BAR_MARGIN, getHeight() - (2 * BAR_HEIGHT + BAR_MARGIN), widthLife, BAR_HEIGHT); - } - if (lastScore > 0) { - g.setColor(Color.BLUE); - - final int widthScore = Math.max(Math.min(barMaxWidth * lastScore / maxScore, barMaxWidth), 0); - - g.fillRect(BAR_MARGIN, getHeight() - (BAR_HEIGHT + BAR_MARGIN), widthScore, BAR_HEIGHT); - } - } - - /** - * Initialize the class. - */ - private void initialize() { - addActionListener(this); - setPreferredSize(new Dimension(110, 25)); - setMinimumSize(new Dimension(110, 25)); - setMaximumSize(new Dimension(110, 25)); - setHorizontalAlignment(SwingConstants.LEFT); - setMargin(new Insets(0, 0, 0, 0)); - setToolTipText(name); - } - - public void attach() { - if (!isListening) { - isListening = true; - windowManager.addBattleListener(battleObserver); - } - if (robotDialog == null) { - robotDialog = dialogManager.getRobotDialog(this, name, true); - } - robotDialog.attach(this); - } - - public void detach() { - if (isListening) { - windowManager.removeBattleListener(battleObserver); - isListening = false; - } - if (robotDialog != null) { - final RobotDialog dialog = robotDialog; - - robotDialog = null; - dialog.detach(); - } - } - - public int getRobotIndex() { - return robotIndex; - } - - public String getRobotName() { - return name; - } - - private class BattleObserver extends BattleAdaptor { - - @Override - public void onTurnEnded(TurnEndedEvent event) { - final ITurnSnapshot turn = event.getTurnSnapshot(); - - if (turn == null) { - return; - } - final IRobotSnapshot[] robots = turn.getRobots(); - final IScoreSnapshot[] scoreSnapshotList = event.getTurnSnapshot().getIndexedTeamScores(); - - maxEnergy = 0; - for (IRobotSnapshot robot : robots) { - if (maxEnergy < robot.getEnergy()) { - maxEnergy = (int) robot.getEnergy(); - } - } - if (maxEnergy == 0) { - maxEnergy = 1; - } - - maxScore = 0; - for (IScoreSnapshot team : scoreSnapshotList) { - if (maxScore < team.getCurrentScore()) { - maxScore = (int) team.getCurrentScore(); - } - } - if (maxScore == 0) { - maxScore = 1; - } - - final int newScore = (int) scoreSnapshotList[contestantIndex].getCurrentScore(); - final int newEnergy = (int) robots[robotIndex].getEnergy(); - boolean rep = (lastEnergy != newEnergy || lastScore != newScore); - - lastEnergy = newEnergy; - lastScore = newScore; - if (rep) { - repaint(); - } - } - - public void onBattleCompleted(final BattleCompletedEvent event) { - maxScore = 0; - for (BattleResults team : event.getIndexedResults()) { - if (maxScore < team.getScore()) { - maxScore = team.getScore(); - } - } - if (maxScore == 0) { - maxScore = 1; - } - lastScore = event.getIndexedResults()[contestantIndex].getScore(); - repaint(); - } - - public void onBattleFinished(final BattleFinishedEvent event) { - lastEnergy = 0; - repaint(); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDescriptionPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDescriptionPanel.java deleted file mode 100644 index 02cddb9..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDescriptionPanel.java +++ /dev/null @@ -1,230 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.ui.BrowserManager; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.net.URLDecoder; -import java.util.StringTokenizer; - - -/** - * @author Mathew A. Nelson (original) - * @author Matthew Reeder (contributor) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class RobotDescriptionPanel extends JPanel { - private JLabel robotNameLabel; - private final JLabel[] descriptionLabel = new JLabel[3]; - private JPanel descriptionPanel; - private JButton webpageButton; - private JLabel robocodeVersionLabel; - private JLabel filePathLabel; - private IRobotSpecItem currentRobotSpecification; - - private final static String BLANK_STRING = " "; - - private final EventHandler eventHandler = new EventHandler(); - - private class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (e.getSource() == getWebpageButton()) { - if (currentRobotSpecification != null) { - URL htmlFile = currentRobotSpecification.getWebpage(); - - if (htmlFile != null && htmlFile.toString().length() > 0) { - try { - BrowserManager.openURL(htmlFile.toString()); - } catch (IOException ignored) {} - } - } - } - } - } - - public RobotDescriptionPanel() { - super(); - initialize(); - } - - private JLabel getFilePathLabel() { - if (filePathLabel == null) { - filePathLabel = new JLabel(); - filePathLabel.setText(" "); - } - return filePathLabel; - } - - private JLabel getDescriptionLabel(int index) { - if (descriptionLabel[index] == null) { - descriptionLabel[index] = new JLabel(); - descriptionLabel[index].setFont(new Font("Monospaced", Font.PLAIN, 12)); - descriptionLabel[index].setHorizontalAlignment(SwingConstants.LEFT); - descriptionLabel[index].setText(BLANK_STRING); - } - return descriptionLabel[index]; - } - - private JPanel getDescriptionPanel() { - if (descriptionPanel == null) { - descriptionPanel = new JPanel(); - descriptionPanel.setAlignmentY(Component.CENTER_ALIGNMENT); - descriptionPanel.setLayout(new BoxLayout(descriptionPanel, BoxLayout.Y_AXIS)); - descriptionPanel.setBorder(BorderFactory.createEtchedBorder()); - for (int i = 0; i < 3; i++) { - descriptionPanel.add(getDescriptionLabel(i)); - } - } - return descriptionPanel; - } - - private JButton getWebpageButton() { - if (webpageButton == null) { - webpageButton = new JButton("Webpage"); - webpageButton.setMnemonic('W'); - webpageButton.setVisible(false); - webpageButton.setAlignmentY(Component.CENTER_ALIGNMENT); - webpageButton.addActionListener(eventHandler); - } - return webpageButton; - } - - private JLabel getRobocodeVersionLabel() { - if (robocodeVersionLabel == null) { - robocodeVersionLabel = new JLabel(); - } - return robocodeVersionLabel; - } - - private JLabel getRobotNameLabel() { - if (robotNameLabel == null) { - robotNameLabel = new JLabel(); - robotNameLabel.setHorizontalAlignment(SwingConstants.CENTER); - robotNameLabel.setText(" "); - } - return robotNameLabel; - } - - private void initialize() { - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - JPanel p = new JPanel(); - - p.setLayout(new BorderLayout()); - p.add(getRobotNameLabel(), BorderLayout.CENTER); - - JPanel q = new JPanel(); - - q.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); - q.add(getRobocodeVersionLabel()); - p.add(q, BorderLayout.EAST); - - q = new JPanel(); - q.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); - p.add(q, BorderLayout.WEST); - add(p); - - p = new JPanel(); - p.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); - p.add(getDescriptionPanel()); - add(p); - - p = new JPanel(); - p.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); - p.add(getWebpageButton()); - add(p); - - p = new JPanel(); - p.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); - p.add(getFilePathLabel()); - add(p); - } - - public void showDescription(IRobotSpecItem robotSpecification) { - this.currentRobotSpecification = robotSpecification; - if (robotSpecification == null) { - getRobotNameLabel().setText(" "); - for (int i = 0; i < 3; i++) { - getDescriptionLabel(i).setText(BLANK_STRING); - } - getWebpageButton().setVisible(false); - getRobocodeVersionLabel().setText(" "); - getFilePathLabel().setText(" "); - } else { - String name = robotSpecification.getUniqueFullClassNameWithVersion(); - - if (name.charAt(name.length() - 1) == '*') { - name = name.substring(0, name.length() - 1) + " (development version)"; - } - - String s = robotSpecification.getAuthorName(); - - if (s != null && s.length() > 0) { - name += " by " + s; - } - getRobotNameLabel().setText(name); - final URL url = robotSpecification.getItemURL(); - - if (url != null) { - String path = url.toString(); - - try { - path = URLDecoder.decode(url.toString(), "UTF-8"); - } catch (UnsupportedEncodingException ignore) {} - - getFilePathLabel().setText(path); - } else { - getFilePathLabel().setText(""); - } - - String desc = robotSpecification.getDescription(); - int count = 0; - - if (desc != null) { - StringTokenizer tok = new StringTokenizer(desc, "\n"); - - while (tok.hasMoreTokens() && count < 3) { - StringBuffer line = new StringBuffer(tok.nextToken()); - - if (line != null) { - if (line.length() > BLANK_STRING.length()) { - line.delete(BLANK_STRING.length(), line.length()); - } - for (int i = line.length(); i < BLANK_STRING.length(); i++) { - line.append(' '); - } - getDescriptionLabel(count).setText(line.toString()); - } - count++; - } - } - for (int i = count; i < 3; i++) { - getDescriptionLabel(i).setText(BLANK_STRING); - } - - URL u = robotSpecification.getWebpage(); - - getWebpageButton().setVisible(u != null && u.toString().length() > 0); - - String v = robotSpecification.getRobocodeVersion(); - - getRobocodeVersionLabel().setText(v == null ? "" : "Built for " + v); - } - getDescriptionPanel().setMaximumSize(getDescriptionPanel().getPreferredSize()); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDialog.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDialog.java deleted file mode 100644 index 25fe87f..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotDialog.java +++ /dev/null @@ -1,450 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.battle.IBattleManager; -import net.sf.robocode.ui.IWindowManager; -import robocode.control.events.*; -import robocode.control.snapshot.IDebugProperty; -import robocode.control.snapshot.IRobotSnapshot; -import robocode.control.snapshot.ITurnSnapshot; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Map; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class RobotDialog extends JFrame { - private final Color grayGreen = new Color(0x0080C080); - private RobotButton robotButton; - private JTabbedPane tabbedPane; - private ConsoleScrollPane consoleScrollPane; - private ConsoleScrollPane propertiesScrollPane; - private JPanel robotDialogContentPane; - private JPanel buttonPanel; - private JButton okButton; - private JButton clearButton; - private JButton killButton; - private JToggleButton paintButton; - private JCheckBox sgCheckBox; - private JToggleButton pauseButton; - private boolean isListening; - private int robotIndex; - private IRobotSnapshot lastSnapshot; - private boolean printSnapshot; - private boolean grayGreenButton; - private final Map debugProperties = new HashMap(); - - private final BattleObserver battleObserver = new BattleObserver(); - private final IWindowManager windowManager; - private final IBattleManager battleManager; - - public RobotDialog(IWindowManager windowManager, IBattleManager battleManager) { - super(); - this.battleManager = battleManager; - this.windowManager = windowManager; - } - - public void setup(RobotButton robotButton) { - this.robotButton = robotButton; - initialize(); - } - - private void initialize() { - robotIndex = robotButton.getRobotIndex(); - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setContentPane(getRobotDialogContentPane()); - if (windowManager.isSlave()) { - getKillButton().setEnabled(false); - } - this.setTitle(robotButton.getRobotName()); - pack(); - } - - @Override - protected void finalize() throws Throwable { - try { - detach(); - } finally { - super.finalize(); - } - } - - public void detach() { - if (isListening) { - windowManager.removeBattleListener(battleObserver); - isListening = false; - } - robotButton.detach(); - - getPauseButton().setEnabled(false); - getKillButton().setEnabled(false); - - lastSnapshot = null; - printSnapshot(); - } - - public void attach(RobotButton robotButton) { - this.robotButton = robotButton; - robotIndex = this.robotButton.getRobotIndex(); - if (!isListening) { - isListening = true; - windowManager.addBattleListener(battleObserver); - } - getPauseButton().setEnabled(true); - if (!windowManager.isSlave()) { - getKillButton().setEnabled(true); - } - } - - public void reset() { - getConsoleScrollPane().setText(null); - lastSnapshot = null; - debugProperties.clear(); - } - - /** - * When robotDialog is packed, we want to set a reasonable size. However, - * after that, we need a null preferred size so the scrollpane will scroll. - * (preferred size should be based on the text inside) - */ - @Override - public void pack() { - getConsoleScrollPane().setPreferredSize(new Dimension(426, 200)); - super.pack(); - getTabbedPane().setPreferredSize(null); - } - - /** - * Returns true if Paint is enabled; false otherwise - * - * @return true if Paint is enabled; false otherwise - */ - public boolean isPaintEnabled() { - return getPaintButton().isSelected(); - } - - /** - * Returns true if the Robocode SG paint is enabled; false otherwise - * - * @return true if the Robocode SG paint enabled; false otherwise - */ - public boolean isSGPaintEnabled() { - return getSGCheckBox().isSelected(); - } - - private final transient ActionListener eventHandler = new ActionListener() { - public void actionPerformed(ActionEvent e) { - Object src = e.getSource(); - - if (src == RobotDialog.this.getOkButton()) { - okButtonActionPerformed(); - } else if (src == RobotDialog.this.getClearButton()) { - clearButtonActionPerformed(); - } else if (src == RobotDialog.this.getKillButton()) { - killButtonActionPerformed(); - } else if (src == RobotDialog.this.getPaintButton()) { - paintButtonActionPerformed(); - } else if (src == RobotDialog.this.getSGCheckBox()) { - sgCheckBoxActionPerformed(); - } else if (src == RobotDialog.this.getPauseButton()) { - pauseResumeButtonActionPerformed(); - } - } - }; - - /** - * Returns the dialog's content pane - * - * @return the dialog's content pane - */ - private JPanel getRobotDialogContentPane() { - if (robotDialogContentPane == null) { - robotDialogContentPane = new JPanel(); - robotDialogContentPane.setLayout(new BorderLayout()); - robotDialogContentPane.add(getTabbedPane()); - robotDialogContentPane.add(getButtonPanel(), BorderLayout.SOUTH); - } - return robotDialogContentPane; - } - - private JTabbedPane getTabbedPane() { - if (tabbedPane == null) { - tabbedPane = new JTabbedPane(); - tabbedPane.setLayout(new BorderLayout()); - tabbedPane.addTab("Console", getConsoleScrollPane()); - tabbedPane.addTab("Properties", getPropertiesScrollPane()); - tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); - - tabbedPane.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - printSnapshot = (tabbedPane.getSelectedIndex() == 1); - printSnapshot(); - } - }); - } - return tabbedPane; - } - - private void printSnapshot() { - if (printSnapshot) { - String text = null; - - if (lastSnapshot != null) { - StringBuilder sb = new StringBuilder(); - - sb.append("energy: ").append(lastSnapshot.getEnergy()).append('\n'); - sb.append("x: ").append(lastSnapshot.getX()).append('\n'); - sb.append("y: ").append(lastSnapshot.getY()).append('\n'); - sb.append("velocity: ").append(lastSnapshot.getVelocity()).append('\n'); - sb.append("heat: ").append(lastSnapshot.getGunHeat()).append('\n'); - sb.append("bodyHeading: rad: ").append(lastSnapshot.getBodyHeading()).append(" deg: ").append(Math.toDegrees(lastSnapshot.getBodyHeading())).append( - '\n'); - sb.append("gunHeading: rad: ").append(lastSnapshot.getGunHeading()).append(" deg: ").append(Math.toDegrees(lastSnapshot.getGunHeading())).append( - '\n'); - sb.append("radarHeading: rad: ").append(lastSnapshot.getRadarHeading()).append(" deg: ").append(Math.toDegrees(lastSnapshot.getRadarHeading())).append( - '\n'); - sb.append("state: ").append(lastSnapshot.getState()).append('\n'); - sb.append('\n'); - IDebugProperty[] debugPropeties = lastSnapshot.getDebugProperties(); - - if (debugPropeties != null) { - for (IDebugProperty prop : debugPropeties) { - if (prop.getValue() == null || prop.getValue().length() == 0) { - debugProperties.remove(prop.getKey()); - } else { - debugProperties.put(prop.getKey(), prop.getValue()); - } - } - } - for (Map.Entry prop : debugProperties.entrySet()) { - sb.append(prop.getKey()).append(": ").append(prop.getValue()).append('\n'); - } - - text = sb.toString(); - } - getPropertiesScrollPane().setText(text); - } - } - - private ConsoleScrollPane getPropertiesScrollPane() { - if (propertiesScrollPane == null) { - propertiesScrollPane = new ConsoleScrollPane(); - } - return propertiesScrollPane; - } - - /** - * Returns the console scroll pane - * - * @return the console scroll pane - */ - private ConsoleScrollPane getConsoleScrollPane() { - if (consoleScrollPane == null) { - consoleScrollPane = new ConsoleScrollPane(); - } - return consoleScrollPane; - } - - /** - * Returns the button panel - * - * @return the button panel - */ - private JPanel getButtonPanel() { - if (buttonPanel == null) { - buttonPanel = new JPanel(); - buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); - buttonPanel.add(getOkButton()); - buttonPanel.add(getClearButton()); - buttonPanel.add(getKillButton()); - buttonPanel.add(getPaintButton()); - buttonPanel.add(getSGCheckBox()); - buttonPanel.add(getPauseButton()); - } - return buttonPanel; - } - - /** - * Returns the OK button - * - * @return the OK button - */ - private JButton getOkButton() { - if (okButton == null) { - okButton = getNewButton("OK"); - } - return okButton; - } - - /** - * Returns the Clear button - * - * @return the Clear button - */ - private JButton getClearButton() { - if (clearButton == null) { - clearButton = getNewButton("Clear"); - } - return clearButton; - } - - /** - * Returns the Kill button. - * - * @return the Kill button - */ - private JButton getKillButton() { - if (killButton == null) { - killButton = getNewButton("Kill Robot"); - } - return killButton; - } - - /** - * Returns the Paint button. - * - * @return the Paint button - */ - private JToggleButton getPaintButton() { - if (paintButton == null) { - paintButton = new JToggleButton("Paint"); - paintButton.addActionListener(eventHandler); - } - return paintButton; - } - - /** - * Returns the SG checkbox. - * - * @return the SG checkbox - */ - private JCheckBox getSGCheckBox() { - if (sgCheckBox == null) { - sgCheckBox = new JCheckBox("Robocode SG"); - sgCheckBox.addActionListener(eventHandler); - } - return sgCheckBox; - } - - /** - * Returns the Pause button. - * - * @return the Pause button - */ - private JToggleButton getPauseButton() { - if (pauseButton == null) { - pauseButton = new JToggleButton("Pause/Debug"); - pauseButton.addActionListener(eventHandler); - } - return pauseButton; - } - - /** - * Returns a new button with event handler and with the specified text - * - * @param text The text of the button - * @return a new button with event handler and with the specified text - */ - private JButton getNewButton(String text) { - JButton button = new JButton(text); - - button.addActionListener(eventHandler); - return button; - } - - /** - * Is called when the OK button has been activated - */ - private void okButtonActionPerformed() { - dispose(); - } - - /** - * Is called when the Clear button has been activated - */ - private void clearButtonActionPerformed() { - reset(); - } - - /** - * Is called when the Kill button has been activated - */ - private void killButtonActionPerformed() { - battleManager.killRobot(robotIndex); - } - - /** - * Is called when the Paint button has been activated - */ - private void paintButtonActionPerformed() { - battleManager.setPaintEnabled(robotIndex, getPaintButton().isSelected()); - } - - /** - * Is called when the SG check box has been activated - */ - private void sgCheckBoxActionPerformed() { - battleManager.setSGPaintEnabled(robotIndex, getSGCheckBox().isSelected()); - } - - /** - * Is called when the Pause/Resume button has been activated - */ - private void pauseResumeButtonActionPerformed() { - battleManager.togglePauseResumeBattle(); - } - - private class BattleObserver extends BattleAdaptor { - - @Override - public void onBattlePaused(BattlePausedEvent event) { - getPauseButton().setSelected(true); - } - - @Override - public void onBattleResumed(BattleResumedEvent event) { - getPauseButton().setSelected(false); - } - - @Override - public void onTurnEnded(TurnEndedEvent event) { - final ITurnSnapshot turn = event.getTurnSnapshot(); - - if (turn == null) { - return; - } - - lastSnapshot = turn.getRobots()[robotIndex]; - final String text = lastSnapshot.getOutputStreamSnapshot(); - - if (text != null && text.length() > 0) { - getConsoleScrollPane().append(text); - getConsoleScrollPane().scrollToBottom(); - } - - if (lastSnapshot.isPaintRobot() && !grayGreenButton) { - grayGreenButton = true; - getPaintButton().setBackground(grayGreen); - } - - printSnapshot(); - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotExtractor.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotExtractor.java deleted file mode 100644 index 6b6bee1..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotExtractor.java +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.ui.IWindowManager; -import static net.sf.robocode.ui.util.ShortcutUtil.MENU_SHORTCUT_KEY_MASK; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Matthew Reeder (contributor) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -@SuppressWarnings("serial") -public class RobotExtractor extends JDialog implements WizardListener { - String unusedrobotPath; - - private static final int MIN_ROBOTS = 1; - private static final int MAX_ROBOTS = 1; // 250; - - private JPanel robotImporterContentPane; - - private WizardCardPanel wizardPanel; - private WizardController buttonsPanel; - private RobotSelectionPanel robotSelectionPanel; - - public byte buf[] = new byte[4096]; - private StringWriter output; - private final IWindowManager windowManager; - private final IRepositoryManager repositoryManager; - - private final EventHandler eventHandler = new EventHandler(); - - class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("Refresh")) { - getRobotSelectionPanel().refreshRobotList(false); - } - } - } - - public RobotExtractor(JFrame owner, IWindowManager windowManager, IRepositoryManager repositoryManager) { - super(owner); - this.repositoryManager = repositoryManager; - this.windowManager = windowManager; - initialize(); - } - - public void update() { - getRobotSelectionPanel().refreshRobotList(false); - } - - public void cancelButtonActionPerformed() { - dispose(); - } - - public void finishButtonActionPerformed() { - int rc = extractRobot(); - ConsoleDialog d; - - d = new ConsoleDialog(windowManager.getRobocodeFrame(), "Extract results", false); - d.setText(output.toString()); - d.pack(); - d.pack(); - WindowUtil.packCenterShow(this, d); - if (rc < 8) { - this.dispose(); - } - } - - private WizardController getButtonsPanel() { - if (buttonsPanel == null) { - buttonsPanel = getWizardPanel().getWizardController(); - } - return buttonsPanel; - } - - private JPanel getRobotImporterContentPane() { - if (robotImporterContentPane == null) { - robotImporterContentPane = new JPanel(); - robotImporterContentPane.setLayout(new BorderLayout()); - robotImporterContentPane.add(getButtonsPanel(), BorderLayout.SOUTH); - robotImporterContentPane.add(getWizardPanel(), BorderLayout.CENTER); - getWizardPanel().getWizardController().setFinishButtonTextAndMnemonic("Extract!", 'E', 0); - robotImporterContentPane.registerKeyboardAction(eventHandler, "Refresh", - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - robotImporterContentPane.registerKeyboardAction(eventHandler, "Refresh", - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), JComponent.WHEN_FOCUSED); - } - return robotImporterContentPane; - } - - public RobotSelectionPanel getRobotSelectionPanel() { - if (robotSelectionPanel == null) { - robotSelectionPanel = net.sf.robocode.core.Container.createComponent(RobotSelectionPanel.class); - robotSelectionPanel.setup(MIN_ROBOTS, MAX_ROBOTS, false, - "Select the robot you would like to extract to the robots directory. Robots not shown do not include source.", - true, true, true, false, true, true, null); - } - return robotSelectionPanel; - } - - private WizardCardPanel getWizardPanel() { - if (wizardPanel == null) { - wizardPanel = new WizardCardPanel(this); - wizardPanel.add(getRobotSelectionPanel(), "Select robot"); - } - return wizardPanel; - } - - private void initialize() { - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setTitle("Robot Extract"); - setContentPane(getRobotImporterContentPane()); - } - - private int extractRobot() { - repositoryManager.refresh(); - int rv = 0; - - output = new StringWriter(); - PrintWriter out = new PrintWriter(output); - - out.println("Robot Extract"); - List selectedRobots = getRobotSelectionPanel().getSelectedRobots(); - IRobotSpecItem spec = selectedRobots.get(0); - - try { - WindowUtil.setStatusWriter(out); - - rv = repositoryManager.extractJar(spec); - WindowUtil.setStatusWriter(null); - WindowUtil.setStatus(""); - if (rv == 0) { - out.println("Robot extracted successfully."); - } else if (rv == -1) { - out.println("Cancelled."); - } - } catch (Exception e) { - out.println(e); - rv = 8; - } - return rv; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotSelectionPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotSelectionPanel.java deleted file mode 100644 index 71cbe8a..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/RobotSelectionPanel.java +++ /dev/null @@ -1,487 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.core.Container; -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.ui.IWindowManager; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import java.awt.*; -import java.awt.event.*; -import java.util.List; -import java.util.ArrayList; - - -/** - * @author Mathew A. Nelson (original) - * @author Matthew Reeder (contributor) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -@SuppressWarnings("serial") -public class RobotSelectionPanel extends WizardPanel { - - private AvailableRobotsPanel availableRobotsPanel; - - private JPanel selectedRobotsPanel; - private JScrollPane selectedRobotsScrollPane; - private JList selectedRobotsList; - - private JPanel buttonsPanel; - private JPanel addButtonsPanel; - private JPanel removeButtonsPanel; - private JButton addButton; - private JButton addAllButton; - private JButton removeButton; - private JButton removeAllButton; - - private final EventHandler eventHandler = new EventHandler(); - private RobotDescriptionPanel descriptionPanel; - private String instructions; - private JLabel instructionsLabel; - private JPanel mainPanel; - private int maxRobots = 1; - private int minRobots = 1; - private boolean onlyShowSource; - private boolean onlyShowWithPackage; - private boolean onlyShowRobots; - private boolean onlyShowDevelopment; - private boolean onlyShowInJar; - private boolean ignoreTeamRobots; - private String preSelectedRobots; - private final List selectedRobots = new ArrayList(); - private final IRepositoryManager repositoryManager; - - public RobotSelectionPanel(IRepositoryManager repositoryManager) { - super(); - this.repositoryManager = repositoryManager; - } - - public void setup(int minRobots, int maxRobots, - boolean showNumRoundsPanel, String instructions, boolean onlyShowSource, boolean onlyShowWithPackage, - boolean onlyShowRobots, boolean onlyShowDevelopment, boolean onlyShowInJar, boolean ignoreTeamRobots, - String preSelectedRobots) { - this.minRobots = minRobots; - this.maxRobots = maxRobots; - this.instructions = instructions; - this.onlyShowSource = onlyShowSource; - this.onlyShowWithPackage = onlyShowWithPackage; - this.onlyShowRobots = onlyShowRobots; - this.onlyShowDevelopment = onlyShowDevelopment; - this.onlyShowInJar = onlyShowInJar; - - this.ignoreTeamRobots = ignoreTeamRobots; - this.preSelectedRobots = preSelectedRobots; - initialize(); - } - - private class EventHandler implements ActionListener, ListSelectionListener { - public void actionPerformed(ActionEvent e) { - if (e.getSource() == getAddAllButton()) { - addAllButtonActionPerformed(); - } else if (e.getSource() == getAddButton()) { - addButtonActionPerformed(); - } else if (e.getSource() == getRemoveAllButton()) { - removeAllButtonActionPerformed(); - } else if (e.getSource() == getRemoveButton()) { - removeButtonActionPerformed(); - } - } - - public void valueChanged(ListSelectionEvent e) { - if (e.getValueIsAdjusting()) { - return; - } - if (e.getSource() == getSelectedRobotsList()) { - selectedRobotsListSelectionChanged(); - } - } - } - - private void addAllButtonActionPerformed() { - JList selectedList = getSelectedRobotsList(); - SelectedRobotsModel selectedModel = (SelectedRobotsModel) selectedList.getModel(); - - for (AvailableRobotsPanel.ItemWrapper selected : availableRobotsPanel.getAvailableRobots()) { - selectedRobots.add(selected); - } - - selectedList.clearSelection(); - selectedModel.changed(); - fireStateChanged(); - if (selectedModel.getSize() >= minRobots && selectedModel.getSize() <= maxRobots) { - showInstructions(); - } else if (selectedModel.getSize() > maxRobots) { - showWrongNumInstructions(); - } - - availableRobotsPanel.getAvailableRobotsList().requestFocus(); - } - - private void addButtonActionPerformed() { - SelectedRobotsModel selectedModel = (SelectedRobotsModel) getSelectedRobotsList().getModel(); - List moves = availableRobotsPanel.getSelectedRobots(); - - for (AvailableRobotsPanel.ItemWrapper move : moves) { - selectedRobots.add(new AvailableRobotsPanel.ItemWrapper(move.getItem())); - } - - selectedModel.changed(); - fireStateChanged(); - if (selectedModel.getSize() >= minRobots && selectedModel.getSize() <= maxRobots) { - showInstructions(); - } else if (selectedModel.getSize() > maxRobots) { - showWrongNumInstructions(); - } - - availableRobotsPanel.getAvailableRobotsList().requestFocus(); - } - - private JButton getAddAllButton() { - if (addAllButton == null) { - addAllButton = new JButton(); - addAllButton.setText("Add All ->"); - addAllButton.setMnemonic('l'); - addAllButton.setDisplayedMnemonicIndex(5); - addAllButton.addActionListener(eventHandler); - } - return addAllButton; - } - - private JButton getAddButton() { - if (addButton == null) { - addButton = new JButton(); - addButton.setText("Add ->"); - addButton.setMnemonic('A'); - addButton.addActionListener(eventHandler); - } - return addButton; - } - - private JPanel getAddButtonsPanel() { - if (addButtonsPanel == null) { - addButtonsPanel = new JPanel(); - addButtonsPanel.setLayout(new GridLayout(2, 1)); - addButtonsPanel.add(getAddButton()); - addButtonsPanel.add(getAddAllButton()); - } - return addButtonsPanel; - } - - private JPanel getButtonsPanel() { - if (buttonsPanel == null) { - buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new BorderLayout(5, 5)); - buttonsPanel.setBorder(BorderFactory.createEmptyBorder(21, 5, 5, 5)); - buttonsPanel.add(getAddButtonsPanel(), BorderLayout.NORTH); - buttonsPanel.add(getRemoveButtonsPanel(), BorderLayout.SOUTH); - } - return buttonsPanel; - } - - private JButton getRemoveAllButton() { - if (removeAllButton == null) { - removeAllButton = new JButton(); - removeAllButton.setText("<- Remove All"); - removeAllButton.setMnemonic('v'); - removeAllButton.setDisplayedMnemonicIndex(7); - removeAllButton.addActionListener(eventHandler); - } - return removeAllButton; - } - - private JButton getRemoveButton() { - if (removeButton == null) { - removeButton = new JButton(); - removeButton.setText("<- Remove"); - removeButton.setMnemonic('m'); - removeButton.setDisplayedMnemonicIndex(5); - removeButton.addActionListener(eventHandler); - } - return removeButton; - } - - private JPanel getRemoveButtonsPanel() { - if (removeButtonsPanel == null) { - removeButtonsPanel = new JPanel(); - removeButtonsPanel.setLayout(new GridLayout(2, 1)); - removeButtonsPanel.add(getRemoveButton()); - removeButtonsPanel.add(getRemoveAllButton()); - } - return removeButtonsPanel; - } - - public String getSelectedRobotsAsString() { - StringBuffer sb = new StringBuffer(); - - for (int i = 0; i < selectedRobots.size(); i++) { - if (i != 0) { - sb.append(','); - } - sb.append(selectedRobots.get(i).getItem().getUniqueFullClassNameWithVersion()); - } - return sb.toString(); - } - - public List getSelectedRobots() { - List res = new ArrayList(); - - for (AvailableRobotsPanel.ItemWrapper item : selectedRobots) { - res.add(item.getItem()); - } - return res; - } - - private JList getSelectedRobotsList() { - if (selectedRobotsList == null) { - selectedRobotsList = new JList(); - selectedRobotsList.setModel(new SelectedRobotsModel()); - selectedRobotsList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - MouseListener mouseListener = new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - removeButtonActionPerformed(); - } - if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) { - contextMenuActionPerformed(); - } - } - }; - - selectedRobotsList.addMouseListener(mouseListener); - selectedRobotsList.addListSelectionListener(eventHandler); - } - return selectedRobotsList; - } - - private JPanel getSelectedRobotsPanel() { - if (selectedRobotsPanel == null) { - selectedRobotsPanel = new JPanel(); - selectedRobotsPanel.setLayout(new BorderLayout()); - selectedRobotsPanel.setPreferredSize(new Dimension(120, 100)); - selectedRobotsPanel.setBorder( - BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Selected Robots")); - selectedRobotsPanel.add(getSelectedRobotsScrollPane(), BorderLayout.CENTER); - } - return selectedRobotsPanel; - } - - private JScrollPane getSelectedRobotsScrollPane() { - if (selectedRobotsScrollPane == null) { - selectedRobotsScrollPane = new JScrollPane(); - selectedRobotsScrollPane.setViewportView(getSelectedRobotsList()); - } - return selectedRobotsScrollPane; - } - - private void initialize() { - setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - setLayout(new BorderLayout()); - add(getInstructionsLabel(), BorderLayout.NORTH); - add(getMainPanel(), BorderLayout.CENTER); - add(getDescriptionPanel(), BorderLayout.SOUTH); - setVisible(true); - showInstructions(); - refreshRobotList(false); - } - - private void removeAllButtonActionPerformed() { - JList selectedList = getSelectedRobotsList(); - SelectedRobotsModel selectedModel = (SelectedRobotsModel) selectedList.getModel(); - - selectedRobots.clear(); - selectedList.clearSelection(); - selectedModel.changed(); - fireStateChanged(); - showInstructions(); - } - - private void contextMenuActionPerformed() {} - - private void removeButtonActionPerformed() { - JList selectedList = getSelectedRobotsList(); - SelectedRobotsModel selectedModel = (SelectedRobotsModel) selectedList.getModel(); - int sel[] = selectedList.getSelectedIndices(); - - for (int i = 0; i < sel.length; i++) { - selectedRobots.remove(sel[i] - i); - } - selectedList.clearSelection(); - selectedModel.changed(); - fireStateChanged(); - if (selectedModel.getSize() < minRobots || selectedModel.getSize() > maxRobots) { - showWrongNumInstructions(); - } else { - showInstructions(); - } - } - - class SelectedRobotsModel extends AbstractListModel { - public void changed() { - fireContentsChanged(this, 0, getSize()); - } - - public int getSize() { - return selectedRobots.size(); - } - - public Object getElementAt(int which) { - return selectedRobots.get(which); - } - } - - public AvailableRobotsPanel getAvailableRobotsPanel() { - if (availableRobotsPanel == null) { - availableRobotsPanel = new AvailableRobotsPanel(getAddButton(), "Available Robots", getSelectedRobotsList(), - this); - } - return availableRobotsPanel; - } - - private RobotDescriptionPanel getDescriptionPanel() { - if (descriptionPanel == null) { - descriptionPanel = new RobotDescriptionPanel(); - descriptionPanel.setBorder(BorderFactory.createEmptyBorder(1, 10, 1, 10)); - } - return descriptionPanel; - } - - private JLabel getInstructionsLabel() { - if (instructionsLabel == null) { - instructionsLabel = new JLabel(); - if (instructions != null) { - instructionsLabel.setText(instructions); - } - } - return instructionsLabel; - } - - private JPanel getMainPanel() { - if (mainPanel == null) { - mainPanel = new JPanel(); - mainPanel.setPreferredSize(new Dimension(550, 300)); - GridBagLayout layout = new GridBagLayout(); - - mainPanel.setLayout(layout); - - GridBagConstraints constraints = new GridBagConstraints(); - - constraints.fill = GridBagConstraints.BOTH; - constraints.weightx = 2; - constraints.weighty = 1; - constraints.anchor = GridBagConstraints.NORTHWEST; - constraints.gridwidth = 2; - layout.setConstraints(getAvailableRobotsPanel(), constraints); - mainPanel.add(getAvailableRobotsPanel()); - constraints.gridwidth = 1; - constraints.weightx = 0; - constraints.weighty = 0; - constraints.anchor = GridBagConstraints.CENTER; - layout.setConstraints(getButtonsPanel(), constraints); - mainPanel.add(getButtonsPanel()); - constraints.gridwidth = GridBagConstraints.REMAINDER; - constraints.weightx = 1; - constraints.weighty = 1; - constraints.anchor = GridBagConstraints.NORTHWEST; - layout.setConstraints(getSelectedRobotsPanel(), constraints); - mainPanel.add(getSelectedRobotsPanel()); - } - return mainPanel; - } - - public int getSelectedRobotsCount() { - return selectedRobots.size(); - } - - @Override - public boolean isReady() { - return (getSelectedRobotsCount() >= minRobots && getSelectedRobotsCount() <= maxRobots); - } - - public void refreshRobotList(final boolean withClear) { - - final Runnable runnable = new Runnable() { - public void run() { - final IWindowManager windowManager = Container.getComponent(IWindowManager.class); - - try { - windowManager.setBusyPointer(true); - repositoryManager.refresh(withClear); - - List robotList = repositoryManager.getRepositoryItems(onlyShowSource, - onlyShowWithPackage, onlyShowRobots, onlyShowDevelopment, false, ignoreTeamRobots, onlyShowInJar); - - getAvailableRobotsPanel().setRobotList(robotList); - if (preSelectedRobots != null && preSelectedRobots.length() > 0) { - setSelectedRobots(preSelectedRobots); - preSelectedRobots = null; - } - } finally { - windowManager.setBusyPointer(false); - } - } - }; - - SwingUtilities.invokeLater(runnable); - } - - private void selectedRobotsListSelectionChanged() { - int sel[] = getSelectedRobotsList().getSelectedIndices(); - - if (sel.length == 1) { - availableRobotsPanel.clearSelection(); - IRobotSpecItem robotSpecification = ((AvailableRobotsPanel.ItemWrapper) getSelectedRobotsList().getModel().getElementAt(sel[0])).getItem(); - - showDescription(robotSpecification); - } else { - showDescription(null); - } - } - - private void setSelectedRobots(String selectedRobotsString) { - if (selectedRobotsString != null) { - for (IRobotSpecItem item: repositoryManager.getSelectedSpecifications(selectedRobotsString)) { - this.selectedRobots.add(new AvailableRobotsPanel.ItemWrapper(item)); - } - } - ((SelectedRobotsModel) getSelectedRobotsList().getModel()).changed(); - fireStateChanged(); - } - - public void showDescription(IRobotSpecItem robotSpecification) { - getDescriptionPanel().showDescription(robotSpecification); - } - - public void showInstructions() { - if (instructions != null) { - instructionsLabel.setText(instructions); - instructionsLabel.setVisible(true); - } else { - instructionsLabel.setVisible(false); - } - } - - public void showWrongNumInstructions() { - if (minRobots == maxRobots) { - if (minRobots == 1) { - instructionsLabel.setText("Please select exactly 1 robot."); - } else { - instructionsLabel.setText("Please select exactly " + minRobots + " robots."); - } - } else { - instructionsLabel.setText("Please select between " + minRobots + " and " + maxRobots + " robots."); - } - instructionsLabel.setVisible(true); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreator.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreator.java deleted file mode 100644 index b3e10d6..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreator.java +++ /dev/null @@ -1,178 +0,0 @@ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.repository.TeamProperties; -import net.sf.robocode.ui.IWindowManager; -import static net.sf.robocode.ui.util.ShortcutUtil.MENU_SHORTCUT_KEY_MASK; - -import javax.swing.*; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - - - -@SuppressWarnings("serial") -public class TeamCreator extends JDialog implements WizardListener { - - private JPanel teamCreatorContentPane; - - private WizardCardPanel wizardPanel; - private WizardController wizardController; - - private RobotSelectionPanel robotSelectionPanel; - private TeamCreatorOptionsPanel teamCreatorOptionsPanel; - - private final int minRobots = 2; - private final int maxRobots = 10; - - private final EventHandler eventHandler = new EventHandler(); - - class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("Refresh")) { - getRobotSelectionPanel().refreshRobotList(true); - } - } - } - - private final IRepositoryManager repositoryManager; - - public TeamCreator(IWindowManager windowManager, IRepositoryManager repositoryManager) { - super(windowManager.getRobocodeFrame()); - this.repositoryManager = repositoryManager; - initialize(); - } - - protected TeamCreatorOptionsPanel getTeamCreatorOptionsPanel() { - if (teamCreatorOptionsPanel == null) { - teamCreatorOptionsPanel = new TeamCreatorOptionsPanel(this); - } - return teamCreatorOptionsPanel; - } - - private JPanel getTeamCreatorContentPane() { - if (teamCreatorContentPane == null) { - teamCreatorContentPane = new JPanel(); - teamCreatorContentPane.setLayout(new BorderLayout()); - teamCreatorContentPane.add(getWizardController(), BorderLayout.SOUTH); - teamCreatorContentPane.add(getWizardPanel(), BorderLayout.CENTER); - getWizardPanel().getWizardController().setFinishButtonTextAndMnemonic("Create Team!", 'C', 0); - teamCreatorContentPane.registerKeyboardAction(eventHandler, "Refresh", - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - teamCreatorContentPane.registerKeyboardAction(eventHandler, "Refresh", - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), JComponent.WHEN_FOCUSED); - } - return teamCreatorContentPane; - } - - protected RobotSelectionPanel getRobotSelectionPanel() { - if (robotSelectionPanel == null) { - robotSelectionPanel = net.sf.robocode.core.Container.createComponent(RobotSelectionPanel.class); - robotSelectionPanel.setup(minRobots, maxRobots, false, "Select the robots for this team.", false, true, true, - false, false, false, null); - } - return robotSelectionPanel; - } - - private WizardCardPanel getWizardPanel() { - if (wizardPanel == null) { - wizardPanel = new WizardCardPanel(this); - wizardPanel.add(getRobotSelectionPanel(), "Select robots"); - wizardPanel.add(getTeamCreatorOptionsPanel(), "Select options"); - } - return wizardPanel; - } - - public void initialize() { - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setTitle("Create a team"); - setContentPane(getTeamCreatorContentPane()); - } - - private WizardController getWizardController() { - if (wizardController == null) { - wizardController = getWizardPanel().getWizardController(); - } - return wizardController; - } - - public void cancelButtonActionPerformed() { - dispose(); - } - - public void finishButtonActionPerformed() { - try { - int rc = createTeam(); - - if (rc == 0) { - JOptionPane.showMessageDialog(this, "Team created successfully.", "Success", - JOptionPane.INFORMATION_MESSAGE, null); - this.dispose(); - } else { - JOptionPane.showMessageDialog(this, "Team creation cancelled", "Cancelled", - JOptionPane.INFORMATION_MESSAGE, null); - } - } catch (IOException e) { - JOptionPane.showMessageDialog(this, e.toString(), "Team Creation Failed", JOptionPane.ERROR_MESSAGE, null); - } - } - - public int createTeam() throws IOException { - File file = new File(repositoryManager.getRobotsDirectory(), - teamCreatorOptionsPanel.getTeamPackage().replace('.', File.separatorChar) - + teamCreatorOptionsPanel.getTeamNameField().getText() + ".team"); - - if (file.exists()) { - int ok = JOptionPane.showConfirmDialog(this, file + " already exists. Are you sure you want to replace it?", - "Warning", JOptionPane.YES_NO_CANCEL_OPTION); - - if (ok == JOptionPane.NO_OPTION || ok == JOptionPane.CANCEL_OPTION) { - return -1; - } - } - if (!file.getParentFile().exists()) { - if (!file.getParentFile().mkdirs()) { - Logger.logError("Can't create " + file.getParentFile().toString()); - } - } - - URL webPageUrl = null; - String webPageFieldString = teamCreatorOptionsPanel.getWebpageField().getText(); - - if (webPageFieldString != null && webPageFieldString.length() > 0) { - try { - webPageUrl = new URL(webPageFieldString); - } catch (MalformedURLException e) { - try { - webPageUrl = new URL("http://" + webPageFieldString); - teamCreatorOptionsPanel.getWebpageField().setText(webPageUrl.toString()); - } catch (MalformedURLException ignored) {} - } - } - - String members = robotSelectionPanel.getSelectedRobotsAsString(); - String version = teamCreatorOptionsPanel.getVersionField().getText(); - String author = teamCreatorOptionsPanel.getAuthorField().getText(); - String desc = teamCreatorOptionsPanel.getDescriptionArea().getText(); - - TeamProperties props = new TeamProperties(); - props.setMembers(members); - props.setVersion(version); - props.setAuthor(author); - props.setDescription(desc); - props.setWebPage(webPageUrl); - - repositoryManager.createTeam(file, props); - return 0; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreatorOptionsPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreatorOptionsPanel.java deleted file mode 100644 index 7d4dc12..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/TeamCreatorOptionsPanel.java +++ /dev/null @@ -1,314 +0,0 @@ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.ui.packager.RobotPackager; -import net.sf.robocode.ui.util.LimitedClassnameDocument; -import net.sf.robocode.ui.util.LimitedDocument; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import java.awt.*; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.net.URL; -import java.util.List; - - -@SuppressWarnings("serial") -public class TeamCreatorOptionsPanel extends WizardPanel { - private TeamCreator teamCreator; - private RobotPackager teamPackager; - private final EventHandler eventHandler = new EventHandler(); - - private JLabel authorLabel; - private JTextField authorField; - private JLabel descriptionLabel; - private JTextArea descriptionArea; - private JLabel versionLabel; - private JTextField versionField; - private JLabel webpageLabel; - private JTextField webpageField; - private JLabel webpageHelpLabel; - - private JLabel teamNameLabel; - private JLabel teamPackageLabel; - private JTextField teamNameField; - - private String teamPackage; - - private class EventHandler implements ComponentListener, DocumentListener { - public void insertUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void changedUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void removeUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void componentMoved(ComponentEvent e) {} - - public void componentHidden(ComponentEvent e) {} - - public void componentShown(ComponentEvent e) { - List selectedRobots; - - if (teamCreator != null) { - selectedRobots = teamCreator.getRobotSelectionPanel().getSelectedRobots(); - } else { - selectedRobots = teamPackager.getRobotSelectionPanel().getSelectedRobots(); - } - - if (selectedRobots != null) { - IRobotSpecItem robotSpecification = selectedRobots.get(0); - - getTeamNameLabel().setText("Please choose a name for your team: (Must be a valid Java classname)"); - getTeamNameField().setText(robotSpecification.getShortClassName() + "Team"); - getTeamPackageLabel().setText(robotSpecification.getFullPackage() + "."); - teamPackage = robotSpecification.getFullPackage(); - if (teamPackage != null) { - teamPackage += "."; - } - - String d = robotSpecification.getDescription(); - - if (d == null) { - d = ""; - } - getDescriptionArea().setText(d); - String a = robotSpecification.getAuthorName(); - - if (a == null) { - a = ""; - } - getAuthorField().setText(a); - URL u = robotSpecification.getWebpage(); - - if (u == null) { - getWebpageField().setText(""); - } else { - getWebpageField().setText(u.toString()); - } - - getVersionLabel().setVisible(true); - getVersionField().setVisible(true); - getAuthorLabel().setVisible(true); - getAuthorField().setVisible(true); - getWebpageLabel().setVisible(true); - getWebpageField().setVisible(true); - getWebpageHelpLabel().setVisible(true); - getDescriptionLabel().setText( - "Please enter a short description of this team (up to 3 lines of 72 chars each)."); - } - } - - public void componentResized(ComponentEvent e) {} - } - - public JPanel robotListPanel; - - public TeamCreatorOptionsPanel(TeamCreator teamCreator) { - super(); - this.teamCreator = teamCreator; - initialize(); - } - - public TeamCreatorOptionsPanel(RobotPackager teamPackager) { - super(); - this.teamPackager = teamPackager; - initialize(); - } - - private void initialize() { - setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - getTeamNameLabel().setAlignmentX(Component.LEFT_ALIGNMENT); - add(getTeamNameLabel()); - - JPanel teamNamePanel = new JPanel(); - teamNamePanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - teamNamePanel.setAlignmentX(Component.LEFT_ALIGNMENT); - getTeamNameField().setAlignmentX(Component.LEFT_ALIGNMENT); - getTeamNameField().setMaximumSize(getTeamNameField().getPreferredSize()); - // getVersionField().setMaximumSize(getVersionField().getPreferredSize()); - teamNamePanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, getTeamNameField().getPreferredSize().height)); - teamNamePanel.add(getTeamPackageLabel()); - teamNamePanel.add(getTeamNameField()); - add(teamNamePanel); - JLabel label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getVersionLabel()); - - JPanel versionPanel = new JPanel(); - versionPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - versionPanel.setAlignmentX(Component.LEFT_ALIGNMENT); - getVersionField().setAlignmentX(Component.LEFT_ALIGNMENT); - getVersionField().setMaximumSize(getVersionField().getPreferredSize()); - versionPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, getVersionField().getPreferredSize().height)); - versionPanel.add(getVersionField()); - add(versionPanel); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getDescriptionLabel()); - - JScrollPane scrollPane = new JScrollPane(getDescriptionArea(), ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); - - scrollPane.setMaximumSize(scrollPane.getPreferredSize()); - scrollPane.setMinimumSize(new Dimension(100, scrollPane.getPreferredSize().height)); - scrollPane.setAlignmentX(Component.LEFT_ALIGNMENT); - add(scrollPane); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getAuthorLabel()); - - getAuthorField().setAlignmentX(Component.LEFT_ALIGNMENT); - getAuthorField().setMaximumSize(getAuthorField().getPreferredSize()); - add(getAuthorField()); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getWebpageLabel()); - - getWebpageField().setAlignmentX(Component.LEFT_ALIGNMENT); - getWebpageField().setMaximumSize(getWebpageField().getPreferredSize()); - add(getWebpageField()); - - getWebpageHelpLabel().setAlignmentX(Component.LEFT_ALIGNMENT); - add(getWebpageHelpLabel()); - - JPanel panel = new JPanel(); - - panel.setAlignmentX(Component.LEFT_ALIGNMENT); - add(panel); - addComponentListener(eventHandler); - } - - @Override - public boolean isReady() { - return getTeamNameField().getText().length() != 0 && getDescriptionArea().getText().length() != 0; - } - - private JLabel getAuthorLabel() { - if (authorLabel == null) { - authorLabel = new JLabel("Please enter your name. (optional)"); - authorLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return authorLabel; - } - - public JTextField getAuthorField() { - if (authorField == null) { - authorField = new JTextField(40); - } - return authorField; - } - - public JLabel getDescriptionLabel() { - if (descriptionLabel == null) { - descriptionLabel = new JLabel(""); - descriptionLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return descriptionLabel; - } - - public JTextArea getDescriptionArea() { - if (descriptionArea == null) { - LimitedDocument doc = new LimitedDocument(3, 72); - - descriptionArea = new JTextArea(doc, null, 3, 72); - doc.addDocumentListener(eventHandler); - } - return descriptionArea; - } - - private JLabel getVersionLabel() { - if (versionLabel == null) { - versionLabel = new JLabel( - "Please enter a version number for this robot (up to 10 word chars: letters, digits, dots, but no spaces)."); - versionLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return versionLabel; - } - - public JTextField getVersionField() { - if (versionField == null) { - LimitedDocument doc = new LimitedDocument(1, 10); - - versionField = new JTextField(doc, null, 10); - doc.addDocumentListener(eventHandler); - } - return versionField; - } - - public JLabel getWebpageLabel() { - if (webpageLabel == null) { - webpageLabel = new JLabel("Please enter a URL for your team's webpage (optional)"); - webpageLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return webpageLabel; - } - - public JTextField getWebpageField() { - if (webpageField == null) { - webpageField = new JTextField(40); - } - return webpageField; - } - - public JLabel getWebpageHelpLabel() { - if (webpageHelpLabel == null) { - webpageHelpLabel = new JLabel(""); - } - return webpageHelpLabel; - } - - public JTextField getTeamNameField() { - if (teamNameField == null) { - LimitedDocument doc = new LimitedClassnameDocument(1, 32); - - teamNameField = new JTextField(doc, null, 32); - doc.addDocumentListener(eventHandler); - } - return teamNameField; - } - - public JLabel getTeamNameLabel() { - if (teamNameLabel == null) { - teamNameLabel = new JLabel(""); - } - return teamNameLabel; - } - - public JLabel getTeamPackageLabel() { - if (teamPackageLabel == null) { - teamPackageLabel = new JLabel(""); - } - return teamPackageLabel; - } - - /** - * õ - * - * @return һַ - */ - public String getTeamPackage() { - return (teamPackage != null) ? teamPackage : "."; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowPositionManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowPositionManager.java deleted file mode 100644 index 4f3bf61..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowPositionManager.java +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; - -import java.awt.*; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Properties; -import java.util.StringTokenizer; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class WindowPositionManager implements ComponentListener { - - private Properties windowPositions; - - public WindowPositionManager() { - super(); - } - - public Properties getWindowPositions() { - if (windowPositions == null) { - windowPositions = new Properties(); - - FileInputStream in = null; - - try { - in = new FileInputStream(FileUtil.getWindowConfigFile()); - windowPositions.load(in); - } catch (FileNotFoundException e) { - Logger.logMessage("Creating " + FileUtil.getWindowConfigFile().getName() + " file"); - } catch (Exception e) { - Logger.logError(e); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) {} - } - } - } - return windowPositions; - } - - public void componentHidden(ComponentEvent e) {} - - public void componentMoved(ComponentEvent e) { - // Hack, because we cannot detect maximized frame in Java 1.3 - if (e.getComponent().getBounds().getWidth() >= Toolkit.getDefaultToolkit().getScreenSize().width - || e.getComponent().getBounds().getHeight() >= Toolkit.getDefaultToolkit().getScreenSize().height) { - return; - } - setWindowRect((Window) e.getComponent(), e.getComponent().getBounds()); - } - - public void componentResized(ComponentEvent e) { - // Hack, because we cannot detect maximized frame in Java 1.3 - if (e.getComponent().getBounds().getWidth() >= Toolkit.getDefaultToolkit().getScreenSize().width - || e.getComponent().getBounds().getHeight() >= Toolkit.getDefaultToolkit().getScreenSize().height) { - return; - } - setWindowRect((Window) e.getComponent(), e.getComponent().getBounds()); - } - - public void componentShown(ComponentEvent e) {} - - public void setWindowRect(Window w, Rectangle rect) { - String rString = rect.x + "," + rect.y + "," + rect.width + "," + rect.height; - - getWindowPositions().put(w.getClass().getName(), rString); - } - - public Rectangle getWindowRect(Window window) { - window.addComponentListener(this); - - String rString = (String) getWindowPositions().get(window.getClass().getName()); - - if (rString == null) { - return null; - } - - StringTokenizer tokenizer = new StringTokenizer(rString, ","); - int x = Integer.parseInt(tokenizer.nextToken()); - int y = Integer.parseInt(tokenizer.nextToken()); - int width = Integer.parseInt(tokenizer.nextToken()); - int height = Integer.parseInt(tokenizer.nextToken()); - - return fitWindowBoundsToScreen(new Rectangle(x, y, width, height)); - } - - public void saveWindowPositions() { - FileOutputStream out = null; - - try { - out = new FileOutputStream(FileUtil.getWindowConfigFile()); - - getWindowPositions().store(out, "Robocode window sizes"); - } catch (IOException e) { - Logger.logWarning("Unable to save window positions: " + e); - } finally { - if (out != null) { - try { - out.close(); - } catch (IOException ignored) {} - } - } - } - - private Rectangle fitWindowBoundsToScreen(Rectangle windowBounds) { - if (windowBounds == null) { - return null; - } - - // Return the input window bounds, if we can find a screen device that contains these bounds - - final GraphicsEnvironment gfxEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); - final GraphicsDevice[] screenDevices = gfxEnv.getScreenDevices(); - - for (int i = screenDevices.length - 1; i >= 0; i--) { - GraphicsConfiguration[] gfxCfg = screenDevices[i].getConfigurations(); - - for (int j = gfxCfg.length - 1; j >= 0; j--) { - if (gfxCfg[j].getBounds().contains(windowBounds.getLocation())) { - return windowBounds; // Found the bounds - } - } - } - - // Otherwise, return window bounds at a location within the current screen - - final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - - int x = (screenSize.width - windowBounds.width) / 2; - int y = (screenSize.height - windowBounds.height) / 2; - - return new Rectangle(x, y, windowBounds.width, windowBounds.height); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowUtil.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowUtil.java deleted file mode 100644 index 17c3f2f..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WindowUtil.java +++ /dev/null @@ -1,207 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import java.awt.*; -import java.io.PrintWriter; - - -/** - * This is a class for window utilization. - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public class WindowUtil { - - private static final Point origin = new Point(0, 0); - private static final WindowPositionManager windowPositionManager = new WindowPositionManager(); - private static JLabel statusLabel; - private static PrintWriter statusWriter; - private static JLabel defaultStatusLabel; - - public static void center(Window w) { - WindowUtil.center(null, w); - } - - public static void center(Window main, Window w) { - WindowUtil.center(main, w, true); - } - - public static void center(Window main, Window w, boolean move) { - Point location = null; - Dimension size = null; - - Rectangle windowRect = windowPositionManager.getWindowRect(w); - - if (windowRect != null) { - location = new Point(windowRect.x, windowRect.y); - size = new Dimension(windowRect.width, windowRect.height); - } - if (!move) { - size = null; - } - if (location == null || size == null) { - // Center a window - Dimension screenSize; - - if (main != null) { - screenSize = main.getSize(); - } else { - screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - } - size = w.getSize(); - if (size.height > screenSize.height - 20 || size.width > screenSize.width - 20) { - // Keep aspect ratio for the robocode frame. - if (w.getName().equals("RobocodeFrame")) { - int shrink = size.width - screenSize.width + 20; - - if (size.height - screenSize.height + 20 > shrink) { - shrink = size.height - screenSize.height + 20; - } - - size.width -= shrink; - size.height -= shrink; - } else { - if (size.height > screenSize.height - 20) { - size.height = screenSize.height - 20; - } - if (size.width > screenSize.width - 20) { - size.width = screenSize.width - 20; - } - } - } - if (main != null) { - location = main.getLocation(); - location.x += (screenSize.width - size.width) / 2; - location.y += (screenSize.height - size.height) / 2; - } else { - location = new Point((screenSize.width - size.width) / 2, (screenSize.height - size.height) / 2); - } - } - - w.setSize(size); - if (move) { - w.setLocation(location); - } - } - - public static void centerShow(Window main, Window window) { - center(main, window); - window.setVisible(true); - } - - public static void setFixedSize(JComponent component, Dimension size) { - component.setPreferredSize(size); - component.setMinimumSize(size); - component.setMaximumSize(size); - } - - public static void error(JFrame frame, String msg) { - Object[] options = { "OK"}; - - JOptionPane.showOptionDialog(frame, msg, "Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, - options, options[0]); - } - - public static void fitWindow(Window w) { - // We don't want to receive the resize event for this pack! - // ... yes we do! - // w.removeComponentListener(windowPositionManager); - w.pack(); - - center(null, w, false); - } - - public static void packCenterShow(Window window) { - // We don't want to receive the resize event for this pack! - window.removeComponentListener(windowPositionManager); - window.pack(); - center(window); - window.setVisible(true); - } - - public static void packCenterShow(Window main, Window window) { - // We don't want to receive the resize event for this pack! - window.removeComponentListener(windowPositionManager); - window.pack(); - center(main, window); - window.setVisible(true); - } - - public static void packPlaceShow(Window window) { - window.pack(); - WindowUtil.place(window); - window.setVisible(true); - } - - public static void place(Window w) { - // Center a window - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension size = w.getSize(); - - if (size.height > screenSize.height) { - size.height = screenSize.height; - } - if (size.width > screenSize.width) { - size.width = screenSize.width; - } - - w.setLocation(origin); - origin.y += 150; - if (origin.y + size.height > screenSize.height) { - origin.y = 0; - origin.x += 40; - } - if (origin.x + size.width > screenSize.width) { - origin.x = 0; - } - } - - public static void saveWindowPositions() { - windowPositionManager.saveWindowPositions(); - } - - public static void message(String s) { - JOptionPane.showMessageDialog(null, s, "Message", JOptionPane.INFORMATION_MESSAGE); - } - - public static void messageWarning(String s) { - JOptionPane.showMessageDialog(null, s, "Warning", JOptionPane.WARNING_MESSAGE); - } - - public static void messageError(String s) { - Toolkit.getDefaultToolkit().beep(); - JOptionPane.showMessageDialog(null, s, "Message", JOptionPane.ERROR_MESSAGE); - } - - public static void setStatus(String s) { - if (statusWriter != null) { - statusWriter.println(s); - } - if (statusLabel != null) { - statusLabel.setText(s); - } else if (defaultStatusLabel != null) { - defaultStatusLabel.setText(s); - } - } - - public static void setStatusLabel(JLabel label) { - statusLabel = label; - } - - public static void setDefaultStatusLabel(JLabel label) { - defaultStatusLabel = label; - } - - public static void setStatusWriter(PrintWriter out) { - statusWriter = out; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/Wizard.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/Wizard.java deleted file mode 100644 index 4effe7b..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/Wizard.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import java.awt.*; - - -/** - * @author Mathew A. Nelson (original) - */ -public interface Wizard { - abstract void back(); - - abstract Component getCurrentPanel(); - - abstract WizardController getWizardController(); - - WizardListener getWizardListener(); - - abstract boolean isBackAvailable(); - - abstract boolean isNextAvailable(); - - abstract boolean isReady(); - - abstract void next(); - - void setWizardControllerOnPanel(WizardPanel panel); -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardCardPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardCardPanel.java deleted file mode 100644 index 3744916..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardCardPanel.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import java.awt.*; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class WizardCardPanel extends JPanel implements Wizard { - private WizardController wizardController; - private CardLayout cardLayout = null; - private int currentIndex = 0; - private final WizardListener listener; - private final EventHandler eventHandler = new EventHandler(); - - public class EventHandler implements ContainerListener { - public void componentRemoved(ContainerEvent e) {} - - public void componentAdded(ContainerEvent e) { - if (e.getChild() instanceof WizardPanel) { - setWizardControllerOnPanel((WizardPanel) e.getChild()); - getWizardController().stateChanged(new ChangeEvent(e.getChild())); - } - } - } - - /** - * WizardCardLayout constructor - * - * @param listener WizardListener - */ - public WizardCardPanel(WizardListener listener) { - this.listener = listener; - initialize(); - } - - public void back() { - currentIndex--; - getWizardController().stateChanged(null); - getCardLayout().previous(this); - } - - public CardLayout getCardLayout() { - if (cardLayout == null) { - cardLayout = new CardLayout(); - } - return cardLayout; - } - - public Component getCurrentPanel() { - return getComponent(currentIndex); - } - - public WizardController getWizardController() { - if (wizardController == null) { - wizardController = new WizardController(this); - } - return wizardController; - } - - public WizardListener getWizardListener() { - return listener; - } - - public void initialize() { - this.setLayout(getCardLayout()); - this.addContainerListener(eventHandler); - } - - public boolean isBackAvailable() { - return (currentIndex > 0); - } - - public boolean isCurrentPanelReady() { - Component c = getCurrentPanel(); - - return (!(c instanceof WizardPanel)) || ((WizardPanel) c).isReady(); - } - - public boolean isNextAvailable() { - return ((currentIndex < getComponentCount() - 1) && isCurrentPanelReady()); - } - - public boolean isReady() { - for (Component c : getComponents()) { - if (!((WizardPanel) c).isReady()) { - return false; - } - } - return true; - } - - public void next() { - currentIndex++; - getWizardController().stateChanged(null); - getCardLayout().next(this); - } - - public void setWizardControllerOnPanel(WizardPanel panel) { - panel.setWizardController(getWizardController()); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardController.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardController.java deleted file mode 100644 index 3796002..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardController.java +++ /dev/null @@ -1,195 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - * @author Mathew A. Nelson (original) - * @author Matthew Reeder (contributor) - * @author Flemming N. Larsen (contributor) - */ -@SuppressWarnings("serial") -public class WizardController extends JPanel implements ChangeListener { - - private final EventHandler eventHandler = new EventHandler(); - - private JButton backButton; - private JButton nextButton; - private JButton finishButton; - private JButton cancelButton; - private boolean focusOnEnabled; - - class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (e.getSource() == WizardController.this.getFinishButton()) { - finishButtonActionPerformed(); - } - if (e.getSource() == WizardController.this.getCancelButton()) { - cancelButtonActionPerformed(); - } - if (e.getSource() == WizardController.this.getNextButton()) { - nextButtonActionPerformed(); - } - if (e.getSource() == WizardController.this.getBackButton()) { - backButtonActionPerformed(); - } - } - } - - private void backButtonActionPerformed() { - wizard.back(); - } - - private void cancelButtonActionPerformed() { - wizard.getWizardListener().cancelButtonActionPerformed(); - } - - private void finishButtonActionPerformed() { - wizard.getWizardListener().finishButtonActionPerformed(); - } - - /** - * Return the backButton - * - * @return JButton - */ - private JButton getBackButton() { - if (backButton == null) { - backButton = new JButton(); - backButton.setText("Back"); - backButton.setMnemonic('B'); - backButton.addActionListener(eventHandler); - } - return backButton; - } - - /** - * Return the cancelButton - * - * @return JButton - */ - private JButton getCancelButton() { - if (cancelButton == null) { - cancelButton = new JButton(); - cancelButton.setText("Cancel"); - cancelButton.setMnemonic('C'); - cancelButton.addActionListener(eventHandler); - } - return cancelButton; - } - - /** - * Return the finishButton - * - * @return JButton - */ - private JButton getFinishButton() { - if (finishButton == null) { - finishButton = new JButton(); - finishButton.setText("Finish"); - finishButton.setMnemonic('F'); - finishButton.addActionListener(eventHandler); - } - return finishButton; - } - - public void setFinishButtonText(String text) { - getFinishButton().setText(text); - } - - public void setFinishButtonTextAndMnemonic(String text, char mnemonic, int mnemonicIndex) { - getFinishButton().setText(text); - getFinishButton().setMnemonic(mnemonic); - getFinishButton().setDisplayedMnemonicIndex(mnemonicIndex); - } - - /** - * Return the nextButton - * - * @return JButton - */ - private JButton getNextButton() { - if (nextButton == null) { - nextButton = new JButton(); - nextButton.setText("Next"); - nextButton.setMnemonic('N'); - nextButton.addActionListener(eventHandler); - } - return nextButton; - } - - /** - * Initialize the class. - */ - private void initialize() { - add(getBackButton()); - add(getNextButton()); - add(new JLabel(" ")); - add(getFinishButton()); - add(getCancelButton()); - } - - private void nextButtonActionPerformed() { - wizard.next(); - } - - private void setBackButtonEnabled(boolean enabled) { - getBackButton().setEnabled(enabled); - } - - public void setFinishButtonEnabled(boolean enabled) { - getFinishButton().setEnabled(enabled); - if (focusOnEnabled && enabled) { - getFinishButton().requestFocus(); - } - } - - private void setNextButtonEnabled(boolean enabled) { - getNextButton().setEnabled(enabled); - } - - private Wizard wizard = null; - - protected WizardController(Wizard wizard) { - super(); - this.wizard = wizard; - initialize(); - stateChanged(null); - } - - public void stateChanged(ChangeEvent e) { - setBackButtonEnabled(wizard.isBackAvailable()); - setNextButtonEnabled(wizard.isNextAvailable()); - setFinishButtonEnabled(wizard.isReady()); - } - - /** - * Gets the focusOnEnabled. - * - * @return Returns a boolean - */ - public boolean getFocusOnEnabled() { - return focusOnEnabled; - } - - /** - * Sets the focusOnEnabled. - * - * @param focusOnEnabled The focusOnEnabled to set - */ - public void setFocusOnEnabled(boolean focusOnEnabled) { - this.focusOnEnabled = focusOnEnabled; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardListener.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardListener.java deleted file mode 100644 index 83171f8..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardListener.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -/** - * @author Mathew A. Nelson (original) - */ -public interface WizardListener { - void cancelButtonActionPerformed(); - - void finishButtonActionPerformed(); -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardPanel.java deleted file mode 100644 index f6061ba..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardPanel.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.event.ChangeEvent; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - */ -public abstract class WizardPanel extends javax.swing.JPanel { - private static final long serialVersionUID = 1L; - - private WizardController wizardController; - - public void fireStateChanged() { - if (wizardController != null) { - wizardController.stateChanged(new ChangeEvent(this)); - } - } - - public abstract boolean isReady(); - - public void setWizardController(WizardController wizardController) { - this.wizardController = wizardController; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardTabbedPane.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardTabbedPane.java deleted file mode 100644 index 51958a9..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/dialog/WizardTabbedPane.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.dialog; - - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.ContainerEvent; -import java.awt.event.ContainerListener; - - -/** - * @author Mathew A. Nelson (original) - */ -@SuppressWarnings("serial") -public class WizardTabbedPane extends JTabbedPane implements Wizard { - private WizardController wizardController; - private int currentIndex = 0; - private final WizardListener listener; - private final EventHandler eventHandler = new EventHandler(); - - public class EventHandler implements ContainerListener, ChangeListener { - public void componentRemoved(ContainerEvent e) {} - - public void componentAdded(ContainerEvent e) { - if (e.getChild() instanceof WizardPanel) { - setWizardControllerOnPanel((WizardPanel) e.getChild()); - getWizardController().stateChanged(new ChangeEvent(e.getChild())); - } - } - - public void stateChanged(javax.swing.event.ChangeEvent e) { - currentIndex = getSelectedIndex(); - getWizardController().stateChanged(e); - } - } - - public WizardTabbedPane(WizardListener listener) { - this.listener = listener; - initialize(); - } - - public void back() { - setSelectedIndex(currentIndex - 1); - } - - public Component getCurrentPanel() { - return getSelectedComponent(); - } - - public WizardController getWizardController() { - if (wizardController == null) { - wizardController = new WizardController(this); - } - return wizardController; - } - - public WizardListener getWizardListener() { - return listener; - } - - public void initialize() { - addChangeListener(eventHandler); - addContainerListener(eventHandler); - } - - public boolean isBackAvailable() { - return (currentIndex > 0); - } - - public boolean isCurrentPanelReady() { - Component c = getCurrentPanel(); - - return (!(c instanceof WizardPanel)) || ((WizardPanel) c).isReady(); - } - - public boolean isNextAvailable() { - return ((currentIndex < getComponentCount() - 1) && isCurrentPanelReady()); - } - - public boolean isReady() { - for (Component c : getComponents()) { - if (c instanceof WizardPanel) { - if (!((WizardPanel) c).isReady()) { - return false; - } - } - } - return true; - } - - public void next() { - setSelectedIndex(currentIndex + 1); - } - - public void setWizardControllerOnPanel(WizardPanel panel) { - panel.setWizardController(getWizardController()); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/editor/IRobocodeEditor.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/editor/IRobocodeEditor.java deleted file mode 100644 index 30a02a1..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/editor/IRobocodeEditor.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.editor; - - -/** - * @author Pavel Savara (original) - */ -public interface IRobocodeEditor { - boolean close(); -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ColorUtil.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ColorUtil.java deleted file mode 100644 index 6100b82..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ColorUtil.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.gfx; - - -import static robocode.util.Utils.isNear; - -import java.awt.*; - - -/** - * Class used for utilizing colors. - * - * @author Flemming N. Larsen (original) - */ -class ColorUtil { - - /** - * Return a Color based on a color in RGB565 format. - * - * @param rgb565 the color in RGB565 format. - * @return a Color based on the specifed color in RGB565 format. - */ - public static Color toColor(short rgb565) { - if (rgb565 == 0) { - return null; - } - if (rgb565 == 0x20) { - return Color.BLACK; - } - return new Color(255 * ((rgb565 & 0xF800) >> 11) / 31, 255 * ((rgb565 & 0x07e0) >> 5) / 63, - 255 * (rgb565 & 0x001f) / 31); - } - - /** - * Returns a color in the RGB565 format based on a Color instance. - * - * @param c the color to convert into a RGB565 color. - * @return a color in the RGB565 format based on the specified Color. - */ - public static short toRGB565(Color c) { - if (c == null) { - return 0; - } - short rgb = (short) (((c.getRed() & 0xf8) << 8) | ((c.getGreen() & 0xfc) << 3) | (c.getBlue() >> 3)); - - // 0 is reserved for null -> set green (has highest resolution) to 1 - if (rgb == 0) { - return 0x20; - } - // If the color actually was 0x20 then set it to 0x40 (to the nearest green) - if (rgb == 0x20) { - return 0x40; - } - return rgb; - } - - /** - * Converts a RGB color into a HSL color. - * - * @param r the red color component. - * @param g the green color component. - * @param b the blue color component. - * @return a {@code float[] { H, S, L }} representing the HSL color. - */ - public static float[] fromRGBtoHSL(int r, int g, int b) { - float R = (float) r / 255; - float G = (float) g / 255; - float B = (float) b / 255; - - float min = Math.min(Math.min(R, G), B); // Min. value of RGB - float max = Math.max(Math.max(R, G), B); // Max. value of RGB - float delta = max - min; // Delta RGB value - - float L = (max + min) / 2; - - float H, S; - - if (delta == 0) { // This is a gray, no chroma... - H = 0; - S = 0; - } else { // Chromatic data... - if (L < 0.5f) { - S = delta / (max + min); - } else { - S = delta / (2 - max - min); - } - - float deltaR = (((max - R) / 6) + (delta / 2)) / delta; - float deltaG = (((max - G) / 6) + (delta / 2)) / delta; - float deltaB = (((max - B) / 6) + (delta / 2)) / delta; - - if (isNear(R, max)) { - H = deltaB - deltaG; - } else if (isNear(G, max)) { - H = (1f / 3) + deltaR - deltaB; - } else { - H = (2f / 3) + deltaG - deltaR; - } - - if (H < 0) { - H++; - } - if (H > 1) { - H--; - } - } - return new float[] { H, S, L}; - } - - /** - * Converts a HSL color into a RGB color integer value. - * - * @param h the color hue. - * @param s the color saturation. - * @param l the color lumination. - * @return an RGB integer value. - */ - public static int fromHSLtoRGB(float h, float s, float l) { - float m2 = (l <= 0.5f) ? (l * (s + 1)) : (l + s - l * s); - float m1 = 2 * l - m2; - - int r = (int) (255 * fromHUEtoRGB(m1, m2, h + (1f / 3))); - int g = (int) (255 * fromHUEtoRGB(m1, m2, h)); - int b = (int) (255 * fromHUEtoRGB(m1, m2, h - (1f / 3))); - - return (((r << 8) | g) << 8) | b; - } - - private static float fromHUEtoRGB(float m1, float m2, float h) { - if (h < 0) { - h++; - } - if (h > 1) { - h--; - } - if ((h * 6) < 1) { - return m1 + (m2 - m1) * h * 6; - } - if ((h * 2) < 1) { - return m2; - } - if ((h * 3) < 2) { - return m1 + (m2 - m1) * ((2f / 3) - h) * 6; - } - return m1; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/GraphicsState.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/GraphicsState.java deleted file mode 100644 index 30fcb71..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/GraphicsState.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.gfx; - - -import java.awt.*; -import java.awt.geom.AffineTransform; - - -/** - * This class is used for storing the state of a Graphics object, which can be - * restored later. - * - * @author Flemming N. Larsen (original) - */ -public class GraphicsState { - - private Paint paint; - private Font font; - private Stroke stroke; - private AffineTransform transform; - private Composite composite; - private Shape clip; - private RenderingHints renderingHints; - private Color color; - private Color background; - - public void save(Graphics g) { - Graphics2D g2 = (Graphics2D) g; - - paint = g2.getPaint(); - font = g2.getFont(); - stroke = g2.getStroke(); - transform = g2.getTransform(); - composite = g2.getComposite(); - clip = g2.getClip(); - renderingHints = g2.getRenderingHints(); - color = g2.getColor(); - background = g2.getBackground(); - } - - public void restore(Graphics g) { - Graphics2D g2 = (Graphics2D) g; - - g2.setPaint(paint); - g2.setFont(font); - g2.setStroke(stroke); - g2.setTransform(transform); - g2.setComposite(composite); - g2.setClip(clip); - g2.setRenderingHints(renderingHints); - g2.setColor(color); - g2.setBackground(background); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ImageUtil.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ImageUtil.java deleted file mode 100644 index c69c97c..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/ImageUtil.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.gfx; - - -import net.sf.robocode.io.Logger; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.awt.image.FilteredImageSource; -import java.awt.image.RGBImageFilter; -import java.io.IOException; -import java.net.URL; - - -/** - * Class used for utilizing images. - * - * @author Flemming N. Larsen (original) - */ -public class ImageUtil { - - /** - * Returns an image resource. - * - * @param filename the filename of the image to load - * @return the loaded image - */ - public static Image getImage(String filename) { - URL url = ImageUtil.class.getResource(filename); - - if (url == null) { - Logger.logError("Could not load image because of invalid filename: " + filename); - return null; - } - - try { - final BufferedImage result = ImageIO.read(url); - - if (result == null) { - final String message = "Could not load image: " + filename; - - Logger.logError(message); - throw new Error(); - } - return result; - } catch (IOException e) { - Logger.logError("Could not load image: " + filename); - return null; - } - - } - - /** - * Creates and returns a buffered version of the specified image. - * - * @param image the image to create a buffered image for - * @return a buffered image based on the specified image - */ - public static BufferedImage getBufferedImage(Image image) { - BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), - BufferedImage.TYPE_INT_ARGB); - - Graphics g = bufferedImage.getGraphics(); - - g.drawImage(image, 0, 0, null); - - return bufferedImage; - } - - /** - * Create a copy of an robot image into a coloured robot image. The colors of the - * input image are changed into the input color, but with the same lumination. - * - * @param img the source image - * @param color the new color that substitutes the old color(s) in the source image - * @return a new image - */ - public static Image createColouredRobotImage(Image img, Color color) { - return (color == null) - ? img - : (img == null) - ? null - : Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(img.getSource(), new ColorFilter(color))); - } - - /** - * A color filter used for changing colors into another color. - * - * @author Flemming N. Larsen - */ - private static class ColorFilter extends RGBImageFilter { - private final float[] hsl; - - public ColorFilter(Color color) { - hsl = ColorUtil.fromRGBtoHSL(color.getRed(), color.getGreen(), color.getBlue()); - } - - @Override - public int filterRGB(int x, int y, int argb) { - int r = (argb >> 16) & 0xff; - int g = (argb >> 8) & 0xff; - int b = argb & 0xff; - - float[] HSL = ColorUtil.fromRGBtoHSL(r, g, b); - - if (HSL[1] > 0) { - float L = Math.min(1, (hsl[2] + HSL[2]) / 2 + hsl[2] / 7); - - return argb & 0xff000000 | ColorUtil.fromHSLtoRGB(hsl[0], hsl[1], L); - } - return argb; - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderImage.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderImage.java deleted file mode 100644 index a2f3ae5..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderImage.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.gfx; - - -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.geom.Area; - - -/** - * An image that can be rendered. - * - * @author Flemming N. Larsen (original) - */ -public class RenderImage extends RenderObject { - - /** - * Image - */ - protected final Image image; - - /** - * Area containing the bounds of the image to paint - */ - protected final Area boundArea; - - /** - * Constructs a new {@code RenderImage}, which has it's origin in the center - * of the image. - * - * @param image the image to be rendered - */ - public RenderImage(Image image) { - this(image, ((double) image.getWidth(null) / 2), ((double) image.getHeight(null) / 2)); - } - - /** - * Constructs a new {@code RenderImage} - * - * @param image the image to be rendered - * @param originX the x coordinate of the origin for the rendered image - * @param originY the y coordinate of the origin for the rendered image - */ - public RenderImage(Image image, double originX, double originY) { - super(); - - this.image = image; - - baseTransform = AffineTransform.getTranslateInstance(-originX, -originY); - - boundArea = new Area(new Rectangle(0, 0, image.getWidth(null), image.getHeight(null))); - } - - /** - * Constructs a new {@code RenderImage} that is a copy of another - * {@code RenderImage}. - * - * @param ri the {@code RenderImage} to copy - */ - public RenderImage(RenderImage ri) { - super(ri); - - image = ri.image; - - boundArea = new Area(ri.boundArea); - } - - @Override - public void paint(Graphics2D g) { - g.drawImage(image, transform, null); - } - - @Override - public Rectangle getBounds() { - return boundArea.createTransformedArea(transform).getBounds(); - } - - @Override - public RenderObject copy() { - return new RenderImage(this); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderObject.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderObject.java deleted file mode 100644 index 6a1b462..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RenderObject.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.gfx; - - -import java.awt.*; -import java.awt.geom.AffineTransform; - - -/** - * The base of all renderable objects. - * An {@code RenderObject} is an object that can be painted and transformed. - * - * @author Flemming N. Larsen (original) - */ -public class RenderObject { - - /** - * Base transform, e.g. the initial rotation and translation - */ - protected AffineTransform baseTransform; - - /** - * Current transform that is concatenated with the base transform - */ - protected final AffineTransform transform; - - /** - * Current frame that must be rendered - */ - protected int frame; - - /** - * Constructs a new {@code RenderObject}. - */ - public RenderObject() { - baseTransform = new AffineTransform(); - transform = new AffineTransform(); - } - - /** - * Constructs a new {@code RenderObject} that is a copy of another {@code RenderObject}. - * - * @param renderObject the RenderObject to copy. - */ - public RenderObject(RenderObject renderObject) { - baseTransform = new AffineTransform(renderObject.baseTransform); - transform = new AffineTransform(renderObject.transform); - frame = renderObject.frame; - } - - /** - * Sets the base transform which is pre-concatenated with the current transform. - * - * @param Tx the new transform - */ - public void setBaseTransform(AffineTransform Tx) { - baseTransform.setTransform(Tx); - } - - /** - * Returns a copy of the base transform - * - * @return a copy of the base transform - */ - public AffineTransform getBaseTransform() { - return new AffineTransform(baseTransform); - } - - /** - * Sets the current transform, which is concatenated with the base transform. - * - * @param Tx the new transform - */ - public void setTransform(AffineTransform Tx) { - transform.setTransform(Tx); - transform.concatenate(baseTransform); - } - - /** - * Returns a copy of the current transform - * - * @return a copy of the current transform - */ - public AffineTransform getTransform() { - return transform; - } - - /** - * Sets the current frame number - * - * @param frame the new frame number - */ - public void setFrame(int frame) { - this.frame = frame; - } - - /** - * Returns the current frame number - * - * @return the current frame number - */ - public int getFrame() { - return frame; - } - - /** - * Paint this object. - * This method must be overridden in derived classes. - * - * @param g the graphics context where this object must be painted. - */ - public void paint(Graphics2D g) {} - - /** - * Returns the bounds of this object based on it's current transform. - * This method must be overridden in derived classes. - * - * @return the bounds of this object based on it's current transform. - */ - public Rectangle getBounds() { - return new Rectangle(); - } - - /** - * Returns a copy of this object. - * This method must be overridden in derived classes. - * - * @return a copy of this object. - */ - public RenderObject copy() { - return new RenderObject(this); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RobocodeLogo.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RobocodeLogo.java deleted file mode 100644 index 48f2d4e..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/gfx/RobocodeLogo.java +++ /dev/null @@ -1,445 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.gfx; - - -import java.awt.*; -import java.awt.geom.*; - - -/** - * This class is used for rendering the Robocode logo. - * - * @author Flemming N. Larsen (original) - */ -public class RobocodeLogo { - - public final static int WIDTH = 570; - public final static int HEIGHT = 213; - - private final static Color WHITE_ALPHA_7F = new Color(0xff, 0xff, 0xff, 0x7f); - - private final static Color GLOW_GREEN = new Color(0x0A, 0xff, 0x0A, 0x66); - - private final static Color DARK_GREEN_ALPHA_80 = new Color(0x00, 0x70, 0x00, 0x80); - private final static Color GREEN_ALPHA_08 = new Color(0x00, 0xff, 0x00, 0x08); - private final static Color GREEN_ALPHA_20 = new Color(0x00, 0xff, 0x00, 0x20); - private final static Color GREEN_ALPHA_40 = new Color(0x00, 0xff, 0x00, 0x40); - private final static Color GREEN_ALPHA_48 = new Color(0x00, 0xff, 0x00, 0x48); - private final static Color GREEN_ALPHA_80 = new Color(0x00, 0xff, 0x00, 0x80); - - private final static Shape I_SHAPE = new Rectangle2D.Float(0, 0, 13, 46); - - private final static Stroke THIN_STROKE = new BasicStroke(1.5f); - - public void paintLogoWithTanks(Graphics graphics) { - Graphics2D g = (Graphics2D) graphics; - AffineTransform origTransform = g.getTransform(); - - g.setColor(Color.BLACK); - g.fillRect(0, 0, WIDTH, HEIGHT); - - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - - drawTanks(g); - drawOuterDecoration(g); - drawMiddleEllipse(g); - drawMiddleDecoration(g); - drawInnerDecoration(g); - drawInnerSubDecoration(g); - drawRobocodeText(g); - - g.setTransform(origTransform); - } - - private void transform(Graphics2D g, AffineTransform tx) { - AffineTransform at = new AffineTransform(); - - if (tx != null) { - at.concatenate(tx); - } - g.setTransform(at); - } - - private void drawTanks(Graphics2D g) { - AffineTransform origTransform = g.getTransform(); - - drawRobot(g, 22, 192, (float) Math.PI / 2, -0.2f, -0.2f, new Color(0x30, 0x00, 0x10, 0xff)); - drawRobot(g, 22, 92, (float) Math.PI / 2, (float) Math.PI, (float) Math.PI, new Color(0x16, 0x00, 0x2c, 0xff)); - - drawRobot(g, 212, 173, 0.75f, 0.75f, 0.75f, new Color(0x02, 0x01, 0x00, 0xff)); - - drawRobot(g, 455, 50, 2.4f, 2f, 2f, new Color(0x02, 0x00, 0x01, 0xff)); - drawRobot(g, 492, 82, -0.3f, -0.27f, -0.27f, new Color(0x00, 0x00, 0x01, 0xff)); - - transform(g, AffineTransform.getTranslateInstance(270, -25)); - RenderImage explRenderImage1 = new RenderImage( - ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion2-24.png")); - - explRenderImage1.paint(g); - - transform(g, AffineTransform.getTranslateInstance(23, 102)); - RenderImage explRenderImage2 = new RenderImage( - ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion1-8.png")); - - explRenderImage2.setTransform(AffineTransform.getScaleInstance(0.3, 0.3)); - explRenderImage2.paint(g); - - transform(g, AffineTransform.getTranslateInstance(464, 55)); - RenderImage explRenderImage3 = new RenderImage( - ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion1-1.png")); - - explRenderImage3.setTransform(AffineTransform.getScaleInstance(0.5, 0.5)); - explRenderImage3.paint(g); - - transform(g, AffineTransform.getTranslateInstance(488, 72)); - RenderImage explRenderImage4 = new RenderImage( - ImageUtil.getImage("/net/sf/robocode/ui/images/explosion/explosion1-6.png")); - - explRenderImage4.setTransform(AffineTransform.getScaleInstance(0.4, 0.4)); - explRenderImage4.paint(g); - - transform(g, origTransform); - g.setColor(Color.LIGHT_GRAY); - g.fillOval(20, 154, 3, 3); - } - - private void drawRobot(Graphics2D g, int x, int y, float bodyAngle, float gunAngle, float radarAngle, Color color) { - transform(g, AffineTransform.getTranslateInstance(x, y)); - - RenderImage bodyRenderImage = new RenderImage( - ImageUtil.createColouredRobotImage(ImageUtil.getImage("/net/sf/robocode/ui/images/body.png"), color)); - - bodyRenderImage.setTransform(AffineTransform.getRotateInstance(bodyAngle)); - bodyRenderImage.paint(g); - - RenderImage gunRenderImage = new RenderImage( - ImageUtil.createColouredRobotImage(ImageUtil.getImage("/net/sf/robocode/ui/images/turret.png"), color)); - - gunRenderImage.setTransform(AffineTransform.getRotateInstance(gunAngle)); - gunRenderImage.paint(g); - - RenderImage radarRenderImage = new RenderImage( - ImageUtil.createColouredRobotImage(ImageUtil.getImage("/net/sf/robocode/ui/images/radar.png"), color)); - - radarRenderImage.setTransform(AffineTransform.getRotateInstance(radarAngle)); - radarRenderImage.paint(g); - } - - private void drawOuterDecoration(Graphics2D g) { - Shape shape = getOuterDecoration(); - - transform(g, AffineTransform.getTranslateInstance(26, 24)); - - g.setColor(WHITE_ALPHA_7F); - g.fill(shape); - - g.setStroke(THIN_STROKE); - g.drawOval(16, 5, 490, 163); - } - - private void drawMiddleEllipse(Graphics2D g) { - transform(g, null); - - Shape ellipse = new Ellipse2D.Float(68, 38, 440, 146); - - g.setColor(DARK_GREEN_ALPHA_80); - g.fill(ellipse); - - g.setColor(GREEN_ALPHA_40); - g.setStroke(THIN_STROKE); - g.draw(ellipse); - } - - private void drawMiddleDecoration(Graphics2D g) { - Shape shape = getMiddleDecoration(); - - transform(g, AffineTransform.getTranslateInstance(77, 41)); - - g.setColor(GREEN_ALPHA_20); - g.fill(shape); - - g.setStroke(THIN_STROKE); - g.setColor(GREEN_ALPHA_48); - g.draw(shape); - } - - private void drawInnerDecoration(Graphics2D g) { - Shape shape = getInnerDecoration(); - - transform(g, AffineTransform.getTranslateInstance(103, 52)); - - g.setColor(DARK_GREEN_ALPHA_80); - g.fill(shape); - - g.setStroke(THIN_STROKE); - g.setColor(GLOW_GREEN); - g.draw(shape); - } - - private void drawInnerSubDecoration(Graphics2D g) { - Shape shape = getInnerSubDecoration(); - - transform(g, AffineTransform.getTranslateInstance(110, 54)); - - g.setColor(GREEN_ALPHA_08); - g.fill(shape); - - g.setStroke(THIN_STROKE); - g.setColor(GREEN_ALPHA_48); - g.draw(shape); - } - - private void drawRobocodeText(Graphics2D g) { - Shape shape = getRobocodeText(); - - transform(g, AffineTransform.getTranslateInstance(121, 88)); - - g.setColor(GREEN_ALPHA_40); - g.fill(shape); - - g.setStroke(THIN_STROKE); - g.setColor(GREEN_ALPHA_80); - g.draw(shape); - } - - private Area outerDecoration; - - private Shape getOuterDecoration() { - if (outerDecoration == null) { - float W = 523; - float H = 174; - - outerDecoration = new Area(new Ellipse2D.Float(0, 0, W, H)); - outerDecoration.subtract(new Area(new Ellipse2D.Float(16, 5, W - 2 * 16, H - 2 * 5))); - - outerDecoration.subtract(new Area(new Rectangle2D.Float(W / 2, 0, W / 2, H / 2))); - outerDecoration.subtract(new Area(new Rectangle2D.Float(0, H / 2, W / 2, H / 2))); - } - return outerDecoration; - } - - private Area middleDecoration; - - private Shape getMiddleDecoration() { - if (middleDecoration == null) { - middleDecoration = new Area(new Ellipse2D.Float(0, 0, 420, 140)); - - Rectangle2D.Float rect = new Rectangle2D.Float(180, 69, 500, 3); - - for (float deg = 120; deg <= 335; deg += 4.8f) { - Area rectArea = new Area(rect); - - rectArea.transform(AffineTransform.getRotateInstance(Math.toRadians(deg), 151, 72)); - middleDecoration.subtract(rectArea); - } - - middleDecoration.subtract(new Area(new Ellipse2D.Float(18, 2, 408, 144))); - } - return middleDecoration; - } - - private Area innerSubDecoration; - - private Shape getInnerSubDecoration() { - if (innerSubDecoration == null) { - innerSubDecoration = new Area(new Ellipse2D.Float(0, 0, 356, 114)); - innerSubDecoration.subtract( - new Area(new Rectangle2D.Float(Float.MIN_VALUE, Float.MIN_VALUE, Float.MAX_VALUE, 88))); - innerSubDecoration.subtract( - new Area(new Rectangle2D.Float(Float.MIN_VALUE, Float.MIN_VALUE, 184, Float.MAX_VALUE))); - innerSubDecoration.subtract(new Area(new Rectangle2D.Float(209, Float.MIN_VALUE, 3, Float.MAX_VALUE))); - } - return innerSubDecoration; - } - - private Area innerDecoration; - - private Shape getInnerDecoration() { - if (innerDecoration == null) { - innerDecoration = new Area(new Ellipse2D.Float(0, 0, 368, 120)); - innerDecoration.subtract(new Area(new Rectangle2D.Float(Float.MIN_VALUE, 30, Float.MAX_VALUE, 56))); - innerDecoration.subtract(new Area(new Rectangle2D.Float(181, Float.MIN_VALUE, 7, Float.MAX_VALUE))); - } - return innerDecoration; - } - - private GeneralPath robocodeTextPath; - - public GeneralPath getRobocodeText() { - if (robocodeTextPath == null) { - robocodeTextPath = new GeneralPath(); - - GeneralPath R = getPathR(); - GeneralPath o = getPathO(); - GeneralPath b = getPathB(); - GeneralPath c = getPathC(); - GeneralPath d = getPathD(); - GeneralPath e = getPathE(); - - robocodeTextPath.append(R, false); - - o.transform(AffineTransform.getTranslateInstance(42, 16)); - robocodeTextPath.append(o, false); - - b.transform(AffineTransform.getTranslateInstance(84, 0)); - robocodeTextPath.append(b, false); - - o.transform(AffineTransform.getTranslateInstance(127 - 42, 0)); - robocodeTextPath.append(o, false); - - c.transform(AffineTransform.getTranslateInstance(170, 16)); - robocodeTextPath.append(c, false); - - o.transform(AffineTransform.getTranslateInstance(204 - 127, 0)); - robocodeTextPath.append(o, false); - - d.transform(AffineTransform.getTranslateInstance(246, 0)); - robocodeTextPath.append(d, false); - - e.transform(AffineTransform.getTranslateInstance(290, 16)); - robocodeTextPath.append(e, false); - } - return robocodeTextPath; - } - - private GeneralPath getPathR() { - GeneralPath path = new GeneralPath(I_SHAPE); - - GeneralPath bow = getPathPBow(); - - bow.transform(AffineTransform.getTranslateInstance(15, 0)); - path.append(bow, false); - - path.moveTo(21, 29); - path.lineTo(31, 46); - path.lineTo(44.5f, 46); - path.lineTo(33.5f, 27); - path.curveTo(33.5f, 27, 31, 29, 21, 29); - path.closePath(); - - return path; - } - - private GeneralPath getPathO() { - GeneralPath path = getPathOBow(); - - path.transform(AffineTransform.getTranslateInstance(20, 0)); - - GeneralPath bow2 = getPathOBow(); - - bow2.transform(AffineTransform.getScaleInstance(-1, 1)); - bow2.transform(AffineTransform.getTranslateInstance(18, 0)); - path.append(bow2, false); - - return path; - } - - private GeneralPath getPathB() { - GeneralPath path = new GeneralPath(I_SHAPE); - - GeneralPath bow = getPathPBow(); - - bow.transform(AffineTransform.getTranslateInstance(15, 20)); - path.append(bow, false); - - return path; - } - - private GeneralPath getPathC() { - GeneralPath path = getPathCBow(); - - GeneralPath bow2 = getPathCBow(); - - bow2.transform(AffineTransform.getScaleInstance(1, -1)); - bow2.transform(AffineTransform.getTranslateInstance(0, 31)); - path.append(bow2, false); - - return path; - } - - private GeneralPath getPathD() { - GeneralPath path = new GeneralPath(I_SHAPE); - - path.transform(AffineTransform.getTranslateInstance(27, 0)); - - GeneralPath bow = getPathPBow(); - - bow.transform(AffineTransform.getScaleInstance(-1, 1)); - bow.transform(AffineTransform.getTranslateInstance(25, 20)); - path.append(bow, false); - - return path; - } - - private GeneralPath getPathE() { - GeneralPath path = new GeneralPath(); - - path.moveTo(0, 14.5f); - path.lineTo(31, 14.5f); - path.curveTo(31, -4.5f, 0, -4.5f, 0, 14.5f); - path.closePath(); - - path.moveTo(12, 11); - path.lineTo(20, 11); - path.curveTo(20, 8, 12, 8, 12, 11); - path.closePath(); - - GeneralPath bow2 = getPathCBow(); - - bow2.transform(AffineTransform.getScaleInstance(1, -1)); - bow2.transform(AffineTransform.getTranslateInstance(0, 31)); - path.append(bow2, false); - - return path; - } - - private GeneralPath getPathPBow() { - GeneralPath path = new GeneralPath(); - - path.moveTo(0, 0); - path.lineTo(10, 0); - path.curveTo(30, 0, 30, 26, 10, 26); - path.lineTo(0, 26); - path.lineTo(0, 17); - path.lineTo(8, 17); - path.curveTo(14, 18, 14, 9, 8, 9); - path.lineTo(0, 9); - path.lineTo(0, 0); - path.closePath(); - - return path; - } - - private GeneralPath getPathOBow() { - GeneralPath path = new GeneralPath(); - - path.moveTo(0, 0); - path.curveTo(23, 0, 23, 31, 0, 31); - path.lineTo(0, 20); - path.curveTo(8, 20, 8, 11, 0, 11); - path.lineTo(0, 0); - path.closePath(); - - return path; - } - - private GeneralPath getPathCBow() { - GeneralPath path = new GeneralPath(); - - path.moveTo(31, 12); - path.curveTo(29, -3.5f, 2, -5.5f, 0, 14.5f); - path.lineTo(11, 14.5f); - path.curveTo(11, 8.5f, 18, 9, 18, 12); - path.lineTo(31, 12); - path.closePath(); - - return path; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/ConfirmPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/ConfirmPanel.java deleted file mode 100644 index 2b68ac3..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/ConfirmPanel.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.packager; - - -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.ui.dialog.WizardPanel; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -@SuppressWarnings("serial") -public class ConfirmPanel extends WizardPanel { - private final RobotPackager robotPackager; - private final EventHandler eventHandler = new EventHandler(); - private boolean visible; - private JPanel robotListPanel; - - private class EventHandler implements ComponentListener { - public void componentMoved(ComponentEvent e) {} - - public void componentResized(ComponentEvent e) {} - - public void componentHidden(ComponentEvent e) { - visible = false; - fireStateChanged(); - } - - public void componentShown(ComponentEvent e) { - if (robotPackager != null) { - visible = true; - updateFields(); - fireStateChanged(); - repaint(); - } - } - } - - public ConfirmPanel(RobotPackager robotPackager) { - super(); - this.robotPackager = robotPackager; - initialize(); - } - - public JPanel getRobotListPanel() { - if (robotListPanel == null) { - robotListPanel = new JPanel(); - robotListPanel.setLayout(new BoxLayout(robotListPanel, BoxLayout.Y_AXIS)); - robotListPanel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return robotListPanel; - } - - private void initialize() { - setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - addComponentListener(eventHandler); - add(new JPanel()); - } - - @Override - public boolean isReady() { - return visible; - } - - public void setSelectedRobots(List selectedRobots) { - getRobotListPanel().removeAll(); - - if (selectedRobots == null || selectedRobots.size() == 0) { - getRobotListPanel().add(new JLabel("You have not yet selected any robots.")); - } else if (selectedRobots.size() == 1) { - String robotName = (selectedRobots.get(0)).getFullClassName(); - getRobotListPanel().add(new JLabel("You have selected " + robotName + " for packaging.")); - } else { - getRobotListPanel().add(new JLabel("You have selected the following robots for packaging:")); - for (IRobotSpecItem selected : selectedRobots) { - getRobotListPanel().add(new JLabel(selected.getFullClassName())); - } - } - getRobotListPanel().add(new JLabel("")); - getRobotListPanel().setMaximumSize(new Dimension(10000, robotListPanel.getPreferredSize().height)); - - validate(); - } - - public void updateFields() { - removeAll(); - setSelectedRobots(robotPackager.getRobotSelectionPanel().getSelectedRobots()); - add(getRobotListPanel()); - add(Box.createVerticalStrut(20)); - if (robotPackager.getPackagerOptionsPanel().getIncludeSource().isSelected()) { - add(new JLabel("Java source files will be included.")); - } else { - add(new JLabel("Java source files will NOT be included.")); - } - if (robotPackager.getPackagerOptionsPanel().getIncludeData().isSelected()) { - add(new JLabel("Data files will be included, if they exists.")); - } else { - add(new JLabel("Data source files will NOT be included.")); - } - add(Box.createVerticalStrut(20)); - add(new JLabel("The package will be saved in: " + robotPackager.getFilenamePanel().getFilenameField().getText())); - add(Box.createVerticalStrut(20)); - add(new JLabel("If all of the above is correct, click the Package button to start packaging.")); - add(new JPanel()); - - revalidate(); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/FilenamePanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/FilenamePanel.java deleted file mode 100644 index 4a9aceb..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/FilenamePanel.java +++ /dev/null @@ -1,269 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.packager; - - -import net.sf.robocode.io.FileUtil; -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.ui.dialog.WizardPanel; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.Caret; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -@SuppressWarnings("serial") -public class FilenamePanel extends WizardPanel { - private final RobotPackager robotPackager; - - private final EventHandler eventHandler = new EventHandler(); - private boolean robocodeErrorShown; - - private JButton browseButton; - private JTextField filenameField; - - private class EventHandler implements ActionListener, DocumentListener, ComponentListener { - public void insertUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void changedUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void removeUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void actionPerformed(ActionEvent e) { - if (e.getSource() == getBrowseButton()) { - showFileSelectDialog(); - } - } - - public void componentMoved(ComponentEvent e) {} - - public void componentResized(ComponentEvent e) {} - - public void componentHidden(ComponentEvent e) {} - - public void componentShown(ComponentEvent e) { - String fileName = FileUtil.getRobotsDir().getAbsolutePath() + File.separator; - File outgoingFile = new File(fileName); - - if (!outgoingFile.exists()) { - if (!outgoingFile.mkdirs()) { - Logger.logError("Cannot create: " + outgoingFile); - } - } - String jarName = "myrobots.jar"; - List selectedRobots = robotPackager.getRobotSelectionPanel().getSelectedRobots(); - - if (selectedRobots != null && selectedRobots.size() == 1) { - jarName = selectedRobots.get(0).getFullClassName() + "_" - + robotPackager.getPackagerOptionsPanel().getVersionField().getText() + ".jar"; - } - - getFilenameField().setText(fileName + jarName); - Caret caret = getFilenameField().getCaret(); - - caret.setDot(fileName.length()); - caret.moveDot(fileName.length() + jarName.length() - 4); - - getFilenameField().requestFocus(); - } - } - - public FilenamePanel(RobotPackager robotPackager) { - super(); - this.robotPackager = robotPackager; - initialize(); - } - - private void initialize() { - setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - addComponentListener(eventHandler); - - GridBagLayout layout = new GridBagLayout(); - - setLayout(layout); - GridBagConstraints c = new GridBagConstraints(); - - c.insets = new Insets(5, 5, 5, 5); - c.anchor = GridBagConstraints.NORTHWEST; - - c.fill = GridBagConstraints.HORIZONTAL; - c.gridwidth = 1; - c.weightx = 1; - - add(new JLabel("Please type in a .jar file to save this robot package to: "), c); - - c.gridy = 1; - add(getFilenameField(), c); - - c.fill = GridBagConstraints.NONE; - c.gridy = 2; - c.insets = new Insets(3, 3, 3, 3); - add(getBrowseButton(), c); - - c.fill = GridBagConstraints.VERTICAL; - c.weighty = 1; - c.gridy = 3; - add(new JPanel(), c); - } - - @Override - public boolean isReady() { - if (filenameField.getText() == null) { - return false; - } - int robocodeIndex = filenameField.getText().lastIndexOf(File.separatorChar); - - if (robocodeIndex > 0) { - if (filenameField.getText().substring(robocodeIndex + 1).indexOf("robocode") == 0) { - if (!robocodeErrorShown) { - robocodeErrorShown = true; - new Thread(new Runnable() { - public void run() { - JOptionPane.showMessageDialog(FilenamePanel.this, "Filename cannot begin with robocode"); - } - }).start(); - } - return false; - } - } - return (filenameField.getText().toLowerCase().indexOf(".jar") != 0); - } - - public static void main(String[] args) { - JFrame frame = new JFrame("options"); - - frame.setSize(new Dimension(500, 300)); - frame.getContentPane().add(new FilenamePanel(null)); - - try { - SwingUtilities.invokeAndWait(new ShowFrameWorker(frame)); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } - - public JButton getBrowseButton() { - if (browseButton == null) { - browseButton = new JButton("Browse"); - browseButton.addActionListener(eventHandler); - } - return browseButton; - } - - public JTextField getFilenameField() { - if (filenameField == null) { - filenameField = new JTextField("(none selected)", 60); - filenameField.getDocument().addDocumentListener(eventHandler); - } - return filenameField; - } - - public void showFileSelectDialog() { - File f = new File("outgoing" + File.separatorChar); - - JFileChooser chooser = new JFileChooser(f); - - chooser.setCurrentDirectory(f); - - javax.swing.filechooser.FileFilter filter = new javax.swing.filechooser.FileFilter() { - @Override - public boolean accept(File pathname) { - if (pathname.isDirectory()) { - return true; - } - String fn = pathname.getName(); - int idx = fn.lastIndexOf('.'); - String extension = ""; - - if (idx >= 0) { - extension = fn.substring(idx); - } - return extension.equalsIgnoreCase(".jar"); - } - - @Override - public String getDescription() { - return "JAR files"; - } - }; - - chooser.setFileFilter(filter); - - boolean done = false; - - while (!done) { - done = true; - int rv = chooser.showSaveDialog(this); - String robotFileName; - - if (rv == JFileChooser.APPROVE_OPTION) { - robotFileName = chooser.getSelectedFile().getPath(); - if (robotFileName.toLowerCase().indexOf(".jar") < 0) { - robotFileName += ".jar"; - } - File outFile = new File(robotFileName); - - if (outFile.exists()) { - int ok = JOptionPane.showConfirmDialog(this, - robotFileName + " already exists. Are you sure you want to replace it?", "Warning", - JOptionPane.YES_NO_CANCEL_OPTION); - - if (ok == JOptionPane.NO_OPTION) { - done = false; - continue; - } - if (ok == JOptionPane.CANCEL_OPTION) { - return; - } - } - getFilenameField().setText(robotFileName); - fireStateChanged(); - } - } - } - - static class ShowFrameWorker implements Runnable { - final JFrame frame; - - public ShowFrameWorker(JFrame frame) { - this.frame = frame; - } - - public void run() { - if (frame != null) { - frame.setVisible(true); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/PackagerOptionsPanel.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/PackagerOptionsPanel.java deleted file mode 100644 index c8ad5cb..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/PackagerOptionsPanel.java +++ /dev/null @@ -1,405 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.packager; - - -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.ui.dialog.WizardPanel; -import net.sf.robocode.ui.util.LimitedDocument; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.*; -import java.lang.reflect.InvocationTargetException; -import java.net.URL; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -@SuppressWarnings("serial") -public class PackagerOptionsPanel extends WizardPanel { - private final RobotPackager robotPackager; - - private final EventHandler eventHandler = new EventHandler(); - - private JCheckBox includeSource; - private JCheckBox includeData; - private JLabel authorLabel; - private JTextField authorField; - private JLabel descriptionLabel; - private JTextArea descriptionArea; - private JLabel versionLabel; - private JTextField versionField; - private JLabel versionHelpLabel; - private JLabel webpageLabel; - private JTextField webpageField; - private JLabel webpageHelpLabel; - - private List currentSelectedRobots; - - private class EventHandler implements ComponentListener, KeyListener, DocumentListener { - public void insertUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void changedUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void removeUpdate(DocumentEvent e) { - fireStateChanged(); - } - - public void componentMoved(ComponentEvent e) {} - - public void componentHidden(ComponentEvent e) {} - - public void componentShown(ComponentEvent e) { - List selectedRobots = robotPackager.getRobotSelectionPanel().getSelectedRobots(); - - // Make sure we don't reset content. Bug fix [3026856] - if (selectedRobots == null || selectedRobots.equals(currentSelectedRobots)) { - return; - } - currentSelectedRobots = selectedRobots; // Bug fix [3026856] - - if (selectedRobots.size() == 1) { - IRobotSpecItem robotSpecItem = selectedRobots.get(0); - - getIncludeSource().setSelected(robotSpecItem.getIncludeSource()); - - getIncludeData().setSelected(robotSpecItem.getIncludeData()); - - String ver = robotSpecItem.getVersion(); - if (ver == null || ver.length() == 0) { - getVersionHelpLabel().setVisible(false); - ver = "1.0"; - } else { - if (ver.length() == 10) { - ver = ver.substring(0, 9); - } - ver += "*"; - getVersionHelpLabel().setVisible(true); - } - getVersionField().setText(ver); - - String desc = robotSpecItem.getDescription(); - if (desc == null) { - desc = ""; - } - getDescriptionArea().setText(desc); - - String author = robotSpecItem.getAuthorName(); - if (author == null) { - author = ""; - } - getAuthorField().setText(author); - - URL url = robotSpecItem.getWebpage(); - String webPage = (url != null) ? url.toString() : ""; - getWebpageField().setText(webPage); - - String fullPackage = robotSpecItem.getFullPackage(); - - String text = ""; - if (fullPackage != null && fullPackage.indexOf(".") != -1) { - String htmlFileName = fullPackage.substring(0, fullPackage.lastIndexOf(".")) + ".html"; - - text = "(You may also leave this blank, and simply create the file: " + htmlFileName + ")"; - } - getWebpageHelpLabel().setText(text); - - getVersionLabel().setVisible(true); - getVersionField().setVisible(true); - getAuthorLabel().setVisible(true); - getAuthorField().setVisible(true); - getWebpageLabel().setVisible(true); - getWebpageField().setVisible(true); - getWebpageHelpLabel().setVisible(true); - getDescriptionLabel().setText( - "Please enter a short description of your robot (up to 3 lines of 72 chars each)."); - } else if (selectedRobots.size() > 1) { - getVersionLabel().setVisible(false); - getVersionField().setVisible(false); - getVersionHelpLabel().setVisible(false); - getAuthorLabel().setVisible(false); - getAuthorField().setVisible(false); - getWebpageLabel().setVisible(false); - getWebpageField().setVisible(false); - getWebpageHelpLabel().setVisible(false); - getDescriptionLabel().setText( - "Please enter a short description of this robot collection (up to 3 lines of 72 chars each)."); - if (getDescriptionArea().getText() == null || getDescriptionArea().getText().length() == 0) { - getDescriptionArea().setText("(Example)This robot comes from the ... robot collection\n"); - } - } - } - - public void componentResized(ComponentEvent e) {} - - public void keyPressed(KeyEvent e) {} - - public void keyReleased(KeyEvent e) {} - - public void keyTyped(KeyEvent e) {} - } - - public JPanel robotListPanel; - - public PackagerOptionsPanel(RobotPackager robotPackager) { - super(); - this.robotPackager = robotPackager; - initialize(); - } - - private void initialize() { - setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - - JLabel label = new JLabel( - "It is up to you whether or not to include the source files when you distribute your robot."); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - label = new JLabel( - "If you include the source files, other people will be able to look at your code and learn from it."); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - getIncludeSource().setAlignmentX(Component.LEFT_ALIGNMENT); - add(getIncludeSource()); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - label = new JLabel("You may include the source files too if they are available?"); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - getIncludeData().setAlignmentX(Component.LEFT_ALIGNMENT); - add(getIncludeData()); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getVersionLabel()); - - JPanel versionPanel = new JPanel(); - versionPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - versionPanel.setAlignmentX(Component.LEFT_ALIGNMENT); - getVersionField().setAlignmentX(Component.LEFT_ALIGNMENT); - getVersionField().setMaximumSize(getVersionField().getPreferredSize()); - versionPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, getVersionField().getPreferredSize().height)); - versionPanel.add(getVersionField()); - versionPanel.add(getVersionHelpLabel()); - add(versionPanel); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getDescriptionLabel()); - - JScrollPane scrollPane = new JScrollPane(getDescriptionArea(), ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); - - scrollPane.setMaximumSize(scrollPane.getPreferredSize()); - scrollPane.setMinimumSize(new Dimension(100, scrollPane.getPreferredSize().height)); - scrollPane.setAlignmentX(Component.LEFT_ALIGNMENT); - add(scrollPane); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getAuthorLabel()); - - getAuthorField().setAlignmentX(Component.LEFT_ALIGNMENT); - getAuthorField().setMaximumSize(getAuthorField().getPreferredSize()); - add(getAuthorField()); - - label = new JLabel(" "); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - add(label); - - add(getWebpageLabel()); - - getWebpageField().setAlignmentX(Component.LEFT_ALIGNMENT); - getWebpageField().setMaximumSize(getWebpageField().getPreferredSize()); - add(getWebpageField()); - - getWebpageHelpLabel().setAlignmentX(Component.LEFT_ALIGNMENT); - add(getWebpageHelpLabel()); - - JPanel panel = new JPanel(); - - panel.setAlignmentX(Component.LEFT_ALIGNMENT); - add(panel); - addComponentListener(eventHandler); - } - - @Override - public boolean isReady() { - if (getVersionLabel().isVisible()) { - String text = getVersionField().getText(); - - if (text.length() == 0 || !text.matches("([a-zA-Z0-9.])*[a-zA-Z0-9]+")) { - return false; - } - } - return getDescriptionArea().getText().length() != 0; - } - - public static void main(String[] args) { - JFrame frame = new JFrame("options"); - - frame.setSize(new Dimension(500, 300)); - frame.getContentPane().add(new PackagerOptionsPanel(null)); - - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - e.getWindow().dispose(); - } - - @Override - public void windowClosed(WindowEvent e) { - System.exit(0); - } - }); - - try { - SwingUtilities.invokeAndWait(new PackAndShowFrameWorker(frame)); - } catch (InterruptedException e) { - // Immediately reasserts the exception by interrupting the caller thread itself - Thread.currentThread().interrupt(); - - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } - - public JCheckBox getIncludeSource() { - if (includeSource == null) { - includeSource = new JCheckBox("Include source files", true); - } - return includeSource; - } - - public JCheckBox getIncludeData() { - if (includeData == null) { - includeData = new JCheckBox("Include data files", true); - } - return includeData; - } - - private JLabel getAuthorLabel() { - if (authorLabel == null) { - authorLabel = new JLabel("Please enter your name. (optional)"); - authorLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return authorLabel; - } - - public JTextField getAuthorField() { - if (authorField == null) { - authorField = new JTextField(40); - } - return authorField; - } - - public JLabel getDescriptionLabel() { - if (descriptionLabel == null) { - descriptionLabel = new JLabel(""); - descriptionLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return descriptionLabel; - } - - public JTextArea getDescriptionArea() { - if (descriptionArea == null) { - LimitedDocument doc = new LimitedDocument(3, 72); - - descriptionArea = new JTextArea(doc, null, 3, 72); - doc.addDocumentListener(eventHandler); - } - return descriptionArea; - } - - private JLabel getVersionLabel() { - if (versionLabel == null) { - versionLabel = new JLabel( - "Please enter a version number for this robot (up to 10 word chars: letters, digits, dots, but no spaces)."); - versionLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return versionLabel; - } - - public JTextField getVersionField() { - if (versionField == null) { - LimitedDocument doc = new LimitedDocument(1, 10); - - versionField = new JTextField(doc, null, 10); - doc.addDocumentListener(eventHandler); - } - return versionField; - } - - public JLabel getVersionHelpLabel() { - if (versionHelpLabel == null) { - versionHelpLabel = new JLabel("<-- Make sure to delete the asterisk and type in a new version number"); - } - return versionHelpLabel; - } - - public JLabel getWebpageLabel() { - if (webpageLabel == null) { - webpageLabel = new JLabel("Please enter a URL for your robot's webpage. (optional)"); - webpageLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - } - return webpageLabel; - } - - public JTextField getWebpageField() { - if (webpageField == null) { - webpageField = new JTextField(40); - } - return webpageField; - } - - public JLabel getWebpageHelpLabel() { - if (webpageHelpLabel == null) { - webpageHelpLabel = new JLabel(""); - } - return webpageHelpLabel; - } - - static class PackAndShowFrameWorker implements Runnable { - final JFrame frame; - - public PackAndShowFrameWorker(JFrame frame) { - this.frame = frame; - } - - public void run() { - if (frame != null) { - frame.pack(); - frame.setVisible(true); - } - } - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/RobotPackager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/RobotPackager.java deleted file mode 100644 index 4dd5214..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/packager/RobotPackager.java +++ /dev/null @@ -1,233 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.packager; - - -import net.sf.robocode.io.Logger; -import net.sf.robocode.repository.IRobotSpecItem; -import net.sf.robocode.repository.IRepositoryManager; -import net.sf.robocode.repository.RobotProperties; -import net.sf.robocode.ui.IWindowManager; -import net.sf.robocode.ui.dialog.*; -import static net.sf.robocode.ui.util.ShortcutUtil.MENU_SHORTCUT_KEY_MASK; - -import javax.swing.*; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.List; - - -/** - * @author Mathew A. Nelson (original) - * @author Matthew Reeder (contributor) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - */ -@SuppressWarnings("serial") -public class RobotPackager extends JDialog implements WizardListener { - - private final int minRobots = 1; - private final int maxRobots = 1; // 250; - - private JPanel robotPackagerContentPane; - private WizardCardPanel wizardPanel; - private WizardController buttonsPanel; - private FilenamePanel filenamePanel; - private ConfirmPanel confirmPanel; - private RobotSelectionPanel robotSelectionPanel; - private PackagerOptionsPanel packagerOptionsPanel; - - private final IRepositoryManager repositoryManager; - private final IWindowManager windowManager; - - private final EventHandler eventHandler = new EventHandler(); - - private class EventHandler implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("Refresh")) { - getRobotSelectionPanel().refreshRobotList(true); - } - } - } - - public RobotPackager(IRepositoryManager repositoryManager, IWindowManager windowManager) { - super(windowManager.getRobocodeFrame()); - this.repositoryManager = repositoryManager; - this.windowManager = windowManager; - initialize(); - } - - public void cancelButtonActionPerformed() { - dispose(); - } - - /** - * Return the buttonsPanel - * - * @return JButton - */ - private WizardController getButtonsPanel() { - if (buttonsPanel == null) { - buttonsPanel = getWizardPanel().getWizardController(); - } - return buttonsPanel; - } - - /** - * Return the buttonsPanel - * - * @return JButton - */ - private ConfirmPanel getConfirmPanel() { - if (confirmPanel == null) { - confirmPanel = new ConfirmPanel(this); - } - return confirmPanel; - } - - /** - * Return the optionsPanel - * - * @return robocode.packager.PackagerOptionsPanel - */ - protected FilenamePanel getFilenamePanel() { - if (filenamePanel == null) { - filenamePanel = new FilenamePanel(this); - } - return filenamePanel; - } - - /** - * Return the optionsPanel - * - * @return robocode.packager.PackagerOptionsPanel - */ - protected PackagerOptionsPanel getPackagerOptionsPanel() { - if (packagerOptionsPanel == null) { - packagerOptionsPanel = new PackagerOptionsPanel(this); - } - return packagerOptionsPanel; - } - - /** - * Return the newBattleDialogContentPane - * - * @return JPanel - */ - private JPanel getRobotPackagerContentPane() { - if (robotPackagerContentPane == null) { - robotPackagerContentPane = new JPanel(); - robotPackagerContentPane.setLayout(new BorderLayout()); - robotPackagerContentPane.add(getButtonsPanel(), BorderLayout.SOUTH); - robotPackagerContentPane.add(getWizardPanel(), BorderLayout.CENTER); - getWizardPanel().getWizardController().setFinishButtonTextAndMnemonic("Package!", 'P', 0); - robotPackagerContentPane.registerKeyboardAction(eventHandler, "Refresh", - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - robotPackagerContentPane.registerKeyboardAction(eventHandler, "Refresh", - KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), JComponent.WHEN_FOCUSED); - } - return robotPackagerContentPane; - } - - /** - * Return the Page property value. - * - * @return JPanel - */ - public RobotSelectionPanel getRobotSelectionPanel() { - if (robotSelectionPanel == null) { - robotSelectionPanel = net.sf.robocode.core.Container.createComponent(RobotSelectionPanel.class); - robotSelectionPanel.setup(minRobots, maxRobots, false, "Select the robot or team you would like to package.", /* true */ - false, - false, false/* true */, true, false, true, null); - } - return robotSelectionPanel; - } - - /** - * Return the tabbedPane. - * - * @return JTabbedPane - */ - private WizardCardPanel getWizardPanel() { - if (wizardPanel == null) { - wizardPanel = new WizardCardPanel(this); - wizardPanel.add(getRobotSelectionPanel(), "Select robot"); - wizardPanel.add(getPackagerOptionsPanel(), "Select options"); - wizardPanel.add(getFilenamePanel(), "Select filename"); - wizardPanel.add(getConfirmPanel(), "Confirm"); - } - return wizardPanel; - } - - private void initialize() { - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setTitle("Robot Packager"); - setContentPane(getRobotPackagerContentPane()); - } - - public void finishButtonActionPerformed() { - String jarFilename = getFilenamePanel().getFilenameField().getText(); - File jarFile = new File(jarFilename); - - if (jarFile.exists()) { - int ok = JOptionPane.showConfirmDialog(this, - jarFilename + " already exists. Are you sure you want to replace it?", "Warning", - JOptionPane.YES_NO_CANCEL_OPTION); - - if (ok == JOptionPane.NO_OPTION || ok == JOptionPane.CANCEL_OPTION) { - Logger.logMessage("Cancelled by user."); - return; - } - Logger.logMessage("Overwriting " + jarFilename); - } - - String webPageFieldString = getPackagerOptionsPanel().getWebpageField().getText(); - URL webPage = null; - - if (webPageFieldString.length() > 0) { - try { - webPage = new URL(webPageFieldString); - } catch (MalformedURLException e) { - try { - webPage = new URL("http://" + webPageFieldString); - getPackagerOptionsPanel().getWebpageField().setText(webPage.toString()); - } catch (MalformedURLException ignored) {} - } - } - boolean includeSource = getPackagerOptionsPanel().getIncludeSource().isSelected(); - boolean includeData = getPackagerOptionsPanel().getIncludeData().isSelected(); - String version = getPackagerOptionsPanel().getVersionField().getText(); - String author = getPackagerOptionsPanel().getAuthorField().getText(); - String desc = getPackagerOptionsPanel().getDescriptionArea().getText(); - List robots = getRobotSelectionPanel().getSelectedRobots(); - - RobotProperties props = new RobotProperties(); - props.setIncludeSource(includeSource); - props.setIncludeData(includeData); - props.setVersion(version); - props.setAuthor(author); - props.setDescription(desc); - props.setWebPage(webPage); - - String outputText = repositoryManager.createPackage(jarFile, robots, props); - - ConsoleDialog dialog = new ConsoleDialog(windowManager.getRobocodeFrame(), "Packaging results", false); - dialog.setText(outputText); - dialog.pack(); - WindowUtil.packCenterShow(this, dialog); - dispose(); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedClassnameDocument.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedClassnameDocument.java deleted file mode 100644 index be2b543..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedClassnameDocument.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.util; - - -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; - - -/** - * @author Mathew A. Nelson (original) - */ -@SuppressWarnings("serial") -public class LimitedClassnameDocument extends LimitedDocument { - - public LimitedClassnameDocument() { - super(); - } - - public LimitedClassnameDocument(int maxRows, int maxCols) { - super(maxRows, maxCols); - } - - @Override - public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { - if (offs == 0 && str.length() > 0) { - if (!Character.isJavaIdentifierStart(str.charAt(0))) { - java.awt.Toolkit.getDefaultToolkit().beep(); - return; - } - } else { - for (int i = 0; i < str.length(); i++) { - if (!Character.isJavaIdentifierPart(str.charAt(i))) { - java.awt.Toolkit.getDefaultToolkit().beep(); - return; - } - } - } - if (offs == 0) { - if (!Character.isUpperCase(str.charAt(0))) { - str = str.substring(0, 1).toUpperCase() + str.substring(1); - } - } - - super.insertString(offs, str, a); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedDocument.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedDocument.java deleted file mode 100644 index 5d64e37..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/LimitedDocument.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.util; - - -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; -import javax.swing.text.Element; -import javax.swing.text.PlainDocument; -import java.awt.*; - - -/** - * @author Mathew A. Nelson (original) - */ -@SuppressWarnings("serial") -public class LimitedDocument extends PlainDocument { - int maxRows = Integer.MAX_VALUE; - int maxCols = Integer.MAX_VALUE; - - public LimitedDocument() { - super(); - } - - public LimitedDocument(int maxRows, int maxCols) { - super(); - this.maxRows = maxRows; - this.maxCols = maxCols; - } - - @Override - public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { - Element rootElement = getDefaultRootElement(); - int i = str.indexOf("\n"); - int newlines = 0; - - while (i < str.length() && i >= 0) { - newlines++; - i = str.indexOf("\n", i + 1); - } - - int currentLines = rootElement.getElementCount(); - - if (newlines > 0 && currentLines + newlines > maxRows) { - Toolkit.getDefaultToolkit().beep(); - return; - } - - int lineIndex = rootElement.getElementIndex(offs); - boolean done = false; - - int carry = rootElement.getElement(lineIndex).getEndOffset() - offs - 1; - int lineStart = 0; - - while (!done) { - int lineEnd = str.indexOf("\n", lineStart); - - if (lineEnd == -1 || lineEnd == str.length()) { - if (lineStart == 0) { - carry = 0; - lineEnd = str.length(); - } else { - lineEnd = str.length() + carry; - } - done = true; - } - int lineLen = lineEnd - lineStart; - // Increment for last line... - int currentLen; - - if (!done && lineStart > 0) { - currentLen = 0; - } else { - if (done && lineStart > 0) { - lineIndex++; - } - Element currentLine = rootElement.getElement(lineIndex); - - if (currentLine != null) { - currentLen = currentLine.getEndOffset() - currentLine.getStartOffset(); - } else { - currentLen = 1; - } - if (lineStart == 0) { - currentLen -= carry; - } - } - if (lineLen + currentLen > maxCols + 1) { - Toolkit.getDefaultToolkit().beep(); - return; - } - - lineStart = lineEnd + 1; - } - - super.insertString(offs, str, a); - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/ShortcutUtil.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/ShortcutUtil.java deleted file mode 100644 index 16f5af5..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/util/ShortcutUtil.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -package net.sf.robocode.ui.util; - - -import java.awt.*; -import java.awt.event.InputEvent; - - -/** - * Utility for handling shortcut keys. - * - * @author Flemming N. Larsen (original) - */ -public class ShortcutUtil { - - /** - * The menu shortcut key mask. - */ - public final static int MENU_SHORTCUT_KEY_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); - - /** - * Returns the text for the shortcut modifier key. - * - * @return the text for the shortcut modifier key. - */ - public static String getModifierKeyText() { - - boolean isMac = (System.getProperty("os.name").startsWith("Mac")); - - String text = ""; - - if ((MENU_SHORTCUT_KEY_MASK & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) { - text = "Shift"; - } - if ((MENU_SHORTCUT_KEY_MASK & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) { - if (text.length() > 0) { - text += '+'; - } - text = "Ctrl"; - } - if ((MENU_SHORTCUT_KEY_MASK & InputEvent.ALT_MASK) == InputEvent.ALT_MASK) { - if (text.length() > 0) { - text += '+'; - } - text = isMac ? "Opt" : "Alt"; - } - if ((MENU_SHORTCUT_KEY_MASK & InputEvent.META_MASK) == InputEvent.META_MASK) { - if (text.length() > 0) { - text += '+'; - } - text = isMac ? "Cmd" : "Meta"; - } - - return text; - } -} diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/html/about.html b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/html/about.html deleted file mode 100644 index 84d226f..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/html/about.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - -
-  Robocode version {$robocode-version} - - -
-  © Copyright 2001-2016 Robocode contributors. All rights reserved. -
- - - -
- -Original Author: Mathew A. Nelson. -     -Original Graphics: Garett S. Hourihan. - - - -
- -Running on Java {$java-version} by {$java-vendor}  |   -Download  |   -Java 6 API documentation
- - - - - -
- -ReadMe - |  -License - |  -Home Page - |  -Project Home - |  -Versions - |  -News - |  -RoboWiki - |  -Robocode Repository - |  -Robocode Developers -
-Download - |  -Getting started - |  -Java API - |  -.NET API - |  -FAQ - |  -Google Group - |  -Help Forum - |  -Bug Reports - |  -Feature Requests - -

Main Contributors

-Mathew A. Nelson: Original developer (2001-2005)
-Flemming N. Larsen: Administrator, developer, integrator, lots of features (2005-2016)
-Pavel Savara: Administrator, developer, integrator, robot interfaces, refactorings, .NET plugin (2008-2011)
- -

Contributors

-Aaron Rotenberg: Robot Cache Cleaner utility
-Albert Perez: RoboRumble@Home client
-Alexander Schultz: Reporting lots of bugs and good solutions for fixing these
-Ascander Jr: Graphics for background tiles
-Christian D. Schnell: Codesize 1.0 utility
-Cubic Creative: Design and ideas for the JuniorRobot class
-Dan Lynn: The Robocode Repository that is the central place for storing your robots and also find other robots
-Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh: Score percentage in results/rankings
-Jerome Lavigne: Added "Smart Battles" to MeleeRumble, developer and admin of the RoboRumble server
-Joachim Hofer: Fixing problem with wrong results in RoboRumble
-Joshua Galecki: Added the RateControlRobot
-Julian Kent: Nano precision timing of allowed robot time
-Luis Crespo: Sound engine, single-step debugging, ranking panel
-Matthew Reeder: Editor enhancements, keyboard shortcuts, HyperThreading bugfixes
-Nathaniel Troutman: Fixing memory leaks
-Patrick Cupka, Julian Kent, Nat Pavasant, and "Positive": Redesigned robot movement method
Robert D. Maupin: Optimizations with collections and improved CPU constant benchmark
-Ruben Moreno Montoliu: Added paths with buttons to Developement Options
-Stefan Westen: onPaint method from RobocodeSG
-Titus Chen: Bugfixes for robot teleportation, bad wall collision detection, team ranking, replay scores and robot color flickering
-Tuan Anh Nguyen: Interactive_v2 sample robot - - - -
- -Thanks goes to every contributor as well to all users reporting bugs and suggesting new features for Robocode. - \ No newline at end of file diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/html/transparent.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/html/transparent.png deleted file mode 100644 index ce0ea771566a755210bfbc720330a57613dfa56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx3?wy9o9qU0ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(%D}+P5a1Ky3KSm&qaiS2LtwMPmkv900000 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/icons/robocode-icon.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/icons/robocode-icon.png deleted file mode 100644 index b82402a17e5d50d7c902df6a6f3977682c6999d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2243 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/.cvsignore b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/.cvsignore deleted file mode 100644 index 085e8ba..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -Thumbs.db diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-1.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-1.png deleted file mode 100644 index 61ac8efe8e8db0c4cc69df6745a5e172164e4ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1513 zcmb7^i9gc~0LFhdVVf~IGUhDTr-aCrtK7#NuQTVExuy(Dg!iSyT&WMQ-W-M3^(JQ` znT*NYbL0*!Ig*<&8L$3?p6ByC&*$^}0pDa>Yg0H>1PTBE+}zCQkJF9&6)uj`rs{e3 zo(_kPrKu5c^2-G+WtpcBgkW|v8~|YazrqIO63A$uKPiIQ14XMcb+J%(f+i);ip$t?y4 z5D65P-65?=fW8&Anz^8Z)eXWI5{GT=-7YwXeSE|jOv;M#@yPD~4!(DY%GVte&I1ul z)ccKmT;z#Sn@|)-=XE!*qz5>(_PRIDYgE25N|M~G(|ZI^r#~- z5Xs7#S(N8|x?ULWucU!qit@v!jGKT*W^M__sp2N|cj=m@Wh*xcUxQL|mA-s_`qxqh zUX*l+eJW0PkUJ|LiBVF9SQ%`HyX2kl`VG;ts^$#8JP$OfMit+2QwTmE55diktc{%9 z0>i;#R&x;$(>;AN+9>5J<)Oa46gY+>jY><}5A)fLom!trY{jKCj+eDJ$Z|1)?&dNo zC)q9E2VqyT9Z}4cIifrG(*aCGLK5-`;?5>I(3zPw9_w>5G?ZF z2R#u%11$b}u;riF+6u{84ssum&NLjJMa7?r^#~HoyUR={N)<8AA_LQyJu@is{w(*L>@*P3#RE zb89r+C|Gh`o9a1{HtibEt>6r}#sLo=La{S^=n7L7TWdJj8}hxLGoGa!b%3uD(J^2gb0?EQwhMF+ zqE)IlR>@Dfm-C;xYmstiR)OKxB5R=up4g;etNLJ?yIR*#C*>>B33$n}dz>m(DR*h_ zd9_xKxTMoQD5NBAJU*W?Xyef3Q1!aH{kT?u#&Qm5Y~GZhW45VMtCtz`sKn>i8E&&4 z*6S>J3Eg{QKhPC{U7j}mMGIcU7v)~u_QeB{Jo*Gg zs17&rPI?@Zp?Y@jC;uUEB+pf5QIj^=^Pl}j=j7n>Z$oT5n#p6(&J-Qlj$1p0GGK0O KZB%swbN_!MVzTJ~ diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-10.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-10.png deleted file mode 100644 index ca933a4dda630afa9c85027cf08e0223177050e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19762 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 KMNUMnLSTYA0ey@B diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-14.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-14.png deleted file mode 100644 index 4da1cc7a78aadca8dd0c704474f48572d9a35dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28149 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

d78N9YBnWf_%On1(yIwxSK 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-15.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-15.png deleted file mode 100644 index 83016457e86cb2c29140b291c237bac0b52a6932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16242 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-16.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-16.png deleted file mode 100644 index 7bfa886e5cb081db0cb5a0e9b0dbe42c373cc8d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$lc1=I>B27zJAguAo-U3d6}R3VG-L$w4lVfVpUWe^ d0LY{SJjiG0XJG95*<=SY#naW#Wt~$(695Z!B%c5P diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-17.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-17.png deleted file mode 100644 index b63bc9a987773fd800b05b0dc80e0d1e860f05a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$lc1=InZ@5gCZJH5r;B4q#jUpo4H<#FLkqt8=kmxe d05T~75AqrM85p~MHratp@pScbS?83{1OT;`BijG~ diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-2.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-2.png deleted file mode 100644 index 4a5abcc7e3b188e0bde9f44d2c79287ed31baf09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2390 zcmbW3i8~XF1IITrR~uz$n=9oEHTN;b+{b9IE3p_#k*iXh3gs{$45B_=o68{xCQ3)@?rLAGTsf%hDr4{T;wm^3p zPwk;yBWqnF*AQuZ1l?Sd3mYvI0{0mrej0&fl}QGxkvxF;-prFY%~R~+Y}#%^Csc(e zwM>Pj6<~tObMTM*Gyy3zD#-lh*iX5#`{rDO0<6)Le?bgFu)!8P?Qj=UxrqI)1X`)< zqp@y8{8@2Cxd39T7{Y2YNbP$n5s%tVP%U@_a|G=f6#An(prCwxMqm#&hw_m~X@Wf; zh3FXyUvEcfMCe90F6A7ps6}pXUQX_;N~RhvquaoE*K6M%V6a3ry9{<=o zvqHx8Z#&8KxxAKjW;Y?5gVsM_M^t4NQvn41y1oYngPsDANpoQma-e|c3HPQ*?X4u( zsSzW-OF+`Mk)atE5R!;ozXMkJ1=iN#8&t3KI3+#hdBWM&yQOfwPi7m5#exdDUMFpoW4Q3V5Gs&-m+#( zCOGD5M)|a<{Pt@<(>!FjzZ$}5?vsf(q$-O_ndWp!_w2_cuZUFaNP6K7ZStR(Q*+7T zC*!q127)-yp3&-RWn24j=OP^yUeonz}y5yZNPv#ZWGMH(gPPr+pdj!Yz_MrZ}5IIywQ$drPbZ*3oy;z#Ez-qXk zHaqW_4eZyB;x=YPsI(hm5{g|? zaf-?P3wQLVxfBho{?f8|X7u~%hc!MT*H7<7#sfcNuB{FIZE`x&62S$Uxc@8TqVeezrhYD@Oh^6;GNU6E=P^h?V< zhMHug6dDaUj)F+OSM7MH+pEs=YLY%Y8*Iw(Q>5wPe`($b3;3+&f+s9baUL)Q0SuSX z4;2Z%0jL+&Xf}O03NArj<%aK#)Ie@~Xk3L9JSb{&^JmlwY?{$n?Y zFNf+#YaR-}^t`ra+Hz2sa)2&FMRKtH>4JS0=*7^xypyZUABNRqWpkyCiLm6~-6Iq4 z=bvpVGd6zb#jtwcICrjN3a~dxK?h!T1@MG~MAf^Kl&ssGxCMJK=?*|lOlBxHuSAs{ z1fGl(6c?&&fF~F$7n)h_`t{cse*p@PpH#|`Y!KDv7kBUO6Lykv@Uc5V(X7QPGnCA9 z6})S$0D=zvup??&IwpJ5lIneiG@ez1`!_(gw|0Hp>AFYq-WkjpZ`j4?O5v$ zng*)=>SKD1A;z7pEIX>*uc?~@Rm@NfgNLT~<4nk@?33VbOoqy1h{!5>9cB&qa**?WyZDo=^g%(p~A*U@m-=c z@?W8*v=fBClPjaCWRBfec?^hpY#|*Wv3k+C4~4mu;2vkE^VDc%UQfJr%&n{~>>+)V z5#d=9ZDhQQnfkqXMYbe(>{~T{wo*-WZ}16!w#i%WJ0N*b5gwHa;Tw_b^1s)__j~Kq+*><{ZdZDOHeAb?{UlRnwvUK)ORFMV5{Ob% zRQ@6sP;R6BV%Y(z;i|hEZP{LfVp|~MyIZUt^c2|6@4t2^!upx_+U#D)T>oX-aut27 zYfU?B4JIl0&MgJeAGg1EtE9g>G$SZnCuD~T(6k(d*t4f*ZY(a1{?i<&ay}zX^lwgV ziollN5rx8{NwF|!(C6_`75EqBBxT0Er_ujL?MLJuoakjaa=6bO85c@Fr{qU#%;tT)RjF(Ek1$u33ip~Wr+8r7Yz}np2tk#4W^FM+$ BPPqU8 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-3.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-3.png deleted file mode 100644 index ea053bda1a403ca507870c2ad027ae6789b6946a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3464 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 R{o70cT}>lo&0WX1{{h`6U}FFP diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-4.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-4.png deleted file mode 100644 index 410627fd0d4cce78341bcdec12d284da7baf5a11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4771 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 a@s8&9eL56N^8tVBBqBJ}OutFjDegbT;=Ek| diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-5.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-5.png deleted file mode 100644 index 3a1398435db3f24e774ede4b55f3ab7c2418d34a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6418 zcmbtZ_cI(0)8`yc=akcX@1mCwoa6LPPA}1W3(-z5aRiA7zG?`fNAJBy4H6PvBm}4B zPPEtaH@v&EyE8jGv-8>6AGV|z>T8k_GZN$A;E=(!pvDgt`9A>>Jm?{1hp7ic;HaYs z#kv0<7x#R~e((_aX*~_Z!6BjkpWx!;70^F834`Ez8iY##Dq3zq;TtkN931*0I8@a% zboJ;zon#)1yp8A$c|J~`@0z{UO{^YOm$|TG0X-)rvLEdd%>?02^h0SSKwAdi(e~#A zac?IPC-qJs5xvsHTfjE_e60+-XB2l|D-z=YSqLp^vBE%c%0^DZ9XwFpQ*1qOfi5&j`J^s zt&f{#%WVhiqvFFV3$o8Aiw@$BK*ylts2y6tcL(9A-?TSHrcDic1MiU9X|ua zgwjG3oi+%g8jt^qMS{a#Y1-y$ z_Hm>W9 z^Ac%1`ydWzIsgEgfD%=~^6#e;L_J#|gdR@&u?vN}R1~ zX8P6uFm~~faNO=r@`6ZkN1-O`3}-h(=rzAGg<7a6kdkZgC_iI!W}R%r z4$g9Ii7mZyVZ}|Yy`}D`^-5x}^q_XEdFmtjM@rh#&8<8vD`_4&HsL{Fzih3}1L)EW zU{AYIHdaleG!(Wipkw°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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-6.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-6.png deleted file mode 100644 index faf33e7e28964b8e1a760151f0f89ee52a11b81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8845 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-9.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion1-9.png deleted file mode 100644 index 25e83b9d5d598c4e83f106b0e6f4ace92d9df566..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16936 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 bpJ3gg*!^PS{*QrYIxu*;`njxgN@xNAG?wxN diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-1.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-1.png deleted file mode 100644 index 480df024b07f068f4620a119f39e7ab5fa9eb14a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$lc1<7cV(Xr&?u%7PZ!6Kid%1Q#^*_giX8v=ey1G& z;|XrQa}{1Sg|G1f-P`-(b^G)nAsbJd+KCJnbyE^&DW70VSj|6=<+$kn zH~lwkGj{ygopw>|UHz^HpRP;qo3};qaxdeJTZiXgn^QF1r2atF2gA@ehG)Eks?MsV zEjc>B#%$j^Z;n-USN|6t^?#nc=;xe^AEFoiZd&2?Bx1wOKYs7#6}La1^T}QFsg=?u z#v9A#)qi^2vDdo&$tT{}e|;VOCt_Kbsunt|YPQVpxM^yW*I0J@zxONuulAlc6%m`g zzAMT(^)${p#3#tB%J<@$@B`;*-|sz7*)M+d;(P|6A1Z96jdYZoxV$a|PHyOvIyE7S zLG!&qPuE42yXSbeHN3qT(weCAGKuf0e30ZsNx_W^k2D>cbHaO->+$K~dw1}CQ)f8d zZOR4H=9WJ-U)z@LNjW-aj@<%pYo1S1 zulDb_Ij49>^*QgbkDm757;Nvb_-XrPK1iCL_rC1G>D4}aBLjQy7ai+boOyft)B^qc zOnLVi<-+H@3GY$sT%R^GeexN>*>-CitEC(MH!*a6s_%9nHo{e2%Kj4X)V!6uJ@IlK QFiA3ay85}Sb4q9e0Hn=Pt^fc4 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-10.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-10.png deleted file mode 100644 index 11183ee19d7706c8aa62fb1851b250f2dc92201e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2075 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 P%pCy2%-WP>?EdIKHN!Jf diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-12.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-12.png deleted file mode 100644 index eab21ec9b1effde06cf4d6a0d645420fcced7835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2494 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 bpZ{^kTvU290skQ3h$jJ4l!albzH`if8n_iv diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-14.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-14.png deleted file mode 100644 index 30cb78bbb160fb5c7bb08f1b093c2a553394aa2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2939 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-15.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-15.png deleted file mode 100644 index d01ebb74b1b483b130e7a5827486156465c89ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3159 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-16.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-16.png deleted file mode 100644 index c879e83ad6da4749ddaab56457c1a5c308ff57e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3388 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-17.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-17.png deleted file mode 100644 index 28a3d654d01a773a68701cdea9c34b45f34b7e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3669 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 OfRVnb-YXrKxc>on@4RRL diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-18.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-18.png deleted file mode 100644 index 03333bdf441d07a8d21df56ca2588289c4b09e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3924 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 V{H6MG%fGJy0Ha}`UZH9e{y)I(30wdG diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-2.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-2.png deleted file mode 100644 index 8455a9342409ba49c3daa563c9704df51412f698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$lc1<7&+}J1KQb^dJ@9mK45_&F_J(b~OsGiv$LHtH zN!b;Nc1wYYof}rDk14!6SHfV zB$8(wv1;MWsd;c+-$-oPa*1AV88ykrIzcN-fBuc@zkly-TUBiiL($DYRfmqDW~Y$|0=Hh_ywgqybNnjUb@7k!(^(# z-|+w5^UE=4w{4iSXV(-Mu0v(m>yo?O*|FvDFA@a=PcB@IFu~;EZT7 zzpp6}sodMW<$ZX>`sZ~{YLhqqeBBth-o@vcL~FJI`x%DR1x4HDvFjZODQmUkE=gN` z=R|#`nlgiV!?nOu8-i7roVTxh%dy1&FPEzSymYS#OH(C8c2;iAU??(VYJ*P9QZAmzAdbjd3l`ga-zdh8#9KTGZ?;}_)|39>#JblALHfx4Y>)zH>{$~ z8)G@{EH=9HaLN6|xBZRF8*Jv3G8@+YFP(pCxo_4(_ieND4ejHWZsVWQpvS|P@cMzG zVU7EVe@`DgE#pvpw$E&GF~38?|J7P^+t(Kb?QnabJgH#nggplg$~=xq3%m=``hOt4 zI=bf1*?Ej79;aS-R@GbZMQQH_2c11mieWF0*=|+z5BFjnP;cXd?mh8w*SSMIhR(KMXcNYx$fuU%?d~OPb4Mpl#mu#+d*t<@~pb{ akA2eCSIatnFR%k9e+ExiKbLh*2~7aF&wOtH diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-20.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-20.png deleted file mode 100644 index 244324df37a0295563680fa1ae21cf35580f0ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4496 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 XtQ_qmcG3RpP5_!}I;yYl*+%~l^y6X4 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-21.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-21.png deleted file mode 100644 index b694fb70cbeb24e706309fea8349ee81beb6a4cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4817 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 V$I!Kg|Cc=jP#XH`^{VKo{{x%O#k>Fj diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-25.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-25.png deleted file mode 100644 index 2b3abbf70fc6b7d236398624e403fc1312d259b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6255 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-27.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-27.png deleted file mode 100644 index 6709f409da92956617d4ae0f03915be388f28b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6974 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-29.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-29.png deleted file mode 100644 index 2f65762cfdce07193aad4618cb1d0832e8279759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7822 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 TzxLnf7(+uvNBNhcCH(&Y7J$N4 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-3.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-3.png deleted file mode 100644 index 836636aff7defe0e0b831e97b4193aaa140bc0f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1138 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 TT$AD-qz9-gzf`JKunhY@&lXJx diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-31.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-31.png deleted file mode 100644 index bc98120950bfe1a008ed8896892ec4958bb43ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8580 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-32.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-32.png deleted file mode 100644 index fc22f0da096bfe9a148b6acc4eb68f04237082c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9082 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-33.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-33.png deleted file mode 100644 index 69275c6ca02eb5bdfb1051ddd656d32e76932e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9505 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%0D|^iTEmD@A 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-35.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-35.png deleted file mode 100644 index 2d0ce7bb161e8472c2f2292d7fb3d20d57b8c509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10475 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-36.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-36.png deleted file mode 100644 index 31c873a87fef5522ce095cd3e764f69024752e70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11068 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 N6lK+98l}v_{|ENe%#{ED diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-39.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-39.png deleted file mode 100644 index 932ff3cf1a4cd9834723b9a050be846e78b8c784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12837 zcmb80RaYEL)2;^}d~kv@xLa^{cXtmKcyQOj-95qG-66QU6C45|NEqDV%li-ZUftET zRvq=~?t`kku8vkykwr%#LID5(=<;$>8vlIo{|t!uZygdbpZezzEfi&?03ZJw1-<2| z|02lFa{6un04mP^3HaPdptcpSyM9&u8v8sNulQ{rDgFb1yrH)S`mVh?yUNuv5w0GCu5Vo9P{M; zur&lP12S+*k`3Jm-L?1yC05C}(i*kkX1Ud*8xR(6nP8r|Y9Qb5FI$YsUlqP5e_|Mc z#jxmk$ZK8;iubE+-49ba`Tv{m;>nMZx9sNkLi?G17FV$!H}HTt(xqKV=flZ;uDch= zRKJIr07?q)mzZDQ`}Q!oMkW~sMj~Ujb);BvyW&ppQ8qNt z!ol$I*Ra@Xo&6JHxPrgtQ#{ae`I;7!((r0CnMK!8UUkN<2U`2J2Zexvg`o`Zhbl*w zwRa{ryO*mUOvB9xIo?j$AJV1t-@km5v0BQ~!R4S3_rzP2$�#r4hFSS3_mQP`o8+ z(4(-8l_%&Y7<|ka`+Bslep`wn!2;1kMb69uGgysLxyk}{Lc@ahdaGgU6rH{*vch0C z_ph<}id2|B)C5C~02IM{lO#7k4nAWRWhKYxGgugXD@r94wM+g3PYmvHG+)XZw~tGh zH^D+pY>g;DJ#baPR_<^ttI6h=)VWYxZ77p*FFT~vDYv8&@L&Df;>+!qG4i+PED4RP$ zN%3M`Lwh7G?ZCpumyp0Kk5YlGUsBi>O5|2;59H$h>6RluOhNl&nTFFE`@kK7#1DPpE$}1{fJ_IK zMMa@n;3-h0=kg4}mmopV=DaUd{=%M}HVJn^y^t~PhFeaebz z$ptIR=-y^^;c>Rhfpr+(P{8hD%zN%JpIOqTL50fD*pe#-6T=WLQoZRtLCl~~3g$r; zP-Pg%WH^TMqCrZ;__zOmiILK=p1)j7oOOU@oP%;9x3D&N(N6I6SHmu1cp=LMU!hxx z=)V~i`6EIz%6X@gzGq?`=Tof^K>yBFNReB+b(MhynY`a3C_s5-dLlT0FedtrqLVmH z9j!s*Poe7Ps#NZa;*+Q)>XDV5i5pvo?%h_Rn#1Wb84Qdq3`N!gSKxHPcp#HpXH@1V zb-85Lp(s2cDdeQ!B*hL&<~+YRKZW~p#BasSP%Xwd3g4)j?kTs;nF?xTMuSaEMcGX8 zuCDBXuS8BR!x2(}-8mf1QxK0Lb-c7AhzKDT=dmt@sJ8{P69D&b;CIDk$aLkaD$QIK z`ZM-I-!<39pR?CryjW46-?IGViCIhrn`7D#1MK5Sz5w5}tDw0hS6

`RrdL6uo2U z!5%EvHHu&HuiigP)E)c*pA;_WHOdu8GiM+>p)=s5Vbi1g(PRNSVQ9n~#i7`x7!6IB zMZ-Co6?z=Cw8M7NKo~suL%X;rT#ex z%Nwti@vRaUg@;cZ2?lm0uc$&V29a_Bu9vPGCWFX(6Cv_AL=fw2>)u7Z1nDyYs@DV1L zNw_APLaCKYt-!w>uB%IdFZ@<*c)TRkI~oDOQhi*5)H4d)eGkH-j!=B?K<07D33|WaErEle9&y{qdsqT^4J)w-ic-7>zO`@yK@hwZ5_`>R z^bw-M?!bm$#XXEVcUc;ZkCBV78b{y)AVIYAr1Sm_in$99gx6&nNaX!Ypr}l_sz2*H zjP*5su5pnc36|%Aj@m!&j_rD|>410DEC?^Khouzzle0en!7(HCMv@Q*HgH93q0p8o+L;-#XvjIwQj`q%#-ao#CV{CIJR*E3 zBjR~_THwnds+`bcZ3y8(jo5@pt&uB8d_H2S?m+!-hv5C|YRG{pwT4mgVil2l2w_S*EP1_;o@dW}Z`6DJH#lpF zy$n!CPy+x+;how4k%JncZYFLR(=bzv{LK_lda9=Eu{Wc=&SuHO6or=rQ{6x~@Y|9w zl88{>04|a+Dwu2@5zQGe$sIQrjL;9KsfL(V5rof?v^+&A#EjSQ8RDk7o?vc+^1`pA znB@(^Ue)yWz{(&X8Y_Zd4RPxS%zBugI^Z-5cZSWFO0Y#VWTHTw zk1gB|_eSR1HYyJ$INK6tLT}bIYc!ulY}g8>ad>ZoW#$etb?CcpjMQ_WM`rqLK4EXAC4Box!=EKp|L$UjC9U+yk2?ariTHRKSrz&-NyR( z^+(}Da{-WFweu93n{q>6W~#mZlH&q~cG4jmDoyI@Pf@HiXb%SJ*Z;}Zact&wSGvdlnv#)>I&PJwa(21N+t^y`=zPiTN4J%p|5+b^{GYjF zp?TZa9jedyhq(`Uce|OIa@gYnX0nbyyA(+{i-f+EX5Iwp#%#uQ1_}f7L~asE0EyLJ zb;ek)i9xkbqJ}x)$ugtJBiZo6a`NEVwTC~%s!ZwUO5)n=EzVU41O#ICd}b<(0_caP zwppStfqD2L>O<2A{XA=Ez^Qn|D5A2D8o(>KVU1n4KgK?*Xa2RWY6jT{4pP)<^yXG7 zrc}t-&lrBK7-vMlMFw5lL}E{HekYAa(hWLSHxD&Q2(H8G=?9PTdM?_cT&K%GIfjh;uvl}1s zLs=CtYS)S)!@kAxwkC!=4;-5;Pl45lIph-7=JpOsQh#|t7N{)$VOw*YvC`Th z2q?Io8Vv{TLPbBk;ND+E*;R1>*K%IZU#5TDl}5EvmpN#9PO|FTYEF<*>Qk&ESb1X& zR<|5xnH64B)r4qFSDu$(Y!fcelGe&h24Q&+GvsqH3j5ca=I9VFaW+3pp#!^Tez)g7 ze0xIgH8|7L7mRg*&CJ--)#U}f=Tp8Cg@m~*Td=g~vzU&=v{RTIm2SFtPYSlkmc#7) zD{UeU&gvQP$)(TRal$T|DA%&eP*1ADW4cc|V!i6Go*8dBJ3Ihh<;IW*1YsLP8ZELE zm*$hD(b@XxAiV>BL0%I>#T#6yKI* zSLPCs{{^<4R;^N&KC@{LpTitaA3^48@suM^2FBwJUWdD+%LR&2r;Im>^{H$z46O5o zOz%N7mQ|xwN}1dZr^*Kgr9al6%a9L-QZle~{$?uWi$zEgyp33i$7_HM8XMm{YP@9T zXAS(B%7=1kJ2#fOx4NY)nx$6}hki~s3@BNJs4M(-)}D= zbKkXVj3J`rs5_nK-hRs1bx#zae`Q*+2W)#y0VnJkd=&_2ojfQJ1$0Hg^Oeg!^hjvU zcTUP5dPXo%pO!GN*_43y{nRlpr?au;`C?bb5s0j|-ua?$i!Gr|8eIYGVj+BSga1pF zKH6=p5g3D$5gI7fvj0bKAaw7ssOs@p5wi4Qx_7~JPcQD=0wDYYP&acq{ljLEQH8|! zL|Re-;v8s71mT+tixcQEcBxN?)96i@afGjgk8XZwSdP)TeHn1}m-~ogcW>swlo-@C z4gPPZbGYww#c9CgNkEy#p>eLtTobW{CoMl??K&!?bu;4ThuzaahKK@)L>ZSN7?Tx2 zWh}%Kw__KTS#OAXrxfok7-TFvd0B8|EFm0w*y?1{x%CnoqE^@WG1GT-`^ zCug&rM3vFuF0u0RZaEgZX|p#oVmbo#D|r@jCc^nHKE8B&jc0H{#&4YAsPH4T=}mpO z{yX-!cZZoxUFv-bhXIvA49DLvO+c6!ekdz z;#MqdPbNNg(A;1@oLRfigWb&=egmfemfX*hXp|UB*x-%c>Mz;CHN61SUO+j%z&aE$ zWle6Gi7$vOyEb(bZ&f>YTPM>gJ(-PW>&az$@;?;TZ8cdK2o+5KA@Qp&0Yd&Rx)xJN zeC1HC7!gSwg2dOP3WSnHy#?B^f5OH%u2j*Erf#!;0EW=lU^N~<2a^9H`-hI(1-It| zpIY~ZuAY7H-r4UCu9`C}izh~nccPsDEOS$;TGqWHf_3h4+jPbCmXS_QS`i$Vt3rrr zJ+UPbh~$I*-<3m{c=w)ZCW3f^Lo38XjBI;h9JF$)9O1h0eNpF?dDiE63A0dt9Yo@GDQ>nj zB+D3vqe22G^|CQK7+`<2X+k5j4>WdX!p`L%;ZEgBOpWl2p2S>l@)i1esylnr=4Uml z((&WEq>5r=gwmDNTuFcFyRVyZR5Q6{Y|hUd^VlAAx}UX(XZ_bVd;QWBJa7|vh5JefAS+3pG2jV#S zgLeEb`Rs!MJpq!??s{N~VT^F?$+_&X$e?4{a4jxV7vT!R=1603kv4(dq`|XbZD-ir z^g{0E*lZqq?Kx>!R}6}=_%FGtEGNqLOKs~Vjdw8LOoCrV7!QqB6X^=Ik!h1@W=JiK zIfx7eCSA*#URSz)eGl~3Fc1@Q`4e!d8u#fW1CqbO*Vh(ic{Y#Ac=Rbgvf@#+Zv6xZI#^uYu`_A zjfT}QirRuow}ney#PD)RCDP_U*e~r@)_b!FR)2aRZ&7+OkBkG4JYXvd4aWR}(2^!$ z3;j&3{G5x+xh8+6{42QOZ~Af=q)Zkf#sw~0d6~{&1J9mPY6_*eQ1gHM$rc@13#_a)4XWPGil-);Jjq552uMp zhU3fQS_Z^HGm@{i1d^;!W|?`WO`P!UruSFR(CS^>W`F=r(c&xY&_i}Qj^v6Rc7Xx(w_{J(nSDhVP?S>B zBiOfA09(KkU0OnvfZh!VI7=4g!L2Y-aC`nkTD&$7`_9DPo@dR2^N*QH{WgCH!eq8p zbI*@JTevcKXkWK&*jqh523n%6YNC?pNr*0KsutmCDmldk0xd9atYDlg*-o#|`J3nk z=ou@aVA$#f`nWluZAq}k;PT4pe{TTqW$)X-*+5pFoxnxrvZE!uo_uQox9H;gZ&dd! z3`Y&Vc1p&A?3FJFw92{~e@_#Rdh9IFi##vFQo|^sOG>0Hmbc)H1V$_O<^sbSAs}jv zVDuaiCqzk|8vgq--m3cc#8k(`i|R2+FT&o+9Cc8{%t2ew?C+nnYG+{g}mr=rz{Ps-cN#j>Xy30qVD`&m50 zwo*=ddxYr=kJ~(Z1DDO=oy}m?F9P-;o%;G?aJ2q|%5@qHyWQs$`xd=s4qQABf)wP| z<(GM_I>CNj3TBNAZ)<179-tH>1tJ8D;d~fv8$x%+zpaPrUweBSB1}q8r5Yi*pHwv% z7L1M0(54;-YWXAO!TX|^Hth|zuY5kQAKL;r)h0I)=z zq6#*3oia_l8$~>t06|3w7^h~iAa6$Fm?PPp-?+jRZCtYRo19mP`RVAPaoOm0{@{ez zxlD)^(YhP?Zu0mY^HeR71I^93@Jk2!@{$Zm8X~Nvme61WL|NWOpHibCJ{{8p&m z9WJvj{ID42i_nWmfp6YOA7vGDGVl5%#e{e|->x%Fi|s_$)8U=98XM2f$KW?AUGAS^ z+}O)@%kR6bgr9R#Cr_eMMf~D%UXWXJ@>UrA7aw^N%^EQM5UZ-b^xb%1TK%=BfJf=c z1yIF(w>W@xU_nYR^(Wj5d~>d)NS!tQb@k4V7fG}BQCYeE1Jn7vt_AKkq#J$clACC+VB_^u|6h0+{A-lB zf3<=heXbk@yVP?4{0oquqJlvtZCF!M*1*KHxhFr&ckn65ccQ}|f>O|zyqo_76QF0% z(h@&HOS5wf6dmP26otvu)FV7{BNnlkb;;dD48*p7vC{%gb@oVa0Ql;~zxie9(KC%Z zF3BJFXBnKLBBf&YY=)muPF@u7iD}_{V*|y~80h~!eEcs*Lhj1yZx)?BBC9br^H%N~=vzF9HD;7W+ITCR8RhzUkFm!VJnlL49UWEL&>5!vHnH|tRO`{+V$dee-- zg1hl9eSl`u{QB$QYFxfAp^A94V@qEwC#G|gsxutzHr66ONgBQ>VZ>WMFTc>$FFqJC zvAyl;R^R6$w>VeTJVFw@9RlxBDRZPDvW7%AO&J;?LiKiwT_>%Rnzu<8Jxp($$E2Zy z`9rx{MEGVOxT$z~Lxh!xaFyOm4o%#It`K)ln8UF!D1eU4Y?wBEi{>C$C##_dHLYHa z6mv6=*kNDZ15Nk|{#gl?dNa>Y-HaPE%~%zRSm_#dX~cpJVwx z9hkYy4M;scbD>%I^_rRMz|&C#13B&2K-Dprw_7L`>lJnk;B#KFq+KW<8yXDF|hC1G5je#$|@zv^XxXaT`djo5vyrkoX!vz z(Il%?qxLgT(6N{{iPQZwr=MdU=IQhkJW@PuZgvZP6bTC4s1oIt^fQtk8F-tgaoe1Z z$YmkXC&(=6HyT^u<~5z^wf|vGPzu#iJ|6%U$ZCwAg`j*#Psz+?DMO&vCyjS;$QT+k z7FD5YO@?)*9C5hBOfqc^T_r+q*yIZxq6It0CxZCS=S2UutY;x?Kk_JRHLDF2A>z2E z{iLaUuJF#S+%-=@@6bc{{=xXDL1*JOb{%O$8f4HOFS?-gmKwNK4I}O)eH9E(lXVl2C6Q)8i*psgY=9{zLTle6N%gIEI zjky59M9Dna&{%-tUS!rIPiasXdpGk0oRc!@j?wrA3Guz_*oW&jsdV+@f|mMp3?4X} z;wuFTKFwdOVKSYBf68d{3;k1+-fLLpQxf^tfmP3;UmKu`jnR2`m4F0dv9COZ#rsc% zOYsq?cWz3I>~Trvacr*cLgoW1>p5CA+M0cDj$`D<7ehsf%J|#I3%^LbWIvTZE1$YIcaD-c?M*wa@tCcDW$&52 zszrYNTBWy~JZ($hbRLq{tyKlS)0_;&-mN7}WT~c_%m3cwe`!noF%F=h2>Z|E!Fi*J z<2!b%6LwLQguDt}USCEHP;y^L%hKOViGPDGVbmjeoGj`GzY@GYs;`c`;3j@syiQi- z$}2yh|7($+CfG#BgGEd&ftqk~eX%L8o3??y$=`47hV4J{r?8}A4j5fz=guM$+>?Q{ zXtJdQ#Mc&KYojBr;%`RyEn3o>acWi63l6WRt}GOO0gqQykG7ciRmVK4Fh5ZI>#pi- zgyCpBGNC6~xuO00VNGZU9b`fbp)y3#%~-UMHXLflf%*VS=Wr@fk>l~7LnABIdA*6~ zyqStSUh+cbylQEM>-}HaGq0TE5wm1g?iW#&J5A=~+kDW1gYbf9` zrbc5dzfon)uxG`0M4K0)$8rGilZxU!IVP#8b+Fsv+o*gneU>$c5?a6&A~0uN|6v56 z^(+y*=9&!0lJoOjsGDen$0_}ow1CZhfgVz#q44zrw|U%ckPFo zRL8CeNpJM|b7xrG<8g9Vgp&eoNZAM$x|E^F#-A24u`c=!YNsNc-{dHv?h(?c6h=3% z_tqnse^B!BM-B1+_{-iWk|Fy( z*%{8a{m2}kmmn_vX@EKSKlNvfLF-4W$#A8nK-p_D5ohJ(7} zQhBP}$`NPz5nixQM zS1F>+n=8u0lDXqVH;oRs{v6b}ypN&-^OWA-D**tkvj4FFk;7`5>1pH7uc7a^%s=aj zhm9G(CuKzyl}@zb<>MaMos<>d2O;o+{Hnx z@{BE*>W4NR>E7g66#_QV9wukp840hRJN(w4efuL&8VZxbx$?~|#gDd3Se~#eOXnQw z60JtX9^iTH!8!u!l<{pRlDXp-!W#~t9pGdlUqYArGE>sL$}win#P4Rd;12@3R z-v}R**_(bnIqw{2H|>mYMHl0<8&gB(5BX{GR72@=CVp*efki4E_A zkf+Me?(h;-ANHJvS}+nfTRvvvc!kL9-}n@=%d>BJ0qeWrkuM&~Rwk>aq1}m@G&(+A z>f0<$)RF;^CpTMISm2I~EAq%0>BMiUkpXH8>Cw3HhPue{F2YS|1#yzZPX30iPYwde zxQWJ# z`S1Eef2NloJN-azL}Qx&IqW)Wec*p}8mblUXvJJ|4Q3%PC^Ce9%LM+Ar$zB}p)RE} zKrsq3DGv5EA~{b$7^xcmYdfhj7`QWdity7lWU;O$;Iwq-r2Es1BlLw-rjG+@``Bx9*&|}arXQQAp`!CGVuQLV8!;!uI^+AY z+mzl+ud160htEx3{H^GEv8RFcnejw(o&?LIRyR9AlJH|+z7XAw$AM1YIw5c@LoFBnIRk%r67_B3PW zk*-^>PG7#DV7w5G?!7>-M1+X?w<&SoMN(8NmRZ0qu+GuJ0{USr2E$#-aynQmihDmK=aM7GG1S$`d3?5LO$UnPL z3fD|)eHEay=3@BPYJwNPJo_4&{U@vPHWE4^xlRIUOe%4f8G2fI*5h+1;H_55(FO~D z-I4s9aP)OtG7DApf`q-=pt}R>tLpwfkcV!bJfxOvza#SQA!#3L@G@j)OsQNhmn#Mp zzf~MBPn{Ra8d5#?2_VuM?LszAC0|4%vQ%;y#dr%kLWGzexhXoTc$ujUUdSgFL3F!3 zFy9{9PRY7-3?8PvETe3ecxXvH-&Arjb4x>QF81<?2Wzt^-PfYCHhmdq*3QpFY&hSu%S7+jTl<~i7Z;yT>q~Jg~t@s8{1$=la zzx<$}oBV}n&Imkjm&p9T=Qm5=o8cD*?PYoYrof7BL~5gB#varAA`8H>oXN~N8RaYW z@rDdu6cb{*lW$?HqC+SCrM0DTUeS{s;J|C#+tnh9-nu@nG5g?qw)|0vQ$oAHe?LySbusUPp!I? zJSpIl)enfj)2W>mb%Cp4r$FdCO-6{vziUa{ZxLDVs`6C37HLpzpsFDO-@&N2CN97& z+KUZD$!W{Mbw=AoXKl$yAwgbzC|;6(qvScv6(f3Q3PfDA!VLweGF^8pf+9(nWaa)| z+qy;udA$gIhyNQ7a3N;7uS~N?44`j8)x(ak&Nb0e^io`_;%9SUF|)zZB2hvkQ8Keo zz|93-1qX{i>5ea>NUlN5Dzf%w98=hKvDGFfFUjW(WfF}co(Rqj9wI{E@ z?<Z|W#`0|s zcO!-MOj+D&)5044aalPVzD7-Zu9uq3{Q-@rIl_>yoIsGmPpZ@43eEz?vWd~ zr1U`D!WMVZNM}pEJJpxn$@K0-awQmnG0@K91jQnleK!MRi+))o{>Lh6d805OFTiO% z0{`p)TH{)CM&KT6nT2*$_TFd2f`*#k$1S??>&vLk39L0J2Bh&8S&F}grDAc~qI|Xk z!ka?}z@^fA8?|V=0WAwwrix+H17lW&BkPh-Q5mQvq{DP>cYzA~g{p?B{{qJ0)f=iE z_5-evBBg#YR%9;lE*Q*Xc8OgC`v*0xLQ<$0oJJ37>JNL7>jbobisEDMqrM-m+GbZ8 zThs$6gXF0H?r)S^g}GWr!H!;FU%{H37j42dg(9zNXXTZjnKP3Y#EOo_kS{cK!}A`6 zOHWlWRQUY;2M$(e!q(ry9U+XJmYJ{Vz%z!CSst3^npyE4K$H> zjJ=C$W2YR@cxLFzQlo|0Y;tD;h7Xt0xTY1SP_}J@A9)yC`kB>EC^gQT^lJ~K!*wx( zje7{eM}&A0dkRtw9gmT=+yl=6N@<#`IwhMS3$VX%B#FujF0r*U7;{rBAOC(F=1&O) z2ZMHcQT{VUex3Ty=iQyAz!zV*F6mF$w=5b{%w(-Wm2?Zb`jip#|=qNA|Rg9g2 z1zRz^h8IOEphf)vy}ZXb+Ab$t)7DPB&JOf7j|6iM%e!hk1!p0r73urr(m zr>5y&F|IJ@3`|W3o-8(uurKXT9JAv2Vs9YDC|-)Hb;K$zA^{3@mP#MskdB4$%^wU}_%!g7%8H|vU+ zrJAzebS58TcYFO?+)w_N8PZ-S8N`wV>$e8Gme9t#SBX0x{*P9jirFPaez&EvD2^Im z(~wvxquGQPcx;F&kcFaB2*@Qb{~qfChK(XeJHwV52dp>UR8-V>8B{TtU_f1?yr?o> zlcKZ02AVx=wo@_Jej)o2McuUeCu2&BY13YW5qM#m6rOU+Ktnyw0yzzZ7es}g5Ul(p z>s?C&Wp+DhKUitQLTe>!sxJNEb(s=_b(8dbKSb+o4!|Rlezg8;FG4`iFJw@Y-Q32Ejs zzT`bgRLaj14A@Lp3ZO7)-$>jD3R+;M`M5>-fyse#nz$Y{YB!DsU0_%XQOFq7uZ5jhigg>R5LWuk(W&Okv}{m%viwP%sM z4yTki4#N)k5sBi%6zF#z1F0>I;oXF}Q%lx?VB&N4N&{2N@V^4VH))6c22(hAdEfJX zlR59V(Ag0NS+Y!z_6kiDVvgYeK7YFS1SIP%)XTN4>KkPpkrF7?936L>u9%Ecmm@y( zh;#VrP$D$Rr(n*(r=d+DB|ncKqo1NS-yETCmn1pVE}QUn=~u^nB;esv^~*~Zl53bF zSg)w^9nu2Yl85^(dXI}E-&d#4XzBUN3EmWYiU|`ue?ksbA2HnSy8r6wIrk6#HUnq< zf`ltLmznb@4UPP2sYX7$scoxcY%y=?J5uHSxbkq4!0`VH$+M^cm zP7lY$xQPRsnY$V7zFDo>a_`k~<~|pT$y$o!b0vzBt0Z@ocd6mk%vl~WutS5Or{?bL z;nDf_&z*m%&yW9jkQ)^`GhL=)mrT>2;)xh)mc}zA1Vdb5 z52d#W7~zmH?1ah2=sAFg(Nv1nj!y$Rd+h=lm~{ws?_V(mrj2UH?(TJcrU`TWy06e@ z(iLM`V8$^6fBC#IMKHNp8Vqi=JYocP=GnNN`%rn^t_`wTyw5QiJ)M87=D-ddYJ97H zH4>Ytw|v~JW=gObI%tOLFBfMw{N+Ot2Y)X2GreF1r)H+Nfp9stbLj?cGi1BA|B^fI zhm5eeCds9=C`|v{3gWVucXeaADPrGUtE!j&x1E|;>fO^d6>YB1PhnSc41jlhP!`-! zJaJ^C`m87Z?~Ai;-65BjYC3>-irHi0))Vrf>i_cxh(P?e57nu$zfgp&l7AmM0P@l* KQgsq$kpBY)=?<^} diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-4.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-4.png deleted file mode 100644 index e41c63b203a74ef557de042c19066441944f070d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1225 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$lc1<7ALo-BcNrL1!aQ9ZLn>~)y>&iYCROJ6$M0v} zoq3aHKHGQq>|C>ze^b}$ibh9IjO${zy|P$nuZJMNEmu>$gH6S^2P^08;S_CYdf_U# zbZgg9`3SElU0=`1Gjhtze^;lKrOWYubf4-}EO_(l=O#;@&o%s?ZRS6(teC+lNDi3z zzs0b4oni6275kU}-7kHEyO^{1_tYtd#hl3-&e&`-jHu84{8_Sp>m{D;#g~tr=`WFw zRJMPRkXW}r(suf>{^KWaL<;TmPd0Kqc-z%>-opI637=Q_wB|~Aitqo;l6WDZ{B8B= zUkX7CZAFsy&o@|X6c(-)`D1psq))-h>ze)rv&SwnDw~dPIOD1F+~{#lv#johhbc3Z z7ChFU#5G&QXkqGJ;hrRURrji2*H2~cIi!bKQ*{IX2Pp6R2%EHT_eO?J~y*K2H|4vZ33uSMDQH~Z|5PQBLrbcyc`&4l#$XD1$4 zKdemPS#j{3{I`uCpV~z^&Q+-GOtDva8oA_H^^!W-o-Fa+GKOVcwQQ?}fBZbW#x=6( zU-y({{=qiPb9OCH6s!>As$Nj=QO7*|+oPTHFLtlWDJc(rTjE~ID)Bb>K;KU>zkh6X z62=|N3-73F+I{Xnxc|EHfyfi7e!*|wExE6KVa3^?*##v$GG3qgPG4oXyx&{N?%2ZS z%!*fxrm8neg@W#JCIu^*7xo6{Ul(mi+_EFXc;<~(Ng3APiZfXETPyJZbb$R&mx%=i8e_8WKwqReVS z2`~TS6;DM^-Bepv)IROMWlW{R+3}dqiK)WLqt>zQk>3x7+{Z3#~g@&QIn3vDcIBo{nwt zq!YHs8r$QWgdKPz*y{zSNv*!|QFPC<_AhHyAKl?fo-4Zg&$|=r7)}QAGqeY3S~dSw zxg)f8g?C16ckJIj)%wm4zeJAld=RqrFgda8`pd0OznbSCh+TZsqu{{j9z)yHn|hcG zdb&!RPj0!vap}oqGu`ceb{88D{+^L_;8_Icq|~C1qOX>!TrTS?+vcZrtAF;}jdDkP z_GUKt<}x1M!78Csk(~2--Q0yiZ;fX3a2~pG>-)U?Gpir3nW?lisnyHcxmL;l&YBMy zYD+|?yo@rgm>GTTNp$&yMBaljkNRKlJHLKj`LPQd`X#>f`P{Yfhu!KIb&vy2 c?0;(hWy8GvvlB!FfQ1f&r>mdKI;Vst05BXX*#H0l diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-40.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-40.png deleted file mode 100644 index b25365ea87f52fd30b3fae5168e7ea1c577a0364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13464 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-43.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-43.png deleted file mode 100644 index 52c9327f28cba37496076de68715f860f928cbe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15790 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-44.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-44.png deleted file mode 100644 index 4251d580527d49c320dc7cf18df56bc5f51aefba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16608 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-45.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-45.png deleted file mode 100644 index cc4093b79ce9d95e2054d40ab8d0b612a55b5553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17417 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≠1V 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-47.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-47.png deleted file mode 100644 index 20747527a43b9369125e7d8543099cd1c295db59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19130 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 JPDHLkV1jy1Q|bT! diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-48.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-48.png deleted file mode 100644 index 2518748016ed70690858d1fcb19013777ad5dd36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20011 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 Iy-r;GA5wr(sQ>@~ diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-50.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-50.png deleted file mode 100644 index c626514ee4749a8dc52383b4f8a08016b6ca0e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21664 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-51.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-51.png deleted file mode 100644 index 4bf3a5fe46e2994a949a7214626a77aa1deb0a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22594 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-52.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-52.png deleted file mode 100644 index 6bb9c7ccff560ad1e5b11b9194183227bfa385d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23543 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¬((D+8{;#Rxpu2sHnj?R*l255#f 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�m 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 Xufj-j5u^eV00000NkvXXu0mjfur=Dv diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-58.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-58.png deleted file mode 100644 index 41ecd2efb05ec4f69611a16899b91b474075e5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29323 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 Q|j;wLOR1t$YS{1vFZz4 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 JPDHLkV1jB12yp-a diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-6.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-6.png deleted file mode 100644 index d39c24622d67858a7586647b6d29041fba62daa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1418 zcmb7E`#;kQ0R5Ua%(FaJE^2H=Nw{1l5hky=Sy5b%d3-)B=AE(f7ZEuuGcgCa)>;UarR`H;**C>rd#M&pGGwIX|8s4&{=ElOj|T3IKqji!&M{$@FiM zg-E>DCWs>mNU)m|8W4YD<@0)~q>+np_K61odDU-{0?KHIC8bP)i@T%DDCnR%Qe|^x z@dW^YVJ>L9D@oinu3Na@xOV@Bpra`ncR@MA(C3cVS&Y^%anAF#I2aDs{l*=JWM>^X z6b>6WnPcA$A4y5{|IGNe4yy`Xt~Nuk-#EHCa|=Qj3XR(_lZD9S(1@j>LHeGR{}V+6 zJj>|U#J(=&!Rza&nBmSJ-`J+e4`5#9m(#GuW5Eq=;+>%V#SHHh z66c=NV^O=sdPvYZ6kC`x6?Cl4f2$+TRIgFqT>E!>Ccp;qtjr&fjK zGN3GHkDajXFy_V_+%%0;8_~Roj}&-9kg$FfYfa};tW516MiqX7_$`~>(IG8Lm?a~5 z^e#_HJ>65`{H7o4`Z+9*UaeZuw>?zAK!=wVW$I}uM5yiRQiqs-1yyt>EluTVn&6Xobx4Rk|MYcFt=ZBb==g{)pbaol)kbQz24S$haRiO<( zGuXnkR5YKl6v`TZ?#Q}4vnoorBdYeNRZwn~&0fjzu&Ae>0`%r5sKs>e(%L|zYcy3x zc?L0zrJpne{S0i1t7a{Na2iqj*Na8d8dH7UOgU=X-8{FD4i&8t{7h^~0Q+O_u2CYPC{eY32mlGS(HZOA2@hhppJ%0^HO%rP@}-{{=^>?9CT!dURCtW&8*(>)G38DC^}FDZ|!1 z2Z-mZGb8+D6H=(Hh#FTcKVK2N>(P15xZz96HCUxGvSth z8`TBYTWxA;-%KC5r{~h;Q6?^9FE?}1>e$dnEL6#33b-XQxK&6d@^Q zK-e>uUP7f&YKKpcgl3>HD{p5tvLoDmMKs^e+tH?DJhO*DjURaW?27PXyJ#=yAO8N- zS5J!mYadimcQI*1=@tkUT}yjf5Wn%vA?5X5ff*)Lp?4#(x3zs1hxq=NK`(GVS?B`O U#|IJiBFSq4E{-1PMtf|=|G9~n_y7O^ diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-60.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-60.png deleted file mode 100644 index 7de79a46c41dbbdcf43602645c8e203287466efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31004 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 z 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-63.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-63.png deleted file mode 100644 index 21311d1a88c55282396cc0dcc13ca88956f6b7b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33011 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 LNkvXXu0mjfH_eV< diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-64.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-64.png deleted file mode 100644 index e5ad72ebbaeaa6b1e9fd7ea34a3e6d8448f9e122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31551 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

xJi!g!5>;*gCg{f-DL(8SxC> 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 Y4J+R;u4Da(I{*Lx07*qoM6N<$f|qXH)Bpeg diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-66.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-66.png deleted file mode 100644 index 906f942de188558ce6537e7f2505cc639e52336b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10905 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-67.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-67.png deleted file mode 100644 index 2bdb6115b07a11aeaf55bf0c95a6fae258921045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6613 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 diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-70.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-70.png deleted file mode 100644 index 44b0af3a4693fbb9210b8c705f49efae4257d847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$lc1=YnBh`k51>$(r;B4q#jUpo4H<#FLkqt8=kmxe d05T~75AqrM85p~MHratp@pScbS?83{1OS0zBW3^q diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-71.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-71.png deleted file mode 100644 index 714ceb099601ec63e621031a8e2678376b65788b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$lc1=YxZ5J-dqANuPZ!6Kid%0F8ZrWThZcPG&*hO{ d0Ax}E9^^ChGcb1jY_bEH;_2$=vd$@?2>{XNBp(0( diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-8.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/explosion/explosion2-8.png deleted file mode 100644 index 4cf48c634dab2f609e8d79bf794869f59ea0d56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1742 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 PhY7%0;VrAoi4Xn*IYxms diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/.cvsignore b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/.cvsignore deleted file mode 100644 index 085e8ba..0000000 --- a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -Thumbs.db diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_0.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_0.png deleted file mode 100644 index 7ddb683e3cc1519e858029e265f0a0729128876e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3859 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 VE@Ts7uEGES002ovPDHLkV1lt%b;SSx diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_1.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_1.png deleted file mode 100644 index 5d683a21631577febdf6193516f4299aa722ca0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1532 zcmV00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru)dvd$A{{OC=#2mX03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00m%4L_t(|+Ra+qa@#f# z-LrrsOR{7)PR7ople~2LPkrsL^jDj~ z#4o@8cG%xldCNY3gFpa*e1{iAfU0C9OA4qe@ML>6$}A(> zr{+NNHBS$~z=(*dAv2N`rfDhytvpVV(PZ-Dr=Q0sGYVTj;`jt!`4Ip7<#~b251;0X z^THamh50DtXf&QoX1m??;@$hrw|_V5Re-tSK?P{Uj9pMP#-7YhlS8sRdt*oA>wo?N zl%y7CCetiCq{(jkaIb1+^W|*52yhk#--wi6m@+#s-S4*d6ilb5i{-hhq8I}rlq@;y zwpqGWV^`N-r_=dtzPP{LNN6lnasb-|q)P?I2r^3!yW8Y`0o|g21=tjqYp|Id2Z1f)r^Pgx)Xsqbgh65}V%(ge1FAx>AfPD<*LJSZh5P5ub z2el&LQzmKvoMmBiZ5fxLynrY$A@_uWdK9dLz;it?(6PW&qmzCJ$VP)VdkC8`$nU_2 zj0GqRfV#5^Mo#H_mjZU3f;C?fQFkToQ?Mu@6`amr6m+j1J_S(x)6IoRb{sfJ5pO~O zd2$rOku(sAL@R+P>DGde)@DT58iSc|I0WF77)RRYlsnwy>j!|EqMY_usEcD zOvPk}u+|WZw3SRoWREy<)f~ilA~T&VFi<=c%OC(U4uRoZGg|ttmwM#K%cmW`y}02DMF@?s3id7G&Lbe1n|@jjQj$o>CXWrHFBja-P$RSdBq zfmnf?RlidmVaw8^ zZTYAE35~FJm!6)&jC@gXvz+qITs!H_$79G0i$--Ti~0~?u;K7xX%=mXsI)XH2)r7V z!+^1(_4>@C&%I3PL=R3{Z+d-AJzofmaOs=7yxfzlM}7`;Ruf=V^y-joykP7a&ZvJy zq)Bp$ukm(8UsPfzU>E`~lZ?=7+IsH*4I)C{h4fuxfc-&0knk*LJq)G5E7-nz1Qk>nXRt>9*xHr@2<*Ot@g&E7k=l#u={ny+Pw7+F-;D)H{bq9 zll^A1O4H=({U@l_3K^^jvUI<`{tUtGdPHh0_^6ezkOTcXs*gX6K*+=G<_pB!sD+v= zO$D$u4=@x-lbwi_v`<^f+CE6n*KmwL(j*bd1ljX0opm+BM)2%i{afQsGc+m*6)_@O zIwMPyeU>Iw-UeG}nxg41nt4y>*Ci+dQ|jhOyT1PY_~X#K6Bx4T4Es0i;`}N(>>ln` i^Tk^=ue3=q;PoFbz{00006VoOIv0RI60 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 LNkvXXu0mjf;O!wC diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_4.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/ground/blue_metal/blue_metal_4.png deleted file mode 100644 index b5f114160170f8034f7428a28debfdfbc01e738e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4540 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 Q?f?J)07*qoM6N<$f~EeBh5!Hn diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/radar.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/radar.png deleted file mode 100644 index 29453c30b5929c5ca6cd3d9212953832a8ee9ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmV-H1HSx;P)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ50008a zNkl@g! zKmf6@v2jWu3tqo|1;uh8&Ie)x5XZ#C1T1*=?AZ%IYU2O@{~us87-S|u0I{&Mi+=s~ z?d^IXKM+km!P(h)zK@R&0~Z$;io~~X-yF7V*;2sB$e0K;d;zkYy1M>)E-ulp00G4E z?%mxr5)xXa&z@Zg2a2zR$~*Y_`hpGJwd**;+qc3f1`7+nWe5uk16ep9X!rx5;RitC zva+(_Qc^m;FJ4^h1_&TV6BApI*l!jVe#ZCjA8iJ?{L7cOhwAF;Y`1JV&hYrLJ_9o| zs*C^r{RTATB7={QB|}qF)8Qvip4e$<=&u(Pl=J=b=i~p=rw_3L1Q4T|8aT$=rKQa( z1O;Uoo<80Fhlz=iMOj%67?wYQuF?QXqZ$kh3}A5F0HzjphP!tkG5q`Y|Btk^C(HZy zkAeD6b=vju z82I@`7&tkF7?hPg7+6_V8LnMB%y8ktq&pWc9#sXY0SF*Q0|P5$J-2mqB2=86a~T8$ z8GxD@7


2BEt5#}5XE&z~89mNGEBf6u_Mckg6|D_2(BIe#8vCZQy1^hY zM_5=U+1@^nL0{jEK|nwNMe@Uk4-6MC?qWE2a1t=ZJem98!GjcZ0{{YuQB_qHT?`&9 zGBPqMYHDf>OiWBD694}FW4Lwe7SN?n?f_}51^@&Qqnw-^E`vd!T}VhMpP8AN6It-@ z-@o7Ay?ZwiSf*6s(g+YhjKIW=&tS3vKmaijRze;C2q2mn3=m)dipK1%r_nen00000 LNkvXXu0mjfmc>^) diff --git a/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/turret.png b/代码/workspace_robo4/robocode.ui/src/main/resources/net/sf/robocode/ui/images/turret.png deleted file mode 100644 index 354febb7f454aa8285dbe089e11b956d8b403c23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1188 zcmZuxYfw{17~PxPTu^TGrlTZ)#hWS*D?^A#ilTBO2#Ey*#@a9{4QWlwG*ey`OeD<> zF9TWz149%Uh>T?rt;3^I0U2Hv)t36i(0N7GVWFo|MaEM$nINyHK9s~jXSR5+`pt&^Hkx&j}@LhH7(jH`gDiU1OhU&pKrr_|hxq zX)16f-E)l;fxXq1Hd#7fr82);KYb4nR1AuL!{F4^)W~tx&gJa@C6bw)9Uaptfd%a? zW;4mD^`=4Jr}Ctv`}pVFxN|`^|2?|_a?9Vxhc&xP`_H-vBxwDsUo4hm-`~5ZkhN#} zNZ6Z-_>yLvpaP6W<8r`9V6d~ZGq|axWgC&`#sEm9e`PUaU|=9!M1hMuLyhlP^^S-Z z+selMG8`}r0fI-vM`4Z3rTHWy8&!r^X9A>PYhyK)H^y_+B-B<(rdMP2c$onkrrtkOG4GejURx?mj-p3OHf^TK>@lCo9N70 zd!}3K!0b$vC~-U6$`@jPB%Q&{G02Q-?k*ch+l{2>p$qW3U8`gi+lU_p0zDLx{X7>(baD8 zp2ji*0~4+7@78ro`pDg67a2?`5tImhoRN`%^w0Q710!7E8X)N&EU#~2`n!ject;EF zSbD-4#|h|I<+o{*d9ltH3v8l%c1Y*^BL6Np&mt%}Q(UieWE=GP5ocn!dq7nRt2C7c zd8cenr*3dfbXl^D$3O|Us}+R1QnCE{!Y-y*!w-Btu+pYYz8n1fTte}|UdRY+b0g^~ zpSE+nu>Q`R?mL-$i2#RoPEeAV^4VjuWj&yPuuJpz9AZF9{@56v%-Ce-N_m%DDlzej znBm%R9fiG3s}N~Rs}8lNrqmr-vfn+No`7ZX?*!0*anfU5*vS`v9=kJCA_wkQH>+R# z{PkgZSJ3;A;ij@?Z`lL1ps?^_0c#7GF~4`^kbeIKHbBt*BJLI;j#3)2k{)5Wl4T|V z9mC~t_zx-K#B)2_&;iAqF(2{^K`4;W^&5;1zC)07!)GLnf2ClXcIe?tIL<^EhB*ut jv#?QDveC=+{}VAVy?)eUXq~ - - super-pom - - - - - - - - diff --git a/代码/workspace_robo4/super-pom/pom.xml b/代码/workspace_robo4/super-pom/pom.xml deleted file mode 100644 index 3a29487..0000000 --- a/代码/workspace_robo4/super-pom/pom.xml +++ /dev/null @@ -1,179 +0,0 @@ - - - 4.0.0 - net.sf.robocode - super-pom - Robocode Super POM - ${robocode.version} - pom - - Robocode - http://robocode.sf.net - - - cp1252 - 1.9.2.5 - 1.9.2.5 - - - - - net.sf.robocode - Robocode Release Repository - http://robocode.sourceforge.net/maven2/ - - - - - net.sf.robocode - Robocode Plugin Repository - http://robocode.sourceforge.net/maven2 - - - - http://robocode.sourceforge.net/maven2 - - false - net.sf.robocode-upload - robocode release repository - sftp://fnl,robocode@web.sourceforge.net/home/groups/r/ro/robocode/htdocs/maven2 - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.3 - - true - - - - org.apache.maven.plugins - maven-clean-plugin - 2.5 - - - org.apache.maven.plugins - maven-compiler-plugin - 2.5.1 - - 1.6 - 1.6 - 8859_1 - true - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.5.1 - - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - true - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.9 - - - org.apache.maven.plugins - maven-install-plugin - 2.4 - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - false - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9 - - - org.apache.maven.plugins - maven-resources-plugin - 2.6 - - UTF-8 - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.12.4 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - org.apache.maven.plugins - maven-resources-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - - - - src/main/resources - false - - **/_svn/** - **/.svn/** - **/.git/** - - - - src/test/resources - false - - **/_svn/** - **/.svn/** - **/.git/** - - - - src/main/java - false - - **/*.java - **/_svn/** - **/.svn/** - **/.git/** - - - - - - - java8 - - [1.8,) - - - -Xdoclint:none - - - - diff --git a/代码/workspace_robo4/super-pom/robocode-license-header.txt b/代码/workspace_robo4/super-pom/robocode-license-header.txt deleted file mode 100644 index ae134b9..0000000 --- a/代码/workspace_robo4/super-pom/robocode-license-header.txt +++ /dev/null @@ -1,5 +0,0 @@ -Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Public License v1.0 -which accompanies this distribution, and is available at -http://robocode.sourceforge.net/license/epl-v10.html \ No newline at end of file diff --git a/代码/workspace_robo4/tools/.gitignore b/代码/workspace_robo4/tools/.gitignore deleted file mode 100644 index a65b417..0000000 --- a/代码/workspace_robo4/tools/.gitignore +++ /dev/null @@ -1 +0,0 @@ -lib diff --git a/代码/workspace_robo4/tools/.project b/代码/workspace_robo4/tools/.project deleted file mode 100644 index d48fc19..0000000 --- a/代码/workspace_robo4/tools/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - tools - - - - - - - - diff --git a/代码/workspace_robo4/tools/bin/ant.bat b/代码/workspace_robo4/tools/bin/ant.bat deleted file mode 100644 index 6d57c81..0000000 --- a/代码/workspace_robo4/tools/bin/ant.bat +++ /dev/null @@ -1,226 +0,0 @@ -@echo off - -REM Licensed to the Apache Software Foundation (ASF) under one or more -REM contributor license agreements. See the NOTICE file distributed with -REM this work for additional information regarding copyright ownership. -REM The ASF licenses this file to You under the Apache License, Version 2.0 -REM (the "License"); you may not use this file except in compliance with -REM the License. You may obtain a copy of the License at -REM -REM http://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 This is an inordinately troublesome piece of code, particularly because it -REM tries to work on both Win9x and WinNT-based systems. If we could abandon '9x -REM support, things would be much easier, but sadly, it is not yet time. -REM Be cautious about editing this, and only add WinNT specific stuff in code that -REM only runs on WinNT. - -if "%HOME%"=="" goto homeDrivePathPre -if exist "%HOME%\antrc_pre.bat" call "%HOME%\antrc_pre.bat" - -:homeDrivePathPre -if "%HOMEDRIVE%%HOMEPATH%"=="" goto userProfilePre -if "%HOMEDRIVE%%HOMEPATH%"=="%HOME%" goto userProfilePre -if exist "%HOMEDRIVE%%HOMEPATH%\antrc_pre.bat" call "%HOMEDRIVE%%HOMEPATH%\antrc_pre.bat" - -:userProfilePre -if "%USERPROFILE%"=="" goto alpha -if "%USERPROFILE%"=="%HOME%" goto alpha -if "%USERPROFILE%"=="%HOMEDRIVE%%HOMEPATH%" goto alpha -if exist "%USERPROFILE%\antrc_pre.bat" call "%USERPROFILE%\antrc_pre.bat" - -:alpha - -if "%OS%"=="Windows_NT" @setlocal -if "%OS%"=="WINNT" @setlocal - -if "%ANT_HOME%"=="" goto setDefaultAntHome - -:stripAntHome -if not _%ANT_HOME:~-1%==_\ goto checkClasspath -set ANT_HOME=%ANT_HOME:~0,-1% -goto stripAntHome - -:setDefaultAntHome -rem %~dp0 is expanded pathname of the current script under NT -set ANT_HOME=%~dp0.. - -:checkClasspath -set _USE_CLASSPATH=yes -rem CLASSPATH must not be used if it is equal to "" -if "%CLASSPATH%"=="""" set _USE_CLASSPATH=no -if "%CLASSPATH%"=="" set _USE_CLASSPATH=no - -rem Slurp the command line arguments. This loop allows for an unlimited number -rem of arguments (up to the command line limit, anyway). -set ANT_CMD_LINE_ARGS=%1 -if ""%1""=="""" goto doneStart -shift -:setupArgs -if ""%1""=="""" goto doneStart -if ""%1""==""-noclasspath"" goto clearclasspath -set ANT_CMD_LINE_ARGS=%ANT_CMD_LINE_ARGS% %1 -shift -goto setupArgs - -rem here is there is a -noclasspath in the options -:clearclasspath -set _USE_CLASSPATH=no -shift -goto setupArgs - -rem This label provides a place for the argument list loop to break out -rem and for NT handling to skip to. - -:doneStart - -if _USE_CLASSPATH==no goto findAntHome - -:stripClasspath -if not _%CLASSPATH:~-1%==_\ goto findAntHome -set CLASSPATH=%CLASSPATH:~0,-1% -goto stripClasspath - -:findAntHome -rem find ANT_HOME if it does not exist due to either an invalid value passed -rem by the user or the %0 problem on Windows 9x -if exist "%ANT_HOME%\lib\ant.jar" goto checkJava - -rem check for ant in Program Files -if not exist "%ProgramFiles%\ant" goto checkSystemDrive -set ANT_HOME=%ProgramFiles%\ant -goto checkJava - -:checkSystemDrive -rem check for ant in root directory of system drive -if not exist %SystemDrive%\ant\lib\ant.jar goto checkCDrive -set ANT_HOME=%SystemDrive%\ant -goto checkJava - -:checkCDrive -rem check for ant in C:\ant for Win9X users -if not exist C:\ant\lib\ant.jar goto noAntHome -set ANT_HOME=C:\ant -goto checkJava - -:noAntHome -echo ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME. -goto end - -:checkJava -set _JAVACMD=%JAVACMD% - -if "%JAVA_HOME%" == "" goto noJavaHome -if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome -if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe -goto checkJikes - -:noJavaHome -if "%_JAVACMD%" == "" set _JAVACMD=java.exe - -:checkJikes -if not "%JIKESPATH%"=="" goto runAntWithJikes - -:runAnt -if "%_USE_CLASSPATH%"=="no" goto runAntNoClasspath -:runAntWithClasspath -"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS% -rem Check the error code of the Ant build -if not "%OS%"=="Windows_NT" goto onError -set ANT_ERROR=%ERRORLEVEL% -goto end - -:runAntNoClasspath -"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS% -rem Check the error code of the Ant build -if not "%OS%"=="Windows_NT" goto onError -set ANT_ERROR=%ERRORLEVEL% -goto end - -:runAntWithJikes - -if not _%JIKESPATH:~-1%==_\ goto checkJikesAndClasspath -set JIKESPATH=%JIKESPATH:~0,-1% -goto runAntWithJikes - -:checkJikesAndClasspath - -if "%_USE_CLASSPATH%"=="no" goto runAntWithJikesNoClasspath - -:runAntWithJikesAndClasspath -"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS% -rem Check the error code of the Ant build -if not "%OS%"=="Windows_NT" goto onError -set ANT_ERROR=%ERRORLEVEL% -goto end - -:runAntWithJikesNoClasspath -"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" "-Djikes.class.path=%JIKESPATH%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS% -rem Check the error code of the Ant build -if not "%OS%"=="Windows_NT" goto onError -set ANT_ERROR=%ERRORLEVEL% -goto end - -:onError -rem Windows 9x way of checking the error code. It matches via brute force. -for %%i in (1 10 100) do set err%%i= -for %%i in (0 1 2) do if errorlevel %%i00 set err100=%%i -if %err100%==2 goto onError200 -if %err100%==0 set err100= -for %%i in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %err100%%%i0 set err10=%%i -if "%err100%"=="" if %err10%==0 set err10= -:onError1 -for %%i in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %err100%%err10%%%i set err1=%%i -goto onErrorEnd -:onError200 -for %%i in (0 1 2 3 4 5) do if errorlevel 2%%i0 set err10=%%i -if err10==5 for %%i in (0 1 2 3 4 5) do if errorlevel 25%%i set err1=%%i -if not err10==5 goto onError1 -:onErrorEnd -set ANT_ERROR=%err100%%err10%%err1% -for %%i in (1 10 100) do set err%%i= - -:end -rem bug ID 32069: resetting an undefined env variable changes the errorlevel. -if not "%_JAVACMD%"=="" set _JAVACMD= -if not "%_ANT_CMD_LINE_ARGS%"=="" set ANT_CMD_LINE_ARGS= - -if "%ANT_ERROR%"=="0" goto mainEnd - -rem Set the return code if we are not in NT. We can only set -rem a value of 1, but it's better than nothing. -if not "%OS%"=="Windows_NT" echo 1 > nul | choice /n /c:1 - -rem Set the ERRORLEVEL if we are running NT. -if "%OS%"=="Windows_NT" color 00 - -goto omega - -:mainEnd - -rem If there were no errors, we run the post script. -if "%OS%"=="Windows_NT" @endlocal -if "%OS%"=="WINNT" @endlocal - -if "%HOME%"=="" goto homeDrivePathPost -if exist "%HOME%\antrc_post.bat" call "%HOME%\antrc_post.bat" - -:homeDrivePathPost -if "%HOMEDRIVE%%HOMEPATH%"=="" goto userProfilePost -if "%HOMEDRIVE%%HOMEPATH%"=="%HOME%" goto userProfilePost -if exist "%HOMEDRIVE%%HOMEPATH%\antrc_post.bat" call "%HOMEDRIVE%%HOMEPATH%\antrc_post.bat" - -:userProfilePost -if "%USERPROFILE%"=="" goto omega -if "%USERPROFILE%"=="%HOME%" goto omega -if "%USERPROFILE%"=="%HOMEDRIVE%%HOMEPATH%" goto omega -if exist "%USERPROFILE%\antrc_post.bat" call "%USERPROFILE%\antrc_post.bat" - -:omega - diff --git a/代码/workspace_robo4/tools/bin/ant.sh b/代码/workspace_robo4/tools/bin/ant.sh deleted file mode 100644 index 0727ea1..0000000 --- a/代码/workspace_robo4/tools/bin/ant.sh +++ /dev/null @@ -1,94 +0,0 @@ -#! /bin/sh - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -case "`uname`" in - CYGWIN*) cygwin=true ;; - Darwin*) darwin=true ;; -esac - -#Find the necessary resources -ANT_HOME=. - -if [ -z "$JAVACMD" ] ; then - 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 - else - JAVACMD=java - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." - echo " We cannot execute $JAVACMD" - exit -fi - -if [ -n "$CLASSPATH" ] ; then - LOCALCLASSPATH=$CLASSPATH -fi - -# add in the dependency .jar files -DIRLIBS=${ANT_HOME}/build-lib/*.jar -for i in ${DIRLIBS} -do - # if the directory is empty, then it will return the input string - # this is stupid, so case for it - if [ "$i" != "${DIRLIBS}" ] ; then - if [ -z "$LOCALCLASSPATH" ] ; then - LOCALCLASSPATH=$i - else - LOCALCLASSPATH="$i":$LOCALCLASSPATH - fi - fi -done - -if [ -n "$JAVA_HOME" ] ; then - if [ -f "$JAVA_HOME/lib/tools.jar" ] ; then - LOCALCLASSPATH=$LOCALCLASSPATH:$JAVA_HOME/lib/tools.jar - fi - - if [ -f "$JAVA_HOME/lib/classes.zip" ] ; then - LOCALCLASSPATH=$LOCALCLASSPATH:$JAVA_HOME/lib/classes.zip - fi - - # OSX hack to make Ant work with jikes - if $darwin ; then - OSXHACK="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Classes" - if [ -d ${OSXHACK} ] ; then - for i in ${OSXHACK}/*.jar - do - JIKESPATH=$JIKESPATH:$i - done - fi - fi - -else - echo "Warning: JAVA_HOME environment variable is not set." - echo " If build fails because sun.* classes could not be found" - echo " you will need to set the JAVA_HOME environment variable" - echo " to the installation directory of java." -fi - -# supply JIKESPATH to Ant as jikes.class.path -if [ -n "$JIKESPATH" ] ; then - if [ -n "$ANT_OPTS" ] ; then - ANT_OPTS="$ANT_OPTS -Djikes.class.path=$JIKESPATH" - else - ANT_OPTS=-Djikes.class.path=$JIKESPATH - fi -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - ANT_HOME=`cygpath --path --windows "$ANT_HOME"` - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - LOCALCLASSPATH=`cygpath --path --windows "$LOCALCLASSPATH"` -fi -$JAVACMD -classpath "$LOCALCLASSPATH" -Dant.home="${ANT_HOME}" $ANT_OPTS org.apache.tools.ant.Main -e "$@" diff --git a/代码/workspace_robo4/tools/bin/m2.conf b/代码/workspace_robo4/tools/bin/m2.conf deleted file mode 100644 index cc046fb..0000000 --- a/代码/workspace_robo4/tools/bin/m2.conf +++ /dev/null @@ -1,4 +0,0 @@ -main is org.apache.maven.cli.MavenCli from plexus.core - -[plexus.core] -load tools/lib/*.jar diff --git a/代码/workspace_robo4/tools/bin/mvn.bat b/代码/workspace_robo4/tools/bin/mvn.bat deleted file mode 100644 index 8fd1f4c..0000000 --- a/代码/workspace_robo4/tools/bin/mvn.bat +++ /dev/null @@ -1,191 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set HOME=%HOMEDRIVE%%HOMEPATH%) - -@REM Execute a user defined script before this one -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" - -set ERROR_CODE=0 - -@REM set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" @setlocal -if "%OS%"=="WINNT" @setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo ERROR: JAVA_HOME not found in your environment. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto chkMHome - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory. -echo JAVA_HOME = %JAVA_HOME% -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation -echo. -goto error - -:chkMHome -if not "%M2_HOME%"=="" goto valMHome - -if "%OS%"=="Windows_NT" SET M2_HOME=%~dp0 -if "%OS%"=="Windows_NT" set M2_HOME=%M2_HOME:~0,-5% -if "%OS%"=="WINNT" SET M2_HOME=%~dp0.. -if not "%M2_HOME%"=="" goto valMHome - -echo. -echo ERROR: M2_HOME not found in your environment. -echo Please set the M2_HOME variable in your environment to match the -echo location of the Maven installation -echo. -goto error - -:valMHome - -:stripMHome -if not _%M2_HOME:~-1%==_\ goto checkMBat -set M2_HOME=%M2_HOME:~0,-1% -goto stripMHome - -:checkMBat -if exist "%M2_HOME%\bin\mvn.bat" goto init - -echo. -echo ERROR: M2_HOME is set to an invalid directory. -echo M2_HOME = %M2_HOME% -echo Please set the M2_HOME variable in your environment to match the -echo location of the Maven installation -echo. -goto error -@REM ==== END VALIDATION ==== - -:init -@REM Decide how to startup depending on the version of windows - -@REM -- Windows NT with Novell Login -if "%OS%"=="WINNT" goto WinNTNovell - -@REM -- Win98ME -if NOT "%OS%"=="Windows_NT" goto Win9xArg - -:WinNTNovell - -@REM -- 4NT shell -if "%@eval[2+2]" == "4" goto 4NTArgs - -@REM -- Regular WinNT shell -set MAVEN_CMD_LINE_ARGS=%* -goto endInit - -@REM The 4NT Shell from jp software -:4NTArgs -set MAVEN_CMD_LINE_ARGS=%$ -goto endInit - -:Win9xArg -@REM Slurp the command line arguments. This loop allows for an unlimited number -@REM of agruments (up to the command line limit, anyway). -set MAVEN_CMD_LINE_ARGS= -:Win9xApp -if %1a==a goto endInit -set MAVEN_CMD_LINE_ARGS=%MAVEN_CMD_LINE_ARGS% %1 -shift -goto Win9xApp - -@REM Reaching here means variables are defined and arguments have been captured -:endInit -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -@REM -- 4NT shell -if "%@eval[2+2]" == "4" goto 4NTCWJars - -@REM -- Regular WinNT shell -for %%i in ("%M2_HOME%"\lib\classworlds-*) do set CLASSWORLDS_JAR="%%~fi" -for %%i in ("%M2_HOME%"\lib\maven-*-uber.jar) do set MAVENUBER_JAR="%%~fi" - -goto runm2 - -@REM The 4NT Shell from jp software -:4NTCWJars -for %%i in ("%M2_HOME%\lib\classworlds-*") do set CLASSWORLDS_JAR="%%i" -goto runm2 - -@REM Start MAVEN2 -:runm2 -%MAVEN_JAVA_EXE% %MAVEN_OPTS% -classpath %CLASSWORLDS_JAR%;%MAVENUBER_JAR% "-Dclassworlds.conf=%M2_HOME%\bin\m2.conf" "-Dmaven.home=%M2_HOME%" org.codehaus.classworlds.Launcher %MAVEN_CMD_LINE_ARGS% -if ERRORLEVEL 1 goto error -goto end - -:error -if "%OS%"=="Windows_NT" @endlocal -if "%OS%"=="WINNT" @endlocal -set ERROR_CODE=1 - -:end -@REM set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" goto endNT -if "%OS%"=="WINNT" goto endNT - -@REM For old DOS remove the set variables from ENV - we assume they were not set -@REM before we started - at least we don't leave any baggage around -set MAVEN_JAVA_EXE= -set MAVEN_CMD_LINE_ARGS= -goto postExec - -:endNT -@endlocal & set ERROR_CODE=%ERROR_CODE% - -:postExec -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -@REM pause the batch file if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% - diff --git a/代码/workspace_robo4/tools/bin/mvn.sh b/代码/workspace_robo4/tools/bin/mvn.sh deleted file mode 100644 index 502d7db..0000000 --- a/代码/workspace_robo4/tools/bin/mvn.sh +++ /dev/null @@ -1,162 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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 -# -# http://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. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# ---------------------------------------------------------------------------- - -QUOTED_ARGS="" -while [ "$1" != "" ] ; do - - QUOTED_ARGS="$QUOTED_ARGS \"$1\"" - shift - -done - -if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc -fi - -if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - if [ -z "$JAVA_VERSION" ] ; then - JAVA_VERSION="CurrentJDK" - else - echo "Using Java version: $JAVA_VERSION" - fi - if [ -z "$JAVA_HOME" ] ; then - JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Home - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - 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 - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVACMD" ] ; then - 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 - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." - echo " We cannot execute $JAVACMD" - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.classworlds.Launcher - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$HOME" ] && - HOME=`cygpath --path --windows "$HOME"` -fi - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath $PWD/tools/lib/classworlds-1.1.jar:$PWD/tools/lib/maven-2.2.1-uber.jar \ - "-Dclassworlds.conf=$PWD/tools/bin/m2.conf" \ - ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS - diff --git a/代码/workspace_robo4/tools/debugall/all.iml b/代码/workspace_robo4/tools/debugall/all.iml deleted file mode 100644 index c46da8f..0000000 --- a/代码/workspace_robo4/tools/debugall/all.iml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/代码/workspace_robo4/tools/jacobe/.gitignore b/代码/workspace_robo4/tools/jacobe/.gitignore deleted file mode 100644 index e560d3e..0000000 --- a/代码/workspace_robo4/tools/jacobe/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/jacobe-ant-task.zip diff --git a/代码/workspace_robo4/tools/jacobe/ReadMe.txt b/代码/workspace_robo4/tools/jacobe/ReadMe.txt deleted file mode 100644 index a645e5b..0000000 --- a/代码/workspace_robo4/tools/jacobe/ReadMe.txt +++ /dev/null @@ -1,57 +0,0 @@ -==== - Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://robocode.sourceforge.net/license/epl-v10.html -==== - -Author: Flemming N. Larsen: - -The Jacobe Code Beautifier is used as code beautifier for Robocode. -You can read about it and download it from here: - -http://www.tiobe.com/index.php/content/products/jacobe/Jacobe.html - -Jacobe is quite good for Java as it follows the Java code conventions from Oracle: - -http://www.oracle.com/technetwork/java/codeconv-138413.html - -Jacobe can be integrated with Eclipse by using the Eclipse plugin for Jacobe. -The plugin can be downloaded from the same page used when downloading Jacobe -under the "Plug-ins" section. - -You can install the Jacobe plugin into Eclipse simply by unpacking the Jacobe -plugin to the root directory of Eclipse (the plugins directory must be -"overwritten" with the Jacobe plugin). - -When the Jacobe plugin has been put into the root directory of Eclipse, you -must restart Eclipse, if you had it running while putting the plugin into the -Eclipse directory. Otherwise you'll not be able to use Jacobe yet. - -I attached the robocode.cfg file, which is used for beautifying the Robocode -sources with Jacobe. You should put this file into the directory where -you have installed Jacobe, i.e. just together the sun.cfg file. - -In Eclipse (when you have added your plugin, and can see the purple bug in -the toolbar) you select "Preferences.." from the Window menu. On the -Preferences window you expand the Java (in the tree) and click Jacobe. - -Browse and select your Jacobe executable. Browse and select the -robocode.cfg file. All checkmarks should be cleared, except for "overwrite -original files". Otherwise backup files are created. Now you are ready -to code beautify following the Robocode Jacobe configuration. - -You can also code beautify the sources of Robocode by using the target named -"jacobe" in the build.xml file provided in this directory. Here you'll -need to download and install the Jacobe Ant Task: - -http://www.tiobe.com/content/products/jacobe/jacobe-ant-task.zip - -You should copy the jacode.jar file inside the jacobe-ant-task.zip file -into this folder, and also add the home folder where the Jacode executable -is located into your PATH environment variable. - -You can read more about the Jacobe Ant task here: - -http://www.tiobe.com/index.php/content/products/jacobe/jacobe_task_doc.html \ No newline at end of file diff --git a/代码/workspace_robo4/tools/jacobe/robocode.cfg b/代码/workspace_robo4/tools/jacobe/robocode.cfg deleted file mode 100644 index a8c916c..0000000 --- a/代码/workspace_robo4/tools/jacobe/robocode.cfg +++ /dev/null @@ -1,301 +0,0 @@ -// Jacobe configuration file for the Sun code conventions for Java -// $Id: sun.cfg,v 1.94 2006/05/31 09:29:01 stappers Exp $ -// reference: http://java.sun.com/docs/codeconv/ -// (c) 2000-2006 Tiobe Software BV -- All rights reserved -// support@jacobe.com, www.jacobe.com, Eindhoven, The Netherlands - - -// INDENTATION -// ----------- - -//--indent=4 ---indenttab=1 ---tablen=4 -//--unindentjumplabel - - -// LINE LENGTH -// ----------- - ---wrap=120 - - -// WRAPPING LINES -// -------------- - -//--wrapinfixoplineterm=1 ---wraplineterminfixop=1 ---indentcontinuation=2 -//--continuationindent=4 -//--wraplinetermcomma=1 ---wrapcommalineterm=1 ---wraparrayinitopenbracelineterm=1 ---wrapmethodcallopenparenlineterm=1 -//--wrapassoplineterm=1 - - -// COMMENTS -// -------- - ---opencommentspace=1 -//--opencommentlineterm=1 ---indentcomment=1 -//--commentstarspace=1 - -// JAVADOC -// ------- -// The rules below are only available in Jacobe Professional - ---javadocstartlineterm=1 ---linetermendjavadoc=1 ---javadocdescr ---javadocdescrlineterm=2 ---javadocauthor ---javadocauthorlineterm=1 ---javadocversion ---javadocversionlineterm=2 ---javadocparam ---javadocparamorder ---javadocparamlineterm=1 ---javadocreturn ---javadocreturnlineterm=1 ---javadocthrows ---javadocthrowsorder ---javadocthrowslineterm=1 ---javadocorder ---javadoctagspacearg=1 - - -// DECLARATIONS AND STATEMENTS -// --------------------------- - ---colonlineterm=1 ---spaceopenbrace=1 ---closebracelineterm=1 ---openbracespace=1 ---openbracespaceclosebrace=0 ---openbracelinetermclosebrace=0 ---openparenspacecloseparen=0 ---linetermopenbracket=0 ---indentbraces=0 ---indentblock=1 -//--dimopenbracketspace=0 -//--dimspaceclosebracket=0 -//--indexopenbracketspace=0 -//--indexspaceclosebracket=0 ---openbracketspaceclosebracket=0 - - -// DECLARATIONS -// ------------ - ---decllineterm=1 ---modifierslineterm=0 ---modifiersspace=1 -//--typespace=1 ---classspace=1 ---classlineterm=0 ---classlinetermopenbrace=0 ---classopenbracelineterm=1 ---classlinetermclosebrace=1 ---spaceextends=1 ---extendsspace=1 ---linetermextends=0 ---extendslineterm=0 -//--linetermimplements=0 -//--implementslineterm=0 -//--linetermthrows=0 ---methodlinetermopenbrace=0 ---methodopenbracelineterm=1 ---methodlinetermclosebrace=1 -//--arrayinitlinetermopenbrace=0 -//--arrayinitopenbracelineterm=0 -//--arrayinitlinetermclosebrace=0 -//--arrayinitclosebracelineterm=0 -//--arrayinitopenbracespace=0 -//--arrayinitspaceclosebrace=0 ---returntypelineterm=0 -//--typelineterm=0 -//--paramtypelineterm=0 -//--fortypelineterm=0 -//--declarraytoarraytype -//--linetermclass=1 -//--linetermconstructor=1 ---closebracelinetermopenbrace=1 ---importlineterm=0 ---modifierlineterm=0 -//--seplineterm=0 -//--paramopenparenlineterm=0 -//--paramlinetermcloseparen=0 -//--paramlinetermopenparen=0 -//--paramcloseparenlineterm=0 -//--paramspaceopenparen=0 ---enumcommalineterm=1 - - -// SIMPLE STATEMENTS -// ----------------- - ---statlineterm=1 ---methodcallspaceopenparen=0 ---methodcalllinetermopenparen=0 ---dotlineterm=0 ---linetermdot=0 ---linetermsep=0 ---lineterminfixop=0 ---infixoplineterm=0 ---prefixoplineterm=0 ---linetermpostfixop=0 ---linetermcomma=0 ---commalineterm=0 ---openparenlineterm=0 ---linetermcloseparen=0 ---assoplineterm=0 ---linetermassop=0 - - -// COMPOUND STATEMENTS -// ------------------- - ---blocklinetermopenbrace=0 ---blockopenbracelineterm=1 ---blocklinetermclosebrace=1 ---insertbraces ---blockstatlinetermopenbrace=0 - - -// IF STATEMENTS -// ------------- - ---spaceelse=1 ---closebracelinetermelse=0 -//--semicolonlinetermelse=1 ---elselinetermif=0 - - -// FOR STATEMENTS -// -------------- - ---forstatlineterm=0 - - -// DO-WHILE STATEMENTS -// ------------------- - ---closebracelinetermdowhile=0 ---semicolonlinetermdowhile=1 - - -// SWITCH STATEMENTS -// ----------------- - ---blanklinescase=1 ---indentcase=0 -//--insertbracescasestats - - -// TRY-CATCH STATEMENTS -// -------------------- - ---spacecatch=1 ---linetermcatch=0 ---spacefinally=1 ---linetermfinally=0 - - -// WHITE SPACE -// ----------- - -//--lineterm - - -// BLANK LINES -// ----------- - -//--blanklinescompilationunit=0 ---methodblanklines=1 ---declblanklinesstat=0 ---statblanklinesdecl=0 ---blanklinescomment=1 ---sectionblanklines=2 ---classblanklines=2 -//--enumconstantblanklinesdecl=1 - - -// SPACES -// ------ - -//--keywordspace=1 ---keywordspaceopenparen=1 ---keywordlinetermopenparen=0 ---methodnamespace=0 ---spacecomma=0 ---commaspace=1 ---spacesemicolon=0 ---semicolonspace=1 ---spacecolon=0 ---colonspace=1 ---assignspace=1 ---spaceassign=1 ---dotspace=0 ---spacedot=0 ---prefixopspace=0 ---infixopspace=1 ---spaceinfixop=1 ---spacepostfixop=0 ---spaceopenbracket=0 ---castspace=1 ---castopenparenspace=0 ---castspacecloseparen=0 -//--castopenparenlineterm=0 -//--castlinetermcloseparen=0 -//--castlinetermopenparen=0 -//--castcloseparenlineterm=0 -//--castspaceopenparen=0 -//--castcloseparenspace=0 -//--statopenparenlineterm=0 -//--statlinetermcloseparen=0 -//--statcloseparenspace=0 -//--statcloseparenlineterm=0 -//--castcloseparenspacegroupopenparen=1 ---statopenparenspace=0 ---statspacecloseparen=0 ---groupopenparenspace=0 ---groupspacecloseparen=0 -//--groupspaceopenparen=0 -//--groupcloseparenspace=0 -//--groupopenparenlineterm=0 -//--grouplinetermcloseparen=0 -//--grouplinetermopenparen=0 -//--groupcloseparenlineterm=0 ---methodopenparenspace=0 ---methodspacecloseparen=0 -//--methodopenparenlineterm=0 -//--methodlinetermcloseparen=0 -//--methodcloseparenspace=0 -//--methodcloseparenlineterm=0 -//--horspaceslineterm - -// ANNOTATIONS -// ----------- - -//--annotationatspace=0 -//--annotationatlineterm=0 -//--annotationspaceopenparen=0 -//--annotationlinetermopenparen=0 -//--annotationopenparenspace=0 -//--annotationopenparenlineterm=0 -//--annotationspacecloseparen=0 -//--annotationlinetermcloseparen=0 -//--annotationcloseparenspace=0 -//--annotationcloseparenlineterm=0 -//--annotationspaceopenbrace=0 -//--annotationlinetermopenbrace=0 -//--annotationopenbracespace=0 -//--annotationopenbracelineterm=0 -//--annotationspaceclosebrace=0 -//--annotationlinetermclosebrace=0 -//--annotationclosebracespace=0 -//--annotationclosebracelineterm=0 -//--annotationspace=1 -//--annotationlineterm=1 diff --git a/代码/workspace_robo4/tools/licenses/ant-LICENSE.txt b/代码/workspace_robo4/tools/licenses/ant-LICENSE.txt deleted file mode 100644 index cdf6ff8..0000000 --- a/代码/workspace_robo4/tools/licenses/ant-LICENSE.txt +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Apache License - * Version 2.0, January 2004 - * http://www.apache.org/licenses/ - * - * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - * - * 1. Definitions. - * - * "License" shall mean the terms and conditions for use, reproduction, - * and distribution as defined by Sections 1 through 9 of this document. - * - * "Licensor" shall mean the copyright owner or entity authorized by - * the copyright owner that is granting the License. - * - * "Legal Entity" shall mean the union of the acting entity and all - * other entities that control, are controlled by, or are under common - * control with that entity. For the purposes of this definition, - * "control" means (i) the power, direct or indirect, to cause the - * direction or management of such entity, whether by contract or - * otherwise, or (ii) ownership of fifty percent (50%) or more of the - * outstanding shares, or (iii) beneficial ownership of such entity. - * - * "You" (or "Your") shall mean an individual or Legal Entity - * exercising permissions granted by this License. - * - * "Source" form shall mean the preferred form for making modifications, - * including but not limited to software source code, documentation - * source, and configuration files. - * - * "Object" form shall mean any form resulting from mechanical - * transformation or translation of a Source form, including but - * not limited to compiled object code, generated documentation, - * and conversions to other media types. - * - * "Work" shall mean the work of authorship, whether in Source or - * Object form, made available under the License, as indicated by a - * copyright notice that is included in or attached to the work - * (an example is provided in the Appendix below). - * - * "Derivative Works" shall mean any work, whether in Source or Object - * form, that is based on (or derived from) the Work and for which the - * editorial revisions, annotations, elaborations, or other modifications - * represent, as a whole, an original work of authorship. For the purposes - * of this License, Derivative Works shall not include works that remain - * separable from, or merely link (or bind by name) to the interfaces of, - * the Work and Derivative Works thereof. - * - * "Contribution" shall mean any work of authorship, including - * the original version of the Work and any modifications or additions - * to that Work or Derivative Works thereof, that is intentionally - * submitted to Licensor for inclusion in the Work by the copyright owner - * or by an individual or Legal Entity authorized to submit on behalf of - * the copyright owner. For the purposes of this definition, "submitted" - * means any form of electronic, verbal, or written communication sent - * to the Licensor or its representatives, including but not limited to - * communication on electronic mailing lists, source code control systems, - * and issue tracking systems that are managed by, or on behalf of, the - * Licensor for the purpose of discussing and improving the Work, but - * excluding communication that is conspicuously marked or otherwise - * designated in writing by the copyright owner as "Not a Contribution." - * - * "Contributor" shall mean Licensor and any individual or Legal Entity - * on behalf of whom a Contribution has been received by Licensor and - * subsequently incorporated within the Work. - * - * 2. Grant of Copyright License. Subject to the terms and conditions of - * this License, each Contributor hereby grants to You a perpetual, - * worldwide, non-exclusive, no-charge, royalty-free, irrevocable - * copyright license to reproduce, prepare Derivative Works of, - * publicly display, publicly perform, sublicense, and distribute the - * Work and such Derivative Works in Source or Object form. - * - * 3. Grant of Patent License. Subject to the terms and conditions of - * this License, each Contributor hereby grants to You a perpetual, - * worldwide, non-exclusive, no-charge, royalty-free, irrevocable - * (except as stated in this section) patent license to make, have made, - * use, offer to sell, sell, import, and otherwise transfer the Work, - * where such license applies only to those patent claims licensable - * by such Contributor that are necessarily infringed by their - * Contribution(s) alone or by combination of their Contribution(s) - * with the Work to which such Contribution(s) was submitted. If You - * institute patent litigation against any entity (including a - * cross-claim or counterclaim in a lawsuit) alleging that the Work - * or a Contribution incorporated within the Work constitutes direct - * or contributory patent infringement, then any patent licenses - * granted to You under this License for that Work shall terminate - * as of the date such litigation is filed. - * - * 4. Redistribution. You may reproduce and distribute copies of the - * Work or Derivative Works thereof in any medium, with or without - * modifications, and in Source or Object form, provided that You - * meet the following conditions: - * - * (a) You must give any other recipients of the Work or - * Derivative Works a copy of this License; and - * - * (b) You must cause any modified files to carry prominent notices - * stating that You changed the files; and - * - * (c) You must retain, in the Source form of any Derivative Works - * that You distribute, all copyright, patent, trademark, and - * attribution notices from the Source form of the Work, - * excluding those notices that do not pertain to any part of - * the Derivative Works; and - * - * (d) If the Work includes a "NOTICE" text file as part of its - * distribution, then any Derivative Works that You distribute must - * include a readable copy of the attribution notices contained - * within such NOTICE file, excluding those notices that do not - * pertain to any part of the Derivative Works, in at least one - * of the following places: within a NOTICE text file distributed - * as part of the Derivative Works; within the Source form or - * documentation, if provided along with the Derivative Works; or, - * within a display generated by the Derivative Works, if and - * wherever such third-party notices normally appear. The contents - * of the NOTICE file are for informational purposes only and - * do not modify the License. You may add Your own attribution - * notices within Derivative Works that You distribute, alongside - * or as an addendum to the NOTICE text from the Work, provided - * that such additional attribution notices cannot be construed - * as modifying the License. - * - * You may add Your own copyright statement to Your modifications and - * may provide additional or different license terms and conditions - * for use, reproduction, or distribution of Your modifications, or - * for any such Derivative Works as a whole, provided Your use, - * reproduction, and distribution of the Work otherwise complies with - * the conditions stated in this License. - * - * 5. Submission of Contributions. Unless You explicitly state otherwise, - * any Contribution intentionally submitted for inclusion in the Work - * by You to the Licensor shall be under the terms and conditions of - * this License, without any additional terms or conditions. - * Notwithstanding the above, nothing herein shall supersede or modify - * the terms of any separate license agreement you may have executed - * with Licensor regarding such Contributions. - * - * 6. Trademarks. This License does not grant permission to use the trade - * names, trademarks, service marks, or product names of the Licensor, - * except as required for reasonable and customary use in describing the - * origin of the Work and reproducing the content of the NOTICE file. - * - * 7. Disclaimer of Warranty. Unless required by applicable law or - * agreed to in writing, Licensor provides the Work (and each - * Contributor provides its Contributions) on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied, including, without limitation, any warranties or conditions - * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - * PARTICULAR PURPOSE. You are solely responsible for determining the - * appropriateness of using or redistributing the Work and assume any - * risks associated with Your exercise of permissions under this License. - * - * 8. Limitation of Liability. In no event and under no legal theory, - * whether in tort (including negligence), contract, or otherwise, - * unless required by applicable law (such as deliberate and grossly - * negligent acts) or agreed to in writing, shall any Contributor be - * liable to You for damages, including any direct, indirect, special, - * incidental, or consequential damages of any character arising as a - * result of this License or out of the use or inability to use the - * Work (including but not limited to damages for loss of goodwill, - * work stoppage, computer failure or malfunction, or any and all - * other commercial damages or losses), even if such Contributor - * has been advised of the possibility of such damages. - * - * 9. Accepting Warranty or Additional Liability. While redistributing - * the Work or Derivative Works thereof, You may choose to offer, - * and charge a fee for, acceptance of support, warranty, indemnity, - * or other liability obligations and/or rights consistent with this - * License. However, in accepting such obligations, You may act only - * on Your own behalf and on Your sole responsibility, not on behalf - * of any other Contributor, and only if You agree to indemnify, - * defend, and hold each Contributor harmless for any liability - * incurred by, or claims asserted against, such Contributor by reason - * of your accepting any such warranty or additional liability. - * - * END OF TERMS AND CONDITIONS - * - * APPENDIX: How to apply the Apache License to your work. - * - * To apply the Apache License to your work, attach the following - * boilerplate notice, with the fields enclosed by brackets "[]" - * replaced with your own identifying information. (Don't include - * the brackets!) The text should be enclosed in the appropriate - * comment syntax for the file format. We also recommend that a - * file or class name and description of purpose be included on the - * same "printed page" as the copyright notice for easier - * identification within third-party archives. - * - * Copyright [yyyy] [name of copyright owner] - * - * 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 - * - * http://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. - */ - -W3C SOFTWARE NOTICE AND LICENSE -http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - -This work (and included software, documentation such as READMEs, or other -related items) is being provided by the copyright holders under the following -license. By obtaining, using and/or copying this work, you (the licensee) agree -that you have read, understood, and will comply with the following terms and -conditions. - -Permission to copy, modify, and distribute this software and its documentation, -with or without modification, for any purpose and without fee or royalty is -hereby granted, provided that you include the following on ALL copies of the -software and documentation or portions thereof, including modifications: - - 1. The full text of this NOTICE in a location viewable to users of the - redistributed or derivative work. - 2. Any pre-existing intellectual property disclaimers, notices, or terms - and conditions. If none exist, the W3C Software Short Notice should be - included (hypertext is preferred, text is permitted) within the body - of any redistributed or derivative code. - 3. Notice of any changes or modifications to the files, including the date - changes were made. (We recommend you provide URIs to the location from - which the code is derived.) - -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE -NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT -THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY -PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. - -The name and trademarks of copyright holders may NOT be used in advertising or -publicity pertaining to the software without specific, written prior permission. -Title to copyright in this software and any associated documentation will at -all times remain with copyright holders. - -____________________________________ - -This formulation of W3C's notice and license became active on December 31 2002. -This version removes the copyright ownership notice such that this license can -be used with materials other than those owned by the W3C, reflects that ERCIM -is now a host of the W3C, includes references to this specific dated version of -the license, and removes the ambiguous grant of "use". Otherwise, this version -is the same as the previous version and is written so as to preserve the Free -Software Foundation's assessment of GPL compatibility and OSI's certification -under the Open Source Definition. Please see our Copyright FAQ for common -questions about using materials from our site, including specific terms and -conditions for packages like libwww, Amaya, and Jigsaw. Other questions about -this notice can be directed to site-policy@w3.org. - -Joseph Reagle - -This license came from: http://www.megginson.com/SAX/copying.html - However please note future versions of SAX may be covered - under http://saxproject.org/?selected=pd - -SAX2 is Free! - -I hereby abandon any property rights to SAX 2.0 (the Simple API for -XML), and release all of the SAX 2.0 source code, compiled code, and -documentation contained in this distribution into the Public Domain. -SAX comes with NO WARRANTY or guarantee of fitness for any -purpose. - -David Megginson, david@megginson.com -2000-05-05 diff --git a/代码/workspace_robo4/tools/licenses/ant-NOTICE.txt b/代码/workspace_robo4/tools/licenses/ant-NOTICE.txt deleted file mode 100644 index 4c88cc6..0000000 --- a/代码/workspace_robo4/tools/licenses/ant-NOTICE.txt +++ /dev/null @@ -1,26 +0,0 @@ - ========================================================================= - == NOTICE file corresponding to the section 4 d of == - == the Apache License, Version 2.0, == - == in this case for the Apache Ant distribution. == - ========================================================================= - - Apache Ant - Copyright 1999-2008 The Apache Software Foundation - - This product includes software developed by - The Apache Software Foundation (http://www.apache.org/). - - This product includes also software developed by : - - the W3C consortium (http://www.w3c.org) , - - the SAX project (http://www.saxproject.org) - - The task is based on code Copyright (c) 2002, Landmark - Graphics Corp that has been kindly donated to the Apache Software - Foundation. - - Portions of this software were originally based on the following: - - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. - - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. - - voluntary contributions made by Paul Eng on behalf of the - Apache Software Foundation that were originally developed at iClick, Inc., - software copyright (c) 1999. diff --git a/代码/workspace_robo4/tools/licenses/mvn-LICENSE.txt b/代码/workspace_robo4/tools/licenses/mvn-LICENSE.txt deleted file mode 100644 index d645695..0000000 --- a/代码/workspace_robo4/tools/licenses/mvn-LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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 - - http://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. diff --git a/代码/workspace_robo4/tools/licenses/mvn-NOTICE.txt b/代码/workspace_robo4/tools/licenses/mvn-NOTICE.txt deleted file mode 100644 index ee40ae9..0000000 --- a/代码/workspace_robo4/tools/licenses/mvn-NOTICE.txt +++ /dev/null @@ -1,11 +0,0 @@ - ========================================================================= - == NOTICE file corresponding to the section 4 d of == - == the Apache License, Version 2.0, == - == in this case for the Apache Maven distribution. == - ========================================================================= - -This product includes software developed by -The Apache Software Foundation (http://www.apache.org/). - -This product includes software (Plexus and Classworlds) developed by -The Codehaus Foundation (http://www.codehaus.org/). diff --git a/代码/workspace_robo4/tools/loadTools.cmd b/代码/workspace_robo4/tools/loadTools.cmd deleted file mode 100644 index b2926f2..0000000 --- a/代码/workspace_robo4/tools/loadTools.cmd +++ /dev/null @@ -1,19 +0,0 @@ -@REM -@REM Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -@REM All rights reserved. This program and the accompanying materials -@REM are made available under the terms of the Eclipse Public License v1.0 -@REM which accompanies this distribution, and is available at -@REM http://robocode.sourceforge.net/license/epl-v10.html -@REM - -@echo off - -if not exist "%~dp0\lib" ( - mkdir "%~dp0\lib" -) - -if not exist "%~dp0\loader\Loader.class" ( - javac "%~dp0\loader\Loader.java" -) - -java -cp "%~dp0/loader" Loader http://robocode.sourceforge.net/tools/libs/ "%~dp0/lib/" ant.jar ant-contrib-0.6.jar ant-launcher.jar jacobe.jar junit.jar classworlds-1.1.jar maven-2.2.1-uber.jar \ No newline at end of file diff --git a/代码/workspace_robo4/tools/loadTools.sh b/代码/workspace_robo4/tools/loadTools.sh deleted file mode 100644 index 00d595e..0000000 --- a/代码/workspace_robo4/tools/loadTools.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://robocode.sourceforge.net/license/epl-v10.html -# - - -dp0=${0%/*} - -if [ ! -d "$dp0/lib" ]; then - mkdir "$dp0/lib" -fi - -if [ ! -e "$dp0/loader/Loader.class" ]; then - javac "$dp0/loader/Loader.java" -fi - -java -cp "$dp0/loader" Loader http://robocode.sourceforge.net/tools/libs/ "$dp0/lib/" ant.jar ant-contrib-0.6.jar ant-launcher.jar jacobe.jar junit.jar classworlds-1.1.jar maven-2.2.1-uber.jar diff --git a/代码/workspace_robo4/tools/loader/Loader.java b/代码/workspace_robo4/tools/loader/Loader.java deleted file mode 100644 index b5e0488..0000000 --- a/代码/workspace_robo4/tools/loader/Loader.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://robocode.sourceforge.net/license/epl-v10.html - */ -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; - - -/** - * @author Pavel Savara (original) - */ -public class Loader { - public static void main(String[] args) throws IOException { - for (int i = 2; i < args.length; i++) { - System.out.print("Downloading " + args[0] + args[i] + " to " + args[1] + " [..."); - downloadFile(args[0], args[1], args[i]); - System.out.println("...] done"); - } - } - - private static void downloadFile(String libraries, String directory, String file) throws IOException { - URL url = new URL(libraries + file); - final URLConnection con = url.openConnection(); - InputStream is = null; - FileOutputStream fos = null; - - try { - is = con.getInputStream(); - fos = new FileOutputStream(directory + file); - do { - final int b = is.read(); - - if (b == -1) { - break; - } else { - fos.write(b); - } - } while (true); - } finally { - if (fos != null) { - fos.close(); - } - if (is != null) { - is.close(); - } - } - } -} diff --git a/代码/workspace_robo4/versions.md b/代码/workspace_robo4/versions.md deleted file mode 100644 index 4363a97..0000000 --- a/代码/workspace_robo4/versions.md +++ /dev/null @@ -1,3082 +0,0 @@ -## Version 1.9.2.5 (30-Dec-2015) - -### Bug fixes -* [Bug-378][]: robocode.robocodeGL.system.GLRenderer ClassNotFoundException. -* [Bug-380][]: Yet another historical bot related bug. -* Robot Editor: Source files were set to modified (starred) as soon as they were loaded. The modification state remained, even when no changes were made to the source file or when undoing all changes. Therefore the editor would always bring up a dialog with a warning, that the source file needed to be saved before closing the editor. - -### Change -* [Req-160][]: Fixed width font in console. Some systems did not used monospaced font in console windows. - -## Version 1.9.2.4 (20-Nov-2014) - -### Bug fixes -* [Req-159][]: Fix overkilled garbage collection on static fields. - * Robocode garbage collected practically any static field on a robot to prevent memory leaks (see [Bug-244][]). -* [Bug-375][]: Wrong width and height returned for .NET robots. - * The .NET API return 40 instead of 36 with the Width and Height properties. - -### Changes -* Upgraded Eclipse Compiler for Java (ECJ) to version 4.4. -* Upgraded jni4net to version 0.8.7.0. - -### Other -* Got rid of various issues (e.g. license headers) with the source files of Robocode in order to create a Debian distribution of Robocode. - * Thanks goes to Markus Koschany for all the help and support to make this possible. - -## Version 1.9.2.3 (15-Sep-2014) -* [Bug-374][]: Wrong size report for minirumble in v1.9.2.2. - -## Version 1.9.2.2 (03-Sep-2014) -* [Bug-373][]: Wrong robot size calculation in version 1.9.0 - 1.9.2. - -## Version 1.9.2.1 (21-May-2014) - -### Bug fixes -* [Bug-371][]: High cpu usage on editor. -* [Bug-372][]: Cannot load battle file when ``-DNOSECURITY=true`` is enabled - ``java.lang.IllegalAccessError``. - -## Version 1.9.2.0 (23-Apr-2014) - -### New feature -* Initial positions and headings added to the Control API. - * A new constructor has been added to the ``BattleSpecification`` for the ``RobocodeEngine`` so that it is possible to set the initial position and heading of each participant robot. This new constructor takes an additional parameter named ``initialSetups`` that is an array of ``RobotSetup`` instances. - * The ``RobotSetup`` is a new class introduced with this version that contains the initial position and heading for an individual robot. - -### Bug fixes -* [Bug-370][]: Robot Packager cannot find robot .properties file in development path. -* Fixed issue with the Robot Editor, where the caret position was not updated fast enough when typing very fast. - -## Version 1.9.1.0 (22-Mar-2014) - -### Bug fixes -* [Bug-366][]: Receiving enemy's real name on HitByBulletEvent. - * The previous fix was not correct for the owner and victim for the HitByBulletEvent and HitBulletEvent. -* [Bug-368][]: Issues with sentries - * All listed issues have been fixed. - * A bullet from a sentry robot will not be able to hit another bullet within the "safe zone" any more, but will still be able to hit another bullet within the sentry border area. - * When sentry robots are present on the battle field, the initial random positions will be located within the safe zone. This avoids robots from being punished by sentry robots from the start of the battle, as the robot did not enter the sentry border by itself. -* [Bug-369][]: RoboRumble: NoClassDefFoundError for CodeSizeCalculator. -* The missing property ``robocode.battle.sentryBorderSize`` has now been added to the .battle file format. -* Fixed the twinduel.sh file which was using a invalid file name for the configuration file. -* Added desktop files for FreeBSD. - -### New features -* Due to one of the ideas in [Bug-368][], a new method ``getNumSentries()`` for Java and a ``NumSentries`` read-only property for .NET was added to the ``Robot`` and ``RobotStatus`` classes, and to the ``IBasicRobotPeer`` interface as well. - -### Changes -* Upgraded Eclipse Compiler for Java (ECJ) to version 4.3.1. - -## Version 1.9.0.0 (16-Feb-2014) The Border Sentry Robot Release - -### Bug fixes -* [Bug-364][]: Robot Packager does not include the robot data dir in the .jar file. - * The Robot packager has now been extended with an option to include data files too when packaging a robot. -* [Bug-366][]: Receiving enemy's real name on HitByBulletEvent. -* Fixed various issues with the Robot Editor, e.g. letters written in the wrong error when typing text fast. -* Fixed issue when loading a robot jar file with no package (default package), which was found by Daniel Yeung, who also had a fix for it. :-) - -### New features -* *BorderSentry interface*: Added a new robot type (the BorderSentry) that allows you to implement border sentry robots, which are robots that guards the walls of the battlefield against "wall-crawlers" and "corner" robots. - * The Border Sentry robot is dedicated to Liam Noonan from Limerick Institute of Technology and the Robocode Ireland event in general. :-) - * The inspiration for this type of robot comes from the TV series named [Robot Wars](http://www.ukgameshows.com/ukgs/Robot_Wars). - * Note that border sentry robots... - * have 400 additional energy points meaning that a border sentry robot starts with 500 energy points! - * only appear at the borders of the battlefield, when a new round is started defined by the "border sentry size", which is a game rules that can be adjusted similar to other game rules. The default border sentry size is 100 units. - * can only make damage to other robot types within the *sentry border*, but not to robots in the "safe zone", which is the area inside the sentry border. - * can receive damage from other robots. But robots will not gain energy points from the border sentry robots (due to Mathew Nelson's excellent point regarding using sentry robots as "Energy Batteries" ;-) ). - * does not receive scores in the Ranking Panel nor Battle Results, even though you can see its score, like ramming damage, bullet damage etc. The goal for the border sentry robot is to be a referee, but not a player that can win or loose the battle. - * A new method names ``getSentryBorderSize()`` has been added to the Robot classes that returns the size / attack range from the edge of the borders, where BorderSentry robots are able to hit other robot types. - * A new method named ``isSentryRobot()`` has been added to the ``ScannedRobotEvent`` event class. - * When there is only one regular robot left on the battle field with one or more border sentry robots, the round is automatically ended. - * A new sample robot has been added named ``samplesentry.BorderGuard``. Try it out against your robot(s) or e.g. ``sample.Corners`` and ``sample.Walls``. - * An additional option has been added to the View Options in the Preferences to enable and disable the visual appearance of the sentry border, which is painted in transparent red (danger zone). -* [Req-156][]: Codesize added to properties file. - * The Robot Packager now adds a new property named ``robot.codesize`` which will be set to the value calculated by the built-in Codesize tool when compiling the robot and/or team. The Codesize value is the effective code size measured in bytes which is used by e.g. the RoboRumble to categorize robots into MicroBot, MiniBot and MegaBot etc. -* Improved the names of the menu items on the Robot menu. - -## Version 1.8.3.0 (04-Oct-2013) The Editor Theme Release - -### Bug fixes -* [Bug-363][]: No Last Survivor Bonus being given. -* The ``getWidth()`` and ``getHeight()`` methods on the Robot class have always returned 40, even though a robot is 36x36 pixels in size. - * Hence, ``getWidth()`` and ``getHeight()`` have been changed to return the correct width and height, which is 36. -* Fixed Robot Editor issues: - * ``NullPointerException`` occurring with a new source file that was not saved before being compiled. - * Issue where the caret position was set to the end of a source file when reading it into the editor. - -### Changes -* [Req-121][]: Issues with editor font. - * A new Editor Theme Configurator has been added the allows changing the font, text colors and styles for the Robocode Editor. - * Two built-in themes have been provided for Robocode: - * Robocode White Theme - * Robocode Black Theme - * When selecting a theme, Robocode will automatically use this theme the next time Robocode is started. - * When changing a theme, a new custom theme can be created and saved. Note that it is possible to overwrite existing themes. - * Editor themes are stored within the /theme/editor directory as theme property files, which makes it possible to modify these in a normal text editor, but also share the themes. - * The Editor Theme Configurator is available from the Robot Editor menu under View -> Change Editor Theme. -* The line numbers area in the Robocode Editor has been improved as well: - * The background and text colors for the line numbers can be changed. - * Line numbers are now right aligned + extra space has been added to the right. -* The Find & Replace dialog has got a better layout. - -## Version 1.8.2.0 (22-Jun-2013) - -### Bug fixes -* [Bug-357][]: Tab characters are inserted in the last line of a robot source file when opening it. - * This bug was only partially fixed with version 1.8.1.0. -* [Bug-358][]: Robot in default package cannot write to files. Should at least get a warning. -* [Bug-361][]: Problem in the text editor related with the .java file modification. -* [Bug-362][]: Rumble client does not remove participants in wrong codesize group. - * Thanks goes to Julian Kent ("Skilgannon") for providing a solution for this. :-) - -### Changes -* Improved the UI regarding Battle Rules: - * All Battle Rules have been assembled into one single Rules tab. - * Number of Round has been moved from the New Battle dialog to the Rules tab. - * Improved the visualization of the battle field size. - * Added input validation to text fields. -* [Req-64][]: Change default battle settings like e.g. "Number of Rounds". - * When the battle rules are changed in the user interface, Robocode will remember these as the user's default settings. - * A new Restore Defaults button has been added to get the game default settings back. -* Source code editor is now always maximized when opening and robot file or creating a new one. - -## Version 1.8.1.0 (24-Mar-2013) - -### Bug fixes -* [Bug-335][]/[Bug-336][]: Skipped turns ... issues. -* [Bug-349][]: Instances of RobocodeEngine don't seem to be independent - memory leak and performance decrease. -* [Bug-350][]: Bullet id from battle record XML file is sometimes -1 causing a NumberFormatException. -* [Bug-351][]: Robot.onBattleEnded(BattleEndedEvent) provides wrong scores. -* [Bug-352][]: Results from BattleCompletedEvent.getIndexedResults() are always sorted. -* [Bug-353][]: RobocodeEngine.setVisible() can cause a NullPointerException. -* [Bug-354][]: Replaying an XML record can cause an ArrayIndexOutOfBoundsException. -* [Bug-355][]: Priority battles not accepted for mini/micro/nano rumbles. -* [Bug-356][]: Update Roborumble URLs from Darkcanuck to LiteRumble. -* [Bug-357][]: Tab characters are inserted in the last line of a robot source file when opening it. - -## Version 1.8.0.0 (30-Jan-2013) - -### Bug fix -* [Bug-346][]: Cannot extract sources from robot packages. -* [Bug-348][]: .NET: UnauthorizedAccessException in AppDomainShell.Dispose(). - -### Changes -* Robocode has been updated to Java 6, and hence this will be the new minimum requirement for running Robocode from this version. -* The icon for Robocode was upgraded to a 256x256 pixel resolution. -* Added the new properties ``-DlogMessagesEnabled=true|false`` and ``-DlogErrorsEnabled=true|false`` for enabling and disabling log messages and log errors. - * The robocode.control.RobocodeEngine has got two similar methods: ``setLogMessagesEnabled(boolean)`` and ``setLogErrorsEnabled(boolean)`` - -## Version 1.7.4.4 (21-Nov-2012) - -### Bug fix -* [Bug-347][]: /bin/sh^M bad interpreter. - * All .sh and .command files contained the Windows ^M characters so these files could not be executed. - -## Version 1.7.4.3 (17-Nov-2012) - -### Bug Fixes -* [Bug-344][]: BattleAdaptor missing in ``robocode.control.events``. -* [Bug-345][]: Graphics still being rendered when minimized. -* [Bug-333][]: .NET runs release dll not debug dll so can't debug. - * Implemented a work-around so that the local robot repository is rebuild when removing a development path. - -### Changes -* Robocode sources are now put on [GitHub](https://github.com/robo-code/robocode). -* Upgraded the .NET plug-in to use Visual Studio Express 2010. -* The versions.txt has been changed to versions.md: - * The versions.txt was converted into [Markdown][] syntax in order to make it easier to convert into e.g. HTML, and because GitHub will automatically translate it into HTML when viewing this file in a browser. - * Thus, this file has been renamed from 'versions.txt' into 'versions.md'. - * The web page with the new versions.md can be viewed [here](https://github.com/robo-code/robocode/blob/master/versions.md). - * In addition, links to all reported bugs and feature requests have been inserted into versions.md so it is easy to browse to the reports and requests to find more details. - -## Version 1.7.4.2 (16-Aug-2012) - -### Bug Fixes -* [Bug-338][]: "Accept-Encoding: gzip" not in Roborumble HTTP Headers. -* [Bug-339][]: All Text Missing. - * Reverting fix for [Bug-332][] ("Use OpenGL backend under linux"), which caused too much trouble. -* [Bug-340][]: Robocode crash on window resize (linux-opengl). - * Reverting fix for [Bug-332][] ("Use OpenGL backend under linux"), which caused too much trouble. -* [Bug-341][]: InteractiveRobots gets error "After the event was added...". -* [Bug-342][]: New bots not given priority. - -### Changes -* The built-in [RoboRumble][] client is now able to decompress "gzip" and "deflate" content with HTTP connections with RoboRumble servers that supports it. - -## Version 1.7.4.1 (02-Jul-2012) - -### Bug Fixes -* [Bug-337][]: Hangups with New Editor in 1.7.4.0. - * Notice, that the editor can still be quite slow with large source files. Work is still in progress to speed it up. - * Several other minor bug fixes with the new editor, like e.g. undoing and redoing tab indentation. - -## Version 1.7.4.0 (07-Jun-2012) - -### Bug Fixes -* [Bug-332][]: Use OpenGL backend under linux. - * The ``-Dsun.java2d.opengl=True`` property has been set up per default in the "robocode.sh" file in order to enable OpenGL hardware acceleration per default for Linux and Solaris. -* [Bug-334][]: Snapshot API never shows bullets in "HIT_WALL" status. -* [Bug-328][]: Issue with the robocode.dll + \# chars in the path for a dll. - * This applies to the .NET plug-in. - -### New Features -* [Req-147][]: The snapshot API is ambiguous for bullets shot by teams. - * Two new methods have been added: - * [IRobotSnapshot.getRobotIndex()][] that returns a unique id between all robots participating in a battle. - * [IRobotSnapshot.getTeamIndex()][] that returns a unique id between all participating robots or -1 if a robot is not a member of a team. - * The existing [IRobotSnapshot.getContestantIndex()][] will return the team id if it is not -1, otherwise the robot id is returned. - -### Changes -* The Robocode Editor (source code editor) has been completely replaced by a new and improved editor. Expect some bugs! - -## Version 1.7.3.6 (29-Apr-2012) - -### Bug Fixes -* [Bug-331][]: RoboRumble client has infinite timeout. - * Default *connection timeout*, *read timeout* and *session timeout* have been set to 10 seconds. - -### New Features -* A new config file has been added for [RoboRumble][] in the roborumble directory in the robocode directory named "roborumble.properties". - * With this config file it is possible to configure the *connection timeout*, *read timeout* and *session timeout* used when downloading robots and uploading results. -* [Req-144]: Mac ... start with icon and name. - -### Changes -* Upgraded Eclipse Compiler for Java (ECJ) to version 3.7.2. - -## Version 1.7.3.5 (11-Mar-2012) - -### Bug Fixes -* [Bug-326][]: Package of team fails to load in team battles. -* Fixed minor issue where the Robot Packager tells that a NanoBot can be 250 bytes and a MiniBot 750 bytes, when these must be lesser than 250 and 750 bytes. - -## Version 1.7.3.4 (04-Dec-2011) - -### Bug Fixes -* [Bug-323][]: Robocode can't find the ECJ (Eclipse Compiler for Java) -* [Bug-319][]: Package name allows bad chars. - * This issue was not fixed entirely. Corrected text regarding use of lower-case letters in package name. -* Bug: Changes to the rendering options did not take effect immediately for the battle view. - -### New Features -* [Req-134][]: Calculate codesize after compile in editor. - -### Changes -* Upgraded Eclipse Compiler for Java (ECJ) to version 3.7.1. - -## Version 1.7.3.3 (05-Nov-2011) - -### Bug Fixes -* [Bug-311][]: ``out.write(int)`` uses up allocated printing quickly. -* [Bug-315][]: Unable to change drawing color in .NET (C\#). -* [Bug-318][]: Installer throws ``NumberFormatException`` on Linux 3.0. -* [Bug-319][]: Package name allows bad chars. -* [Bug-320][]: "About" window colors are awful. - -### Changes -* The layout of the About Box has been completely redesigned. -* If running on Java 1.6 or newer, OS/system based font antialiasing will be enabled. -* Upgraded to Maven 2.2.1 used for building Robocode. - * Cleaned up the build, improved the speed, and got rid of issue with building and testing every twice. -* Upgraded Eclipse Compiler for Java (ECJ) to version 3.7. -* Upgraded jni4net (Java <-> .NET bridge) to version 0.8.6.0. - -## Version 1.7.3.2 (23-Aug-2011) - -### Bug Fixes -* [Bug-313][]: Robocode .NET does not work on Java 7. -* [Bug-312][]: Enabling Paint Freezes Robocode. -* Fixed problem with XML serialization of just killed robot. -* Fixed bug in temporary record cleanup. - -### New Features -* Implemented deserialization of XML with short tags. - * The command line argument ``-replay`` now supports zipped XML. - -### Changes -* Various optimizations to let [RoboRumble][] start up and run faster. - * E.g. sound module and image loading is disabled when running the rumble. -* Imroved XML deserialization. -* [Patch-1][]: Improved priority battle handling. - * Patch by Jerome Lavigne ("Darkcanuck") - Improved priority battle handling in [RoboRumble][]. - * This change will help improve the efficiency of the [RoboRumble][] system and allow battles to be distributed more evenly + fix some inconsistent console output. - * Improves [RoboRumble][] client-side processing of priority battles received from the rumble server. Specifically: - 1. Priority battles will be discarded for bots that the client knows are no longer in the participants list (the client is aware of bot removals before the server is). - 2. Duplicate priority battles received from the server will be discarded (the server does not maintain state of which battles are sent to specific clients, so duplicates can be common). -* Upgraded to jni4net 0.8.5.1 (fixes [Bug-313][] above). - -## Version 1.7.3.1 (28-Jul-2011) - -### Bug Fixes -* [Bug-302][]: Hide enemy name implementation bug. -* [Bug-303][]: ``bullet.equals`` semantic has been change in 1.7.3.0 version. -* [Bug-304][]: ``setColor(null)`` causes NPE. -* [Bug-305][]: TeamRumble priority battles bug. -* [Bug-306][]: Rumble sh scripts for launching do not handle spaces in path. -* [Bug-307][]: Console output cannot handle non-ascii names. -* [Bug-308][]: ``ConcurrentModificationException`` in ``URLJarCollector``. -* [Bug-309][]: robot in development generates * into filename. -* [Bug-310][]: Interface Robot skips turns at end of round. -* Bug: ``BulletHitEvent.getBullet().getVictim()`` always returned null. - -### New Features -* [Req-135][]: Twin Duel configuration files. - * Twin Duel configuration files for the [RoboRumble][] client are now included. - -### Changes -* The Robot Editor is now saving and loading source files in UTF-8 (Unicode). -* Upgraded to use jni4net v0.8.4. - -## Version 1.7.3.0 (20-May-2011) - -### Bug Fixes -* [Bug-301][]: ``getTurnRateRadians`` incorrect for negative velocity. -* Fixed issues with unit-testing and building Robocode on Linux. - -## Version 1.7.3.0 Beta (26-Mar-2011) - -### Bug Fixes -* [Bug-222][]: Some of sound not working. - * The gunshot sound was not working. -* [Bug-297][]: x,y coords between ``BulletHitEvent`` & ``HitByBulletEvent`` differ. -* [Bug-299][]: Custom events no longer firing after clearing event queue. -* Fixed typo in the documentation with valid range of values for the battlefield width and height. - * Thanks goes to Tams Balog for pointing this out. - -### New Features -* Added "Enable auto recording" option to the Common Options, which automatically generates a zipped XML record for every battle. - * Works only when "Enable replay recording" is enabled (is automatically set when enabling auto recording). -* [Req-124][]: Ability to save the properties file for robots in dev. path. -* [Req-129][]: ``Rules.getBulletSpeed``. - * It is about keeping the bullet power within 0.1 - 3.0, even when input is lesser or greater than this valid range. -* [Req-128][]: In battle name hiding. - * A general solution has been provided. A new game rule, "hide enemy names", can be enabled or disabled. - -### Changes -* Upgraded to use jni4net v0.8.3. - -## Version 1.7.2.2 (04-Nov-2010) - -### Bug Fixes -* Fixed "3 * PI / 4 means West" in the Robot API, which should be "3 * PI / 2 means West". - * Thanks goes to Gottl Johannes for pointing this out. - -## Version 1.7.2.2 Beta (02-Oct-2010) - -### Bug Fixes -* [Bug-290][]: Development Options remove wrong item. -* [Bug-291][]: JavaDoc missing ``_Robot`` and similar -* [Bug-292][]: Robot PrintStream doesn't handle write in a portable fashion. -* [Bug-293][]: Wrong headings with the JuniorRobot. - * Thanks goes to Mr. Kschan for finding and providing a fix for this bug. :-) - -### New sample robots -* Tuan Anh Nguyen provided a modified version of the interactive sample robot named ``Interactive_v2``, which use absolute movement (up, left, down, right) on the screen that can be easier to control than the original ``Interactive`` sample robot. - * Both Interactive robots now use both the arrow keys and the W, A, S, D key for moving the robot. -* Sample robots have been written for the \#F language which are put in the "/samples/SampleFs" directory. - * These \#F sample robots are available with the .NET plug-in and comes along with Visual Studio project files. - -### New Features -* Implemented Robocode .NET Control API plug-in (robocode.control.dll) with documentation. -* [Req-115][]: Installed package should contain readme file. - * Added ReadMe.txt (using Markdown syntax) and ReadMe.html. - * The ReadMe is available from the Help menu. -* [Req-118][]: Enable/disable development paths. - * Check boxes for each of the entries in has been added to the Preferences -> Development Options. -* [Req-119][]: Provide JuniorRobot template for inexperienced users - -### Changes -* Robocode has been upgraded to use jni4net v0.8 with CLR 4.0 support. -* It is not necessary to specify ``-Dsun.io.useCanonCaches=false`` anymore with the startup scripts for Robocode and [RoboRumble][] as this property is now automatically set internally when running Robocode under Windows. - * Hence, this property has been removed from all .bat, .sh, and .command files for Robocode. -* Robocode will not notify about Beta versions anymore per default. - * However, a new option in the Common Options (under Preferences) makes it possible to enable/disable notifications about new Beta versions. -* The tabs for the "Common" and "Development Options" in the Preferences window are now the first tabs. - -## Version 1.7.2.1 (05-Aug-2010) - -### Bug Fixes -* [Bug-283][]: Possible for robot to kill other robot threads. -* [Bug-287][]: Zipped robots data files are not extracted. -* [Bug-284][]: Robot Packager doesn't package source file in Eclipse proj. -* [Bug-215][]: Missed onRobotDeath events. - * Thanks goes to ForNeVeR for finding and solving this bug. -* [Bug-282][]: Cannot see robot with no package in New Battle dialog. -* [Bug-285][]: Robot Packaging Wizard doesn't save value for Next & Back. -* [Bug-286][]: ``ClassNotFoundException at RobotClassLoader.java:271``. -* [Bug-288][]: "skipped" turns at start with ``-Ddebug=true``. -* [Bug-289][]: Exclude filters not working. -* Bug: Sometimes the compiler window was hanging for several seconds, even though the compiler had finished compiling. - -### Changes -* The Robot Packing Wizard will now only allow word characters (letters, digits, dots, *but not spaces*) with the version field. -* Added ``robocode.annotation.SafeStatic``, which can be used to suppress warnings in the robot console for a robot that uses a static Robot reference on a field. - * Note that this means that your robot will need to clean the static field, when a new round is started. - * This annotation was suggested by Nat Pavasant: - - @SafeStatic - private static AdvancedRobot robot; -* Added syntax highlightning on Java annotations for the Robot Editor. - -## Version 1.7.2.1 Beta (19-Jun-2010) - -### Bug Fixes -* [Bug-231][]: Lockup on start if too many bots in robots dir (cont'd). - * Additional fixes were made. -* Fixed some issues with the robot repository when file URLs contains spaces, where robots were sometimes disappearing from the repository. - -### Changes -* [Req-99][]: Move away from Jikes towards ECJ. - * Jikes 1.22 has been replaced with the Eclipse Compiler for Java (ECJ) 3.5.2. - -## Version 1.7.2.0 (28-May-2010) The ".NET robots are now supported" release - -### Bug Fixes -* Bug: Robots were disabled when skipping 30 skipping non-consecutive turns (or 120 turns when performing I/O operations). - * Now, Robocode is only disabling robots when the robot skips 30 consecutive turns, which is the original behavior, and which has been broken since version 1.6.1.4. -* [Bug-275][]: Duplicate version numbers prevents uploading. -* [Bug-276][]: ``tzu.TheArtOfWar 1.2`` gets ``NullPointerExceptions``. -* [Bug-278][]: Attempting to install robocode over an existing install NPEs. -* [Bug-281][]: The robocode.command is missing the execute permissions bit. -* [Bug-277][]: Problems with ``Graphics2D.fill/draw(Shape)``. -* [Bug-280][]: NPE when uploading results. -* [Bug-274][]: "Ignoring" messages in rumble are duplicated. -* [Bug-269][]: Minor visual bug - Currently selected robot gets covered. -* Bug: A security exception was thrown with development robots trying to access their data directory. - -### Changes -* Robocode will now only install batch files relevant to the hosting system, e.g., .bat files are not installed under Unix/Linux/Mac OS X, and .sh files are not installed under Windows. -* Furthermore, .command files are only installed under Mac OS X, and has now the execution permission bit set (due to [Bug-281][]). -* Robocode will now write out a warning in the robot console when a robot is detected that uses static references to a robot, i.e. static fields that are declared as e.g. a ``Robot``, ``AdvancedRobot``, ``TeamRobot`` etc. (typically references to the robot itself). - * A static reference to a robot can cause unwanted behavior with the robot accessing these. Hence, it is strongly recommended that static robot references in a robot class or within its helper classes are changed into non-static references and that the robot is recompiled afterwards. - * In every round, Robocode is creating new instances of the individual robot, meaning that static references to former ``Robot`` objects points to "dead" ``Robot`` objects that are not used anymore in the game, and which cannot be garbage collected during the battle when there is static references to these. - -## Version 1.7.2.0 Beta 3 (29-Apr-2010) The ".NET robots are now supported" release -Thanks goes to Alex Schultz for keep finding bugs, but also helping out solving these. :-) - -### Bug Fixes -* [Bug-271][]: Battle engine consumes more CPU power over time. -* [Bug-267][]: Strange issue first time running roborumble in 1.7.2.0 Beta2. -* [Bug-272][]: ``isTeammate()`` sometimes returns false with teammates. -* [Bug-263][]: Cannot extract downloaded robot for editing in Robot Editor. -* [Bug-270][]: Strange thread exceptions with kid.DeltaSquad in 1.7. -* [Bug-228][]: ``Krabb.sliNk.GarmTeam 0.9v`` locks up in new beta. -* [Bug-265][]: Occasionally losing the bit of text in the robot console. -* [Bug-255][]: ``java.lang.Error: Interrupted attempt to aquire read lock``. -* Bug: Teams with versions could not be found in a development path. -* Bug: Files in ``/robots/.data`` or ``/robots/.robotcache`` directory were put into an underscore sub-directory. -* Bug: The "Kill Robot" button in the robot console windows was often disabled. - -### Changes -* The robot console now uses a rolling buffer so when the number of lines in the robot console exceeds the max number of lines (500), the oldest lines are removed, and ``^^^ TEXT TRUNCATED ^^^`` is written in the top. - * Previously half of the text was truncated when the max number of lines was reached. - -## Version 1.7.2.0 Beta 2 (14-Mar-2010) The ".NET robots are now supported" release - -### Bug Fixes -* [Bug-254][]: Roborumble doesn't upload with ``EXECUTE=NOT``. -* [Bug-257][]: Team RoboRumble uploading is broken. -* [Bug-262][]: TeamRumble: Cannot find robot in nested .jar files. -* [Bug-244][]: Robot static data isn't being GCed after battle. - * Additional fixes were made to solve this issue. -* [Bug-258][]: ``isTeammate()`` called on null gives ``NullPointerException``. -* [Bug-260][]: ``ArrayIndexOutOfBoundsException`` when starting team battle. -* [Bug-250][]: Installer installs ``AutoExtract$1.class``. -* [Bug-252][]: ``yk.JahRoslav 1.1`` throws ``WinException``. -* [Bug-259][]: ``jlm.javaDisturbance`` loses substantial score in 1.7.2 Beta. -* [Bug-261][]: (.NET) condition tested on concurrently modified collection. - -### License Change -* We have changed license from Common Public License (CPL) v1.0 into Eclipse Puplic License (EPL) v1.0. - -## Version 1.7.2.0 Beta (15-Feb-2010) The ".NET robots are now supported" release - -### Bug Fixes -* [Bug-244][]: Robot static data isn't being GCed after battle. -* [Bug-245][]: Removing directories from "development options" doesn't work. -* [Bug-247][]: Version ordering is somewhat strange with letters. -* [Bug-243][]: Robot console text sometimes disappears. -* [Bug-240][]: ``morbid.MorbidPriest_1.0`` fails to load. -* Bug in ``RobotClassLoader`` causing ``ClassNotFoundException`` for some robots during robot class load. -* Fixed a ``NullPointerException`` occuring when Robocode is (re)loading the robot repository after a developer path has been removed. - -### New Features -* .NET Robocode plug-in. - * It is now possible to code robots in .NET and let them engage in Robocode battles. :-) -* [Req-101][]: ``onRoundEnded()``. - * It is now possible for robots to get notified when a round has ended. - * The ``onRoundEnded()`` event handler receives a new ``RoundEndedEvent`` that contains information about the number of turns in the round and total turns in the whole battle when the event occurred. - * The ``robocode.control.RoundEndedEvent`` in the Control API has been extended with a new method named ``getTotalTurns()`` similar to the new ``robocode.RoundEndedEvent`` for the Robot API. -* [Req-114][]: RateControlRobot vs. TeamRobot. - * The ``RateControlRobot`` is now a ``TeamRobot`` meaning that it can participate in team battles. -* [Req-113][]: Skipped turn events. - * Added ``getSkippedTurn()`` method on the ``SkippedTurnEvent`` class, which returns the turn that was skipped. - * The ``SkippedTurnEvent.getTime()`` returns the time when the ``SkippedTurnEvent`` was processed by the robot, which is always later when the robot is skipping turns. - * The message ``SYSTEM: you skipped turn`` has been improved, so it will tell which turn that was skipped like ``SYSTEM: john.Doh skipped turn 43``. -* [Req-80][]: Screenshot of battleview. - * Press Ctrl+T on Windows and Linux, and Command+T for Mac OS in order to take a screenshot of the battle view. - * The screenshot will be saved in the Robocode folder named "screenshots", and the filename will be a timestamp for when the screenshot was taken. -* [Req-89][]: Launch Robocode from .br (battle record) files. - * Robocode is now able to launch from from .battle (battle specification) and .br (battle record) files in Windows. -* [Req-86][]: Rankings should be visible when Robocode is minimized. - * A new View Option has been implemented to preventing speedup when minimized. - * This new View Option can now be set in the Preferences by putting a check mark into "Prevent speedup when minimized". -* [Req-93][]: Rename ``/robots/.robotcache`` to ``/robots/.data``. - -### Changes -* Browser support has been improved for Mac OS, Unix and Linux, which in most cases did not work properly. - * In previous versions of Robocode, the browser.sh was used to start up the user's preferred browser. The browser.sh file is not being used anymore. Hence, this file can safely be removed from your Robocode installation dir. - * Now, Robocode will start up a browser under Mac OS, Unix and Linux with no use of scripts. -* The Development Options dialog in the Preferences has been improved: - * Changed from using single interval selection to multi selection interval. - * Adding an existing path is ignored. - * The list of path is automatically sorted. - -## Version 1.7.1.6 (06-Jan-2010) - -### Bug Fixes -* [Bug-237][]: OS X 10.6: Cannot run Robocode from robocode.sh. - * It must be run from the new robocode.command file instead. -* [Bug-238][]: OS X 10.6: The editor cannot see the JD - * It must be run from the new robocode.command file instead. -* The ``onDeathEvent(DeathEvent)`` method was called too late, when a new round was about to start. Not when the robot has died. -* [Bug-231][]: Lockup on start if too many bots in robots dir (cont'd) - * Additional fix was made to locate multiple robots under the same package. -* Changed the robot painting so that everything that goes into the painting buffer is always painted, and remaining painting operations exceeding the buffer capacity are always dropped. - * Previously, only the last painting operations exceeding the painting buffer were executed. - -### New Features -* The amount of used memory and total memory is now shown in the title bar of Robocode. - * This is useful to see how much memory your robots are consuming. - -### Changes -* If the robot paints too much between actions, an improved error message is written out in the robot console. - * But from this version of Robocode this message is only written out once. -* A ``SecurityException`` is now thrown if a robot exceeds its max. data file quota, meaning that it uses more than 200.000 bytes its data files in total. - -## Version 1.7.1.6 Beta (10-Dec-2009) - -### Bug Fixes -* [Bug-236][]: Robot Editor doesn't accept packagename with dot (.) in it. -* [Bug-234][]: Source is not included. - * Additional fix was made for this issue. -* [Bug-231][]: Lockup on start if too many bots in robots dir (cont'd) - -### Requests -* [Req-92][]: Scrollable properties. - * All console windows including the Robot Console and Properties are now scrollable, and all have the same look. - -### Changes -* It is now possible to add paths to robot project inside an Eclipse workspace under the Development Options in the Preferences. - * Robocode will read the .classpath file in the project in order to locate both class files, properties files, and java files. - * This means that the Robot Packager is now able to include your source files when you use Eclipse, and it supports multiple source paths. - * **Note:** Robocode does not support linked sources or include and exclude filters. -* Changed the messages given when creating a new robot with the Robot Editor regarding robot name and package name. - -## Version 1.7.1.5 (11-Nov-2009) - -### Bug Fixes -* ``RobocodeFileOutputStream.getName()`` always returned ``null`` instead of the filename. -* Robots listed in e.g. the New Battle window was sorted like: 1.1.1, 1.1.10y, 1.1.2, 1.1.10 (alpha-numerical). - * But version numbers with an ending letter like in "1.1.10y" like in the versions just listed, were not placed in the correct order. - * Notice that 1.1.10y is between 1.1.1 and 1.1.2. This bug has been fixed so the versions in the example now will be sorted correctly like: 1.1.1, 1.1.2, 1.1.10, 1.1.10y. - -## Version 1.7.1.5 Beta (14-Oct-2009) - -### Bug Fixes -* [Bug-232][]: ``Graphics2D.getTransform()`` throws NPE. -* [Bug-233][]: "Teleport" - * occurred when robot's distance remaining was very large. -* [Bug-234][]: Source is not included. - * ``robot.java.source.included`` was not set in the robot.properties file. - -## Version 1.7.1.4 (25-Sep-2009) - -### Bug Fixes -* [Bug-226][]: ``java.io.FileNotFoundException`` in ``RobotFileSystemManager.init``. -* [Bug-227][]: Can't load ``Katana 1.0`` or ``DrussGT 1.3.1wilo``. -* [Bug-230][]: Lockup on start if too many bots in robots dir. -* [Bug-229][]: ``IllegalArgumentException`` on painting in some robots? -* Fixed ``NullPointerException`` that could occur with the ``-battle`` command-line option. - -### Changes - -#### Banning -* The previous 1.7.x.x versions have been very strict so that robots that could not be loaded, started, skipped too many turns etc. would be disallowed to participate in battles. - * With the bug fix for [Bug-227][] above this policy has been changed so robots are only "banned" if they cause a security violation or they could not be loaded or started (meaning that they will not be allowed to run). - * In addition, ALL security violations are always written out in both the main console and robot's console. A message will be written out in the main console like ``xxx has caused a security violation. This robot has been banned and will not be allowed to participate in battles``. - -#### Painting -* With the bug fix for [Bug-229][] a change was made so a robot will now receive this message in its console window, if it is painting too much between actions: - - SYSTEM: This robot is painting too much between actions. Max. capacity has been reached. -* Notice that a robot is not allowed to perform an unlimited amount of paint operations for two reasons: - 1. It takes up a lot of memory as the painting operations are recorded in a buffer before being processed, and potentially this buffer must be recorded to a file (for replays). - * A robot is allowed to use up to a maximum of 64 KiB per paint action. An average painting operation like e.g. ``fillRect(x, y, width, height)`` takes up 15 bytes, meaning that more than 4000 painting operations should be possible per paint action, which is a lot. - 2. It takes a lot of CPU cycles to process the painting buffer to the display making the painting slow if the buffer is too large. -* It is possible to remove the limit for the robots painting buffer by using the existing command-line option: ``-Ddebug=true``. - -## Version 1.7.1.4 Beta (26-Aug-2009) -This version is dedicated for the [RoboRumble][] community where many issues seen with the RoboRumble client have been solved. - -Thank you all for reporting as many known issues as possible, and also help out solving these - especially with the issue seen with the robot movement that had a big impact on the scores and rankings! :-) - -A big thanks goes to Patrick Cupka ("Voidious"), Julian Kent ("Skilgannon"), "Positive" and Nat Pavasant ("Nat") for their combined work with developing and testing the new and improved robot movement regarding acceleration and deceleration rules ([Bug-214][]). :-) - -### Bug Fixes -* [Bug-214][]: Accel/decel rules introduced in 1.7.1.3 causes trouble. -* [Bug-215][]: Missed onRobotDeath events. -* [Bug-212][]: Team jar files reported as corrupted. -* [Bug-208][]: Does not extract .properties files into bot data dirs. - * The previous fix for this issue did not work properly as the file sizes were truncated to 0 bytes. -* [Bug-216][]: Sometimes too few results for robots are displayed. -* [Bug-213][]: ``NullPointerException`` when setting classpath directory. -* [Bug-209][]: [Codesize] Invalid entry point in codesize-1.1.jar. - * Previous fix was not working properly. -* [Bug-218][]: Robocode enters infinite loop with the Restart button. -* Bug: The RateControlRobot (Beta) returned rates in radians instead of degrees with the methods: ``getTurnRate()``, ``getGunRotationRate()``, and ``getRadarRotationRate()``. - -### Changes for RoboRumble -* Updated the PARTICIPANTSURL in the roborumble.txt, meleerumble.txt, and teamrumble.txt. - -## Version 1.7.1.3 (08-Jul-2009) - -### Bug Fixes -* [Bug-210][]: Bullet and Ram Damage Bonuses are wrong. -* [Bug-208][]: Does not extract .properties files into bot data dirs. -* [Bug-207][]: Access denied ``javax.swing`` ``-DNOSECURITY=true``. -* [Bug-209][]: [Codesize] Invalid entry point in codesize-1.1.jar. -* Bug: Sometimes the "Show results when battle(s) ends" in the Common Options was disabled when running the RobocodeEngine, even though the setting had been enabled earlier. -* A ``NullPointerException`` occurred when closing the Preferences window, when no sound device is present in the system. - -### Changes -* The default font on the ``Graphics`` context when using ``onPaint(Graphics2D)`` or ``getGraphics()`` has been changed to the "Dialog" font. - -## Version 1.7.1.3 Beta (08-Jun-2009) - -### Bug Fixes -* ``AdvancedRobot.setMaxTurnRate()`` did not work properly since version 1.5.4. -* [Bug-205][]: Wrong survival scores sent by rumble client. -* [Bug-206][]: Funny behaviors with robot graphics/painting. - -### New RateControlRobot (Beta) -* Joshua Galecki has provided a new robot type, the ``RateControlRobot``, which is an extension of the ``AdvancedRobot``. -* The ``RateControlRobot`` class has been created in an attempt to allow more realistic robots. - * That is, many real/physical robots are given commands in terms of rates ("move forward one meter per second"). Hence, the ``RateControlRobot`` helps simulating a real robot. -* With this release, we ask the community for feedback and we will announce it as stable in one of next major releases. So please report issues or change requests etc. for this new robot type. - -### Changes for RoboRumble -* Added validation of each of the participant lines of the participant list. - * If a participant line is invalid due to e.g. wrong format/syntax or bad URL, then an error message is written out and the participant is ignored. -* The format of the lines in the participant lines is the same as usual. - * Accepted lines must follow this format: ``,(|)``, where must match the regular expression ``[\\w\\.]+[ ][\\w\\.-]+``, the must be a HTTP URL pointing at the robot .jar file, and the must be a number. The and are mutual exclusive. - * Example of accepted lines: - - johndoe.SomeRobot 1.0,http://somewhere.com/SomeRobot\_1\_0.jar - johndoe.SomeRobot 1.0,321 - -* Removed the info message "Trying to download " from the console output. - -### Other changes -* The Development Options has become more usable, as Ruben Moreno Montoliu has added a list of paths and buttons for adding and removing directories, full resizable. -* Updated the Javadoc with a note for the ``setAdjustXX()`` robot methods, which are ignored when turning with infinite values. - -## Version 1.7.1.2 (25-May-2009) - -### Bug Fixes -* [Bug-199][]: FontMetrics StackOverflowError. -* [Bug-200][]: ``Graphics2D.setFont()`` has no effect. -* [Bug-201][]: ``setMaxVelocity(lower than current) + reverse`` direction bug. -* [Bug-196][]: Wrong file path used for development bots. - * Refixed. -* [Bug-202][]: Installer says to run robocode.jar. -* [Bug-204][]: Nanobot rumble not sending melee or team parameters. - * Thanks goes to Jerome Lavigne ("Darkcanuck") for this fix. -* Fixed three bugs introduced with the Beta version found using new test units: - * One bug where the speed would immediately drop to max. velocity when calling ``setMaxVelocity()`` - disregarding the acceleration and deceleration rules. - * Another bug where the turn rate was a bit wrong when moving back and turning left in the same time. - * A third bug where the robot continued to move backwards when it should have stopped due to ``setAhead(0)`` or ``setBack(0)``. - -## Version 1.7.1.2 Beta (08-May-2009) - -### Bug Fixes -* [Bug-139][]: Bug in RobotPeer.updateMovement? - * Robocode was not moving 100% according to it's own rules. Now it is. -* [Bug-192][]: Fair Play! - * With two identical robots in a battle against each other, the first robots was much more likely to win, which was not fair. -* [Bug-195][]: Client tries to remove all participants. - * When RoboRumble, TeamRumble, and/or MeleeRumble downloaded the participants list and did not receive a ``HTTP_OK`` or an empty list, the participants list was emptied. This caused problems with the RoboRumble server. -* [Bug-196][]: Wrong file path used for development bots. - Added option ``-DALWAYSUSECACHEFORDATA`` for anyone who liked it better. -* [Bug-197][]: Melee rumble doesn't use "smart battles". - * Thanks goes to Jerome Lavigne ("Darkcanuck") for this fix. - * Smart battles are also known as "priority battles". -* Fixed several ``ArrayOutOfBoundsExceptions`` occurring when starting a battle with fewer robots than a battle just played with more robots. - -### Changes for RoboRumble -* The participants URL for RoboRumble, MeleeRumble, and TeamRumble have been updated to use the participant lists from the new RoboWiki: - * [RoboRumble](http://robowiki.net/wiki/RoboRumble/Participants). - * [MeleeRumble](http://robowiki.net/wiki/RoboRumble/Participants/Melee). - * [TeamRumble](http://robowiki.net/wiki/RoboRumble/Participants/Teams). - -### Other changes -* Updated the Help menu to point at the new RoboWiki regarding the Online Help and FAQ. -* RobocodeEngine control class: Added additional ``runBattle()`` method where it is possible to specify the initial positions of the robots when starting a battle. -* The about box was updated, where contributors are now written in bold and in a green color. - -## Version 1.7.1.1 (10-Apr-2009) -With this release we have focused on eliminating as many problems seen with [RoboRumble][] as possible. Hence, this version should hopefully prove stable as the new RoboRumble client. - -### Bug Fixes for RoboRumble -* [Bug-188][]: Meleerumble using 2 bots instead of 10. - * Now the ``MELEEBOTS`` (number of robots that participate in a melee battle) works as expected. -* [Bug-193][]: TeamRumble uploading result for Robot instead of team. -* [Bug-187][]: Not enough java memory allocated in launch scripts. - * The launch scripts for RoboRumble and TeamRumble were changed so it is allowed to use up to 512 MB heap memory, and MeleeRumble is allowed to use up to 1024 MB. -* [Bug-191][]: ``EOFException`` during repository rebuild. - * Exception is now reported in a simplified way. -* [Bug-194][]: JarJar multi-registration. - * RoboRumble was not reusing the same RobocodeEngine instance. - -### Other bug fixes -* [Bug-169][]: ``pe.SandboxDT_3.02`` stopped working in 1.6.2 and later version. - * We had broken semantics of ``getTeammates()`` to return empty array when there is no team. -* [Bug-189][]: API - cannot subclass Event in 1.7.1. -* [Bug-190][]: Errors with some robot classes when rebuilding database. -* [Bug-185][]: Webpage button lay over robot description. -* [Bug-186][]: Rounds number do not saved between run. - -### JuniorRobot changes -* Bug - The event variables ``scannedXX`` and ``hitXX`` on the JuniorRobot was not reset to -1 (or -99) when nothing was scanned or hit. -* [Req-90][]: Prevent JuniorRobot to be unresponsive. -* **Change:** JuniorRobot will now automatically scan for enemies when it is not moving. - -## Version 1.7.1 (24-Mar-2009) - -### Bug Fixes -* [Bug-176][]: Editor UNDO does delete the line when no undo left. -* [Bug-180][]: Editor: Find (set cursor position). -* [Bug-182][]: roborumble.sh and teamrumble.sh are broken. -* [Bug-183][]: ``NullPointerException`` in ``BattlesRunner.runBattlesImpl``. -* [Bug-184][]: Custom event priority broken. - -### Changes -* The New Battle dialog is now larger per default. -* The layout of the View Options and Sound Options tab in the Preferences has been improved. - * An error dialog is shown when the input field for the desired TPS is out of range. - -## Version 1.7.1 Beta 2 (11-Mar-2009) - -### Bug Fixes -* [Bug-178][]: Typing to find bot no longer works. -* [Bug-181][]: API: Typo in Documentation ``onBulletMissed(BulletMissedEvent)``. -* [Bug-179][]: Event.setTime() method should not be hidden. - * Put back ``setTime()`` method of ``Event``, the security is now handled other way instead of hiding the field. -* Fixed the problem with loading team robots from nested .jar files. -* On Ubuntu (Linux) the "Default window size" did not work properly. - -### Internal Changes -* On SUN's JVM enabled caching of .jar files opened thru ``URLConnection``. - * Solved problem with closing such files by implementing ``URLJarCollector``. - -## Version 1.7.1 Beta (01-Mar-2009) -With this release we give BIG thanks to Nat Pavasant who have put in great effort in testing and finding as many bugs in Robocode as possible. He has been a great help with testing especially [RoboRumble][] functionality. - -Currently, there is one known issue, which will be fixed with the next Beta or in the final release of version 1.7.1. This is critical for e.g. the TeamRumble, so please notice the known issue below. - -### Known issue -* With this version Robocode cannot handle team packages containing robot .jar files, i.e. robot packages. - -### Bug Fixes -* [Bug-166][]: Bots referencing ``robocode.robocodeGL`` broken. -* [Bug-168][]: Bots inconviently stop working if they go over time limit. -* [Bug-172][]: Robot console fails to display some deaths/wins. -* [Bug-174][]: Robot console is sometimes empty. -* [Bug-173][]: Robot packager can be activated once per running. -* [Bug-175][]: Development robots cause problems with data files. -* [Bug-171][]: A battleview size exceed 800x600 filled with black. -* [Bug-165][]: ``NullPointerException`` when using ``-battle`` option from cmd-line. -* [Bug-170][]: Robot Colors don't stick between rounds. -* [Bug-177][]: Open battle menu dialog is not loading robots. -* Bug: The command line usage of Robocode was not printed out at all when using the ``-?`` or ``-help`` option. - -### New Features -* Added ``getCurrentWorkingDir()`` + ``getRobotsDir()`` to the ``robocode.control.RobocodeEngine``. -* [Req-86][]: Rankings should be visible when Robocode is minimized. - * This feature has been added and it is possible to control the behavior from Common Options in the Preferences with the "Don't hide Rankings when main window is minimized", which is enabled per default. -* [Req-88][]: Command Line option for saving a battle record file. - * Two new command line options have been added for Robocode, i.e. ``-record `` and ``-recordXML ``. - * The ``-record option`` records the battle as a binary and zipped battle record. Here I propose that the specified filename should is something like record.br. - * The ``-recordXML`` does the same as the -record option, but saves the battle record as an XML file. Here I suggest that you use a filename like record.br.xml. -* [Req-49][]: Speedup time required for rebuilding robot database. - -### RoboRumble Changes -* Changed the link for [http://rumble.fervir.com/rumble](http://rumble.fervir.com/rumble) into [http://darkcanuck.net/rumble](http://darkcanuck.net/rumble) as the RoboRumble server fervir is down and with unstable ranking. - * The current ranking at Darkcanuck's server is alive. Almost all clients are point to Darkcanuck's now. Hence, it is updated now. -* [Req-82][]: Launch upload result in separate thread. - * Results from the [RoboRumble][] client is now uploaded in a seperate thread. -* [Req-84][]: Added append option in copy method (``FileTransfer`` class). - -### Internal Changes -* The robot repository has been updated. It is no longer extracting .jar files. - * It also remembers last timestamp on file so detection of the changes is really fast. Only data files are extracted now. - * Data files for non-packed robots were moved to .robotcache as well. -* VersionManager is now able to detect if the Robocode version was upgraded since last run. -* Blocking security issue with relative path in ``getDataFile()`` method. -* Improved security in RobotClassLoader. -* Reimplemented RobotPackager. -* ``BulletSnapshot`` has now method ``getBulletId()`` which gives identity of bullet for UI. - -## Version 1.7.0.2 (16-Feb-2009) - -### Bug Fix -* The fix for [Bug-164][] (Compiler Classpath Suggestion) backfired, as the entire text field in the window with the compiler properties would now be quoted. - * Hence, the compiler would not be able to compile, and it was not possible to change the compiler preferences from the GUI. - -## Version 1.7.0.1 (14-Feb-2009) - -### Bug Fixes -* [Bug-163][]: Spaces or native names in name of robocode directory. - * Some users experienced problems with starting Robocode. Hence, all startup batch and shell files for Windows, Linux, Mac OS X etc. have been corrected. -* [Bug-164][]: Compiler Classpath Suggestion. - * When running Robocode in a folder with spaces, the compiler classpath was not quoted. Hence, the compiler would not work. - -## Version 1.7 (11-Feb-2009) - -### Bug Fixes -* [Bug-160][]: Battle Results screen displaying old results. - * The results where not updated on the Battle Results windows between battles. -* [Bug-161][]: Robot disabled by any other than losing energy can recover. - * Robots disabled due to bad behaviour could regain energy by hitting another robot by a bullet after it had been disabled. - * Now this is only possible when the robot has disabled itself by using all its energy, and will be able recover energy by hitting an enemy, which is allowed. -* [Bug-162][]: Team battle. - * Robots like ``abc.Shadow 3.83``, ``davidalves.Phoenix 1.02``, and ``kawigi.micro.Shiz 1.1``, ``kawigi.micro.ShizPair 1.1`` caused a ``NullPointerException`` and would not show up on the battle window. - -## Version 1.7 Beta 2 (26-Jan-2009) - -### Bug Fixes -* [Bug-158][]: Ubuntu throws ``NullPointerException`` in main. - * This bug occurred when trying to startup Robocode. -* [Bug-159][]: Installation fail on windows if directory contain space. - -### Changes -* Improved the version checking for new Robocode versions available for download. - -## Version 1.7 Beta (19-Jan-2009) -* This version represents a completely new infrastructure of Robocode making it easier to extend and maintain for the future. It does not contain New Features compared to the previous version of Robocode, but focus on working the same way as the previous versions despite of all the restructurings. - -### Bug Fixes -* [Bug-156][]: Spammy output on robot console windows. - -### Internal Changes -* Robocode was modularized using the dependency injection framework PicoContainer. - * This work includes introduction of many interfaces to existing components. -* Introduced Maven2 as build setup where the whole directory layout is based on the standard Maven structure. -* Rewritten the ``RobotClassLoader`` so it is able to load .jar file in the future. -* Rewritten security layer to use ``AccessController`` and ``CodeSource`` for detection of trusted code. -* Redesigned ``RobocodeProperties`` to ``SettingsManager`` and introduced ``ISettingsListener``. -* Implemented ``RbSerializer`` to be able to implement IPC (Inter-Process Communication) in future. - * This should make it possible to extend Robocode for more platforms like e.g. Microsoft .NET. -* Redesigned ``RepositoryManager`` and nearby to hide implementation details. -* Moved all implementation of Robocode to the package ``net.sf.robocode``. - * The old package ``robocode`` is now "used only" for API to outer world in order to keep backwards compability. - -## Version 1.6.2 (04-Jan-2009) - -### Bug Fixes -* [Bug-154][]: Robot name missing when replaying XML record. -* [Bug-153][]: Junior Robot ``turnAheadRight`` bug. - * When a JuniorRobot was calling ``turnAheadRight()``, ``turnAheadLeft()``, ``turnBackRight()``, or ``turnBackLeft()``, the following exception occurred causing the robot to be terminated: - - java.lang.ClassCastException: robocode.peer.proxies.StandardRobotProxy -* [Bug-151][]: Exception when changing between ``Robot`` to ``AdvancedRobot``. - * When a robot was changed from a ``Robot`` into an ``AdvancedRobot`` and recompiled, the game would cast a ``ClassCastException`` if a battle was started or restarted including that particular robot. - * However, this bug did not occur with new battles where the list of robots was refreshed (by pressing Ctrl+R). - -## Version 1.6.2 Beta 4 (22-Dec-2008) - -### Bug Fixes -* Fixed open battle dialog, which was not loading. -* Fixed recorder NPE. -* Fixed serialization problems of scan arc (``Arc2D``). -* Fixed problem with reloading robot repository on each next battle dialog. - -## Version 1.6.2 Beta 3 (18-Dec-2008) - -### Changes -* Published new battle events and battle snapshots in the Control API, i.e. in the ``robocode.control`` package. -* Added missing Javadocs (HTML documentation) to public Robocode API classes. - -### Bug Fixes -* The current scoring (not the total scoring) was calculated wrong from version 1.6.1. - * The current Ramming Kill Bonus was set to current bullet kill bonus, which gave wrong ranking in the Ranking Panel. -* [Bug-148][]: Wrong bullet power. - * Wrong bullet power could be reported back from ``Bullet.getPower()``, which could be ``> Rules.MAX_BULLET_POWER`` or ``< Rules.MIN_BULLET_POWER``. -* [Bug-147][]: gunHeat is negative. - * gunHeat could be negative, which should never occur. -* [Bug-149][]: Replay exception. - * An ``ArrayIndexOutOfBoundsException`` occurred in some situations. -* Fixed problem with ``RobocodeEngine.setVisible(true)``, where the ``RobocodeEngine`` would hang forever. - -## Version 1.6.2 Beta 2 (07-Dec-2008) - -### Bug Fixes -* Fixed problem with Bullet identity. -* Battle cleanup concurrency issue. -* Fixed problem with robots without package. -* AWT AppContext cleanup. -* Fixed versions comparison problem. - -### Changes -* Mostly cleanup of code and documentation. -* Improved compatibility with RobocodeJGAP. -* Development robot version names were visible in the robot repository. - -## Version 1.6.2 Beta (25-Nov-2008) - -### Bug Fixes -* [Req-78][]: Visual debugging without cpu penalty. - * Now Robocode gives a robot unlimited time when painting is enabled on UI (in the robot dialog) for that robot. -* Robocode will not load non-valid robots from repository anymore. -* Fixed placement of the robot dialogs (aka. robot console windows). -* Exception on robot's ``Condition`` doesn't break further processing now. -* [Bug-146][]: Spammy output when running roborumble. - * Output from RoboRumble was spammy when outputting log after the first battle. -* ``java.lang.IllegalArgumentException: Line unsupported: interface Clip supporting format`` could occur when starting Robocode. -* [Bug-81][]: Replay recording does not record paintings. - -### New Features -* [Req-24][]: Recording of battles. (fully implemented) - * Battle recording and replay: Saving to binary and xml file. -* [Req-63][]: Replay should store debug graphics. - * Robot painting and debug properties are now being recorded, but robot painting is not exported to xml. - * Recording is slowing down the game and eats memory and disk space. Hence, you need to enable it in options, as it is disabled per default. -* New command line option ``-replay`` for replaying a battle record. -* New dialog for battle console and battle turn snapshots. -* Robot dialog: New tab-page with robot properties. -* The robot API has been extended with a new ``setDebugProperty()`` method. - * See the ``sample.PaintingRobot`` robot for example of usage. -* [Req-31][]: Redirecting Robot output, running without GUI. - * The ``robocode.control`` package has been improved so that the ``RobocodeEngine`` is able to return much more detailed information about was is going on inside the battle for each turn, round, and battle thru a new ``IBattleListener`` interface. - * With the new ``RobocodeEngine`` it is possible to a detailed snapshot of the game state, e.g. the states of all robots and bullets, and also get the messages sent to the robot console etc. -* [Req-77][]: Better "lifebar" display. - * Robot buttons on the Battle View is now showing the amount of energy and score as two coloured bars within the robot button. - -### Changes -* Redesigned ``RobotPeer`` and ``Battle``. - * Now we send messages between threads instead of synchronizing individual properties. - * Code here is much more readable now. -* Most synchronization is now interlocked. -* Event manager, priority and dispatch of events refactored. -* The methods ``setPriority()`` and ``setTime()`` on the ``Event`` classes are no longer part of the Robot API. - * These methods were used internally by the game. - * Events are final classes now. -* More unit tests were added. -* ``Graphics2DProxy`` optimized. -* Interactive robots are better detected to not waste time of non-interactive robots. -* Team messages are deserialized on receiver robot thread. -* Got rid of robot loader thread. - * Now Robocode is loading on robot's thread, where we got more security. -* Introduced new interfaces for code components. -* Robot threads have ``NORM_PRIORITY - 1``, AWT UI have ``NORM_PRIORITY + 2``. -* [Req-75][]: Add client version to POST data sent to server. - * We now upload the [RoboRumble][] client version when uploading results to the RoboRumble server. -* Robots which are "wrong behaving" are removed from the robot repository and are not given another chance to run. - * This goes for skipped turns, for unstoppable robots and for robots with class loading troubles. -* Changed the formatting of this versions.txt file in order to improve readability. - -## Version 1.6.1.4 (14-Nov-2008) - -### Bug Fixes -* Loosing robots were not receiving ``onBattleEnded(BattleEndedEvent)`` events. -* A new security issue fix for robots that were able to execute code thru the Event Dispatch Thread (EDT). - * **Robots that try to access the EDT will be disabled!** -* [Bug-144][]: drawArc does not work as expected. - * Both ``drawArc()`` and ``fillArc()`` are now using the Robocode coordinate and angle system. -* [Bug-143][]: Blank console window when compiling. - * Some systems still had this issue, so a new fix has been applied. - -### New feature -* [Req-65][]: Score % display. - * The results and current rankings (during a battle) is now showing the score as percentage(s) in parenthesis right beside the score points like e.g. '7875 (12%)' for the total score in the results and '21 / 2900 (7 / 14%)' with the current rankings. - * Thanks goes to Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh for this contribution! - -### Changes -* The command-line option ``EXPERIMENTAL`` (= ``true`` or ``false``) allowing access to the robot interface peer is now working for the ``RobocodeEngine`` class also. - -## Version 1.6.1.3 (24-Oct-2008) - -### Bug Fixes -* [Bug-143][]: Blank console window when compiling. - * This bug was introduced in 1.6.1.2. - * When trying to compile a robot that would give a compiler error, the output console window for the compiler could be blank on Windows system and/or hang. - * Now the compiler error is output correctly as in previous versions. -* [Bug-137][]: Roborumble ``ITERATE`` broken. - * When running RoboRumble with ``ITERATE=YES``, ``DOWNLOAD=YES``, and ``RUNONLY=SERVER``, the ratings were only read once, not per iteration. - * This bug fix removes a very old bug and the need of using a batch file as workaround in order to do the loop with updated ratings. -* [Bug-141][]: The ``-DROBOTPATH=`` option does not work. -* [Bug-142][]: Broken .sh files. - * An misplaced colon character was included in the teamrumble.sh file. -* Fixed issue with first time access to a robot's data directory after startup, where the robot was not allowed to write to it's own file. - -### Changes -* [Bug-130][]: Various usability issues. - * The list of available robots in the 'New Battle' dialog is now automatically refreshed before it is being shown, when a new robot has been compiled or a robot has been removed. - * The 'Save' and 'Save As' in the File menu of the Robot Editor is now enabled and disabled depending if there is anything to save or not. - -## Version 1.6.1.2 (12-Sep-2008) - -### Bug Fixes -* RoboRumble: Sometimes results were given to the wrong robots, which gave a problem with the robot rankings in the RoboRumble, TeamRumble and MeleeRumble. - * Thanks goes to Joachim Hofer ("Qohnil") for fixing this issue! :-) -* RoboRumble: Robots that read their data file got the following error message: - - Preventing unknown thread from access: (java.io.FilePermission... -* ``ArrayOutOfBoundsException`` could occur when accessing the ``Graphics2D`` object returned by the ``getGraphics()`` method on the ``Robot```classes. -* The ``draw(Shape)`` method on the ``Graphics2D`` object returned by the ``getGraphics()`` method could not draw lines. -* The ``onMousePressed()`` event was called twice instead of only one time per mouse press. - -## Version 1.6.1.1 (28-Aug-2008) - -### Bug Fixes -* Issues with the scoring. - * Sometimes the robots were ranked incorrectly compared to their total scores given in the battle results. -* When disabling the security (``-DNOSECURITY=true``) it would not be possible to run any battles as the following error would occur: - - RobocodeFileOutputStream.threadManager cannot be null! -* [Bug-135][]: ``-battle`` broken. - * When using a battle file, the battles were not displayed one the GUI. -* [Bug-134][]: Robot problem after Options->Clean robot cache. - * Robots that tried to access their data file, like e.g. ``sample.SittingDuck`` got a ``AccessControlException``. -* [Bug-131][]: Sometimes the compiler window hangs. - * This bug only occurred when the compiler gave compilation errors. -* ``IllegalArgumentException`` occurred when calling ``setStroke()`` or ``setComposite()`` on the ``Graphics2D`` object returned by the new ``getGraphics()`` method on the Robot. - -### Changes -* The intro battle will only be shown if a battle file has not been specified using the ``-battle`` command-line argument and Robocode is being run for the first time since installation. - * Previously, the intro battle was always shown even though a battle file had been specified. - -## Version 1.6.1 (17-Aug-2008) - -### Bug Fixes -* [Bug-125][]: TimeoutExceptions occur when debugging in Eclipse. - -### Changes - -#### New Methods -* Added ``getGraphics()`` to ``Robot`` and ``IBasicRobotPeer``. - * A robot is now able to paint itself at any time, and not only using the ``onPaint()`` event handler. -* Added ``getStatusEvents()`` to ``AdvancedRobot`` and ``IAdvancedRobotPeer``. - * A robot is now able to handle status events in the middle of an event handler. - -#### New Event -* [Req-66][]: "onBattleIEnd(*)" Event. - * The the ``onBattleEnded()`` event handler is provided through the new ``IBasicEvents2`` class. - * The new event ``BattleEndedEvent`` has been added. - * When this event occur the new event handler ``onBattleEnded()`` will be called on the robot, i.e. when the battle is ended. - * When reading the ``BattleEndedEvent`` it is possible to read out the results of the battle of the individual robot or team. - * In addition, it is possible to check if the battle was aborted by the game or user. - * The battle results will only be available if the battle is not aborted (where the results does not count). - -#### Paint Events -* Paint events are now put in the robot event queue, meaning that the robots will pay CPU time when their ``onPaint()`` event handler is called. -* Added the ``PaintEvent``, which makes it possible to set the event priority of paint events using the ``AdvancedRobot.setEventPriority()``. - -#### Mouse and Keyboard Events -* Mouse and keyboard events have added as new pulic classes and put into the robot event queue. - * The robots will pay CPU time when their ``onMouseXX()`` and ``onKeyXX()`` event handlers are called. - -#### Package Name -* [Req-70][]: Longer package name allowed. - * The max. length of a robot's full package name has been extended from 16 to 32 characters. - * The Robocode Repository is able to handle this (verified with Dan Lynn). - -#### New TPS Slider -* The TPS slider has been redesigned to be more exponential, so it covers battle in slow speed (1-30 TPS), higher speed (30 - 120 TPS), and fast speed (120 - 1000 TPS). -* If you set the slider to max. TPS the game will run as fast as possible. - * This feature already existed in earlier versions. -* If you set the slider to minimum (0 TPS) the game will pause. - * This is a new feature. - -#### The FPS (Frames Per Second) -* The max. FPS is now fixed to be max. 50 FPS allowing the TPS (turns per second) to be even faster. - -#### New Title Bar -* The title on the Robocode window is now showing the current turn in a battle, and is updated every half second. -* The layout of the information shown in the title has been improved a bit. - -#### Dialogs -* The About box, New Battle Dialog, Preferences Dialog, Ranking Dialog, and the Compiler Preferences Dialog are now modal. -* It is now possible to close the New Battle and Results Dialog by pressing the Esc key. - -#### Ranking Panel -* The menu item for the Ranking Panel is now hidden when replaying a battle. - * The Ranking Panel is now being hidden if it is visible, when a battle is being replayed. - * The reason for hiding the Ranking Panel is that the replay feature does not support displaying the current rankings during the replay, i.e. the current scores are not recorded. - -#### Command-line Options -* Added the new ``-DPARALLEL`` option (set to ``true`` or ``false``), which allows robots to run in parallel intended to take advantage of more CPU's available in the system. - * This option may speedup battles with multiple CPU time consuming robots. However, the time measuring is not per robot. -* Added the new ``-DRANDOMSEED`` option (set to a random seed value), which enables the new repeatable and deterministic random generator. - * The benefit of using this option to make it easier to test and debug your robots, as your robots will appear in the exactly same positions, when you rerun a battle. -* The ``-DPARALLEL`` and ``-DRANDOMSEED`` option has no effect when running RoboRumble, MeleeRumble, and TeamRumble. - -#### New Random Generator -* Added a new deterministic and repeatable random generator is used by the game and overrides the random generator used throughout the whole virtual Java machine. - * Methods like e.g. ``Math.random()`` will be using the exactly the same deterministic random generator enforced by Robocode. -* The new random generator will only be deterministic, if the ``-DRANDOMSEED`` option is enabled, i.e. when ``-DRANDOMSEED=12345678`` (or another value). Otherwise the the battles will run truly randomized. - -#### System Logging -* The system log output has now been split, so logged errors are sent to ``System.err`` and logged messages are sent to ``System.out``. - * This makes it possible to filter out messages from errors when reading out the logs from Robocode. -* The system log also includes a full stack trace when errors are logged, making it easier to determine where an error has occurred. - -#### Various Usability Issues -* [Bug-130][]: Various usability issues. - * Added "Enable all" and "Disable all" button in the View Options of the Preferences. - * When the TPS slider is set to 0, the game is paused, and the Pause/Resume button set to paused mode. - * When the TPS is 0 and the Pause/Resume button is pressed, the game will resume at 1 TPS, and the TPS slider will now move to 1. - * In the New Battle window, the focus is now kept in the list of available robots when one of the two 'Add' buttons has been pressed. - * Previously the focus was lost, and you had to reselect robots in the list of available robots in order to add more robots. - * Multiple robots can now be added to a battle by using the arrow keys with e.g. the Alt+A. - * Rearranged the order of menu items here and there, and also improved the name of some menus. - -## Version 1.6.0.1 (03-Jun-2008) - -### Bug Fixes -* [Req-74][]: Option for enabling/disabling robot timeouts. - * It was not possible anymore to debug robots from Eclipse as ``TimeoutExceptions`` occurred when trying to resume from a breakpoint. - * Now, Robocode must be started by adding the option ``-Ddebug=true`` to the VM arguments when debugging Robocode from Eclipse (or any other IDE). - * The documentation (Wiki) about how to debug robots using Eclipse using the ``-Ddebug=true`` option will be updated. -* Fixed missing internal robot proxy layer introduced in Robocode 1.6.0. - -## Version 1.6.0 (01-May-2008) - -### Bug Fixes -* The CPU constant was not calculated the first time Robocode was started up. -* [Bug-123][]: Compiler fails to build due to CR/LF in scripts. - * Removed ^M characters from the buildJikes.sh file so that the Jikes compiler can be built under *nix based system like Linux and Mac OS X. -* Fixed a security issue where robots could access the internals of the Robocode game thru the AWT Event Queue. - * Robots that try to access the AWT Event Queue will now be disabled due to "bad behaviour". - -### New Robot Interfaces -* A new package named ``robocode.robotinterfaces`` has been introduced, which contains pure Java robot interfaces for basic, advanced, interactive, junior and team robots. - * See the Robocode Javadocs (HTML) documentation for more details about these new interfaces [here](http://robocode.sourceforge.net/docs/robocode/robocode/robotinterfaces/package-summary.html). -* The main purpose of the new robot interfaces is to make it possible for robot developers to create new robot types with their own API, but also to create robots using other programming languages, which requires used of interfaces instead of classes. -* The robot interfaces obeys the rules within Robocode, so it is not possible to create new game rules. However, it is possible to create new robot types with other methods names etc. (new API) based on the new robot interfaces. Also note that is is possible to create your own robots based directly on the robot interfaces. -* See the new '/robots/sampleex' directory for some examples of how to use these new interfaces in Java. -* The introduction of the new robot interfaces required a great deal of changes and cleanup of the internal structures of Robocode, but for the better (future). -* A new command line option has been made for Robocode named ``EXPERIMENTAL``, which must be set to ``true`` in order to allow the robots to access the internal robot peer with the robot interfaces for performing robot operations. - * When this flag is not set, you'll get a SecurityException in your robot if it is inherited from a robot interface. - * This option must be set in the robocode.bat or robocode.sh like ``-DEXPERIMENTAL=true``. - * **Note** that this experimental option might be removed in the future so that robots are always allowed to access the robot peer from the new robot interfaces. -* Most work with the robot interfaces was performed by Pavel Savara that has joined the development of Robocode, who have done a tremendous job with the new robot interfaces. - -### Other Changes -* Added a "Make all bullets white" option to the Rendering Options. -* When this option is enabled, all bullets on the battle field will be painted in white. - * Use this options when you need to see all bullets on the battle field, i.e. when bullet colors are almost invisible. That is, some robots might try make the bullets "invisible" to cheat the observer. - * Thanks goes to [Robocode Ireland](http://robocode.ie/) for holding a turnament showing that this option was crusial when battles are shown on a big screen for a large audience. -* Lots of the Javadoc (HTML) documentation for the Robocode APIs were updated. - -## Version 1.5.4 (15-Feb-2008) - -### Bug Fixes -* [Req-62][]: Fix for massive turn skipping when cpu constant < granularity. - * The CPU constant was way too little compared to version 1.4.9. - * This is a critical bug when Robocode is used for competitions like the [RoboRumble][]. - * Now the CPU calculation has been improved by using a heavy math benchmark that have been adopted from Robert D. Maupin ("Chase-san"). -* The method for determining if a robot has exceeded it's CPU time limit has been improved to use nano second precision (using ``System.nanoTime()``), to get rid of an issue with millisecond granularity that is too coarse. - * This method was created by Julian Kent ("Skilgannon"). - -## Version 1.5.3 (30-Jan-2008) - -### Bug Fixes -* [Bug-122][]: Not all shortcut keys work on MacOS. -* Some of the mnemonics on the menus on the Help menu did not work correctly. -* ``NullPointerException`` occurred when clicking a robot button on the right side of the battle view, when no battle was running. - -### Changes -* Keyboard shortcuts have been replaced to comply with OSes where the function keys (F1 - F12) are not available or have a specific purpose, and thus should not be overridden. - * The F5 shortcut key for refreshing the list of available robots in the New Battle, Robot Packager, Robot Extractor, and Team Creator window has been changed to 'modifier key' + R, i.e. Ctrl+R on Windows and Linux, and Command+R for Mac OS. - * The F6 shortcut key for 'Compile' has been changed to 'modifier key' + B, i.e. Ctrl+B on Windows and Linux, and Command+B for Mac OS. - * The F3 shortcut key for 'Find Next' has been changed to 'modifier key' + G, i.e. Ctrl+G on Windows and Linux, and Command+G for Mac OS. -* When a robot or team is being packaged an UUID is added in the .properties and/or .team files in the newly generated robot or team archive file (robot/team .jar file). - * The UUID is a unique identifier for the robot or team, which is generated every time a robot or team package is being created or overwritten. -* This feature has been made to support New Features provided in Robocode Repository, which is currently being updated. - -## Version 1.5.2 (08-Jan-2008) - -### Bug Fix -* On some systems Robocode would not start up when trying to run robocode.bat or robocode.sh. - -## Version 1.5.1 (12-Dec-2007) - -### Bug Fix -* Fixed security flaw with the Event Dispatch Thread, where robots could use the ``SwingUtilities.invokeLater()`` for running any code they should like to. - * Thanks goes to John Cleland who reported this security flaw and provided some very good examples of robots that could do some nasty cheats/hacks. - -## Version 1.5 (05-Dec-2007) - -### Bug Fixes -* [Bug-115][]: AWTException with RoboRumble on OS X. -* [Bug-97][]: Exception when packaging robots. - -### Changes -* [Req-58][]: HitRobotEvent - damage. - * Redundant ``HitRobotEvents`` are no longer occurring when Robocode is performing collision detection between two robots. - * Previously, if a collision occurred between a stationary robot (i.e. not moving) and another robot that was moving, then two ``HitRobotEvents`` would first be sent to each robot based on the stationary robot - even though no damage was done. Next, two ``HitRobotEvents`` would be sent to each robot based on the robot that was moving, which **was** causing damage. - * Now ``HitRobotEvents`` will only occur when damage is done to each robot. No ``HitRobotEvents`` will be ever be sent when no damage is done. That is, when a stationary robot is "colliding" with another robot. -* [Req-57][]: Events processed in chronological order. - * The events in the robot event queue are now sorted in chronological order so that events that occurred before newer events gets processed first. - * Previously, the event queue was ordered based on the event priorities so that the events with the highest priorities were processed first. - * This could cause some problems with robots with skipped turns, as their event queue would potentially contain events from different time frames. - * Now it is perfectly safe for robots to assume that events occurring before other event are processed first. - * Events occurring in the same time frame is still sorted based on their priorities so that the events with higher priorities are processed before events with lower priorities. -* [Req-53][]: More control over the event queue. - * The priority of the ``DeathEvent`` was changed from the reserved priority 100 to -1 in order to allow robots to process all pending events before they die. - * Previously, robots were not able to process all events when it died as the ``DeathEvent`` was having the highest possible priority. - * Now, when the ``DeathEvent`` has the lowest priority, meaning that this event will be the last event left on the robot's event queue before it dies. That is, all events in the event queue have already been processed when reaching the ``DeathEvent``. -* [Req-60][]: Enhanced CPU constant calculation. - * The CPU constant is now measured in nanoseconds rather than milliseconds. - * Using New Features introduced of Java 5.0 that provides more precise timing and also offer better granularity of timings. -* [Req-64][]: Change default battle settings like e.g. "Number of Rounds". - * The "Number of Rounds" value on the New Battle Dialog is now saved and restored when the game is restarted, i.e. Robocode remember Number of Rounds you used the last time. -* Improved the output of the command line usage of Robocode when called from the command line with the ``-?`` or ``-help`` option. - -### New Features -* [Req-54][]: All input received from events. - * The Robot class has got a new ``onStatus(StatusEvent e)`` method. - * This event handler is automatically called for each turn of a battle, which contain a complete snapshot of the current robot state at that specific time/turn. - * This new method makes it possible to map a specific robot class field value to a specific time. -* [Req-56][]: Robots Cache Cleaner. - * Added the Robot Cache Cleaner tool created by Aaron Rotenberg ("AaronR"). - * This tool is used for cleaning the cache files of the robots, which is very useful with the [RoboRumble][] client, where most problems with the robot repository can be solved by cleaning the robot cache files. - * This tool is activation by selecting "Clean Robot Cache" in the Options menu or by running the tool from a command line (standing in the robocode home directory): - - java -cp ./libs/robocode.jar;./libs/cachecleaner.jar ar.robocode.cachecleaner.CacheCleaner - -## Version 1.4.9 (07-Nov-2007) - -### Bug Fixes -* [Bug-120][]: The renderering is slower on Vista than XP? -* [Bug-116][]: Exclude filter removes bots from the RoboRumble. - * [RoboRumble][] participants excluded with the ``EXCLUDE`` filter were removed from the ratings, which is not the intension. - * In addition, if trailing white-spaces occurred with the comma-separated list for the ``EXCLUDE`` filter, the filter did not filter out participants correctly. - * With the release of 1.4.8 this bug was claimed to be fixed, but unfortunately the bug fix was missing in the build of the 1.4.8 release. -* Corrected bug seen with the ``JuniorRobot``, when first calling ``turnAheadLeft(100,90)`` and then ``turnRight(90)`` right after this call, where the robot turn quickly to the left, but slowly to the right. -* The calculation of the possible frame rate (FPS) was calculated incorrectly. - * This caused Robocode to run with lower FPS (when rendering battles on the GUI) compared to what is possible with the available hardware. - * With this bug fix, Robocode will render the battles even faster than before in most cases. - -### Changes -* When a new CPU constant is being calculated it will now take the system time granularity (OS dependent) into account. - * Previously, if the CPU constant was less than the time millis granularity, then skipped turns could occur on robots when the CPU constant < system time millis granularity. - -## Version 1.4.8 (25-Oct-2007) - -### Bug Fixes -* [Bug-114][]: Wait Interrupted Message. - * With Robocode 1.4.7 a minor bug was introduced so that the robot console printed out "Wait interrupted" when a round was completed. -* [Bug-117][]: Sound card is being dodgey/not detected by OS causes error. -* [Bug-118][]: Battles fail when executing with Eclipse debugger. - * When debugging robots or the Robocode game itself within Eclipse on Windows, the Java VM was crashing with an "Access Violation". - -## Version 1.4.7 (09-Oct-2007) - -### Bug Fixes -* [Bug-112][]: Forcing stop: no score will be generated. - * Some robots did not receive any score even though they won the battle. - * The cause of this bug was due to Robocode that did not always detect if the robot's thread(s) had been properly terminated. - * Thanks goes to Eric Simonton, David Alves, and Aaron Rotenberg ("AaronR") for help solving this issue! -* Teams located in the '/robots/.robotcache' directory were still put into the robot.database file. - * Thus, teams located in the .robotcache directory were incorrectly shown in the New Battle dialog. -* [Bug-110][]: Partial match recording replay. - * "Ghost" rounds: When stopping a battle while recording was enabled and then replaying the recorded battle, Robocode would show the last rounds of the battle even though no recording occurred for these rounds. -* [Bug-113][]: ``-battle`` option runs at full speed. - * When using the ``-battle`` option Robocode would run at full speed, i.e. the TPS set to maximum, even though the GUI was enabled with a predefined TPS. - * Now, the TPS is only set to maximum when the ``-nodisplay`` option is being used. -* [Bug-111][]: Wasted time at end of each round. - * Robocode was wasting time on trying to wake up robots that were dead. - * Robocode was blocked for the amount of milliseconds defined by the CPU constant when a robot was killed in a battle, as Robocode was waiting for the dead robot to wake up for exactly this amount of time. -* [Bug-85][]: No window position in-bounding. - * When starting Robocode, saved window locations (x and y coordinate) of a window might not fit into any of the available screens/displays (e.g. virtual desktop). - * Robocode will now center windows into the current screen displayed. - -### Robocode Changes -* The Stop button is now only enabled when a battle is running and will will be disabled after the battle has ended. - -### RoboRumble Changes -* The configurations files roborumble.txt, meleerumble.txt, and teamrumble.txt have been improved: - * All properties are now documented and have been grouped more logically. - * The ``BATTLESPERBOT`` property has been raised to 2000 for the RoboRumble and MeleeRumble. -* [Req-55][]: Exclude Filter for RoboRumble. - * An exclude filter has now been added, which makes it possible to exclude participants that causes trouble somehow. - * The exclude filter is controlled using the new ``EXCLUDE`` property, which takes a comma-separate list of participants where the wildcards * and ? can be used - * Excluded participants are not added to the participants file, and will not be downloaded or take part in battles. - -## Version 1.4.6 (25-Sep-2007) - -### Bug Fixes -* [Bug-107][]: Bullet hit locations reported inaccurately. - * The coordinates of a ``Bullet`` from a bullet event like ``HitByBulletEvent()`` was not correct as the coordinates of the bullets would follow the bullet explosion on the robot it has hit. - * Now the coordinates of the ``Bullet`` will not change when it hits a robot or another bullet, even though the coordinates of the bullet explosion will change internally (for painting the explosion). - * This means that the coordinates of a bullet received from a bullet event will actually be on the real bullet line. - * The initial explosion painting on a robot has also changed so it shows exactly where the bullet has hit the robot. -* When Robocode cleaned up the robot database a ``NullPointerException`` could occur if the robot database was pointing to a missing file. -* [Bug-108][]: It is possible to restart a battle without any robots. - * The Restart button was enabled when no battles had previously been started. -* [Bug-106][]: Incorrect repaint of paused battlefield. - * The areas of the battle field was repainted with the black background together with the Robocode logo when the game was paused and the battle window was repainted. Hence, it was not possible to see the current state of the game on the battle field. -* [Bug-98][]: When minimized doesn't show actual tps. - * When the Robocode window was minimized the actual TPS and FPS were not shown. -* When installing new versions of Robocode on top of an existing Robocode installation, the About window did not have the right height. - -### Changes -* The color of each bullet is now independent on the current color set with the ``setBulletColor()`` method. - * Previously, all bullets were instantly changing their colors when ``setBulletColor()`` was called. - * Now, the color of the bullet will stick to the bullet color set when the bullet was fired. -* Improved the "Check for new version", so that is able to differ between release type as alpha, beta, and final release types. - -## Version 1.4.5 (17-Sep-2007) The "Fair Play" release - -### Bug Fixes -* [Bug-104][]: Reproducable scoring bug. - * Unfair play: Two robots with the same code (but different names) would get different scores instead of a 50-50 split. - * Robots listed before other robots in a battle would gain a minor benefit compared to the other robots. This was in particular the case if they killed each other at the same time. Then the robot listed first would get a "half turn" advantage over the other robot. - * Now, the ordering does not matter anymore, as when ever the robots are checked one at a time in sequence, then they will be checked in random order. -* [Bug-103][]: ConcurrentModificationException. - * ``ConcurrentModificationException`` could still occur when called one of the ``getXXEvent`` methods with an ``AdvancedRobot``. - * Now all ``getXXEvent`` methods like e.g. ``getAllEvents()`` are all synchronized directly with the internal event queue of the robot before reading out the events. -* [Bug-105][]: ``testingCondition`` flag not reset. - * Test Condition flag of a robot was not reset between rounds. - * If the robot thread was disabled while testing a condition for a custom event all following rounds will trigger an exception: - - robocode.exception.RobotException: You cannot take action inside Condition.test(). You should handleonCustomEvent instead. - -* [Bug-101][]: "Keyboard lockup" with interactive robots. - * The sample robot named ``sample.Interactive`` has been changed for Robocode 1.4.5 so it continues moving forward or back when the UP or DOWN arrow key is being pressed down. Previously, the robot would only move 50 pixel when pressing down the UP or down arrow key, which was not intuitive compared to the behaviour with traditional first person shooter games. Thus, this looked like a bug. -* [Bug-87][]: Round indicator incorrect. - * Again, the title of Robocode was incorrectly showing round N+1 of N when a battle was ended. -* Memory leaks occurring during a round due to missing cleanup of bullets have been removed. - * Note that _ALL_ bullets were actually cleaned up, when ending the battle (containing one or several rounds). - * One good side-effect of this bug fix is that the game is speeded up, especially when running in minimized mode, as the game does not have to perform unnecessary calculations on bullets that is not visible on the battle field anymore. - -### Changes -* The sample robot named ``sample.Interactive`` has been changed so it continues moving forward or back when the UP or DOWN arrow key is being pressed down. - * Previously, the robot would only move 50 pixel when pressing down the UP or down arrow key, which was not intuitive compared to the behaviour with traditional first person shooter games. Thus, this looked like a bug. - -## Version 1.4.4 (09-Sep-2007) - -### Bug Fixes -* With version 1.4.3 a bug was introduced so that ``battleAborted()`` was called in the ``robocode.control.RobocodeListener`` when the battle was not aborted, i.e. when a battle completes successfully. - * This bug caused Robocode clients as e.g. RoboRumble to hang! -* Removed Windows end-of-line characters from the .sh files for RoboRumble. - -### Change -* Robocode now throws a ``NullPointerException`` if the condition parameter has been set to null when calling ``addCustomEvent()`` or ``removeCustomEvent()`` on an ``AdvancedRobot``. - -## Version 1.4.3 (07-Sep-2007) - -### Bug Fixes -* [Bug-95][]: OutOfMemory: Robots are Being Left on the Stack. - * Major bug fixes was done by Nathaniel Troutman to get rid of large memory leaks, especially when creating and destroying ``robocode.control.RobocodeEngine`` instances many times. - * Most of the memory leaks were caused by circular references between internal classes/objects in Robocode. Now, these such circular references are cleaned up. -* The configuration files for RoboRumble was completely missing under the /roborumble folder, i.e. the meleerumble.txt, roborumble.txt, and teamrumble.txt. -* [Bug-94][]: Inconsistent Behavoir of ``RobocodeEngine.setVisible()``. - * This fix was done by Nathaniel Troutman. - * When invoking the RobocodeEngine to directly run a battle(s) and calling ``RobocodeEngine.setVisible(true)``, and then later call ``RobocodeEngine.setVisible(false)`` the results dialog would still show up at the end of a battle. -* [Bug-96][]: Initializing Label even when no display. - * Did another fix where a dummy AWT (GUI) component was created even though the GUI was disabled causing problems when trying to run e.g. RoboRumble remotely without the GUI enabled. -* [Req-52][]: The 'New Battle' window sometimes is spamed with .robotcache. - * Sometimes the "New Batle" window would show robot classes that reside in the .robotcache folder under the /robots folder. This occurred when the robot database was (re)builded, e.g. if the robot.database file was missing. -* [Bug-99][]: Clicking on a bottom area results in ``ClassCastException``. - * When running battles including the MyFirstJunior and the pressing the mouse button outside of the battle field a ``ClassCastException`` would occur. -* [Bug-100][]: Double-clicking "restart". - * When double-clicking the Restart button for the battle window the UI could lock up completely trying to play all battles, and it would not be possible to stop the battle. - -## Version 1.4.2 (26-Aug-2007) - -### Bug Fixes -* [Bug-92][]: RoboRumble tries to connect with GUI. - * RoboRumble was invoking AWT (GUI) stuff when running, which caused problems on systems without support graphical display or running [RoboRumble][] remotely behind a firewall. -* [Bug-102][]: Bots can hold memory after being destroyed. - * When running ``robocode.control.RobocodeEngine`` it caused memory leaks each time a new instance of the ``RobocodeEngine`` was created, even though the object was completely destroyed. -* [Bug-93][]: ``onPaint(Graphics2D g)`` called prematurely. - * The ``onPaint()`` method was invoked just before the robot got the chance of updating it's internal world model. - * Now the battle view is updated as the first thing right after the robots have updated their internal model. -* [Bug-71][]: RobocodeEngine becomes slower the more battles that are run. - * The Robocode engine was halted with spurious exceptions when an exception occurred inside an ``onPaint()`` method in a robot, i.e. when the robot itself causes an exception inside ``onPaint()``. - * Now, whenever an exception occurs inside the ``onPaint()`` method of a robot, the exception is now being catched by Robocode and printed out in the robot console. - * Due to this bug exception handlers have now been added to all ``onKeyXX`` and ``onMouseXX`` events, where the exceptions are now printed out to the robot console. -* A ``ConcurrentModificationException`` bug did still occur with the internal ``EventQueue`` of a robot. - -## Version 1.4.1 (19-Aug-2007) - -### Bug Fix -* [Bug-91][]: ``ConcurrentModificationException``. - * A couple of ``ConcurrentModificationException`` bugs were introduced with version 1.4, which are now fixed. - * Thank goes to Helge Rhodin ("Krabb") for help with solving the bug! - -## Version 1.4 (14-Aug-2007) The "Junior Robot" release - -### Bug Fixes -* [Bug-88][]: Scorch layer. - * I changed the behaviour of the scorch marks + plus a lot more. -* Static fields on robots were not cleaned up anymore after each battle has ended. -* [Bug-90][]: Limit per round, not turn. - * When printing to ``out`` in ``onScannedRobot()`` event before a ``scan()`` call, the the logging to out would stop with an system error that to much is printed out. - -### Changes - -#### Added JuniorRobot -* The ``JuniorRobot`` class is simpler to use than the ``Robot`` class and has a simplified model, in purpose of teaching programming skills to inexperienced in programming students. - * This new robot type has been designed by Nutch Poovarawan / Cubic Creative team. -* Added ``sample.MyFirstJuniorRobot``. - * This robot is very similar to ``MyFirstRobot``, but tracks it's scanned enemy better. - -#### GUI: Changed Menu Shortcut Key -* Robocode forced the use of the Ctrl key to be used as menu shortcut key. - * Now Robocode ask the Java VM what menu shortcut key to use. -* This change means that Mac OS X users should now use the Command key instead of the control key. - * Thanks goes to Nutch Poovarawan for the tip of how to do this! :-) - -#### Improved Battle View a bit -* A red border is now painted around the battlefield when the battleview's height and/or width is larger than the battlefield. -* Explosions are painted outside the battlefield, when the battleview is larger than the battlefield. -* The text for the Robot names and scores are now "clipped" to the width and height of the battleview instead of the battlefield. - -#### Added "Recalculate CPU constant" to the Options Menu -* [Req-50][]: Recalculate CPU Constant. - * This makes it possible to force recalculation of the CPU constant. - -#### RoboRumble Changes -* Redundant RoboRumble config files are now removed from the /config folder. -* Changed ``UPLOAD=NOT`` to ``UPLOAD=YES`` as default, i.e. the results are now automatically uploaded to the RoboRumble server. - -## Version 1.3.5 (04-Jul-2007) The "Fast renderings" release - -### Bug Fixes -* [Bug-87][]: Round indicator incorrect. - * The title was displaying "Playing round N+1 of N" when the battle has ended. -* [Bug-86][]: Using UI removes focus from interactive bots. - * Key events are now received even though the battle view does not have the focus. - -### Changes - -#### Faster Rendering -* The battle rendering is now 30-50% faster due to image buffering (but uses more memory). -* A new "Buffer images" option under the Rendering Options can be enabled/disabled on the fly while playing a battle. - * By default, "Buffer images" is enabled which makes the rendering faster, but which also uses additional memory. -* Due to the faster renderings, explosion debris is now enabled by default. - -#### Controlling Robocode -* The container classes in the robocode.control package are now Serializable, which makes it easy to load and store, battle specifications, results etc., but also to send these over the network. - -## Version 1.3.4 (27-Jun-2007) The "Interactive" release - -### Bug Fixes -* [Bug-84][]: Preferences page problem on machine w/out sound card. - * ``NullPointerException`` occurred when trying to open the Sound Options page from the Preferences when no sound card (or actually audio mixer) is present in the system. - -### New Features -* The Robot class has now been extended with keyboard and mouse events/methods: - * ``onKeyTyped(KeyEvent)`` - * ``onKeyPressed(KeyEvent)`` - * ``onKeyReleased(KeyEvent)`` - * ``onMouseMoved(MouseEvent)`` - * ``onMouseClicked(MouseEvent)`` - * ``onMousePressed(MouseEvent)`` - * ``onMouseReleased(MouseEvent)`` - * ``onMouseEntered(MouseEvent)`` - * ``onMouseExited(MouseEvent)`` - * ``onMouseDragged(MouseEvent)`` - * ``onMouseWheelMoved(MouseEvent)`` - - These New Features adds a new dimension to the game, i.e. you could make robots that must be controlled entirely manual, semi-automized robots, or press various key for changing between various robot strategies, e.g. when debugging. - - Thus, it is now possible to create robots where multiple human players battle against each other, or compete against existing legacy robots. - -### New Sample Robot -* A new sample robot named "Interactive" has been added to demonstrate how to control a robot using keyboard and mouse events only. -* This robot is controlled by the arrow keys and/or the mouse wheel, and let the gun point towards the current coordinate of the mouse pointer used for aiming. Mouse buttons are used for firing bullets with various fire power. - -### Minor Changes -* The background Robocode logo has been changed into green and the Robocode slogan "Build the best, destroy the rest" was added. - -## Version 1.3.3 (22-Jun-2007) - -### Bug Fixes -* [Bug-82][]: Undo comment does not change font color of code. - * Wrong colors when undoing and redoing multiline comment in the Robot Editor -* When a battle was stopped a new battle could start before the previous battle was closed down. -* When restarting a battle while it was paused caused strange behaviour with new battles, and the "Next Turn" button stopped working. -* [Bug-83][]: Ranking Panel Does not update number of competitors. - * In some situations the Rankings Panel did not show the results for all robots. - * This could be seen if first playing a battle with only 2 robots, and then start a new battle with more robots. In this case, only the rankings for the top 2 robots were shown. - -### Changes -* The Rankings Panel and Results Dialog are now automatically packed to fit the table containing the rankings/results. - -## Version 1.3.2 (09-Jun-2007) - -### Bug Fixes -* The ``sample.SittingDuck`` would not start when no GUI is enabled. -* The Look and Feel is not set if the GUI is disabled. -* The robocode.sh ignored command line arguments (e.g. under Linux and Mac). -* [Bug-80][]: Results file is empty with the command line. - * When setting the ``-result`` parameter from the command line the results file was empty. - -### Changes -* When specifying the ``-battle`` parameter the .battle extension and battle directory can be omitted. - * Hence you can write ``-battle sample`` instead of ``-battle battles/sample.battle``. - * If a specified battle file does not exist Robocode will now exit with an error. -* If you specify the ``-results`` parameter the last results will now always be printed out, i.e. with and without the GUI enabled. Otherwise, if the GUI is not enabled (by setting the ``-nodisplay`` parameter) then the last results will be printed out to system out. - -## Version 1.3.1 (30-May-2007) - -### Bug Fixes -* When loading a battle, the robots specified in the battle file were not selected on the battle dialog. -* When the intro battle has finished the battle settings are now reset to the default battle settings. - * This fixes the issue were the fixed robot starting positions are still used in new battles and where the "Number of Rounds" was set to 1 instead of 10. -* [Bug-79][]: Output displayed in bursts. - * The output in the robot console windows were written out in bulks instead of immediately. -* Bugs fixed in RoboRumble which could cause a ``IllegalThreadStateException``. - -### Changes -* Robocode will now print out an error message and just proceed if problems arise with trying to set the Look and Feel (LAF) to the system LAF. -* [Req-44][]: Restart tweak. - * When stopping or restarting a battle, the battle will now stop immediately instead of continuing for a while showing robot explosions when the robots are being terminated due to the stop. -* [Req-45][]: Reset compiler cancel button. - * Added confirm dialog when trying to reset the compiler preferences from the Compiler -> Options -> Reset Compiler in the Robocode Editor in order to prevent the compiler preferences to be reset by accident. - -### New Features -* Added link to Java 5.0 Documentation in the Help menu. - -## Version 1.3 (17-May-2007) Now featuring the RoboRumble client - -### Bug Fixes -* [Bug-78][]: Robots are disabled with no timer or countdown. -* [Bug-74][]: Java FilePermission error during startup. - * The Event Dispatch Thread was denied access by the Robocode Security Manager. -* [Bug-75][]: ``getTeammates()`` problem. - * Changed back the ``TeamRobot.getTeammates()`` to return ``null`` if no teammates are available. - * This rollback was done in order to keep compatibility with robots developed for older versions of Robocode. -* [Bug-72][]: The game won't play sounds on 2nd launch. - * No sounds were played (when enabled) when Robocode was launched the second time. -* [Bug-73][]: Sound don't work. -* [Bug-76][]: Unique error. - * Lots of synchronizations issues and potential ``ConcurrentModificationExceptions`` have been fixed. -* [Bug-70][]: Version 1.2.6A incompatible with Roboleague. - * The bug causes this exception: - - Exception in thread "Thread-4" java.lang.NoSuchMethodError: robocode.control.RobotResults.getRamDamageBonus() -* [Bug-69][]: Robot causes Null Pointer Exception. - * Fixed ``NullPointerException`` occurred when a robot is forced to stop. -* When using ``robocode.control.RobocodeEngine`` it was not possible to play team battles. Instead an ``ArrayOutOfBoundsException`` occurred. -* ``robocode.control.RobotResults.getRamDamage()`` incorrectly returned a double instead of an integer. - * This bug caused problems with running Robocode on RoboLeague. -* The "Enable replay recording" got set if it was not set after running Robocode without the robocode.properties file the first time. -* ``NullPointerException`` could occur when using ``robocode.control.RobocodeEngine`` and the GUI was not enabled. -* The text field for the filename in the robot packager was way too high. -* In RoboRumble, the codesize of some robots were incorrectly calculated to be 0 bytes, and hence these robots was not able to participate in [RoboRumble][] battles. -* This was due to the codesize tool, which could not analyze .jar files inside .jars. - -### Changes - -#### RoboRumble Client is now built-in -* [Req-39][]: Support for RR@Home - * RoboRumble@Home client, originally developed by Albert Prez, is now built-in. - * [RoboRumble][] is the ultimate collaborative effort to have a live, up-to-date ranking of bots. - * It uses the power of available robocoder's computers to distribute the effort of running battles and building the rankings. - * For more information about RoboRumble@Home you should read its [home page](http://robowiki.net/wiki/RoboRumble). - * The version of the RoboRumble client included in Robocode is an updated version of the original one that can run with the current version of Robocode and which has been ported to Java 5. - * Configuration files has been updated, and are available in the 'roborumble' folder. - * Issues with downloading robots from the Robocode Repository site has been fixed. - * Special thanks goes to Gert Heijenk ("GrubbmGait") who did a tremendous job with lots of alpha testing regarding the new RoboRumble@Home built into Robocode! :-D - -#### Codesize -* [Req-38][]: Codesize. - * The codesize tool by Christian D. Schnell has been added to support the built-in [RoboRumle][] plus a new feature for getting the codesize and robot codesize class (MiniBot, MegaBot etc.) when a robot is being packaged. - * This tool has now been taken over by Flemming N. Larsen (agreed with Christian) and updated to version 1.1, which can handle files > 2KB, and also analyse .jar files inside .jar files. - -#### Start Positions -* [Req-36][]: Initial Placement. - * Added feature that allows specifying the initial start positions of the robots on the battlefield. - * By specifying positions by setting ``robocode.battle.initialPositions`` in a .battle using this format ``(x1,y1,heading1),(x2,y2,heading2),(?,?,?)`` you can specify the initial location and heading for each robot specified with ``robocode.battle.selectedRobots``. - * One example is: - - (50,50,90),(100,100,?),? - - * This means that: - 1. the 1st robot starts at (50,50) with a heading of 90 degrees, - 2. the 2nd robot starts at (100,100,?) with a random heading, - 3. the 3rd (and last) robot starts at a random position with a random heading. - - * See the battle/intro.battle for an example of how to use this option. - -#### Robot and Control API -* Added a new method called ``getNameAndVersion()`` to the ``robocode.control.RobotSpecification``. - * This method was added to better support [RoboRumble][] and similar ranking programs. -* Changed the ``TeamRobot.broadcastMessage()`` so it does not throw an ``IOException`` when the robot is not in a team. - -#### Improved File Structure -* The file structure of Robocode has been slightly improved. -* All .jar files including robocode.jar are now located in the libs folder. -* The robot.database and .robotcache files has been moved to the robots folder. -* All RoboRumble related files are located in the roborumble folder. - -## Version 1.2.6A (11-Mar-2007) - -### Bug Fixes -* A ``NullPointerException`` occurred if the battle view was not initialized. -* This bug made it impossible to control Robocode via the ``robocode.control`` package when attempting to show the battle window. - -### Changes -* [Req-37][]: Running Score Window. - * The Ranking Panel and Battle Results are now windows instead of dialoges. - * This means that the Ranking Panel and Battle Results will still be visible when the game is running in minimized mode. - -## Version 1.2.6 (06-Mar-2007) - -### Bug Fixes -* [Bug-66][]: Crash: starting a new round while et.Predator 1.8 is playing. - * With some robots, a ``java.lang.NoClassDefFoundError`` occurred when Robocode tried to cleanup the static fields occupied by the robot when the battles are over. -* [Bug-67][]: Some issues with MessageEvent + priority. - * These 4 issues were fixed: - 1. In the Robocode API -> AdvancedRobot -> setEventPriority there is information about all event priorities except MessageEvent priority. - 2. You can call ``getEventPriority("MessageEvent")``, but when you call ``setEventPriority("MessageEvent", someValue)`` you gets a ``"SYSTEM: Unknown event class: MessageEvent"`` message and the priority doesn't change. (using ``TeamRobot``). - 3. ``getEventPriority("MessageEvent")`` returns 80, so (if it is true) it "collides" with ``CustomEvent`` priority which is also 80 by default. This way you can't assume which event will be called first basing on its priority. - 4. Unlike it is done for other events, there is no ``getMessageEvents()`` function. -* [Bug-68][]: Preferences not saved. - * The rendering options was not set correctly when loading these between battle sessions. -* When using the ``RobocodeEngine.setVisible(true)`` the Robocode window was shown with the wrong size and without the native Look & Feel. - -### Changes - -#### New TeamRobot Method -* Added missing ``getMessageEvents()`` to the ``TeamRobot``. - -#### Default Event Priorities -* The changes were made as some events "shared" the same default priority, making it hard to tell which event would occur before the other. -* ``BulletHitBulletEvent`` priority was changed from 50 to 55. - * Previously, both ``BulletHitEvents`` and ``BulletHitBulletEvents`` used priority = 50. -* ``MessageEvent`` priority was changed from 80 to 75. - * Previously, both ``CustomEvents`` and ``MessageEvents`` used priority = 80. -* The Ranking Panel has been enhanced. - -#### Ranking Panel -* Now the Ranking Panel contains the same columns as the Battle Results. -* Both the current scores and total scores are shown together where it makes sense. -* The column names of both the Ranking Panel and Battle Results have been improved. - -#### New Pause/Debug Button -* [Req-35][]: Pause Button. - * A Pause/Debug button has been added to the Robot Console window. - * This is handy if you want to pause the game when only your robot's console window is open when the game is minimized. - -#### Battle Window -* The Pause/Debug button on the Battle Window has been changed into a toggle button. -* The "Next Turn" button is now always visible, but not alvays enabled. - -#### Documentation -* The documentation of the Robocode API (Javadoc) has been improved a lot. - -#### Installer -* The Installer is now checking is the user is running Java 5.0 or newer. -* If the Java version is older than 5.0, then an error message will display telling the user to install at least JRE 5.0 or JDK 5.0, and the installation is terminated. - -#### robocode.sh -* robocode.sh has been updated. - * Armin Voetter has contributed with an improved version of robocode.sh so that the script resolves the path to Robocode by itself. - -## Version 1.2.5A (19-Feb-2007) - -### Bug Fix -* On some systems Robocode could not start up due to a ``NullPointerException`` in the internal sound manager/cache. - -## Version 1.2.5 (18-Feb-2007) - -### Bug Fixes -* [Bug-65][]: Cannot run robocode after installation. -* [Bug-63][]: BulletHitBullet only destroys one bullet. - * When two bullets collided, one of the bullets was not destroyed, but continued. -* [Bug-64][]: Exception when referencing length of an array of ``String``. - * ``TeamRobot.getTeammates()`` returned ``null`` instead of an empty array when no teammates are available. -* [Bug-62][]: Memory "Leak". - * Memory leak could occur on robots using large objects on static fields. - * Robocode now clean all static object fields that are not final after each battle, but not between rounds. That is, the static fields are now garbage collected. -* Some ``ConcurrentModificationException`` issues were removed. - -#### Changes - -### Sound Effects (SFX) -* The sound effects in Robocode can now be changed. - * This is done by specifying the file for each sound effect using the ``file.sfx.xxx`` property keys in the robocode.properties file, e.g. the ``file.sfx.gunshot`` for setting the sound effect for gunshot. - - * ``robocode.file.sfx.gunshot``: the sound of a gun shot. - * ``robocode.file.sfx.robotCollision``: the sound of a robot colliding with another robot. - * ``robocode.file.sfx.wallCollision``: the sound of a robot hitting the wall. - * ``robocode.file.sfx.robotDeath``: the sound of a robot dying, i.e. exploding. - * ``robocode.file.sfx.bulletHitsRobot``: the sound of a bullet hitting a robot. - * ``robocode.file.sfx.bulletHitsBullet``: the sound of a bullet colliding with another bullet. - -* The supported sound formats can be found [here](http://java.sun.com/j2se/1.5.0/docs/guide/sound/). - -#### Music Support -* Robocode now supports music. -* By specifying the file for each music file using these properties in the robocode.properties file for setting: - - * ``file.music.theme``: the startup theme music. - * ``file.music.background``: background music during battles. - * ``file.music.endOfBattle``: the "end of battle" music when a battle is over. - -* The supported music formats can be found [here](http://java.sun.com/j2se/1.5.0/docs/guide/sound/). - -#### Misc. -* The column names in the Battle Results window have been improved. -* Keys in the robocode.properties file (the configuration file) are now automatically sorted when saved. -* Previously the keys were put in random order each time the property file was saved. - -## Version 1.2.4 (25-Jan-2007) - -### Bug Fixes -* [Bug-60][]: ``ConcurrentModificationException`` when extracting robots. - * This exception sometimes occurred when robots were imported when Robocode was starting up. -* [Bug-59][]: Issue when setting the priority of a ``BulletHitBulletEvent``. - * Added methods for setting and getting the priority of ``BulletHitBulletEvent`` that was missing completely in Robocode?! -* Removed ``IndexOutOfBoundsException`` when replaying battles. -* Explosion debrise was shown in the lower left corner (0,0) when starting battles and battle ground is set to visible. -* [Bug-61][]: Hang when checking for new version with no Internet access. - * Robocode could hang when checking for a new version when no Internet connection was available. - * Now a 5 second timeout has been added to prevent Robocode from hanging. - -### Changes - -#### Robots Die Faster -* [Req-33][]: Making robots die quicker (graphically). - * Robocode stops painting the battlefield and playing sounds when a battle is ended after 35 turns. - * However, the robots still have 120 turns until they are really killed like Robocode is used to, but the battle continues like if it was running in minimized mode (fast). - -#### Options -* The common options for enabling replay recording has been changed to disabled per default. - * When running lots of battles in a row with replay recording enabled Robocode runs out of memory, which causes problems when running tournaments. -* Added "View Explosion Debris" option in the View Options. - * Explosion debris is diabled per default as this feature can slow down the game with 25% - 50% when viewing battles. - -#### Javadocs -* [Req-34][]: Provide javadoc for robocode.util.Utils and robocode.control. - * Javadocs have been provided for: - * The ``robocode.util.Utils`` class providing angle normalizing methods. - * The ``robocode.control`` package used for controlling Robocode externally. - -#### Files -* Fixed incosistency with .jar files located in the robot folder. -* Robot packages (.jar files) is now only extracted from the root of the robots folder. -* In previous Robocode versions when starting up Robocode without a robot.database file and .robotcache directory, Robocode would extract Robot packages from the root of the robot folder and also the sub folders. When running Robocode the first time without these files, robots from the sub folders were shown (if available), but not the following times when Robocode was started up. - * This fix was done by Robert D. Maupin ("Chase-san"). - -## Version 1.2.3B (14-Jan-2007) - -### Bug Fixes -* [Bug-58][]: ``NullPointerException`` during replay. - * Titus Chen made a bug fix for a ``NullPointerException`` that caused a replay to stop. - * This occurred when "Pan" was enabled for the mixer in the Sound Options during a replay. -* When using robocode databases ("robot.database") created with version 1.2.3 and earlier version in version 1.2.3A, Robocode crashed in the startup with a ``ClassCastException``. - -## Version 1.2.3A (12-Jan-2007) - -### Bug Fix -* [Bug-57][]: ``ConcurrentModificationException``. - * Removed a ``ConcurrentModificationException`` that occurred when processing robot events. - -### Changes -* Robert D. Maupin ("Chase-san") replaced all old type Java containers like ``Vector``, ``Hashtable``, ``Enumeration`` with the newer and faster types like ``ArrayList``, ``HashMap``, and ``Set``. - * This improves the performance a bit, especially when running in "minimized" mode. - -## Version 1.2.3 (10-Jan-2007) - -### Bug Fixes -* Removed ``NullPointerException`` when trying to restart the initial intro battle. -* [Bug-54][]: Flickering when constantly changing colors. - * Titus Chen made a fix for this fix, which occurred when the max. amount of robot colors (i.e. 256) was exceeded. -* [Bug-55][]: Incorrect score after replay. - * Thanks goes to Titus Chen for reporting this issue + providing a fix for this issue. -* Minor bug fix in the Extract Results dialog, where an empty line was following each line of text. - -### Changes - -#### Added Replay Feature -* A new "Replay" button has been added to the toolbar at the buttom of the battle screen. - * The replay feature makes it possible to replay a battle. -* In a comming version of Robocode, it will be possible to load and save replays. -* [Req-24][]: Recording of battles. (partially implemented) - * Added "Enable replay recording" option to the Common Options for enabling and disabling replay recording as replay recording eats lots of memory. - * When the replay recording is disabled, the "Replay" button will not be available. - -#### Improved the security manager -* Robots are not allowed to access any internal Robocode packages anymore, except for the ``robocode.util`` package in order to let legacy robots access the ``robocode.util.Utils`` class, e.g. for calling ``normalRelativeAngle()`` etc. - -#### New hotkey -* Hotkey added for exiting Robocode quickly. - * It is now possible to exit from Robocode by pressing Alt+F4 in the main window of Robocode. Note that the main window must be active. - -## Version 1.2.2 (14-Dec-2006) - -### Bug Fixes -* [Bug-52][]: Extra hit wall events. - * Extra ``HitWallEvents`` were occuring. - * Thanks goes to Titus Chen for reporting this issue + providing a fix for this issue. -* [Bug-53][]: Teams not always ranked correctly. - * Thanks goes to Titus Chen for reporting this issue + providing a fix for this issue as well. -* In addition, the ranking scores and final battle results have been made consistent. -* The radar scan arc was not painted correctly if the radar was moving towards left. -* Sometimes ``ArrayIndexOutOfBoundsExceptions`` occurred when adding and/or removing robots in the robots folder. - -### Changes -* [Req-30][]: UI Control for adjusting the TPS quickly. - * Added TPS slider to the toolbar on the battle window so the TPS can be changed quickly. -* [Req-32][]: Bullet size. - * Bullet sizes has been improved. - * Very small bullets will always be visible, even on large 5000x5000 battle fields. -* Removed the "Allow robots to change colors repeatedly" from the View Options. - * This option did not have any affect as the current rendering engine always allows robots to change colors repeatedly. - -## Version 1.2.1A (26-Nov-2006) - -### Bug Fixes -* [Bug-51][]: Hit wall problems. - * Hitting wall with an exact angle of 0, 90, 180 or 270 degrees caused a robot to disappear from the battlefield (could be seen with the sample robots Corner and Wall). - * Thanks goes to Titus Chen for reporting this issue + providing a fix for this issue. - -## Version 1.2.1 (24-Nov-2006) - -### Bug Fixes -* [Bug-50][]: Bottom-left corner anomaly. - * The check for wall collision did not work properly in some situations due to rounding problems with float vs double precision. -* [Bug-49][]: Robot gets stuck off-screen. -* [Bug-48][]: ``isMyFault()`` returns ``false`` despite moving toward the robot. - * ``HitRobotEvent.isMyFault()`` returned ``false`` despite the fact that the robot was moving toward the robot it collided with. - * This was the case when ``distanceRemaining == 0`` even though this could occur on purpose if the move was set to ``distanceRemaining``. -* [Bug-47][]: Teleportation in version 1.2. - * Teleportation when hitting wall and ``abs(sin(heading)) > 0.00001`` or ``abs(cos(heading)) > 0.00001``. -* [Bug-46][]: Gun Method returns too soon. - * The ``turnGun(double)`` method returned before the gun rotation had returned. -* [Bug-41][]: More bad bullet collision detections. - * Bad bullet collision detection algorithm was replaced with [Paul Bourke's 2D line intersection algorithm](http://paulbourke.net/geometry/lineline2d/). - -## Version 1.2 (05-Nov-2006) - -### Bug Fixes -* [Bug-24][]: Robots hangs when running looong battles (and pausing). - * This issue which was not really fixed in 1.1.5. -* [Bug-37][]: Bad bullet collision detection. -* [Bug-42][]: "Number of rounds" box is not tall enough on Gnome/Linux. - * Some text fields in e.g. the "New Battle" were not tall enough to show their content on for e.g. Gnome/Linux. -* [Bug-43][]: Layout is bad for Gnome/Linux. - * It was hard to read the text on the buttons on the Rendering Options. The text was cut off. - -### Changes - -#### Security option -* [Req-21][]: Option for accessing external .jars - * The ``NOSECURITY`` option has been extended so it is now possible to access 3rd party jar files. - * If you want to access other jars in your robot you'll have to disable the security in Robocode by setting the ``NOSECURITY`` option to true, i.e. adding ``-DNOSECURITY=true`` in robocode.bat (under Windows) or robocode.sh (under Mac and Linux). - * You'll also have to add the jar file to your ``CLASSPATH`` or put it into the /lib/ext folder of your Java Runtime Environment (JRE), if adding it to the ``CLASSPATH`` does not work. - -#### Results can be saved in CSV File -* [Req-25][]: Save battle results to file. - * Results can now be saved in the Comma Separated Value (CSV) File Format. - * A "Save" button has been added to the battle results dialog. - -#### Battle Results / Ranking panel -* The rank and name of the robots in the battle results dialog and in ranking panel has been splitted up into two independent colums, i.e "Rank" and "Name". - * This was necessary in order to save the rank and name independently in a file. - -#### Browser -* [Req-26][]: Invoke default browser from Help. - * The default browser under Windows is now used when browsing e.g. the Online Help. - * The browser.bat file has been removed as there is no need for it anymore. - -## Version 1.1.5 (22-Oct-2006) - -### Bug Fixes -* [Bug-40][]: Half of ``BulletHitBulletEvents`` are created improperly. - * Fixed ``BulletHitBulletEvents`` where half of them referred to the wrong bullet. -* [Bug-39][]: Final results not always ranked correctly. -* [Bug-36][]: License text in installer has wierd image at the buttom. - * Updated the Common Public License to the original version. - -### Change -* The Ranking Panel total score is now updated on the fly. - -## Version 1.1.4B (19-Oct-2006) - -### Bug Fixes -* [Bug-24][]: Robots hangs when running looong battles (and pausing). -* [Bug-34][]: Getting ``null`` on ``getName()``. - * The ``getName()`` on ``ScannedRobotEvent`` returned ``null``. -* [Bug-35][]: robocode.sh contains invalid ^M character. - * Fixed the robocode.sh (Unix) file which contained a ^M (Microsoft DOS/Windows character), which caused this file to be unusable for starting Robocode. - -## Version 1.1.4A (15-Oct-2006) - -### Bug Fixes -* [Bug-33][]: Sound is cut off after a round or two. - * The sounds were cut off after first round. -* [Bug-31][]: Ranking Panel does not save its size and position. - * The Ranking Panel position and size was not saved in the window.properties file. -* [Bug-30][]: ``ad.Quest`` robot causes ``ConcurrentModificationException``. - * This exception occurred in the robot event queue. -* Periodic ``NullPointerException`` removed from battle view. - -## Version 1.1.4 (14-Oct-2006) - -### Bug Fixes -* The Battle View was not updated on the primary monitor display on a dual monitor system. -* [Bug-28][]: Enabling sound makes Robocode crash. - * When enabling sounds on-the-fly where it was originally disabled, Robocode crashed/halted with a ``NullPointerException``. -* [Bug-29][]: Runtime exception when opening new battle. - * Removed a ``NullPointerException`` occurring when opening a battle the first time with a new version of Robocode. -* [Bug-21][]: Replace function generates extra tab. - * When inserting text by 'copy and paste' or 'search and replace' into the Editor, extra tabs were sometimes added. -* [Req-19][]: Possible to install Robocode on Windows Vista. - * Robocode icons has been updated. -* Lots of internal optimizations of Robocode has been made to speed up the game. - -### Changes - -#### Ranking Panel -* Ranking Panel added to the Options menu. - * Thanks goes to Luis Crespo for this new feature. -* This panel shows the current robot rankings during battles. - -#### Single-step Debugging -* It is now possible to do single-step debugging in Robocode. - * Thanks goes to Luis Crespo for this new feature. - * The "Pause" button has been extended into "Pause/Debug", and a "Next Turn" button is available to perform one turn at a time, which is vital for single-step debugging. -* A new ``Rules`` class was added containing helper methods and constants for Robocode rules. - -#### Common Options -* [Req-23][]: Preference to allow disabling of the scorecard pop-up. - * Common Options has been added that currently contains "Show results when battle(s) ends", which is used for enabling or disabling showing the results dialog when the battle(s) ends. - -## Version 1.1.3 (20-Sep-2006) The "Java 5 and Sound" release - -### Bug Fixes -* [Bug-25][]: Wrong score for 1st place results in some battles. - * Wrong 1st place scores for robots, which got 1 point for winning and also 1 point for the death of an enemy robot, and hence got 2 points instead of just 1 point for the 1st place. -* [Req-18][]: Better notification about new Robocode versions. - * Improved the notification about new available Robocode versions. -* [Bug-19][]: Confused updater. - * Now Robocode will only give a notification about a new available version if the version number is greater than the version retrieved from the robocode.jar file. - * The check interval has been changed from 10 days into 5 days. -* [Bug-26][]: Battlefield graphics is not always updated. - -### Changes - -#### Moved to Java 5.0 -* The minimum requirement for Robocode is from now on Java 5 (1.5.0). - * You must have at least a JRE 5.0 (1.5.0) or JDK 5.0. - * Robocode has also been tested with the upcomming Java 6 (1.6.0) where it seems to run just fine. - -#### Sound Effects added -* [Req-15][]: Optional sound effects. - * Sounds have been added to Robocode along with Sound Options. - * Thanks goes to Luis Crespo for this cool new feature. - * You are able to change between available mixers (on your system). - * Panning is supported, so that explosions in e.g. the left side of the screen is louder in the left speaker. - * Volume is supported, so that e.g. a bullet with more power makes more noise. - * **Note:** Some mixers performs better, but might not support volume and/or panning. - * A new command line option, ``-nosound``, has been added in order to turn off sound support. - * This feature should prove useful on systems without sound support. - -#### New Methods for Setting Colors -* The ``setColors(bodyColor, gunColor, radarColor)`` has been reintroduced. -* The ``setColors(bodyColor, gunColor, radarColor, bulletColor, scanColor)`` has been added. -* The ``setAllColor(color)`` has been added. - -#### Misc. -* [Req-17][]: New splashscreen picture. - * The Robocode logo on the splash screen and battle view is now rendered using Java2D. - * The layout of the Developer Options was improved a bit. - -## Version 1.1.2 (20-Aug-2006) The "Robocode is now TPS centric instead of FPS centric" release - -### Bug Fixes -* [Bug-22][]: Bad buildJikes.sh in 1.1.1 - * The ``buildJikes.sh`` contained the ^M (DOS return-carrige characters), which do not belong in a Unix/Linux file. ;-) -* The radar color was sometimes painted with too much lumination (white). - -### Changes - -#### TPS centric instead of FPS centric -* [Req-12][]: Faster framerates / Turns per second. - * Robocode is no longer FPS (Frames Per Second) centric, meaning that 1 turn (time unit) = 1 frame. - * Robocode is now TPS (Turns Per Second) centric, meaning that 1 turn is not necessarily equal to 1 frame anymore. - * You specify how many turns you want to compute every second (desired TPS), and Robocode will render as many frames as possible depending on the TPS. - * If the TPS is higher than the FPS, some turns are not rendered. However, this does not mean that turns are skipped. - * The higher TPS, the lower the FPS will get. - * The better graphics hardware acceleration the higher TPS and FPS. - * Replaced the ``-fps`` (Frames Per Second) command line option with the ``-tps`` (Turns Per Second) option. - * Now there is an option to display both the TPS and FPS in the titlebar in the View Options. - -#### Rendering Options -* Added Rendering Options to the Preferences. -* It now possible to change the settings for Antialiasing, Text Antialiasing, Rendering Method, and number of rendering buffers. - -#### Explosion rendering -* [Req-11][]: Explosion on robots dependent on bullet energy. - * Explosions are no longer pre-scaled in 6 fixed sizes, but instead scaled real-time using Java2D. - * The explosion sizes are now more precise depending on bullet damage, and the memory usage for the explosions has been brought down by not using pre-scaled explosion images. - * This fixed the painting of explosions on the iMac, where explosions were painted as filled circles with version 1.1 and 1.1.1. - * Bullets are now painted as filled energy balls with a size that depends on the bullet energy. -* [Req-13][]: Bullets are sometimes too small. - * The size (circle area) is calculated so that: - * A bullet with power = 0.1 (minimum power) uses 1 pixel. - * A bullet with power = 3 (maximum power) uses 30 pixels. - * In addition, explosions when a bullet hits a robot or another bullet are also depending on the bullet energy. - -#### New Option -* Added the option "Visible Explosions" in the View Options to the Preferences. -* This option makes it possible to enable and disable the painting of explosions. - -#### Setting Robot Colors -* The ``setColors(bodyColor, gunColor, radarColor)`` method is now deprecated. - * Replaced by ``setBodyColor()``, ``setRadarColor()``, and ``setScanColor()``. -* [Req-10][]: Coloring of bullets and scan arcs. - * Added ``setBulletColor()`` for changing the bullet color, and ``setScanColor()`` for changing the scan color (used for drawing scan arcs). - -#### Improved Sample Robots -* [Req-20][]: Robot templates must be updated regarding deprecated methods. - * All sample robots has been updated. - * Deprecated methods are replaced by current methods. - * Colors has been added to each robot, except for MyFirstRobot, which should be kept as simple as possible. - -#### Added Restart Button -* [Req-14][]: Restart Button. - * Restart button has been added in order to restart a battle. - -#### New "No Display" Option -* [Req-4][]: Prevent API from loading unused features. - * No graphical components are loaded anymore when Robocode is run from the command line with the ``-nodisplay`` option. - * This feature has been added in order to run Robocode on Unix-like systems that don't have X installed on them or for running Robocode as a kind of server, e.g. for [RoboRumble][]. - -#### Added Browse Button -* [Req-16][]: Browse button in Development Options. - -#### Keyboard Mnemonics -* Changed some keyboard mnemonics in the View Options in the Preferences. - -## Version 1.1.1 (06-Jul-2006) - -### Bug Fixes -* [Bug-16][]: Too many skipped turn because of CPU speed detection. - * Robots than ran fine under v1.0.6 were skipping turns like crazy under v1.0.7. - * The CPU speed detection has been changed to accept 50 times as many clock cycles than with with v1.0.7. -* [Bug-6][]: Text-Output Errors. - * Robot text-output error has been fixed according to the solution provided by Matt (msj(at)sysmatrix(dot)net). -* [Bug-15][]: "Visible ground" option is not saved. - * The state of the "View option" was not loaded correctly, and hence always set to enabled everytime Robocode was restarted. -* [Bug-11][]: A bug at ``updateMovement()`` in ``RobotPeer.java``. - * The ``updateMovement()`` that checked for ``distanceRemaining > 1`` instead of ``distanceRemaining > 0`` when slowing down. -* [Bug-14][]: Radar color is wrong. - * The radar was not colored correctly due to a bug in the coloring filter. -* [Bug-17][]: Robot editor's window list retains old windows. - * The Robocode editor's window menu did not remove closed windows properly when muliple windows were opened in the editor. -* [Bug-12][]: Autoextract hangs on Mac 10.3.9. -* [Bug-13][]: Compiling may fail - Mac 10.3.9. - * Issues with installing and compiling under Mac 10.3.9 were fixed. -* [Bug-18][]: Blank console in battles between two bots. -* [Req-2][]: Keep window size of "New battle" window. - * The window position and sizes were not loaded properly from the windows.properties file. - * The battle window is no longer reset every time a new battle is started, and the window size and position is now saved into the windows.properties file. -* Various part of Robocode did not work properly if installed into a folder containing spaces, e.g. compiling and viewing the API documentation did not work. - -### Changes - -#### 1200x1200 Battle Field -* [Req-3][]: More precise battlefieldsize configuration. - * Added 1200x1200 battle field size as one of the standard sizes, and set the size step to 100. - * This feature was added to accommodate [RoboRumble][]. - -#### Robot Colors -* The robot colors are now painted using a true HSL color model. -* The change to use the HSL color model fixed the bug regarding none or wrong coloring. -* Also, the lumination of the robot colors has been changed. - -#### Robocode SG Support -* [Req-7][]: Graphical "debug" facilities like with RobocodeGL. - * Added a checkbox to enable Robocode SG painting in the robot console. - * The "Debug paint" button in the robot console has been renamed to "Paint". -* [Req-8][]: Debug Graphics - SG Option. - * The "Paint" button enables painting in general, and by trickering "Robocode SG", the robot (debug) painting will be rendered as Robocode SG does it. - -#### Command line / batch files -* Added the ``-Xmx512M`` option to the batch files extending the max. memory heap size to 512 MB. -* Added the ``-Dsun.io.useCanonCaches=false`` which fixes some ``SecurityException`` issues on robots that read from files, and also fixed the installing and compiling problem under Mac 10.3.9. - -## Version 1.1 (14-Jun-2006) The "Continuation" release - -### Bug Fixes -* [Bug-1][] and [Req-1][]: Multiple or hyperthreading CPUs (most P4s) hangs Robocode. -* [Bug-5][]: Robot compile error under jdk1.5. - * The Jikes compiler has been updated to version 1.22. -* [Bug-7][]: Window won't repaint itself, window flickers in battle mode. -* [Bug-9][]: Screen flickers using Sun JDK1.5.0 in Linux. -* [Bug-8][]: Opening of the Robocode API help. - * Help menu updated. -* [Bug-9][]: Screen flickers using Sun JDK1.5.0 in Linux. -* [Bug-10][]: Eclipse compile problem (Java 1.5) in ``RobocodeClassLoader``. -* Links in Help menu fixed, so you are able to browse the API etc. - * Updated with links for "RoboWiki", "Yahoo Group: Robocode", and "Robocode Repository". -* [Req-5][]: Keyboard Navigation. - * Hotkeys have been added to every button, menu, and menu option. - -### Changes -* Added feature for Debug Painting. -* By implementing the ``Robot.onPaint(Graphics2D g)`` method of your robot(s), graphics of your choice will be rendered when enabling "Debug Paint" on the console window for that robot. -* [Req-6][]: Editor Improvements. - * New "Edit" menu containing: "Undo", "Redo", "Cut", "Copy", "Paste", "Delete", "Find...", "Find next", "Replace", "Select All". - * New "Window" menu containing "Close" and "Close All" options, entries for each open window (up to 9), "More Windows" option where you can get all open windows. - * Added undo/redo stack. - * Added linenumbers. -* New rendering engine based on Java2D: - * Graphics is drawn faster as Java2D make use of hardware acceleration. - * Robot colors are now painting using the HSB color model. - * Graphics is resized when the battle window is resized. - * Added "Visible ground" option in "View Options" which will paint background tiles and explosion debrises. -* The battlefield is always centered in the battle window. - -## Robocode was release as Open Source on SourceForge - -## Development was taken over by Flemming N. Larsen - -## Version 1.0.7 (18-Feb-2005) -* Released as Open Source under Common Public License. -* New explosion graphics. -* Fixed a few bugs. - * No longer possible to teleport when hitting walls ([Bug-3][]). - * Docs fixed and regenerated ([Bug-4][]). - * Fire assistance removed from ``AdvancedRobot`` ([Bug-2][]). -* Now requires Java 1.4. -* New system for calculating CPU speed. - -## Version 1.0.6 (17-Jul-2002) -* Robots that perform file I/O will be allowed 240 skipped turns in a row before being stopped. - * Other robots will still be allowed 30 in a row. -* Fixed issue with Linux where window frames were outside screen. -* Fixed reset compiler option in editor (broken in 1.0.5). - -## Version 1.0.5 (15-Jul-2002) -* Updated dialogs for: Packager, Extractor, Team Creator, Compile Options. - * So they don't hide behind main window. -* Fixed bug where New Battle dialog would hang on some systems. - -## Version 1.0.4 (15-Jul-2002) -* Raised max ``setXX`` calls before disable to 10,000. -* Moved ``setXX`` and ``getXX`` warnings to only print when max is hit. - * Previously at 300 and 3000, respectively. -* Fixed bug in ``clearAllEvents``. -* Updated Jikes compiler to version 1.16. - -## Version 1.0.3 (28-Jun-2002) -* Added ``setFire(double)`` and ``setFireBullet(double)`` methods to ``AdvancedRobot``. -* Added ``getDataQuotaAvailable()`` call to ``AdvancedRobot``. -* Fixed bug: Robots taking action in ``Condition.test()``. -* Implemented better method for stopping misbehaving robots. - * Basically, to help fix mistakes such as: - - bad: while (getGunHeat() != 0) {} - good: while (getGunHeat() != 0) { doNothing(); } - - * Robots will be disabled after 10000 calls to ``getXX`` methods with no action. - * Robots will be disabled after 1000 calls to ``setXX`` methods with no action. - * Only ``getXX`` and ``setXX`` in the robot itself counts (``event.getXX`` does not). - -## Version 1.0.2 (21-Jun-2002) -* Increased default filesystem quota to 200000 bytes. -* Droid leaders now start with 220 energy. -* Fixed bug that allowed robots to read other robots' data directories. -* Fixed bug that allowed invalid robot version strings. -* Fixed two bugs that allowed robots to exceed filesystem quota. - -## Version 1.0.1 (23-Apr-2002) -* Team robots will always show in the robot selection dialog. -* Robots in .jar files without a .properties file will not show. -* The extension ".jar.zip" is now supported for cases where the browser renames .jar files. - -## Version 1.0 (05-Apr-2002) -* New online help integrated. - * http://robocode.alphaworks.ibm.com/help/index.html. - * includes instructions for using Eclipse to build a Robot. -* ``onWin()`` is now called the moment you are the last surviving robot. - * You can now do victory dances in ``onWin``. - * Tracker and TrackFire updated to reflect this. -* Context assist will now work inside Eclipse. -* Fixed bug: ``getTeammates()`` returning ``null`` for last teammate. -* Fixed a few other small bugs. - -## Version 0.99.4 (24-Mar-2002) -* Fixed scanning bug (missing scan events with small scanarcs). -* Added "Import downloaded robot" tool. -* Renamed "Packager" to "Package robot for upload". -* Added "Extract downloaded robot for editing" to Robot Editor -* Added "Press F5 to refresh" label to robot selection dialog. -* Added small battle demo when new version detected. - -## Version 0.99.3 (21-Mar-2002) -* Fixed velocity bug. - * Movement is now more optimized. - * No more '1 2 0 -1 0 1 2 0' velocities. -* Fixed ``maxVelocity`` bug. - * ``setMaxVelocity`` can no longer be used to instantly stop. -* Fixed first turn bug (``getTime`` returing 0 twice). -* New, more accurate CPU benchmark. (Updated Linpack benchmark). - * Should fix '1ms per turn' bug on Win9X systems. - -## Version 0.99.2 (13-Mar-2002) -* Added a development path to support external IDEs such as [Eclipse](http://eclipse.org). - * Found in Options->Preferences. - * Simply add the path to your robot project. - * As usual, robots will be loaded from disk at the start of each battle. -* Improved support for RoboLeague. -* Documented ``robocode.control`` package (http://robocode.alphaworks.ibm.com/docs/control). -* Fixed bug: ``sendMessage`` causing ``StringIndexOutOfBounds``. - -## Version 0.99.1 (11-Mar-2002) -* Fixed bug: Some messages were delayed. -* Fixed bug: Broken RoboLeague interoperability. -* Fixed bug: ``getSender()`` did not show version or duplicates. -* Fixed bug: RobotPackager not packaging teams correctly under Java2 1.3. - -## Version 0.99 (05-Mar-2002) The "TEAMS" release -* Introducing: Teams! - * See ``sampleteam.MyFirstTeam`` for an example. - * Teams may consist of 2 to 10 robots. - * To use teams, first create one or more TeamRobots, then create a Team. - * TeamRobots will not show up in the New Battle dialog by default. You can change this behavior in Options->Preferences. - * To create a team, select Robot->Team->Create Team. - * You can add regular robots to a team, but they will not be able to communicate. - * The *first* robot you add to a team becomes the "team leader". Team leaders start with 200 energy. (They are superheroes) When team leaders die, all other members of the team lose 30 energy. Protect your leader! - * Team scoring is cumulative, but similar to normal scoring: Teams receive 50 points for each surviving team member every time an enemy dies. Teams receive ``10 * numEnemies`` points for each surviving teammate upon winning. Damage bonuses are for all damage dealt by that team Firsts, Seconds, Thirds are based on last surviving team member. - * Teammates can damage each other. - * Teams can be packaged like regular robots. - * Teammates without a version will receive the team version [enclosed in square brackets]. - * Team messages are limited to 32K per message. -* Introducing: Droids. - * Droids are robots without radar or scanning ability. - * simply add "implements Droid" to a TeamRobot to create a droid. - * Droids start with 120 energy (due to weight savings on the radar). - * Droids do not show up in the New Battle dialog by default. You can change this behavior in Options->Preferences. - * The API is unchanged, but scanning will not work. - * See ``sampleteam.MyFirstDroid`` for an example. -* Added new class: TeamRobot. - * See Javadocs for details. - * Adds messaging capability to robots. -* Added new class: ``MessageEvent`` -* Added new interface: ``Droid`` -* Fixed bug: Duplicate robots sometimes showed up in robot selection dialog. -* Fixed bug: Default Window Size not working for some battles. - -## Version 0.98.3: (08-Feb-2002) The "Everything but teams and it took too long" release -* ``setColors()`` now accepts any color (previously it had to be a default color). - * Only works in the first round. - * Only the first 16 robots in a battle will get their Reqed colors. -* Robots may now extend or use classes that are not in their package. - * This allows for utility classes, when they are in the robots tree. - * If you do not wish others to extend your robot, declare your robot class final. - * If you do not with others to use classes from your package, do not declare them public. - * All referenced classes will be packaged with the robot packager. -* Robots in the robotcache directory that do not have a .properties file will not show up in the robot selection dialog (done in order to support extended robots, above). -* You may now delete files in your data directory. -* Robocode will now always run at full speed when minimized. -* New Battle Dialog "Finish" button renamed to "Start Battle". -* New Battle Dialog "Start Battle" button Reqs focus when enabled. -* Robocode FAQ linked from help menu. -* Robocode now supports RoboLeague by Christian Schnell. - * http://user.cs.tu-berlin.de/~lulli/roboleague/. -* Fixed bug: Default thread priority was low. -* Fixed bug: Robots had access to peer. -* Fixed bug: Survival seconds reported as Survival firsts. -* Fixed bug: Robots did not always receive all ``onRobotDeath`` events. -* Fixed bug: ``getTime`` returning last round's end time at start of rounds. -* Editor 'Open File' now defaults to the last opened directory (per session). -* Fixed minor editor bug when parsing for classname. -* Fixed bug: Robocode will no longer try to save the size/position of a maximized window. -* Fixed bug: Bullets hitting each other immediately with fast gun cooling rate. -* Fixed bug: Incorrect number of rounds reported when stop pressed. -* Fixed bug: Incorrect number of "seconds" and "thirds" displayed. - -## Version 0.98.2 (28-Nov-2001) The "Screaming FPS" release -* Speed up performance when minimized. -* New license includes academic use. -* Fixed bug: disappearing energy/name strings. - -## Version 0.98.1 (27-Nov-2001) The "Ok, NOW it's starting to feel real" release -* Fixed bug clearing scaled battles. -* Robot consoles changed back to white on dark gray. -* Fixed bug with case sensitivity in editor's suggested filename. -* Other minor tweaks and bug fixes. -* Updated Tracker and RamFire (no ``setInterruptible``). -* Added commentary and dates to this file. -* Added link to this file from help menu. - -## Version 0.98 (27-Nov-2001) The "It's starting to feel real" release -* Added ``setColors(Color robotColor, Color gunColor, Color radarColor)`` to Robot. - * By default, robots are the default blue. - * Call this in your run method (no more than once per round) to set your robot's colors. - * Accepts any ``System`` default colors, i.e. ``Color.red``. -* Robots are now instantiated each round. - * You no longer need to re-initialize all your variables at the beginning of ``run()``. - * ** Only static variables are persistent across rounds **. -* Graphics optimizations. - * No more rotating images at the start of each battle. - * Far more memory efficient. -* New model for CPU time. - * Robocode now uses the [Linpack benchmark](http://www.netlib.org/benchmark/linpackjava/). - * Used to determine how much time each robot is allowed for processing. -* Threading changes. - * Robocode is now threadsafe (as far as I know, anyway). - * Robot threads execute sequentially. - * No more "busy wait" enhances performance, especially on large battles. -* Minimized optimizations. - * When minimized, Robocode will not do any drawing. - * FPS can really crank up (when set in options-preferences). -* Minor graphic changes (The gun is slightly further forward). -* New class hierarchy, in order to clean up the javadocs. - * added ``_Robot`` and ``_AdvancedRobot``. - * These hold deprecated methods and system-related things. - * added ``_AdvancedRadiansRobot`` to clean up the ``AdvancedRobot`` docs. - * You should still extend either ``Robot`` or ``AdvancedRobot``. -* Battles may now consist of 1-256 robots. - * A warning confirmation will appear for > 24 robots. - * A confirmation will appear for 1 robot. -* Robots will now appear as they are loaded. -* So large battles won't appear "hung". -* Consoles persist between battles (although they are cleared). -* Console threading is more efficient. -* Console scrolling is crisper (bug fixed). -* Console now has an unlimited size, once opened. - * There is an 8K circular buffer before it is opened. -* ``setInterruptible()`` moved to ``AdvancedRobot``. - * Deprecated version in ``Robot`` does nothing. - * Note: Balancing of the ``Robot`` class still needs work. -* Skipping turns may happen more often, but is not as big a deal as it used to be. - * with the exception of your first turn. - * You will only lose events if you skip 2 in a row. - * You will not be stopped unless you skip 60 turns in a row. - * Skipped turns can be caused by loading classes from disk, writing files, etc. If this becomes a problem, I will preload all classes. -* Fixed bug with compiler when filename has a space. -* Fixed bug with getting ``BulletMissed`` and ``BulletHit`` events for same bullet. -* Fixed bug with editor locking up reading some files. -* Another round of major code organization. -* Again, probably more minor items that I already forgot about. :) -* (Later additions... such as:) - * Invalid insert bug in editor - * Copy/Paste from console. - -## Version 0.97.4 (18-Nov-2001) The "finally, a single installer!" release -* Completely reworked install process. -* There is no longer a setup.exe installer. -* Jikes is now packaged with Robocode as the default compiler. - * you may use javac if you prefer, and you have it. -* API docs now link to the Java API. -* Fixed bug: Editor did not close files after saving. -* Fixed bug: Unable to deselect "display robot names". -* Fixed bug: Shared static vars between instances of the same robot. -* Fixed a few graphics glitches. -* Minor doc updates. - -## Version 0.97.3 (05-Nov-2001) The "hourly release" release :) -* Fixed ``NullPointerException`` when loading robots with no package. -* Added ``robocode.robot.filesystem.quota`` property to robocode.properties. - * This is a temporary solution, which sets the default filesystem quota for robots. - * Example: ``robocode.robot.filesystem.quota=200000`` for 200k. -* Fixed bug in editor that caused it to suggest an unreasonable filename. - -## Version 0.97.2 (04-Nov-2001) -* Fixed bug that caused some robots to be stopped by the game. -* Battles/Rounds start faster (back to 0.96.2 speed). -* More lenient on CPU use. - * You have roughly 4 whole seconds before your first move. - * You have roughly ``50 + (1000 / fps)`` milliseconds to process each frame. - * This is more than twice what the entire game itself gets. :) - * Failure to take action in that amount of time results in a SkippedTurnEvent. - * You will be removed from the round if you skip 30 turns in a round. - * Un-deprecated ``onSkippedTurn`` and ``SkippedTurnEvent``. - * No reasonable robot should ever receive a ``SkippedTurnEvent``... but now it's there just in case. - -## Version 0.97.1 (03-Nov-2001) -* Abstract classes now work properly in the selection dialog and robot database. -* Fixed a few Javadoc bugs. -* Fixed pause/resume bug. -* Javadocs have deprecated calls again. - -## Version 0.97 (02-Nov-2001) The "painful but worth it" release -* I probably missed a few things in this list. :) -* Introducing the Robot Packager. - * Select your robot, type in a few details, and let it figure out the rest. - * Saves details in a .properties file (see details below). - * Builds a .jar for you. - * Save this .jar in your robots directory (not a subdirectory, for now). - * You may distribute this jar as a standalone robot. -* .properties files. - * Not required unless you are packaging your robot. - * Built automatically by the packager. - * Includes: - * Robot version - * Short description - * Optional author name - * Optional webpage - * Robocode version - * Flag for source included -* .jar files, and the robotcache. - * Simply put a robot .jar file in your robots directory. - * It will be extracted to the "robotcache". - * Jar filename is the unique key for the robotcache. - * Do not edit files in the robotcache, they may be overwritten. Copy them to your robots directory if you like. This will be a feature in a future version of Robocode. -* Robot Database. - * Built and maintained for you. - * Allows Robocode to remember which .class files are robots, and which not. - * Press F5 in the robot selection dialog to refresh the database. -* Robot Selection dialog. - * Divided up into packages. - * Shows robot details (from .properties) if they exist. -* .html files. - * Create a .html file if you like... see ``sample.SittingDuck``. - * Linked from robot selection dialog. -* Major scoring changes. - * 50 points every time an enemy dies while you are alive. - * (10 * numOthers) points if you are the sole survivor - * 1 point for each point of damage you do with bullets. - * 2 points for each point of damage you do by ramming (see Ramming changes, below). - * ``bonus .2 * damage`` done to a specific enemy, if you kill that robot, or - * ``bonus .3 * damage`` done to a specific enemy, if you kill by ramming. -* Ramming changes. - * Damage increased (from .4 to .6). - * Only generates score if you are moving toward the enemy. - * If you are ramming, and run out of energy, you will now be disabled instead of killed. -* "Life" replaced with "Energy". - * A more sensible name. - * All ``getLife()`` calls deprecated and replaced with ``getEnergy()``. -* Added ``getEnergy()`` to ``HitRobotEvent`` (I can't believe it wasn't there before!). -* Only ``Robots`` and ``AdvancedRobots`` will show in the New Battle dialog. - * Fixes known bug listed below at the end of 0.96 changes. -* Custom events are now be cleared at the start of each round. - * However, since many robots rely on them still existing, Robocode will currently re-add any custom events that were created at the beginning of the first round, for all remaining rounds. This is a temporary solution for backwards compatibility, and will cause a warning message in your console. -* You may now print to ``System.out``. - * Will automatically redirect output to your console. -* Robot Editor now supports creating normal Java files. -* Added line number display to Robot Editor -* ``MoveCompleteCondition`` bug fixed. -* ``getTurnRemaining()``, ``getGunTurnRemaining()``, ``getRadarTurnRemaining()`` now return degrees. -* ``getTurnRemainingRadians()``, ``getGunTurnRemainingRadians()``, ``getRadarTurnRemainingRadians()`` added. -* Added ``setAdjustRadarForRobotTurn(boolean)``. - * By default, set to the value of ``setAdjustRadarForGunTurn`` for backwards compatibility. -* Windows now remember their last position. - * This is based on the preferred size of the window, so that different battlefield sizes may have different window position and sizes. - * This is stored in the file "window.properties" which you can safely delete to reset. -* Added "Default Window Size" to Options menu. - * Resizes the window to optimal (even better than before). -* Command-line parameters to run a battle. - * ``robocode -battle battles\sample.battle -results out.txt -fps 250 -minimize``. - * Results will go to ``System.out`` if you do not specify a results file. - * All other Robocode output goes to ``System.err``. -* "Activity" is now defined as loss of 10 energy in the battle. - * Inactivity Time is now the number of frames in which 10 energy must be lost. - * This does not include loss due to inactivity itself, or hitting walls. - * Prevents robots stopping the inactivity timer by calling ``fire(.1)`` every 15 seconds. -* Compiler uses ``-g`` option for debugging. - * This *may* help those users trying to use advanced debuggers. -* Much improved "waiting for robots to start". -* More lenient on "robot has not performed any actions". -* Various javadoc fixes. -* Minor updates to template files. - -## Version 0.96.2 (09-Oct-2001) -* Fixed bug in movement that allowed robots to exceed ``maxVelocity``. - -## Version 0.96.1 -* Added automatic version checking. -* Added ``getVelocity()`` to ``Robot``. -* Fixed minor bug in editor (caused the "do" in "doNothing" to highlight). -* ``WinException`` and ``DeathException`` now extend ``Error`` instead of ``RuntimeException``. - * So you won't catch them by mistake with: ``catch (Exception e)``. - * You still don't want to catch them, or you'll get no score. -* Fixed minor API doc bugs. -* Added a warning when you are calling the ``setXX`` methods too many times (300). - * has no effect on whether the game stops you or not, it simply helps to explain why. before taking an action. -* Replaced BrowserControl with BrowserLauncher, from http://www.stanford.edu/~ejalbert/software/BrowserLauncher. - * Should work on more systems. -* Synchronized ``tick()``. - * Two threads cannot take action at the same time. - * This entire area needs work. -* FPS no longer displayed when Swing doublebuffering is on. -* Added ``getHeadingRadians()`` to ``Bullet``. -* Fixed ``getHeading()`` in ``Bullet`` to return degrees. - -## Version 0.96 (05-Oct-2001) The "Robocode is now my life" release -* Renamed "Battles" to "Rounds" -- a single battle consists of multiple rounds. -* Commented and updated all sample robots. -* All sample robots are now in package "sample". -* If the old samples exist, Robocode will ask you if it may delete them, when you first run it. -* Only Target, Crazy, Spinbot are still AdvancedRobots. - * Target must be for the custom event. - * Crazy and Spinbot call setTurn methods. -* SittingDuck is now an AdvancedRobot. - * SittingDuck writes to the filesystem. -* Help system now uses system browser. Hopefully. Let me know of any issues. -* API Help menu item copied to RobocodeEditor, and uses the local copy. -* Robots may now use,extend,or inherit external classes, as long as they are in the same root package. - * You must be in a package to use this feature. -* Added call: ``getDataDirectory()`` to ``AdvancedRobot`` -- returns ``java.io.File`` representing your data directory. -* Added call: ``getDataFile(String filename)`` to ``AdvancedRobot`` -- returns ``java.io.File`` representing a file in your data directory. -* AdvancedRobots may now read files that are in the same directory (or subdirectory) as their root package. - * It is recommended that you only read from your data directory. - * You may not read another robot's data directory. - * If you extend another robot, and it calls ``getDataDirectory``, it will get YOUR data directory. - * If you extend another robot, and manually try to read it's data directory, it will fail. -* Added classes: ``RobocodeFileOutputStream`` and ``RobocodeFileWriter``. -* AdvancedRobots may now write files to their data directory. - * You must use ``RobocodeFileOutputStream`` or ``RobocodeFileWriter``. - * Any other output stream will fail. - * You may wrapper them with other output streams. - * Example: ``PrintStream out1 = new PrintStream(new RobocodeFileOutputStream(getDataFile("my.dat")));`` - * There is a quota of 100K. -* Fixed scoring bug (as exhibited by ``rk.Rotator``). -* Fixed threads stuck in wait condition when new battle selected. -* Fixed threads stuck in ``onWin`` or ``onDeath`` events. -* Fixed threads not taking action. -* Fixed leftover threads. -* Fixed a half dozen other thread issues. -* Limited \# of worker threads a robot may have to 5. -* Limited ``print``/``println`` calls to ``out``, to 100 per turn. -* Robots now run in their own ``ThreadGroup``. (You can no longer can see other robot's threads). -* Robots now have their own ``Classloader``. (static variable ``messages`` will no longer work). -* Fixed ``NullPointerException`` in ``RobocodeOutputStream``. -* ``WinEvents`` or ``DeathEvents`` will now be the only thing in the event queue. -* Reworked event handler system, should be more robust. -* Tweaked event priorities. New default priorities are: - * ``BulletHitBulletEvent``: 50. -* Valid priorities are 0 to 99 (100 is reserved). -* Added new method ``setInterruptible(boolean)`` to ``Robot``. - * Can only be used while handling an event. - * Always resets to false when the event ends. - * Causes event handler to restart from the top, if the same event (or another event of the same priority) is generated while in the event handler following this call. - * This will only happen if you take an action inside an event handler, that causes the same event handler to be called. - * This makes it possible for Robots to turn and move like AdvancedRobots... - * This has no effect on events of higher priority. -* Calling ``scan()`` inside of ``onScannedRobot()`` can now restart ``onScannedRobot``. - * internally calls ``setInterruptible(true)`` for itself. - * See ``sample.Corners`` for example. -* Robots of class ``Robot`` no longer take damage from hitting a wall. -* Robots of class ``AdvancedRobot`` take more damage from hitting a wall. -* Added ``isMyFault()`` to ``HitRobotEvent``. - * Returns ``true`` if you caused the event by moving toward the other robot. -* Revamped robot to robot collisions. - * Your movement will be marked complete if you are moving toward the other robot. - * You will not be stopped if you are moving away from the other robot. - * Collisions now cause more damage, but are easier to escape from. - * This means robots without ``onHitRobot`` handlers still have a chance... - * An event is generated every time one robot hits another. - * If you are moving toward the other robot, you will get ``onHitRobotEvent`` with ``isMyFault() = true``. - * If another robot is moving toward you, you will get an ``onHitRobotEvent`` with ``isMyFault() = false``. - * If you are moving toward each other, you will get two events, with the ``isMyFault() = true``, first. -* Damage from robot to robot collisions is now a constant 0.4. -* Added ``getBearing()`` to ``onHitByBullet``. -* Added a ``Bullet`` object. - * encapsulates owner, victim, power, velocity, X, and Y. -* Bullet hitting bullet generates ``BulletHitBulletEvent`` - methods include ``getBullet()`` and ``getHitBullet()``. - * added ``getBullet()`` to ``HitByBulletEvent``, ``BulletHitEvent``, ``BulletMissedEvent``. -* Added ``fireBullet()``, which is exactly like ``fire()``, but returns a ``Bullet`` object. - * I could not simply add a bullet return to fire, because it broke *all* existing robot .class files. -* You can now select from the results dialog. -* Fixed path for open/save battles on non-Windows systems. -* Fixed slashscreen for some systems. -* Fixed minor API doc bugs. -* Updated many API docs. -* Renamed and reorganized many internal classes. -* Fixed bug with allowed package names (now allows digits). -* Windows installer now defaults to c:\. -* Added ``getGunHeat()`` to ``Robot``. - * When gunHeat is 0, you can fire. - * ``gunHeat`` goes up by ``(1 + firePower / 5)`` when you fire. - * This is unchanged from the v0.95. -* Added ``getGunCoolingRate()`` to ``Robot``. -* Deprecated ``getGunCharge()``. - * Use ``getGunHeat()`` instead. -* Deprecated ``endTurn()``. - * It will still work for now, but you should replace calls to to it with ``execute()``. -* Removed ``onSkippedTurn``. - * Your robot will simply be stopped instead. - * The results dialog will report "not deterministic". - * Not deterministic means that a battle started with the exact same conditions and starting positions, may not end up with the same results. (Ok, so far, you can't test that...) :) - * Added ``getWaitCount()`` and ``getMaxWaitCount()`` to ``AdvancedRobot``. -* Deprecated ``SkippedTurnEvent``. - * Well, it's no longer used. -* Deprecated all ``getRobotXX`` methods. - * Replaced with ``getXX`` methods. -* Deprecated all ``getXXDegrees`` and ``setXXDegrees`` methods. - * Just use the ``getXX`` and ``setXX`` methods. -* Compiler will always show output, and uses the ``-deprecation`` flag. - * so you can see that you're using a deprecated call. - * I would like to remove all deprecated calls in the next version. -* Known bug: New battle dialog not smart enough to differentiate between Robots classes and other classes. - * You will be able to put other classes into a battle. - * They will sit there and do nothing. - -## Version 0.95 (09-Sep-2001) "The /. release" -* Completely rewrote all windows and dialogs to use LayoutManagers. -* Linux support vastly improved (although fps still not great). -* Improved framerate calculation (should be smoother on most systems). -* Robot exceptions now all go to robot's console. -* Fixed bug in initialization - radar turn. -* Hitting a wall no longer resets inactivity counter. -* Better pause functionality (fixed bugs). -* Known bug: Help system still not using external browser. -* Smarter dialog locations. - -## Version 0.94 (09-Aug-2001) -* Fixed a few bugs so Linux version would run. -* Known bug: Linux version does not run well. - -## Version 0.93 (23-Apr-2001) -* Completely redone graphics for tanks, guns, radar. -* Firepower adjusted. Higher-power bullets now move slightly slower and fire slightly slower. -* Gun must 'charge up' before firing. This avoids the "lucky shot" syndrome at the beginning of a battle. -* Added ``execute()`` method for ``AdvancedRobots``. Better name for 'endTurn'. -* Optimized drawing of explosion graphics. -* Added buttons for selecting battle size. -* Bullets can now hit each other (not perfect yet). -* Updated security manager to work with jdk1.4. -* Revised bounding box for new graphics. The graphics should no longer have a 5-pixel blank area. -* Optimized scanning code. -* Added 'color mask' to determine which parts of image should be recolored. -* Replaced splashscreen and icons. -* Java-based help, API, check new version. -* Robot menu (disabled). -* Changed ``fireDelay`` mechanism to be ``gunCharge``. Still in progress. -* Renamed to Robocode. -* Added Buttons for framerate. -* Added Buttons for battle size. - -## Version 0.92 (Mar-2001) -* Added ``getTime()`` method to ``Robots``. -* Added ``getFireDelay()`` method to ``Robots``. -* Added explosions. - -## Version 0.91 (Mar-2001) -* Fixed bug in ``waitFor()`` so that automatic scanning will not repeatedly generate events when the condition is ``true``. -* Fixed bugs in Tracker sample robot. -* Fixed display issues with view scan arc option. - -## Version 0.9 (Mar-2001) -* Completely reworked ``scan()`` to use a sweep as the radar moves. If the radar is not moving, the scan will be a straight line. -* Added fire assistance to regular ``Robot`` classes (not ``AdvancedRobots``). - * If you fire at a robot you see during ``scan()``, and gun/radar are together, and you ``fire()`` before doing anything else, you will fire at its center. - -## Version 0.8 (Feb-2001) -* Initial release. - * Robocode brought to IBM. - -## Version 0.1 (Sep-2000) -* Development started as late-night project. - - - - -[RoboRumble]: http://robowiki.net/wiki/RoboRumble (RoboWiki - RoboRumble) -[Markdown]: http://daringfireball.net/projects/markdown/syntax (Markdown syntax) - -[IRobotSnapshot.getContestantIndex()]: http://robocode.sourceforge.net/docs/robocode/robocode/control/snapshot/IRobotSnapshot.html#getContestantIndex() (robocode.control.snapshot.IRobotSnapshot.getContestantIndex()) -[IRobotSnapshot.getRobotIndex()]: http://robocode.sourceforge.net/docs/robocode/robocode/control/snapshot/IRobotSnapshot.html#getRobotIndex() (robocode.control.snapshot.IRobotSnapshot.getRobotIndex()) -[IRobotSnapshot.getTeamIndex()]: http://robocode.sourceforge.net/docs/robocode/robocode/control/snapshot/IRobotSnapshot.html#getTeamIndex() (robocode.control.snapshot.IRobotSnapshot.getTeamIndex()) - -[Patch-1]: http://sourceforge.net/p/robocode/patches/1/ (#1 Improved priority battle handling) - -[Bug-1]: http://sourceforge.net/p/robocode/bugs/1/ (Multiple or hyperthreading CPUs (most P4s) hangs Robocode) -[Bug-2]: http://sourceforge.net/p/robocode/bugs/2/ (Remove firing assistance for AdvancedRobo) -[Bug-3]: http://sourceforge.net/p/robocode/bugs/3/ (Teleportation of robot can happen (rare)) -[Bug-4]: http://sourceforge.net/p/robocode/bugs/4/ (#4 API Doc incorrect) -[Bug-5]: http://sourceforge.net/p/robocode/bugs/5/ (Robot compile error under jdk1.5) -[Bug-6]: http://sourceforge.net/p/robocode/bugs/6/ (Text-Output Errors) -[Bug-7]: http://sourceforge.net/p/robocode/bugs/7/ (Window won't repaint itself, window flickers in battle mode) -[Bug-8]: http://sourceforge.net/p/robocode/bugs/8/ (Opening of the Robocode API help) -[Bug-9]: http://sourceforge.net/p/robocode/bugs/9/ (Screen flickers using Sun JDK1.5.0 in Linux) -[Bug-10]: http://sourceforge.net/p/robocode/bugs/10/ (Eclipse compile problem (Java 1.5) in RobocodeClassLoader) -[Bug-11]: http://sourceforge.net/p/robocode/bugs/11/ (A bug at updateMovement() in RobotPeer.jav) -[Bug-12]: http://sourceforge.net/p/robocode/bugs/12/ (Autoextract hangs on Mac 10.3.9) -[Bug-13]: http://sourceforge.net/p/robocode/bugs/13/ (Compiling may fail - Mac 10.3.9) -[Bug-14]: http://sourceforge.net/p/robocode/bugs/14/ (Radar color is wrong) -[Bug-15]: http://sourceforge.net/p/robocode/bugs/15/ ("Visible ground" option is not saved) -[Bug-16]: http://sourceforge.net/p/robocode/bugs/16/ (Too many skipped turn because of CPU speed detection) -[Bug-17]: http://sourceforge.net/p/robocode/bugs/17/ (Robot editor's window list retains old windows) -[Bug-18]: http://sourceforge.net/p/robocode/bugs/18/ (Blank console in battles between two bots) -[Bug-19]: http://sourceforge.net/p/robocode/bugs/19/ (Confused updater) -[Bug-21]: http://sourceforge.net/p/robocode/bugs/21/ (Replace function generates extra tab) -[Bug-22]: http://sourceforge.net/p/robocode/bugs/22/ (Bad buildJikes.sh in 1.1.) -[Bug-24]: http://sourceforge.net/p/robocode/bugs/24/ (Robots hangs when running looong battles (and pausing)) -[Bug-25]: http://sourceforge.net/p/robocode/bugs/25/ (Wrong score for 1st place results in some battles) -[Bug-26]: http://sourceforge.net/p/robocode/bugs/26/ (Battlefield graphics is not always updated) -[Bug-28]: http://sourceforge.net/p/robocode/bugs/28/ (Enabling sound makes Robocode crash) -[Bug-29]: http://sourceforge.net/p/robocode/bugs/29/ (Runtime exception when opening new battle) -[Bug-30]: http://sourceforge.net/p/robocode/bugs/30/ (ad.Quest robot causes ConcurrentModificationException) -[Bug-31]: http://sourceforge.net/p/robocode/bugs/31/ (Ranking Panel does not save its size and position) -[Bug-33]: http://sourceforge.net/p/robocode/bugs/33/ (Sound is cut off after a round or two) -[Bug-34]: http://sourceforge.net/p/robocode/bugs/34/ (Getting null on getName()) -[Bug-35]: http://sourceforge.net/p/robocode/bugs/35/ (robocode.sh contains invalid ^M character) -[Bug-36]: http://sourceforge.net/p/robocode/bugs/36/ (License text in installer has wierd image at the buttom) -[Bug-37]: http://sourceforge.net/p/robocode/bugs/37/ (Bad bullet collision detection) -[Bug-39]: http://sourceforge.net/p/robocode/bugs/39/ (Final results not always ranked correctly) -[Bug-40]: http://sourceforge.net/p/robocode/bugs/40/ (Half of BulletHitBulletEvents are created improperly) -[Bug-41]: http://sourceforge.net/p/robocode/bugs/41/ (More bad bullet collision detections) -[Bug-42]: http://sourceforge.net/p/robocode/bugs/42/ ("Number of rounds" box is not tall enough on Gnome/Linux) -[Bug-43]: http://sourceforge.net/p/robocode/bugs/43/ (Layout is bad for Gnome/Linux) -[Bug-46]: http://sourceforge.net/p/robocode/bugs/46/ (Gun Method returns too soon) -[Bug-47]: http://sourceforge.net/p/robocode/bugs/47/ (Teleportation in version 1.2) -[Bug-48]: http://sourceforge.net/p/robocode/bugs/48/ (isMyFault() returns false despite moving toward the robot) -[Bug-49]: http://sourceforge.net/p/robocode/bugs/49/ (Robot gets stuck off-screen) -[Bug-50]: http://sourceforge.net/p/robocode/bugs/50/ (Bottom-left corner anomaly) -[Bug-51]: http://sourceforge.net/p/robocode/bugs/51/ (Hit wall problems) -[Bug-52]: http://sourceforge.net/p/robocode/bugs/52/ (Extra hit wall events) -[Bug-53]: http://sourceforge.net/p/robocode/bugs/53/ (Teams not always ranked correctly) -[Bug-54]: http://sourceforge.net/p/robocode/bugs/54/ (Flickering when constantly changing colors) -[Bug-55]: http://sourceforge.net/p/robocode/bugs/55/ (Incorrect score after replay) -[Bug-57]: http://sourceforge.net/p/robocode/bugs/57/ (ConcurrentModificationException) -[Bug-58]: http://sourceforge.net/p/robocode/bugs/58/ (NullPointerException during replay) -[Bug-59]: http://sourceforge.net/p/robocode/bugs/59/ (Issue when setting the priority of a BulletHitBulletEvent) -[Bug-60]: http://sourceforge.net/p/robocode/bugs/60/ (ConcurrentModificationException when extracting robots) -[Bug-61]: http://sourceforge.net/p/robocode/bugs/61/ (Hang when checking for new version with no Internet access) -[Bug-62]: http://sourceforge.net/p/robocode/bugs/62/ (Memory "Leak") -[Bug-63]: http://sourceforge.net/p/robocode/bugs/63/ (BulletHitBullet only destroys one bullet) -[Bug-64]: http://sourceforge.net/p/robocode/bugs/64/ (Exception when referencing length of an array of String) -[Bug-65]: http://sourceforge.net/p/robocode/bugs/65/ (Cannot run robocode after installation) -[Bug-66]: http://sourceforge.net/p/robocode/bugs/66/ (Crash: starting a new round while et.Predator 1.8 is playing) -[Bug-67]: http://sourceforge.net/p/robocode/bugs/67/ (Some issues with MessageEvent + priority) -[Bug-68]: http://sourceforge.net/p/robocode/bugs/68/ (Preferences not saved) -[Bug-69]: http://sourceforge.net/p/robocode/bugs/69/ (Robot causes Null Pointer Exception) -[Bug-70]: http://sourceforge.net/p/robocode/bugs/70/ (Version 1.2.6A incompatible with Roboleague) -[Bug-71]: http://sourceforge.net/p/robocode/bugs/71/ (RobocodeEngine becomes slower the more battles that are run) -[Bug-72]: http://sourceforge.net/p/robocode/bugs/72/ (The game won't play sounds on 2nd launch) -[Bug-73]: http://sourceforge.net/p/robocode/bugs/73/ (Sound don't work) -[Bug-74]: http://sourceforge.net/p/robocode/bugs/74/ (Java FilePermission error during startup) -[Bug-75]: http://sourceforge.net/p/robocode/bugs/75/ (getTeammates() problem) -[Bug-76]: http://sourceforge.net/p/robocode/bugs/76/ (Unique error) -[Bug-78]: http://sourceforge.net/p/robocode/bugs/78/ (Robots are disabled with no timer or countdown) -[Bug-79]: http://sourceforge.net/p/robocode/bugs/79/ (Output displayed in bursts) -[Bug-80]: http://sourceforge.net/p/robocode/bugs/80/ (Results file is empty with the command line) -[Bug-81]: http://sourceforge.net/p/robocode/bugs/80/ (Replay recording does not record paintings) -[Bug-82]: http://sourceforge.net/p/robocode/bugs/82/ (Undo comment does not change font color of code) -[Bug-83]: http://sourceforge.net/p/robocode/bugs/83/ (Ranking Panel Does not update number of competitors) -[Bug-84]: http://sourceforge.net/p/robocode/bugs/84/ (Preferences page problem on machine w/out sound card) -[Bug-85]: http://sourceforge.net/p/robocode/bugs/85/ (No window position in-bounding) -[Bug-86]: http://sourceforge.net/p/robocode/bugs/86/ (Using UI removes focus from interactive bots) -[Bug-87]: http://sourceforge.net/p/robocode/bugs/87/ (Round indicator incorrect) -[Bug-88]: http://sourceforge.net/p/robocode/bugs/88/ (Scorch layer) -[Bug-90]: http://sourceforge.net/p/robocode/bugs/90/ (Limit per round, not turn) -[Bug-91]: http://sourceforge.net/p/robocode/bugs/91/ (ConcurrentModificationException) -[Bug-92]: http://sourceforge.net/p/robocode/bugs/92/ (RoboRumble tries to connect with GUI) -[Bug-93]: http://sourceforge.net/p/robocode/bugs/93/ (onPaint(Graphics2D g) called prematurely) -[Bug-94]: http://sourceforge.net/p/robocode/bugs/94/ (Inconsistent Behavoir of RobocodeEngine.setVisible()) -[Bug-95]: http://sourceforge.net/p/robocode/bugs/95/ (OutOfMemory: Robots are Being Left on the Stack) -[Bug-96]: http://sourceforge.net/p/robocode/bugs/96/ (Initializing Label even when no display) -[Bug-97]: http://sourceforge.net/p/robocode/bugs/97/ (Exception when packaging robots) -[Bug-98]: http://sourceforge.net/p/robocode/bugs/98/ (When minimized doesn't show actual tps) -[Bug-99]: http://sourceforge.net/p/robocode/bugs/99/ (Clicking on a bottom area results in ClassCastException) -[Bug-100]: http://sourceforge.net/p/robocode/bugs/100/ (Double-clicking "restart") -[Bug-101]: http://sourceforge.net/p/robocode/bugs/101/ ("Keyboard lockup" with interactive robots) -[Bug-102]: http://sourceforge.net/p/robocode/bugs/102/ (Bots can hold memory after being destroyed) -[Bug-103]: http://sourceforge.net/p/robocode/bugs/103/ (ConcurrentModificationException) -[Bug-104]: http://sourceforge.net/p/robocode/bugs/104/ (Reproducable scoring bug) -[Bug-105]: http://sourceforge.net/p/robocode/bugs/105/ (testingCondition flag not reset) -[Bug-106]: http://sourceforge.net/p/robocode/bugs/106/ (Incorrect repaint of paused battlefield) -[Bug-107]: http://sourceforge.net/p/robocode/bugs/107/ (Bullet hit locations reported inaccurately) -[Bug-108]: http://sourceforge.net/p/robocode/bugs/108/ (It is possible to restart a battle without any robots) -[Bug-110]: http://sourceforge.net/p/robocode/bugs/110/ (Partial match recording replay) -[Bug-111]: http://sourceforge.net/p/robocode/bugs/111/ (Wasted time at end of each round) -[Bug-112]: http://sourceforge.net/p/robocode/bugs/112/ (Forcing stop: no score will be generated) -[Bug-113]: http://sourceforge.net/p/robocode/bugs/113/ (-battle option runs at full speed) -[Bug-114]: http://sourceforge.net/p/robocode/bugs/114/ (Wait Interrupted Message) -[Bug-115]: http://sourceforge.net/p/robocode/bugs/115/ (AWTException with RoboRumble on OS X) -[Bug-116]: http://sourceforge.net/p/robocode/bugs/116/ (Exclude filter removes bots from the RoboRumble) -[Bug-117]: http://sourceforge.net/p/robocode/bugs/117/ (Sound card is being dodgey/not detected by OS causes error) -[Bug-118]: http://sourceforge.net/p/robocode/bugs/118/ (Battles fail when executing with Eclipse debugger) -[Bug-120]: http://sourceforge.net/p/robocode/bugs/120/ (The renderering is slower on Vista than XP) -[Bug-122]: http://sourceforge.net/p/robocode/bugs/122/ (Not all shortcut keys work on MacOS) -[Bug-123]: http://sourceforge.net/p/robocode/bugs/123/ (Compiler fails to build due to CR/LF in scripts) -[Bug-125]: http://sourceforge.net/p/robocode/bugs/125/ (TimeoutExceptions occur when debugging in Eclipse) -[Bug-130]: http://sourceforge.net/p/robocode/bugs/130/ (Various usability issues) -[Bug-131]: http://sourceforge.net/p/robocode/bugs/131/ (Sometimes the compiler window hangs) -[Bug-134]: http://sourceforge.net/p/robocode/bugs/134/ (Robot problem after Options->Clean robot cache) -[Bug-135]: http://sourceforge.net/p/robocode/bugs/135/ (-battle broken) -[Bug-137]: http://sourceforge.net/p/robocode/bugs/137/ (Roborumble "ITERATE" broken) -[Bug-139]: http://sourceforge.net/p/robocode/bugs/139/ (Bug in RobotPeer.updateMovement?) -[Bug-141]: http://sourceforge.net/p/robocode/bugs/141/ (The -DROBOTPATH= option does not work) -[Bug-142]: http://sourceforge.net/p/robocode/bugs/142/ (Broken .sh files) -[Bug-143]: http://sourceforge.net/p/robocode/bugs/143/ (Blank console window when compiling) -[Bug-144]: http://sourceforge.net/p/robocode/bugs/144/ (drawArc does not work as expected) -[Bug-146]: http://sourceforge.net/p/robocode/bugs/146/ (Spammy output when running roborumble) -[Bug-147]: http://sourceforge.net/p/robocode/bugs/147/ (gunHeat is negative) -[Bug-148]: http://sourceforge.net/p/robocode/bugs/148/ (Wrong bullet power) -[Bug-149]: http://sourceforge.net/p/robocode/bugs/149/ (Replay exception) -[Bug-151]: http://sourceforge.net/p/robocode/bugs/151/ (Exception when changing between Robot to AdvancedRobot) -[Bug-153]: http://sourceforge.net/p/robocode/bugs/153/ (Junior Robot turnAheadRight bug) -[Bug-154]: http://sourceforge.net/p/robocode/bugs/154/ (Robot name missing when replaying XML record) -[Bug-156]: http://sourceforge.net/p/robocode/bugs/156/ (Spammy output on robot console windows) -[Bug-158]: http://sourceforge.net/p/robocode/bugs/158/ (Ubuntu throws NullPointerException in main) -[Bug-159]: http://sourceforge.net/p/robocode/bugs/159/ (Installation fail on windows if directory contain space) -[Bug-160]: http://sourceforge.net/p/robocode/bugs/160/ (Battle Results screen displaying old results) -[Bug-161]: http://sourceforge.net/p/robocode/bugs/161/ (Robot disabled by any other than losing energy can recover) -[Bug-162]: http://sourceforge.net/p/robocode/bugs/162/ (Team battle) -[Bug-163]: http://sourceforge.net/p/robocode/bugs/163/ (Spaces or native names in name of robocode directory) -[Bug-164]: http://sourceforge.net/p/robocode/bugs/164/ (Compiler Classpath Suggestion) -[Bug-165]: http://sourceforge.net/p/robocode/bugs/165/ (NullPointerException when using -battle option from cmd-line) -[Bug-166]: http://sourceforge.net/p/robocode/bugs/166/ (Bots referencing robocode.robocodeGL broken) -[Bug-168]: http://sourceforge.net/p/robocode/bugs/168/ (Bots inconviently stop working if they go over time limit) -[Bug-169]: http://sourceforge.net/p/robocode/bugs/169/ (pe.SandboxDT_3.02 stopped working in 1.6.2 and later version) -[Bug-170]: http://sourceforge.net/p/robocode/bugs/170/ (Robot Colors don't stick between rounds) -[Bug-171]: http://sourceforge.net/p/robocode/bugs/171/ (A battleview size exceed 800x600 filled with black) -[Bug-172]: http://sourceforge.net/p/robocode/bugs/172/ (Robot console fails to display some deaths/wins) -[Bug-173]: http://sourceforge.net/p/robocode/bugs/173/ (Robot packager can be activated once per running) -[Bug-174]: http://sourceforge.net/p/robocode/bugs/174/ (Robot console is sometimes empty) -[Bug-175]: http://sourceforge.net/p/robocode/bugs/175/ (Development robots cause problems with data files) -[Bug-177]: http://sourceforge.net/p/robocode/bugs/177/ (Open battle menu dialog is not loading robots) -[Bug-178]: http://sourceforge.net/p/robocode/bugs/178/ (Typing to find bot no longer works) -[Bug-179]: http://sourceforge.net/p/robocode/bugs/179/ (Event.setTime() method should not be hidden) -[Bug-181]: http://sourceforge.net/p/robocode/bugs/181/ (API: Typo in Documentation onBulletMissed(BulletMissedEvent)) -[Bug-176]: http://sourceforge.net/p/robocode/bugs/176/ (Editor UNDO does delete the line when no undo left) -[Bug-180]: http://sourceforge.net/p/robocode/bugs/180/ (Editor: Find (set cursor position)) -[Bug-182]: http://sourceforge.net/p/robocode/bugs/182/ (roborumble.sh and teamrumble.sh are broken) -[Bug-183]: http://sourceforge.net/p/robocode/bugs/183/ (NullPointerException in BattlesRunner.runBattlesImpl) -[Bug-184]: http://sourceforge.net/p/robocode/bugs/184/ (Custom event priority broken) -[Bug-185]: http://sourceforge.net/p/robocode/bugs/185/ (Webpage button lay over robot description) -[Bug-186]: http://sourceforge.net/p/robocode/bugs/186/ (Rounds number do not saved between run) -[Bug-187]: http://sourceforge.net/p/robocode/bugs/187/ (Not enough java memory allocated in launch scripts) -[Bug-188]: http://sourceforge.net/p/robocode/bugs/188/ (Meleerumble using 2 bots instead of 10) -[Bug-189]: http://sourceforge.net/p/robocode/bugs/189/ (API - cannot subclass Event in 1.7.1) -[Bug-190]: http://sourceforge.net/p/robocode/bugs/190/ (Errors with some robot classes when rebuilding database) -[Bug-191]: http://sourceforge.net/p/robocode/bugs/191/ (EOFException during repository rebuild) -[Bug-192]: http://sourceforge.net/p/robocode/bugs/192/ (Fair Play!) -[Bug-193]: http://sourceforge.net/p/robocode/bugs/193/ (TeamRumble uploading result for Robot instead of team) -[Bug-194]: http://sourceforge.net/p/robocode/bugs/194/ (JarJar multi-registration) -[Bug-195]: http://sourceforge.net/p/robocode/bugs/195/ (Client tries to remove all participants) -[Bug-196]: http://sourceforge.net/p/robocode/bugs/196/ (Wrong file path used for development bots) -[Bug-197]: http://sourceforge.net/p/robocode/bugs/197/ (Melee rumble doesn't use "smart battles") -[Bug-199]: http://sourceforge.net/p/robocode/bugs/199/ (FontMetrics StackOverflowError) -[Bug-200]: http://sourceforge.net/p/robocode/bugs/200/ (Graphics2D.setFont() has no effect) -[Bug-201]: http://sourceforge.net/p/robocode/bugs/201/ (setMaxVelocity(lower than current) + reverse direction bug) -[Bug-202]: http://sourceforge.net/p/robocode/bugs/202/ (Installer says to run robocode.jar) -[Bug-204]: http://sourceforge.net/p/robocode/bugs/204/ (Nanobot rumble not sending melee or team parameters) -[Bug-205]: http://sourceforge.net/p/robocode/bugs/205/ (Wrong survival scores sent by rumble client) -[Bug-206]: http://sourceforge.net/p/robocode/bugs/206/ (Funny behaviors with robot graphics/painting) -[Bug-207]: http://sourceforge.net/p/robocode/bugs/207/ (Access denied javax.swing -DNOSECURITY=true) -[Bug-208]: http://sourceforge.net/p/robocode/bugs/208/ (Does not extract .properties files into bot data dirs) -[Bug-209]: http://sourceforge.net/p/robocode/bugs/209/ ([Codesize] Invalid entry point in codesize-1.1.jar) -[Bug-210]: http://sourceforge.net/p/robocode/bugs/210/ (Bullet and Ram Damage Bonuses are wrong) -[Bug-212]: http://sourceforge.net/p/robocode/bugs/212/ (Team jar files reported as corrupted) -[Bug-213]: http://sourceforge.net/p/robocode/bugs/213/ (NullPointerException when setting classpath directory) -[Bug-214]: http://sourceforge.net/p/robocode/bugs/214/ (Accel/decel rules introduced in 1.7.1.3 causes trouble) -[Bug-215]: http://sourceforge.net/p/robocode/bugs/215/ (Missed onRobotDeath events) -[Bug-216]: http://sourceforge.net/p/robocode/bugs/216/ (Sometimes too few results for robots are displayed) -[Bug-218]: http://sourceforge.net/p/robocode/bugs/218/ (Robocode enters infinite loop with the Restart button) -[Bug-222]: http://sourceforge.net/p/robocode/bugs/222/ (Some of sound not working) -[Bug-226]: http://sourceforge.net/p/robocode/bugs/226/ (java.io.FileNotFoundException in RobotFileSystemManager.init) -[Bug-227]: http://sourceforge.net/p/robocode/bugs/227/ (Can't load Katana 1.0 or DrussGT 1.3.1wilo) -[Bug-228]: http://sourceforge.net/p/robocode/bugs/228/ (Krabb.sliNk.GarmTeam 0.9v locks up in new beta) -[Bug-229]: http://sourceforge.net/p/robocode/bugs/229/ (IllegalArgumentException on painting in some robots?) -[Bug-230]: http://sourceforge.net/p/robocode/bugs/230/ (Lockup on start if too many bots in robots dir) -[Bug-231]: http://sourceforge.net/p/robocode/bugs/231/ (Lockup on start if too many bots in robots dir (cont'd)) -[Bug-232]: http://sourceforge.net/p/robocode/bugs/232/ (Graphics2D.getTransform() throws NPE) -[Bug-233]: http://sourceforge.net/p/robocode/bugs/233/ ("Teleport") -[Bug-234]: http://sourceforge.net/p/robocode/bugs/234/ (Source is not included) -[Bug-236]: http://sourceforge.net/p/robocode/bugs/236/ (Robot Editor doesn't accept packagename with dot (.) in it) -[Bug-237]: http://sourceforge.net/p/robocode/bugs/237/ (OS X 10.6: Cannot run Robocode from robocode.sh) -[Bug-238]: http://sourceforge.net/p/robocode/bugs/238/ (OS X 10.6: The editor cannot see the JD) -[Bug-240]: http://sourceforge.net/p/robocode/bugs/240/ (morbid.MorbidPriest_1.0 fails to load) -[Bug-243]: http://sourceforge.net/p/robocode/bugs/243/ (Robot console text sometimes disappears) -[Bug-244]: http://sourceforge.net/p/robocode/bugs/244/ (Robot static data isn't being GCed after battle) -[Bug-245]: http://sourceforge.net/p/robocode/bugs/245/ (Removing directories from "development options" doesn't work) -[Bug-247]: http://sourceforge.net/p/robocode/bugs/247/ (Version ordering is somewhat strange with letters) -[Bug-250]: http://sourceforge.net/p/robocode/bugs/250/ (Installer installs AutoExtract$1.class) -[Bug-252]: http://sourceforge.net/p/robocode/bugs/252/ (yk.JahRoslav 1.1 throws WinException) -[Bug-254]: http://sourceforge.net/p/robocode/bugs/254/ (Roborumble doesn't upload with EXECUTE=NOT) -[Bug-255]: http://sourceforge.net/p/robocode/bugs/255/ (java.lang.Error: Interrupted attempt to aquire read lock) -[Bug-257]: http://sourceforge.net/p/robocode/bugs/257/ (Team RoboRumble uploading is broken) -[Bug-258]: http://sourceforge.net/p/robocode/bugs/258/ (isTeammate() called on null gives NullPointerException) -[Bug-259]: http://sourceforge.net/p/robocode/bugs/259/ (jlm.javaDisturbance loses substantial score in 1.7.2 Beta) -[Bug-260]: http://sourceforge.net/p/robocode/bugs/260/ (ArrayIndexOutOfBoundsException when starting team battle) -[Bug-261]: http://sourceforge.net/p/robocode/bugs/261/ ((.NET) condition tested on concurrently modified collection) -[Bug-262]: http://sourceforge.net/p/robocode/bugs/262/ (TeamRumble: Cannot find robot in nested .jar files) -[Bug-263]: http://sourceforge.net/p/robocode/bugs/263/ (Cannot extract downloaded robot for editing in Robot Editor) -[Bug-265]: http://sourceforge.net/p/robocode/bugs/265/ (Occasionally losing the bit of text in the robot console) -[Bug-267]: http://sourceforge.net/p/robocode/bugs/267/ (Strange issue first time running roborumble in 1.7.2.0 Beta2) -[Bug-269]: http://sourceforge.net/p/robocode/bugs/269/ (Minor visual bug - Currently selected robot gets covered) -[Bug-270]: http://sourceforge.net/p/robocode/bugs/270/ (Strange thread exceptions with kid.DeltaSquad in 1.7) -[Bug-271]: http://sourceforge.net/p/robocode/bugs/271/ (Battle engine consumes more CPU power over time) -[Bug-272]: http://sourceforge.net/p/robocode/bugs/272/ (isTeammate() sometimes returns false with teammates) -[Bug-274]: http://sourceforge.net/p/robocode/bugs/274/ ("Ignoring" messages in rumble are duplicated) -[Bug-275]: http://sourceforge.net/p/robocode/bugs/275/ (Duplicate version numbers prevents uploading) -[Bug-276]: http://sourceforge.net/p/robocode/bugs/276/ (tzu.TheArtOfWar 1.2 gets NullPointerExceptions) -[Bug-277]: http://sourceforge.net/p/robocode/bugs/277/ (Problems with Graphics2D.fill/draw(Shape)) -[Bug-278]: http://sourceforge.net/p/robocode/bugs/278/ (Attempting to install robocode over an existing install NPEs) -[Bug-280]: http://sourceforge.net/p/robocode/bugs/280/ (NPE when uploading results) -[Bug-281]: http://sourceforge.net/p/robocode/bugs/281/ (The robocode.command is missing the execute permissions bit) -[Bug-282]: http://sourceforge.net/p/robocode/bugs/282/ (Cannot see robot with no package in New Battle dialog) -[Bug-283]: http://sourceforge.net/p/robocode/bugs/283/ (Possible for robot to kill other robot threads) -[Bug-284]: http://sourceforge.net/p/robocode/bugs/284/ (Robot Packager doesn't package source file in Eclipse proj) -[Bug-285]: http://sourceforge.net/p/robocode/bugs/285/ (Robot Packaging Wizard doesn't save value for Next & Back) -[Bug-286]: http://sourceforge.net/p/robocode/bugs/286/ (ClassNotFoundException at RobotClassLoader.java:271) -[Bug-287]: http://sourceforge.net/p/robocode/bugs/287/ (Zipped robots data files are not extracted) -[Bug-288]: http://sourceforge.net/p/robocode/bugs/288/ ("skipped" turns at start with -Ddebug=true) -[Bug-289]: http://sourceforge.net/p/robocode/bugs/289/ (Exclude filters not working) -[Bug-290]: http://sourceforge.net/p/robocode/bugs/290/ (Development Options remove wrong item) -[Bug-291]: http://sourceforge.net/p/robocode/bugs/291/ (JavaDoc missing _Robot and similar) -[Bug-292]: http://sourceforge.net/p/robocode/bugs/292/ (Robot PrintStream doesn't handle write in a portable fashion) -[Bug-293]: http://sourceforge.net/p/robocode/bugs/293/ (Wrong headings with the JuniorRobot) -[Bug-297]: http://sourceforge.net/p/robocode/bugs/297/ (x,y coords between BulletHitEvent & HitByBulletEvent differ) -[Bug-299]: http://sourceforge.net/p/robocode/bugs/299/ (Custom events no longer firing after clearing event queue) -[Bug-301]: http://sourceforge.net/p/robocode/bugs/301/ (getTurnRateRadians incorrect for negative velocity) -[Bug-302]: http://sourceforge.net/p/robocode/bugs/302/ (Hide enemy name implementation bug) -[Bug-303]: http://sourceforge.net/p/robocode/bugs/303/ (bullet.equals semantic has been change in 1.7.3.0 version) -[Bug-304]: http://sourceforge.net/p/robocode/bugs/304/ (setColor(null) causes NPE) -[Bug-305]: http://sourceforge.net/p/robocode/bugs/305/ (TeamRumble priority battles bug) -[Bug-306]: http://sourceforge.net/p/robocode/bugs/306/ (Rumble sh scripts for launching do not handle spaces in path) -[Bug-307]: http://sourceforge.net/p/robocode/bugs/306/ (Console output cannot handle non-ascii names) -[Bug-308]: http://sourceforge.net/p/robocode/bugs/308/ (ConcurrentModificationException in URLJarCollector) -[Bug-309]: http://sourceforge.net/p/robocode/bugs/309/ (robot in development generates * into filename) -[Bug-310]: http://sourceforge.net/p/robocode/bugs/310/ (Interface Robot skips turns at end of round) -[Bug-311]: http://sourceforge.net/p/robocode/bugs/311/ (out.write(int) uses up allocated printing quickly) -[Bug-312]: http://sourceforge.net/p/robocode/bugs/312/ (Enabling Paint Freezes Robocode) -[Bug-313]: http://sourceforge.net/p/robocode/bugs/313/ (Robocode .NET does not work on Java 7) -[Bug-315]: http://sourceforge.net/p/robocode/bugs/315/ (Unable to change drawing color in .NET (C#)) -[Bug-318]: http://sourceforge.net/p/robocode/bugs/318/ (Installer throws NumberFormatException on Linux 3.0) -[Bug-319]: http://sourceforge.net/p/robocode/bugs/319/ (Package name allows bad chars) -[Bug-320]: http://sourceforge.net/p/robocode/bugs/320/ ("About" window colors are awful) -[Bug-323]: http://sourceforge.net/p/robocode/bugs/323/ (Robocode can't find the ECJ (Eclipse Compiler for Java)) -[Bug-326]: http://sourceforge.net/p/robocode/bugs/326/ (Package of team fails to load in team battles) -[Bug-328]: http://sourceforge.net/p/robocode/bugs/328/ (Issue with the robocode.dll + # chars in the path for a dll) -[Bug-331]: http://sourceforge.net/p/robocode/bugs/331/ (RoboRumble client has infinite timeout) -[Bug-332]: http://sourceforge.net/p/robocode/bugs/332/ (Use OpenGL backend under linux) -[Bug-333]: http://sourceforge.net/p/robocode/bugs/333/ (.NET runs release dll not debug dll so can't debug) -[Bug-334]: http://sourceforge.net/p/robocode/bugs/334/ (Snapshot API never shows bullets in "HIT_WALL" status) -[Bug-335]: http://sourceforge.net/p/robocode/bugs/335/ (Skipped turns ... issues) -[Bug-336]: http://sourceforge.net/p/robocode/bugs/336/ (Skipped turns ... issues) -[Bug-337]: http://sourceforge.net/p/robocode/bugs/337/ (Hangups with New Editor in 1.7.4.0) -[Bug-338]: http://sourceforge.net/p/robocode/bugs/338/ ("Accept-Encoding: gzip" not in Roborumble HTTP Headers) -[Bug-339]: http://sourceforge.net/p/robocode/bugs/339/ (All Text Missing) -[Bug-340]: http://sourceforge.net/p/robocode/bugs/340/ (Robocode crash on window resize (linux-opengl)) -[Bug-341]: http://sourceforge.net/p/robocode/bugs/341/ (InteractiveRobots gets error "After the event was added...") -[Bug-342]: http://sourceforge.net/p/robocode/bugs/342/ (New bots not given priority) -[Bug-344]: http://sourceforge.net/p/robocode/bugs/344/ (BattleAdaptor missing in robocode.control.events) -[Bug-345]: http://sourceforge.net/p/robocode/bugs/345/ (Graphics still being rendered when minimized) -[Bug-346]: http://sourceforge.net/p/robocode/bugs/346/ (Cannot extract sources from robot packages) -[Bug-347]: http://sourceforge.net/p/robocode/bugs/347/ (/bin/sh^M bad interpreter) -[Bug-348]: http://sourceforge.net/p/robocode/bugs/348/ (.NET: UnauthorizedAccessException in AppDomainShell.Dispose()) -[Bug-349]: http://sourceforge.net/p/robocode/bugs/349/ (Instances of RobocodeEngine don't seem to be independant - memory leak and performance decrease) -[Bug-350]: http://sourceforge.net/p/robocode/bugs/350/ (Bullet id from battle record XML file is sometimes -1 causing a NumberFormatException) -[Bug-351]: http://sourceforge.net/p/robocode/bugs/351/ (Robot.onBattleEnded(BattleEndedEvent) provides wrong scores) -[Bug-352]: http://sourceforge.net/p/robocode/bugs/352/ (Results from BattleCompletedEvent.getIndexedResults() are always sorted) -[Bug-353]: http://sourceforge.net/p/robocode/bugs/353/ (RobocodeEngine.setVisible() can cause a NullPointerException) -[Bug-354]: http://sourceforge.net/p/robocode/bugs/354/ (Replaying an XML record can cause an ArrayIndexOutOfBoundsException) -[Bug-355]: http://sourceforge.net/p/robocode/bugs/355/ (Priority battles not accepted for mini/micro/nano rumbles) -[Bug-356]: http://sourceforge.net/p/robocode/bugs/356/ (Update Roborumble URLs from Darkcanuck to LiteRumble) -[Bug-357]: http://sourceforge.net/p/robocode/bugs/357/ (Tab characters are inserted in the last line of a robot source file when opening it) -[Bug-358]: http://sourceforge.net/p/robocode/bugs/358/ (Robot in default package cannot write to files. Should at least get a warning) -[Bug-361]: http://sourceforge.net/p/robocode/bugs/361/ (Problem in the text editor related with the .java file modification) -[Bug-362]: http://sourceforge.net/p/robocode/bugs/362/ (Rumble client does not remove participants in wrong codesize group) -[Bug-363]: http://sourceforge.net/p/robocode/bugs/363/ (No Last Survivor Bonus being given) -[Bug-364]: http://sourceforge.net/p/robocode/bugs/364/ (Robot Packager does not include the robot data dir in the .jar file) -[Bug-366]: http://sourceforge.net/p/robocode/bugs/366/ (Receiving enemy's real name on HitByBulletEvent) -[Bug-368]: http://sourceforge.net/p/robocode/bugs/368/ (Issues with sentries) -[Bug-369]: http://sourceforge.net/p/robocode/bugs/369/ (RoboRumble: NoClassDefFoundError for CodeSizeCalculator) -[Bug-370]: http://sourceforge.net/p/robocode/bugs/370/ (Robot Packager cannot find robot .properties file in development path) -[Bug-371]: http://sourceforge.net/p/robocode/bugs/371/ (High cpu usage on editor) -[Bug-372]: http://sourceforge.net/p/robocode/bugs/372/ (Cannot load battle file when -DNOSECURITY=true is enabled - java.lang.IllegalAccessError) -[Bug-373]: http://sourceforge.net/p/robocode/bugs/373/ (Wrong robot size calculation in version 1.9.0 - 1.9.2) -[Bug-374]: http://sourceforge.net/p/robocode/bugs/374/ (Wrong size report for minirumble in v1.9.2.2) -[Bug-375]: http://sourceforge.net/p/robocode/bugs/375/ (Wrong width and height returned for .NET robots) -[Bug-378]: http://sourceforge.net/p/robocode/bugs/378/ (robocode.robocodeGL.system.GLRenderer ClassNotFoundException) -[Bug-380]: http://sourceforge.net/p/robocode/bugs/380/ (Yet another historical bot related bug) - -[Req-1]: http://sourceforge.net/p/robocode/feature-requests/1/ (Multiple or hyperthreading CPUs (most P4s) hangs Robocode) -[Req-2]: http://sourceforge.net/p/robocode/feature-requests/2/ (Keep window size of "New battle" window) -[Req-3]: http://sourceforge.net/p/robocode/feature-requests/3/ (More precise battlefieldsize configuration) -[Req-4]: http://sourceforge.net/p/robocode/feature-requests/4/ (Prevent API from loading unused features) -[Req-5]: http://sourceforge.net/p/robocode/feature-requests/5/ (Keyboard Navigation) -[Req-6]: http://sourceforge.net/p/robocode/feature-requests/6/ (Editor Improvements) -[Req-7]: http://sourceforge.net/p/robocode/feature-requests/7/ (Graphical "debug" facilities like with RobocodeGL) -[Req-8]: http://sourceforge.net/p/robocode/feature-requests/8/ (Debug Graphics - SG Option) -[Req-10]: http://sourceforge.net/p/robocode/feature-requests/10/ (Coloring of bullets and scan arcs) -[Req-11]: http://sourceforge.net/p/robocode/feature-requests/11/ (Explosion on robots dependent on bullet energy) -[Req-12]: http://sourceforge.net/p/robocode/feature-requests/12/ (Faster framerates / Turns per second) -[Req-13]: http://sourceforge.net/p/robocode/feature-requests/13/ (Bullets are sometimes too small) -[Req-14]: http://sourceforge.net/p/robocode/feature-requests/14/ (Restart Button) -[Req-15]: http://sourceforge.net/p/robocode/feature-requests/15/ (Optional sound effects) -[Req-16]: http://sourceforge.net/p/robocode/feature-requests/16/ (Browse button in Development Options) -[Req-17]: http://sourceforge.net/p/robocode/feature-requests/17/ (New splashscreen picture) -[Req-18]: http://sourceforge.net/p/robocode/feature-requests/18/ (Better notification about new Robocode versions) -[Req-19]: http://sourceforge.net/p/robocode/feature-requests/19/ (Possible to install Robocode on Windows Vista) -[Req-20]: http://sourceforge.net/p/robocode/feature-requests/20/ (Robot templates must be updated regarding deprecated methods) -[Req-21]: http://sourceforge.net/p/robocode/feature-requests/21/ (Option for accessing external .jars) -[Req-23]: http://sourceforge.net/p/robocode/feature-requests/23/ (Preference to allow disabling of the scorecard pop-up) -[Req-24]: http://sourceforge.net/p/robocode/feature-requests/24/ (Recording of battles) -[Req-25]: http://sourceforge.net/p/robocode/feature-requests/25/ (Save battle results to file) -[Req-26]: http://sourceforge.net/p/robocode/feature-requests/26/ (Invoke default browser from Help) -[Req-30]: http://sourceforge.net/p/robocode/feature-requests/30/ (UI Control for adjusting the TPS quickly) -[Req-31]: http://sourceforge.net/p/robocode/feature-requests/31/ (Redirecting Robot output, running without GUI) -[Req-32]: http://sourceforge.net/p/robocode/feature-requests/32/ (Bullet size) -[Req-33]: http://sourceforge.net/p/robocode/feature-requests/33/ (Making robots die quicker (graphically)) -[Req-34]: http://sourceforge.net/p/robocode/feature-requests/34/ (Provide javadoc for robocode.util.Utils and robocode.control) -[Req-35]: http://sourceforge.net/p/robocode/feature-requests/35/ (Pause Button) -[Req-36]: http://sourceforge.net/p/robocode/feature-requests/36/ (Initial Placement) -[Req-37]: http://sourceforge.net/p/robocode/feature-requests/37/ (Running Score Window) -[Req-38]: http://sourceforge.net/p/robocode/feature-requests/38/ (Codesize) -[Req-39]: http://sourceforge.net/p/robocode/feature-requests/39/ (Support for RR@Hom) -[Req-44]: http://sourceforge.net/p/robocode/feature-requests/44/ (Restart tweak) -[Req-45]: http://sourceforge.net/p/robocode/feature-requests/45/ (Reset compiler cancel button) -[Req-49]: http://sourceforge.net/p/robocode/feature-requests/49/ (Speedup time required for rebuilding robot database) -[Req-50]: http://sourceforge.net/p/robocode/feature-requests/50/ (Recalculate CPU Constant) -[Req-52]: http://sourceforge.net/p/robocode/feature-requests/52/ (The 'New Battle' window sometimes is spamed with .robotcache) -[Req-53]: http://sourceforge.net/p/robocode/feature-requests/53/ (More control over the event queue) -[Req-54]: http://sourceforge.net/p/robocode/feature-requests/54/ (All input received from events) -[Req-55]: http://sourceforge.net/p/robocode/feature-requests/55/ (Exclude Filter for RoboRumble) -[Req-56]: http://sourceforge.net/p/robocode/feature-requests/56/ (Robots Cache Cleaner) -[Req-57]: http://sourceforge.net/p/robocode/feature-requests/57/ (Events processed in chronological order) -[Req-58]: http://sourceforge.net/p/robocode/feature-requests/58/ (HitRobotEvent - damage) -[Req-60]: http://sourceforge.net/p/robocode/feature-requests/60/ (Enhanced CPU constant calculation) -[Req-62]: http://sourceforge.net/p/robocode/feature-requests/62/ (Fix for massive turn skipping when cpu constant < granularity) -[Req-63]: http://sourceforge.net/p/robocode/feature-requests/63/ (Replay should store debug graphics) -[Req-64]: http://sourceforge.net/p/robocode/feature-requests/64/ (Change default battle settings like e.g. "Number of Rounds") -[Req-65]: http://sourceforge.net/p/robocode/feature-requests/65/ (Score % display) -[Req-66]: http://sourceforge.net/p/robocode/feature-requests/66/ ("onBattleIEnd(*)" Event) -[Req-70]: http://sourceforge.net/p/robocode/feature-requests/70/ (Longer package name allowed) -[Req-74]: http://sourceforge.net/p/robocode/feature-requests/74/ (Option for enabling/disabling robot timeouts) -[Req-75]: http://sourceforge.net/p/robocode/feature-requests/75/ (Add client version to POST data sent to server) -[Req-77]: http://sourceforge.net/p/robocode/feature-requests/77/ (Better "lifebar" display) -[Req-78]: http://sourceforge.net/p/robocode/feature-requests/78/ (Visual debugging without cpu penalty) -[Req-80]: http://sourceforge.net/p/robocode/feature-requests/80/ (Screenshot of battleview) -[Req-82]: http://sourceforge.net/p/robocode/feature-requests/82/ (Launch upload result in separate thread) -[Req-84]: http://sourceforge.net/p/robocode/feature-requests/84/ (Added append option in copy method (FileTransfer class)) -[Req-86]: http://sourceforge.net/p/robocode/feature-requests/86/ (Rankings should be visible when Robocode is minimized) -[Req-88]: http://sourceforge.net/p/robocode/feature-requests/88/ (Command Line option for saving a battle record file) -[Req-89]: http://sourceforge.net/p/robocode/feature-requests/89/ (Launch Robocode from .br (battle record) files) -[Req-90]: http://sourceforge.net/p/robocode/feature-requests/90/ (Prevent JuniorRobot to be unresponsive) -[Req-92]: http://sourceforge.net/p/robocode/feature-requests/92/ (Scrollable properties) -[Req-93]: http://sourceforge.net/p/robocode/feature-requests/93/ (Rename /robots/.robotcache to /robots/.data) -[Req-99]: http://sourceforge.net/p/robocode/feature-requests/99/ (Move away from Jikes towards ECJ) -[Req-101]: http://sourceforge.net/p/robocode/feature-requests/101/ (onRoundEnded()) -[Req-113]: http://sourceforge.net/p/robocode/feature-requests/113/ (Skipped turn events) -[Req-114]: http://sourceforge.net/p/robocode/feature-requests/114/ (RateControlRobot vs. TeamRobot) -[Req-115]: http://sourceforge.net/p/robocode/feature-requests/115/ (Installed package should contain readme file) -[Req-118]: http://sourceforge.net/p/robocode/feature-requests/118/ (Enable/disable development paths) -[Req-121]: http://sourceforge.net/p/robocode/feature-requests/121/ (Issues with editor font) -[Req-124]: http://sourceforge.net/p/robocode/feature-requests/124/ (Ability to save the properties file for robots in dev. path) -[Req-128]: http://sourceforge.net/p/robocode/feature-requests/128/ (In battle name hiding) -[Req-129]: http://sourceforge.net/p/robocode/feature-requests/129/ (Rules.getBulletSpeed) -[Req-134]: http://sourceforge.net/p/robocode/feature-requests/134/ (Calculate codesize after compile in editor) -[Req-135]: http://sourceforge.net/p/robocode/feature-requests/135/ (Twin Duel configuration files) -[Req-144]: http://sourceforge.net/p/robocode/feature-requests/144/ (Mac ... start with icon and name) -[Req-156]: http://sourceforge.net/p/robocode/feature-requests/156/ (Codesize added to properties file) -[Req-159]: http://sourceforge.net/p/robocode/feature-requests/159/ (Fix overkilled garbage collection on static fields) -[Req-160]: http://sourceforge.net/p/robocode/feature-requests/160/ (Fixed width font in console) diff --git a/文档/robocode机器人战斗模拟——汇报.pptx b/文档/robocode机器人战斗模拟——汇报.pptx deleted file mode 100644 index 65748b320dd9f41e515a66ca060ec25fb127707b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823344 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

(F)mxr7>wY0R_Z2BMMG}GsLfS^ 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%0AxUNDvKpcrD&VX?-&bd3M-eWYzB49p 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

QX|EVDqx*JRV!cBCeg2{kI8QOo4)GETM} zx2&>?ADD(X-+{|!)&4sb7bvj5kcgpdh(NUw;uH}XiW|9{*L}_${Rz`@cG|ho%g$d< zG^Tm1GiFEV>vAVud{JLqw|^Q;4K6KwDQ+Z%YkeIIAy$>4`OrU@rM)fdwtrk;3Srn3 z^NgWR(t>s13qTWdYkIEfP@U_(?q?pD=pnMjNX2y$$}>g3(H;eCnnLN_ZoZvh&HPEd z-^)Ad*qz4vx4fhJ9uUuX%=-={fl8hy^!WD~gyYP@07M+n|H7 zO>f-uT7{Ojv5DaAo56`*CNEz$fwk*U6RRJie#l5_nBuTbPvMQ7~5$zf{qcJcI7JU@(a;icT-uWGnKM( z6S~_}^IR6*T<4g@PEUG!Xou1PlRr-Pf4mQxYWN68Ta@j+7YxhW_1Tue%$9BJs2e6b zYBxKpI-?)VJq(g}dSFGGUJdVUg|Uu!@y+M1#sfK$(ZiFb9x1eA+emVm=eFN+a6zZ- zWkn^MS@%t(K%i@>vG*=?<>?IQ@PhTdtJMHR`J>$uS9Oqe%h}g!MCB?xxjO%mi$D6J z%v0$ve^sM{K;|Y(hsfOI6)V=59BBTT7ZWE(kZ}uHq6FLl+#cPPOoy^4mXA`>EbGgr z&j%XDn!xJo`&{3Xyg~kDkbxkLm?49#yk~~zWDvkdskGByPPrRk9!JDR6`yqF=YEZ)D+{^f#-yXhhJ?XJf7E1f!V*f((hRw~o$VYW1YR{85LCZDZ1F*WAqB&!gV; z$Gb6kifm)El+)T7`e}S3QWV3PW5VayQ04PM&urdD&fe%#w>JVg@fWNrJwHrZY!m?q zdg2nF5ZHm1^e8h4#l10wpeQt1;z$w!38VV3X2?O{6_+U2mQ<|MXQT_y(y!@gpl#ED z)CUXUUkSp_-l|FYF!W_WGGEa|;6dkxaITUtOf1pCWdnLf5BU(iYlO2zMeYBX49Il8j6KP{^4&u2H1k$N7CIp-pqNm|W(tGQYlY}*x$oMv7?XY*B5*o`#);-2}- zf69Zq>&G^3La~wW%*y|~ba)kku_->3TkfNsM$ii^G}2=Kic55{yua(s&D1`_1Hx0c z?}C02_r}JKPZS2NZZ!YQu(mN0pnVr6GAf2Q7-XEY@90rKG*3ja6)wRe*3TDFwn$fz z7jUC}4XwlaN+?y=6`)&Vw`P48EK@~8Y9Ay|BdD3(zDe|r;U$gcW^IZuB}+F#|3>q! ztPQTlOiF%NjP~rpt2U}{K5Lw(&5?P|PR^yMlek+MS zD&wOB{1kl-Ca4N*?UDsCeCF)imEN^kWGERApq+C&wQLtMq;u%6HSMD7`{jHXQCW8n zN8&^gFWUr;zh3@*_%CdCVE+LHvJ=Rh<-cC;q0h?fOk|PzOFjSX!7XoZ!g+%3YCJ+zB4y(73*TP|YkWCSj+>2oi?57bbj$I3C=*0v zUX0-Gr!qa5P)EzxIURu3LelG2XqOnO^O%H zIz1$V6-7q8(qd@cJ%wLDFK(G2NF@x1t5O#DzD-xs!t&!W!sqU!*Mg;tqXoKF2)EFQ zE(dDA>O(_X8;s$Oe>|O$glNhGaQ)3+!$W(ILmgqhY>-(FBwWKli*->_)9jTtV}b+w zqq3N^R~DEjgZygYJ7ms-WG(N=xd93kB({d=C7eu#R|5s4ZUVi?dbAkH5dXv;Xx3jS zJyukt$7@{e9^GrDq*okdr!9IaZxU*wTOLa5mlNXU3$aqj?tZ>Sf^=zK|ss^7qL)I)NZYO{VEY#rzK1M3D}a3&$=?~!<(gPQeTOtI*}AImwwr7Ika$+#e|3G;-? zyYaFQP^majl-TPc^#qC_hRodBBPSF30?x^QwhwHJ7r}4yT57(F1&3q<)s;(9rrIQ$ zx>~)>qkqqv3z-I_`zB9BP|QjO0IOe3uQj}TM7&*+CNKG4o-|qt6C9I)c=*b3e7Dw# zCCdtcAeCdfVn~91{r+Fk5FYcKSf$+*22JrDY z#2dDg3(kX-+b=aqjgLbpi%NA)lE$<}-*Wl9@@qt#V6Jz2Elw^^i?I9*d#>2yG~ReP z&D~F0jT?K|GAUKVJf<$C92>+8D@oI$thWaT$xG^X#Ye-wJa^Ma8Vk=f$NNFW-U=jX zRi6cLR6VXUFM1EA*|s6W)@jEp|9WDpZ2X2SJ*M8g(h?RvIpe9N3q-aX2R}VRm4c% ztyY+G=8uf3P#ffK+{&LS0etUd@~l6_uwI6b0g^OQ2STE)N!oUDe^G?U8qWp6JVmv-`$&j!NOp_))VIy=0Io@~32X3#VehkE0#n+89ss&=(wYA+PA` z=HbFSs_rA>lwLLaclPx*!`_r-SYKekG(zS7d09C2l%K4KaFHq70%-b%&@Ps;u5J@cU zowI#F4bknh_*XT%9YSrbIw5lM{)4v(r&g@`HRdXw%n*1EQ2S0RU|4z0xMPNhN|iaS zgF4q|-4b!2%%l1)fOvMh>#$2e(YrA^UsAtx<-H7Wv1OwI@#Atgmw-oVE#G3r5;>h{ zZDgHCdB-D7*&c9_)pIE%0%)*pzEl-6wi&B5VP~_GW%!(=7QI_>x$<=uq=?kM8_9`j z8U)|Hx}C&L1CI)BPX`x+oJAiU>@faC7e4eDz%Pc82lz7FP36>M{;%x~-5W+ot|~b( z(ly-DmJX?U=TOBo{1|cDo_3j0w)7L*zmY>2iPu9!1ro9@Kdt^(&uC5o>nWLoM-nha2 zk@mY@Y|%7?DyS(ZIp9i65@K~nH0I@^2rFE`sP<;yCQ{Pux^6xc!4O1AxA(WO9AP|o zc#vl(WW5A6yzXQI>`Tiij;4ylNWW)RN1U`S zp>0YF^>_spm3jXypw(udkk*1};0)!@TUJ`$Y=PnQ!BPq_?ip5FYImsbrM2p)0J~YG z$6~lInCEUjB6&6DwD1V$3@^J9)a`IF( z|NUWz^yL*?n@pnQtR1UyD zOTMZBrBNA;g7pTpj!(1Q#kRl6W@O=YqcqzMc#S7CqKewRZd^Y%fOAycf6+0mS{iQ31x#rk{$-DfD^v&(r!6=nDjDh)ia* zfmun~%AEWa<6mpvmdJuwI$!Z?${5FHBYn;LzclU_dONt^47=PftH@m5H#z-;O^eaU zBNR4*j41-N(B{+-_)v4oS{k7gRXN2@fOI*W+v3(R@#Ip)MfwS8@SN`oE6bO4K}@qi z5>EYJCQn^;N@01BA}!Ik*Nv;>Sn+e-j~$tA2P*gs>UX|6vAZ9S<9j&@Tqm&?;_z0~ z-)4A>Z&UIX@|Nw)97C)$l$TjGtVolm|9@GM`NV(O6_j}nZo(6bK=;Ubpgf1#)0e6-?#?;*#-zX``Enn zILOn6_WUR!yor6jMu_vlR?(o_jRmq_l*Zy{oE1CHXd0V77h1y-7t0qrDh~Vn54jOS zjuM$yE%Y704{L%E%_o;z#+kW36mzS1 z$pVqcmLa5IoS^9+OEHh;wUwhKx3!-f*JydK(07mb^<>0KWgO!t)j^?}08!Y#X6Fz= zG4C)wq89Xi!EbQ1F{(Ng#lqL2B@)dRGl)o9a1ec_uZ&{JLqYa&QEjl)FR6Uj#>uj` z4?*f$g(oWw?9%zNP;O!#HdkVfiZSB85)V8~ruP~GBX)q@psSBVYwDpyz-92jo|@+? z3qa+VvrEibL0CQP@Oj2INM?y{R8}ELZ<`TcxtwI$3~TTNAuCM9!`X#&N_Yvf$XLNr zZ$qm1*&I>vdZCk-_L2@eKVfi&ebh@Jva@V9njM;{u)-^8Ml-ch zZ{BlHW;gG_fCK4+-vQ6EkR8(!V{QbX&r50)D$PWK1z0ZT4Hu0;FR3Wg`z zOq%1nw=4{h@kon~ff-A+p&0gqX8gDz#BI}uXm=Ni6S@{NcsdM)c$TB<=(+#92WfgR zN%15hCbDVjsF7;azrgH&>;CdzFgFO<5AgAV()t~FLhaTE&*gAN4W{4LR!nIko;zsN zPd^<@PtH^KFi|Fm%Z{d&UV2oCSfv}!K*Ol1-G$lO-|t);q8(Qfol^lpa`NH*`YE~y?dwFOTF7!hJ z7L17OA+$y>#LL_s`#rs{^qM8b%D?f;qH&U~DOjrFzYVGGnw*!>*01osJCF&#gQm{eW}g= znR+K;_Q}%TQ!q?gn@#^IL{VgVD}WqffV4y3R9;%#+zc(^92QUTn~ZpapKOQ!S&P66ql62=*Xnxp1-?Na=(|FGBp#m#}U{a z^*A#n%X2pswhU-EKI4TcnSWc6-x?LBpYpky>((-ag)g+*hoP}*a? z%_wP(W0q!el$EE@DP4E5JaEjV2@dGvtw6j

vG$*+?eVq1=|e+89ehcmus71&7}} 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

b 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�Wpicz3d)J-%)GD(;xKEUZ2lKR-MOUriErC^288- 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

krJ)|KgjBo%ElRwtH}Fh!vcm%jvMj zA|~J|zpBS~!d#%R{%NW|p(Y<+DnE!Kfx<+BDcB;mO_-IrtyiyyWiebvmU`YjaKTCU z>1E+F2zBVtjivhs0{$miduLCKF4EJdwOGu6e_mOoFzk2#zL-jj`%M3><*lP~3Rl=h zB(E%P-3-A*{nb*o-zqL{33zln7g?U%|8C7j%ULzUGP^5K^!BPqab440&~eCTNXB!- zVYnfhT=!Ki>JdIFJ?^jtS&`ke(8ylWwoPbu6{lAxF_*IWjJb1EGAZ_r%HmNq9qE}Fp6DUT3u;4#(OJ}dwWLi zyIXUofymR4>W(lGBPV`jE#VrTSY=e4>~&9O=kUEiq1n33mOp`bx7iFIj<45^g+-4K z->_(iv|&0Uw>7b&$7G>d&0^DsGAA;6^cUm3SVPx~F02iB#N8#i)X#AqEXZ5EMs@Tk znR4Pd;C=1lrG1&Vtn_SErY7DtRpYt9`=dV+oSVQw+TPw{vv$nuf? zXT%T0=}Cp?9K0Pw3FR3MNo)gOGcSTTyN1aHqUeb8sbTv%7r)A^noS37I>jjdT``y} z;Iz+neHkLHWga&X>0@c2O9cAwJV2Ln_c#-;MHG0>t!0`&2uM*RS)7bienRX9uc{ru=P7B!GGB1XX zcpHa0%Cz>$CYovWjIu>}VYn3&$+%>)s2B#_WNr_A&nI#DD4FX`xASC{Y+HYb-^t$d z7MY(8R_2PM>DpVz@vUkx*WGv60IVKilbI=FU{c#{$~6?o4R}ZD`bkp+ zuQRMTk^%L88)TLOSJ^C3!23U*-omfx_j?~-kkTO`F%Su*yV*bl10)rYW~8)8!x(}R zl7iGwN=gupIuDkBMV2k<@Pw5VeNq zuu{l5K5%x@W~ibr{E#c|FIA_ozc>tkvYK|{{4I1%xNdFP&BS^71o)MZbw$SHMS$j9 z>T{D+T1R=RBQY(cb$Ni5ibFeF`M(reJ8}ujGyJsmHJZp0YoaUGl@K5W14tw3?b_VF z2dtQ%mL+>&u4MBM802lX4hf9HJEKGZodH*nNyTNOoQj3mtr|iQMDh7(#gzDG_UKdp zKx=&&dkZE%vjw6wQyqGn0#~JOxi1h}_19@#5#IA{6hX?mTbpCAee-p&)0}~mT*UR> zW0P#d#fY6%3)%M`ek>uHxWX=@A1w|-j!Xo}qhsh31=9*ex&J}mRj^VwkZiUBzyu5h z@F-Hc@w0lab=>^Y{KpC0)53+1R}XpNzBq0}%s=)>c6p&e{MBW|qg%PTbg^2o;(dV& zqJjnyZD$&uTS0Wy)plRBCFk(}_7O zPwn^gLFm|y!^67r`e)o}w0|{WgskodJ1<-6;Zg-LL%FTMv8fM>5_}S{Ptmp1j1N^$ z=2JBnmEL}Bvi`AFj7c+9EiwJ{jzEwtsp4+B;P}Eo(K$bf#uso(!REFZ*XD-4Ru;Q^ z0|P=e)*~xaBC0Azd7`}ea?xjoY*M8*2%lfGx|WDCxRUL(Ztxb_6R=OFtzRZS&}y_G zcHu{2p2wqvFB^ok{u`I`1%KuhSw13;aLH&$_K;!w{Pe56$xN)n!?U1MuJ0N$jtP{f z!R<5=E`3w-1*&loGnk7f$Hol`1L*V4+)Gqr4WMNF#(WD*1*A$5?v^d<=*obB_-H@x zj4}YIJ^)^JOFC_?hy^w)kKh~AQv_e8Qs+?iOmv=Iq$S~7o0G|ZpI)J2PZzpNkpzP6 z$-B|7?ThEvGW-vtxNE7M$J`-hFo|NDf}}5@NuNIZChy+#kH&tCeCUQ5ghN=-bIs)q zCym~fZ!VUzoHZZL_Lqih62q_AMiEM_l7||?k4se3xmF^wE;i9ivIX_B*A<=ojkX^? zs>swZFy72EZU`7aL$B4%er--0aumY}X{R@Mo~XvQ;cDMOR5u2!#ZG^=^d9?$!XM!= zt;3(?NR^u|Zp8nwqL`oCRIW&?ZhZNoUt-D94Ut*}ioqAZr3yTBvmWx6_9Q;iILF3! zv@$JAivxcQMZa=WyQ?lnaB4$gr1Ce7twzflEe6t^+GO%|A9|E0zbD`ED06wZK&6XX z;rIP|iz$I$=m%uT6L`#g{bJ+}1972y!4 zdlD9(2Q#E8n4p`?x+L|TVV41~Bdl%XUY8}J5kZI7-~$+vBcY5)Xjo6JI-+0 zHMnq(#Qm0tzQEel9bon9F1jzi0(YWfE}B;Mk0EnBcdF-!g}<}o>g|1Q0UA8+zA)os zWh^o1mYhSn+KC}Qz8ob_{6C%)W9dW^TeyL!!l>H&|I~}^$7l@bVl6VxMN*}%?+bE* zxD;>dfk*C$*JU*d&uF|2bjzLbs<}l^JGl3HP2hnjCX}?AC8f2vl1?nPKaV-y&XH2A z=&Tl6Ta9nEmakK+9zHQ#^7%Qb?%dcZEmY>MrR*i=H6XP@0lz1dwnxb_yad3L;X4x- z>Yjg>=s(VE2W#BqhXJ6`x2&JQ3JZAP_3x9^99k!&>jm5suvBa;w-YDfX z)FkSLO0Wx=E|bBL%AeV0#&-v_G6dg>o!&g&wZT+vO@tE!W z$FJ*w;V?`3ef};>@xA$X7p>Iq*q|%S@Z;|WXRoxJwa4U6lw$1TAkU^RZYo~uiGIq( z*)TyAuyLU4Wx};u5+rfQc_Wq)&TCVr;agx3OiPjG`F!JX^`seD2!OZCk!FLe!;yW^ z+2aNWL5w`GnoOf1&x{(-Apz(@ocj1}u0*bUYrt%TC~Z*;KkMlgy_l_vR8D;dH@2vD zYn}Rso{Ro**37BGQ!R0ts*{u2;O|)uDmQzJo^S|^yco6{NS0c3zJ{0Utj8ty6W}ec zCiOnr{3F`4@+`w|Y7S&Ebg@Xz+P4Iy^q*1=^anF~f6v!JgbIqO`QI!xVJXWk?^D|a zV!;WZbcN??oJQ3ZpG=<8l_f0)h2D5Qn~aZh(B|ppm8aa#(H9B)et_$pR#8$h2gB+8 zI>W{^+nlv@HRVJ#y>9-1at65=1&5U*$J};zCo)5pPCUnfSQ%4fbCmcDACg!wkn4xs zdm;AT<-#?SP)z%*4tMsOLqk9Vyv>akeZU>*l_7f_sq7MdpO_T12I`jf-_Q0-3Mo%k z6$o8O)8i0I?;K}`KJaMao!s^aT^x_V#s|eMWmtb~=b9i|65MZ>_tGXgoFj0y1A9v& zI?%PVwWcFP-YL+Y2M}QeAg+s2T%q{I0N5!yT>FIr&gZjJUG-UP?^*-gXA_C5OkCpG z7ig=wqG)mar!GR_4fRP8AL*be&~pe|?iXRd92v;Fh5?_o9J=oH2b;{V<)LqTs2vKX zP&Ag?0$h=wZnM}8Ngi>pqca&>ze}4R65WOR^vzq-K4vo}vwTmXi$YP!^2@l+*Bq2! zlc&d`eQ3j(DxZ1shf~C^)-7E=Ff;7WMiCt%7V3M9{@$jA^P2Y zONqz1Sjfu7+53weYNxPu71_s^86tKoS#sI;VPY?E|lF42ISwVA-j;&Mir!+*p?1~OE_gC$R_boO80-Vjc^ zPZ0^XPPOp#ei(h9<<>9N!oyg>*?_MU^Cu5>*Z5Ry1j5e#gwi`PcDcw1R4Z`c*!noV$AqVtTeIW!l6r$?glC-=aV276Q_fZ9w>bFd zqbZRF@f`y1D)!%=rv!hXn_aoqUgW~v$FqYL)3rX@E3US{Hgy5tojR&W=j;o*beg{( z(sw0Y!x((4wer%~H;Hpv|EzWTd*$93C z@`)7i!2_tmXh1-lC}v7sK(rp!SL#@BQPbcxV8IcP5OoMcZ0!umGFv!IcL_=G%~!o^ z+hK`3U+!Ny&YY^`#u$YiABcx{dLc=FXUH`f7>DU(jq_-AcvAKxkLZ7kNy|}@ z53(RZ`u~Y75q;5&UD%a}AK9QO1{?2)XR@1F794R)b#`8`VGmZrwQxX!bdde~_NA;? zM~~-WqMWI13^UcW8D}_iv%W3AKmG|hDTAG~m%RC+nJ8W0&!S-CqH;y{Zbw~(T2(dS zRh?-QB<UOvsa-zLBY9nGsO+>k@Kn2P^zL zvWgVslaQ$h0Do|Ny6_crI6wNbxQ)YJ&qtw#Rib6ZIqRR3IJWbH+{e!lJS0 zL=%|TO;0m!&b|lJ@9vP_O%ee-Z*NAqbl8fVSg+49DRwA-N{GrGs@SoP28xe*wl0B?RlzKC+2I-*98Ev-!IoK zE{AXF;*N?_=i-*U)Nc5y%iv|v69I~d{!c1@*|X(jO4Kr5qCcl-7W1AQ9b#>__9B#y ztoxKO^OVTv08$)ZFQ4{j*Y1#UWZK3{O{-x(024*>3wqY6ekVJ%r`fc%H|7(tD;>R^ zH;foHwzl%cqixT>*1{CGc;%*p33cu-wpGVac}t4s*cEX}avY|!ou9GmR(DI8MxB*d zEk8^wn^8uA{&&X0XR*8N8sW4jiY_@3v>EE>Rn#}Jl+$sxLN~Cw8-B5Uxxj)BqM%0T zPrZ^mXcPAE@LlX1@x4E93B{7mS{~f$b&qqdDauvIIIho*f77R>5fb4_?WA5s8*rul z?*`$%2x7_TCxrWt1TE~v!UxLb^8A0CvgS-GV)MqLWs(x4vkkqB`;>C1e>6%JD69l@ zIc%acRj72;+L1MlzOGup#?@p)a4+Cs74XCuiE<)P<0 zA6&E_Vdh>(#9=O;+CJSq|1pcO#hd|Bm;g<-t-xrqAdu>>f|uyb7rMZg3(}?lhx>f= zupC+t&n<87N(-S_R2|^A*d4N-P31V$d2V0VIYXE0`S!)O>N*Vo@q1VpH2z3)eP(3_ zRWbIudJwdbx}{LvIZ;6tTlbD~C(XL0YgI8>I`%DXtT||~`Y^sfzZ{hBiiUswLrBhI z#5T$FZA&v>z_Vk;6M=?93npXHZnjyJ?p$DJi;Cu-7+Du?1E_L_FWEzBxywIsJ&_%4 z?{K|hV0YYzg_+_5ikzDrD*aEZz1Sx%-C?G~L~HT3|uFgR;$#c8mA94XcKaiofxTr5)c*C=GdVJgbOZfNj+`z7V% z;Qj#oO!gxF)1*kOiX4S0Wnb(4X1e0=@~~H<7FSbd%_zovKOU6|ZNopEd69r~7Hnw= zZ{t)dC8{&eMxhS8$}SGMfM=2>-ir0McrHc*wp9F$*+d&tc610u_?3jx03{dcNTia3 zmzg7ln&?%$$NtM;oh5Hl-x*!y<+X8}MADYd;cMn)=VyUAHSbm_75xWi#QS?OVJA4*M_0B;jY z;`+34jP3HK=RUVZiB3W51Y?rP<}9lv6q+EFGsfC{q@NuEKiM677 zTt0_6nt$0+_3cE(69y7OvP0Tj{|WS$O4@vlv{z1K_KmvOR5Ax7CmE3}pFl&>_#oq} z?(DAPU&*QEiS_|Kj2VTguyS@&_o$(MmB>3Pau$yFPChu}fWzW7Qrv#EmZN6_mWFjG zepC;^@BQ&y=h}Q#uH&d%cfz4Ge*&p7hMWq6Tj$XF&7^DN^5l>`!Xs zg3d_Eav5zaV1>O#DIfSs=UYLB6XTr|^WFl^o1V>Od`2$>uwU&$Ti#mfklcI#H|2$* zluD`{5TYNC?B5hFdd+RG{~w}|p`=36@R3ykjpV#r4f_4N@v>}nk2Nrc}s_jszs4|6FrCCo4DWfSymU$$xcDOLw4MZ z$?G`tpOk+=mG9*(+)wGEjbogi8!uhgnJS~s4*XXxI;m@>#VN2ys6N98VFXw&c?qj? zOV&Z>c_k-kodyX(tK^>edck_?qe()tUStzzx(Twd2av&9SG_^dN1I`X#~V-j6cAm! zsR5QIkK!(ck)zOa;cO{~jax@u6;>r`2nAm~TQ3>m^2OwP@vUu}7zeGkwIAiu+6jVd z5a_)qYHP%1E43#i@Oqu=)T?U=%1Hhgkx25k25Pbl-(L+Oa?DKXt5STwr)mX9GuzCT=qol^GqDq1^1q|{ z%>ziBcE7(I@>%gR_NEMSm$Cmc7XCOQVn)X+LJncqN;A3O`}ZejP3AKGQLgTJuWs-- zp_g)mOEv*KUB3XKL41{>nj*C0OTb7fXs<3X2Cw3dlQ9dZHIm3BMD*d zlPZ-12?A}W_*K6MH>|p%1MusF@@mhrLC&QEPJtk%9W_bz-ccj$ULK5e@M9(0E^K}I z>N-m{^DMS1xBZ*K&I72-pH}2L^WDII)b!#8i;Va=?NLZ^HM8e8h45}xe#PtQy^OwA zHac##h>|0PSJ%vj%f)Rtqm+IQfLM0ZJ!X|vg=ViMc5#J@pWB}=Z69C!&i>lED)wl* zSMIInpF>?7`fk9OBd2ZGxS<8&G2Q>&{;Ym0I+HJ@$%15&KuwO`Pzrsqj(*zfi*sWy zn=Pwo`L93VbeeZO+5N&e;DaV*)R=lIB^j%G z$TfYZ^N(^SkMQ`-fiT-sA4KiClj^ACvX%y$Rm3P=EpkUAHj^;HFv{+CKirBEZ^5^< zrT2=r+hr@fJfI%xM|xW1t-+Ms#fPhB{%Xsu_!{di;y824i7Vw6+AmVi%z^k>m-mH^ zhpxQJQr?Cx1kTuqe^-z{_quRc%seGYu46VYOMwP}!Zl$G#2M`@LUw+i2yg`bL7GM_ z0Pc3wChF0{2IYOtyf#>@w%sIb&h%jCajS0@>o#{2J3#*Ts>Q6I18lDXAPueD2pWKZ ztfK{g#+?wMXfY~`P&?u@Hc~`U0jSNC&6IJ+7{5t5>!mm`DE0sG%n!U!DHTCP+|h&t zLEvPHvqtRTsCH&3Cfl<$2AVU~liN3;WAQdLlCP?2`VS<_MCb zQD-%`t?fah%cB{ct=@K_`n0o*upvJQ)rSEOrB_f19UpKM{{)3cEZ4feq9y;rI2c($ zxd3TeAsN}HBQ7liLt}Xh=B|=EBh~w$&r&F3v9__@@Y6`Ce7*c-4Dil->QCzLUlunz zzR`GW$zddOKg+PIYCp$G7fK=(F6_V5OS27K)?wwa;)oV_yBW3Rc<0!Vq5V-{+2WSk z?)mY8t@XbBwb)GGJx;17TE85Fu0=(MxMrRH7BVEbC$h&4^aGSpt-o09+A!@hx68Oro4Mv3VL<$}Qp31G8x7e_7y8kQ|OK^y0x?UA`Thbo#MLHMuak z?@uAacfB$Q&VOeHpVV@AeB*T6Uq1;|vvNVNm{`lDySn!u{`b-Xr-KFn1-oX!digHu z!D{_u3MlY~9bketgMIefbp4;lGT-l6WNZq(jFT6*uQQqP2js(*!M|Lht@ggS4dZ=3 zy8HtJLSMwfP;r36SmrkLEWJ1$NxU->k3j6?%!2#2#i)8xGks$>eoEU21{IR!(U9+? zoRliy$$i@nCw`d?*h+a?Tn(*^maGY2l!Wi#NF;j+>jZh2+7;|_O@RaVjrFcC&F*pv z+XC^$u}%SR4waWSq;HX^3e4<%<&GJ3w<2#Kus+%V z(8oKmli*%senl9-9>y1A-Hp*?y+hGc%g_#bdAR5_WlX|sZz)L0p7;$|wNi`!FQjR5 zKSz)4w3fuh=c9SeF9qlOJ`_?wp02jdwVM(7Dgd$si=RfdZPPg|e=-BNCaEf49`Bpc zmSx@x?9qQUk%@Vx*1a3lq&MCrT4Fg<&a6k-rCX3xfQyD`x( zx^$Bu@JII!CpP*B|Mr^`$D~r5}qvTc<7F4D9S=36wrDhLrKLFKA(X+a5#m zZYW8KSp~9Kj_CWqv`Gf4Yh}~Sl^`2hEhJOp1B#o#OdP9W(fQp)NQ0zENyH?RA&NXU zOy}#B*I;T^tQPp!B#Og zm;lESuZw2%xy-T6ak3;vIgReGIT>I2J%$iWT`s(r>VYFX>mv3dJnsThNd0N5i{;M6 zLRf2<7aC=_bn(|hWorNZ-dmR?nJVWS@>>ZJNnF7mxzO}dE8E^@^MSf;mwaE0%J5df z3=&UFbKcy4z4EukZ0ux){jiy>5xwAc#N9lz@jbN5>puEQLQ7J-8HUP7_-+@jN;0!! z(b*@A^Ap#Mddy&%!(*BneHq#N9X}zM;ct|RMPAS7`b;bxUEO-UpZu8`NM({@xs}Du zP)MIH-j}n+_jgxDFyWyYb$;37?d$0$)&GuvS7(A#iDRL9QBU*CfzO>YWs2laWWK!W z_6*AgBQTzxJ&qtAkgL}%6IhUCLJ~^@-}!| z;6Y!l8rTr1^kA1;D|s{MAG&8^(aJO45Fk|OW0ykw9uaJZ2;b>-3fZ9+%z7sCpJO~Z z7!yFtoU)i-$8;X^33fLeMNAEJJ<>)K466^&bQlL)o^=0sz6ZhJNz%17RGYC) ziJZgtM>&e76@g6g=PU+;@LXpt#k{n$0d7A;>T&>hSlRez9(-r|KFj@*S=nIfApqSnbz)Pk-Q=wiZzemtW!31H7{l7DrV<*}87rEk5LK$-o%nX&FDkO^QHrT7f zL0fgeC(l;)$rY3PI&aUMb<+6Htf~*&zd9Np4gE5{V2V7Ny&MiTIqA3Ev@<@-5yw!Z zsyFEJ8EykHj%2YIM=d(m+vMCygCpruDi(t6*MFoU{VFRHW~GZU4bKGbpP9AoMKw#V zOYy+OSe^f$k8M zlMsX^!}mwuvB@pEKRZvBZ(+(i+Y|Ce5F3tnW>VI&j!6dF?oK-CCshhDeoL5e04?k< zNXZV^eq38lFGiysNte$82+!eTC2VLPl8ap9tMjNH{FaYof;qDGkf%_0N8Y7;_?8`Z ztx^cs;!(tX0RC+$c?LWIV(B*~^X#)4JLoU2LQ+1WQjXDfGq~-X6i!@Iiy5g}!g8+L zZ$A`Q!^PGZY?W2wsBLQCMk_^L+%s6SGZBl4w zL8ESFd{tq!*Pu(GeIb>p_{m20-RhI^=J&ER-#MJqiyJ`7akz3Ws^zH&y)sUtgZ@#U zEW-xQ&x4|QGvhJ~$eojC^RxwjJvD2ly4NbffZopjnO4chIev|JM@e^wn7}cLh{m|&N>#p?TWvMba!6-%ix<1AIt6dLHr@~;5L(m>_2dZ z=Qt@aTNyollC|Rmy(m4TE`IjZPwD7vp0XPmgZ+|2vH+!-ds`|a&mPNW#Q-HP-fC2#|Coh$4`ohWnI+#w=sUkT%s!s1=*>zH)G^#v zrZayp|+&4s<%H&XfTz~9x zT6!A1wNbnx5ZCoGR(#;p^U@v;_%^-nO>cx~y1W6Jg4~uI4x7=UZ;g(X0&3ZO&J8wM z;&*#nAbt#tdliQw$kNJ4WXiHTm6FHrZ?M}t{9idD@nmTfpKdXTp~w2y>h#s_)-vs2eF*r*=YHA)#R;qb3K zT(*>nir*Hji{l6t4__~xRB7mr@^8Ysk|WU&zTtqm(q~Mex*uN$JZK<*+dLI^p6&hV z7ffC{!JXA#+Rrixe(Tfl9Ir^nI3^5w-(qti$QhH@8&Y0y>z7-cogkDN^38z@61DFVH}2vg$8tNVSQ5}(kLt8TLq-!8bWR&>LK*(d0{r1zHCkf;weK*iK}K$C&f${o@@>Pt~TkwyRFlZQp_un02qROfj9FVoygUZX4Hlxb(Tw!e>E&C@HwHa=<&{SnLO4!&0r?JEF9HFDcaa8EN~J zWFTwrH9dagSn20gCpI@NzjtYmR2xmxM}*|CDDH@151ChY0@74g>zuSUt?ZIWxy$WE zHW`FnuqKDmn*G)=#Qs0AK%V7(Bct8Zx`Ndb4YkF-x_2`-az>*ac%{o<`12&M{$USJ z$ctKewb&NKpp@FOzg|EJdH8FVwu076q)OgjAg8tfB+)&#E|U0{23$SJRs#im`#n)t z(0v^=yb`r@?<1R4n3Eedq{V&JJzojVTTe5}0%%YQTlY>_#==ZKMdhu1Y92|CF zViPjX7^R)gXCB(NL|(#CqzBJj)0-bAH3|YULn@QV3SobLR#Z?F0&byK z6p;DXx!%-&mNv&;`V2lKEY;dy1KX6MlkeTcmC_~WHHOo2_jGK-J{^5Zgktq&if(T_ zEoF)5%fto>JnQeyBuD1Tpqq@K_{#*2J@PAUjRDsnV87*}sZ4P(HLhQ*m z?M3tfDx*b@BK?`OAp`ME9ot7T4Hycl!)KR-atk_S#{Hdo?p2I>{>LLqo!zuVEw#Er4e{EGz{(`TI4eOa4 z5Dn8s`MHC`>X1tCCI_i@ry1wP%)LHyS;(cexdn!5DgA`>U8`w(S%Sj#X&`gL5uHI4 zT)yf&@i@z@$0+_JL6g4F+4UDe+;il<4mp>98?yxT_k9S5oyBBTWNb<%{`Eo|oRO%a zsLxCzBGMN&iPng!zF_rpt2-^Dmg*N3=vRgFK3kc73}HYHYrv6vIPxo!T!yP#7&Fy| zn1USgKA?{r2N;B60=CqsV|QOScawd^Vn;hG{xOIEdf zXoyX?T7?QSH;v-5$)4+UyM94)+@2;Y`GhVB^o=DNRDn!J0Vu!TNx1Z^Ey?ruRUL<@;~^Y4h^R`aoj$*7dSww|<7^ay>(lvxP$rUC7_$DoIHD?zq#fmjal z^;nA5CiSU}UPxUO5vKG-)~+dgdz-c-G~^}mJX%5)4jt&5ZC*zBCY{JG(OIV8THBz< zu7K`*W$X#OGMizvG}~z8`I|V5PI|~RJ9P51_kXz{Q}ABUe$}4Cs7qt(+1~H>uN&2l z;2D3P1WZCcVUb&b&CBW|&m#G|6N>G-b5Pof`4vM*Ue%+I%82uZj@=ETVX|MqDf$I%kC(oqq~(VsYRT$&wcLB)%P)Gfu&I4M1$ zjTO_S&sf&=PF;Qs5{e70AU&7&--uzd<|jbdS-m9C>ZaX1+_`GL8Hf|H%dJhfKX%!8 ztx_HZ$LYQ{p41&EWx)2CfRyuYF1=`8D}6Ydh&Bz1;OQHgF6mGH^0^DlX>d-jlPH3# zYa`UsC?Mg0$SlPs5-T;c3@E$XF^4E+pXuIc z(2H&hh>T0r4s##a=QRH8&G0~t^%&^4+mhNEw{3j5QPl>zk`T(d25^XU=vMfZQ6oNA zaLM_CafpOkMcm$VDtk(@bX?^xB zQ#=IHRx>7Z!IpM{69p3|UZVW{WeeLlq0)Qr_j0;!E_RI(BfjDz@YBW{ub(+VoD&yD z3@PEq67Nod?A8GG>0(+7!xtzVa?jVTQkt z`4uUO=12_Q)`mUSMxLmUFJw}5NM{3dpUXhFu}{`>X3$61sc+)mp3RQyTY$89(m|D4 zs*r!9S?*fMP;XT%Iy#*YI?tb+7w&xj8^`m+*km_F1SfMp2Ci|P#g$Nz(4RMu&l?e6 z4T-3!PRu)0A!Gu!{&(?v2(eB?Bo|aoZ^y&i9NH=@5n<|eBjUw13a6T7DLtIo2|QE+Q3^dR2%N(&HRY7 znsh!SEMRdFt~NA2ofv1_@=%Ah%vc@v_I4InJTUx*>~O7BMhnofo0St1UGTh!`j4`? z@vA9j=QbfZYs+Gcy_WL8Z*jg9gyXMVo*tgN){A*n4tb(Uo41bU0JY+_lT4@1k4hPe zr!zl1TR{9FmP9pY7V*Yd+U8_wwz~>9EJHbz66(}aA^b?6q$8*3zF@YIN$DalZSN+X^iDAqM4xg( zbE+AMuH%3RPue8q_;lX$^)RE+xKQ29bg+Fh?0+idzR|*c(Ei}k4L}Y!mjM!^(C8bQ zv8;Swj8$u4Fd-l6=Qiv}+cvuBHfnOUGvLlT#UjNAV-yoe+tiHuErt9Gb{PT3mxJ`F z$3WgW+X?b?WC=Lw_S-1ECm^;pmmvtJTI$DiCV0Mdu7Rno%7;Ur$nTzS z^sQ$c$jP1@laE9@DB()9A4}ZKAO12Nu}O)I6au?xKAJycG6(%pN3AkasMYWQaIF(X zF1FJ$Hnk-{M=!1LAukm9W@IbS+zm$KubJLv`81SL3#Y@sKNUGCPZ45NuUvQyX<(Et z`D07+^sCveqTK}zZ7W{zi` zZuTEDGmdj#Yp>w`nnct)8}%KWZP-J$;3;EI-yvjp*+RK!a-87jVww(7 zuJY)rHq}|aY<_c|s)lS)dgy_D?4~oi)zzMk03wH(FMD;2$nTldA;Go6u{ar1aK;Gm2DB%^JM&y0{^uh0XIaykTz+7G{BkLediWsUiYvY+I)q{`De~>T?S(!E zyOz`m{|=Dlaltl>`D>qk94)q<&eeg-f|7S2=~xYM{>Ts8gIXcBOl7F|x2qt@qn)I{ zeJMYju_u$-T*dGWiO?{>vay>$hHgv+5VXEu-% z93S7in+VhHpeFTj3DZXW9)SC_rSDwIRP3r)=DoBp1!~SQ33=J_Z;L8j@=3D_QGsvk z_Vn;ta&WL!*3237)z29OTGtvxER^wMCqAG#F(y%-|xVP7b zIagb0Kf-JtcUBN|+ZGxhJi@4_d2gpTA-r_^et!4as?a#$IMWM{SJFG;?j~a^0=x%K z^4E(Z(@`moRO%j6F$=9tZ}{fziy~;HE-Sh9E#b1w%SDWdz=SV_7f;6}x2#0jN7z~r zTgRw%5J!ZNL#R5(R3EUAxw_^9<}jOC?*PEM`TQT5zbE8)1HpNNx5l2ZWZ5t+e*QDs zUe58d6DHJ=Ol;w&rVtuVOtw9{+Sf=B-uv?Ak!@?pSglK+_gBwTwQLEFUWc)Ode79_nKRKGH{sh6qVW8I(~yo5ZKLxf86e}=@{W9Awx(RK z6ZN~QYYDG*eSg47rn~=jpqkl|*QHEPBkGEw9&b=6q7ORxu`df+30F zDAJHwr(zJIE|^H@9x|@^bbqvf=ha=dE3rSkc37 zN8*3Z26s$B798-;(@~62e`ZA|j@QAsQV)%oR=+$v^dLAByIsFDr|@hmd-w2RFjr~t zTL+0BaUD|#;f!Fo!7T@iLq90M@fwm#WcOB9bMpS8cgi!>xck~kudGhFtTR>4a z;J?Qqm{7k9!BWrtCL-dMqcFne(}piZG?A$%*6#i^p5P+jP`#=?MW+#*tv9`1 z(a&M^h~(HSLBH39BrY8tUs^Yv;CC#ogHMY;Qhc6XlAx!>shGH=yGa5j`@J^ppwT zh2^-EN1wYSB3T`cSq~!=UB(0$0q!M99+8q2?aS02`#*s)QMkWp-zb}GO0Ats zML)@Gnvl;gOAzc=G$V;%cTR>OA|4SNX@4)JJjGXq;urh^8BZ9JU4z-{RfV2!CIMF8 z1Ke(Z1y5f2dnMLaV2#rV5y?>J#`oa}*_>@KTAok}RC$1|mxK+Cxs00!r0Z2>Pm(kt}ELg$NqO{oFEZOJq3V)~`Cm zyu&2WM-EiriXx!eZB~Y>!oSZ4AWZLW^2#tK(%g*lv_+tO4^$>x$ zK^ZNXAb-YfbPCq8n`8p5LAO93kUkxk^}=5&*$v4SUHOJE zgpIPFnzZc;>WL`I#;dY6%@zMQKROhBB6*;TQFHfFC&B&p_v`5UvWzyUiPC}`!m820 zgHd7RWK=y_qHiTnl&`*ppiHT9+i(pxWxHw^TuEK^q|zdj+G$8aXa92}S8Tv9_g>`o z+QO2euw?sBJV;I$DY6rU`?54$2OMd={%YpVd|4v{xmsXk2=80}=J=Bz-Ya{<@0R3+ zFL$bh96)HcPQG>bg6xsG!4%OqixkFuZtyVxf0LS-MvQRWpLeN;=SFP|1lvslL(hE{ z@9m@4;)Cy>S-X-Z=Q0l`*j3TDXEpptKO-Jh{iB{Bij90kF=I2~JRXWn?n zt_CWh=i@OKbCi04)cqo4!35x@YM`Y)_-NIAk1F3Df_(bxnnfBNCTGV=TSh`GimXbC zoL*t|%c__enYOJ9qd(Qb`I9{IhVIqs^EHb-(nv){oE!gxGmAbBF+Wm~P+uMEr3qKQ zi?o$J@Y~oj^M{#{`uSkk&GReyg@>2pT?F`(Fxu;F12x=cae0+loT(!n#0NV8EJtJB zyz-Kr?IoC-0k0#ZBftm5m}A>l#}JnusfS&}vy69?PS#Al8`r%|=VB(8KJ3nC={oUL z6(SB$$E1@f2Kft`SZK#UGI?&(JTTJ?^XjACYdYb|B$!d-;c<{(YMv8 zx#Ww^mVoWHmA)1;3OSM908l9obyx;$1l|U4?&t~a({zA-Di_72PD)c4A7=&qd8xj* z{CZ@ys>llZQH35YNqX@REKlhZ@l#|NFnE#DZVqFtzErh*{Y$ z&U0()omOHb-!dql-yDM;U=4gI|BT(>`EK-yc9?M?X2Zgicc~ghY)J}`CIl|e@F8G> zfiQ|!r^^nDLsY(Am)m-l9=~XQXX4qV3$Mq`wHSbg1=oHnt#$JSwY4#It>r3QJg%y^ zM_^IK;qe#CD>!xbO=nw@xSfv0Bbc5ON%SK)*xCy=lN7g_2liG!PkOGW+aM#7*L4=0 zSF$^e=y;vjQQ@R<1csde=wUwio~fnztH>@d1YzO(N;yE0Z$4jElfv#bulf;JG>4&( zh;Pci7!}eDy^s8$_Dap!NNa%|6j-`U&rRzTss zt4dT%NQW8+y5YdEQ$iYbojc@|;Fn;Uc(E9tsEO#KB;-jIX>kb<{H9DtV;urnj0d(0 z)fD%DWfA9d==h70#tMzs5%~YrhbcV{#qr>RX9;GPucw&X@08p}KQ|SPs*QBCT6q*4 z*5!r8tIYQIEj>C1UT!X{U8%E8(wJ=@347*c?-S#$wM4i1hPp!lju%P~=fYf=_#JEo zjFS%<28_FoOH zd|0I(VWz`sGQ7m76VoWgsz7mP9mCgyHBpit3*!Dg6 ze7%3a&y7F$Z|6GaI@fis$Ng~+;yGt2rlR}z<0)^VZNz&c5Nyev%A&mq;5p2Q3DDy{#j9=5SWwax8=#vCp262JD;}-c zcw1A&cjP z1nWx{qvgoHntx(JE&YDTd;-K4jeS614c|=VLNUS+s(1_$y;M zG2cUWw1gevPD}umm?a01ydB$%RSB6|KOPqQeH(SUZI-(j4 zmUSEd|7T!~zGauL#dA0&>*^sds@v<&`4ZK^I>*k~ z64V%}hR%xTCwVE6JUbBF{G*2ubFGsfFF#B=G9^!88m(U+oAV7{ zGh-S&jDt!0aT43($w9jG56=;sTlzsTWdgagATnkXZe9Pp==F;!4^+xYxYxSeDpzh# z^NKD*2&6RY<5gXAGro8q43p%&2zR84^X><<$b|idhCK7x;qLSEY!pH7Uia-$b7kIu zS05LzJ;d+y8DuEMczouSrsntUz7qvqUPx#93J1$y!Qc=8&?@t1Vo4>S4&Emlp-`+o36bOwM!_cYU zzJkj4={S+#N;!EIWOv@YBpGTKaAI$1NE3_p3?;Po4SN#y)cVSHNC*_sr`EquvE5ZO zANx?CTck6Yy*2L>LM8`N1m^;tpI3ByYCbq%s|~#5RVi+Eo)~GjbkW9p+y=2EeNP5= zZKSqB)TF?V$&@>ihrYbVM+oIVo_|CUbdP>je1s;}qn<*#mUMyP%IQAnislseVk-91 zSJ)yp;n}iiiyWzr0*N1(8EU4HrDA!ksa`Mvo0A0Ffm0hrQYRVdMCNTBv{ZajPnZj8 zN42F?1FU~FC7lg4uxX-*Cs@~xT20)-yA=%EW%>lIhus*#O@n^b?1OMPZuhsG0WTUCj#od<0E0OZf%|~uIiN${Ug6u*BHWt-@VA@wD}=N51%UA*`RYE z=spA(E<78@H;dq!TY~e@5&YwG3QCehQN(4A1_VW?`$PKBg}*1w#E8Y0mpp2)yvcf0 z(Cev=N#v@a5)mG<8;nu%u{Szx~peZx>Fy)C1;=o zpK$(qRUn**g^IK+b|bx~?sVtD2$_h@MR_k8MWMnW^^9CYwun!xx6c55gMiDj*H8?V z;&KM>&)4e4No6X9Ufn01d~I1Ho_67NNo;dR0NKQMXG;2Uxr!Q{8tf7bHoPK4a zFG^VXpB_t>_o}}aOP%{K`R|oKZoBl!(nJIcRCdYoPCQIEOwNT}mxR0I=OTq>O`cXQ zB4c;|MhcS*y7S;LgEQiJ(DnDI+YAYSsn$-*P4&62A3w-DCgkn57R16^%O+>1=aH~U zCDVGi&e{yf>q&e%BFoG=bQ7i)HFr>OX~o%Z#gFm&IwR)SbH>a#=iQk^2NQ|fU9|2< zt|LPpE8`p49!2G)jwPT+YHDrW)r?L+=c{myfuE7me^HHiR;$XIr9~qwOZN7bUUfDt zi!_&>IlT>IJ~cg7r6jy$%XxW>J9#&h?Ps90$TDW`MnieF%DY=H5Tete=0Ps3C)A1G z@MW(;dF;4yeP1aksI@y0ZI^z=b_`TItuu;i?db2UYZ%IjGHd63Q{@pVA1?&#yo>-)gV8ba7qfC)Z#%+&xjFt>9yAjTfzl??HTK_ZJCz z5A7S}6MK%v6*zz%LzrUJdydacf3(t1-YVzfwX*Aau(dNuJ=xT{#__NWb`$#!O`POI zI0k)+?i42uDiP=7!fGz5%T>AfKKx4>7k1GOe3?F0XNG!u-^xEjMNjj)&8=^sk0)+l z^^8Xb0VZ+XH_S~I$zb4p&xhSZn+ z+Ci#+1~xLoTBiWPXSl|EuKiErU>We+2&mBZ+}H*#Rph!@tu|`{Ltl%(=amvuhc)9o zkXd+{Sk<6!(@g4_KO*}^!I4@ z^Ab*l+UI=^8pf^NcSH%B(=z`fPMu<`lS_hrvz%{O-#TbgfRo!gZG{3hym-%NNk z?(cmwGI3&CV%1*u4hT9V*U zv~)KN_#=k)5|w*L{s?tTb~|~BLg^D}R-~r;hI!&Mv<}$J8tR_B&&ffm&Z5nwN4*>r zT8mkkU|c$yH%H=*?;;PxiCFA;AvXcb_kWi-@HJXskmTTD_`^!)+g*5rx72z`L&>+| zs_f#XPG6}qilNWPNQNVF>>+ftWZ;CZ68-LcpX#tBRTs%V-J$yUK(n!it-Jwy)Rl^L)WD=`e_Nk9aUtH4-!wK)FJ(GPSsV8Pt zf7G(o%Pfe2Jy)!~$=Y>J%-;y}5jLtA{>1jAG^g8hSJJaCwpQtIn2|U#`Ep?PLAjH1TyI|57R>=_=Csk@DYdtNXVR!7RIgF5 zf-XcvFx1uh;7|J~ks&$R1S@#(y(7C|flaMtr90?$+M2p!gPoDL76Zyo6a>cf~+}u;euVDAI(o z8UIg@cIr@p_?JI6(D=oy_2EXpojb~uZvQn4l%smR4A2%&Lvf8&SwK_SwQ<*iHt(R+ zbTrs5H1yPLbmxA4jR=9_#Z?$w=p~pRr<-*in{+GRV1<%0Xx%Aj=qA8ev)JvQH$9X-#k4xy5fJ_cJnP1l@NNDh`?P z$%cy8zXZQoD`B1EL|ps&%u6`Lxn5vjCFoVmN?+vfQ#Tt;>vx;;<(|K#VMM&?K`ShD zHW;53V;a+wul)O87e_SetmcWBnBcm?YvR*`a+so@zsQya61a(nLMSB$;^kp%BPwL! zT!)KLXYDa_biz90b)MPic1IjK>yxNG(Bf=YDY7j>)p+p11buR{tEjV~l}*WNaNi}! zRzvVQGYt3uq!XJl*bt(Uk@;Nu5x#LheUjA;-o{e=CK3`t`PrY*Wtw`CxlPgKzGbjG z?zaaXw|>@ZEn6&#AIh(LX{d^sE3H`H1hgCj9ZV|W9}7tgBL{#G^4Fl}FNawB0w_L^ z8@4;mt4=l>tR1By%=sH?@Qu{G@Robp8$wAe@P1KFJDm z0lH;VxI7kQ##S; zES;}}{%1;gMkkgDeD7^L!NH(w2o05M8EPusN0f-0iSLDH6{Pgvs`g7!CRTzKJaPPy zr7g#skG!$V63}wB2KJolV?PcycMs1`vW-~Xz;+(S7YQ*7mw$ltJo7%Gf35eJO=nJ{ zm)t{z7^4}24i81<6aKS+qEr(hm@vWoUOS*Y3F{9J4$w+9Cz$je{@&86$FuG_HEzlZ za6f$T!9nY=7;!7$U=W)-o8yG>wCUS-?Z^m{Whcl=Xb<_hs%dVqa-zNjk47~y>?0oy z1!$S9X#I1zGk{ENNQ(X|sagd#rr_QmxWH##_0e2&+G$;H?Fc(jT8kA5XyK;pzP zS9z=zzbIoP=Y5z3tRie?`EdthzB^}5bAG;8t}mKU82E{8GP7k=p(I^vE-dm5%TjPyUx<GjjcL!L*{bER!=X+Hy(B4bVy8+$v1erqgtTlXjZEB} zVzky*aU$1x7R)>}eJwJr?}Z59-PHi|f8IM_`_UtfLMTI+aellb>)0$S>)15&$?^11 z^2^irmZXwF4_mW@cvUVR93FadKp)BR=gj_7?O9SiWLK=tJvK;S{nYV;CHNp~czxR% z<_4cnB|-YVf7~uGl_|bV$H6%{Q_1>(ac~+HICj2rY%qrk55OdxIw9S&f2DQeBxZA- z3hLdXoO|ML07Ad1cVp~g$ncHCbub7>i-gWWFLr>Z`(e0weOA&lju7tXxnt{jgYCkz z<5qe8v~N`MpkzymEB+jt$eDqWjhjlw zr}oNTe2Fk4$ylAHZQTv_n3ltdxvYHOi~@=M<0=UII*Nn144)X4{L#mx^_2cwU?x~8 zSeIh!fEX+b?*8>uwL zTi+q0rNpz0e_Ek(Y3XLs$^4_M@Yi9hnVkarQdamg9DWyI!sHB4O@aMK@;YWXptXdW zN(;YiA#UX~Tpa)$DE!+bL_&##gHT@-v62ZLMo@ozjKijfzM-YG+-oMNxNp(%HGA|T}X8Eia=cEMceUjSFWwJj@U?tg@Zy@eT z*z7-5r|9ku3Ky77&S|0SOMO@wzk6}1u zDywJRf9Xc8iNR)#*%D@%F|zVRN6jBBt+roo@!4_d$dA=Oxx2R+w|Ivpd*vJn+xvA1)12!U2iKP_yPClT1AwDb z3dIo3o32-?u?_Bu%2Ur4lNL`jSI#tSBHVIGW2q+xbt$+Sb^wyGq~7tgh;HBZVhrDB z>pc<#M1y17A3>G``RrzsUPERhytu+rZkBj=(f(ZAH<#R^{tT4|h47WLevCE+9Q!s@-1f-avVnBd$#l9B5QlKc3b%HPDOTyc)ml9pCP$ zwjPJ>4TyMdj#cnx<&A2_X3?*1XrwcEyq%0|t+3u8-_VR5?MRq5e*IMM-1(v;063{R zW|Hq+%brvrUp5@zV>anRLI&tuCb1~^k&;9Co!{Q=@V_)@4R9W|U zA4%+4Fs@cCT_annzl8wFWI(v+e!}H)!}C=qKy%21e?M84my=W@F;d;g zX`Hk-_3?NCj?C%=~=m~5IZE=*lX*`x_bmRrhR)>h2=O&df ztW2L{eE&qV>T1gN74wMKM%&qxTbDytG$sCu={cJ{F_y_^nGMmB_LvZ|mAAahnqIMK zP;NJ(+s<(wCpN8{*1duH-(4CfG^{ zZs*)wui{&uvXSo_IWk`<&d#Bfr`(A)lu2`|>a!Zy{zEv{@4spEQHj&7)R80Rv4T1N zbS~h0@vNonxIp+FuH8H3@V@cu<_U3PU=AB9Wf}MNXx|DQ7JPizK|G27;3?duD@N(8n8}u|QlaZw%}GK) zJbB=;(W8KM(#@N$wm*W1L%wb*>`-ow;k{abp6%;>zOcPsvh)rr!0mHYGejWY$zsAP z!f38L-7wWHmQ*<-g}RVpw?dBpHbjH3guFvOD!MKA%1zxFw&L1g>&1q?QqueiJ6sb` zR#Xkc9OeQVM@2`+Ql_1a!;s!)eviH`Sa`Es}X92t8wGSO_X`hPi#)a13omRWz z1Mw^mtlrIml%BQum0*Xl2Zy;zbW%Va%c$WP1TzTs2N#~Iwq!Fz!&yG{4! zpKD7g_7D6PCTL%GhYb#{&iGY&%wtx)jxK(Sh))ko-LVtr3nmI2o#QuTd2evwl)pZk zJN|BjBVceNAC3v;>v#!@3|6_*|91B`vIXUSWUjPsZKYzy*k|VX!`P5*MT| z(wDq}*xwSUy<+pMTEd#aMuVpoM>SZ)1W5x_2 z%XnaR^Bf3pWGQnbd4prJuT8XpWRg9JKA$pD7f{Xk=a(TX}r2;v@?cz)RJxQT?k*(p{6J4Qg)N*J~zt zZEn6JX92raFfc|X)l`S_bL0ztE|K`@n}I>cL!jj7eL>7@X>9vcZ^>8xzjud6Kf!{X?nJ(_}CSkOG zH#my}6)aP{ty~Bv0tcZ(D7}&p;y&I`B7YxWJbgka6l?o~-{Aebd4h%gB77A47KcUs zgY4YYLgaESV;s45_GU;nLo2&h9JyrOez8v%p2pq#bNCp(e*mO`R%Cp^h6gXsGK72CYk>UDRAhQNFkJbx zEbN!xi#(&Cb_CJ*7I-o_6iT364)slF)Ql*;KL$vH#~UaGtn1mrp(chRM9?gm08ba?TD`3eu>9Xg5vEl{sfpAn@Dud-84FdIV8b6S= zLXhS!@6|Z&ErV8MGq}o`Z2E&D6OWiZB@qyn8D^cv%>;)+7V*D&;$QUz`zaJ>>{?>_h=e`s2pga#okFBjjx7TZ=^JB4DCxio51_6%{ zbigd(m{SKGb_HKAyg4Y;aLN9E8YtR$_oFTkVG?TVI%=xiH=bPDy5jBY)?lKCyOtU}(alk2pnq4BC~Z2o!8saK0Si(P4xxRCDWg32zHcY3+WY`m%Vw?C4o zvGtR2MU?b|ZlLPki>cG(&+#J!5uY9qX^~0ct10fuw%V-b2&S9lS{*k{HQl6$bErg# zM}JO=v*;gq92_?%^sBbDR*0?4i~PIdjdkP06DaF?%`jo+9Io7d=Rlp@x984>ZSoA) zN~lI4%tg(x0$XA|GAOy^p()PT^F!~I_eV#KO-4V-Vcsa#hm&@koG1VqJ$5G?99v7~ z1y_AWhkg2!zKcsJYTWg+5ggo#(=zzQm_}{E4!CLaJg$bcPq95Z%u3kPQ?BLU#J2ws z{lZgN-AL}H>JXu>Qb#^UHViHV35n}8lahSwBGKsd-u-*|OELQ4L4M~*r^1(w4zf&p zGy2ZiOHCqIxm;w`7-Eg1!GIYFIh|@7Ts^)f@R{FZuypyQh(amk@Zs<{ie@0|5u2@nw1DzLDL&A8a+6L!U3~ zckDFIYfZOG0dQ7m$&}S>F<>_UqNipVjc}z&2VJWBx@hLPu$C5P9s2Usw`bRMA6g!h zL7^(O5UEGnTqKD~f$Is<0e~HCeLx>a=!ky6qg?WQ!`@n-PPWwA;me3Wt-Z5okKUohf|c=wNosK+_w+QCROhEY_>fu93r;1+XPM8 zPh4sFB7OrO_$h4n?a<70LOTr!^C!Px!x$aXO*6I|W);^(a0TvBn6kUxK39HSHr^%FN6Iz2wBT$N=G_=@0Psy-&N)B@K|P_AOkZ*bycy}0 zvzFB$FLs#ypkmBpUEZ5NBp;;~+I{^YL80>&diU`A&>Y3IRCC6sjIrGdks+}5zWPig ztI7(2P!B3BAWOF=;~|p+X@CfP+pN>CgcSx;6Az>KIYiu5e>%h>mWR_1R~kT!p13GW z`zaFzo=i2EZ_mG2J3yRvM)~(DIDJ>Az&l2?g`i$(7 zBRC*`OUquC`kn+R!jx-5Wx`fk(g?@6`8MZOXwR_K8CT#VuIqHKI71BEA~#p{?v;iD zu1Rz`=HJDL3$V(mV(Ryml@I`a$z~AH+k_ywpxV|)+Kv^{`SzDv;lJ_el~4P|60{nE zuQBSF`YgP)IJ<^lO<`#pS<53Xd!n!5|BT`>E+H2?E-=NdbY{cBVCz`Ddo|V1ZfpDn zF=eqX^o7C(wguR1@Gf*J6A?GzE%8yE8#D z*~$fUxq3|s7Dmuv5sLfqtXPh0lony3@_ zZrwViXV}Xl)<2+u;*Hp>`Nk#Bex!3aXz=3$yajaqb?9V*0FFVBhU(w)^|f&7Q1?)i zu(4H<03a5Y5;ryT*Mm|}S2(OnbK@$b4#j7SR9CNtUh#p`99M5xpM!du??pYbX@*a) z-$}yXhPQMjVVUSI)S%nnlxF1HC=H z52utvls~oHmoc!m_OJ@WXzu*VDyQH>a5{)uqj^F^LkdRM9o=j|pf@+PHB=wqvbO!m zA|}euhWr-|D5#r~1YA|ii#O{?GfC-C16t_b|68|qY9M_TvrGM>Tk2k%*|@E=ybs!a zQQtQO&mO`)?r1qHMtM?w^-Mdc@&fMN&h0D0M)PE0ID)m zBx4!^bpGsGMK{Z066Xp+&gAPLMfbN1c6}zX2B^`H|DNTI-pcpZhwy>WsEZOF)q%Z= z!aw8fIp#!59EIG#;8q=4I8ttPvV0pjw(f{tiYuv@F|=N3eLcxmiTT&2IMLfwtt38w zM7jXd;)*Zw>%@MS8qGQaAChqAO9E^2DiygVdCi3SdI4$1500BBWV|%ShjOWCZmz5S z)SJR7G_jnmS`NBYx8@^25@)fX+h^b2DpG#eo=sc{lxLT{R9M%!bbr#5bQ1h|VpF2N zMVB-pFr(U*ptYXUVh6A;JO{nrf!FTWrjNdWR?d0V4b)&Z!b1x7y|3YPN zF1+IXdsEk@*@({fXaj`|3s?`EUMDD>0=?c}tkv`B{6BT8ua0%r3jJ<6`#YTCxP5pn zlAf!?QH@4fPtr!xFwJwv9q@nrEEjglGoHd4L}ph${Em4e%SqCvlMR&%Z<`4_JGa(> zJsq(;SIL8Uh<;19Y!{GvfirAThBN_QF|3u=#+;AJt{aDit00m><;72*o2~p&9*BY< zfSC{Yp8=4M5|qTJ2oz$*`5O1Ljp}e-1w04+io1wVJ-$j6mbk1C8f^0$d@9b(G3&iRCB z!R=sy+yPLbsZ17KcOjHb10Q`8!H-`J6i3Ou63Zgf2>*s~h%Z8&wp9O!I#ivo{d_t2 ze{-!LZ73b6SMmGbKFz+)$(Xs36Sy;{#-6ZjkDA{0vvxo#!}z-#rvXLcA>Ni+Ya_~i zS8gh`bU1~xYo_(D`Frb{h18RwsIpOlur@3@a2BS-ICr~X@Ly}OL^GjuGG{{(^g-I@ zn1kG(P1c*-hRZ_*{9v|j%gVB*kE~l#dR1jvw_1;aCzt$Yogd-t&}1{p?S2kEDdUsw zG;Ex};}T>2ZQ5a?V~oHlTRd`J(){eSYklWs-pq!SB-}|XbjG6TPwCd|yhW?;SZeI- zZ5;~PYmBL6$ezWUzZAUud5t7U(&3T?^Uw>{&aB?OMwoeF-^3Q}39T>pxw2+Nv(pIq z-b7b<9x0!DusE0EQAAB=$sQ<7ife9E294!?Ir^e4MPbfyR$RobFqCurv9%Jd-pe<~ zZiDdU*Zy^zm#btF@wXsrpC9(W?{xSzE|L8EE7zzdg9f7$Uo!lq0E%0CU4%j{hrJ<*hEf&@KS_ol zPm^%kT+;5ziXn&}bgHrt$Nj&Vq}wN&)M(KP0=1O z;s-YJ-ZL2{4MyaPaL?hVMC|F8}4N_KlK%3V5DY&hsFU)eiAI5e{vqHx{G zLqStNMt~*)Y8M3iT(|!ne8C>9;l0Vunury&ZKN1^V>nAO z(7Cv)Ys%j1>dWX|>TyojxZtdjgJfLqsx`en-Y3ayAdO9@?j@1(lnwk5+WTfVH=LF+ z!k*(ZXLVy%`+}TXFOY0&Aa`c#{xErCYNHWGTj&+E(+vA{)-y5k0YG)a@;1Ws(c!O) z+{6I&;VuqqE;IYL3Qv&o&WPj3ViX1j9?4a@7H7NuZ>>j`lepN>q)U~MswrLWc2Y^s z@+Kpj^|b|JL}_aoAsP(k^gqY9e^PLRgc9_garq)va&N(8J88WLw*sT4p=pFMm)(H@SgI)8IPSbDMk>vG}+|bjdR3j5s zp&Gk7`2Fwel0MbQ?a+9LG@E8q4V|vGm=zvyb6$>I|1>mFoJTxZA0H)TwDUyK*TzkXNwXuCSo0h4P{>Sp4 zZUG6c*u&5PlnmYjY+_;(1MH2~7Xk~Uir$GM|2|xa==jo%mGD>i!!PY~USs7WX z?o@^?UFvWS) z%8QS8-!qr}u=CFkVxQM1uE>Sfv#miTP4Y(WHQO-3x=fC7z$7u5M(vgrjiiXWswD_V z8swQlTg&WDaZ{atfPU-Q<=A-US^7$W!9hy(&ZmFF-M*gz4e7IAP83D7a1)gYuFrJu zZ*Q``Y|AON4x=#Q=tciZ_+L6}G7VK8kh(PtWE5W!qaedH+d);J_uFL)OED6eMGJ_x zaR;o6Gcw51DDZWOf;mp_$WjM$Y{#`jeC&#e1(Hvau}lK)k>Q7Y%c_6YJ!6zG8nWXj z)pPni@A%VN4sc!%YYhWbgFF;Np&`fCYcw2JqL2|(`L~)RAn!l3$9_d{4^myq_gIiy zut@S+IqR)sh9!b=8;;dS!TVyFS$;=lbbMLXL_jQ3Ox*CJP&cs3b~)la;jExO+r$tn z1=&;xJ@_nBJQYo3J5Y}W$<%uf!KNs8&Yi!>)pg4zE{iNF|gOLJD0f0k~;Od zKe$_B$o#3Ab6)d`lJ~%K*Gi&8Jm6lZeDGQV{QGI-Nt?&;yYvy(eUh5LZ!gm7vCdGCSk>;2i*BRmmndHP zYeV3;PU{X+>O}iiCs{T%CDs*LmtX4q8SImMo%XHR%T(mq?B{H1;D?gD5yLkJ{Xg#w z>=Tv{Qm;CCaG-|+pj6k0u}PCBkTcS+ec{f+ecKV6!JUnkhua49f+-p<(?qxPxv!#`loT};gdRmyE71%YWr0geIPbufnVh#KCIh!E(*9HefWhD z^$!|}dqVA~X~h6h#ut0m4ZPG9oJ5!~WB*|?^Mld)EZirnL28ivTh_^hDnF74U0iN zL)(7J{~VM(ddezW{D+hC4(G4S(fw(UUG5LZcKiFlkB1&^Y4II>|L-k8IjW8O*_;vH zaMtg5&pFP|W3viHJ4g#HT-78N%0_G7ho1j42DMWQ|IOrxFbcmhMmf_ntR##BvG9Ul zE%=ZNE5 zbiWi`!P(h%R*C@)Tm$2heAF|(acx0AAkJw2_B8oCP+Ph&QHAFA5sr;drkmWNodo!| zDCvT3PF-<$wuF6pPUN>(AaG)BA;vm*}f_~2uUp^Z#E26N*f z4xEI?{wMt>BV`iE4X40Gdn4IlpCe!^9c-q(J7g&`fAK*WKZ|nljp@xYL=1R@ei1_X zvr69y-t$jnQll3CyOcb{l4$GD73C#6buH*G)wE)6`=08-EXOEW=-!vGLizYd^C;rD z*)W>Wx6ixtb2-dm+W2|M&BMKZ#^1`9JAG;1XGsh}x$IH>my!Ox?9Uvh?*cNm*U9t^ z{{oh^^zSkCrCcWuNe=gu*qY|lgnx!%aQ_C>lMv89~OJD?2@K0 z#-VYoPwC#mB6T~i@s?C`sx%kz&~LheRm%JitPRg3aAy^-!7YP1=z3PwFt z&U;P9_3oK=Te$q|E%PR0C92eQ(BZ(bFGxfl9UgEkTBL6>bcjzP)de4W5hcq>mb-eSKHk9dPZk}9?M)KG3>{_1@mc*>SGyOk`H9soj_dcA)ocTRn52# zhkHWdZvQaWgxlPK2B(!*vQ4j5w=(`eX|G=Ua8XUn3zlgXUExOLevP|4o%m(@3US7v z_KZX)Hot+9gn3pV?6t}C{sy^sp?8!wWujAVumJCRcfzr^j(2g3T;9xReFO{04uCo? zyA0N)O-aCZ^=QU$53tRegPvE^UKCOkB%Olf1F}iz(ugOQIRZJk z1n*t@K>AW7isBB(2M%{iO~zmf1W6UI&4YQ+{U;54R7%h7bVL49Cpu{;darP?xd#UQ z<>b1Yj@&+2x!x`sD_<@D*;M5LPJbdz8hWz+(44a@+{t zg$|3ZWJYR_-g=S*gz+_ZH{uUR*LB>ts9ND^{UWiVB0Q;ND9&_K2%ryDCmGQk$hoM@ zS~xqNFD@iP`pYDNmG?|eUF+*PjH zFsaO{HE=QX&;4t6SyK7cy?!5THZh)}j+NfadFT+rkL4ek)wD;xb1o$sybeIJ;)b10c9t%6# z$Mf5!;*E@LHBLn@ne4(@gk=BGvVpWx`hhr;hMfQeZD52Uh%P@_SRwpM6iH|jUL3R- zRCMY*x<;b*@IKdlUNXZ3H!X|CyOyc9z%uU;_u{2~DRB)*c!jb}Th(mfjbz)cv>jhpfRr8JL`{+pK`5hDkVN4VU+MEMWcY55e>* zq~l#;3!RgiB#?X(IfOH;>g}S1I>pWzVEtB~MVYBPtz5Uw-OMUHs7+UO?%K-xygLei zUKu|-|A`%s&cag?)7Cqe!zS6R@YBPmx}46qP}O1EdUZ{1(zwN*265Xd&Y!V(L>5=g zWm`+||02|jdC4X_{X$a?qjc&dwEyLVwnAz+S)@Ov(@Ne|EQ^#_iJ{78^A4|R3LNz0 zhihsaFziN|*LdH3HbQvvHiO>1kYljZ_5OnWhd!IXND4vNe|fFeGCHOsdDk-TE?P|k zNXK~$#6eDUUOZosF8QdGvg>KI@rpuk_c8VSt5;Z9j|0U6FH4k3reQ~dF>kULl5>cI zgHvx)A>UG}K$zJA;N07=Bm&l~&lU4)$Tfc&=FzAfTQmDuxhpdu0HvtIcyWYr>IU@c zrK#oyq?SDBZYPf)3fVFzU&N&1E8I5^hfZ`X8hQ8Bano8SWReCBa|N39o$Z4gJg&2e zg1snDeGZapxaML;jUj(@N(o+_vaJIc-NSJ2?6%;)MN5sLSs49IoIDY(U*drEn1A$) zogedc-~L#@>LeSHcS5c?{;j&ype2v^?zDqX9Q zt}L}ap&PQmKDC|ep%&H;BpG`XJI;60KvNPn371Ka&R(n1gPtFQDRxTQTlP!S4LfyI z96)MJ;t=tJ)~--{*{Nk-g}mUSQBBG4uw+OOe%JCzZQ#~|^`n5H`3jsCnNVm~qJB6d zNeOjl(`*min#9%S-Pzh8Y9UHanq=zyPhS50K1xK5XYqv|XmeV~JkV3rO1-W|Zy+)YsJ3*nHKTpa^d4oSe-!i-E^X^6|+PQDUiQ_xm*Fd(wVaGBq-ktxr z05(!r0@%cb<@S9WoIZOQ9EKVO*k=cM`Xwm|3Qx;Bf-JD5p>X+OJspl9$%5l%f|A|y z49FTwN+Im;ORO-Kr(8E0(592`#zSsB;W@ET*qyG2Zh|k;M{n_PbspUEr7gCIA@>Qr zK~Jv9b9n_6IQ^3{mN$~YkcJH^Zjv?t$_E-cBED~Jz4pff!>W}suGVU?ZNDD6#C6@* zN9BQvBi*d5`cHSts2^3Lu~Yi}{*#ER%OT?rIi{!mH-#sUx+b=tyiF6CXNRkyF@R%w zDx7J6_iygEA!Kj5%wtBKpw}_m5Q#(Q2;^UpJ_GvpV$Y>&s*_~^SpZy?`R znQu5mD^uu9C+rc09_#1f!(y$`CWx>16YKa^>WeqSVByr$iK*y7-Ai~J9SX4tA*G;l zCs8|6)P{K=%;+51( zw^RsN=9BaY+L@_HW4;h})IC?!I#`=-{CnC0{!!?}e3evp4b(Ql_sYQvWISTg1Q7}! zQDx5L>Z zRte%M+n$pG$&Q6qQ|WWZM}VZm$T*<${Np+k>DOVW%IBn+3NaP511}*pr#kC!;~n<> z$fz?NOZz2p<%w^nwTA=xv01D{?ueNStquyVcANKahQiZ%fPegFar%^SFj`T{0sIp# zVI6yZn*zR!R{iVuKl%iTJE@nXOhf~wV>OPNLOf=MatMTYVVUM2a-LajIFeaCk?0T& zc;x+2taAu$<6y8S^`t0(aI}k}njwbUDnXNyBK8{nxqGpc9(Km$-(^_U=AWK^;2M(R z2005Sk@bt)uEm-6M@{PAGldk8?|~z=!9jIGTs0q+qvBsHG*97PzDL)0OzLe0DFbOQ z%7=HAyp;GgNAnoBpg+V5Y|nHUw>~CpGs72Jyj4!8V#{bH)6;LlmJ)osm=4%CdP;;v z4-=Z2Ay*D-hWzeQP&4X;wQ(jN&;07Dz2F|_)#sq_S31vhjb=TnZKBt*!IUVgtXJT+ zw*fWQ^W+aoEFF0_#ecPne0kdh?Hdk?3DGXon`vt8YT(`Z6O&5b=5?Gur!?DkGJ89t z>i-ubswC#nn;R0KZs_|k(Z?u+iMjz8@6}7e)SZ7X37fx&>0ri>!k@YHUF;WW^!HO^ z@RbGpUWkZbeF+fYNGbkCFaZ*Wgq-kj&m3Fqpn_WAk(&1TDQKv(QOz? zGwZPaXFbObSV;4MuYe${V1@FCe%~)VHo^B)HUWk8bz2o_L768}M}>cI{}Me7S3?8&dtvbEV+GZ8u`jGI#~A1* zH?9ck-x|`7Xn&w=!izOMM$C!*Fm9C4jQ)6%p&J7zw+Ad1G|bYV5M_;nQaN*9iyvXL#}-WnXAM(%#bmtXkDfgBc~&Icha+%jAR+J zy+Q`&Q(=)-H!k~YwamAjX;xj)MD7CafR~UX<(#1hT%9Oc`UNtzDmjxkDB%>|@MHC5s z^HEW~#}$rh1Nawgy{eksjcfb%3I{tREqDgz&rcnEa#y{u4WkJx=Qdxii~vz|nZi6D z1Nl);f9BRr*UzYbjxnM#=?;j27I0A0Kz(biO-JT{8J8XcV7Nc{w3W}oC0naaeUeE} z&S<+?ypJt#4EJ%dN*y@yJjJZ^V>ekw!MZKXa&$J)nHMqd}CL6;hMz2bg>fJ|({)8J<~QDZMT5gVn) z(Vli%!SCeXg_OXy;MCzHSt~mb@HtGBv;_SC{u4F~%3y7akBjr!8p{EHql=~UA`$xf z*l{FOoHURKp9mR@SpCP61sX>lr|oE)@eCs|ElU~~K9upeCLvrLS|zS2n3w6*W#8J# z2I<2Z`Y0Dn|Gxj+y~K{;1N8d{o#(66$bPQ8(BT7iUj=rcf}neoacn|Jt1~|64dbm2u6sV8D94mM@-n5( z2nPef?L;Tf#bdjg-@9@BKYtcSl2nR5iHM+Te7+UF_tK_f3Qk$Iw>u!3TDj)h+fsi= z*K0BdQ@XY>fij|#IvWI)U`Y)r+?m;usr6x zy|288mR8;S59kSLt6B$mo^pk5+5&j17LB`hO?TwIpXAT*FR;(wwag;({WHOQSATyk z!=SpMB)U*psZ-H2gBDEQChQ5lUTL0DMR#Ij=E!3W91i-QR-MiB)!!D(BkyaA9#Tb$v+o1WLFD@Cyxwb3Z26$K*32N)Im$yNa%5Y4TgE!| zIAw2#sNtQcRf7-(7YcEXEb*D(UvnlPSBBn-m+Q)0Bfcqqg)l+#{1u2HPid;ZGyK7L zclOidhjK}NlTN=F^|%n%4c}_q2N^%6@_zqG6URrVv^Hm0^dGqrpxp+ZYWEjA{AM?& znfj*14Dc&8W{~|^Y&Vl?5S-3-B|YVf8ChX&6x`v#8Jm>rM_?Dw^Fl+AIcu!M)QK#WODtwZay@A+G0dCH1$ zc`bd>+&g}|^!pD?^u|MCHmZpfo6ew5h4i+Li`* z!>Ux4P=9-!ZUsD#-Sl;`=f4Dw3*9c}IgNx4N}l5$DZR7#7tN)M{)f=XZ4bQOyRP4x zp5C_;x@zK!^5XxrS5(p&k6Q%1uEp#_6)EHh3tXP+NBT35iCLN!eiPgHrG*$h*?XbIOnk;NX#)4#|K*nSI|P@l zUe^S@<-SSBua1h{pgNvilW(QzTA)iQ*PmF7y`r)vanvH0YG#eP3ryCwXU4;e@CVHm z2?&ArSSUR4B%r22&sBDj)VPTRc`sU1!CZ#(+gd*BcVbO2 z?D%t~NEcU`un=!2sS2%$Ms@R|h)lwwdduw?F)Ae5yehCwc9H%?|;^o`hT9*@IWKd&qG zo5O6-$nq@r9~JS}K8Kt0lHG1PpVFdu7Z2s5u!FyZ&aGkqjN==-k_q}MgV76GIY>Xa zkgwS@dv~o0q*%!)clDa?MH_Ymip4aX`?;4Co-u&)k~)Wa-{u0V;BP@?o|hZ+>jsNt0{u4P<~?JSHD(S#=pIs(dpQW^sz& zksS|J-lxwC3mCTpD3nn*T{fTOxU>d-nxw;N^Z%~!IN?T8enIbR*h|26A;K!^Bg@`x zHiWvyJ1h@qxGVY?c!ZVleMq2@b4uuSNdO_lsO=fzL+cqutWzLpG^GH=yOeQN8(*9B z&vDriPS*@wy^fBvmKH{boa=8kygP7i46rJTN_(fDRN4T3av8*NhUL5f;uf|ylu!Da zRV!xrs<-M->8y;UGEFSx1%sBdSMXhI=hgQt|1`;O)hRE`JzG3%?6o=W(tPYdqag9~ zfA4Qxqr2cpPU`rDGm{!@+>8^Tjj~_(n&H`E*k7n247XCJ9C|-6cA2xn_XB5=9b!v} z=v?c>JUqp;e6|rk(6B$j$GCT6d&HGzC%0sshJ(;p|FA7t#?%4%fF4VckzprrZ|7M!1eXM}*yL&c%007iI>v$T*fnFu2 znFC!SNH3xVA?4TM*Rvt*x~G2h&VT#7*w+e-1{jnS>^*%4%tEb9(ZoVW?H!_3Es?DYqU_%u8qb;Z0E3hn(cWlYwxX1>MNj@qaG)>mQ`5!qmQs`=TpAYPeC&|Jb@vEVz z7Fo7}!QdBX+eDZcW9n{JnPnY$)Pr$ro9u%p;<7<0D*72}d8;v>SHum7OoY7f*OeoE zm8zH^ia^Pjet5|wqefDwS#$O55+>aOM@b(=dBS$)z;)*lIR-`+f4Z}Em&ng{a{2^_ z5LKIXVca@uIX@Gh=h&;#H?FxTXVa@bjUh&_ic*1c?q=Zj#XV;>4TTN&3ffk3(s?!!TyCpzqZC zM>`PX4_=DT0g7hsozPs?xtC2*5F6n8cI)aTiO`>Gv#)iCqqa#y8~?_WVW=*lqW$oX z^bqbDSJ-Rpgj#2K1>f?w4b|76a}_G zZgFUv)j#YB%A7rKf6FQ{>68WCI7bvNdo@wvPEbq>OArR{VeN>TYXApyDcLusUvD~U zq$@lBdz~@6-7=M|DRdn#(M8YBH}sn#{5JB$FrlBw5g7VS=2-ZQeqy0u2N-AF&C^jt zm%|v-eV?S$1I*ry<3;k3K6YT(B(tZ5a;)vI!|NN_HOu`8s#RXc_dIu}ifvEUsr`*1 zlVBA{4+NQx0z~Kie+vH%;jlWo9!kx0~eiZU5UF4mPRL5B6ZGG1)rNzYPU8 z(num_t=W^FZQZZ%ofX55ClRl^Dt_YzJXbuQq-k+BzL0`2lZ#*=reW$?9eL`?G^&0u z@?q;q)a&&Jh>R#Q?3-?M<@Mw)fRFkJW+;;`T%YpILv_`o|I8g-27Eh~^q4MOS8Y?J zQm2D6r`-@J`!#LoYfZ_+7xim8tZO=)N{Ix`@Rt#-jDnU6TC5*5)*cIN7LXOj%B%5y zrrDDL(?s%xuGV6!hx&YBJ}|>Cbq+B$TuAmW==Og}_MBfh;)UBJ!=sav-DCN$`o}*w zRIc`8&RLPgg-UgfYfyqVS+b4Jfu15)Q@}$$YlL4TQ%*B^>|ILIM-`mUhc7P2_td=K zxt)65^eB$RR~FTC{nZ=~%hSGuxYRFja|OrLzwDB|R>^q7isyd-7-;OW zY^qkv+jpx6m=@2&(@6lIIUA%8xZ`JqQ@+g{V5TqXqh7Ps0PK(Vi0lNQfqf1&c}lB9 zGK7YwvIS!R>l9f6SQGR=a7&V@I}qNaN$_im$HB<#>3N1j8itLwd6`z*l1o|-lwY2Z z=TY649V?a=5R_k)0rT&{B*2$sbul_MDgfBBI|`I1ha6|}Cy?!N{^h%(Y-!7I8D0a| zf7uk9oXVl32D(>d#TstJf@b_*uH{>e6~NtdiVArABmQv~hJ`0V1s(d?47w_G)}~rR5Be}gfeduN+Pjsnb2$TVQe>eM8DiVTdbMSF_)2?78VdSo z+4k(9xh`dpyl#(26hbvy=iw*-Try!U+VS~M5jC^p2&*sX->tz$1Piz&4ejcqn2_ea zjFqa8I-B=p*XkI-f)4~p>%5ubF(S|ccQ!@YX>WiIg#}D!8L)M}31oj;jpM;?o zQJ%>)648McG`+rV8sWV_G*f?&SdMTYaooGLg=lJ0v&Ff@-%=~aIc$gge%ic*Wp=kv zz=l2>8RNo-pB@?K(o}l-qEhP+m{T zkq(2ZRewB4up>sO^P>*ZDP0Uqeg=J=Ke3yc`c+!Q?!ndIPzL?>{A@NG2<8o zm<_k)mC)S!`YMS!dy}9U*fIqsN1?S~5ONuO!6n`BTJe26&yZjm`0XYSlP$`3lgIfV ziZV8sX^+W{ToQ8oIQy>8;?8*~h*f`SDE^*4BL;(2oPy5Kqk(am1~q zRWO@fv3{FEH1egFZu3!B^&Sv&3YidPy3p-$L$#7=$~T_dg*+uJ*k$M&u+6r<3zC9g zv|nTukgH1EX9*w)CSM>?GY1HjgY)02E}Ky9rDuL~z1b@neqlexo%!1x`9sgohr+@8 z0HpFSwGT-E*s946HaDPQXzB1fS3Y6eecgJ1GWRX~lEwye#5P?ne+*Fnx$kUYv8fvR zBTSxGV(#S-t$zv{1xDHNqF$Gzt0mP2x~K5LQpMF5I3{afsdn@ix}M`I)p^}3)srhn zY9ky*{Q>ROM=J&H{b3l=sK{(f4e**IIP z)5Fb5p42g@r#O(b9WSZczOE#{b1TLWL3MYX72ZY;5~75}qgl)7?Q>2A%^zz%Nrr8i zC*>?z^okpa{T)qQdL0GDj4$)hWb2i@5DinF_#^+zb|7>RdDe-@)u4>9y5Yph6u(wl z?4@4Ft0I*{#iNA%qG7r|*vV)cdXyXRX_+S!_dARnp?um-Vl!p@SMi<&|9aC8Lca4Q zoAI#MJ~aKs5C7fieWc8r^g(7N-{?upQ*L3%r;DD&2fHCV?f76{oQ$U~t1QKNP}NB2 z!~w?A_DE(dL6dM=b-d6ejI#UcZF(R7Yil<6^n_VC;J>p5Yx{0f@zB7g1CMqNo)f=Y zaw6b-^N~tAP#v66+`5o$oHj%YB>Z_!Mm|rCAJA2xewXuYSQCE~?W^b(ypILJ=gpe5{`%bkL3GPV zQXO_et8+Z+U9WjT!R;}u(8Ti(fMkAljf*-0Jb)3(9+AgPF*H&w8XU8tvZa*Ak}1a) z%%YEi{5^@TryFeD*FkFn_xAX*A(Tsz=|+Dq7^hSq3bJYDKHqMO4-}n+TP4Glo|Be; z`XTiA=RWt_1a!nf%E!rrLX}v{wzs{1>iFD*qiKKnZ!g5N34xi*ZEeU@K;MqsD>37|QlP^P- z1zEn^^@WaSfTm>Zq9kp)pV~m?)b6AXZL3fs3=`(NAgjH5heyE{;itx>MPrt>O~7klB|K~M%qC-h2<%tm*6>4R+?YkYChNh;4ecxUX#VSA za9e@+YR6-rS2hvo>ChO`cSRkW1)UEg3;XRPPQei#PdpR zR`>k+oSIbTT;%E?g?t*V3rxylpd(MdX=`8QvREL~q^pcTh3NiUt)^g;=CegYY7H=&>o0229^h3Ul#+w&BWSs8Dc%~QyWB@O(#)bNpt^!lXU3A?6bza5l8 ziDsrHok7WD*FPob7$7Tn0}bRmtwg>+6vg&kKz2MiI2-h79;?)J%CWKx@&xKN085ji zRq721?Rf^ul?oA%+tt~L>%i9q_92+5obV+ zq@ncVvyh|=hstG=3lAVl^?07KmxlTGA%a`)_Mj=$HEX3vBLg zO&AP&iRD1WT7@32x2snUb*Y`ie^xM7i&!}PdB12N*2Z4Q!%x%SLhd4Vv&&0^S7;Oq z%vzxL=wHMMi|{ydgMlc|X71vcCy`qUZaqC0Vy9u+>MtG~4p*8Cjt0>K&0={Y0;8+k z`(uJpkwMl{>%^0#hxvd0tevM?tnc-x1+A<4fBZhYv&yA5f|dfQp>m~PpH@uE|FmEd zX5M3C&-Vfgy#@8lcVA@^qC3Zm1*K8Rvn+V}=k?l<++AB`V-Trt`BTIJi$J^w%X0$Z z8!WIvNOoF%C;D&-&z`K@Q8}K0Ok)=2O8RpxGVu+iONBsSK{!fC0Qh(YG8{3YNgm<3 zk#sC)SZTzrcIC|hI~zIaccfdRlftzci&N96Ja~=k+22q@A&eV8Dgvs2wF3Rl=pXlFV+dfB3ZUKl%L$40lM>JZO zVx+i+Z%AHby5k=FclHXXAq}+qt6qNqw^O!}Xh*NZ1Ha@`+5Z|nC8wvwHqO8ana}1g zXNo#5R^;sJl$ntXujHfW%~NLxI2|XT}WBRyhAt7HV>JC7%twES&mpAxn7+6-1myPSB#39*H!_ zvS|f&^Tp&g>xl z!$^2l$Ce?NB)uT0e<%DR4wq9JF!OFPIt@8tEpwAet@$D<(s%wBdLO`M)RdK#t^k&rLxvRCD3T_EctFSVcFabo-J^SbvE_POZv{wmNOa9F zGu#ormgNgdA+X+o=mbl}_zF^vI#~;KXQZI@n@JLC^fWOWtW{i~2D>N{IgZmEnaNp* zHoD)UoI0&4*q$m+^p|3Vna;R)O|hYz$VR$KCRVLNpf~ZP;42V5rTY%s*3*rgS+ZJDg)49EZpHy=I=eGsFIB7EbxjfqQ@^!L0Wps$Die89 zC=-c4YF^DT)4!5jPG@JPbWf-8lLFv(PHmuDf%St7B>kXEZDfDlH}-RuCO(EBEW`Sv zQm?+1s9H4Y3B{#u6K>7C2tQffET^Odn?d_%5DLQZ>T{_Dr-gYOdXC@39W21jO(Y#&a zb<|%o?Z;^TS&bMW&ekESPQW(DB#*3D0&EcP$8hY*l^N~qur5pI8~H6a9s~D zbQR0_D*mCutNpif!u$FZL7j-aKJ$KWf9K*B1OkF!VenPHT5foE_Zn);-~MJm05`;qIgH|jBThy zyR{rj-`=pb9$5YrMJX%NVH}6s_6)1HbKqeZtPo>Xjlpg_DW8tYYi7po&=bN78wJo{-ObmDY8SG-3ij3M+g9W*{5leKx&6XME|n(SPK4bE ze5>Y(^73xgS>|X>R7{C#TU|(jz_^p})tkDE<+h;53idht;U0FnE?aH(Q`cXeMu&X= zl{5lrEny9P`2V6I1&O*#80>oUkaXuOnX5A@Z1s2C1Oy!Re!WgVVOME#vbEH`qPJ+d z{s8iT#@6`JpqqkHx+~9XA?u9^aRy1A^}r99C@V>F7iZ4p^CMj#QT#vfC&j6Wx6St{HA}_5A}L@mA|wZ*`+`ZK;POEhKIwQt6FQxisJ?yb z?8AE)yLtDG>)yfKPSET>JnCJAGqE;Qw5%N8Xj&dX9@~F7o2fAh;tPi*j9>B|y0y{~ zx+mB#PO9{|n%TgPdlwr};dN4jzSw19E1Ha2S+N!A$tK{|qV7u`H~@0(^*EL^=3e*G zjw43$(E2yq&?}~Wb(PkF>r#I`BkyjAN3%G|)i4K*+q#q}P7Be~?!b1A+S7>*RA0>x zT8V;L)myFM7C--G4|z=kK!b*Wo7cxVf_UI#A?_~F3zT~_og5*KZ)YSsNXna$d zho5~+3AXPwpcJDW`9y1O$;NVnvx7c>QWdPxSXpirq$xqMB`C5004+j3$&ayIqy9>a5paq5>m*u`_@FGGF_u{7b z+BH%Xm5EUEP{}(DdJnaj;3RM|L6){uLytqisb88HWm9Y{dqf!6Tk4?>;^Cq9_^=Ks zecchR+C*Z}y`Sn6qqF|sIaTTD!u+f!|E?5fF%2 zu!G|9?B{yCj^COoLLH0)u{b&VCtWf2h%x{lxh3n`9UA<`V?_GAlup-btGO-5GPmfO zI8_+mXdQofzWSwB_Gqs}UF91T`WA^&u+Bb=G>z;&=+ZZbGYH|EkC}lJB^Y1Vv8b;a z>d|YXRTfWfa*+g3)sfuS0O!7M06DJ89bRXOwT_%a#$lQL^mT`|P;1we@ z*`<2Jd!g`by;Wk0n5h3PWv*Uz&Fbf-rl-=<_Fo}DbJlJxqeVnc+vjsPWZ~9Li7dCu z6c@#h7nY)z9ZiR!Zyl@$!_)Wsd{vsoi~j3$+~3$2#R7Uu_%IE$a)=}ue}Ai<{6cKq zSB;zR(B;uoy7df;!B-IE)^rAyU-OjF2^0u*I(4cBpXvi^3Tb@p-f=`~IiRCbHJ0_& zn3QH)5xfFgV(3KZg|#v^T=;vd`Wz@>_u?t!Npic(P2jdhL6;`+i?tuZQF{NNm0p~( z%U`D{x|}y9=m9TE%M<>AHQnPJzjuN{&L3!$JNoY1iW45@zppD5m^IJGTwLpnZgBVa zH+g^7;9qKe)9R|AHtwBf2^nO1r0VR`@;p1L_UHKo zv0~|^`AZs2p8LWy$oYk=`OK!V@AcXF;Yv8Dpa##yF2zKGuIby>X(s=-Nl$RW z`rYGXVT_^uY#m4S*X%PBdZig0UQ;#e_6LS6erh0;m(WJz<7iQWM)W7mYJZoHTD!54 zn&O87f??8yQfmaQUAzSMB#U9m@4Wt<@XU0Ht?%S1lB+*Wb%a52F8n?xG zLVP01AoDw2L-lP(GTBw@K$s^rr(nQm@oq_%dgMF;_kXpi$cZpzBX)8w`2q7 zz}732e9KA|w;_0n1FpxqL=2N8zNFgdfR%kcz$`S?qW^oJc7>KsU+kY^`h^ojxvqnM z*@U|@>_t(IC!;k&=16nMF>Qry!-(rI9&%PN#IFBMt-8X&-7R`wLyq<-IK8xsJbUd! z7E)!XN$@L{gN{m>w#{#jEaPGrIM+ojTcV7Ls$4C5jKoGo+g6XRq6)pf4@4%6uu<#Z z0b*A^q-*`gJ}}#8(ER#S=#j&e5RF9RpFaEc`%3%6i0lX#ohzRN)Om4&(bjT8&$}yg zZnF|aY-PxE0%>lxaA%wuU7Ku=&PrC>Hcr>fOWlX@f+0Pma25p;gaREKFFf?1b_>FJ z#Ox6$U5kCzlqwJ$H>&?&gY37GA-eY}^`VDFOMiIt0&7q4iz>Aj;+!EMG?k41H?o36 z%no!!Vxi~~O&uC>q@>fk)>sD`6FIYyA;96iM^NkXncWKs`N6B$*0H@oEp_XaY zeuWZqv*iz9vDy9Jui(Hw;laF~h{&)CKWMpLWvB3?BK^-%B+e=n0|6kB%qktV=tGsu zHp-&?t+1W;45GCH=J!^s#*<^Us3QY>mQJgbZA|0-iQST3r{|A<(TR=L3eswxyZu#5 zKig%+R5WGR#oxv-i2TUGKYs zD$KG|$r4>7(N0_HE-4{t_RD5YP@dagoKXC7o+ROx?593X*lAb?@yYXB^ z7HuekWAd~lihJ)G-#b}F?)WYaZly6XVS&W`{3FdW*CgvY>+(7Xf7z7}3l)ef9}@cQ zDIpQ{*hG{N`C}Ot9m|qJk{Xqx)C)kcI5&zIs3BZ>{RL3dxuek8>7UZ7ZtN%oUa*%Z|NRq`DT%Z}9!29$*w87_lVSuQCpwfDas9FC@{`2TSucODP^ z0o*@NFYmR!IjnX&T9#EWsIA>w)j5k-zj>8V`8a}6v{xhgZ7~KyPfd6 zu=Y%m$u7x&&x(Jsh9O1Rr`F!2Cggw6EBT*SdR0r4{T;mrccUnWSgj4S4laXpZVa{x z6*L7B=?DI($qw)Lz#r87N$8!PA?OMOww0or3V#T3jP_>J#G$$~?k(a@8eU`8ct4zF z-|il5^$O=e3j!z%q6}J%J2b=+D!%@H>SE`h;G#b1%a&;++44qO6~jV*4pn6LZ`?Z1 zHa1D@I#??mKvBU_03Dpf76<^-CtrWQ6S=-aj``0oepZ4OCG_+FX zm;j>GZN8F616?!=@U1%9Giyz_=s(j$SbcSz5S4QL=^SY1#6UOIa=4nGNZd!J59}cI zbu+1)pHDfHNT~sL?F@$|`#w6SNcz&P?rkKIwCcNh|hlb^1x>N1g-ne9_zf!qJtJgtC_57W78?yc+2+;$AP?r+v6y z8_lP9A+Vh9db`So6|8QYiiHQR$I#{Ocq2Wwd?phb^qBe3*wn7pSZ7^$H2NOhTW;&Y+&Dj)6bJ9DvqjhK z)FkT!;81k1jp;2RIy9D;JiGD?oee*#^J2Ax>EAo|UlLyGrd?lQH0eYmI2)s#CIb(E z#YyNOZ|8T=m`$oe#gLxl6?e`NV#^JOcUd=s@PscXg7WhPV9EcRfoS^$jR1&TN>ITN z&ObeBh^Nbpp&5eNBnpT3U~nPGdn?WhMnG=u)3fhi!o-0LNN$yl% zK$&6Z3`Fc`PQP&Qh*O(2N;;Yw zAnGF#gw-b(7~3K~qDIPb_cc8xMe~Jmv5|z5Bv`*(X9@OuPN|W~0RI$vBhgOM2Cc;z zO1#S87!y!u31i{z;^C54i{+XNnm6Ohvl7Wr*H@#v#*VQyyi_dITHgm#>WKp|Q%Y8J z;)KW4Ip$FO40Fh{jS?fG# z<{n)6x@sEA2x1e|ytM4_kNlX$UTeT9W5}!rSvW|?5I5bI-OO*`go8E^N=dq2zb8?f zJ=X3n7`E3b$YZtCAEBY(oM=F{B{qAvMg*RM_8M#rJFLBv?tclzdE@w({`nKLI9-mE zMG-ZkXRQ|Sd4$vU(8sOBOJRWQ>wg24oj{+=oi~y`Qw!F3tY>A9C11R&SB0VI*-3fb zMXNSXM@4xuPnbggeoUPm#}Z*jcMRYU;cH{%;8K6OX?vM70OA~fngm2aGA7{9v_sO2 zbhQ}xcymBmp)iO%hmwK1yve1aB+JKsobI+HNp4j~D`g_;VH%Y>{vXp{yDC#w{@JO+*7{!sH*|C*3;0bPy{FYq}##t*~%}Q5Y1Lt=Ir!r^C)rBTn+R? z)Lf3f928!1AuT$cQ})2@??%dXI0;Ce!1(YL9Z&&0B}M;2=&0+xV4%2|AWsg0=%JJL zublod;zgQ&dcSX0{ySj}CLj?2wk8*T!Cx$pFp+&{!Ivf!{HVjTe_=ep%Q5GygW-ME zxXXZ}i^drIUE@zrJ|r5$80<)5VMJ{YQU<-J|-qMBZbSS8q=O zK{Ut(VDs9NzJT94sC!Sc>WUD5OlCE7MN=JcnM6p2ts z#aev!rUSEv$5kccxR%YB4QmmK6I&7)4zNV`)Hf5CX<0RGt3!{?9BM0;r1h>E6B8i$V-T z4N4eN+jXHq81N<6o7e^uxG z`^AZV%4ph&j+z{7ZXRt1izgeuk#f#GyyE;IDOJlvRj%-6@Jb+Bv?piJ)$@L~P5JG` zb(LKgx{o^-wDv6vU-05PzrxIG?MFeLS4LNh>@9F%ua3%Y_iE^F{L+zW?NFPtCMpY~ ztFfIcnQ6p8vwXlwGv*ZCN=60l)^828?)y{;jzl$)@cr@B+&^RtOieE6GVjZVKpxpM zS)i}?^^%2yxY6N|h<2kS#lD`-(meHzlp~Vv^+VU7{9Bdj9Nm`qKO8YTh!rf%lGW}k4!>x(0hs=3K&Q%4#C)){Y z&ns|vu95)Nvad0Jvi{(QzSf=Z#~GOX_E(VuJ=6kB;Z&DsAIH;}M-1_p$9tIWw>h>g z4HVIZ9&%^(D=>Cd|G;rodeoBT7Mg_UPYgb<%N?rMeDuhwzV^)_GxuuNyZ_}JTHuQN z1&P!Q&ou#1-te;QaXMaiRPbQKKkNbpb*Xm%uF7cu@+9KceftAda{jM&Oz^8I6_us5 zs1~>JFSu*zbvUSdN#p@f@PkK>`S+-vUhF>H{$U&z=~C#Hzv84h>f;1(vvtCz-?p&rMn} zb-tm9gLrl5c$=Y3{>NGu@r;UeJvTq#L+mTyYlN}OT9R7XgB#MZN%zUqZH7Q5N-?Imec7|i> zWjr|D`=!#B>nby+88_CgX?jlwbA6+4PmW7Zmmh+)5!V)va4q)#uCUPsdQxDY1889ajlKG-cit?lA;5)KaPMN>-i=FB(jg>t7!9Z+0MQU{l7XjG@*iLIN3WxNd=r=eV z+t#y7WA-t+txd1}Ru^ooV$2R{2OEC4Ykyd>D$*;BlD=(OxQ5Rl{s=uyCT^RN-$|W` zpsHre{cBVtk|Da+mwrqx+{cM@_b9H^>?&-@O#Mb<)=~K)!o@ySZlsg@ji(E-px0oP zbs;E71M26E6~Gp(p`;GFz}DQZufb`=cxR@tNgj{z?;$<*msL1; z!x;n7Hwyf`>h{8uj0pFPcAsRU_H}w(j5E=q3qySMV05Ctw<6I`f1#{8IT3qHGy^Yj z>JIur_SbWOX>P@rgEQaZQbEn_&${=j#i~34-g`(*Z!`*#?-^Xl`-db<#0kHmn_rxE z4?7I{;6LI#hPo;e}OjzBrf2SU?c=U3qr>}1ysRJM9ai4q` z*0Yd1bQL*r`s>P={nXX0og>9`B2YrsdJTk<$b?0^il_`pIdL|h2BllsnTbd-n)6YP z?@$Z#?VZyLp~Us4i}Vd<`X_64Ku5@0f!<;EYH!U2?4PBbHr9sO^<=t|8C{I;O0#Sw z+!R0lB#N($P2kkZb918hmiL$pMfRS&NVKHa<~>j1xU9$x{wCMjH{k}*5Yk|75d=@l zAz!dL zDn)r(Cn>I}MzCYQ6cL@^`*Op>Nd2_g(~Y&IqvWv(7vW-Z9V>3= zpMuA>5ss*p*I|vs?J@v?2A_0MZA6e;E&dh7IPUd-Fe1cJu`ZZBB~*JpE4eiL^i)&( zW7d&~!zrF8K}^W|Ng2QB|A$cwv+NR@Ia$x^=h#ze=6cX2#TSjMBOJ9pDGFK}U0jM& zUs2r1Gky%!L}J)9zZEXESjPm$iE-Yh!>^ZdEh`-p8e9E`n~wIQIl7i%UkCu)x4!x| z&u+OK&77g^S$N+`^1y&fkTYk~p(eQ?-e!h|)P_z2lw$5^qWojt@lrN#Nb2vL9lX$M z>pNuW>|Kn;6Q9wR%Jgd~kO^2UKnnC&4`dnq){@vrOaE!s`|x4a!QYL2`2%NRab23L z$6iaTwF7$;LBq~cM9qQ3##UX9js?SEMkRXKj@6i^?4$l!F(l`yizgn3;X6go@ge6s z(sG!-_0Oq_aXa-XO`&;tGOYUU-uPVi#)=gK4TCrx@Ub}?&Rudd+r^G7mZdoz5Wh{$ z5F`f<%3K=nXmT#hY7;~OCtvZy*5j_BVpqwkRaA74_<;%*$s4B({{6{i*3VbF-0Q>9 zS8vU9vy=JykSBL-uaJqqbhMetH`v@)h&|eHgCScP!%x?f**03HSwqIJGq4pK9c?%m z6XF*U7JL7pr$+6`-5lO2f(fwar`81`2uj%hA9AD@0YOn@qko-o_26> z_VCfp${w+-e&=v2U6;A_lAN>{+G(#yGKu8u4+#{l+@%qP&?8-(KqL#Zh=I5ABQveV>{j=mLF% z*_)?jBQ2|2A%_gaDIC{CG~ejy<-H#D7lVrG3Ll)=Wy_>a?QiJ4sUMMKC(>Wtw~;!i zUvnfNrojxKsmDmA1KodaGWNC15(bKwmRtREhmf}z;x5bCeY-BVFy=M$R=Xf^Hu{>d zoMcX6Y?+T3CbObZrse2pdMP<*uj%N0n+LMfJP=6aObk2Q|eZ~o~w ze)ujglT}Fhc{TXrMyr?hYQ58EdqXXifM!o$m&&os@)?5qkR}3^XKFSzElje-uxq=VJj_F zC&V;lBq2DC?ql(E;%y#tCZNH)xs~p(No+pOh3e%~=N5&8{aibVv#O;v7_z4+oxzvZ zdn|ijNpCNQ2qDZbMU^@_=RaUzg--}=s75JL=SNxTjOWYy^zvD4O5fILv(HhKdKb9& zs@Duz&Xd$v8#FoP^LH#wK(5y9OW5I!PPeDCZ(w;gOL9w2TXB1~R zuLrOq!`}e~NSoCV%RQvYzE$+Gt~!J>kNH}$ z%Z;%uw5Aw1MR&UJ6ja)>zsWmeMXPtNcA=dA)`+v+T3%6=iH0FYyWdcl7nM;^Cia^Y0<{|DsQ zSufYu@MAFSld#}F;@CmIQum{kXm$JrkB(O+(5Q0IyZtS5wdHoYT9}wAP=~l~UaK+gh zT(8GTWBav?YPR#6Dc(KSbP-hM*1q zCcWs#Yo@RST8dTVAfF@e1c|o-SGL&iYi+BC%>KE{i=e~;7ye*+eqA(bb@^_=6vnl6 z+fMG;fLwylq0|;MmLt1lY#H~gE4Qpt-2`mObgzEKeQ%$~A%MU&rbLI+$6|Jof*C|n zAjW>Re@9%q)Z4hZSv5_HXu|Y>@aeNqu^1113enC^#4QjDf1*>2=pO|Lkm^YT)|ja4 zw!=ddEDwaE`p2k7dwv*{f}0)vu0d7}wN^*#b51e@`fqlnbNWj6dt1x6%{*~&oidDz z{^eieNi&wN#=t2`tRAM9A^AI)$iBdefFagWb(~_g_wZxGlf*mu_{hhNu zaU{ThesT#@gtr}i_-38YNRQ1eudLJrK*bBXk_%IHe%feT{rGAvW_?N4T8a;HmC0{4 zm1gDklgHHN@r8oJP&JzavsymxKATqY4uqjR8v_rvzQ{@_J6xUDaiBmRsvQ5miBEpV z?6fc)h_$3}eaE*lx-@(;mL?tM3IyBt+-z^Srq#(iY{m@tnzWRtQ#PF4EN}P@{w@|6 zVu&njn(+B#o@}#W|D+fY;UsCm4PWq9jG2p6a?`z=x_(RUlRcAzF*Kb4gTmNFS6&)s zt@s=A#bq?kQbm#A`Bjrg(6VxW0FC2PMVR|>v)S|9+`F;h&2$5jdw7^$*oCoNc9TPe z|Km2|0B$4K=MAWFEg3Q*qX~?8z07xkluM0ieHsMr=T>_HoD=HkQ~g&DQ?3V%K{laLt>JrdBcM+UM8xlH;5 zsCyP-F~6NefL4)4Wp+O|&kw|?E$ds0rdC(O2c}yx)~O|f7`x?kjRBk$M<0O;k&{GA zE9~eQ6K8$%|4{Z8U{Q5l!!U@_5~75(C?Oq!&9Jj?xX% zJp$4(G)#ZPUGM!o{}|a7x@V2&>YamZ0%d2>K*nl+Y2sby^{?P z80YE0XgY!QIPSzcUWlDETZ9>$aqt(Os>r8c%I}_&s!$qa>&4jqh6h8}=y^?|_zS|@ z6OEg{_?bt?h4H6^UbUcInsijp6QXR95CPflVeO z36t~v`Ow-lOOO7?#7g}!x2tP#p1V6L(P8%+LR&g22SSF-c)k(MXuba6qlv&O7a_!Z ztSY>+H|Hk3MJp@<<6NxQ;oB4?Uh0vsy1#22iRJIX2xKFJQyiFrbFZ6aISCMD){1Ff zYYtuwhUs(KuFtPAb@X%M&Eu~W4B#E4;r$Rld$VMjBGWlp|3My7M!v#~ZxO7+h;_6O zy7^sc!Dn5h;IJ+TmqroiR_CwcGJhT1wm@8In`ZYk4Aa3=tF}*K0Vp#CiJ{MSkebQ9^)iRu7WLP#PDH%%!(#{!UsYPOtPA*Y&8u2*mc^3=_;);knQ|UVHAq zLpCrjJ@l(6pg(ZHljT+-3!!?G$3A~c+$X+`_B-Q?x-pF9~@QB3^_FR8RfV{q=9o0!9G(i)_q@iQ)TF55uZdK@7|O8;A)&=^3kiRL~$R zsN$v`gGhR;-;DIC1;uI%>Vx=KG@ zeL($nw!dSK_Jx6_ zoCTrF632<(Z#sv}m=)r#cnRM82Yo zN3ZW{R`#Mip;H?t=$WBYe4X#qnqArkmFWA@c7(5UgrnHWx9GzAtnogIR25|})P3d> z#FXPs?WwdVC8}<)i)IEV^QziLIL+ZQ3hHEt*@m z)hOxEwfsaga=BNFICIxgDbR$<3m^RHj@z{___-e>SASB=P}n?U1Kd=?pQf^6mPb;_ zbpcdRLC+Y?IuzE(_4`IQ1J!3%8yH851yq?g$UfZo9caZv@02q$TF4_GU zv!(no##Y?$%h688*K{5W!_@wHOnYl9&G{05x)k8qi1RNdxqm>kPkocQpw%ZwD1$0$;PkjT8;NT z`VzEwXqivKAG{DZ<<>hp5w}+N`^b>c%lt&tIIl$l5#9j+0vvhYL*euum8eH~rM8HWB5zsJ=j5$>9tv3Jp5a$LArE8&B1hIw0A>~gZqv|h$U>LIg2^Uen~9j4Q$h> zFyOnj(0suwGXxbcR8`(PH^9YgbW43!P(4!lCTQYyH1o})Q96)>vsh&oZqMQKPkkFb zTpCCm=9Si1jpH&lv`&KOJPDeu2`5#HhYI=or;LQY%JPWM&S_Y0%j9KJ;lo7Gna(@S z9FJNm6jU5679dhJv_a~|SAK#mgDknusF;_C|ChAVv@*Zp8St@39S*zo&z8`LUOOY% z>WUV~&~NooVxKw(&f5|8!(21Q2SkKT=N~ih%;eYR1;49&oa^#@Q~zpggER4gKQM^i zihSU@9xwe^BK|XP8{;2$RP1oky>{e@a3|r2L}_w+hNE=*oxiCb#39z_G)?S29k)+X zYN`m$36N~ezy8)1yy{D3#p;HaMeh>NiuYhGO3SD3bGah78^Wumm?ED=!x-&ulC014 z9RKAv4md)Xt&XtZlm{S_v(~8fitcGm*d-UkhxS&?V=n3iS~@^4TU`7dV&I6o2~A3` zx>471h4gDfITcfTi?1<9Fy}oO;!o@{+!6Zl<9;W}8Qvob=ZR#_X|wz19x-V5sx=M* zv%~wj1r_=OTQej0j%b9I6a2R?aTbM{ia2A z?p0z&#BYh`$Lm4z9EbV@TH#}cgt@qgF0;6;hp1Shqp$INz$EAENXU90BjAIYJQ%yyc+Y{f+^xJbHCJ^(|79<)feP>^ zE+pOH#@a47uhDsFTZSbjtcg*B4Xq3o!|MvJdmJ_mM>nd zyL{F2ITT7BA)TVggGU;1?Q^RS+sJyv+>_abQK4+J$wysK;d_gBbgYblMo@5&>Cr?= zgtRKLg%)py+Vj(DTI6vLgs~bTxQPpITY#rc6c-#fY_qBAZG4xqrNL&rnva~A=C}Sv z*zPALS5C$LzM8~oXb0W)}s9R&LH^P(Dd;AULm?tUWQh2 zhle4XCorW%AeU0zdTd(#9}ukC4v(lU3ts4mwlOoB8X2&p~~RC0`r4 zf!dCey>dt3yvW<+wH}eTB^HSs7R^7@V%)_O|1jAEX{2nAc5DRV5bKK(&j5Z82&+8c zYgcTZbH(Pj05Z zG{xDVlb&BYG71Ra#JJVT#rBw{k6mTJ3|>yae`cvDoMI_0@%r5CgV~1u5KAGAht164 zar#iPsq#xsuV*kTSFh|tTNaT#X9btJo8aOUi^k>Cof(iEgiY zSegt6d*co~f4u2Mkb!KHn+CVsJ8KwTEB4aWmyrcvw4T&Hl=lb z*5qa{xAg3kd^ND{xTKZWQv@+f5$GT(oSRjK-}m?suk~6x{z7oIGi_hWy|`=r-eRQu zr{Uz9HU{@3_A~*rdda-(xbW>{xfVUajkdk!urg>7Fz2tVlGkm0?x0IqU!8M^bpak> z@|VkxKm?s|zzg*8C$a5RnawYMWrkE*6I9#Ex+xKB&D0+}aQ)k7TE*VRljpRI9%+Gb zb&R)4$gLI_>E_M~c6EEt7Kk#+Bre4DT=pk6JFQXK?d^-Ln4Z`z+*a>?;16HzjpH-f z@y&5ML@T5T7yXT4#n76?j*CHas6@3SZPZdqm%$+Na@oVDmI;ftA$` zvt-I*2RuG<`!PFZy+66OaS2Zu-YMa--%V#21tHfuhavEWfGpjSFE_D#>h*gOXNeOX!?zaXXz+_UY{Zc-~ z9Oj6i7b0l9%%Y617qURrR754>CC7%BGXV3mu}{3YI_)**>h^%BSuN|PMB!~w?KlEh zTMYTc3t$XG3Q0S}^9Y8s$wzTkn?9ZV^|@=YxL9nV`qMXpXSKVo*SVo@9WooRz2$l< zOEAct`BhM?QZ@Lc-cC;L0=~4M%IUdC%yE0@A>DU+iS68xTk^&n7I~#W{X*-0cki2f!!z2y4|dGvs2;rJBDuxJ>KYdM>>t z4Wh?xzrMQ)xq835g->zYs9rN)h3T%)ujj#eWQmh#NNMH4&Q57sc6z0A{RJ5?b$jOk zF#~DwK_UxFn+p_%T;ib{0*4mCFMV597rr!U6gva3-yeOQI7w+~6q56{#{Dp@5W5;qN=28W$vHh}bBT%HNuk_9#CC?J)3KPje7C$@o0mcbR4Ttx zHt4yB$8M?-@8%@4Bo~&G@b)H=Y@txLKDN`LtOMxfh0f(;)s^TpOegeFs_^WCbQ@mk>C;O{@Ze%oAb2ZZ=dp*^%yk)j?0KsD`tobSXDKX zJBn^&nSWTQ{(V=I?OZ6+d;fSB;f3$Z#nnYY&Q6})O|LychDb>5g8?qVh~;dWo%SW= zDRh8FM0G3M`@OITQEHbWiSA;#2fOiQNS4Q?=M~wyEf=zdDXg;r+WRJw73ceaDqTwB z*F^C~I^kzbIwvM$2_$v$329s}bvY+bKfeTibMaN*3j0ltkI3vdc$!J=tzEQ7xkCH_ zsQZ-LBna;vQMJ9vTS2dE(R-8S4Xd+zF7*rJZG3ob_qY|&N?#H8Zolpr4~8YtR}?=j zzOi{Dr;qvGBC%F^+4aVEa0#{9{c&(!oYjfXLZ~lyr&RP@p)tl+L~K4ZQyLcz{7MTc<20tHHW04p(r0mHV3qD6=QLiNl}6YaKSeW zN#wibAu{vV@q>u)$uEPvJBSI>xbs-St6prK)m3c_mcl-dUz5<7l?FujY7-`Moov zi3AdUd5mD&MuujpRX=50%g^jF;3zfX%MAS zysI0D5satFJ4Dwb8?R9rZK(xaZaost)40R=T6N>VVrLmiQ3C65JOGsGQe;aoJ+3;J zI|a|z95>Q-@Dhy_!xmdimym6WJuwFXM*GIHTwamXNm8tmaVzdZUq_=1dR&c)vO-Bh zT_?<$74+n^2wzor(43S!E2K^LqH#xb#MjPtB}hcbI1=HLCSWD0Q#Z-n$jpdD%UC_{ z-@Bbpxn7vkL#h?wN1gBu;Qw?iBf7|0q17Bv-V3x1kGq5CG%dLrXd7aD_P%koWkka> zaDqh?Jl5m(?C}X@#@IPrW#PUcD)${it=u0|D7UaN@bpcoH$2s70Mhveb52rh-Ph#O z^>t*!dH(Lel2AR$W4--VWsqKQ==DZwPv3s{1O8Tg|7#|+!U088byOU>xp2V=3CMRt z>I1U0!9vyRMv;!2(KI2{QdIs@6moUnAMQ*cRWcKZQ@kpPC3ZE7hTHBv?2y-TdFFGC zFOHEQ^+eb(Sg%R%iga?=6@2V5>RA;SLSM8`4DO+a*$IW&G!hw#dwRjDYUy7So5mX# z@b2K|RNL6hne=1Rj~3C7xA>E0(ub_=@IDJJ%^wSX3mQ6j#S{xmY}~UkE)7^?h^l!Vyy0 zK!wHc5&0LlS4m|{wy3*9VucdD*T1LF*T53z`K^!1Oq-R1R-&=_5NHEZ>&!_w!$HqP zrwVg=VGhO`gO|y67@?^8Y&K+x21s3XOZe>ja_{N6P(J-~v{}3LY-XCp7uJrv0H>Qu zUm0qHKZ#p#3vbk1OSO$q()uP?KVr2D5{3KjeK+{l12&{$f_?r-S*%%+AWs=H70ZJbHx*9D$7&65r?n z7dUgw{tS3U@{@GKRKm=*Mfj1^vGTHS9nrBoIr$9vI;A7y*9v|D+X6d18l%p}p5eoj zbNE8$6CFr~PxtKcXcAJr>D(A!myRuIYfM%!l(>^C?6_(5y7~1E#$QYB%}gB)R8v%< zvxFKOVjYVzUEQP{hJ}Mxb97v^#7|^=JIMi}8pU9|Z~5GOab_vb`gF zHfyhE>4)pRm1R@B?=3=!z&p+zs1zjQuQTYQGb8sLQ0myRY@Q&1XY(#V=GWp(EO&Ap zb&@Z_D7vYaYbTgNOrs&`vcbmFS$#WOXvJt(kJHfaklUQt9 z1h3A=8?+S#%J{8?5pvFFDraKNuo&E{)1DVBG^LIHKuRtWX{}Wu?5>TlG zW-a~=RW{_(!fSK}q9a$bEt-S=h!}yej465uYn=WF0caA%o9OuB-7>eOc@xa;Ol6OE z?Pt64?e#5TgO=m4H!Y}i+R!ASESHW1#*I{kKyy?6#&zkg!b*bP7hT+|wm(VD+6mbs zSV$r~$fdTEfxPVxiFD29Y&GhX~xjdh1*o0DK%)*}fa&c=2#^pQQxae;$$kB-;-1O{pY4wa_l&w|pHj`+?$B0)v)QQCxNEM}8dX`$Bb=7K^6#m( zTbQyk7UT<*C-+vd3iGD#lhl!bcL<#^qECxy3RtR~GGC(*Ws3p*km81YsQmss(KE>^ zEbbn4P5xZAW`=yR^REq7p}Z}0PgBZhdfJ3itw=#c5b};kre@)23cY4-z|(GSXIYTa z((Sbfc$VHYWfVR-N<6hU4x}b~f+C3oX`xYiRb^0=cm8N+){J1ur+ARD3jqZ)ru9w0 z4!+Y<9PWC03YsNudq@wqzsH`Dk0cR_|U^Ep?~En{%) zo{Qw+5hijbQYmcEh-3&WAZe~z#(YSqy55hwE5Zb8J&8kHuEmG!_AM#*Irb3mYY?+5 zb|NX*?}y?lz2HprP#|HTje6%s{a5?GvBP#n;uq|{d7t1SU}kD6goT*DH3AP=$BbdX zR3c)nFe(LYV))AhO9lK*@GTLh+XQR(EX6Ir=Um`~yp^DEs*ehNdhac1UJ^4<{O|k4 zosqrj_Y1G^;Yv8`M;79=Vfs8Y3HutyDZpoF41DX)0UQ-1xe^mrwr~e|_hBHeG?Kro zy}w#8IlC#zM^)}$f6P!e@1Hru#E)SYg%xqb|Fwp!UKh+JwvS1nH#R|BlRPFmVJ?RH z3Wi}}7t9LJN&o1_HbXK`$N+>H1U$c|Bq0~e-)xGCcw2;Qd| zkjxvzEhPD!`Pj;@IcYg;UQTin&)c;<$1q@ zLQ#h8Xkj|Awt}RIg{0*UgPUswS^0s5^o1tLi`?|2|6jX*gGKoZ50-hV3Ysn(F2FtL7qp7 zJZjv3vR^-^XEl!Q+@=z!d>$XLE-yp5B|3d#w>=1W=*LxPt?C!E2lB%^pwgf?yvU|iF*E&5ZMM+9)ACzsgWaRny7JL|YOg_l^@Y2=`Swt2;ja3nu{R6WAr4`R z!tzeURr_^WKd1Ls_3?~Brp175J~LC{hpz>88CsZ?b<@E`Vt0p2wm+gr@l=&i{q719rx;JeE1p zND^9Nq%(Cm)=`_-D8W!(b}>D*dpu|XuJ;)E%=zvzK3<3< zsU#N~uwiydg!jtas+n$?D-5ccp6Yi}@HiS}p*&3WCaX$2FvFceSWUOP1p$e%>L(KZ zO*Jn#Jxe6>9%UZS8)+38WlWZ$y2r@EjG^R2^3 zy^_aXNmkEf*NxPRWai24mJonlmnGMC;Rkc`d9;Oy!DWZlFz8xY}ZMfq!w(G>lNC+=wC zsXKRkXp8J>RTNxoVP?ZeiQ9tCYbFM?=4-)PBwOe1l4a-|-?%S1m6rPt5*V;~(LR6Z#guG*WyAnVP>w$-a>6$9>bQnG#wAQE(IDH1{b9 zOd6bU`%3etjdkPHE9;-i2&eoJ;D1Sea~R13xjz-mf3?yavsUL$!+FWn+Qs?`={BzsoZ2Q*@GdB^M0`qNB9 z{k|G_QJi!~v$i-2yDbl_*$;d7IJ_oL$p}Z1mX91OwvnNh9&}UmM9kFL!u9k1hqgvC za9rE3+)N*=dAeMkeny8ddN1*`See(SayWHP^$mZV@ko+|jEUeT4W~R~>d>ZU?~i~4 zr%K7S?l|MhRA8G9{IW_5pc`kg5JO$*@YB6TM($rK;q5Zc!gww>-W@Dhj#{rwEA8(I z6MZ^*$I4h#uz{&b+~V|upufIq)k{{%>9zG?%Ka4oXqMVm_zUCt+l^iuv2=3YP3GzT zobCszG7BncyG$LPI9(~9_78e+kwfldGO=14P=wohHUnVMG7zH&YVt`G`X9= zh)%snL^CNzW2qYZao-2inz)1b{nnuUx@p1pY{$X zSv)qWM6I5k2jPfd7tlK&Pi&=O+vB0nq8wO7IlM0pK}ZgIIHKu~nrZo2dByVnW)sct zl6heAUUzdm$QWH4AS+^2Ql2WgP0e{!K77*rvBuU=nggG8a$sz+&zcVWcb}V5tI=kS zZWS*^G`n-2_nD(Wkg@1N_28X}l9||)Z5(>${L3Iu#>{|q^$qYAl?di&>I#RS$8P^p z4iEmc(5V#6|1=wLE5xzkA67Xn&YYb6=kl`$j+JZ0^Zu^i_w5Suf7ac;nXdWQSN1lX zwf0vJpCzt{@6QIOS2F+4uL;YxssB{J&-DdI|5xMT{v3OlpaJ;e>V-8Q>9z21<;64g zr<8+hR1QFLB?@Oxc~E%ETMUtTA8Jd9ifh9uUw##22kk zanQJAb#x8xwr}j^({xaJURm0fc2F%VdN)?=Bh^R3GzLkkYq9kBEo9F*V#s5}p4-x2 zSGaXd$RHn)1lH$gT3o`oP)1-+g0cfeI7HXHtXg(rQGviD7ppMjGnu2Vlc!IuD?e~_ z(X+CS_Wir)Q;7wsKUoh{S5*ZQnH&uq{)i9cM9rmOA9DP=Sg2nvvVwR}J5}g(MA}W8 zNv5&2UYiai;I#iRn=(k?-*q`Go*br)25F&(`>2fzvP-0LL6`8D|0p+Z#Bl?Qr1E?V z1pR-ibhr%0{>S5(?(c$_)eOf+i2xY_#4;s_{XhHHI;6wGU3j??LCeSwfRTT%r%(TO zZRS|-Z*!%8mmc%nbueZ`8GHY~IvR6VV8zbnSX=(P@R5F_N&oOqsm?zdxd?jLx?uxl zF>%ET3h?xOYW0vLA9nXt7$iY2#e=GOqvE4Dg(W3Ro-cWP9v}MGgi?7;5T78omd`GG zJCp$zImx$wzgTW!3bU4!%3BAw!)QR$cX)cof5y|KzZCt~^Rg*?n_SQWsK{DuxY(w-Ky!qM&7=c~n zAUBgWc{mJT`Lyz+e+{FoeUVHbk8*E>Tg8KM7b2A=e0D8qt;?v)vZvNngymr1C!{x# zrQaVoX_U%UpV`DM{v_N~|7tdrZ{p~dv2RnCLAa#vDN)d;z3zcqC+|n^Y|^jF48TJ# zAnn=E!3Th*-X?G3fhWGJ?Z^gk(~-Y`jn+W>={1VNcOjVFm0eS8^W*e}&>9<% zapp)4DGd#cnZ5l>P>w88w@sP8!@t!#-Mp)HF(&nvAn1N;&7DdbJ`6hk^8vrG&}*WH z0gNudpaKD=DlFRaGPD~OjvSN$Nw!M16Ez$!?{c=Ke|GC0gcIJlqm%(9nn^GJgWcWdzt=# zG524y=p`uHSc6L74kS{2{nE)zlNaUoP7r)SYcn2Ci2?mYyF53kDoRqSVamc$G8DUw zy~3p&Vyj?<8Rn~eIfF$!z5Kx1WO`I6(Z z#aN2#q1^tmi$s2wLZt4O~eHGGB*0ZT$qZ&P_s zCkbAzOcqU|?N^aP=+4Y?bvw_&!Gok3|0$1^2>uv80TKH%N)4tcrPTXd9Fbq6f3%gw z7&+xqNT02f!X7fU!TUUY{3;U$$_y8Q6a2`~KGlbEgPtaa@_C$W#r5_vLusP&Xdfc6{$za;X-W?}}M<4_u9h++F6i3WSAY8>M)= z-1rakiH25CNC*~rs{~6@WEXfpN)QX+#PUXY_KONAbK%4UW#Go3@yf{Wo><0C3>w+# z1KgzPq(qOAT_5Gn(gb?M27v#B)Ak{umr}k1Ebvt${0B6?!&C7d#{Hc;1eLY&bF%H- zyLafq!{py>59IX(tWl5^bjWhF@D-3w=bT;q4y{)FTri%;CXg+OSlz}8h^R~zC*{(5 z_NCsloGqeZ1k8{^s_(8>-COim`5X~WqX1Na>0Z<<$+{2CQQK=2 z=OTl1isHarurbmcj*T`ws!7MauXe#!+^F<`M45K0eA!noPAQ;yqrOE1KqghX+8l5F zELh17I3UpoT&+L+PCyBUAu0=2ys84S-b0PnSj>obkLK-woTzeo>MGw_4EBTtqk4M- zy>h4B>m_@S5-(6zHOZvvav!O)9Mb(NqWZ*;`5*e12#Pga_d;`!M$)TLpp zk(WewhWLeS3FmoY+;cpo%=#0dvbg(Z)RY8r=Gy8cvhjMZr?=npk znbu5P`&mj+hp82u#V(Ck9^6cbt5L7>#^X+Uik!bmst<_V4uUrV(^JI_>b0^5n@`Ym-UOM9mkSFLsC6 zjP)&WG7TbcG^mbuF%7k)47e+IUL79_Lyc?;JvzJRC61g%*l+S%%#KxIre)p0?`A?5sfU0&f)Tt;0xR z0QCGbqnZqn~d$9nw&aWv zk?Z9$bx48%4~Sn$pieQ>`NIBeCUN`H|8|c1Yk%c2;r%~Mg(UEkOb9UUNfx9jacvZ{ zH+mc8e6RgaopQPYZYJ3A>-icdIN^q8vBsOeVwx?v?5PL|9cLeMVA z5Kw+74(RnR3#ESv5`k7N@^HQO1uXWh?-zQjb!;g9(L%*z$}kB`9yV@GqVg;%rxm*G zk2|Vfr@noDb7y6EWoFd@WJ@9MS8)z1WqIDY+uzxR^-+{PsA_vcJ|_|QmAdevZNxU& z=esxT4V|&?g?)oS@a73{-J?Gs%ET%e8&If~d#5tVy9Q$}X2o?!yt&YeZk=w%YR2DN z|IK56=H1z!dT5D3C<*gUu7xz8C4+_7dc`1?EJ>Z;M9^2JD&)Gh)sB9=4ujMnF3+Ra z`t-huB4LyWL|8yCM7d?iqhjU{N-ZN1e3%J=-cc@QbS;)cZ);p!U(r6w_7)*+b3xMa*!ZvG>fX_dMHN*!S6B%*HH%Zfu2G%LZ6m@tu%0G7A| zx}LblPwFm5{T`#zF;L$2rK)2b&9}!my`$za4#F z6fmJQGE-Wc-Oy72o1^QWd*PJ#)yAi4qs9Ib#6JP>(JSi!xqQ)nh z`tp>b(k)&HeCCT27_2}Fj@5>R8E0T;coY`!nx2+Im_GfeJ3$2syJMP5XuM+*?+anx zgulIPGUbn9hM1~Itm@Mz04`QmvG@C0`qu#A7np}i4PP!~R?2&tmsO@X?7HAog&ys0 z^N%VYW#192a>gb7$_O!Q-(Ri}@IO45a%Rr$*{uS~`Bf=gh+L#7g}XAZ*WO&!^D>Xp-;3~;M5Nm<&NJ3b1~X(5s7m)p|8E?(3&4Jn*5i%TV|fJFK8|BTr_6c4RXg8ww~^&`~hxW0zu$Z z2H7TTP=)mPKCG;ciS@Feiu3S}EcVF}B!_tzYms;%_X=`goBW4a(Th3Vy@I78rR;6F zvl5L^7gP_|PLvJl-yTMcP81ZV(g?S~3Iz#TxE+1)3Ey189vr4(u)U#q%fuc!@4rQP zoPAiu@+tl?0|tg5yxz?kQ-t6uF}nN8V!pyP&U~SxZr5dNKc`z!jC8PS9EHQGUOdJK zj$Ff&(bKMj{UcoTqyuYfQ)*sRqY?1@x6JR_%khD1?6KINsTh1aSN zaR0~Qz(pan*loSJVwTMjsn=!w@7WH8!&r=9Vfv3_(5z9xz(RO0hUZ`huY9+QsW)+yD`LO{L9)XIb}R_vutJG${+!2M+0aqHIt{rguPFqR9UrT1-Wv%i*++PV|#VA~Us>1AFty?;!bByl~*`R@$ zGyOxf|K-h=)3;(jnNm~*q8GgGIP*No{+%^w_7_Hq+D}3M?e@;AZ{_^AEB;I#=i{E{ zVAcNZPb>B0=Xxsi_VhGM<-z-u<&HnZ2ma<@{rl@_z-QFUU}z*ZEoLO~ZXsKWDV^(s)CU1i7wbbG(+g?*unO|8~?K;Tt~d?&*4dLm({m|KIj#w+nKT$PB7SE zAYavOjXq-r`-DxoJmZc42+f6UzRYpVM7qly-P)FB;eU5ic5v0rldQ2SId`ZI3|tyA zqsJh*vD-KNKyFdGOKYYw(1ZHu2Z1`g3GUxp`Zx7eubHVvP)ON8Z=qDQ^w3Tw3D zX{6hi;;qy6u>L3|KYO@8%0IQ4W{L;6<_}p2b`z5hd!S~@zOP&VbeUhd>Q$3uR3OWb z?K)&df0$*fiL!#yWBm zz*g62J$`DXz|55P+sv#?L_8-_jHqxUk#oSnqt^Zc84XCVn4BVso!Hf>S6Y6gT&35v z4{S0ocZ+Uzkcfsq z{wUJAKxvjUPs7oWkKThT(Q9IZ-PFbzuTU(?B5Hu=qs+A|Ru0SYS-sio>XPpdVSoq&d{u@ThCe^M{s<`uDZNaaH-Gov?EynANoh;PbHiUZy*l1*Yvz_ ziXHu5e4qlvvB+0n-n^SO9lB4YC8=-{)23iQG3b;XGP7$d{oqa9H=|_lXhlEhYHwMQ z7Yn*O{sgx9Rp#!9@yev0-PuD!4%qyC`6_o0NC?ftZJBXyMJ!4RtdYo1@#_BuMjZBb z7dS15a$Rpl1zbdOXi45Z5bA5|I4Z%iN;A6OrbsP%1Sl%nZcUw7vnzTmbKgn>y17LQ z>30Y&_|eq1I@{t{*Xj_*qTJx_QH2{>xnc?FLN2Mj&#qkK$h;t(91Wc3{7=^Ib^nX~ zhI`#vn38{Z9Jd$*imSo$iBKq~PzrUTiIyA-5c7CH;i==7V@T)^&nYH5k)C-5}(pr)9Q{ais%f zSr#BdvhKr~=`_fIh`b7AgBj$)(g_$50}!ivmgTNE0!zr!d^YqTHmS>$Xw&?w#*z!i z#z&;ryh-|U<{4SD|v9!PhVuB&m94XKaKYNXz~d%U=xXH^ih}&DoX=I zz(4=j%nrbqGgGWr4{7&3>AaNA*;;a{fbnaSH}~ZB@RpejxZpgaWHbk1RK9h)My2+PK*5R|dnBD`!{o^dzrHA%+o zx5>tkT`rMt64DbCn4|KO=Y;cJ!^vx7`Fgo|DLfoO>ra}H_-2f@#}DBu8Mx|B>Zpvx zslLQkZT+-w&`RZmff|Kw{vPdPB0D*c9|PqfVkx0d9zvvcP)r8cVPmY0*8=P6c{=O7 z7m2o?ZgFFG-*HYdb_fK&>{Z|Dqy%JEzyDgSUd-FvPoUQUUjW|Qll0W{t6;4q`shq$ zR{mr>A|dV-<)?>=G%cSwvYG=yvmlh@RNb|cRnx@0W%wS8pGbsW0)=rfzC_y%;TtOP z_-XIxyQ`h{THiyhgXz|{gP*MdgtSrq>`5bUZBMG|OT=P@jx7sa&7n>!JiS zs3-v+MWtw9GSs)|AeY@ScY>dJDfp+&7ZxSwDh}CG))ExHHvB`z~j)#%f40Fnv0e?+|I3K+?y*)Ycaw0nfic z31lxhavpJzW7amo*w{B*L>egDM$ehu&a?~@o-?uXIUWyBhWGzIBfm zp^2MARgG41L&(x<0kv%TytngsY?v0KA1bx@KaKB;7sxT)*F}gOky3BQ2p` z<3c-f%9SDN5t3pb&Y&;HaT2*){ZC4-p=lPW?o%%&9+|a6w|N}blJ2&zjgs_^F44th z`F$YK7A9u*je3454(oa@!xPfa;FYMVAbk|4@sK{*)l3F^>lA86_N_&;IN z^igmK@$PT?WjgteW8@VPTLsz9qIFnFxVvW5*925NEow9D{r}?Xtpl3u+x}rfdX#{S zl9J9bB}R9ObV#=--AD{%gn)zsf;3Xn-Q6N3(gR_HbT^Fg&g*)f_qp%ifBSRid7MXl z;`n}lWiUHZ*32qpdd8X~6U!&@;rc+U9w>b5tA|uBI3ytcH-)D8+vYKrNtXqZaBw*J zGk>&J(6bKRP)%ExqQI?7EMIus}^U zCTwX*rIhk+*E+EL^YWWUdeS!{j6}N)BgNW(fyD*B9dVgK?xMcC zrRa--)KY^Npns4-+}J}E-=QO6{5rDX~(D}f0QwkxWNvyrl(0?3AfIb9vvyD1K+K$QGw2(8Kc2$r> zRKIxIghQoGZCgy|+FOWdOsTzw3DP4Ux}=-AnQpqU%^xMJ6k(1L{RLX2ePRd@b9sG zm5`$eWvA4UI>Ux1pHHkpbnwP3>^ktE7S|#7#ObisoPkU!wtWguL)2K%;~MF`mP)#N zt8Zat_Yo%dcDD}a!~a*S(0$>YYPx_0yfI1>s+d#H`UvY4HZIl>lQw=%MjEj;4%el( z!NVxBFJv*NY;r>e^td@j*R;{)C6kyun9{6r&L&>mY=LT(MM+h}G7&n=@!jE==XGe# zXSL;s7S`##BPtMT%7d6COtK=vd1sx=+5;NxY&QG+S;5G3yj3InCcf+5r*hSmOq1xl zbVS7dyPCbY7M6n#_JJ}j@DfaPSlM|$~}MacfKgQ zR>r4m*pnX;hG(zET892FU~C?8BII&Ew^Zsg7f--Z&+K(MwXkh$*`07-nvOwYI1Jpm~8Pp8f^OI zn%U|pe3lZ_^UThC!{mxI>|nPaYIFuIC&_E!++_{r&NPBHYh23FbKq_(I{GTyBWqDV zAeN~c(x(q3BHX=+Oi0~vxFPk}=Astn zdI`p9Gj7Zo*`e8JHG5!k*(@^rQ|aqz@=?H@PY)rm#;fieZaV=V^L$m5`dr>#lGY3 z`|jAOr*igsHdfHrz$-)qZ-A;?s9&pLzX3=96mDADP~rNkCElR zF2-(u+_;w)?4R|pXgjXzb_Lw~xcdqGSD#-raTSo2!akuH6d_v_G4}{`@&Fi7CbU9{ z6)>;75j)R8yh7nAg3`aOwTldXbSi>fw=PgK&W#u7pU#F&xUmMM*W!E8&DcSB?R@{0 zb%JdRlO`(Z-puMUw6%|{U4A&@52-7jbCaDzx7i8kz)9d^jf%jDc{+Y0up46a4_H|5+=od$ItUv6Qf2=< zw3oD=J|}i#@S}L{^Crt?G6;kqCyc~CE|HiQ!1-M8*Y>*)CpaTmLckjI0j-3Jsj7J0 znj5;_EtIPyb5IUjGV@Mv_OhiwJ-k)fOfC6zR|<0xfXZ*}#$`hyCVkxi{s(HrphSj+tYAlQQrU0p8}1so6VzP}eIhs<_tkfcv4MM~ zWW~+O(j1qNnJc(3q{{oV^LKBQ+aTG77^q>}O2udOa5jnbno5cD`n-4P%6B!(dpYom zRF@&dtHV)ij4;`$h&+;y>HOn)cIca_?$xc%GVBO#6!?DQ(>+@7n`?hT@S^#$x@X>> zlRkL39Z?;Dom7o93goDx6otsL1;(|w>0`Ns8HnVbX-?5_T7h3WPrKh4m`ikxl+v_| z+HzV4QDozLNd_tF7Yg5O!N?8${EXdXcsTTM^_raEp_UT;ED#q$9pp4{kUg~$E zwMk0>(6^#}6=%kyu}KS#e0fmns+-VJ4dLrC4sZovYG8EILKHPxH3gEO$pQT?bx@x3 zNcBVI|WN^8X)5Psb6 zsXTcxgKB$#jXjbb#0lU9H3+sOP}@$&3a*C;<`0&wcHyZb$bu{CxT)o^!>P$*8;QnV0X>Lkk#NmT`N)|4W{<<_fL>jsuY2~i?s7-K6?6RT+)OEg z@#EQ7H}{q-LnR9%TaLPlt}ikPer}HiDI%FzVE9aGzi^r1C0`!NX;Jri0UxBxj^Qfe z3Y|E(xhuv}%y4y#X3hL~wY5YriYZwzws}rR8tH8k_Z@>htnz5>u_M3KJnx0vXeLP4faR9MuS zSi@yBZ9aD^%Zrzqe5K{7mX zHdZbnd8e5nJK~?4I4r>b>Fa;zO-F{7B0{F2Vbf!2t*?`3CEsAoF(~Fx{_@X$hiCUH zB=?5BN}(tQ=Jr`sILE`y&xQeub6{nNK#~=fydo0r=90t9`P+!#cF&O_8T*f&hIf|_ zx|EyH741(b!w6CKws)HIA%Yh?;lN0@Olvk z#+>!%Yt7+edEkQZJILigIw;cgay0yYry`7U!Czm(CcmfP%pg{eUYR>ERxd-ZdEvhX zsKa`O%b0jc1JU=6c)HpZuNn-W?V>;83e~n@u~FcIm>t-`)*JyVb8MD~0$Cc)dz^&n zk7^hJMAqTv?woigZ#4+kLcA9~$~CuTpiU^&YfU&Z5<>x-r*2I?ce36xvo2EX8BRD} z*Vov(kmHhKVx?r3p6fm`%N08^2csrfF^mdQhlhxAnn{3k%fuqn^E z_lMoR$Xdbh)E`DVtGfFIK4ot#tSZ_rVSfADM%B4QYup5f4^irOI6%DY^aWRaoa@Zw$s`6RFX?3m2djAjWYvlYRA<8x}TcByj%_dLC z;%vhJhA!&}0F?b+!Dr3GI;uJ^(L)Z==~8<18R<%fT}J^eJ$=^+49Ryy#z4qYbzg53 z1s)Y?bd*@}&@Ou74-OrdH9g7>Aghv07?(PNXK0twdCO2NCI)RD*iCNsJk;c@vH0#E zYc&z%xz%Y9Vq=klF2Sej03R<(-@)rG6(ej(xf)4%0Fx~W@6fp-d zpS?gVTqbH6SYmgv6j6_k#4_t^LWJqWqnAm7n$(0qMSxacveh19Z!}Y1OnemAAk!@! zh@fkj{}JgXMNCmC*VwW?BSk6Jud z#roY5b;8E4L~4Z}Lrx_vtpS;JM*Cun#ThD$8x2v?yxSSXpKe`AZ{yRM2L^wG#su5& zPwRGlBa6&LXtILu9$!N(nu6DupFNmWee1-rcCG9^BskW`X;YsdY!J!+?z15WXFk8* zhBVK^Bx3opPZTZgba2;xH%d_`K;rp}oB28O0CwXKjP6f#(TAoF?Ug6DSR*3xl59>j zE%y87*Rz%klSqoivUeMflr+`HvtB&InW`*Qb)b=SI)n#JzE;cU-JW#wg{7+0|w#%ebtPJPg?+ z`Yop%*#w0ZXuN`s?E3p~EgBd`Bc+eGibW${=lo!b!qi-hF7k{+WY|n4$Fq{ir#+_; z1e&CMi$rB;={_Y?Z7fe%tqHMDqsAIVds+|r80*&ZCtXe}(J9j@jcrE)bdClb&Gi3e z?fXzX+`jAcPkUxsd;5IQ2L@&Z_v-l#KeIt7XElH&wztK5!7g)rH69YN&zC8E7}xtH zMAXf}ul??Ze)+%{k%^=4_z;oVHD*1BgfH4%8iDS&Uiw-4)jJ9A$qV7*gm|(0_9Oto z1%}>IA)UE{0S-#HEm*p!M>6Z9#(RyqI)(##g@!A2>GU~=WkfH29)rs4^&5s2nDtXa zXi(z&A&D9zNZPv(GKMc=rZujY8<(+S)iX4FAvUSluaEuc?Ds-?=q4_bNMF%)qaD=O zQSf;J2Kyxu5fu7X*c#NQV4>K5fJo9`)ndJK8)klMQEB!taJi_1FVJH3trFA-i(?96 z$s2-CjWrnbAYnY1NkQ~=V3#?L+th=JgI4QU@o<7Cv%_)b5spM9gWcbRhVCT{**E0A zy_9kyNNCF+x%tz^LbB~)k?f}ZNWFHRU{`Z1CDT4%sFu+62Q(P@-W8#_1pr$rCcVj* z#)p=NMaZ4Fffj+vG+Ks#U>=pLt2w7BTzwb~)NcEETr*QErq?h^lqzdqit&Pibw@d?1&r(>btPH8 z?>k4}W!D)4O5NRO;-WCwq62IV0QHg{P~9sO<4eXYdme(G7pp#R*}Y9y!JzAyLA8i3gt$Bt^8eIMdF==DD0VZxI7VXet& zGB!$35bJ$VNS9#YoAh4YSX`1+c(KLR1!-u<;5VPwQf#?x_$tMpd13^+YgFrh-o^8O zXT8OLXFY*(iklz={C6#T8F?VwQ0EeS)BjO47nq7KffaRxX)mv=*o4;IA_SQ;q)MY| zl(**rnMBOB+&;p3YE!apZb!#}HDI zWrH$H5-hG~DBi3VjXK3hf@=w=hn@t3&AIneTaV*ERH6BNt;H&?^@@-R+%4X-(VO-L zGo7Ng`Q&M=3_5y#s4QM7!ECuSn#9lQ!KYx|eNWeW8F+t=xD{;3s^*c{SOE2+Q&aT? zoF@2+3tmT@hEF;#PODsMRcVMc!Y^>)OI)o;Y)3Od;0GP zs6T@lG@#AXn!J4a>a%Yy*(N4uYp!_;*2bNEo8H3z6V6$+R|CkZAQU*dFN!uq!k(5YTui1=yrfQwA2WBE zUlP(SOIh%%xA6AF$(*8G^YtgUGF4F{K(-j za1W-#k4qa|`?k-AH4ED8bBBpjT8JDsws^!G)=HxAGCuPHK%(FU!*73VjKmqR|yYN4_`acrE15D@LO+Y{1* zUnxU^+0O19QyC_r`Q2(N>EeQ4=T0KUmsxFjnD5v|(U`gU=%1k_yZ(M+`#;8(Jy?YX z?>CATGh7x1we-s#mMS&tNpnb?qCX*5RvEia$^u z8P6yMus>weXhg-olR17%%X^>B(s1I>adx7|AaoE&WsQQAvO1pqSZ*>S`wDMhE;;54 zQ#Qo|LCtN(0iZZeo(w>in@u`D{BwnItF(m8{_i6%nkJeyf094jB74bi+AW*BkYWRU=a{Hnag9 zEX#qop%R%7Lbmxs@dQz$BStp#1Wwk7)H;MzX8$1mZ6Wk{|F!AeC+G>W6<1p7ti9|Hsv{~cHzk;>ER^rRcGJ_ z^+hk=barLPnQ-MlcklBn{3Oe?gyQ0;D-L_tN$34~%j&55qj8zb%isaHxt@&ZPJEr4 z-1g?jtcvJIrIcSfmPCwCleOse4Kzl{bZtHbehc{U#<}ZR^`VXPbR+IDH2p}qpNY+6{j)o-z|Ff90Forv6uG05IYl8>5 z$@k~Y-!scz&YiNe!>oZjrN4uCN&vt-zdMt#mdqDP0wfG!Q3ZT*e1up9a0L^B!OSso z-wr}=lvfVw+GG>L6SskIYY#R&D^5v=SeeLulGc1u`sE<%;iJvuH%?}6BSbT1hnRjG zzM0)O9Q^d=5A5;Bx8%yQlXaSHWJq1L)HELK?f$B|bd`-~jQ@nJRwDDq106?kZnSa) zD2QRrcX0oRflD1nEHK2y0IE_Cj?qZ(DJ*xN671=7n;U}z<9CYi{KVHOvfCsB*F>P{ zvk7ti)baMo|oK>5`-%oM=COOk^i2qHR_@3t;En|5n$*s(&5k}=BThS zP3zuq!<)*5+xL?%NwGU~6&t9Ja{iL2t6-C`DljGFqI0Y*dAU|$7b5O#v*;gOF8;r5 zE;Rqsd3K+`4eIE>Y1l8-9%ye2Cn21SpoK&Q7~8OdxL`l+dax?j zStHFlB+a9~;bA|o6=*;(7=KXh@|@0JY%t%2%|<<~@&Uja7V3J}a4)}lYC6TAnXkpF zvEFO&a8xC~vx%Zm$Y4mzuB$0<>e_HWp5ir9nFR$@1wl7r+&N?(UuT1Hvpqhy5k&S5 zKQrm)HQ=))^U!jr*QauqLRgPE+UdO(UG37{@wL?f@Pk^mzS2I%PAd03{Y!fXtnZnf#MYUXt0%TX6+j`Y6>*H?%7e8PkU+Mq;p%7SYMhfDsv6a#C4v3J0V zQ=z9E7Jf;%;{HGGr!2$nRDl z*}$t@4%g|=PJzp$S_kk$!;@%8Z%&7m2u(w>Or9HpMPK3l< zy{PskMoAp@JLtxCUf6xZ_LWQSl-X78im7**^U@gq6Q%PAj6a?B;6Sv-Ow-Vy$z_Zq zB;B=l=}D)^k7sM#O7o9zI!95xONP%!2`-Q=o_JjIj4n$eqW9BAc(7V8xVNldc>c1< z;0TWUTc#P$Os)7|7V|ZzH~%p0|D$f8J6IrZ6UA`wK_LbfgJoZotuQQ2$9#IkL%cQ@ z9~ehj`(#G-Il@@E5L-~IiZSDs8Y^IkTn?73+2wukse-6DSEr-G>-lj_!2m?9gaQll zfkX-m!s?$U)Sk)qvtA;zb%3Ov#p$r1FJp{>b z09($eF%g3(Z=B{Mq!~fuZkNohQbJuTPpd3h(VAOayH@{Cp>us<-JbL0kYB@@X%Zcg zgCJ;jX#rEA!F z*xvGS=Y5V8g}z8nuoQi2ka?5Kofmq?_2N5%U>W7w+j$cQrS3Rw4Q4_P={CkV?NiW* z^Io$GaC*f)GLbBc70dt`%qVVqT70N`Ef?lfFlwXqLjM--V|w*#^Xf6@2_6*i!kZJP z1wt?sxr+l`f61VgxVtN|5V?VdXc7$%)%@GaoOW3|JQ4#idM6pQR=L(i;)+kGIK1$9 za^EHP$oOzft$D3JJ{7sHptJ0)_=o!4zAw99k;?cF)Gh5gXx41>7Ofu9!zPkw!OWb! zbo$$@FpN-zVseQG6UpDW#CL&x@9{7meD=#Q{;iAr@iP$@F}^Z#nsZ?f4}(wu1U8AFXmiW=9KJD*xMFEKHQI&d@Y9o% zM&Z{dm6rQPVe4X0Mf$;ba-Id3sw49hulXYs(qjp$C=alf?!Xo zk)`@G5@0C?PHH`LfLIp|wwAvM%={e<91+>jwZ;h7s|e^zaE}W$tJD36Cw4X~8dLu+ zULFnDsb6EEQ&tepw_x#{v=52z`}HXBu^pUq-&rY@gi?nc&BpIJO^~rFtPg$wCUrJS zdh69gH()hp_JJ11?5c?I*98^)QK8B$ArfjFdH}tK*mMm#--dXb)Dl_FlPF#t`-OKx zrxzwKN;Py>#-3c0TS)(4xxT$rC~p@CclM~r(DE}`WcT$-bQeBIPW)Mfx$yO{^3h+d zw)Dll2~E1UR_+83=*hU+U`S!sHl8~Yc(jlA==YD0{3hV>vist%Xi3ZD|CbT_1%g2~ zIF|02TI5waA*_0Geww)h8TcI09h7oO9r#=U+oNeG#u5|?6tC1tt?VW&>9}h-on~#i zEYp^g1qtVpU2AK-A7DSkPE3kSRz6`mBmfn2T%rPV_Ei|wdDILcd zA&M=84YvDcA2j!+iwJ*@X1uqCfhTfS_Q-Nv#kfwz*j@<-o-JsDkuw>*6% z!6w63h6>)uJnaUoN5W$w&am7l|HKbLx|*?qG(+yGA(E|r=2k*h`>xKe5vh`$;yg<5 zSgBU8y9n$XS)V)2ETE+m=#3P`hEl4O`1v}Yb<=*z)nK1n6B}CM{T#6-{x%?9(gX!9 zghYw^F7s|ER|wiWv0<=k7*b5*^Vsu;w?b`y6VuYYDwis`5XjKFB69uxaN|l1j&&PHyKuTKrp|W zw4uYu#9-6#FQbPQVHZM}!9{sdDgtuS$nT%1iH-sR3?Kd0%{B$v*ocSwc^}sH2d0FN zS5>`JgCx0bU(H%*2NgB;KcOuu4+$@5e5Jw?lsACoH$HX&9awF-tp{O!ndLp82SNd$Op5 zuN+xh?Div`B%Ek#=Nte(jB8JI^Miqa5*%v`3 z+;$$UvGZmNXeNmV<$k*cQ$m8~Rs>ECkeHWI@ra^vZ|?D^&YYLeBukG~V`}1_FSAFm z)%c~)2spnZsd`(NtiM{*PFgfW|B~IuFOAy7H*Lv*$fSpW&rpu%z->Q1;2$vjcRrVH z*IY#W`VYo_p1>^4NRML*2aGEhb;KOyGnxX|PB9(y(~CMeb!Nk77_O|iO3%cwRETCe zteV$L;`ng`TP}!r^DH23Cxj%Z;HlC#fPxpkITlQaodMFTlb5{cHz==Vz{NWcko+Ym$cZKOE zK6_fis;P)sH99{v?xq3_$B9LxcXN+MsF5{EYlBl50ViOk0!I4J7cHPYDL;o)sUGgG z_IH~RL4zB-U1aHy6W%)v@zNL*-}xW%Q%4lVylT=t_|<$$LvP?1rHxPotjD6aYdKc@ zDn7bfgx|X>M~KCdxf39F!)RBpuJ`PFK9wrQHfsSP{>^qld)61qHsB| ziNZ?a0yDE8S$m~eE%Z>^lmaO61xup>S!0Z4Ct3Lkn~GTYPma@!lLT|ZCdi$XB4`vF z>ivu-)%?C)_ufW~Dq}BW1?|)aU@hZq`2R#*|L6*P7t-1XvauvXeUnWU?CH)8q#yVe zw`xw_@x5Avw^R6wDO}|<2M&)7_k9w1AxTPIfz%sLCE~cLilzR&r|83`+3o6_9f8&j z&z_Hm^X8=b|Ni`fP-5G$^(?LU5Lv+p_)9yGqo#cWefjY~&Zc>k}armO`gA}t)l2mRitfsBt`Vc}rZzRUl|(d900H_nX{|U^mBD)QZ!4)%q!zVklOlXiU%$HS)kw z`P6H(i}5!=!l}O>bK_bI_aOKhth;ZLut!{Q(XbT0>KbU{*DAt%84ZbEyTn_4N?z}Z zm;d7@ah8wdeIfb4o>*6udr?$(X44eciujjdeac!|>u^v60E<#6f=rwt^|*Ug(cg^#;yZ0Y%S^M zLf+}LHbCou_=Qt#r}W;d)6dxR;P3rlTAfFe80Ny84zI*>+xkhGpQ4Jq?LyDqAis^j z>!i&MXWrpqDgbl4Pcu!`Oo+U~TTPeE5BogC?f%r|LC{Y!#}kPK&B>xHE^Kg_gn;)a zq`*KC>~#89^sOTwwf~pk?f!o`p?&WadY(R{%}{$@*6P(=sOa;jqU;I$$|8OX=l>-D z|LdR=&BfO-OKl;@l{@H1;DvLozFz4Kv197}ZjCEw&#I?e; z6kxTp7Cgv?dRLCYn~Jny6n)3H*zVSP&TxWlAuR#Wm&-MY5~QvYPziHCZyfEYv$8v{ zz zyE)grF;I==&Jaf*6?$iMSIbv!9kt&HM%OSy;BtUsg~i71N)At9WkvRY0dVYm(cJjGDx7hz7Q&g6iiE7dSHN>sV=@ta-C*psMapvfJcL z#y9MEaTf0?n~%v;KWMYwvd0TwLJkl9Qaj*#eM7wIc8D+8X}mTpU00HfL#e-1t_|xM5$_c0-$62nM-zefp>%@FO$9g_f%i>PvCno&DfVzTG>xy%Jr+1{RqVL)= zvE25?i9wsk31V>FuYW^zr~fM=jZ7I2udpZ`ba>So3_bL$gUy0grKRL;;G=2@JIN%TxQpT7%Lj z029sb<1McINJ9sPsUQ1`#OD$`l-^HX4IGm6h*&M^sBA6?tV)y!+1`Ej?h^d*kNJ1m zOO6rJrj$)1;C_YndHM4$25kL4GFk`N@sg%25_}M6yk`w*8D_FPe>eYvqNl}8#43!o zHnE5j-|88d+LuiE=k*YsB5zoHcaj@Le%MK28>hwXqep6~n*(#Sufje;tn*^Ih^{Yt z88<)Hja-+}PYe^-J)6SCkDnFb1dn?|t~xDHeMJnwy-H(Wna0zTbj(PReGm{_Y|)6w z0Zc~rw3G|0FJ?m91A}<1v>MDLKa3q6#l7?FTS^@BB{RBC(8se=L2JSCK^Li4Q|)0- zwR@&OT}L_`8n}V>h$VtGU5Tl?^GV#<@@2*fGY5D@`E!y;I^omuxvvGeb%}MU{ji(Su~J6$&?SQX{%j!{XaG+k z?N=T9b#m;f>q_{@dgQv{7Lm7b%-fRQ17|8t_!H+l5>E6D*)S5&+6bz#ylIbRwdJ! zRMfKYs_%+Ic9Nz(aTRf|gTEGMd+fwiOQTOA0~k$u7`FzA)-;k4mjzvU>+}SVH|F-0 zep-J~gxL3N6N>{!r=Faz3$$tfIo>HMa2CW%Di;Ef&1j>21(-$en@>4-w`-h-r5(GO zzJl|@L%W2{8WhY}!=wkg-g+yv9#?*@lx73)#wK@WDLM3I$o82`nu_88@&i9Q=o0+3 zeZ^KefA!`VfsZuXJm>>Y0#)tzR*3?<(g?Hujw9X5)}Q)CXGH(&!Q@0m{c;di}Dvs z3))P}Hw*BSUv~~|?DHU2j75AMc!AKkE(1q@k^0K>prj4dr0{rZYqjM&jLtL@p=LHL z2c^*DcD1I|5uS7_s(9Cakv$JJz#JhL&)@Hq1;{RB%jUkmPm{V{W;iSc4*UIAB)qCPK666O!%R#AQ?gypIpXX(VF>? z9oFVUKSv1TSt((CNt-8ub2D0M@4y?}`c8k#8_u#$NUb=+gp=BBrA}DMVW`M!*9WTY zPQa}BL}9RLA(or`QQ(KZwHB(nCS4lp`%!EV$weK<6*m5I`QXXE;qjp)g(q-*ns zSR5wvG=SfLr8`Y(nb(9Jm4z!&E=e~}MroVaE%hnGVmG_D4%f$J=GHZ(%$n83ZI{p% z=D9s>_eb{& z+=r3qQmQ}m1;MYDY!D-F7)A6No0>LkI6OgQtU1)NY8ju^N;?*5Ae&Uh4`YuSfz1Ip zc?Png~YpND-!gEo-{pV zcZ%-xW#TJJQcP}HClxvLTR>EJp!&X=0)|J-fBKBI(?MMWa<0{z0aW+Gyc%UuExo;v zCm+n!jCzfN<_@>a4JkK12d1kvxxjKw9X*pc;4W4DE3;0%vvm>th19cTx3Sa&A&D>&DLY4BuADCe~~4FdF#u2A`p)(H+Jo z&K?EZl#+{Mnbw#19$z<-V4EPVF>87mvF|Icfn zr8*n0sSeVZ+4el)Gf?oA_G3RIhlaQht42Dgj~s9o3~(U?<9zi6{V=n`!pJZ!u^huy z06eTfr)T>q(NvNvw&V|-Xt$59x&$JISg!(XP2tc|$#K|mUm0W{low$HA`+Zl%?|1jBt-Pj7%c<` z9`4_yhsL5gE#4r}FBuOb&$!~9lWo{?+8JhvCtQ&37>KwiefHFX#CmFW@X<)2$ z5bd?pRJYj&5Y0zP7~;e#`6`V93rJL`{d0c1%T1FfdjNe!WZDn)#wtC1=PNz`9lv}T zQnO0D08!p*6pseZjCE%V(5AcTg8u;X)Z+vn4CQd*B~uLLsL9k1U@R&m49Xs)oCHpQxS0{-%>xRWqVz>q&?!)aSH<&}vd!sk%}Y@O5f; z_0cI45H-E<_nKf0x@O?9vd2jywk;(m-MF0zp@ddc!iO92;$gcuqF={G#qV@ZMA#nW z9~7Ko_Xs>fXU>K?YIxqySBYGyCt&elOP9b`w=2h?IV94R2hl)oU+MsqaYA5;s_a<4 z*AB1FkNA{t2+ry=V#ye-ORvr+oA2Vp0=@=X8C(M2q&(83bF^`?@=BBc<7gcCOydc_ zf$}N}$T1S}t7Gl9A`0x&S|_qRRyVCQcC;4$XbQ74ksuwGV`>eXTIlpZ%P>O{rJvgT zQ}&(4mL0Y-r5(AUe62~w#1ep9tfWkd4JYhGnmi=?W2Owxcq^Vf?^Fs}ck16ZzZ$uG z`C`rnKL-3nfi6+D%eFQ^?`0;W;lHua5RlY`{k(BUhdTKHd;2Ml@x7zziIM4l6gCTA zIj9`{p!G&gb5KJd>X+M9?nQkOdJAGyyCjQ%YD((-Bglfcnu1$R>w%Hsib5&|mVHkY zS#&SEToeY2Q3km%ERLo_4RgVOBGYO*jf_H0KmTDwH>|G2%PB{8XdAZJc$SKzfN6OD zHAFQ`$T(7vO=HoBfa0;@xYJll=A`3;%&hnMU@I70otPvV6s(8$;?P!~!;}`qnZPY@ zKp=vsF+%cC5~@>~3D|8~6{j1``^Xi9$O=8LxD3-fGCk$*$NhQ6i5oT2&Q^%WC%{i9RRHIxt<`|7qSBsZ*O2&`|qpmN}(K2C2d39 z`gn4cQb!>>3JSSHTmx~^cM^6y*B<;JyDRM z8&|(Giy6#b&il0clkZSZwzGx%x6T6+i5|4nw10C#Yb1|ZgJ16gDaRp8>F^vjx=K~+ zi-n30*TT_H5|oiq#ZEn;LVUjUqKAa=n0DQB>bA!TrChD|=ByDKC0B8p{8%0aq>la! zRe=yPX+%rUa`6ZVc3}(xH~Xd9Boy&fxHz_Xsi480@ogYnV184h5pu0z)+47+EkB8# z^FX~>qgpuGC06b@CEvA%2zwVU^EGt#JaC6-po7@En4L|Z}m!F z^P}7c!B~#;4OXfBs4)HE_rT{!VXY#T-bpDZ2f8%0T2f(E_A`#Q5(9U^03ew4iDg*@ zr4lBKDGyL~vR-C*9c7jC4Up{b2d$qD@wzqCd^KWWC|^Lbh1Y%^<3x=F$$bBD{i$&} z^m|BhrtF8Bd2ptici433&+YN3Zi{B>#f(<5JVU*ir7DKlf1${DjjF6$hK_HX$#k8#SXa%+r>k6}g$n1pk(ruGEa&x5_$_S|>XfSQ~ZU5A>;=J61X zmm?>uAzzq-O&tPkl)b92KS?QxVjn@=3GrL!ki>;gd2j$a(Ik3S8s7)hM3m$)eKo*@ zzlgqHk&sgJSXv^#z<c)HzT)`gVx;-WB%lByIbE4DQa-6v17BV`rl={c0f% zMMDpqRm237>iF{SuXdK!QR2M^*uLBI<~5$`=Vcq~&vm34UgfSknsAXuWXU)TCz5Zl z(c=I;XJ#bm!hafy^lVigZM>NP*WR8VF{$mzit!a%4I&Gy-jt;UwlU3tKiQ*(xh97bIIwPbHa94FqU~%HhTLx z=u^DaR1j6msl}bQWlPWbO9wNY62X@oii^T~!3C`{k!P!JO9`=uM{dUV-Hre3e*T{* z(!;v(l>cc;KY`+$UaG>?z~#b4d<)1rGmei567rr2i&~-Qp;F@w<)y@PM*789A7tN- zTr@w_S5ymTxvCcW1MT^&W;Dt1{A8oty|4D<%fq;4bobqy#5Be=%%X4>&nwJ-^hx@X z#?M`0R{i&)2`#FyO5>;4t3%2X!OY~U`9`$d8yG zL!X#(M9iUqY$V-WUP)=#g(G=p&YUezM9WJph;_d_@?$5Bm3_!D@?q^o0LcMjgPS z_v)`s1JATKD&eO($bQjh*yny9JH?`h^0r7ta4ES%!P@onOSZZi%^ zo1AbTu&BR{FznB~zjj`nkDHD8-*mu8`+nmp`k!^@wqL=qh+}Q1M@TF;?@S>ymrVP0 z#T?m)&IGHhErvXK3DaHSq+lUj#ICM^fP=@PM3L#XEK*UOIZdJ(dBO`)q zw}J~^V{KRFxvNaT#laO{4ghUMSDTI87?^}TikHr~9<>}{>OCx2cO}#~`RNm(Oc=a8 zyym{U(vqu2`gHR6_Ac*{H14H@scBra#S;EkKD#68CRQc!h1Xpm@2(0nD5q)bfn}5C z*sM*$d-p=PJ`ro|J;9G*8ONyYGO!(}H?yH@<%>iJ^TkM&Nrqsoz_Vfn;a3)xH9hs# zh1v^qu~g}x%2>ff;-!w^6n+5EzNKI^y3MVxIPxw0UDKVrT%s6QE)!Z$YmG$gyP-5j zx)^(>0NUGh1zE~rkNKp-nYlT?mK*=v=Y8)=9@r1(wOSLt36~X()+&jS zOt=LeGfn>b|Hsx_21M0p?ca2FNcSx%0wRrc3rL4FNGL6-#1KPBBi$f^Gzdt;P!b~@ z(%{hD%`o$B^_=sZ=lwrl=M(Hbv*KFo`YjP?4o$imsvthKkIdRMgzQQF{xHo(9a%q~ za&qubdTnU!7#uZ}c+6Rapyo%{%7PK)3-Z9xU+#O`Md0YY(0qe%>O~%A*zQKjwH5e) zH>T#G@C$}LWe2UyT`gIVRajye%qxf5YNkrM1mfOil=G9yg90Yg%qnA|CSD&;r=N^1 zW@nqAk7|IOexuwl6*+eKg@9F;RCzwx!!*8#l-+&p(nmQ))UFA~br?Y69+-XumRynQ zt_bQ+&u*xAKDA%hJ$VvPo;rDL6KRz|16uN?JF%cYH2!0Fsz&c-tHxBzWsmo|eiqta zS@_Y6*M~+*t>@?>`X!CETXhh)Jgsmw4S-6a_B{HVRK4X4*&oc|ZVVd`$||_eU}%F? zz{K16BtAHl-sHY{s32${r#2wYABq)P=R6FckZ&&5nY`ozY+I5`IY77o-e7s$F~~w1 z?%1~32hkB_pkPdRVjQSpbZ?Y#2abr>UXK4UrT`S1Ge5MpR)%pVD<4h-4)IS4I}P^L zbW^vww2Rpc!Pnf};~Ur>B~f%POwLc)wIrgungpb(#_-+tXrk6Sg@c`KLa`4by0=W+ zDyUB%s2C6?vn|#yMN|2z%x`c9yItJsEDvA#v3h9yex~ReJ<3AfW-{H+~%#Z8lA{v1>H@?|Iu&J*t8%&~-vr9s&1+SqEe%U*5etLtjYsKTjw@_)= z1eH>XKWo1GmGct2BGa;|ESnPEel(i%J3Oxvvm(kHi14KHN2m~`;%<5;1m5ir%zua( zQaF11Y@|I@ANZ&=$_ z@~f8XrQPkilVBjH>4G;IdN3x?JlKBiiam-t86>kaA@Ky~!V5?8Hyn@M;sSiSS$Taa zb7Ezaj~-YDRg;I(uVn_e5X^*0zwXZBpZcB;$KBh|dRPL@@76i4-dJf$)e9QGcLt!68JDfHz3N()+?`|-Le7J1D40%VCep$Q}K-L}0FEsm4OlS?Yc}04ihDKhB zjxh@pSM*O=t4Q|;v%5jVh_#>_e1Gp~)V_s(-W581W5uzD?GR;j$JStMQGdI16)(6D zM}evmFb1d&2*V(@O0n7_UrFD<@YwXK++W;%=***>?)U`X;pwv&{qCAe$FSg6PE&Aq z#JLwlMZ1&bNtFyduTWEKze zyKF2GiZ72pwZEykjUWH`Owp_TK?nO}Xnw*CwMW7q1Jds?CsXu3xESLr*%L%Hq2A(^ z9~yWpMm6=&dEvuI1(eyoj+MP$c-yF{_*5giqK878{P_MURB<6`S;}~AFxyOnuya6;$iYyk8v|~DtzPAk z_abv!P=~dy}bBnZ3`$==qK|V5$aLf^lz0T1v?M--Wt7y@8!B?T~*dwK#GPT5b z#yamlF@~#Np{hpI3*Cz&VI}CQg`6HmTjE{a4OZ_<2@EG+hj!jZek#5T+LO{+UkLlV zo3tkUiI2uLB*b>%%6ZM6lG-pgGaEULemVoHHa`FvJzHZyaw!_k3t`B1zxA2zX*}GpSTzqb`|Z13+49NI-=W%pmv_%|6X9-s}8W|LD{ zutO0)<*xBiAB_kbQH=WUlRS*%XN~0SlB53CL)pD8gCgJ}<}nI3UUe`c=75R?8@VSn z^gpy<_!YG2%Fy-W`K*n-ImIP?%X5TCVASKB8aB{`v)rNfg99*8^Rftt7gCwI)lKRy;P=4u;@)AN^87s!~jLlYFTicAF^6vE~tI z9nt+!Yzx1B*<#^4kM3UcUe+>Zf4$#~IY`)p<{e{he;G>1?SKazLv*1Ya#a$@Wb!ws zfTga%ZMW~P2fVKRoG+LHv_4}XB@jo8uGh7)_9i<-TB&?GxVnmDW*w}W_ECa|wL9ma z#q03rW;p)5VO(B-d-_Y9IldA3^1G4e8`SW%1hrN%0#X!6H z_G^(?eggho59G;KxJM&GLG<0)kDkxeVlI&xF{F9kl;3H8xECa6Nb<9lU2C$#iXL%e zhdn7??3HytV^?(s-T!1@`T~cT z5j=L}86yc*+2yyl>2o(G6^uyc)Srwh)=~dJoNI*J#LsDOK%Ns*ivN2 zXS?$v$U7`Y2aJSQXxY}EyMxp~Lhr6ZMFRy7%>SS5hkjPE0(-@;S)|Z*{6>f{y|kYN zHI?lO#p9qc7XJnYY?gC-wK9Gj7C|N)=4w0Pe${Mt(jmS64+UtC7(T>Vp_#7aqG=73 z#i%}~4BOI(XwklY#zQZ80(ZOIG>p(qJDkzaO_UQD$^oUsb0f(JII$qE^b>HJAZjp; z@6BaqAV`B=8_U)}ac6x!?8&%zq;IPr^cmK6?c*P{yibryCMnQ{2US5Ux}R6kbU$l6 zT)?mN#QL=&+^rdL(k>E#UN=f9DZTi9lx~`&@KBXJ6beWzEatgA84dPAbYVkpa-9>O z6scd6a*-b_J?-Y7=bzoD^N;BEnn0)n$CTNX=*uxALyIn04`Q+n!vRWP*TMtW+S{Pk z)U%jVX?_paS?RMyx1EtZT&kjH{jW%lrCxpmePd`exl4l=<@%@~pcc?q@b5SWoq571 zT{xT|*aqBP=G_9jmyAVC8iOMI+aaxz(I5kZ)>cPTtt++plA%?}1*p6&)$W-oD&&jG zcg!h86Uc=ePtI=_FL3whf5u$)9G)9C!8uw2a-`kkNw&BFep&WsFm_C>A_!$fy ztdPiKF?AfCnn&>@pHzayG!(Z!Oh!q3M0r?Q$H7|fiPlfe$IS_*>0*x|bc#Li)8t7@ z{A#?Tcg2}DhtG#=@A|$7%z=U{$gBF&}2*9+AcyYo(P}jHDz-U;5nMhOg=HWD!D;7;9K3BxZr$ajw7j6b+(~<9M z(mww{3F0%K9AGQ98N7ElU%Huz<%daY(#L#Vv)bx?Er6lvm>mWA#^D@7+NahTSx=Zm z>Yr{befStF-G!|ul1xkni(9Pbw0WPIM_tb0&eaM()7eH4UHvpe261D~I4ZMT{O;4( z9^b-;ch9BPG1Ii01WV`*3&|e0dgrBGf}_D1x_5NMx9ql7JQZgvwR@g}D+B;;a;x8> zaarwID542{D^O?vu{#+M$~Ge#hGn>cZ@mOu68EhAuQ7{0ox9{W}1FRR<( zR}eX)#y7%q1`)q*-1u7^u7g?m*(2Y_&S~F6xb$*lW`BEhw7uAqYg`n$k}HX1TIb$d zhbDw}sbHFfNu;ndxEnB|>&%T~kOfM?oteG1$onTPH90Lw4o5QPEW0ghvc}CTa}9#> z2-TpCzZNq97Hkj5isURCU+1;(cm@b)CjCCzSpf*E8fPlL2yxym&Rnon>ioudsx;M;>N+##2@39Prjepk2XW?_~-<=tpsKiYT`@&p}9 zoMwz_`|?A)x71L?$r4G*!t9#|M1vUZH{l^ zFcNU@jO^{s1mtLcULh?N6)=!zAP9*%T1-%@`!Mo<#OEq-3%?Lpm@NOPq$%I$)xH{{ z@VAPCPtN9Y@72HW1-YMo7W{6CF{rt{v9=g39a>6|jz_adPf&H6)g?k%{lTb|AVlva z?ju@cm|T7#)=_#f6!w5iI4BwNGKI*d%$S3mKoykzq%esG>p`fee z*PVXs0GLWt195cL0z(cGRK9U#i|>UW_fchMLzTP>O^PUQSov=^WRzCq&WN zJe=t=we-hU=B~s5NCsze+tO7&p%HswdW+OQJB$&2EGY(P8IbI>5D4Jj!2eU#VYRiQ+H=Q4S zQo>UTIVV55S#TzJi#&?m=VJnqq)CTOn`67r=^6nCns%it0d5VhP0C3lx~C1MPY%GS$WXlqk=k7h2NXe zMK1?wo)SZrF|gh5ea-?2hQBD&+$wQ1RH-r$c-(DuNH4;H&18>B(Bg}oN|)oNQa=q} zM%%zM;6sMQ8vtY8_2-w5zX~?+>wZU<3R3E|s@5}~i@d2PJ)5ytJ{ODG^_t+JY3mFM zKrSULfL!2WSU1vMl{d&$=FLeZK17>uN%$&FWt>B}VS*-Yn^TWPlXe8aG2eekza-lv z>`LPCn(YVT%@(n>rt>SB0k|M?hzT)=Fqyynz3Qp#E$7Gj8&LHw4V|}~(YHsD0JDAEoA-G0 z`Le$wQ)YD))yY5Y#pGr8bqXRJPd5{l{tJ=5nRjCkpi`ZYyv}!ja(QCT*bghG%p>h0 z%n~|oo3|aDG2>VOZv6OkMxc1*=bIHs%S~hAfAi3zSBQLt&KkY9ye_`Ve`Ji|84-9; zd#@X3;~)FPqy8PWQvcO%vkA4l*&%~_hqKkg25{=E*&{-jkNt;t7vCy9c?FJ zSAowO?-gb}wyREGN|z7}1TuFUg?=VwVfezxt{={R-SMmR$JJg|C)5%1K_mU*rgk@rfCHggYVjC4 z$=Tkzf@>Zwo}7F0%?D0(RGY}Yl09T$8-`Q09JF>Ve39-wAo?d3XGipczx2t|ugP%P zvZ0)>-Fx|*JvBQJvJ9l#*$d`r3kmt_%5{V^zr(0(qMAK_{S9BjeVR;JyEw~l=>z`| ze3<@J-o^i@lC|b4oLr1phrkiF#s%iF~`4~$kuh|#}kwfa?5Q6I9PN~I*s2}yeSzz7|ts<$OYrx0P?@eux`yHZZX-i41x1?*k8MbS>}dIj>0rlC_sU(}>}c zDc$jJ@F30BBBhry;(_>R<{DTn`M||s*Ufj`Uj_M|$m-ZyhJ1+xyPj#r^d?!8Cg_yHnaNJAJ&3-6@i@l%*!NZD>w^L1H#OjINq2QOaUzFS)j z(%gs0)6Xmj*b+4@-R14 zl(41}8R1^jkiKbH)t4J_t@@IjKvMt^!ehI_^b;pfrQM_Ux*bUnyiZSE3iRj!==bjb zhJHT;W-Odc^FFQr!iPuK78(VRXf}d8S|>K1RBf3R$HNtWfm#i}L1aaFweGHXkfQ0L z1xLR95)@zAqR8!+TxJSI8;3q+y#y>poA>aA^v)D~=l%T3b zagGDJ$wjY~WKnrqg1G6R$&s^r=dPb8rqvJ*OG}3lq$M|p8qCV_jaFh(DTWT zRq~7f(C5l9uc@zq56dfac`E2;8#IkOjfVX)wUDH<(#)a*<^lYgH<*sfuyNcp|2gwEW~Uq7IWK_^?A-jsg9 zYxUPh;TbnMRqUmZ3L|>awWn*3KCp3bxd5BXblJ$7ZBRF1IpPOAB1;+ut$*6inkR=% zAdjp*iQg@#h{h=MtQaP!w~~%r>t$}|Jcu(AMSvYo4dU>}{zjQs98*F0eRA8~VPs0b z^aKj&^{z>-xnp|55;ovQgSEHXsOVD-lLZdKdkj;CL_e%pOH)ykbR|T-a$#tW9@*Sp%RPrsO%Z zH}DoN1B_g$e6w_ki-eKDIBtC>AB1gRf>%gFXHu6KCHnUUa;J zL8NH@UgIp3LzAOC6)&JK2{}$W_3*t6)~5g;@DlbBUMuk;CHuMvPhl~-!y4XC4g$B? zTHRA_dhOGNwxk0^od-0tPHr~(-`*gM|0)M$d}Q zO4+_M5RByUi?ZxBj)1>q#RI2Fu$aJv`Vu}NKd{h0^6=z|t$l;7ozf}(Y`?$xN%@-E z-!h8_$u3E}o?|b4MyjiVPML!7ZWPT}51yl^h1 z*NTA0!=*3gPi#K|bZzBP2Xj%UY#Zz;3mk>JI$AYEJ*IsFbeG!!1`x$+PhZzK*IVvA zUic^>9MCHDyk%=_X*E(xH;>dd>yYU6Rg-j+Bnm{S-7!$~(<=BQ(?z(hr1)?YXL(uM zehCiGO%FP?$htSeSvsa=^z8Mi#jux5y46om28a=9?aSCxhAs;{3Ql`W=n|p(ESe7A zkJm^c*t@l5R+ZZXwV!Pe?xT4{XJ_QxY8XWoHA%}0q{TC+hZU%7m)snHp zVpu0c+{@m^PWtHCzA22?Gn zg&nwpTE(*tBUiyKZ0~yrMKH3*q(OU`$7v8QqU}4RD$Ws-sdvX;=QVX;Yu#1kSHHAZ(7el{@ut_Bl1@8i$u{)GuiXxDpE2I*X+!LuDj-P1HuJnJL0)6T|MeVBtIx1E3&6u!=#YB;eMzv}rhN=|K9GC77@6$0(9WnR9L9F~EUlsXJa`9n!YHSunsDOHY2#jbHBq=3(iZU! z{=94A3PIe|aC-|W7^!Pv-}?VSw?mIzLp`%D=QQIyIP8Bt?nRKgf}g z%3+WcSt*q`>#O3kl;B&76NJQ`d~ieGqdz$#;uTqiGBKPT4L46DY-U?YG#cROjb~8d^$zvJc!y8vz7~plR41b`> zY4rXk4|hSyozZ>X_hj_Mt!L9_g(Oet9>d3R#uG1TpAK&<*XpGWp7#N}w+2dv}pdEsDpC|O)K1K@$~#$!W~OsD@=(S(xe_2 zc=JWJ1%K{u2K437Tfs=(_Dm!>B>RrVjp@@tA|rsMthr6YQh@>C0(+p_%AWM9;cR5% znQ&S1*_5HP16LVAcn59VxdJ+{vXL|;?l?9|DJ5>rGSj7-ItKEGA#3hE#cZ$^!U!}I z0r!8XDO7x#=T~It_&YP{`8hM_r}lzme%TL5oLnBC4=X{%S_?r1S>QCO^R@^9bUxO7r^BfykNQSPqQI#W! zTkjjE{-!fbA2}b-eQ+X)(kLBsbXGjf<1i>w8y%_jB{lvIU8 z2@a^0O7#@}n&fIzr0O5d)|w9q{?NdcchI|&+!c*F#H?w*?z?I_uV#NyO4Wev$|*H$ zJ;E8vRNmO|W_P55#`0rCeS50*de@J2zLp@+9~WQCuH`IHC*<`5c)$pt!MOd~V0;oS zV35c|L7&1Tv0C3?x-ce5UA%me zyEKa|>W40$DT(o`Y=&-S}x6z)_E5jXOn5v&>Gh~R*Taw757Bl?yYD0Td=|}-2)>_R`1`x%+acG zoO$fUEDIe}hmj-QV^`a&&B&Jnk+fb4%^iMQKvkrO`@0-_Tm>Hm$1cnU`l)A++T7Ap z#4+{}c&SO*_#I^Y!vO!DSl>8xYPuOy#aI*4q8WH6sJBs8RNqXenB{Z(hGV4Ic?H(- z$x~+d#tI?>6w9+hcaX^vkYZXCG>;27A zk_cOdfmwm<%aynPQf|6%DP_qEqA^K>l@gnu{M@*fLwT3P-ffTOt3xP7Za}`MnbQ^4 zVv=4a_`UP^#Q3qU9A{CLnnToFx29mQhWwOxrrd;s&w$;#Oj~oDr)MZBs~=Kc#Qeqs zYaqUob?>-sg;KJ4NX>eSbhy30g5+V1N8Opj(8mj1(sUQIB{NDM__ zStWr$H)G}I7iDhO1Er^m@`sTw^YyBR^2WoS_D?q4`mP5?4X>B-%nR|-Ybr{Lv$cE_ zV7wubt(zAfKiwAH=wIu;3i4;aT&l{G>B7l>^v0A@lT(X>!ajMcFI;to#zsr$P!>J0ZQ41&J*WmP_wtB{aDY*pYye|0nl+B!9!e|3C(eAG{`o zHsA;$Wu^EQ&}NMBFLZO{|3Wv*meQ_+a(R;87U(@nmH8Ehv8(o@09Zi;Bi_}rpX)&#kLV|p z2B&d-EqW~jA>*a}bvNP*h|5NqdxtHk3oxm$T}tI_}jGlV1(d;qccwxxQk}GW;)gM zU$EsN+zXLov}?bmG0>7W`(xY6TwD#pPW?QNoPx;!^#6L=dA&5=4BNKRy9FUd76rze zVKRcmTHk!yB`NP`6%6x3zoN^*X~ zjI;M03e=?}tw`n_goZE0I|*cl8yk~1Exrx8H*UB7slTc!@iJ#-A`B^l*Vcye){9mk zOdT-)z>y7j3O)x9@sF_>4lvc)Kfz!+r?6cnB6F5LZ*i4D0DPxEbyp8?7^4%`fK2_D zzJT)=h5U(HA9eN-PPOahj37D&9&GK~CQiP$KlpiI7OOIip5H)owVW|tIgc`i)U=iF zMO}b(us(4^dQF+^zgWm}e_6=&*U<&eH6z>axS*2rwq~MJ%}r=%-)a>c`cX^k7b0)s zW1^q13`;HKb)_B2v0#5zT-3WOtiK*6;4gnA`Uu51KUdp(BejTE@O#YHfV@~@g9RrO z|XEH(AHussk!L72M@efn;~r3X#~Kzx_NByx$MQ z7?nKHfZ-EYbDd;Zyexd(B)H%#M8T1K^e1TJypl<5=yR`oQKNS-iX>1t4}OCD8vT;} zps+&oK^$j(rI$o?ahHd7y}cxfw$PX)WBoi(lw5!-7=#0WPpGSA4>AO5y3s{AAxZmJ3A6rFH2_Vp zfYgpZ4kJ_#Q!}tUpCz5uK|mcvJ7lPjC3}cFEpU-gO>(^ zx5PX?u=5o-|Ukm#UmNRss{XU1s*2nl45@5Yc zyWf5kFCdn>&i}13Q*fNG4<^B`m`ur+kysv2q^~xiq_&EJ=CD`a&la0K$}DZ%cqMNJ zVReo_!OtT)9{S%nUxu)P8m4l_CP?pRleq1lzEz`ofzZ|DkRo_&Hu%Uu zWEl6`wAL-(%&sQqJ$-1bzP4XdWs&PuW%Z33XB;t^xc;T zz4X>J+@?-RZNT})iIc2JzLe}1)^w)tz{6taLhzZYXTpUwWyXI@J zrqOr^M%#hhYcyx41Yfu{1){I$OOzditJm-r&LIds4ej2_s2gFqR++J(9|*qcY*)gv z3bbf-fe^Ks*2!Kc41|fQeJtksdeexkI+3?}yXz(zaO>%dILov6oeO>)wjL4rEV?WE zu8dY_b0k+b-L$2 zFE7o{KT&-kZz=AeEsJybinn_`)D$AsP6C&mMr?wgY#Y&{-3+U9YBI&;Ko*q^ncNBR zfBkbh!4iWxuNTbLguaFrF->pmWk)yWT(=tO!jx2tUpB2HsP>fjrV@tBv!SChr;??w zkN-Syn-m(v(!&9`Gf6@F`wMZh= zQOcqCMMt>ZJMlE!&lBFF|EZb)IW2^Qn^o4(h9Y#lAzyzM`5y+?;5^*1c01ii7qsY=oo!b3T@Fdrk-}PVJya`163xov z3hl~hdqSW7ZyK*S7mM~|s8`LU{ev`P6D(aUeFkvRQs%)Z^GhQBiDk*DxXI36Lo!5> zu6fv9A8H!$-sa6Ltf6$3O5u!tx#ye89-Ad?Kk1|EIcjr>4M`&m*k75+(W2ng{n%hL431a!& z7GZF`zUUc^A;>e7tVI)}e*T>f*_-MPacU`G=wlCP00!`stkd$DV7bXdu%3A+Ys%y7 z78XhlCGNcP!oNd?{~KG({2N=0@h@yKJ2*pLmzz^tS7xF2c&QdYEP8w(6+chgePhx< z#x&j@BGWk1e_!Slp40ll=j-=8w^Wx_Mx5$|bB0p*W}N6V5}qv0lK!1)r<~*j;%=|= zH%Piy$F@IHWz+2qsby3oTtHZscAyMQI|HA}?75G<1SO-%Ea=OK_2+ZXBf{D?K(Fiz z7C_cl!4sr8>FHW+TO2dsE5uahae;_|YrCyPmBgnC%i5IGY4zXb?yD4CLkWx1k0gf> z2vOC2A&8<|BtREup)mp^`t~32(Y?8s+{#xQ@mq**|?Jl{8vBThV@LD-gbjyCL4Wv+lv&X0#Tr(SPm~ z$C>xqy|BzpZpnR}u(85uHRi#{mqwpvO2a_cRL2%;adxG_-(2Frg*PRYnVIDKH^%14 zIW5QH)~P=eckckEE!GC)cGpt$ce4yEt~kJP?ROgXf{*c3A&s#@RJ}W>z87-OG(om| zuaK&351sxtCjUkhW2jqve`If<=BqFG<6vlt#gbFUPPHQGWkh3~I(Db8i#Kpom^40iT5QsW4BrIiqEa5Svibl~5c3dRn>kokT;);= zy$PWLLmot&^ANfnjN;Khd;b*vAsczk^kI@qb0-baihS&U2tgh>#yPa{URC$rtY=Kz z-(5wdweQune91;Qf7H z;ce?n!fz>B>jQ=oYiaoI#FhZBX4$d4oNhxTj?>*u&ZmZqn_3&Y`K{cuIPv^b>31xk zfe(9Zq7tsRDt}as+jFGbE(F*R8x`kY06ky&E2N2Y=uvRXIpkz!kR*4-TEneWfWx%L zl3Dli$0Ra_>_6u!ZAc=Js7SV^-nF4qDZGdx|Dam84P8S?_x?BN8=*R1h9pOoT0ZwL z2=E@5tCb8xWVN#COk2%tVW{nAPB29$UsH(g7ezVsY4gsxX9^YIzPTkz=HX~QF zI=K8d4jj8d@6yCRA#W0e{tTuLTlOA*kB~YqI6m$nPSbRNlIFC+4K+CzZ2PX3st(k% z>R#^TDR40;Wy{}K`)aQ+J=To!ZAbX`4=Yj5pZ6I!Wsb6;fIqt1`&o=q>Wvw0L6GUqQwbC0NNqJ^ zE@Hv>b=l>8>AYEcwSi=lF9*~+nzJ;D464ie_SnNjD}?TC?AD5t%|y_*oV2z)mR4*2 zrxYl8|mEb5-*qbT-K$}=l~pV5cH4?Q%9Iq7oP5k7Wu z8g2U)2eS1TguJBn@-^1KZw8$Z!thr*lnmvOt0F(a)s(;HrXcqV5JC&&Eil#xI@m%R zKdMLopsL1{KiqdY@4>LU4MV}(pVP3r%%HLLUdh&V_OrWw=dEg0p1&D1ABA!-fLBaM znQTaiHSv*unwv9@_jS})1Itj+PgzP$qcPkk1RZ5BJF;O1g_5qOQj&7E%fvCsX&DB`GUk*7vtI4`i(hcSvItT2y$ z39O6XP(|KcL`2EcjkF5-CK2bZ*_yRnRzuP|H;_~o*V15R3un#kJB*`%gUsV`iyD#jRd6jW zo^NVWWqpNRZQ0;1yC!=l%qirc)!*dYKJP5PhXc_=dq4cmPqPBo;`Txawzg8s4hKOT zO+d=Z$~}o}%H15&H>!&Jz~C&zFZbRCHuV~7r};E~feGN7)9%X51HNzEcycHn`w0E9 zcQ5MHmblmSL@utEUU{*-kksoF`mNb>=V0fKY@et^S+hd)1S$*TX)0z)%}TL)YVWq8 z(8|^!m%1<>7&w)u;If?1d1<>Ay*M(JfH+LA zg~dVt@>EOt$y+&hYhzVg{S;nDAr8Hqm(cG9i>!}Vbl75(1LztcnH(t%N^8 z?msgLzQ=6T>KR2pm0J~^}Ifx9+lSDjZc!0mqjz=lg^(F3{P`94icZr&_H-*5v zh;P2Y{!tx^F@rU+q1pvahl0cw^1Qd?m;CV$N@otoj|xxP)R6~#=)`y*8`4Cn(L%q0 zJV=BQFIoe2424%tf}DF|^N7C(V>B|{u?NIW=BWNH(~?$1v+aokK!h`9K4!iXNx7ei zxbS@6o;5nqXKQr`-acD7dj@L-w4Dn~1xfU%-*ZkTXxF$3m+zGQ z#={f|?;E7ctwhB|pIwF<_$~aBtC!A` zhuvi#f`u8zM+37&vscauVck=iHGYc?)2j(@cc?UU(CH08^AKdczuXLFf`lVm5XU;4} z{w8|BY4^W5!>lpJ6lI)b+Hyk``L8liqbW(DVQpDCq@f0s3B6k)#PWjVn+sS&ILUlUU49|d+ONlrGG9qCJkH;*#x)!vdOFS!m!Ig_WS<-+oAcM6&klUngDzd$*U zyA<^oum|%j>-Hy4Us*i7l2Y(0KpWQT;G~;aqd`gLhcw5%U7bT`1pC+|!&|vnw7jIW zM(gCXr9b`#*kZMkC#&f*`Fhx9oF86hC3fQYmpp;Cf03`R+gl#bCg7+qug z9elmtpYP}P`Te8*G1Q&scFyx$=W*Sy2`J?RMEBF|0g5AQNJ!%kROw>%0WuvCQYg4o z3%f%74P{(4=7Mv92iK`|npUfd(KlMf3(A%;@A%y1YUV$y^|(}n%bUy}C-7vdwrYNj z5$7MRNs^f~_`YAyk4ikOw;&!tb=H_ch{s;Oe*UbilB`t|4)Rn+%@llOLNHcFr3p8m zLEYkt`C(tUM71O!%N3X( zdq?DiPpW^R*!Xm585QPj<)dU1X9i|{Yd=d|$>U+%5ItTjnf?8=LVS;VdMJQC~V zM$W15g}7W-b1AN>l_H%VoEZ^#JRp^1b0K)xS*kQ-FF&!gi2KJv?}Q4a8?r*P9!VWl zmGx$U0^Ib9I%eg966h9Xqv~A@5%@9VBxE-?0~=Jbqy+Y;MTITuSwPt)6vx)zmN`2; z1!@MnQVE<*b}JUfa_DCcwQJ}^z2|65RifHh>H~D(RnE{qm&HAJDC^v}%uo+8JmQq* zuOHWg`|%2d|G0LYy>EjJF@3Fyv(by3n-OHMc`|*$p{LgZCFQ`^@P6d^aw@J*5Kj4l zI#J*|sJdRkP&WU2J|IQkbA_1n@5mY%OVf;F2V5X42KMfMa&h{tfA%~78p5|jzn+vl{%Z(tEHYP- z=76}P?KMH2o*e4@_j0q88Q$k@nJ{3o-P>aw_mIlN!|w0IG)p?bWKL=W{M#rkt&ZI z9*(Pg9(UD546VDKY$`Wdk}SEQ78XS_gIxPML8~))*egAwhmA6My1~<A8?JSwJ!GMhAPR;cDo%T-Sak(b6CuFOyDx%8*1OHjsIO?i4_TS^I z?x(6vvpIIr6p69-8<3UAG9i3I@hB@)lPr%s8)QLY|Byztk1vt@OX8%1!~NCvjIn+& zaarsQoO?2+Us+v0o=1@5&ET*hh@rRh-QYrnho(RlHbgJQ>fnbpYUcY@Mq~wLi&Wo+ zFN#}q{f`SI%y0qK2DTu%{kTdwBP}9el~I=^Jd~zOMOH?Wahq!YJZpSF)+iIaWv|Y!9a_`2X@8lSzs+S@OVH{0pqliGn>JNXNV%(cE8qFk zsaiHtx)8w`^u}q0DfKz!^*HY4N?a|~3Nc4n)(XEa^U!;^V@lG$SaCaY!uvb#2Z=AA z?#huB*WRo-NaZl0O)ViJr<+i5?>Htl*c2hWR+b|L^PFhPQbGi;;vzk_=K&e`G$ zPMdu(RupaKR{wP^Hf&YM3iLO;m;~E#xV5nQ4tG6?D?GSzxZr%RMJ55&eDe;~EKAp^ z)iC0h$J~Nmqi05SIYxwoUOYj79PoXGeZD?pSD%rPGaFna@P723$>^D<5ub-P5b`1h zXHYW%2|p^~rdji9kc}+bEw#UOi$4#lKjrCHn&P<+-o&!=8xt zpXUN!oc=$y1Alw6a@ibC(8@K7vxQ^r+9)#)j^xe9>k&pOvP?d+(Rrs<;8Q=ozbgy$H3UKO2d znX8RsT}_x%<9Xfu159EHhWoNd#f-S(U*Uv(F1sbV>$d;r+?{S=$diJj6-+R&SD}$L zW_CMD&vTNDv6HWl9?A=mN{r=w$h<0ztWSEE|Ja97_kd40g_O7e)Zhyy41Na3GklnK zoPd8IJvJ=!Bm))jF{}W3OH`JN*slZ%?Hm6B9eKrAd^d+U=p#8j^43CF3XNnzfA#?{ z6S3%Yq+i0}mwv73YsOdgU&hx7vZO~P!&hbW$B|}h8d!+i)WA&h)z=zU&3EKa46|~m z?X-4x=Nj9iDcQ#MLyo^&aR8Oou&dD3UIyQX3uoRqePbn0MHORgya=x5<`z|P4ek$1 z=sxvKgNa>%JfFcSI2@c`%|=Yvg-=!75>9HWSFdbLZ(e-LYq1cm)v)Emi15CU%wq6h zpJTBLE@c+SANi{I>9`B@T;o}9USfq@-iMrVi&czQR*>gz%I)i`rd8>G135W7GmwH; zD9c}=tc=9<=(;)2<7tQ|M}N_kzh)E1O@~HsxtagtjD&vZfWh8{d>Qn*xwIP?%uSk0 z5RoWH1CPD&!sLP?rn8boP!=Y{^l?!dWt|#11y1Q;X_k)u@UB8Y^Ixf#N0wDHt)f6W zZsfy)0Qb_{d??{;k$gevX5XF(NL;APh1ra9ld$E1bzUkBQo+sts07+@mwTwnytVzb z2wI%xYj%FJ^xmU6ylryk&!JiGNv-S+1NSeO8%Ulqj9bcw=poILE}PEpUdU+FzL1HFSqsQR@lU*GK(>{5!cRi_3B;!=KxPJ| z!7Eq>&Wu1<(&ITn3sJ2Y}=ii`G}|{1)@q1P7z2#{9f~IDjd%;HI7zQ( z93;jPmTO;~Aib8WoeHnakiX7Q3#QmP5D>A+p>Dq1Z5#)!o+G-sAm$vyg>~&K%)ls9&4|Ke?iv5HrAA4UX6wfZ@8B%zREtGI zh0|s04@E*|c0k_XRos@k+G`Z?QVH#ySur0E7E|1!T#C)PgYV%LzJU}9+TF9GiKJg6eac~c?HP~8R1&+mU*f>M^A-nW==%O zFxeOBK-2g0k&|WZ$kxgCVh@6NXG5?qKtDP7V+TlGFJ1i$UvNy#)nyi;e#$Qaws_-y zOVF8;kt!zXCO)a`s~d)jycn;XL^TqRD1tLCyDt;ZdFBev#ST}=9;dz&VEb3-)wg{H z2)+H*n#E=@qPtq@+LiZHbpUra<=WjXXAZegWiO8cyFfH!gYrrP-jEZBMT(0`RT#Hw zv1!TaCuxmiF>9QG%M{{|J>BYn zM3HDK*7I^8eVXJ4rx_g|TIy5`S?Vy76XMs;(-9cVuP$BD4$0K%UGc)VvQV+R!{r8# z2&!(Vc90b>8?#{`nLr{wf9Ct=H|KHwK5%0l=XIQlzuV4*&XB*0Q2ljf(1ShLY?;Rx zJ9Bu1UiYv7*;KMQ-&O-O;>3!&WB(tZ#U!MfqRYJn1+$oTY6Kt2`DtP}s%!{%WEr~n z2cy-NLb7LrMKTxs@0fp9$ETCtdHRjv5V4jB&_TO3fN#NWAT>y4h4n>NdkGuQ>>P+zPmM7jQ9Y?CE zTKw$oyy24g+tUISN3zuE1{vuF+0a<>>(JVy6<(?QgVpFh70gCM`Jr#wq_@o6xdK;c zeN{6O9i1Nd&|odYR=LeN$om#*mb*mnyg1>??`GGZ`P}6WY+#K=zG}M&m4-6WoATgB za^HDz$H=$8GOHG#7X47c@HA5+xa{!b5)nhHFd@mEL8$FAKfHfZUxte^Mk6VjZ@IhO)bqZmZVrY2UJgif zwoz$TT7kh5$iOuPI3-~q+)bFJ_dtr%<6b&loS1VABa&^wd4_ANE7n)GM!6VID2}v_ zm-n8{Bz6&ydPlg+?&eiJc*j{~p?&*dQCuo5j;`gI>IcPFA4J`?`La_dQuO*uMQ;~y z%prki-GWaYZm*o)GM~5~4-l~oO3^XSg1KR5lFp7*@E>0LnNNecA1N}{UezZZwgER# z2W#^q)v&1jpHiz_{62FHzFSa5+&O|8i0@c$URU}>LpQaMp?kqro6y9B1Sswpa%Dxb z1iOE*r&GKlY`vW>_vIvHY}jM2tGz+tl(=SNYpXc)pH7PV!R^AZsgGJRVw#KLO&R%* zO$)GOBt8eNSvIF_jYs{p8X&_h`ZxJPMK9i2XL36OMZ$1#KJ^t7c6~Xs1>Wq1!wWk` zrg=WP%Gv+d;q|v4MjjhzT6N`M`;_%LbJhMmH;yn}xUY6q-Gb;p`?dk#fB>0`Rd<`m zMN`=P1Kd$IIr1!95{b#4@|ZXpM(=DAAZ3D2VjAz9Mw=C#M9CFVMFkg9#c(Y^xaB>p z-2=w4CFrft#&)4XB9fDsi5#U*f4@3Ds$WO7NFMPFl{DM(efpY9P8z?|8m>-T%zHEP zW1TW(n`88M167yJ#kY=9$;5h^1z+JgdaBx=ZvL#JU|rD&=xuQBt#L77*`B>HRITJa z7@UJH)E)%P%3c6hmSz>bc&^A`P7#rAYs@e0uL>@96h&&8lrr6t@D;;oi^Y?of%CVL zaKHn$=eVbHX~w+t-cl3m`A|1U(c(JwcEJz109ZR9w~@%dK+y@x%FLv|UBa+=E$59p zk)6qqOud7bXePc~kB7eoI!ij*I`Ep^uJUe9xPyNP6)@X7OTVELOuRezjrG-6zPJ#* za)UvTxA_=PYD5B}shCdC!K(A&M|$|&OZAtUxsoXOutVS6`ThEe(#F}*ODE>();Dxp zKd1hkPvpK?wkE4=Po`s#4Gf9A#t~}8I{2DhaCiX)i>IaXoV8SCY~PNQ`8Z$;qE7p^ z9*FkN)r~Y*6wh1x%f0jl@qV2w%CsW;cJD&!7-Ozkwy>=spR;te#`bNhgcxJg90zCX z)T}f|m_ZqAcW54c5g80eaAs1tPfC~IaNSkGK$|MO@}Z8S1hvyEPY*CwZcVP>0x0e2T1n&7LPAj`IYZV<#oMfi)!0%OkA6lO^tlaAVz2U2aa`<~H zlyuFy*Q7$I410D9ja$xVkWz~~i9GR~a!H zaI>U@C}|E>a#%=!JZ5CL2VK}shfJeJf!q}o01bs9QQbo|u*y`8Mtt7swSeYB*$0dM zRfZ<~wyW^kqddJGSBGnR*yd>}Fx(>=t|`EsQYt6{ih<)}bT62TsRoSUH#Ka#e_!?-y&f#UEpx36)>Ic{Zj|(ZiTX19_Pm?u0VYHGxa`!?s{Hj5)Ve^wrJ{#4hrT`WHX(quV zRu9Flo@=9cU5b~O2yv84El||^y3COk(mUXrK%LE&H3?CN8%4)@)}R`wuoKnfQv!kU zJYx^9qaI51zTC`CSNy**F`r-sb}(cPN~sih`5!NO-=XO7q(9Fkb@&6$m{+grD75Kq zZiO^c5F8{;a|LoFUpTPs_GeciyH7YN+`(cDVaLB6&(M{n$Rr(CkQKODCIq?Ch34m< zh*46i6bZ5SQ#*^C5=Lf`XuxNv_Q>4nVvbz9yWulQZ(|l@C9|*BE6QKB`yr_oUnz~U z22ZRo(%t8s$)Y}S|Lb!`rQJqVyC+<$szFe@lQ^`GpFQT8DN|gx{ep`X?0VI{sMhCI z&z=zq@S!&BWa1@csMXu_!N;AjMS`smWX?AN4F-hugfsG2rnmYqv3P;}bL?A*d!!Jp zm~p{OY9ly!xp*kdb5aMTdwIeAV-rOD3bJeL>zH|7>I!2J5M5R-f-y}H_*5Gg7%bMhD39`31`|iEnjtlg2 zJ=>OaKE^JwlWlq%*_i?&ZA#$>cu#RtRcAg zU++mt+$g7uAza6I_)1}%B0i2Sc+yBmY|31H1u`4A$qMd-2^_wzhT!QMiWOrZIJ$|C z-}72-r!m03YhW{U1PFpTn8_&4no2)Pj~{$AH&T~L(-F}59xd6O>U?29z4CAo5%=wf z^?gSReGTSYULs+Kvm2B1X6eiC^GkMa?7*8-3KY!zEKghZl!Hns*jhq9%qRG4x@23eZaOeo%7GH2s{DlY+EaHsdNzr0AF0vO^4n2@b zgJ6}gx=74)$@j-tKK|;i1q21!Ca(VIFGT20{xUg@NrJT`*Uh>2=^vE=4|1z#ry6aNcI4@VPeqPa&)T@H>iAgvOskX zG2i84A~`Bl&}gqZ<)CnvX%Y$vv9~?L=_o2d9b74p*#kWCh92L+`O@)+f&0_w({&ju zKGjM@!TIIw&&5x|;Osz5PDF)Q8o>+C#xrC03Is3REGg<%q*s@uDcu zW?6=w^5e?M7f9g`Znqp2p48tjy+g)tyj``Znz7`9pNZJtoN4c95hBA?_rl?EsnZJWqB1kthS5#}W| z`@r{B)62bibYi3&eBI$sjK}6@8p}Fi=%wH9KnGI96g@m^8@^ysCxwA6g)c#|DMSUsR6zh7q~uKSB@oPnK}18v#p8AcjekmxBEghuDOdw^T5xp~l`5b&`(HX=PEm*xkO|qZwN5hf zkGz?&;)#4uH7IemwOGA=2Si5+|3^e<=JkQ-;9)9+eTZ#huQ6_AAxrQ3-kZ?cC`0La zt~)35g|EO(S+?(rUVAyRWsjUx0qu*C(Gk27Wb$QQZJxqL3??$AM#gWnDD2LMJl9(^UudBH6(9WrIYCDd1ZggHrKf@({nD1r4 zK0=~4lyv2yX8~^n3h^8~v4Z7_{7@Vz-l>@^WFz!sjTX2fT2$iol@&Zad7DFJe8Nt3 z3XH1{bHdG|%hFwu_bm6wl0EmKy<#ey!|+=mL|fa5J_*7;~jbHddP9dQF2<*&-0n=Vz@Vd*Cy4ktW(fw0vy=XoU} zn4MDEMgE6qBT^EeUVnTWF7&*VT*TMvBepJ+41cg~ZF4>$&UFrJ+Eg9@S%h5|b9(Fc zCac;vGc2c;$^+>)zYlY-EMQxZVPyE+b21*gzLf6f_s+KH*`3=l>&2f{HJ`X z1GaA=k~CT6Lj26ORJLh=StcX94eG|3FU=@d8C!`t=^k-M9b z$cWHOID#XSVo#yzcF59M7upIDOLx&EycC|8&Uazp`FL-N2D=OQMSgbxzCJnA?DO6) zZei9cE76JV%Sh>@U9vq{306)y$UPN7-|MwK<3{K^KWu@;pG5#eNp0&!T;cQ;0(>I|>d3&+JU99< z1R060yi#WK`8aay>!ok1LxCQJ_xgf}bBPNuXW&dhT~I_!edL)$^N?oIk4W`3D~!>q z)oZ*?;5LwQ6ot3}rGpnKo}CngK@5mr5Zl>Dv8?Ayg2su%o$k15Wa%kM$z^+} zc3QW->YRjcELDk4q~(Mn?KJu;mZ6%aZ}`v05@;fNZuoi_wpqcQ!i?Q#%0vETnD>LP z)9!n)m}D4G@E5-~5LAaBru#mQyg0u4?F4114`bbx!(a>eY2Pn`C8(nFmUX~Dgu=xD z;*?|RCU#>b8ePi|Y&U~#NtJ4}*oXFMEGs0T4(_Bl6vh`x?jQxFMz~S#WzMmL?Vs(U z3;B|fOi8;SSlCN>%%7>szt{Q-I>AQ*s^B04$X=%W_t(Mbj-+pkgW0%!)ruKq+Po0J z6&9@ExN#fGi&uEx!sgMdPL3zxA4aAm_3sPdb(`#0z9iB#f#kqk@6;j`~rxIsW zFUb0g(*5+7kH1%ClEiw%Lr0NDd@`VMdr@ffm28Rw%bDC7FYd={OLLgCxw&-dD*;Wa z=-X+KQ1Rh6oS4qm4^p>9r^8VdKcWHH`OiI1)y{yQQ=XEVn*7gJYT3cJ6$G-=QUWF=oIf}s@3 ztNlTa9He}$%`@Aeh-t3}EcL&!^0_NJ9k*Orq&& zJwM%q)7*BGwAzl99akCWwmf|L&)&Ed;zv|fkhO-*7*3zu@}F`c+FKv1<(ibA2b20@0oP&-|=lM zBJo;y2Cz%L4(G2->klB#S)Df`0!_CBZMphghAy$qfTuZ3MB}!PD0wnr zccA26Edgq0jfc+d6Nq^lMK34AfS2|fXQ{T0a0Gic88!PSGSTTqCHV@7``IQzW4jq* zJ#{EGQQb?G)|~EPvynW%5z~$vw~KTEkl>P~(~ME(RZ+vAJG$@rH7g_E^x8Bq5o<_tqNkV?R|t1O_Tdricb;5v~+m3eCbzmmMM&sE|%%2|EAsG-`cEjwZYIRJqQ5 z&nFA1Y&|4P&PKG4KiIfJb*x)OQbTlJZJnDv1i zuy)5p29g6Hp6i0nGw7zT8o08sMg6{j42)l91k6RFxJTXSI+mra$UoF2MN(DKFUZ7g z33{{eI$EwYGG|SQILo!Nbfm(I-p=WxLKl9`6+FDU5$WW58THT{OK+sfQMc0>TQ1!$ z2T0cMfOMBo1kRi`O(Ciu=d`56Yl}MT=vlV&zCsFfeWydfUmI1+&P9E?mqUg4Sb>-h7Bim;1o%w05i#W@RpC`DMUC&*XEYP5lf+=Di){ zd`7X;uI%yG1#(kj3EXv`5@z&NC?SE9dinJz9SOXu@H8q%9?Zg-#RB4Dj5#D>-}ei z{*PRpb50G<$)7l0+dD&V`|rr=M_O4q0Y0_E6cDT6?o+<*Z^NcT9I%&3ijwTIK@N2x zJ0H=RQ}IYF9e+Cn9D1v1xxWRyF|~=7TR(wzBa&iHv*+mM{cIp-^;O;QczXmiIB|j5 zP08=Bxonts-Qig$`iCtOJc&b&!%`-gS6%=K9JimqadZ5|A0p+#rNnQ|6?QC(N~Pem zc323O?!fr#TsV($Z2A~8zEE^sIoX>BWb2~n9<8m%UT&)8Ovq{2lkbUIY}C-c3@X7h z3z++>X)WfU$O>(2^e0`m?`BwA5!aO#SkR^7?+dPukm{ntf5bna&OsH9{vUMiT?fh_+#tZdHeEvKHY(sT)DWe&5%yO z1Ldq_IP%GyJ0E~+yWw_Gdxlr9Es(3q`Wb=O0PNY7g%wx%hRBSG1Dd~AZYN6b{$oolADuOWCEq0E>O&m(Tf$#b5xs6?q^5=GQz2i&f5_utj`F@EN zdJk(4pw7Yk#|!UP-GGVLxAhYJ+nF#F|Mh)!>cm=-Pxn^hGug<9J@V{^5LgSSzwG%8{aUA0iuDiD<%19F8)MqE z1!_!-jWO7P@ADN$9*;d9>amBU(V}NElfKAv46W&=Q`TQyu5(epwwu{L?UPL#T~0`# zLtv#XdFe)Lqs?kKpYtC9nHp)gNm19Qa&p&VclmU-d(Sve$cm!Z$h~%h8rT7f&4BvB zV^&%NPbZt3=hBsqv+)uuElQ*Y?7-N7L2Jhel|Q)n+XN+wGc0iTRxGs>@}`|5FVHuM z-WrOy8`k{puicH%#_3xn-}GM?ixO)*eOhOWdm4ak%SU2uHGogiX>@I7CYif}49k3& z7jILjpFC#mO(mL5(iUk96vzEJ*vR)}WjW^+8YMBiJ+#dyYz~K-K=lYvY~}6@#BwYI ze<$5(Ms~avr7m(0iXwA2V~NwBV*qgP$0XaNv=^k$GoLBWMT}%92I+p1!F}+!I3Pfx zOPDr%jU5k>?!CJ79wi?7KT}8S?v%iV@D z+h=L-yZ!aCEw_8`C*WXX$IX#ku@XUXpM-kJu@Nbs_%rB9`a7nThbuOFt_?SxW<05Z z0hgz#1V3!QgVW~c6NN844<&656G!8;`HEITG|RVJXGw6KKo{rQ%?I@^U0n3XAs1~g zyo{&%Lt*5fJwJQ2+^ybjeb-wgCp!)t@b55OWIq7CtPV#2ZxTE~KaHXM%a`Now_p}a zP@SC?=94`|wn6P2GJlRtN>PO%Fb1>Jg5H)4hRZqdw=Wm@MN?<8f*>9r4inLqo{tvz zbT)$>{Gz&bcSw`^6QX0Nb)o)QKuJrimE-)Oi9kvQYQE*gC| zH=MDSV3$Uuv7jCOr#!L>L0%*RKEndOmwK~o zMABz1X~axk_-UQ>Pq`vT z9crSIvZfh1b2unr!e^z)jqq}g9MYt0wmzK=vTj~*-WTw>btz_ECh(sq--Z2k=<@n5 zxdx)?@h;yau-{5w!+)YC_nhoYh^#d<36+>lI@4|c%dl;AW0NTwDBuZZNsfc$4wa11 zwQa4$gt@({^!vpEf3j(ab~NkOs_Df#pLvL!j~|ZVk#|i z8MyxQ%W5h|IcE|h6?dxTOE>CdlD)CH#YP2uo=>68C@O7_mZ9BC(*mS7EGJ8%zG zhSM;LkV)2!r57naaFtYaGABQpIU(>a->+!$0!G*pmCLA&2)rzRE4#;RiWBwV5}4** zgRx&hrhHl}4$D0&n|@O5kPsF9_f_l6@g+Dv&DqU4hxVyvVDYH>q0*c=RIsoYg7SVr z_d+b$hsrId>05%_Y|pmN-y+G^rDKvZr#KZoUT6fEvkxs~+hpuI2H>JN{wCi3s^zj( ztmTrt??U=d3P|SyQG|s7f+{}hV~^OoA|fn#=B8NR1ynAw8Jzp#mCvn3Hr`IF`XF_x zw|lIxKX;z*a#!w^k>f|{mTvFxxGy^&i4ims&H{sv2>@*z{#P3pc#%!ugNDtsg##x1 z`ibuTLjC0zitIlk;2;V?Tf^Gu9s+-|-4DUFz0G|ey48K9SlB(~rQMif3^E^u8Tt_~ zdU`7J1Nv9uHi|V#svFc?9R>q`32u-2H7Zp{HWu;LNYPVqBJMEoKd|^HR?yh+H?`e; zw^rgW=f7}?Pey84++8CLsNSpe#^r}x-AK zK9gxNRj|5zr}Q}VdbX;6G<*`-6SjN#(cZjJAct|uBQbRb7h^$OR)~eM%UVwY_5pbI zMEBd3|Km_y-As@}p-#*?Czx~I!$r2~>g;6z4E)(ju}TIre*Oyy%QRzZ@v>1n>pvGp zsuk5lEy&bJV!HOclD(>=5gB`sz6Duj{5QK}oUMkL?- zJLVm`NDA0^Qp<&2bTgZq(8>zq+K0=ebKh0p zk&G%#5KZ$`*pmoN@gT(324~um7Exi4sWY&ioZ!rK+RXP2sgiN#Ws=KIRS4 zC+_zUT1G|tjyL-}s|AB22UfpZj_7(9H{IXgSD+p=*J81*oK0hAGB|M#1g-qDdugHf zabb98p?N5Q`mwaCpw;>Yb1^O$bC1B-7H6fyA-02wvA~)QRRFJ>qus6v`=8gXn-E@g zYi_52ON)RUNfi|*s9dQ*8q?dqi$3egLLM&pU_0Nk!E_JD1jQP=qA|8jGO-5w?699Wbrc8RX{d~7 z$O6fx*F&2)FE;bSV4g&}$fGYn)nt)_uP;2)SOu4KXoCNr^*Uy+g`}79SVV8Nq)pw3 z0ThHcDna_w9Qq!Km8~emF9o{w_7VktxJ7VMlre`aO&IoU9$jNghs<}VjX~thuwqTv zhk)PN6+`W{&RjiJ7eZe0V&Ih}K$K(|X>5NA?H<&9dHqxZ$dibm#a=%n@iCG0!G`_#Xt=mC(rlY+u9vJXW49ape9_l>Hqy}374m!R(l;e!b0FrBW1F!%T3~o z8F_8qpQ{yStfriPsZHZYzCKw29u^&&xvbI^B|q1SQe5uAeQDBQ8Tv%ar1o-w<2o7# z-zD&m0`|I0{6~*B0iyaJ|3|JuVv)FySs$#Bu^;#o@7kDx9uTZErZQ|%Bsx{6bm{YB zH&6JVPVHX6BD~&}Q9WhW_}nt#&5;s$P?0sTIz^GtfC1V#Em>9oGX6gDjzfazv|5h$ zo8F;Ev-9GZdFxq~-Al@VPxvT_XBE{;ShF54hYn;$@%kL7>lX;77{EbMML~0?j2z)0 za|tm|loC)Q3jqgC`@Jl%4;^-s#WO*5hTm}+Bi8@dm_uxkPU@Tpb zZJ7A5X7^8-yn(?#l*c+LTR!4T6-1bNd^{o568ULIKV^+syvuDUv<+km^S$$9F66$; zq*UEasep4i0wR>=bZR*w^I&?%^L#-0j}~qI4-UnOfm8@t32-knpFMEm#!F?Uyk+-l z+A4EsSn`{P=O1u4RWXbr_Qc^q%FlC2RhQK9=RtUhDe zuF0~9pTPA~uJ+_q){n1$xaWp9b55M$y;G{tDQH2Ie#}0R2~lp7OO)-`+{PX08M#Nb zHHc7%_=Vz-qB;CBkiWx*{PEm9Z5%?P;^qa+d#it;zVO{Sb#IQCDR%qu>J;c(yQUs6 zzwTP5uV+2xN}i@mUWX%lMv({e%gA{GjrRBxE;3Q2Y9-7{WhjyD~R@_Fl7` z$$*3AXc)woE%1*lyQH#D>o>YMHGM%FEw=6`=fsoTl%rw9@TfevFE@m&jw21c#P!qrDQH)m4tjQPD zW%F!2UCO@1!jD6T)~1vUHjiJ|2GT{2seFvs@{bA%vnL`XJ@#o z(;}6Rx2Hn+KYoZ-U>D;3{#wN0OoM zw=skJ-sKCI7-8Cd%a={3ZlA7D%>fg&%VC4KGa$6Hw`T!pZ;Pz{3QTZ!3pqBdtC z3K5OF8kj=sx&wbWjkMLKkzJYm%62J|c9Khh%sQwO8ZwdrliL z*~!h#nCN{rNX?RjU+0{zf=O&o_**5IC;Hu-X~!nnt;t&(53RUeE?3U=eN;wXiS=eZ zr>c1;ZW<_budJCa5>b0(s7SkyptR;}P4 z^iS9C8tFW?-N(1)Ude&gjty5Hc5fd5rW(hQvxTTYzSV^;=exv+U+L|%L(V=p%JEC5 z`o!5k_48dVl~<@~MYQ6eh4kdfzWF%^r}jAO3ictYlm}D? z(ihaIBTD)-Gtaj!-_8%KhD5%o8l_zCSJV&e-Tgi6gK4^?+$suATZ=*A3uP%r{F40)aHs$t$NIT3#9r)&0?NkF;6@OZe#=cqON$9`bOD2_@#^c=5<%Lv}RT|u8;qu$-0V6 za2uAS8*fs7v=Vf-!$_ zOEQuq3sRTPTkl$L-1Rq#rA#60e)E;4f)Ian;+XEH$aeoP*G6j!ZWE&mj0Zumh`4r< zN|G$z_k}Y5G)Pl7&I$aWk4Kd=+$~y-Uuv~c!TU+YD_NSp57=LgxwQ}KY-dtl@6j@* zc&$IXbMsJwN(-#-neCAC+uw5gh0495RznZt*NDcLK|xXp$|m=*d6}&t;hN695Zzk5 z3`x8VUe}KILyA<)i@D_Fs?HkK#$8ID4YWtwha-^br670Nz2tbo-kz9RQR!W&#J8xu zv6G02RNgd^UlZ*A>&?yrt3eTSMIA@bWr2N!>kh<@&YU6o>O`|bnFj%`O$spwGEOUh zLK7r2YgtFnDdG+-a*&2g|3So9HB>W(siRA^wvkMtS->}-i4nV-x{6M6>yN>8wXu@yvn~669OzNid zWabq=;fyKP9>aorW0-L>-14Tv&nJ@}J7AYotJ$rZDA%MO~D$39Y zba9W=?w&_~g7&_75n;T1{u=@k!Yu#RHoHy~f!4l=!}&L+8P0pF-NscWV!edna&>u zq)^*SvtOZl?u~qDesW^<-sqYs+;K>~l73#7TwDs!(BC(po>oVGk`CE_$O|kk}6t1<0Jax zqpYF3y5nc;^JO8~)f|Z@kHEJd1-SHbwsf7jP=}1)04ZmN^VnW|Yash=L?0aUArkYB z$A9!__ftvo~#~A2*7okV*f6uOe4#4$291Ij!r5o)h z_SkdN||0qy%bPuQK3mq>z05;_cE_N|?)D{1Q*Vb;Z>1;x!+xUT7P&MGvj< zZJ8Ovq4Is7`rf>gEZWuD9U=8qw$(pJz?5xf4&>+psi>je3Y5(=Y zEfJ3}@6mlS{aquq9ra=VxF8O0_mI2)9Io`bxkFi@nJ0^pjp~dc6{wqPKDJ{hf%oAu zJQN2H@LTedLq|LYF5^OIcsq*m;+UoJNCQi?QPZD$mwxx<6y^=AQIJ0RF#vu$|2P0R z|8%^{##Jl7&Hewldh58TqAhHg4newe5RejS=>|#ZZUm&eyF*GEgAM`d8oH4fl$LH7 z=^7YdsCh@d_kQ2|{`ilx=bU}kUT5XA)=KJ4<&np9drWY2-9J?Sh&GAmUBiQgP8CIz z2%(A2h@|5oOKIB{B8W9v8O?w{P^x!PvrDrg?^Vx}kF*ZM7?5IC5FZePh-$0VSyE}v-DA-#(X#3vd zrWE@9%$R(4K(bwg`mxe6VH1AoR){SVOM{9h^OK+ww3bkGN&*#;vPDJvyNg%->3pxG zZ7WNt@-hZkcAnTzOA>Gohs=;ueCz7e$MPG;TBzx;s=LoRX|Lf%)LZ-UG2?zz!W?A05yg*=xjU{y@EuC`6tw&;CQAAU!5MTtMf&~R$!Og`OqR;} z%SPv6Xm!JRaye$9JGcc)irLOOu(qrgLHz(fy31s=BB$@aq;%YLX0rNNHkx0MMKv6c zL}*AxlLLD8H>pKp=w75}Uu8{1y&ICG^aU+eJkAeCtv{jVnBExzK}v2XR&6gA5iK4+ zHqEaUzT0O@KNLYuIIe>nSefUB2>^S@|DHkVk6*7c?S7_nbZFD_i*Vy!sdxPM3`8E? zP4eh5=MIrdJAYke{9TlOpF0e1y4G3$RTrlaPe(4FA>d$oZKapvDj=c91%(3~q zje0W~tqgzOC3;@pCCYb>E4D>naG=qXyuYy&dN#hLd^0`0c$QviJHS<&j}r=iR3?tX z6ULy9dM#VU9w^9sia9MJMUMKSX8r;UI&9?)FgWdLPB9Z^_cqIe&pTu#^<2r zYT=5qwk-XATl`UfVD<&_XG|{?35Fe^N4_eVgc)C!u^YFRjNas5vL^)r00&=0w|tT} zjD621Tm!gAe3po3=)yok6XICc$yH>r#QU^UTWym>RAC}-35?gUOKC1+M)BH7Sy1ki zO`c))u^hj%X=D!-#y&KKV}~8ru;1FW>-~a%!^=!(RjA1JUJxSN?kyXUUVc$4j$Z<1 z*`5%X4|FWc&QIx|$-UmSmeBOj|ELSe@r(TN z?FmOivIz;iN{$Z$rJmOUSX~W%%qCxYNNTuDv3;5LIvYJ$R#K6m<4d`2f#7$o?pNzgQRatv|i%O;|Sai}*}8+Qk4C4|=hBcD=G2C)z$b_jiR&O#Ujm?pnt zp;!A$)g0;RB&Gb4VAFo85l6U1Or*n@(S%4XY7mh@z+DC*`tLiBz6i<=Q7-V2q%f=- zBJaGUM8*lD*tbpWT4?ZqIGFG>UGtsyI~Y4R5gVmeXLNKOnUp#C`ef04T27zz`vBJs zcP4&j*Qj5Yu{{A7dV5=u|;@2M`plEJp-oGhgc*v-0qvN5u#d@uClyvQ?L9k7%vX|-1TSbR-$ zm`ry#h-o^uC+SAZR1L?NY`py_l+t$sSZ-__(NFddSutIgHuU*+!A!Nh?g+%!G7KC0 z+*BGfCkD{>;h>_WczLJL?E>leQSd@CvqO#%VZ{a}plS<;jeTk={?95P@1rNLnQbt3DW$=l|LQW4w$o*R8U&rAUmM&@)wWZqT1*j`{c8n`2h5TH9iE*Rl&$eFKsmlm6 zGTnp)0nA2pXp@6t?V52JH1yCG&5AG*tc;@243h?g>%YD3ksu+8u~s4a8bb4Q{n+5> zjdXyqdRqS2wB`|${xsjvU4o1N zn1tDrNWW%&e4lSplp2)_cOOiJR7iiV+0Y^*&ceLST?g$7RYV?+K!n6Hc(@`pfWMcd z<-wIk2ODav6B${{v9tl0uYkz3h6aITWP17E#xovLC_{%j6&~i_zu)tH@+E8sN>97f z$cvqRDDi3`S>5Sl1~+oCWVo74$ppoPTKnnzo876T+mG1@on8h!1z!IasG*74Bx50bw9A8t45o_-#aWr_N6}>hfutOk*KP9Ho)I~{G8S{_o;F->CX4B0o4m2NwXK| zuV%aR(d3e(DgZdEOg*1W!`uO35iTSS+XzBLhaYb2mt(L$ZHZ-s zF@T;u9SYJ{y!=LR%*^~&?*@y`fY$m8sIPc;;F0lgvzf7SQx{vtjF{%*Ldt0+WchQ- zxj(am;uqis!H-lh9*diyy{H=YStxs8Wg zj(n)`oqK5DETwDh)a3{EXfI>h1V2c31s%L9Ic8fzH-dzjEEWVK)J)y=F+D9U31(u) zebOVNEg$@t|B;WV{3X^n=lWA>m6rbR-@jOTUug*m2J=+?aEbx99a`G&C!-at2y+eR z+bRd&e*oRkr=N$qotphs9VAgppi~ai_?EBfrj?CULoKEBvgT2d zw{W?~(@aj|EKPA^lh4gc-!Q)&$#!Ndnc98+uGQ+hUIs_|w_Q0^qmeJ`S2$DM&!alb z6+fP0KA+3z26F{kGsI2P&+Wg+ zbZbla>IvM;0u{NdjxBfxc%W6P2{UA|;>7qFdqRjbNvNk0M3fgK0J8cXsE1;zr*?R& zE^=TC5#U1RsoYU@XdNHKVL|s2^~{+BWM^`wQ+)!I1oZH&)~ZWUFR!;BN16nS{ymG? z<)#Op=EFaZ$InOK=b?81FEOy|WxfYZMs`1_hEacBO@k{x;3@Q~$(48{^Vp6h^!i+q z*)!1)W$JsNrTwOlfmti%c#atTSM{pc{ZSmt+sj|vT;MwImgSrEp3t5@7FOg_8OU-xhmBE96y5S^pX>)hx*@nT~eyoM@KRN*2IwA$F6meiG#Y;WUm>EGt{^$d%Gn zq}Z+YNS zkIII+Ctc>Cd{Ps+Exv~q(M$<1M;2#qgQpQUXRHEKBIkZE%>gDVxsP`x9^3O|>%0KNJ8*|Frj znzh3$>(kz+O7~ODSn^2d9Rn=$OecTIuu(^XMPlNR8*T^K2`U2=cG5Z7s={uSr<8c? zASu}a_JM?T8ZGzu$m9x*heC$bDu%{3zuSpoQv{q_uF_AX`5vS1^_f4U91sO3&V*`r zOU~8L+e$cqM7@ABB;dx%>^YL|+lMD*R3qLA{Y*Pk)JZHCIdC`x*_w zOA=30iOFq_CMxMvohOw-}Ha~=EV>V1{!`Mw6i+S&&BcCb^ z)JiAPU9mpaQRu@$B0epeO~n5d6UY7OhLbo_SFqbC0jehCrm@(zm6-kG9H0$X#@Uz~ zYWQh3HZd_bi6eO-1xLo;<*WCPjzdXeY(1qnT%h(FbEtU^VLB&hmy&(PSrqVoy>0Cq z9K18eLTlmHzP`|%Wb8;!QDiDya&+4ut=_7i76E82TeM=uw}@7-!bW>70?6W_FR6z_fR8Ut+49I*+zgo7svoGP&xy z=!J31Fbe2J0ET0E&skC|GIu{yWaS_ENVtKhF_ftoJ6gf7r@t_mY06sbVxfM;6>wot z1VWIyJ1#0j=(1VxN659xeu_J$IcpF@swYCaw%Svm4EOQ zH3)E3>2`*S9B!Lq6gp)a83d{ff8yD7Deb{4#iC%I9r*+1h+?SLb8t2>_DtyA>Jjpp=p&JMb9Ve*!JBbOVlRuMYN=--yU7;X9DVA6;KXvN%VOSVvJ^M?p7pRse;CE# z_P%>Gp1{Nqctj*p?)L%-L`eUQ zkUS>69W8$(JQP_m&X_3odQxOYuYT0qjpnf3b8a<=Wth;j#H=g3E-l0~8Uxa|-{Y)C zg=2C^nLvfrzXt(7Sd<4#JE4zk(h{JU7j`%{n)uFPQSR|`c+-p>g_NP$`2d|by%3gK z45w*xw8E7>rW8~YM*6;diFsk?WmPN@TCnMi=;!u6({NYkT5kqTqAU z%AKy}P==KtXEW}yR_Id18X@?Et=4aopxBAPXa&1jmOdV!v!gN05HJQWy>C8O@UhpX z?b_=ReefdsEn;#I>W#}z%)=H*>V&dWeb57HvRQR?3f%?b?@&3%DGs*?W_UF9+qiy+ zfj`|@uE!gJdoT8xwS?A*!w$D45rIyc5$KiO0M9IaYO<>ikRwz37GhvxCCSGfr0qi1R+*< zY%hZqD14Iqvc^mX?O4&TYFHAZP$tFa&4~U`8q$Zy+;o74bcBMUx6x3>d1REh-z5^{ z#{SO5m(f{;0M>>BvQ$7T5Hdh9I+z4#T@H;g#4#gvG4$;w>DyLHmuL7o%%N%kx1LLv zV-6a%>=min0Rnek1v@{LI^1^c(Y;d`ZX$mm5591=*%QYrPk*Gg>kw+-1E$3@7O$3^ z>cU%U5iEJSawXkKcTwVTg>jls^Q{30Sk9xVN@}~MrloMX!+h8ZbI<QGi;2@y%@xi#`01rBS22vwbvN{EmTDu zYtA0@hIVv)6!qvJ79_-&9dY7#F#^$Bi(0#>U1@BKHb#z(4vfOR;!9?4!~FOk&y3@D zE8rVCCZsl`nZ7&j`USQRAH2&SRm@%ATqEq-w&O@Y@!u6=i?n*S90w5Kv-SUx=ItG3 zeV*kG68AXd0|w@hBTumD&`I5`k!E%?DeNB`!NrFE=^ZSYN@W8IgK(XC?GXV@;3K8w zuLX~hmSW=0BZr4B3d`^kd;@GP*$ZAq%DD?)6pk_>I$)7huNZw_kt?GrlY`0t4lUtDge~;42fZ*yZ={uAaH@92kST?UEBHy1 z7>MZYJ7}ippZ4a7^2`*Oom2#%Q?#5p7swY`9Y|LFG$5ms&`0LwhBs$SV60xh_!J?E zdLS^v_MKTaa4o&v1@oi;^5UC#dSBK@!E8Vz3ewC?PhvzsbvQwVHq#wG{~1I?Ec*3+;uI0aiwPul+s0y2D~^9;9K4y=C4PAZ9uSq)Tp z&c4YN@}%*2vLhog6Wg&o4R2B>ZI)PN@1*BEQ@`ufg;%uHV4_`!z|uN{b^&O5eeM}$ zR*PNxA-;>$%M%P=NlR=lFrF3!Z#b>I*&T!KIy2+iDmc2 z)o^h0x0UCCbUe9$pX<~k=|wclJ|ivRAxfG(d2^a`|KnGDnLdjoZUJ0{wKJ*i6SLGg zO<=)+}jW+yS)o95ARLsRvRm(p-1!(>N5WPXz$$e)!Gf5ubM#d` zH_t|zT~l{}o(B<5lzGs!cQJiFzm7x&S$G{vm#;s__k=maIA?&U!OFSdgvB>-5I@>( ziRZ_cv(WY1ZW>G}>W_W^e4F!od>@c+$h;_;ZA!-%gzcW+Kit`PjM_%$U1IjyHl-Uc zohvqIwd+}Rv6E~u>VOTr;vT$kg7PQGpf&8b7up;waT4Q@pPk~Usc--jjlA^!=p?*z zctUDVYeSv4dm|{lcV^{^UN}W?sJup5VHx&$Q)w|dsLMFK89#Qj;OS~&N)Uy?bYBk~WWe*tFo%Yva9_m^FfS6h4cawat8xf){^;$-(cWW?!0 zl6vJfkj=iYVWb=EM@wupbs0ZRHRN%npeJ^n)bWuRXpK(aZJ1$ov+@8?Jny#J7dup6 z1$?>=*6mQuCB|`se9;Ce5`~q7$3S`r!Xxe)paR$Lng+iJHZhhqFY;7HLGsS#nDG`z zD#a_gHK(0vFkN`+{9Wx>+)cID&rI*R;4`j(b<=BO8&{`w&EpI9x1Zl0eFHbemifxH z5yN~Z9uX=C<4zr{E-f6n71osOp3$=@rO-T~GI;oXL3hj!U;Q+Wm!&}z0(C*3>+Tx- ztKS!7rCICvgZX6G8bdL#zF{mNEG3lfX{6N~0~pUoV?fO{Z6zd>(S!JM48?h`FCfR;&hMXz&NZ309F+%~YX3+D0W2tw z=c0SWe*6pRf>r2_AB6h5!%HhEB&_5yiiNp_WwNLz{CiBC%RY=^anO!ZAoD!RM4*CR zf7bvZB-gnMt+Ip>Uz*vu&Q_)k$03~Owik5vhz(@ljN<~iW|vm$mrBr_AD`TEi8za} zv_B6>jFc>_C29Sn+CRjHd=R{x-7i_I5*_1bR!@U`8LZDpcbJezR46GeeAou^391hrK+ z{u7ONa+M|+5K?2Y=&;-jxa6jGGT3!NVrG+;YxiQnN4X{#o_q- zM4mDzHg>JsPDifWn4H|H$dgOx3o4U_gCA_csybpfP3kBbDpo9;9`hOZz~HR=y&tC7 zLKCE{_$&=@O2-~65U7655Xy@lG>wtN?JFsav92F^+(wa_|kV>Tv0g4;w#d zcw_ChRrP8{;nGGV<`vNULA{Tizunfm#6Nsr3VDB9?e@cJJ*x%r%SPG!DCEcdwDuR= zwrN}K>-H$`5cx#<_H;iSUoz6PIjsVuvXa-aRV z-c6Xrl+V$V(Pyoalwvg>z8c(*Txz}hz#j7h6|B~6Z$5ZRT0Fn*oKT*QmLHG-4AVu# zJbAW*k_UHD+=~e6Qr)gaE#=qQ-Uc?*@!QjTDJ;1H^j#zgmbtuv^l*x(cq;P`R22Ze6_$Ji>((mSm6+9(NG)k#V7MlA`YjjX2n{c#9p*KJo`dkYU zy2|5x`z2`v(C%0{A}Ien*^29~g+`WodHi+)t!fsT!wToNw&&ByopnNpqIdqW9nH_$ zbZ&e4bfP8GgOF=%KdZYb7m|8$XUqNRkiF!lQ>mJj5C90^4QzoULW@I>ju8B`KOw9b zRQr5JAPbI4`jxbA$peN5_zD%lue)YjJ%3DwBQ=DzugmJ504c5GuXyJ3`dh0MXzyLr zXACQpbGS)6+2EB*R~JPgH9=Tw=4=TKb%dfVe$v6`i7ZKrE0<9o`b4E5-5;dbN@y^@+_)uH2T>$5=-(L{Rhs< zy2) zM6swOtu4&jgd==&w33KqsZSm+LhGd5BiAD1I&v+m_aZCk;7(>+RJM&;8OE3RaG-6k zZE~CyaNnk5{`B_=hX=t%5o!e;H^ct#s2}HX-3byfCfwXBq&xq;P_Fig!PNS5Y>MMD z&Q-6T`e16`0;oy{ZiP75V*f`LXQ-{8QEbN4&pd%7s1p1bVMbWi!_C0!FaM~zC6~6Z z$27(d_NP=}9*ibD(6a<6r1DBJj zp$3n`6)Bje5D(usaQXG!J>T3Yv6Gs+l56abvjZRbfd3(_#*#i;V4#6W<8FKPZr%LR zA9B{gS2zARRa2qVff^pFY=LxHLpN39-opInuNEJQl zgpj3#N}@2g@-ctx*RKTJ+!!xj$)-^-V8mITzpqb?A?;2>a<0Vgi>pTaMEH#{l^=~b zLpMv78x6a$RBp+xeHd3Sn8WRGxuItO_ji{qiLrFtgSl_QF$&YxQKdtfan{ubEl9*If}qJ2$%m#> zIP1KDreoXiWz6i$@v^P3zDN!4!PFycDNcf5ZSXHCLr|%?66zkR9=kKRVg5W@DQstk z)Nabs!lsRQiS}W)J(E0g@+O$zPn^_>1BfrSTDKHhj4Epd2RyEith-tCfVt{P@h;GvLkg z7eW~w3S7)qi!cgCeBd(S##^VieyV#HF|0%E{%q9S16auLvezT<6z+ng4CKThL*$a& z-$<}=fz=_lJ_5NP0-lPsj^b7K!pI!h3AlPagvb^G`ly5qPozG-yElF0#j?4lV2Lw0 zjTw>+_Un4TdfWu455p)#`@jpFzTRQkvsN`xFIPD&Xh>6`E^%IIYqGUG@>k2L#Hb?L zKv5g$GNw_MBRKGtort+p(0fa154cqwUe-@&OUC<1Y_T;Mzq87j*aIc39Qi8yRb}qC z4{`nDVUK!ilZ*A1AX^|o`^4!V4s;Yr6wUBVNzSqmWAPL9+jLLXJ_Cim-Ig#zAe8+KFE~R(_g_Ey)yjUcrMHd-!!09HVGj)eRds4|$pf z{!Cc6+J|yfidj+^bkZx0L`+1II!8-b85dO6&5munCW77J6n6UOiv`jOihqpzC7F|l zUIY|~K7G9Zy4IG#Q(xV5Wv1a3{m4c0EfMv21NLUQsNc^mC1SOU$qmtfJbw_C3Y6&+ zC}>9+chDz?(nTE*)loQN;}HPs^_~v7CJh4dw*}IN9x_61LC<}SVR=B$$=lQ0N|6`d zct+Q4YYW|r@0Yy-MZGijo6O%n>McO0eWbrYroD1gex9Crt^SpF4e-|pHH|6xI7B+` zc-;0R!@f!V?HXcjT8GsCw>I#@U)@n3C|%Cp&RDirpgOaL_3*jm(BNI?8ix_2?99s> zl^@nF%#f&pO2i{}HQGW|luBY#k1mHw!6Ua36F2kh>9XWKmGgj<`@01*;3^xEM)@t26s6*ozJ5D)yP$b$uJGxd(C~VshB33v z;d@L(-|E44LVou}E)(KE$V|IL9cuM>B7np$uyLTt5VF=g+|>C9xuLC}+~lZ}rAfa1 z5STAC-S z#jQFOSL|*onV$2Vwg_P(4}H$#9TUnVS4S~I7NR!OIw|%Uw8(xMcUpnyZ_YEB4ts1v z&8E^MqstE8!4aU^$cK*3r2CFPnT|6Inr(|tPu3ZP7Fqu1ZX%??EP-b{-o40^9%9DC zd0>R{BZ%h_c<@k{3DBFp}EK)}+-EPDO91@{%OS8+O z#*I-V@|#G9$bu-0PAs6Xx6q0lipMq>v=fC^Nc54Yid~63ob^_^XPPWfLK{`<)5zIp z@~1N3nNy1*l_!)|mpgrf4y{}p<1Brw#$GTcEHG8y*ZmmhO?d?`dBfaD;Q+*Q3fTiq zA3KSkJ@ubrd5*T1F6uK=(U7mCVtiW-p9R}d2KE8G&B69g<`??Tm3Zn_&X9ZEvyQ?S z#IvCD!>*zp>7UZ1vc9_b=dSiYJql z_|)45Gvw!ne4TT9u0D+E1Dz40jR-pv&5Z0|SftbCOZ_EG6qYAa4=JJ?8qCOzPdpzU$qJbP07Svtos;Zn>>(&{#)Ks9cG(%ia%SzFRWQ?XqIVLM4#76@h{0}u8bhM2Vm#;7~1NdW(AAct`HmzD11oL4-Uk z;AihleI`dFv0%fda7V};g^FSInIp!8vHU>j{y&aGl4fNwZYFZKkLu0rNa~LyEA`#M zt-}!uj^7GciV;C*YjfwwF&hsT-H^vvejbVC&lZS2#zv-k^c+$Y&+ax1H!lt=2oF*> z-*!6GQKG~+t-3KdNi+sOg9LCFrSLLXj3v4PJeaC7rlbqv|tprH_Htr zlj;q{aIyvHUk=*fy#8Q1DO!k@V{*Y0RTBQ8EUBXUvItWGIKx}G@rf*ldAp>&z?aYY zK6QKQJn8IqC;Dt?RAqB?7JRm|^Ug15OUADxyaKcEn(0F|N#t8mmm{uBW6(>KNi@^p z{Gi*_A&Flc-Q-qUvo_G?U!kM1ofjhS6Dl`WFU_Y5;Ue~_4XG1_-d9C;(KNl*PEI}a z!2E^JvP(AJbC$u@$0vk&67ud{Ysn-$NhP&FOWWXHxK$}?^y^aPc#(W zsu~`l6H;xSx=9t=Gu5?T6!x+f zvjL?u#69D)sf|BRSoG*mlVdc~mb@lsIA%MnZ7xh<1F>Q>d&8<}PV@+a+*lITQAkI) z-i*PkP+(;0JKvEEr#y+~AZS%|sd@0WnjvmEmGj%QX+0qm2Haz*xnR`Bi6%Ef3?6I1&3{=doH%sFi07 zEWaUe-@1Gw(2I?&i1iXnFW##@scI+Ju!vSGxi`u0bqLE-xvH27jywVv*nKQ&Ec%T^ z;GCZ9m_!xG3`DJco+G+oO>vM1X6{f z@O~g)%u|#mzn#GU(<#gAlF+B$$)2Pw(`3AANduR?K*0{T~PKQ zIwap8eAyhW_<8nwHuLN&S|M5iTCtDd<=al`_L>I+wBjctl9__3!txW_^qPsx0aE!{ z8=((BYlnG2`;sCb=nmyjyVfHfXYg>2{L9#fp^eiZKL$SUGAld>UMIsV12SHvMI=)@ zCrNwR;})`I?TkN1VeX8nc}0>bQQlnmY-aqvhiMYuL2`S9cxqPJ26L!b*H?KJVN6H|zipsK$c@Vf-M>VLY zqQ}GY7Q~z@QXCa#c&@V9b0`3cY|`~{j9pWjS;sB?!KP(c6eOC_BmTmf10j%Dr0wJ% z8|e94(|P8lbaEcw+hcS4zezw6w=kJP?)7~t1@;Y$PFTfeMuHx*(Xl$@zxMYsfhDSa zLQOEs@1$5`byJGekTB1d%BXJhQSCyje-`R*R5SLu9~{3heG|Emzf^W9Pg!v2-SZXF zG!?pUZcHj*Dzn!9=!;@A({jm3%>DeW{h6zCC1WN72q=q4o%RsF2@JeQP7gw+fJ>QUx8IIgBV)WWXq9`#^E}9%I zB2QOFglI$2=&W1=W9o~TfF#?X^Nf_zc+WnIq*ZPrbT^BfU`hYOpJPu#yT+PCEM`WV zeqQ2u>@DoM3c~^^LZhJ^&cAjgabf5t6cmB$eK40_%Ul6Ys0f_^a)1)FDj&h=cIqSjVB5 zlGUf**-57|-8iKDwb5$^o|ZYN8cQ3+FtC{~C2g8_KM-#oMf>UkQD_t0R3KvlG$|qs zvG+Am#7R@(sLxtA(;W|faBsEBM9FR@e?sR5eh>HX(q)ULXh~~KsZG0BoM(O`)4%l6 zak&?Kignw6%lN@##lvbDXPOsR2_`;vDqRk}-ddV*yV#tF`TncSC}v<-7(LmXaP;FZ z>7j{}AYS3}HyR~Ly%!F2DD$n~MsjB$CkM2_@;EG;4G&qw9`v-?QnRP=$^`9oS9$;f zaYj5t@P}=e*4kSS@VH=qTS#K)eUpVDip!@kcNDsO_Og*;d!2DQXujCzxtZ@uub+;D zqZY3eo$h%eJ5PDo6`NcG@l3A4RL)c9-Xo{tV>QS0y33fCu}~$t($%l8x)7-*`U^leGSur23}1JrqOozVyuIW9e?iM;R{1#s6$LU?n~Vcq2}eI z`DxBM{EFu8Kg4=?2rYOcE_T%RuwjGs2ZM5mVmXWSINlHR{x!9}!u6Eux!W*Jw(TFz z!3wO>xHtzOJmYvu3pP&&)WwRjh*_W3c zmcTEOUljx!B^n=6l-<^*oT{p_MvCnWt5uCxCnIXX9$JC{F!qsB!*;1#*4(YfoU1M6F?8 zaJ<6aU3zHgCaqb4y)#Hra?x$$eX=*Cr$nwv@oWT)zRWk6MgJs)x8p5D>G@L+$;$jF>mC~N!A5UJ{zgFlC6`~`wz6DQ2c^ zl#Z}i+;BBg?tRT@) z8-f^*SoXMlqhtBM-4{IgCm;Stw$m_GeZ zSf9&;JYIn-WiYzEh{34E_$ED?f4HocoaqQnmGWh}=(C(R%Dq)D?1h_lg-3dv_ZCoH zJw+#nME>62NjF6N<6ZzcEZV|Gb>Ri&YVEx`s*dm?6aC4j0WUH)y2nY2rPO3$> zbkN$_(zbcAr3D~LAg8M-|c6Cczv%5YcBVi$rx8Y-}@}-S0XQ6 zFuaQ^Ilruu5bmrlvHb43HA{+a%x$R2sh{@3uWz(mHqB>`eXBtz_Xe_|<)W}O-Z$D4 zY`v67v&eH2^|7|Jv#BOz%yk?4{T9|DhA5|%mGuu~Il%;^S^c4@a4r0*;2P2PVEvrB zWcVn@R@kv21&&mOLY#5V2{p^2PoU;$fCJLEzFh}D?)oBDa8^LMO8C)Gn7F<)X zp!%8qJ6eh@fpFCk99d%Pq?F69QPB1>r&TCOJy!BMB zVm+^@%yalrZ3BGE4Y|gw$XS-I`5|)45c)*#$}RrGFCGu_+0ksk?8Y{mG;7=`y?24= zeFz9u|0M6pb13(-kTTk;f(u;STKhHt^4{wp!M$(25fhliyHA>c#Qt(urnGPaALAWJ z3G1*PG*~IZ%{}ZDY~u_Y$oGY|oYR7QLE6|DQKfOZB%x@tisxZ7H?`MWz95;?p)UmZ z@b8xtbchO#Q%o)4mPnIN-bX+G!!f5(MNC0+8Njb{53=K}0n#;9xMX&sLm8lFBUFWB zqqc%D22~#ZXo7Oo?U_>_@+tvyTH(dN%P^jY_N1g&lkb2)1+Ea$lNi1&H21iSJ|T{M zW$sT~voBhi`@Tw@Dk~cj?j^~*H}XQqq_LDf%;o0fb*STDJq^l|wxz8;PF!d{zxG;9 z8T-;dl>Htf_=n!Bf`_h5cT5CgaMuhNoRVJq_YqUbFq)@#^BYzi4Uw-yU{04kaL6^z zfA(^<_tyt6=91pK&E$&pBwtHbW+k@KZO77G+ktoYlXlQ*MgKIdWz<)QsCwah2arU7 zY(i_xd`p}sEDd(nUrqye>-53d{4#ZUJ`UrNZ<5npzh^}1D(aCkj_6B4TBK%H)1+n( zg57qiEDY;(BJW=@%sClzyC+<=Gy(=>ed;wLdLLew8EK-dD3rD9e6;j zOPn@H$EFcuC?ni6qsLcFh<6=p)l_y=k#7&Rr?Ue_DQ`LmG=sXcLUP%W#2DtEd=-l z1u+68<#pFYrq3n2-1IGKG3+>PTcvu=f2gn|b{t=uUQ3IAD5_az1{T3{rIx-OC2OtG zP(9MWxx;*l8K#q`hno&RM4Q$F`(!lyo?HmEg&7a=(jNYK7PMY~AAvzB#+K=LmdX6V zGR-_mkSg#bfJ4g=;+Mz7-gBAslt>w z`}8bRAT}UCp52qQ^d9P%rVdg8PhjLHBS4*?_b(a&u%{*4wZmmIWuISi+TMh9(ro4r zaH~n_vJ@qQYg+z1w);?`d{?tot>rDp?K*bJ@hoQ79^7m`yqXblQL{Oe+kvLeyQE=< zNA&B^T#pR zuQE$ZXmzin;=%q3vj4{DUH|m8wYye9x2$TUrl>r3Ca1h8OjOuX&kiQZVJoWGod+iW zv@3sQ1`hS};uPD6TEPm`9s7({h=(!-EqY)R+6wi9_Q=(A6X`C}>@Q5bxLZxVvvR!) zo(~52AC@0Bj{$WbPT#>x-hfqja&Fg`vH|+G@3nv=1IKXXorB6E_IxWL;R5d?>6&pO zglGA>51y3&Aet6JLP>k+>-bRW#OCuBZqzgTi&)WEHrT|p<}Wgi3CsJt;gTQOiTDHc zAD1IxJwV!YQ$#kS9)*ojT0&jmP0ds9Gmq^rA42uiQ8+>p7E!LckuJ|*JfxZ5Nis-fn(hL)-Fn3@7I3XUFn!C% zcAfWI34ATFP=Bu_5j>f2f6bzY&as)d@tEql8NTsI7-(J|>Y>nN)B_!Uu#pT7 zJaGSbbRDx;X^A%xHXi5|0z|I(HOG!z=M0B_ykF0247D!Am&<$iXlsA4$Nyj0b-=sP z=jS+;uJQdL%qF2Xe4BHJlC_{pkWM(OE=J00WS$g=kvLpWv${;*;*#UbX>8?n2s^?R z@sw$o{MvJ8+L$}yI>d#hLx9JmorcGu#GJ>v5P*Vh8MX6f>}V$uU^8N%WH3Um`g1)q zGPM(6m=m=9lT0!w1^v>l2D}*<9b*++V(| z-7e`~x%K%d=BeWT_V#Pg+U$Df$Ks=|k$jO&KAHaK@R>UI<4CvdsfifOiSANJKGAOJ zHVJrF6v7q9cq|{XBPEee|KL{yMP#3c5TTp&o;l2Grn6381Gl}Zt&>8q+wMkD1iVew zC_D7c5M(JbAMbkoRk)9n=9YBzG+c@ zi$95~!FYyN==*i2gG!OPdUu_@ytryulNp99m$eAS3^3RnrI6)1_3?;bui?2bzwnr=6zW7b-A|>eARy!?Qi2cD zWF|xRMZ;>_;pXMNfB?JoVkdOIABq`jnn=u8o323)<7hB2RVJH05!Ul8Idi3Pq`<*jO)9<5+^ODpIcJea|3q#Q5={0rBj0Nzxk_lxN@!uv`u~vi*KbY#@Bcqe!;l!I zG$ThzN+U5EbcCd|h=Ftp0z()nF-k;Qx+NS+I7DKA3KCKRQqtk124nk9eLP>s`}lnS zf$fL$IM4feyPntca)FE>9(zfBe;lOvXJsPBBHHxHy}+BAUbymwnPJ-g$2ar$ z*VGniLKbm)*%A6Ys3~dl34R$!aTe304Enjl=ARa)ke_ z?R1ct-z(^JW{X{QM=JG-J{IY=4tE&L2iYCnBGdSoWcBVU8M!tSza&QVSJJCj=sKD= z^)Hx;t44-sLx9G-4&lXX_Xk?X3P>ZX)NGly3(YITikFNfz1u=k(yq2Jnd zfI`vt@Za-XAFl9x=D2sfm#fO@1Y2>#ZVD<^yS3g(E>Abh7 z7%p2CHzPB#)|kg~Ycy4ZXx2h74^V}rga?ADTzB*}LCeR)bbWo8ox&g5@SrIF@_kRt z+y{UNK_`=d>qx}4qNFry-z4JN{ZEl3%ZgY#jy)00vpvk>;~*&qSg5s3>Eb)Vq2I-6 zPzRbuQzyE#)W+@S4%s}F%a})e4pU86SDhD<@TD=UCWlQ8k0{5kF$A_#TuicMG;YDQ z8{R8!6rUfhf9U^u98z~aqD^SRejMn-r#TaYM?4FaF$+T-qJF`2JP5^%+%iKenx6Rm z&}o9`d6d&C-^9O?89^+W3BgwWtY4FJOj$3-S{qo(lA*~m5-22#>ZruEhk{tY(ZyuT z8#*L2>fPn45cRI*@2{t2chx>IZ@ZTv7(rB7lFuI;@9$fVoH^&8gG7dOI~) zSBrqTxGzb0^~(BSp}Re{W6)WbS|{b?yyftQZO5U~%7)<=O%{XSgvj*L{bIe|R*;KG ze<26o|B`^2X_uv}Hqx*+?-D!e&ot!izy&Dhzjd}K)ZRTO+LUqAq$85zy*B!^mY@UHz zLycc-d4P9|atPn>eUGmMLieK=G>F)#8+Aq`VPfhkK`QDReop&wFLy}5LYQZgmFqs2 zQEhy%Lpto-28{OR9BJ&H>J8+A`3R$^l7LNRT77BC-W0g_`e5Nisj3KyzGZjc@}wvp z&&PJ&)&VNNkjIwX5K*R}{YJzN5c&y|X0;uZv3OOBxjo7wT$De{>Q)ezJ7PJ?oSWeK z8#XeI-#)82Li>E&A-}!0&RO&+mrCuww2U#MqjqN%SXQFzPG={zhkzUn(@hHpCEBQM zRh1xy)5o9Zev?2U!qYWo%rd%>{y!_2WugMhBg#3x8|t|B0;E%uTA92ynb3lf1iBw zw(T?Ap_-SQ8dZ@psU!B~owdyRYf3|2tz_JkBTsI89;Zf+c=&#QPM&0CF6boa9H1}K zs3MgAwG7B3ME&k2&7ipkiUn?Q`AiRHr?DERT<*=y#854QQe7I}j};5DK;IyIz3LPkswV`gX{Dl&HX2r%x6>N4&;P=~8 zR1%KZ2t=f7+ojG)`JV5^T{EQ}G8yuIh95L-Z~rd7l92qTy3QkE8e+uSdIZD&GyhVT zP+57{Jh)hlVuHkZyg-yPyDi8R!0pP7Q*PLxXtgwesZ0lD-rDafiV)KMCFkEC?LN@E z)_(c)&9VNAOg=3w<(H+mAYqlERKF^Q=5B}ZLV1DW6c2mH#8E7!#`=`4C}X*yNw>Gs z7kA;6qpe-&k>~Vh9GLV+z>q*KMB4RQznk17D}FYnEgwq+7zsLB2Bxz^SIR!tltbRn z5jJSr;k*fgPEXV%i(pEUKAjS&8(u*I734poxDRv5IYyf@iHnb_0)Al@;MBy{?*Ikr zkstZx7(g~NA>Rb|cjl5Q=4|4~7zPuRsyAGt}wm#fA#U89qRP-R%yt6QZ&y)}H zaa|j*OX?}bHBYQ;RT|DK2=nO`jit9k7|;{6goy3twC2A#mxGrtF+Y#@nZWyOJ6;yi z>t;|h+JRA@nZC5->uektB)sV!e~`QDx>j~<-*&`3b{J&2?Hyn9oq-VX2$NZXuqP-b z51lfW66T06>d!bInSWi*jxq3dyhKOl>rx(4wNE6UX-MG~)Dn(al+`-#qpY+Hqv~ba zEv6@d4-M4HsBD#bj-fPy>S0?R%5v|jbvvz?)f@ zR1D|xaOz4Q#49Nu1yT3@X6L4Y;}9B0VK~YXe?on*xB(8lxt*Mvp!$_3A$=V>!DO_^-%*jR2)ZPLWmn5Y zZNbwQ^V!ft(qS%`-(;R@RZo$x&jz+UYjGih9DPD~sbAKR7s|4>on7h@t(6 zDB{!X+Z|AQm9}Wn$zv%?qB+)#QFj}&V!4I!nZ#>D*Jq#N#mtAE8@yD6tOmU(Slt#& zpM8>Kx&I`y;99BYx!UB#dO1OnsSjTc-6={mXFOhHyf}%ha5#yGB8>Z0eO%?xAmr%0 zUr?u2v(9qM`|~?z?vIWc{hMP7hWCU1FA(6*#7~_Ce!hr6g!~=2$!I^&eyjX+jGf0S zRvPfdu$D!vjnk0_m?&0XugY`1FJ`^2Gk44l0c?}-;!jI1{1+2o&%%nW)x6f zO431FlKzh%EZsiP*^rF`c zj;*mKGj^03S1}_6ZgZn*TT!GTF`eCW8dd$8*4_DH;|->Wis@d|ZBRSA zH=hH;iHP;bQX(5WlQ=hZ2h& z@$C$AI@>?mx-28|N)?;#C$>Yl8gcBse&)OtQ#!leU|+gH2&b#T#DsShAadH2R)@CZ z@^@TnF*a*dyIUOJe(~uO+SHCUc{M=Uu(tKTt2aa~W|sDrKbWT5haEH&w;VM0a?Hb* zssqZa73uuc90QCgmZBRyh~sp9<7wc1p3J1DBp8V0XH5q5d^oVBl*hRC(Z5ohsl(w1 zolQ;nxHz;$(2g2vB-(2U35wa$P!T@Ht@XRaEkAJ9@pXwj^d9Cnm%S%@TC@Y)6U1}& ztf|?wkgr%;$T3i#BJKY3vYQej#p_qy_H2k#p zlQ0fdL(*UPv-u)|uyb>$Df+R+)s`{+sK~X$>v}c&7rG5nKBmOvnH$!CB2jMhFzDF` zAbE(iN8W<~4pqd(eKQK1+j=ogKpvvlz6~shbo-R96X>i|h8I`mZ&jAypCsjfzkoDo z_}ogWM=#P2)t_8)r~Cb&0}qN_1nP8| zj0MAneXE}vlcO1%{yLp$g!wdPSD0y%$cm)}aQ$V)I^t^~dkAV$u6VoyApYpO1Co+l zVBLLGB=7K+5Pw1isCeTV{c>^?B0U4q`YRbBCUgyTc7rDa>DX_@BRz_dMBfdf*Yc$V zwNdcG$)e51%;HYspG)j2#P@hqBdX8?kC&7YeBe%NW!C^9v`=I7J8tFJku_k&Q=W!VmC)vJxV^1KxBV~+EIosc?BfPDORU3m`s2u_l z)W?)g80<*G)_?fZL9QHem@{0xV=q;?5`E568;c9pf_v>7uZ_&1)CjEjj&PCod%ou$ zmA^rg*hm2zn^|51@I0UC-#3`_g^iQpuBH?u``9OUXyn94~VWu6f?~Y=P6UxNyEkh zes7*u%2E>}_LWcNSLsLRUI_kZXPOPBpriSy7QSqu{CFqYTdx}-qdpYrgyBj?bn<}& zx8ubD)n6q5w=aUPPf=Sjt11jX=L8pj_TA{M2ya_g|CDRXs~1RfNdJLn?iy=&nvBJr zHM&ZHU0{5S{7aQ{-6BG<`jEnF%3kZqG0-?@ml+(x;&)(=Ra@j&ml#-8lDXWq=ITkzl`#1KRaj;`d&w_ z)w-^1P4x`@Ja4B@lvQ}g?*+&ZjtHB5HM|lLlTT3;!XPC^qY--Z5{fC`Uy1d5k*ztx zX6*_%S-yJ6IiQE_e1v~e&tM{+)_?Q+CQ?T#O)zI6-K6Nzt(udHffeunzC>RDu@~DR zB3;61S;r_x;z*kdOi;=ver||7-q|GFiY)%)27$_*@EJGK4{Q7R4;JtQ7*_-V7E_D&FUbU4TYO}gx&mmXZRvZ0M9vScAzIc0o`K?+%3l6ApQ zquI?_TF}}G4JafcPVd7vc7{t)S;_DRmwIo^g1yKc}7mQySi?d35gWDl6z?; zJK^EJm80I9b;I5d&v5FsL&gXFlZ{C%c#9t-ltbkV0pVBJ49W<8cw{Vkwf1&*V2*ljs)4hU=7zqu$ht;@o}jIl+mS=L66C( z7ZiNALbl9%xIBd4x&t4m*jWldQ|lN59&}*T0L?GUYIQ6`gmNneORXZo{AW**$~z$@ zF(oTB53U?pXnO6&!c$F~E+E|TQR^fiCK|Zh<~r8uiHLSV5fD&j$~m^IYpeY+lywBC z1*x-WFGU>R_%fX&Vz03C($NNJR@3rf&>=^z5m47DK$5*k{}X=L@Ng+AoNZ#ZcI2gT zk?-pDTK|QHZ=l17pq_!uUm@5Ti?X%E1wWzdmHXOThmO$5#u$GF-Z`4{v^w|&Gmtm8 zQ*`Y+z+~HpXlVMG5IUo@n!FdiOl$aWMO%~kv_MD8oRMV&wuq4A_XIA*bL#&HzPziA=xz4-UwqbtDW7wn zpRf+i|4Bz?ve)=uXC>Th@_IxbS2f4&_@6qcOXRah=&GorTt=zA) z1~Mx`l!GVNe?HVPm2jBdcr`witQISBl~VZ(zmiALCk1&|VXAv%6G>~9<-V)mMebI?b9=$1QeK&7IOS0rVNm!(Lij08LVhXM z=6=tk_?+_3Ha)nZZC9*1wR{(UkfYVWIo9S2+!PjR;VT!uS3aH*sn{v`^e0}B2$>!} zW~WD|JD%;QDto}FT1m7wm>9sf$8B0S&LL^_c{l+UuT?33F<1oiy;N&{%o`}$!jU4V zV3&F;h-Cace=p|S;X8k|ZM^a<9vVal-9qh0x@_luREbKgJg4q=GdYuPPN^htF`SRg zko={rO2OpuAGZi+KEzVz^S{>34Cujt&gRn7XOiV?aEszTPxg1KI>tE3cB{y1b?o)N z-~`H$NpU--S9nKtV_Yn$u+CZ?AgkK=t4tO-t#+o+XQ84w+r~XjSFP{O)6{Bj402pD zv$fOlu7%ylWG;?5PO&L=C$Xc<@z$$T8VS0VJ!9nuT6A({jmhx0MB}7bNpFDr;ohl~7~D?t8aSwL{+Ue6oY5>!p&KPuwzeq|B3I5!JfeWy)gJ>U zd(6t6QglA=i#9_ROy7MG+%69Z=89Lc%qfr@G7hGnP?mTF-miF{2#v~U# z68x&~&HXS-)eyV%MVd)uG08T$J!Pa`{>HjKrtgA`j(>S27x*@gwgaTM!7JE>-s2cYetr{a%sJDcj|DcW<0``q%r{bf2re z16_;udYfiSgduJlq?=-pPedwI0artdbseYt!#ZwF5b?L~ZRXq_+$@r4d$yNW@?Qq7 zi_e5iWN*7cG_{DPZ?_o+o%hr->CV*fA1j|ZBg2|Xg4i(J{N_% z(BwxN%v{DPerGkzv}w(y#oSC@`skWh5uC=%L5Rjl5);9RL592NN@lvX*H_EGUvUPz zHhk3wyKc40ZR^_x^^9K%X=Mz{aZWI^DG(|`y9QaWfqAfY^yBeeY0j3*0(?`Bk@XVf zyDOKmg3P(KGGhlCB<`A(7#pJp9?wZWldF;zA|+@ihhY{`l&*`Su5{Z^z=1Id5p;VoM4KX?s3%zQ#`!AC`WaO zIuevCsck*K2E^V1hkIP6UQ4ad;$y`;TUn3rY8k7{-?2wa!!P+N)`{?`hdJdR%xu8> z1|yFjpZ2El(iZj3yjSFMQkC(U*5q?~>@Gq~J+a9TImbl+&C|rG9lMf&#H1)^QME$qz>2KrqSXX1Y>NArHJ;}JA|?Ol;X%sHL8m2WkDo| z-^{$86~DC}$&|Pfddt$C&){$8XL@1d{oyz>`1ahUS_|xYpM^$S8KLI)$|fQ13tro= zt5Dh|*pbMQkDnya_u%uei+lfl-=aX*GAcNW+2h1t)sy*!zvDAyn0VV;tn!VM(q=h^ zeXWB-?yl`#$$C3i0pVW%(+`!a_GCJ**;u_d=KzlExm>ObSayKg5a!m3gt;)kb;qZ- zPty4?Mn%#fA82Iq^L@m%T3vR@VrgTyRC`6JQ;NjBh|r= zON=3v>z;Wu+Idvoi8vf1Q`2O56%79rX*6Jn?n|TrNvyiLC$Iny)T1)eyQ2*Xm!hJ? z($;TmTpG%1rF^LEtH7!)`m~OTXLmGPZA*eAefVu6E}(ORYn_89VK|LNY9X@%BdF%) zJmjP6iP>g13015(_Dp83KO{|!&Az+3?m~@Z?rMd}hVS)_FSRV+AS}mga^jamBHJPf z#EiV83HlQ3cR@6z=R}%_kU3ulhbV>btY`v{cjvCWU(q~G>jm&J7KJXARSYn-bR~L0 zHz=EJ7=*>izEa?%NjHhl+tEZ+Y@Y;X6?lfR3&E0@BuI6O?QeZIKY`H;J#%U)BQdl zAZ@CJk?4?hoyGF#vUSEX6b#kjp$_upnb)Fnnp@VcO6Pj|;K^&wq~8*4Y095uZ*y%3 zE*SL(3xwoL!Je_~fneFm8|wHZko)Jz{3X7N1=OpD-9-dOP4378gX8UQLWP;3*zSxi z$`L2Cc*>HvC!3Du0IiGbuW(;T^`33}#Op;At{f%dt{(4anmyKXWiUt&3afZ@p+ls< zCL7KP{2=@Znv`#sPj&>i7i^vA0XlL9mvEd9#GeXWMva?Z-_}%JEM-W3`L~6+Ag&P; zrS@ak1(I+N-`4TpC{vxLuRF{4mE7+{GRS*&ewQOgN@;T^^0Mn!cEACjH`R|e68gM`Cqiqvxbf`$#z)*sn5BWp8&D|D_c;+Jj2 z-h_8BB$5${vEtUBJ~7p{lq?uJJzsqP=rxD-9Ik`9x=j1NE#=x>&49CV92>X}GtQe+ zr1%_@*U}P}jSw!_=DLs-J7P<A=6Y*`&N00kx-si9dHo<+tYFNxF?^FI-dMH z$u>nDwymC1yW)4c4zBYNk0AkK_)eE>f`nh_a5-i9GbBV3*VQ*p^DaN8l?1-oKPK2k zgorl!E}at>csSv|Z%}`c(Zp{Gv4S71JcX(_d=ocz+-BTbyVc0=^$dA`*vtQ&{r?K8 z&xMUt&%&ihQI+mfbg)tJ`1Nf9`#H+B1?I)_V36G3J;w4+Ih`S}9WQ|Yw4xPmYo`W0 z2`h{H{|O$PaPf4#Xumamesf4N%Zgm70@*UBaZ38gkZ#eWz}UunEXSVh%x^0F9%j}J z^TqdU+N`#$Q;P~^ZNE#kbp))D>~9bNeH#O?prpBymX1{KJ<`EjGe=w2 z(~;g4>LuOO(pqa_hv)-g6xsre1v*v65My0jYJfugnlG8Z){VNVg2Ei+rJ+f=fT7qJ z{_8^ed1YR-SSYrx&Ms_AH|GKM7l&Cf?28+}=!S2on}M=XdvL3J{5NxWM!i?pqspQa z-rUR@*#ht0uiFIY%S3cP49^QYRIenDJSJ9HHPrT#iKfVb5M1ac%4BSRKc3o$;PLou z?HGFM#z%l_n0)*#oAojMBwr(;uJ8GrPVjoB%i$OP=#f5O6D?4fO~dc-jqS`U&6u`n z)J8gyvt+)ZN7>+f0U;)*!r?bwgv8WW=u($XdlJ^K8(Qv7xO2`O^`ZBH+^i-G zvhWaAcR_pu!p;?+I?OQSpg8{I=AjAf&+|_<)mp!rJXv;S;eWwohTnM|2j8&b&`a$7 zG3{LpHI5u0k(E>9`4l-Yee@wnmNl8pLRB?LkM;MkpvgS6;yM zsN)08BA`a^$aAJKZCl*E5ZRTQa$p8|rMaC|_K(b{37VQf@t3LU$~rU|O?J#$%-{Tu+En`-P_03W)!X8xi@K4&2o7riN#L=c>NLShBiR!M0%srdpuh! zd)!~8OcV^8$6K{&f2LxsvETi1_J(D3sQmLT!lX#R#z1XmVC26qpjY{V$l$?n@D6bZ z{n3*E$^q*&6yC$}eBAl(4Waa({Hp~Vsxh4;Ax)~PjUc0YmaU#lC)oSKOc(4*M<%$W zMzuY~FKwNgY$+=s=;GwEQ@e$@7AnJl;ld)BWl)v1n%&9LdJi8vNYCASVJET}qbOvl zr-ThXerhFQn9z03&V5vY(b1}lY@+S2`No8WR}rsV0tyZpBYt3RN&CP3fEgql&bzFl z#LGT@W7{eonQ8Blf2qFjXP+o<0BPS6jtW$!DxltGEc#JC0M&(92;`-E2=Oy=&PbI? z)Z)B9R1RMX6%W;bq&Fs=V~yCIJ8&07J_>%=WLXaNtVjHK9l-!Kzj31o5~%$ymaB1&Sed3 zZsI|X=Gn!P4&T{HAHX>)j0GHi5%c;j1{8kygs_rCj-NicFg%@DH{D2#ZsgIZm1yYP zrVG6ga$wX2K#mxyqSp1WyLfn4b8JURHEzSF7N6Im*yXWCIwr9(l92!2i|=75N!K3S z<7{CzJD_{z;a~Nup3o0?|2W9NQ)3o&Bd&c0rgp*SLs0TOW~>Pfdt|T1fCzU}#Q%Q- zN(7M(z4x=(Vl|d|rCUeUWYJ?j>8a#ePF3EEuobqT7Tz>}EDua3ef3u2$5})~9GOlJ z=#!aOP@;c9@%-pk*`v6D=d|+g^I6E)Q!~;??&~`0|71|Br<2=?g|`nfzSENY!zK0? z77(Tncnr1nMmrP%MFE38z_41JlytM|j3t=nB6|_(cEAv=;40AwFU&R+z1&ytW~5M#DWezq0_ zF#K#32He6sonrA(5Do9($z(e3rfhqEb2T9n5XXmBc z?;HBuLt0f`i{RErD2j_Bt-#vfcYP!bhyC8BhCp(i=EiSz__K`usiRwXr%{4GGc9!> zl3;m4+CFxQa&3c|{rswUG=a2cU?2F!7fhHk{j19S=N#ChEV*OGULvL-q0K&^qY#!1 zbV1xZ_=z^wfy{iCMSz7#67s^so4ZKY;z>yRmsjnD7pzN7o_=+iXwALY$ubGePxf$c zlZSx$1BC3;`TT!|k|ZRA*flXHI7mrj1WPl@n7^_K3&0ek zX2BmQt#G$l(STk>!+W)x+wda}4Btue&G_nf)b2peBE}=)eimeZ*oQGl zVlS=`ajA~a7+ZVhqxf9V8M#u zTe{}6*)6aIpZiFk<3%Wei#TaMW|Zt|6JA7y71+~23?Ad+=LtvS|Idr?&lrI2Q}XMi zF`9kxKmqBY6uHYn$zPxKU?dYcG8>n3d-AmHLlFvP9~3F9ncg`vy1u^IodP5eT&Y#d zLq;J$0uLD_OeeJGpWQKg_UIn`-glsR9Q-o8^$ypqLjg@)I6njpr1uiDxjyq!uwQah zc2*Fg4g@k5?O%DF5+i4Lf?G`!>h-8^&COgrodBhgn7NF2H#ZLq6|0qqJ_*!4!$BM< z<;j}av{!%Zm1m0YTJ@Ak8r@o;jGY#}g}%D{LK(#}?r>i?WzrPGIb=23oSekM%&{vx z=RUs|^}uExutNSiCNJIo=KLMIcU^*?ZQ{2hl006%qEEWrAt32>`##Z3 zt@Gy0-HzbWo-nTpeWWe|TFJ{D}XO>x| z3|S0o8bm1btCl}d=2+8g4PnM)AV5Moo-F<=_hD^)j&tb zcZ;QYNwG8Q8$PMyDH|YN%SRx9R63!6uykiW^((KbdHn_Wf{1gEcja`meKqV7`rN~x zWxv-In=|arUB`~ch=KU|Z(~!C;&z5%h6!wvjyEkWuBm_`kB?e7sWu_1ss58YsXr?v z3zzbpL&Z~Lk?QpFkmf@sRV|qI1MBD4zcW;GlxXj$e;WDbm;hv!B>zgZJ$wh0@AU!_ zxue)TG8e)8M=>1CSU)nf^jZf_nN6C!^3HC(Q_)w&zM86RJMq?8insMM=z_(s(6;wQrC%>mez|C{Z2B-v#M zb-$SK?FH^C&3TjAVbngvK(ZFwvWs^_VUq{iZ#=i$%Hi2s*0*GMz2`F{t=ZZfy2R<5 z*uu&bNfUug{R28b*h{$%qZ_t_bb<7UeHCWox#0U?G~;u0Ose*Sy;jz8)gX&o6;# zq3!>;2Lw`FDlw0zO5ggle9XWv>ulxz#6XxP8w33uMlxjm{RJQOD!eLa*!DH0F45NR z*?F4>_`t6R&G@SZ$7o44Yua&ze{{0a_)A#{YM$u{UlmI-Muvep&1++cPT3VHumnH4 z{;(yd?_H!q=dT5yIBDGUzM)#A1JA*;#?Og$Hg`LDk7xH);cr7UdB__QUdSFPEWtxO$r zC(4mt_FIg(78yH#6v&qXDKMDCJjdC2)f*lJZtcKqdrYt1`{8IN&8N)uSd(?+(xDUz zn1-%yHsKARvQO7Eg&4~SJX0~WX5D|t1uC|4EGU)ax4;%4mr1gcnKyjoc-aIjLd%FC zYN{;RagwnFVjW6nN??8*?RE?5Y4Kcx#TW(IIgIamrB_7Fwj47-x;P1tJk^ht*!Fu^yp z*|mvW*YGnZ`;zUu-fi*r&Ef*1v5bfIMiNya_l;h_J8p}^9~()nJlCn;87W@~Mf^02 z2z~*z`4hH=xvq~}kMta;YSC@~pRk?6=b6sFb4vWGzIY~C@p01@^hE7q(UAzy7$*GU zdZy5iGQCw=X8{9jA$ibeVlSS$o$#e4e-*ifj%LZAO&8B|{Ub`=R zBe8#YJ`RUYS#g!1qUili3Jht)v{)pTxE%&Vatn~i>(~^ya(!B`_Hx$nkbo{Ea)@G< zIt$!e2NhKna3;NqHpJBEAQt%rW<3FjSvL4}i01`F<+IWXLF8U8*;x7u zAsXTOMeR5D<))bfOy=~vD%?WY>QbLSC`dS0$XtxRGwYo0+`q79BS2-5GgY#B)jz=Y z!y{%8Cd11KnIee)^z0TUR4yDdZtyWJd@JF7!g;)As3;CynFcpS`C8bdgj!SBy9j5n zM2#fWo!x#JU^>aMl3=5>i)BZ?`K}fy^*zjs|2r#nqzUGC(q+vT2{F%h4qgS&?xj{> zLdIa@C#)6c^@vAfe6d$O0jt%5P5X2hFCt63?e@vrIpUZI*0`bheI?#4>)7X+Sr%!h zSNUGdf=G!9kIX1z={DiU0&De-*y`<_(rYjukSUJ>hy4F=Gf5VNTIz3v6Nc5+_>+UQ$=;5XsvgE<0^iKxvpD(5DXQbq29@_`6i@`PE8- zLnM9ho83ClZ>M^$pYXnSouZ`6>rSer(mVKxbrH6F3bZzzbf>?*DLIbYKHaI{Qlqif zV0E;z)pnX_3);i}b}v&SisktTii>!1Y;ZqKXoGl7(y4%c$~kw^G{UsXd-!_oNSwb} zdW>3GHLf7v*J|JKnEQ^Z_Dhr!0<8CNj>wI!gjq~9R<7j)rFHz72z?;d$6({r!DOrR zcpKF@*a{(T7_a@F{?H`p?5H)h`A>~BKY(?35lUCdjj&Pb_)aE2}WB+sd7|H?E3T%&o$g_B({=uDj+m4p5(2`=EJPl6i!H{D@7Saj}Tet z;M@7bn{U^?6%h_KmXyv5h@V`Ri;KHI;X7DPT%@noW->;*YS5?b_8*FU zj<}v0u zC@VtknVsrl4bBR!Fb4R?_Xa)U#kN1uz8z^t_`jSwPTS>E4>kh7vTq_9y;EW?Vu-<^ z|CckteR#c}=7*%^xc`mHiLAit-{z&}dOE*)5yB)cN5h71jrW4siRO1%vZ#z43HjCf zk90TN@>~)i8dUNXa-@o z$_M*~iiStbcMdQ3IbvcAranF;&Su@*{LN=Scl11d7Z4t*;NFxZapAgJ)I?1`3h3Fd z#VI-4(@Y7S3IW%kM3?u|&6@x%fN|sdYgb9P0^c@F{Zs%3VeOAlHANa&xvXPrz0QVR zib=WIkK<~uk`wEQnDwrnSt?VND%f`~SYhG@H+{ujkUP+ ziSbEki8&XFUTXkNPXa#}#T6idl-7JGmgB`jJX&g~Z=+ipG(t4d^8y&qrYS|a8gJY91K%6NZ(pQetsG*fx$%?7;kCsGPE zwL+ZE%^8EBR*N|z5#1rwyOsuGyJfo~YC=5cRU701#^r*SH{PC4w-l_W^6Kk$10E|{ z?i24lHXZh1PT+lEgC*WB`?3ME(tMH!Co^%|t$Y5JH_;)dOI?(i9&mwmY! z(4CM*Aa3qGokgJ+J`rZq2+)6RJ<){fK}%CjypBL5e>H(+)2CSDc5fptkhif2b7 zTQiIHL*-`Q;Z|dSf#-1Mcj-V1AMNQlAk+S z=4ZBEx){IaR1sx58&&9kl4)h;Oy9aL^%%O;o)ub~!m=l%38v7X&u1R+X$3G_uN!p5 z;uOt4+^dWDCQ^tksXvU_hO2!)_N^50VjA7A@mXf|+}Yo{Y+p!zRU1S^-f6zO6m}$h z3F6bKT52EQh_}87>ALoU+<*0G#O2|Q_*(Z?gPN1>Kn-VnFw>mWQTA&;o{+!qVPWD< znY8Qi$UNiD;^mUp1QR(~sa>KVT8 z_XytVcVa#Aiev9e@ ze*M`Vu>04`G&J|idxcYnZ4SZ}*aXxxt_lgSS$6x7(d&y5EgH4{t)$d?*sbqcb;CAB zGtW!s{K^?^>GdN6OZot9na=%D9}x)HCa&WwwHXrm@JjP2-ZHZP+rTr-&L|+C**>Rg zU?`;OV@jyscl}ugLBFdZyalY4>;i5=YXKck~`s^-y2=)dI@M_P!ix-6}% zIM@}+9Y85R9gzK(iQT*qKBP~lKc`7_xTkUCOoR)K@Q`)2wx zs*BG~Y(lMX%zKyRt_{}bf$Goz;9OoTEw%m;DC`9Ip|T*_1myAIL3n(XhQv_tJmn>b z-uvTY>9CaF+5}x``f_|*&sddXZ)d^MLmmtLK%`g6!`Jbr*K;Z;n|3YkOB1!h=D*tD z7_0?0SJ-&mxDr3IOgKJXBx<>>Fd$*1{E@aNYGUpZb@KS1ywW+2oI$1Lt+vU%#4Z;9 zD|OS^psYzY;iU)pqQa|7NwFVJ;ft)3)~QM17_OmI2w%}TMm8cXQC!X zy6E171#Si^Met@6$Fkc+FG)(mf>~*)Cz9M23jpYVEHtRB*-OwFnMG^@)@hFucvi}< zqn~<;0d{L}7T~#P5{Y}pTJx)5#$AMI|EJlP$|XrSB=b*-GE7nPx{5Dvo%k3pP23Mg zxmWW*(YwT8f(&hxS#x5;3Z`ELG_C8>0W&m5%*iU3K2)g)<^!=}c^a;3IUq}N^M}te zT$kXT1Y@$*ka=d-waV*9*)IL>^KcYh?X(gRT3m=l>yx2Cb(BZ1&_MHMOvczN5`1jusuJbCQC!~7WxKW z{jRwjVl>nIsPgA*!6s!B>U^;+gpaPZPyZWi0{6<-JLn8ER z5A43u$Vw)swq_~Ce;o>;Lxf*qFNxZ2H84uUtUWRAsiSS?L|c>d4#ly~aHeM#ErOxH z7Kj*A1c{vgOnyS}t;m3$pSr%0QHK}VD5Bk-F87_aEQ@B9;07q zg)2IhFZk0h-(2$v>Iq(FwVUoCr$IPI=DUl-mek9;%39bA#1@&(Nq$rjFQdmz)Jq!X zHFq&ef=-(6@X=0h-N8I#xx8+PMjcCb`uWSNt0GH2R8W?z3z0a|Gp5zY$1~?+E*8=Q z&KAtb%toPv`QtZ)QO(KF@$=(^heBQJyUD!ZlA051?@R4Sz~iu@aI#FFf8AZqA+6?{HPFXAInnUuA^+qDGUCZ;+t$3bQ9xg;CY2#a>mbbsq7lEEDTDW;`_b-d zGJAUzTcbMQ*DNEyYedyWC;LhTXKLn+O?a?DWI|Qlvqu74LK8MvFEy&&S3FXhMBI7{ zE6`ksJ^v}9tWgzWrc7tumIW6=QAaC_#UOlz1kXsZfqggD+9fWQ?e8@_3jO(dBaJ3M zz5850(RMZFFGb${5dxv2E4C)5UnW}+do5zEIg7X(wyV@oja!aNFB(}O>izkd&SQcE zzXoABlG$f1Z#qySnr>RE7&bGoXKh0ewkW@yd*MZA73q4H4zs6mH}+uTrS~``Zf_)I zL9MmSK5(B$Wv&mu0>63o#f7CwU7a5JG$l|+g_Lqe4%@}$j}<>?HNRXxcbDsbeTDN~ z0nXi`)*GoCCu8_@)Fhrb8d?2g%a=H4?ef#2#iU~X6u|AuKNc%xyubMvOZz@Ce{8h=&Rzy^=V|xhDh#(*O4qqej-&~BAZKfv1ds}I8TLv zc$BmhAhL?Ji?ejLpDhKLUy+mz4vy@%W>ZhgY9*&rckI%5rkl?isdNwpi+B3-2vXhN zH~1mv4B&2M0WiHGE|KLG-;Se`@=G~GOHsg*I!G*&Z>;3zf+@OI;(;>n-Aq~Cv>Q1@ zI6Zoj=Q(-h%1FZN=G%vw5oPXKsSjL_a)-9Rq--CO%0#@$?y$sP20LW(&Db$f&absu zK{4{F6w|SVRXfL;i^E7+{4#u1>2BMx(My`MRn`b?zA}u7N;QsR$rS4NRqK$*%67RV z^>n>-g)3=jel+2nWxah`Q`OKucSB{1MctsY!Od%Bp4V^LP74#$+PM+lA@F%T`kGgk z-nP;V(dBmj>imfz;mXv)w?t87-1A-gq7f7rZ!41!ak`+9wX0 zrKFbE#|NOU|AX99ADVQHokSZKJq8WQ^Q&{cs(m`Pi0{Xld0t4i~~0o)jr6shRwx)!)bTQo!m0KpdgU{P0YAM3-9_iUS|FGC8E; zXuboDOgQJam>NTKp$rYJVxno2yh;KJLR%~!*T+8)%A}LchAMAttxd>a?4Eq4xi#}= zOkbr<`|BWIOM)pkleY}#5dWC})gPYznKUXBF>%#pJCP;*I$sk9!*arO;m6DLjyx?k zwd~q+fVS`fZ4M@L-iR|$27(E=&v6Uf$`9S>ROZL_s-#zpiVc=Z+=rlvCsqij^Jd63 zcJtx85Hj=gRscij#mkc>4MzTEQ|YtS(k#t&xVBZKHC(zHN1f*QX&BaHO&9b=Mi9mH zI$e6C@wLa3y8c0i@x5J$e__Qm8^#ovICt~rwT?>O`jfjU1?ptxwN^JX`1Qv z@53^6=zL^+27k1wbC1{oa7GvoES?n;!3^GnVqqAqY1?%M5dB*6)@fP>;nx3;tg{S@ zvTGZ)^Z?SJbT^XHH84m@ij;JzNO$+pU1HFng0vt=$WX!nDj`TSARsL;-C{5HsrXkvb+=3;7eM27Ontq7mCr_9rtb^UzbDv~NrI1u!*Y$^=U~pRODE|~wPo*b1cf_Eh^~+24w`Hv1k{s{%!2)t}=#qAet_moRk^o;aOsm3|L@oRMn$dBg|>J7>wfA^S|%NTi9Ev6rRY zJ?KsNpbkGbevgVGht&jtpbA3!XP_Q}Q+sRqiOv7wx@^qrL z<{YOWNsckgV2)hN(MRPi)gLIgryxwe^u-`^tHO;rqx8G_K~nPeIavKb)EDBwd~h8o zFeg$KPP0>DE8F zbfg?>Gep#yJ)Fyoaiz+xn@hJ@7yV)Mo&WEeKg3{WU|aV~u`xzR|0^y5!g&4D_Y9oL zG<3JP)Y^=ml~fqsCFCM9tc(ZAX-$}rvWAX0O3do8 zT`hmmBc(dj#k){Z_$cbf^JDGZB0BwO{Uw!6`ZsBEQ@uro*9$Gq(>>Tn5xd0>yNftH zn`=LrHG5mg4Gv=>3p%&pR!7%u@ zFFn)jgD!_b=FuqTTcg7V$}RVBa>l^!`jfP{pqc}0QoyVXkr2MQVJH5H(;_2mF-Y1^I96FLe{pD+1!?o#kPoL;O()k^~fE3^W zF~2zj@yRmbu#vi-FJ9;JNAupArZOLgut5VIs?Fw94zU-R7e0So&JlA+FeI4RU~c>t zyQxUg-Go!(2cb+$P07rMbTK8V+9|?4_9?jvX{g+x*LnbAt9c3(iBWM=z7b8BNO2^e z$6~OVnZCCTZ`1nWq1jUy*OT3h_66ccg$)3R^*1t-mk6@8{)lNV?19{ z28D;7wgWxgn2seAf6+KO2gBcYuXP9S-_7H+TgNuPsp&9{qiviASS@X)%+#*^_h;h zla!D!J(-5V)%ZbFOFggVPmsb8+X$rYDVm;YzqbDdUq8FJNa{zeY1N3~dma;Gw=MIE zo9U<@JP>RI6x!VQ!KOGyzYdNwqpFxVFHQV4!rtn`C)D}4VcvR|+Bc|Fb>_@u_4b5( z?_FGb0=m)LuYW^-B5r9qCD0$D6Bo(CIbC=RRJ(8d3PgHx`I2OT_o3B3JJ<&U0_=!j za_HgXg+<~vw9Z`ifa)Wy*L21$RSnK@eR<~2k|=9~uWc{zs5g9nnnn_Llg@s@p@I6A zc?HXS5(LkCjj&6qyWZHI_Xaf13|FG|C-20r@SMAlty z^9iyRuF>9(t_gZmIZ|Korr&YT5O*4Jb3O;m0VGy1F8%3Wb?*H-M$h;a+`Nji+J@q{ zlK^I(eXCZk&uLM~?hK7qd&XRDLC-{RJ%3HtGjZ#&UCZ$+DeWM!xRDl`g762Q-HZU?EH>Hr*QHiH_pJ7(;~@ z{A>WKnyJFT zVBHafbA1ynWo)Mu_pmG-132C54M+|9>%c?y9rH$au8NX{HZ|sdT_TFqC`s;>st*}y zEuM*xnDEebcxY@^E3~9_GlMj4C&@4xzpRsN3FroiE5dK}X;wwo5hh1(Xnzt>%dK~S zD#6*D?-vTJcZ?s-rl8|ihv1{{s0!p{y10A=VZVQLy6r_*ve(J1wH~7~Xr<&nAT_C9 z!G!&n@;>a}pPh_Ob++N+w4~~zlA8s(V!}(-@Z^XO`BhUQ8aTK0ADrBqd*eJsrLBJ= zkj^8q^7JNT_*d91Q`z5FFMDnGC2H{(wxPL|TcLZmBZSsR574cFps5W=4z~3+lw^}sy$XA6 z84x2P_dx}ayP7?CqDOJls0HY4s<{LLzJJ&=pLz2?wDP{7CRph}Bhh5M2NCvCY z!aMg??)Avxq#ESjB$$$815PkIT=A3dlS40`C}{=`19 zWg-A|Y5;Azy_AR5>oVoqHHsLnRjaG=zO~iD4{NbaeRz{Dp*J~;p~2md}D{os6rd?j?Qba7o z3xKyEQK(MvgO6!lT~>ZrX5b_qhfRmVh2$MA%HikMxZ`(`q180)^;iCXbp?Q?L7$$b zt9&)$Y)DiG+a*$=19Q{Elpn@@4}0yn_jX97_@(nsm{rK z=KSWVHT+y!rUhYxiP%)0xqneFuW|uG(*|mJC}HHbVgoCbrq=`aV^4F&2C!raKs6Zf z8AQO=Gm6V4Fy+6oerRpB@xaS>wmT(7iJZ0QrK9tm^EAXiL5CD#^ao&4Caqw?K82jU zUfCT`pi}po(JA3C%*?IpC#EV-Jn?&$=)hb!36*&lK9RSOdRCAgwfq==t@>A)S=(p8nIcT^(w(%L<#Wf*gz7L}a zj;2!k4$mF7b^8HyY(|~4WLGP!EUk-bC;Ci_L<%f~T-|;&V0&o}(|jjz;`3D&rYbG# z2+zqAE4oqvPm15S>}0#)xE(C3{cR0aGx}nt%2yH0?p$y$DZFR$L9Fu`-L<3zPx2R2J;hyZ{b={nKFH zb?i)BD-UJ3P^Xfw(t-jl-ng{tX8JJ(giPfLS=G0*7)j613j?PLBiA`zptUz# z)PEu{8?z91*1IQzF=qKOb>H?TAJ5YUWw-$Z$WSSsQcR#vK3ob#(v^#009cN0L{-!N zsc86|9#+blu5ci-;Gaj%kTOK`=6r6Z>tC3v&&F$e)l?;^J4F3>D2F>5y``ZRvW@7@(+zdq2cFKlj$;n7OGy~9IN&jbnn|NIKoia*B1J!~-_SY>qa zpe_eHylOTPS|IB9py0FYu1M`f&;tjPn_O>2;P)=sv*w2qT`3{s`Rem6oRMuTUvVBr&YRJ0BTX(AD`CP5~3KJdTMo2eP zOqurMpZm1f;azuXY+@gtM$bpijt*RruVU>F|9gAUERHn<2FSer#77icw3jD`VlJjl zyz3V)wM}}N4JF~z_JlSu^Or4Tsvtb1VYzp#_V6z(K7Vx`Yf_IretIzL!$8M=5KkJF zWo;+QQg8%-oQl6cGkNZM7Ad$8e07^!>0~<9D+TFj)y|mAMcrm>Ui=B?L-v=Y2(Ijh z5fjYCT{fASG?dOk;7?pJUdFf(58;H<{^sqq6lo8m2(72-8+Zysp4|6r0n!x5BJqmh zBr!40p$j*y8PFNPtc~w{sNk|d%)$+t;)1Pa?E^IVWTt&;;|(=ikl$DJ2;sXC&zPzV z2EMFq-HBWz=E6?yIy2P2e#NR8mSFO5D^`F(D8IN%e;v#N+gKAd#SMMVMzkOZ8(uPs z;0hS#xgm8Y?lNIx%~!coC?`eq&JwAuWhix*_ZI2Oijn@fu|N|7BB zppCI-#Tp$)b~t03f$1>!f603IrIh^le2wXDs~1?e3spRs2e$sAJXH7I7R#H`W>raL zK6~)nxs3O3mB_j5b6rZw_xF7Jbr)C*&ad3HL z<`hfTFzOYwm)VgD3cX*~dBq?Ktq$kd8#8Hk27S_(Pj4=~dX8ALcVp*h>CwMGpPCwc zFjM8jz?V%#jVVK_2dShgi?keTuXT8EuRL2 z9Ii!XNhV>&8y}>{4t+@firp1ju@M4HPC^U9*jZz<47KmIb&^}_#lqp`8Yw+KwYx-I zoW44Op1EzGJN=KvC7^zK6OS@jB>dw6-8TA)hf%uXsD-8pd9Cvzp515Q_8 zo90+LruFFu! zDGs9y%(Vq|X4)1|Sf(CR65^bkaKhX_5>O`!KJUBgYl|159A z@3QMM4U&zUZV<7LnP>|L#Y7nM8{M~6HK)>e6xiDguXN($A6%MmA@Iw@PV9MZn&wRq zhZY|up(|>qT{K^m=Lo`@rwg=1k@q9=7X1cUyh(Dfb#Ma~@15}&S=#|-qBrtWtiW81 zckU<;4vx!3Xo#3m2;b!T;`=Ml+y0;b5VZM7Jaw~GCMv&vtSu?|rrxAtfDdV}Vgp35 z0W0#KO#oqr-SpZ&&WpAAv_m#^>~u`@Y~)?+kHgz?t#|)+T4~zG7@iIncN_#fgc#BO zYqBV-oAIxR&+V|$tV_qYu=sPT8iAbrABTiZp6!GRzxdu{K@OSF+gdvwlO93l>St7I zLhLBZk}Z#<)ua=_V52~b_?~&I7J(FLWHIbi)x7Q8LpF^@WH|Y$5Nw*X?WZ$r2{#|% zB;l9K^0a-1)#)~;rx1AB6`3EX$|Xrzd&L{gKboxkx{Es2@J}Xn;vU)>=VCA z8o!B0m+qAGek`kXcxh-dB3k&2CZFUf%y@Fpiw_Pki$=|`uK|zycs_fs<>3gEfeDob z)e6>IjSG7|JZj3lmOyJk^*gdC%gAkDG$3=w71>4?w6yS1zB9e7OL%#2mPzSXNKnW{ zHeuNU)jHM+oF>S)i0JyW?|kK{TF0DMy7Jcutnm%|v7`~(5@dsv0l<#H_p4NXAu>?; zu2fiQjH_ag-^GrC)r|6NvsGQ`bBqsiEaA`SEZ!dzEoFgG*4};ci3_StlTUYo|E}Ts zU8(}Y1oYO4Rd8SQ;GhiWPX*5FUfWrv_V-sWg?wK`Egf{~@TG3g-Icc%$y!CeIB57s`u+&15@apsrmc?E9iS$QK$;u8hMn z)hKhVw{W9rP(8!p^O#GjIJj5WxzcOuZpXatiMH*FPD77s{xy!=R0KK4rDLrRLu1ye zV;u*KWyg`*X{f2z-k7NU6F>d#5blpfHwRs;WGV6ZzHBMvdKDy_X8U{fqZVc#NNaLo zgGLZVP__gV-AneTMYTQaJ8b_;BjM738UVDX7fC<6CCMOcES5qM?`l4CMJ8E=^XSYP zf4w`N;s|cq4b+^-q0;o+HLgIuqlco|MF;i8tim(%OTq9dGj$W?L9clg;7?2*t_L*d z0R3QOMAAqw8|r%d0KhKVb-OoS-g_=V$A9YM-<&*&UM-ntjLu}*_w-Y%>O0aE%^bwY z@X$W63chn{pmY(`s~5AQ65UdZ&$lJ4JveY|0@iI??`+qOfaSS(3^1IpS1 zjg4pmCWO~Hh_39f*pVdX-`CXUseZf(;_l%Ny3?~k#AI;7z3{6w5f~Dk4$Y1nfe%fS zwfTe)t$H0Dj&2J?om#f3d*%)RDN#MN~ZZW^bDo$EUfnL76flq!oisg-w=>AvW(7A?YNjbPi!q z)+_suj1(^H#x^aXB-ykQN=@8^La3P-h!UlkQN`IWVo z^Y+NE!r?>W%Q8~BSv{)rKkLGHtU?cdtY9n=B>DSjXm0eKmS;0?Ky34lJM8fgQlzF! zKqB(LjtgY$^4oOX@yw7>!5kIu`8d5`i92iY0jL0bNqDt4ZCe<{s{xP}=>CNd}Gf$n&W3zbt zd_MuWpT`4pq@-t1D95jlBeoMe^bUXbBZvK(Z6_ZRJduOj7O*iS8t;0B4Uy$TDg)7}+s-v+^K9?BPT43}qb_SI$HjA{h$b_`Jj2!fwpl+Y-KljHr298{$Jdk5uZ=K!9K+4-S_~y`7T$LXybT^dUGU$k zcHK72aySCu|R$^~VjE=uJ>e*l902uE-3e zCX?>^V0>lqvaiqY=bOLMynIeuT1Mt_TL3YLzFX-(R+QU+US(GyZH$~1g`E_+Xv|DQ z#K^VMC66|iXmKNC?zndfO)oXOLMk$a2TGyutNmq;6?9}5-PKdl`|6oC(Z<`Qv`@N2zjv zD?j=+Uqne~in<#=Fd%SYOxU`r+XipGCJS2p+{~l5I`bMSgQ;KX*1&v67F$qXWwXER zZkr>Yi>ga5Dq2YoZxdz){LL2gQU|oNV@CO{*K7TcPGPMw5jj7(@U464=*LmnZcPx# zP|)=Fx%ASwI}bnoyne1Em;HyBK|z*zb$wmL^Bso<`Vz|hg0;9P9HHnEc1J0d#N66D zZr}zJw&BNL_BSU_K9L0R=oYjyrW+t~Tat1Tg;MEB(qm2;#d?8!z*g|Y+&(>}kM#AS zP=NS0(pOmCQ~4v9?r{qD*WR;|=WsG$$;8VRDWpnpx<^F2BQl&HQR>Nz z_MASybEvZKL7ga~#om4ghqvCIV@$F_wGvkLrLJ&fq!@QrzVvBF-#|;?JKWE7O@$6 z#8`b6DK0OT9{czQU)X(gXomP-kwF^^%i2H3n9oD?q(&i1KkIS$Q@F)%I5VNX3X|!4 z)DsupYh^c$@yw!lt@=-vaRU;cMR~_0HpEnj9G<(cns`ZFHSLeA_ z01RzeuDqaJ8#i|2NutD!mjvQ+)u@8*w-jnoduUBOy~_ha&0Hpq{DCKg<~&aDpa<|5 zNcKRjqHC0Ys29nOr)%4*+iI%mTJ6S^jqoRgyfF2@Q6rc-URHaML^>R2{K#t5{pHPu zVY6&E8FLHSEK|ORaqd&znFE)7E!(*{AFPykp33+$g812P0QK8sof3;OYs&5DO$!0F z;S^^R6_&h^>Vuu7$FXTo0xN} zsX-HO>8Cs>Qk9cy+k2}#*e$p;WRY87yj}#tfw4RvjpQhxyVIzo4$qM&j55|0W#mv` zP}|h$=Zjk-kR>!_2-d)x>BFq`*nKh2g=XQ)CYB9%+37kO3a+w(33$h?d)Xv)A;*T|q?U`(IBQJIFb26i!ls z|Mdt&!&eV=d{-y9Wp7ANNHSnbRTOULuTN}_N#JLpJVv5GN)zX>KD^Wxl{8D!rz_N zkQLdvz8?qOiY@0n%No)vOmus~so&Ajv)<1kXK^{qG5GdK{zf8mo4gz+2+`wPd@JlH z-q;>dX`B3fbii}|LFo)hcj$3S--Up!0Wq^Z`JW(`a`0)zA`>#!^ySV>N_eJP-S>dX zO&`+@;|dop0M_~z+r3^}o&^&DiqDMXZfpCCn9t^&ZJ*eHfY|)%6I}P!vKo-$>Us zaLC<})4bQ={m?BOC&R$)X~QgIQ~)Vtn(GnXcu3*mxS-=cJa3x#kJpY}r*SG~<_Oc? zxqFq(mimlMmMAa$SLO69ORdCdx>fL^o#RBZ2BsaIhIN%~$buDK<%h3S{(SPm^FM0G zo7^DvXcFXlTdc90c$*+F)PF$Puz!_~FXTkJOCQGb!Q(G;#MlczYZ2t|??M*;= zP)MiJl5H2nFC^-wPd7a@Gc;{b61&D>Zyl{TMD?4Q?3>yo#g_xO9b64HreR@m#n(O0 z_%s|e{vN_Nv|hNvqx8+PkTTn)6UuP~Q%qiTf7~Bateuz#^ioqN5$f zQ?)O&vhd~%m*RJ^MTm8s<9XTFT;US(@bqZJ@vGIYY-OPgN-;|-c7$UMeo>3NSo2Vx z&5!#Q%|qm%<@2YejbTz_1%_PMrF`&}FUmKvaP18C5SYN?y6v<4FL3@RMuoMmQQ})i z&$%R#3QNta{BXPQTrPVBcIQC0o~Dib_I zQpmRz+G1^MLMQ*pdbw?%Gt##9iBs8yL-_&6-MzE+-K(s~uiBo#Pu1i`f5W}4!$J%_i8(S#(q3`$5MxVd1PfQ>3)o!xP}7Z0-W}XI){1> zXOHTq8b*i8H7Rx4xLia~qAh}nyMO4}cO*(Q{zS-@jL8gk%TyXM?at3%Ubme@ZBW!k z#ml2a5q$*q_aSrmC}B`&>Ey!16+0|O9vSx<%Y9_L~@2O^#x<1V<6y9{de zSyiq(oa!*Zo}73imZq2CaIrx3CHc#5#O7D{*{F`vHuh%5DBRa!bNG_AgUcrs@Haw* z2CQw0=~f|{BH?vYgEc|WSttdPPb04M*m}I4IyONS%JgBRMJ<~9N1gA#juAFm~G_Iw0;Dp zvk?6Tna>?&vi=T(r#V`UCod6fG4d`o2AZ=W%J*%a49T{L(z5K-n> zUFOdRU4Xxr=Lqjfz5qI|sdWP=AZ$a}g10+Q$?kn&Fqy;K-V2!g;eMOfm*vl$J#0vk zRj9n&@;FQATvg6*960zQFXSog>d_ItI@(|H^hW-_@8a(i-D^hP_UoygS{O zHc_XBo*MnQFE?DHzjK$tXW&5lXt;F!V7TYa!FFjA68lKj&nhv>CvPn$ z&`b3@WY|sHNR4J9E{J8xM#|7AU}>j6ncF=!(K5C{1M~UL^$r6T?eFqEK%qwDRs_5u zgVd-j4u6#>;zSxTr>{;G?Idth+ND7g>IMT`^V-K>3M5<{U-4!zd%vb}kecLGBfMOk zU{|2wu+@GSQAD~Y2U7Ye2dZu1oBl(4a$GnjkTF!)%i^RQK1Zk-N~AdKXkgi)r_v&X z2V^A=DQTct3O z&gMwvFihUdgWl@9D-ZChdk=4}DgWG!oZEiARJ9DuvuPLG4_x z=f@n_qU|Da6Lko>*+982#Z4Ne5|Fr1nB}3F1e{V7GV7@h$o7P|T)8}aNm{H42D`VV zb8e8gve##cZ@pi$!q_AzlnPErHqRE|={pl|qPre<@ufV#83Q9a&^ z1-V&O*9)t*Lgs_bbS0YjKQx(pL)Y7p`z!Aw5`k8K$nzG0$@v8e07=aosDM&+EwY;Z zzt%KTK=fm%knbh3b@l3=E44e?7wJj$^8n* zILAHEcYCN?byPhlDFUUuF`nEJ>%0klyP`0bD z;|IU00ranE(Iggp)LV5hoBtM|ZGTHJqbMXL;+5{T57+2hO3CB0CmQyAmz2ltCX~ck zyykwU>-0Ylxm5(l2RSNQ6DKtNrv+ZWbyuiIwlrsgSLqYZ%Q(NnC=N5w?dF%dQV{d6`xta|9Z5|cEOFI z!!uQAmyXH|M6NCV-{U(VnRs?9#>e3JE zlJ8E(vO=Rc!XjGfp7PnltrD$}O^n0Or1}1+F08G}qn;-G%)@d2DgIdT9{HT}I?0?Y z$8dRsYleFgIV<9EOB2J&;FRLk3G}yw zl4?LmJFum;%^Zwg`Rv!$fd$78*!fCEJnXy>QHzK?ZW`>R0L_Zj!5Eg%6P`(2=O6e{ ziwBJvSe2PpPuuf!>@t{|TA5Y(s8?H$0$@_dxr?+o_nuB0x7I#l{Ay12taIXV%fx{q zQFoHvO%G@qx||C}RMP6PNWvC&5dDh@j5=ZgYQ!9-m#GW>C*s4Se1rLyhifX@<^={9 zVQHsnnT>KEh$g_NH{(vGxC$%0%n9bhZ}gK{sGZ6R@QS&$eV{WA?b2#ZNc!QBLMHLc zsbJEZww4?;!wvnwz@NaaMukzgwR~?c2&qsCVjMQ8K%xeeTst6z%#a>rXgibTQo$-Txjvg_s zm5{e=|6U_nBAmGJ{99Jhr4%GACE+h7C{=x|)6c_DUiswK7mK6`Bop^d9K2LAJozxR zL(txV4&YR10^&g7EnG|`_5Tp1#bY{FPIq9GOPD!?vEvJHpy)L_Gx;q}BnFK3I`3hd zt+zA|(*L!NcYmdOJgpn&#$+isbI;GH?8K3?r-up@o1%3vmRr+H4dEYy3qL%Kz6U`## z^Sdqvm_O04&`-SBvh6zRB%iMh!VodwRKG=!0*bs1ZNS8~_$Ibgk5aKZ{|yc9pTsEl z!9@t=BT^M%&^I}y>gveK{Qd8y-80<(Agt}avaH@c)ddl9ViT|TxgsbB$$xjM6&QOc zDV7#XM`miqZyE&7lR>wRv9-Hrso&d#v*DQFWu zKZB$hZF-_|nslw-VH2X6^*LhG8O1G6qBCF8>G9ZsTD9w@tn{CZkD!?yw z8}t(PECD-8!t}i^Gv{BuYjGPFmKr}!N9-7{eNevCiVe>j`s_EN4boEC`)uVsAUmtJ> zRR99KK3mjp-}G96n&SmJhtE9meNCX2_O~zc_90zw8_x0))1VexE0QgGN+AV5R+KM+ zxKfBXQPQbF9I`|z7byB_=VGr8miKJQ3}6dIQ1I!Y!DbV!BAcolbMW^qU-|}xL}OVH z+$K-n+fc2SHq`I=J+M}#ml3Z z-BC%Lcd6>|Jl*$ za=Xt#R$Y;ESAzV>OtP=Knbaax)~$^%o^FdFdd%M=ydhy=vBtXe1jJWjYfwRj*6XzX z;M3l*A!4~lcw+&oPm`3`pe+^tYs3Djh?#tecQbA1@@XRJSsz0i5}}TCD{BSd2icaI zod40K$8OeAo`v|Io7WdiD?5x}581J)G|iu(o^J6cd4d%M&MWr21yv?L5;Azj?uRcH z1#lO+1+xXEbohbh0=EA6o);3T-EXZjMeq}|Ap@CgTjpDGegz3f`F=vgmO5cPUP9bA zyDmd9@7Ffk5-p@2@T@Rsy_nMRrKV4yZfH(;B5~dx-gSc+({41T-eTeHMo^@N-kGGF-mc02wsKy z_GaNAEsG_38jVi?-1Hx24OOsNVWyI&QM#uB-#zxZk${CnV1x=zP?{cA2-y9soSr3E zUC_44>nyUpYn1u)pDQgpaqqLMlCcl-9A?v|Swgp8%5(e$IBP`YM=o4NUe}weu3qn2 z<{bC_ke9^NQ+X zfNL^w=vCO9k?si{)2!!2nbkD!w?bXb6o?e( z97pfPwOC#bwfZiyeO7K5YR|KLZVmBsHP`}I{@$u}-*dA=ul<{Sc!rhh*yjZ!gDIc+ zo6kQ$Wo0M~0tc#|XMcr$UVO*T`A5~PhnB<53*N`$e!#^$Y)p=g)@vldU!^RIg$CO_ zGP|*UxkA%fiOSAg|Kha_Z(pkY6%5jkU5)$7h7~IQ`GoU5H@dZN;A4GUtfpCSBr;Ys zJ|kk6sP8NSozQm{j(yj=VXG{x(ZNd?X0&~~JTIg&KL>G4+Ytj*U-5U=&Mn%R(7##! z3~FKroM8HRV1y;u(L`HX%CL|dB$)gdL^J#GUMu3~@((=2gS>j6K)uju0Y{|JOc2K( z3s*t@&8*#MyU394*g*N+Tv)pWyYC zh@Tk$6;_g{Q`%XFh`sjuL66q7MFO$2&H!OkOB$g8nHVE7VWwdxX6*`H_{9r z&lMHT<-Lx|IGxFF$YE?eDjWufgfFX_yMpP&=%QB*Z^p99XVf&emccmwADArn(a+}8@a+BU-* z%))MNr0;|_*(f)#4}@#yF0j%U)AiwWaxp7>4_#r z%=FIuZ7H!O`#6XZI)i})7K7>^+C4!llWqmOB?QB(>N}pgHne^ekRu#^b7ONhb*;h@ zH#Pb39Xb~b?VqO#Jrf}c$i4T|`G0>5%h^ROK;CySI1FvJCE-IN>|OhS!>>qV=MdRHGL#PvkDzO6(D)i64Z1zrJ26 zp@eYwd!DpkolX-(B9w36y45>+wJ<86EOALirk|gmFNCvseBA7ST8L{1I}Mv67B-KZ zGRi)%CP-)Y2}F%3Hw1>RJPk@OvpR7ss9@t!ntzk71zV1i4YPwqxhv+X$_GMH^A(CO zoT`OiWNKLoq~w|L^5(YjUwruV7???i%zF-6>*0Ps_K6z4%#&)5j0LLLpr{&na;zxY)9i>OHins67JZ3$hNTdpB%e{uCBU zFeu2E2Z*#O`y{9c9>7X+;&oX_k$hE=7zrDU=k1-N_c z2f7q|Ik7&Z<=1b}@!VRlpkjWV_XW_m+8A5u^U*y020d{N>8lTC5HggK|OPxOU01)NCh88 zFLdiiTXw4nl`dzP8SxA4n>4pt4mv}g@^tzf6x1f_$W;_uKUTQk7Gf=5W-6wvn@dl@ zjC+-Sw~U#&w^vZ8`Zs8sZ_R@bv==7RoZBc9gjgFBbd4^L^c1D_NqXt1NZosO&LJ+p%I5yha@v|D~bne&-b*@ z+kEK!gwZ#j3o--x>okVVy6#kYux`DsZY$zB-2v3pq8&VXnwoziN5f(HvR`!>YcZKOgrzASJ%_|TUcg!8j$}Su)6wh zQldEjKW&}B?ASI#RKI!Nilnsl3Y9Y?tLHeI-~6FI&o8Y3ehw854hZYd2q6Ek%rnyI z#=!ai<9bp57p_+;$mVQV?X998Sa={%gSk63b8olpoz4K|;r3f4ww@LScyamoh!X1O zV^dH5KGvnymbS3?pX@bRh&m-tloZIl=?WM!f`Q|D>(y9Qrye1f7P?R!ZPjK*9}QQqIA_1AJ#kTNuh zl!kt|tlk^)C-LoV3zIvAltL$61SvF(-ga(eeQjC!wPH2U51d=yyJNTmU2a1w^>IS8TvjBU2^0M1W-yYctsrwS4b96?CoHQDq zAx8!H#pGMpMlSq&UBd>f$=Km>`sRjL|847a1pI^p(LOs(WM#{lg7@M%JCIel$(#&r zNw^vZu-|l?529zdz-{XMX?+@d3 zc9SAsSt(5=`r^z(>d@V|#AyWa$OeLpw0d;yO!L8Q=xE>4>x(3gU-&a+y)F2u6Vbk^ z%6w};@q!0z`Mm3>kIkJa>i3@r`O~XjQhS6!y;`v zS&OtmG?boP?hXiFPPoO{doJ<%^oiQWbOKh(>!2Y=>86E%T9f0v&o?o6m z!g>fH;Np8OJ_g7bgyV1II(=b(Kmg6uj_pwiXrYF;+_=Gp~*WKt;mx0T&aGIaxep7OG=GXu&PQSQaK!KvX=9pf2)*CBT@*l#;T z)~|r;gQx(NBU}~-PG9cipJc)r>D9@-8g^ZU>_8e6TRcRMb{%f?!p_nt;=*A(I2)dz zE^ESKOEQ(StF+r>u;VhDgoBx~j(xV>AN&4}oa|SHh^xyLzQ~LJ!_-+vMcI9CpJwP( zx}s_Aq4>ik&qlpQt6N!5Rf4UVW`P>e4gL)UGJZ) zS*$g4_I;nT_jRuQ*_OI3v{b3z19wOjQH67Zi(eE0sLJmPG@T4QNI_>4&_39B&jrm! zUtPrVt1F=X_(^g!B2C5Cg+QA5YFfB5YZ?U&cNbYviI87W(dw~=rQ6bJ*^*90QI=NJ z_q&Xh)_K<&5Y`&8NNmheE_L3?x++vU-1hKF{|iISq3jjU2b0Ro7ZtU;mcd_5-b*d| z4KJ*UPAiYfr~Pla5r$ERq#oI`AKKIH005u;iK*Yw_stO_)&ZtlIjDbp&OQ9B)6EuY z4r-dj(nORA(ac&Q+k3A*k~C6NUTOAm>qf#a$pscpwTAaMdca;Pio*C){__pPwcI9a z#%j3g@zNML?zi`L_F>Susk9N=ufup z<9NwxrYoK)&?N)D^w&@nrarav7FEHDDr93^NP)`j?kqQWXa8E7z(k0{zRa3#N#nE_1pTmi@&j5Dt(zI2 z#;IbK`>`!G?l;p)m6>Q}*?UO4D6ILiQMW62M_svS5`G`X!hdKed}oY5Rw7#mv;X?g zwoEt|&2jl{Ut;|oot&J)CqOMU8dU1N^-!nF^%+N4Mx>4DcWg4`GWiA|o=lAhJKx$} z8G^@N^zVCjmiv(cf30z6s_;Elr~4iK^G;lxR2juQsHLpf@7f}GmTBhC_x*1gurgPUn2Z#`_Q^7LT=AS6HgOYte)tGCbrAO)9Y)jFV^8q;*3vy%R^0oah+K}j zkv%68n9NP~Rp`A}M=%HYy;o~Q;8hz!`(4j)7^03rEp#MpL=}=)+R~eoX@^p zUef7;FLN+D(z!|TR?-x#xz{-C1Rib2`{+{T23*;t>E_M?TGgI>s1zrmHKWrmB=IVz z9j)kQ=C+8uZ;7`eA7Gd66U@#VkbaW2?|J|0+%Udy3zEBjI{(o&g+cw2Ura(GArfjs zr_tJkm8U3ygkQxUZ=6DCL1)c;ROq!(p@^*&q5kgrwQ2qwl~Nc70WN&uuy|T}MwD}r zyr-f&A@<=QP{?IGF&SV|6+o-ZyT=Zf92`qtFjyFBKX|Bbv|h3o9hRS##h^BI=&YP2 zEi^!uc&Kzw!(OGYV^}@_df8xf2)xj^z@9m4h^C-rxt z3~9;D4^zhyWwOTJ;Hx<|$A2)hcLaYWmQ4~UfYy;JyA%2VGb07F(YWYbu=N>>prh-z z;kgnp*QwSDqpD~mMVj%FPTMJCTxK6N0vM(}CIob~Q3kAaqwfeTKL|OtwG^uQ4v
#7xzpu1EEoY97LNCJ}Kk1HW`x(`NIE>s_?~S`!|3XL!4_hUnn8sg6s~wIoK5Q06 zDf;F_Vn1H;04<3hYd}D;-gg0Nf`K?w=y7}l0`$f76?pv%bF_(RqQ5BHHSR|)CP`FD zAEQ;S^5FOShAQicYbW%2koR}Nb+o%eG2N%4Wx~Lyi|$8o#60xq=9SB9606<{J2){* z83FHWTnHepCNFi9)vWGn-wq`&bq&R8p{d*vESXar;RkEC`HPNXJ$0jMUl9B}OI7U; z`CEi&j0tn}f-A5Te%t4ye?x(gf9fT6a>vhAMeIkz$bU8!latdZa}skL@RpYlkhof% zX76yh5u=*1#C=bWnq7l2#ZR+Lc;e$7N9qwrVO2)x*FP~P%;H5m_+7;$wK3BV9 z7jzYIgp~d`qP+xmYrhzM?7PBv)s+Rh*oJj__PTLK<9hipnjx3RrA{z!BgXb_)7A;* zq>~R5{wJtw3>s?e_esnQ=pquyiU`wLq09wFGaaSHKxytJI}AeFNAx@1=2UFjla(ey+!*)% zB5(IX{3qp*`j}$l8Il*4FG=3{_Z+GIh#Igq!oQmSsba9qccov?5J5uG6y=dudJy;6 zigU(w>@Rv%z!h1C=f^>e7h-=#eQ0IlVi)?akcG5@zA(^q>e`D;#F@F26{+O@tLU_` zjP3z$j_f6?FGQbEhc?zE{Ni95vQQKN7H9NW{Y>%mthqNtlk>_fJ|sR`z+v=r<2@$x z2PY)Ujef>sPc5d3KQy>;Q*s;?HMVUP}eOu`l3)61shl#hiZg5IcNX-8%)2TrE!;{8n3bRA3Sc%(?G zuhU$?N&c+VVjtCKaf$|~8hQg1FQp4hmcs0=nSA7@?d-&$VIdaY7yBP&0BTL0Zn2Y% zg|q>E9^+qQT~wC@-)AfDvrHC}>ftRest(%32c2>TyWd6+Ul3B%n#gq)DYHFm5fJa2 zL1f#feI=wOUUMPnFCO>s8^xgEe>&;TAzuTJ!l(egydF;L$`o+)=-+lWVL-E&AS1u6 zA`wI97ZS=3T5pUB*&U6Fwcg-*)I0=?<1@by08!D^0*(M{!v{I}GFIdjp2OFtn<)>v z#K!6qL_98aVyeC=TGKgQ^Km@1e#>^_*7wCoX1z+O}(ENtrzi;AUB80fi_dP{1bpN1G^E4SuvK(lW>_s zxTTCpAws%E>BUX{_;Fu+v%?f)_Va>){sp6vPX{7q_77;4ts60L5pN1Y&7{Z?VfFEF zJ`vm%5Wlk#9EAY3;?mNG3mLH^I-Bp2G55s`%IUSZY0`U(QqT6!dZe#@-+Z~>9LfPz zGE6Ne&;kjFU#dkHV{VAnZSU!wXyle{4;7Vg>iN%~Mpq|AK_z_i^o49*@6)+9OjHGe zt2BkBhVDTp=haQMEMAJXlKYA&_s^iWSl-6{P;QjZRL=*so6OT6Bma zOlP~&ZzjBF?`0lBN4*+b_3sJps(HKp8#`iC1d3s4xkvGTTVN-)Ad=BQ`ANpgv*0_R ze{L5T!E3CpOl1X3%-8$lqC*?bk46Xk>>}w6!5-qvuSu628$$W9gvN%DPKx}2w77*71IA&5D ztBBs+QWH555Nss$4+5|7r!ai|H4h?GBIq(PWqaFItpv^@3IRyogO+ICOk}+}w>5!o zAD6NSnZVC&*L$ldN`Sb{1n8AQf42k9HM|(<2IM=(VrVwDMzS}yP7G=;3;YYfeXK`^S)*%|Pks2!2%?KWua(4fxqvP$`@d??+Z)eJX54W` zUpGwjBo8IPTj4W;wEAkYGcUAE6e z5uN1|QH|J^e@^=Z*d?7>p+VfFWYmK=vzGHHm*0YpF#KbZNqiA`=?c^8#l=N@TU* zvhG%Jv4a%JGcGDygHNnC)BLo+EqTRVh?QctO4jlixzKb+4{T9G=bukeXyAVkp2ZX(svJm-Uqs+YvsPVPUTZo`FDPd*S}*QZ zfa`9C>kob_{t%tC8=eGXpgexTsJhSu9ca@yh>jwyD2=!cM4o|>Ko4Kx^R%S2j}cYs z!5VvDC;J(yWzKB%r<@E4?@4x@bBP|_K%A_Ux)uo zhR)9!tPUF7EJae|>AS0X;X(g+cZYgn&3bAwSU&Uoi4@^xy`dg*;G`IVnZ`r9fUiD# zjvc9dUZ8mN<8iBEl2cY?*}%&ObxuFLqm(8%vZSB6=#2Zj=;>{#G9b1K_AIjQzW#Q@ z_@<)~iOnhrr~BRI23M*C@ty?7rqz}!&DZ3Y1p>>N>QuNAL|0eTi^ITk^_^lBoq;Ze zlR>ro%gq%$5(uu+?^GI3E@iAHaXXIHH0~`G|heh3W%TK z`!FBeHU`=l`lhcK`pcf|n5c=+Hc+(*LpUEY`IwvN5pjs?FkN}2+$l<4cgLh(-!-ST zaB0gpsV<|rR1={Ow&>+VwH8N_Oo1>NcwZ5svzg}vx=ek-0#1dB9*<^C+FLX0xgZ#v z&tvz9b)vUh$spE5HKF4eaXKw3PiVlg@kTR4#XS-;4I)%M8J?{dfBB9#o$Q1NDT(_f z$%=qtTBZw>Z}?BU8@pRj>d{L3Xww1>%gYb`-iSx|x(4w#+?YUyQPB>b3xVwZbd2DiRvjajDWJgYuousPW|4&a(1 zHugsN%yyAh$d&8hzh2;9(RsoVIzW%kPqGgNR}2e6n@_|TSB0^JdK~pPM}CleO!M~f z5ToEEyM-Q+^}9xASX+ZLVzJ@jrw*xMr$XuOm*A^{rZn2?30C@cQkgAsWHE#5yudht zD4DXH>DNw#o6U`8d^}ka$(!ltW>#W=j+9v-Bl}0BF#7<$}w$O=?YhP z(iQYjrDB#zdasc7b87*olZSp9XoF1H)GLSCN@&1c!MNV@CR2~`=(LP2&54K0!veBOAI4X0-i>7M%72Uc<>aWW~NepzRkbMkvV zziMnh(*?>#`Q%EZbCQ5vP%`-)v>pkB^X18FL?P9N9~ut&UHaE%?1;yq6CUwa=WI@d z>xzKri$mKxdFikwu>T8@w<)wzfNz_L@gZ-Cr>N}iV%RR>x@Srs7CV_e1u*^ogstvQ zgdC%;^G(M7l&o*ZN34RK&M<52k0kzb*><5D?@7NU@l)U0<}bV*JzwhkU2Z5v_RcVz zUl1hx;DOd2|LCjN-%QBkx8DUni)Tuw;C$LJ2N+Tn{v4!*irUM{`B;jdD}nGMSK?nd zI{9_8Myp4n5HuDwqHCC)6MQo?;(i<5P6z>mI~wSNTG)){nw0j}(SuxIOF#!pL?~7} z7nAkSG58lu+yfrJV==Ai-2JIZ1oBll9`>^*0e6n93YgTxx>cw;{CcrHiuSLI`)LmWX$~SVt^s(tZr{WcxRghhZ2tB&cgq{MXXZ>9qznpT+UL}ac-*I>uEh~qF z+8|lLybg-xy;X!1XA6R1A=le)#?QUj2#2BVFUhI2Vj@YAq*x5~SYQmVeZX&T527#} zCX`M~>2f&Ej82EIiJ}B_2tvI`f#4xg_L}_4($eN+C2;1FnUd4bl}htWnt9F5&8-;~ zGf^fA6aIpA`tNBRW}mtpZu2mDZ6y@Yr`B?znBh+!(XXq~58pooXBM6FOunOd_fgaR zE~DLR{x7!t&o55Whu19Qn+cua`XQ({5x?Kg3BJ!lZeIv3wY^b!nuUI6^3_M9qUbWb z^mJH?a{m=Hevm>Q z8C=2FHU*nB<$pK29o#Hox0@F+jIJ9FU;(GAQ?P>97~hu4X%|MHNbmLQMZAGXF%RPa z^2P;B*R{E3lngTb4tKT`<11LS4~-H8^xkG9`_vE#B5NYbs*NK^_YFULy8gk8`TROS zI|hw(Cx1(fFjVO+2GD+v7BvDO^KaaF_=@Qz9CQYU2BOW4iBOXGZ73}Qitql_3_5@J zBLp`B0WWliPZ3TG5URZ>8r|;=$4&641i9OjnCVM%88MYL9BMdD=InaaH$`t-;x>%82JD=EoO=_)`td#rlBMlO>L^6oS<5`k%KmO;S@S-}w z6oh#15kWT@dPTByCo{+Z@u?H46>dzaD$3IU99zC4>a6mon-7`c#&sD!h8Q;&1yOf6 z7}cMx2$$58d@v0IRT2Whl#KI5;JLVdPQr4d_&r3bbP*|G?1e#-=~3=ZhTi`~fgOB9 zkqXrcm}TOJT2p!p1>U+9AXrCXJFRGty5TyIyO+{7=;hqSDTy)!L_6Awx!DLAH!u8IG$|NHVNyl4a;DREQA%s-aY{+sOs41+x zl`!{8{Ls(mSNpVy$|UckeMRcvyR7fdL(=1u&x>d=Z(pM;N(HCWlbK8peGYDRa9^pX z?Xsk4{2qk(U8=;$pM_Zs<%|(a;V!trM_z2;So^ri0N|Wm$zhYd&O84c_xes~LQu$* zEoGtmv9dSi+C?1B_hsBPTJ*wZ%QWjKZ~BFb7g^R3_brrYpzzcTVUNl9zdhy%sUMP0 zQZ5(+Ju3zxG=Os2`v0sc8~A#x)pdirFP#)Qe4Qs^`MA=vTyG}1l065LV+Mu!GSRBA zU@*eH^5LdId4de}GiIyk2ZLGs(k<;2b{X=mGuw)55hkBxg?RV;(^|N;oC2igl}e4W zHP)6V@z1A0`#3}b=#L~$SA>Wh^Kr}%-&!B<(0P@*0Yo7m(y3Bu5ku@ZloA;t9XDvc zoh-L&AV0RQQP*P~sg+MPX7je56V)K~H*1d5;qRxt=!XL-0<=OY5{)(P;A!&p@w9nO z*Bf-z`@B9OqS zWpBce*4m!0CEy+_%bF4!ThW+g+*O6DCCyRq&gJ-x*9Kbkv&X&5_8$6H0zZjaWqVs7zKaP}XT zCltz2UP{ahNF&AKGW1q6VdvQ*o$#D>8=)4AAKL2X1WfBco#haC(sq$ZNbq+a zKwR4pMphtYdu@EJCh%`VNhlG@4Rr3d(a!*+4Zk>|t5<6yOdh~%9)nmhK=Ry)`iKo3 zCC0Ovz`)ybG+IhXcrzaMVo9ETe0v#Mf0(&6L+eT7q$2!^zOA0#Qf`o*_PB}N#UZ`? zP`~3F(}QK;O{DSi6*J$cdG`+E=BJ|U0QDs$Du_{0=KR>69?n>yTL=RZ0O_xZ;+H8) zFBppGVCrX5s;Uv{j=hcbBnmQ6(T{kAYhewaJ!aL|go`k^IP%)}} zXnA*j zVhFP;pOT@F+ot_X~8)R+E0KkjR{ER5#Z}9jX7{5D0N#xK*Ja~gllb0scJBCx6jzCUi1YJAT+L;;l)YU zF*$wx-6z^g+ocr3j=@Q*8h+zz21}p$ZzFtZs^bN*%0VnvyGdZ2io)SEd`HlgNOVk@ z|7hlug;1JmL}EJq_TCRZD!hYH(K?^%2L>$!k0ML4i5(40>GWnqV~C_`{@23TNr@PD z+)ICT|E&qXucuZ)65*P~tu`+emiCp`eSby5b}6r+dVe-+5|2F8vg6Ej`D!xQAu!<} z-cbsb#crE?NW4BD zPW$cv;5JFTW}sl2bfMY^V5Q65>^{GBY+n*RHQ4NR)Po#0%{orUH2KkIuytj&pd*#q zl;H#f)@gv_mJ0*L=(nLf=^Eie0n5?E6Lfc=(SuJs5B1ARRm3W%^yY3N<*`N6Sa`^1Lt#WCE{xSVkv((wRC=#+$jYQN%RiW0pc+UCqTa z%CqZYpYUZ25#?`asJQLUPUJnAXZ~_yFE=Ix+>ZMw=_99W%9MXj%x0jrPxx5oR}~IOQnQGnpJ^ z5577c$L?4VD;bWTKX^;5*L#`%hGa8U;Ci(*8}Wk7t@|&d>83vj+gbMQj`4}Ar2$r> zFjcRM0}lfs!XAWisk>18aU>m~-cgH0H91`ztzHM?7^E-ju5fN1i(a=Fw_7R7*f;WD zEZILCvW&+~G|@?|SbF0om*h#$7N!UX6g!NY-7Q$dpjN0ac}7FusVJc-rb)nq{+vHWU=zP z=<6s<2-KRePtnQK?o}Tvw~_|dl}Xs8AE?n`?RNh=d<*74<=5WPT?gN85L{NxU#M&HJQXivMtZ5r01bdTG z%o+#Ct)j@-v|k#fZ0J#4@V3>JgAU4{a-?!R4V}Q)nJahaomrKR3L&&VFdaSNNJ0IP zaL?DIGOrn1`k*m}?E9g}EbL*UTuRup@^LhIFTpfymPW+zR5r88Exov@V{Z0f~@ZS=U=4&Ii zf^uCEoe%dkhy_)Gzw=8}R0<12xST9>VmKX3^vqB6N(xtY+BlA0)TFhv6rvwcnybHg z3%?yfjM(gI-)J*a-`hK@iB%@uV-U9_pEYF7-g%&>jdz~{Dm70sN5|5zNq|*?kH8DK zAwQx$O*aw1D>P6IKu*>&l)=XU+E?i2j6#<4iC~|<<>0Y==aDT_$8s{Bm_Ag}wC@eC zp4gw9dZgS~*5%GstOO#)Tu<689Zyu@zeD=bwIwzkUZcUyye%EbY!IbfI?vC_-5MUg z^^W{)S4lVhVdhMm{cNtKuG`WWkJN6cx_T#!mat7zU^Pv4^vo=uU8BPu{x1#0&f%?s zY%7}nCVp^Z#;}dSi@+Lnjt$|P&y$#J*a{o@c?w!Zg2=3|ndbsX-}$(3J|!Yoz9Y0< z%QPrl?)j`_1k#^&Zu68+_cPMPBu$b!Irf3x2X#9}mE6YHzWB%5c)&FNuW_=H2noS{ z0bR$PL2(P5;HcwXN`hpCez8$|0tF}&Afs3q^g8{0dkYO@o=LeT}RPbh-d# z-K}Hy@-86JBZYM<-#}iArpI~(wEV7(9d{9|7Okc5pY6RuGy$B19`S)=uik}smA3GD znd{ps%;r9fllc3n6lZ1Zha5-ABIEwNjEgEwZ?QMCd`!oQ+O{$MpT-Blg}1+KK>oK7 z=X-x`2dPpqOxM3jm!_I+{J=eadQZ3HuK3_J?J@UK=Qi@R+q^}@Te8Qt0txNc-$~5t z=Y(p}wuws`y0U*|+pjzhdu(PrW}}Tynj+-8>wMU9P{ltQ#Rd>VN!}}>34Z~y&c~){ z!k1OtuIY`vJIWO}zDb0o#IN(Q#=tG1ZLM@z3oDhJELi>fU;;q3ZsF@fm!LKmP8&Zn zGA0eMV`L1_I}j}SjyG+5RtVD+Tn!E(q9UMz1C z?i7TZAgGN{`~_YevrV{kva+=mjh*D4^XqZIb2$JQcvZzn%o((LOOyS#&v#XQc8jY|o8nMAae9QmbnUKI8|IL4$~N*T?I#_j zSuwse4#RY`p}QS z@$p{$atFin4J{wn?$?B)!!l}r0*{eQ_~t)xb`>i3q9wv~z7cKTO8PTYj#EEt~qXSUpH z6`Zn3JoH9unmiQcM8hVbU4i_BpFoE#+V%dt)7Dk5eYdOZIgCYq6TijpC3^VxL)#Dd zf2zd}{ztj8cfwasA8$3y3RXE}Wc((RF~^`z^k}#Xd!*L_;ms^BrK>+R9?9vyoJ>wr7Sy9?OnAXu{~ z%g*F>d{FuV0Ew`cZaZWPF8lpM;oQbjyq)mHbdu*CW7+K%ROv z>`TV**f$OdC*sLB~JJi~ge*)!tfuru*2`E8ILk@?MA!{K;2PgL=;axP$3T z&WlX1bySBh5c-gDl=c>=bvRhap!-gZ%%PkB;>(Q-Y-VJzp5Kz+@vGLCjWEe&%F)hc zTAO8-*)Causl4*f_+;GK5`I27K+moV9p8SDYyN&&`W-TFd(He}9IWG?K9z&FjEjnt zZ0TUjY>BP$3Pz!J@kBhHITv#q7F+-2iS56*fv0jS5f~vt70ULl>w1Y-jSPfXt&fp8p`o2XTmB+LifCc(&Wr=EF`?)hQYOp!Mme%TMahdU_j!S@r|{pJ%N zqh@3(&nD{=q-jWUF4_w#BGuF;wz#hjyvvPUoOaFMs<@_K<_r&1s1`gb-}mX?k1*}r z0id}hfvA^XyZx#F8mG#h33$^ZkmQOT+G=A$Ss;+VOJk{&OhiySve@rkyYizc8Z0k( zEtiN@_1#z2C`4cCvCD~(Z#_AhZhL*Ecr|-HkP!tlU9G1m?aZ)#ef2P-f0Yfyn+}QM zRHTNeE}h@VZo_!noL5F{fz%p7H%HYW&lQyg4@*GH&C21%1-@NpNYnm&QHVji1-4@p z9kryMH?_v^^(SQ*_dZfd28?37IZe-Wx=Bh zOSIS`^ZO3*Gd6^^rwc^vrUfCxHK4qxW{EyZg+BImYr_{Y@v|zjQtUh@!Z4{~*|art zp)GPHrclKzt6qfj>!GWH%_Mfqoz~5UsFf={#Q;xTU!RlqsIBm@Ad&BYuu_m32K480 zXyd4ctSt6rXUUAP*=ys8R`VR#jA&Tp- zbcc8ctL;X<^J^|jHhak%8_WSuJlfHOOYcU9$_t%@{N8ihSXzaEmre2aT=7X{-Zn$R zXpG+Z&OkC;_dLsS?`30#S41_Um$;Wn^E_kp^!j3b7AOzfKXeaw)uXmvOz}G_s0yDm z{AX?%%J)+3>Wh!ZS@;8rCff1yS2Y-gb7(1)Ao_M-yxmY1*PZ!#5SBmi8&P(A$2CjP ze~wBZU=GWypzDL!GxSxpjlBHgb2gvR|LclDhS;btp)cP#m;1-LhGRC1&2^)kPCH7S zDswt5%WIfdzjEp9!ILswKDMS<1FW)w>hd6QV&K{gH za64F&4dweQyb?r^2Dbej!SRUW0D>gkby6qQGaFodvXQ5_G1FI1a0{ttUCWB=BO3EQ zx^Ix5cx$zEbI%*hS#SoQAUS`cjvr=lln4=6I zuE5Omf5?&F*$I1kfyt9gKE}v%T|#}oyz!ne%e1UYBC=w_S1T+R`?AGb<=;0le9dVVKz%W>byV{;nBzq0*j|!zPGrl-_5)>4YD|jy60);Rl3Ufnf6<)IgOjOm!@5qX7 zY<>&hC}#=Yy7HiUz*EJ_o3sWT#!Wp&+TqdFXkA8So;b4&?9_);KfC!UST-AwcHsyY zlg|Ip?W1=~ebEVVt8Nbc+U$dgl+KB^gMIaqo9GJdqbz@tF)Z0z>ETB{z)>7; zF4nk=)bi1}9sLvBtEf-}@)kKp?N;wjRB zW45@0I{}U(6>t+z{}<>5GAG4HA@xZbC(_F=ZcHjzxU(xsZ94Rl3-qa$59CNf%NJ` z*%cuoV7f`Tae2_u9Je(iFJ5{S$uk*)+bez>gftajxlZaC(L3q*=ouSd{H9wmjs5T! z{gdysB7<*;G>i7Aq^q6euI{f&|5DsIt%4+PM3r6T?7YsCDXNn9W2Xy|KiQ$bJc?tx z#_o8Ot-t-8>8dnckE+v2GFX?0jrGfUj-{V{oSrt=^Oo_5 zm`S(XGvJyX>5h{dmPTJR-HXrNf2xxctQGu;gkO#bGP*f;bCH$~M|4d6@8IyD{U(9T$h? zr`EXcEVzRePc`1{PI_sS9GDha3ysS~Frz z>yJJea7+RsCm-=r9VX+r-?fmYw5yD!{N$O#MEl9kb}j7sHb;@DjD8 zZCi2Mn$qJd7nB&xsf<6S;{938M{(Moz9wzdiWqJT;Ql_}AV;Y!qH6ENK^-no2veL? zL_JFrfmDj>OYgm&c$WKkj{Tv8tOomLm;NU(Y4*b1Rk@;qS@K2StGAi$Cc=mE?XA{0 z=Oi_vuC5cuuYp+7T`>Tw6Q!7?UL4^$!j3bP4k`Omb;Faa5*~`;&ChjBtK$NX6~IAn zepQ$h!&d6|!TyVq@B?!kmArV!O-8#WjYpr(6)wiUu96pzyS93xB)yE$%JMbnP)3_$ zUV>L@tgBph`1*Lxh+4SZ2O8OTiu`AdlD$>KYBDwDv)O$@Srg8CH+2>*+lGh@8|%{n z5o}l9LTI$kxz}~M5%qKi*Iz65QnTF;<5ozyrLrPRU7g-E1wqp!wr_yfv-L{2Av&Vhs!>3y%oplE-Npd^zn5g@48`ExzFsJoro_LJc3%QV$(e?Gx`)&b9kQ@7(@D${d6lO9mq=7HC50(Wa7pgeJt1!w6q2>8lmYP(Fk7Hi~`Fj)sKLh6RqUB4cve6+Z#&x@q-yMJD( z{(zUBY5V!w&+Eh8qoABfckMxfDtQCFG_ECkNYavx$>_j(!yTaXp21gqLa4j1=6MX3 z2JxR?jN|XoQ(ISS-Vs`Gs2U;k?3QN`QDX@ORf zG9`xk6*HOdCYh+w(6~8(<7FiWI6&8ZD*OcxhL%^3aZP?`7fS^=G?%J04!Om~~xXL)#?_G{RW zedwPiqc6^p?GDshUD*;YppRl`{Vc3&U{kedBZc^|dV0^A_IH9AO_q~BGxGengfg)z zOZ=R9LyRAdNMwoK6r1o8L=#0yFDmGhx#_v`**#o@mVT*I)ajvbA9mrh88FpShczu<`~jDH6)|u7#wA-J5r0-Pm-a1`I8oF-q#-7qAhgGQ@2=NYw4Tg z;Uj#pOySxcMnAZ~{}3dygHk9712wMrh;_YGZ38X0$f%Po;F z#-;(1-;(|Ls%6J{sos28zqfN3BesSAs?YUSAYCxl2^=a^9uq)&(Dl&mi3{c03!4w5 zO+@7ki>vJTu2&+Kag#|wJPrMD>313u7xeDO=|$sgQq=b%t*I*oznQ=HxM;t~xw6w0 z!f|2eh;pnao9$>Ew^tW^4vRdfbQTEmpK@3&To;f2fZpb3U2J_yH#^$>QzIMO!O7Zj zAbaxTz@_$}URR%NaVXiS5gLN490i8!_-fpaf0-AaeeDGe<%PQ-jZRjif7qBB|049dDV}(C+*^Y=KYZn3d*T)utFP2Jtd5 z&9(7X?+B~)`BCG@JZHfZQ!eX{g7L%D!~0eDA_2pX-do^2YC9wJb9a>d))rE z{`;)~0yJ8YZAY)y{2%4*&rdDW7a^gLc33<2LJ@yq2ABDHJ!@k|VcWqbAwYr`9~&WC z#nzKlS=fBtH$T)Dh*$~6AL47@$?km@8v5>1f6%mOFQ6GwFM+?oXfdR})t-qJYDd(V zoLk$>OD?ts-G?V)LD#l`Q~MFZt;E$JZ=uI01E;&QD)a4dF3d#?f zJhEGk!4b+jViU_K?+`*JdG>F~K%*rsEX+bIlrkh%O%6$G->fU0l*nvxVBHwBiVhQ; zwP&}Tv9`(SDKzIcdZrhFAR43FD>C03Fnl(`wB3-dOgdZ3{5ypmJkZ>{C0S&f6i!^aPw$R?m#at}QaBM{?z0%<6Pv4D^ z>1-*`UZ`9*;gup442cj*WjNow7ruxwMi}<=pn(PPHtC>6;8x`-FxRw{g=5Dd9M>8f z^l>zvyu??pX@7b}d5t*Sgg5h4LxsUZe~plqJrP82H}V9IRfTN=kt`9+X3Xx)KK7ts zJvUA9%fi-mS&Fyn4{Ol6RO*Ye)X(G0_RRHFj>CR8$bXu_N9{)41vCd`^a`ORXcl*f z0EHPxjSj-}^&h*AF1Bl;%I_ONZzDAq z%F?8iy}yt*kp~(W$7YqwO*;&spS-MTI6qS+hQfeo{GDOY=(5p^KOMh|685m%fdLmZ zfrwM(ZGvc5gnMlEve{19nGift;TI}1_?j!=tw$KX$SShpBfOO8XyoYU?H|^B{DGrr zq6<(BlEL=xTrVVHFw-o_3E5*k_e@n=%&iOfMS23|z$e*(exje$m}& zl5T=@V4`H(Ozw4>L2ozMLUrAZ&3v9+@pu1uymgaPpVrGU+PTWHA<~!Kd73aVftO`7 zX`@K(>QRy3c2QGRkm}T>%nPuzYd{u=eVK&)0)T5{qF{HNKAu<}P?5t)+ZYJ-0k?8N zt|))pLYzz%wg$rz{Ye}Os2!WQR*(l$c3xUg)?JFf=ve7EXdN?M<+j(?7Qz+aY>C32 z#7)$C^JMP_SS?D|8~cU60lkhlZD0g52b>f}bU$iU2aqcro}EdO78(E5y@UX27G$Nr zbp+5sw76Sp@$;@gCCg`m8zZGp&h38du1yKh`)Dg<#(juS(4YwU&1jt-7K34HmB0Hv+-eO=jWC9xl_>W{LU~2@_;Y%3YfET`1*qQ2(RIApJP@W+j6hQ*QG^B&U9-wjonW+Q_Gp8g<-B0zWe4Ra%Y$seQ+_%+e z&xASBYGW!PQ_TM!boo2THV;zuu+mb{9nrdj8K+~c7A`F&dn0OpE!2)1SIix_J4*dC zrCl|>9jUZ;GCNnxg0&nNakVbxT2FOc=uJIYKIeX`?G?((uE>-1C13E(2jNQ|N4@+k z?OlU`tlt4<+$SGc7y=o%x6MDr+>(;-+tGUiVz*HyN)tMy>+?xR}qvN*0weV#+- z33=yHO-f8T-O?#gwwoi8KR_r&7;fRTaw1hofFtVLhSs0`gBL9qA1u3#Q~G7p`Rcys$hTKSYbr)w z&G`HtZS5xrh=Cju$hY4&8UlE~JgXduY>03i1C-Rh;nzPeuk8w!Rpjy^OBGKinfFs}QX37Ci-ZLj3SmE0h5z zpuNeZdEM|Fv%F6h-hbcSsU3b~3P7fJ=c<9=)+PWJxZ5j?z*1~_!pr{guVrgq6X;*5 zVJxF}!bY6?_P^YqXC0VXkN!nl79yM; zf8P~kc{(@ufdxB=@6wk@A?|+4r~Qo8jFwkcUH{gh3*m)4|Hk-heUF!(e2ny)PwkYf zAg!cS!ttP6kmut>H+uEaLfU%DH@`KwE{B*o)Iq&K*+Eg1EnP!2=ywuq8g}fkFCwGa zbvYD%rO)-~3KCKzxDQ?)CXjAlEUZbMC%+G>KY35D1lc<=V|Wv2BXp1PnQY8lz&usB zTANl}?qU&s%$twKa;t3po4`Q>^1 zOeDdA^vr;7T1Txn*C(=yI0wiT|@2l6gJl;EQQu{-ms> zdM-b*yk~x^op$j#X{-bupnP#YX+h8Ew9$_J5Y*iq(@1j9#J(9m3ZQ z!E3@*X>{vD7Mb(^SPFQe0h*_IBd(zy_3=r{eI0{%na(eiM3z>R1?&efU4?Ar?H>Vt z?F<~qT`O22E$P#olp5naha7<3`fHL7-+$0zdg_Prmy#KSaxzIFQFLy(w|2uj`Yf32 z4ahOO8o!fEdd$dqA@SlLeOnggzt)Ri{lw{hl>W)kv_GO`+sby*)Fwi&{9@+le8+IRi8gMX zBG*C|{kR=vR5JI_c{|Wx9AE)2g!3Cq2rV4t<9BCLXXq&|4;o#y8Jp94RfxTr3?fre zoMbyuvbi!oGt#d>2ssTOooCBMhpR5g%=n-SvvaOSVCQH25$9*QDeWU#(iO`WTinYh z)?{k&d9~KR335OBy`DXCvM=)S&Piz3i7+7=E~BeAL|RGWmXuFy$OAI!`env+3*`* zx6vg*A|9hds#K>C;yu<@K1ZZm9jClW{cqnClt&^jyo~I%d&kQ+!@|v}^XQOjC-5xkM zlQg3elXPe?up_QxE6p8@)@AlV$`=-NyT?kAtIw%r>%xnA!orjlyOE0Qbjq?1o`OF+ zUvZP0$#{3YC%C_7gYR*fj9Hu(VRhc7H72=#iy(;wzU@8-3Ry@BNnWaZ8OhiAiKs%s zLsQ}A`}>p`svDm+Db&W!)Qvke>0TSQgyU*Ft#?F@0ssabJ{&KU<0D3LZY2ic_4#}h zSO|2H2;A8#JG_)NSe~CJVU+)5q@Mgu0y#_};VIeyF%!h{ z#YA^1Kh|?r2ntc6Ek)s)Jya623E6FABph(rO7lv?6$W?7BPBbl==AA4nY8fR8>4Fb zmq`%eMlR)|kr9R1yUJ%jaleC@W(X5iHUF{PxY`jKD$kFX?VyLhw z7a2TZekxH(0XOu>_F0m5!x~T9v-@$xO*Cl;O+pYpU(duuIs~;UZ|qj%#2fRm6ZCf0 zDiF6f3D_9fDrT_Q-lCK~`M{*0%i?dVY>N5v`>t({>mS)QM>WjB{B=ETbnr*(BZYB# zQ7+-k@|Dyhk#s1;tn9An-ibXozgNS-rV$Hrt?rA&x@{3Bt zT$(!$c`MP#O`EG)Gv8k&mzCTMec5){Bb&U;=)&}~y&ZFzco-|m-OYF~9O>gN5Xl@c zvWXI&&-)ms^_Kco8t}%2#f9t>c={RYO^*v*cHWNd9QRPLH} z`*$r>bRa|IKe%1di1Oxhz18Qp)#%B?<8iw#a3JA;I>ff<4LE_g&e`)0KCIg^CLVtk z(npYfJs7!dbAZ1w<(e43v8u{;YVxoH=aU`_J-@bhMNJWMWvW;-9INAuo? z7kL08NBQ7vJMsMDEc7)UGBoto4oJoD{efHN&*f**ImdlFg2w1Q7P)kuUZyIF07*b@ zlEC|7njj6hWN;7fX;u^JyaAskEp+ zub)QTBCzb7fM+aEW_e*PkFo=DJ5eb4VKNlBbt!#r8ONHH(Rtl({M>c%@-Xx*JCqzTPouEWq3!lBMFT;C2XPBt?SaBHxLHKrwL@UinRM+Om#L>(nb{66``V-! zJ0Kr~qH?Z=HL3kM2n%Sff>)F-#tpqA7TKo*ePmi1Eq@*^IQrfI_rQ>3yu(#HdZG64 zwVA(U;8sO5KPYI$&i5vVfmaJpkJn>FIh)br{$c|g6AS4VS7u?YluXcjO^`<doL%z!^zQt+QV1uwB^hA7DQ9P!Apo{f=_}4pahd&m{t6R@r zT{L1>6_bI+;o@>9>Y;on&p?3Dy4Hu%xnu2BQ|5#hGlnGuGwDr;yxY`j=LW#10CmQO z9xp#n!yYvNR1D)-sMG&`1tKXxkg@88upDvCJtlN)fu8amq9g{rG@;V2HyP`01eu8) zQX=JVdZJqK8|h-$3i+>XPNF$&cSC1u58z=&beQ!RO9!I2(dNwf2fLfs>KesPJPmFjf(xE=gS{x%5pJE=$pRbZGbyx8J zJ8@k(Vb%39y=fSLglYJfguzkXe0p0=QiZP2aoe-ZHA|^51jH(-BBv;9F+lwc{oS_| zw`+;sUU%W48^;f6Szl#*JsT-q7N!SjTL{=*t9(g!bAWcF&vzhn+)`*#wpj-$Pq`^o z5%&NR+GI{WlrZI_trHfvEOzKKgLBkkN+R;9QggaIWXxVHeHfLlEt8e`>vY%NTTJR zUY$rS3N;gNCl`u6yr-V`;1{%g--n-gc2|$~G#A|RJK)EbDQMiuUKgF+YG>9|OVCiV zSN?dbgrIoPKX;sO#AP>wjPGE0I~2m-e7eCKJM^ilMY3X%bsqk&=Ajg+fY?OD2Xf7P zja#tN&Y@WaH#}@|eQZ@ptQKKA`pxoyH|NKF;+r4sm|GNrSfm-+SW3oAB)j#}{@c}` zgQ#BC8$;Apop8V(n~N!-YX}W2Z1H-}$CE2X_5DJEyZ7VYyYgMObqPB>2NBNq(UKvJouLUk+k7adRkXw-$9ljuyB%NQ%RjJ_;X~&73hh_EVFY6 zGq7z#&utTN2N#lgMF#N4d@m^m6rB;xP3ff5>|i%&)XOvfPLdzZ6EO4iI=caB5L~VxHVZE-nSNfj5705Ny2#W(1_)GTgTfO2RHA)2uu82`@cTAX)Yuv zycgmy>W`R~Y-)IKG@9vpT50)V92>k1z@pFn?s9jmv9Q(kDMYE#Yeyr&h#yEQUb7JL zm((%W9{2Vh-JFn?tOT#b0&W5ACl&WzV&+C}o{!~_jjyvt{vN@|$zi?)QC~&~1#6rq zArw>GFILG)4mdXUnV8FvZGG}lW=r(UF^Kp&3F4W9=a_j+@^H4UTa2j&n$;FiL@4rH zDe9vX8~*AcYW@$34G3Spm3E}w8cm^zs0D_pkM4Om^x$rO!n!+B$x^BJU@@VcFPAg+ zWc`g&!oHv~Lusrn3}i_ywT^Zz_g1;72&2bDAYH!08_dEu#KAK(Uv3EJV-vuVD$FT0 z^M_DJoLPgom5zA5kduNHaVa>qrv3w?uN`ZY;yR<(ptI z6i%bi(^tS?o?6SJT88g|1|El_MXUC~D`%8T3I1%*svcD}4a3kHwkNe@dHwX<%WpsY zbzVf2Pg{lk7Cq11AoByDRbiQZZ@WnofJSM5g%9;Xr${s|b(Xe9N9w6V5ORiiIwqzA zpLx#j_qANEt9|1Ly@SgoR(KD_!nUaYa$cGhVEbxk#?Ng|uZlj5{XK4J;)eizG>+nV zudR?Ab#J&n`H5g&irs{EpZ0Z!XfSRfio$nzDx zCxy!MDuzd2*%*vwNN3FAuPw3hgEev&RWkYfRKchJ7Y_9_Z|=ulj4xg&cK`fGnN2QC zEP(%La!e36G9r;5jt?PT>BMl`2m~J7A&p9~r~$muX+uP>I{As~?ggyI)b$W&#HWZf zE3u$Zrm$w+mkR<=%Q<09^k#aA0GLE}MB{yJ;r_hB1qJd4#!#2yv5A3-B4|CLt1qAu4?D_M0o@24ZXc5MsQPjW7)*h#d1$=l10q%7rrXb`o-fa_iHO{;eTc@7p5DMq?@ zPr|hD1_pqhnU5Ckz^2)OOqvfm%e)(=m$ofxfIN=fhAP?%jlillEMejM@} zK`>kpY@q(=r)y8b>o2zMX6hYllEb}%BuYMeimcwd(##9A{xeia`)`Z>S1&LAEMl_u zNr3evte2F>>2HgY`U&XKYZurEbopynb@T=;$>-aiAe8F0O1D#rfwrsgv=UMFhE3F28 zWNy9Oz12mWsV_zwNjs<4O9Y06_XO+W>9yJRI^qz&IAGu;B%-7sXBf-f(VG8*aLg}|*LqC?VF|r)l zz{ubFtGLa1%IAgbvK7ooP;8^bzMLk~<=3R$9YVSl9%u#49qt^?TvMZG7 zgFDFL#7hK0+S<@#M2zUI2;8)m)nDNLwHu7QznySg%*tRH$aln%2DDO{F)DIeIpd6 zYop9b{G~O25cY~1$*v|bAYBs58Oo!)iTX`Y!0k9wl^gf=N<+gXbaPPY1ln4k9yXfE zPb`1)%un49{^Gz^vDCP7PLmp$e{bNOn?m6(zKy_Qs&~Lm4zK*nO-bn0-r=v{Wy7uw zg>#Q$wv%@R1tryi<$0E9q$Jg*kLu#A2=|`5^6VokTEAqOa7&KnS;9hmb=xQLt`3tL zDKb<23X2V5jgm7yvsdg_jEPVT;q}uzC55W$$m`e46;27}o+)exPbBU<+jA7^JKhLc zFa=UO1W&yx+Ugz>Gx}UcSzyhq(X1~2(QIId3OqRKABLsDN3&FJ8Nq0keZXpLF&uwV zma}W)*<$@`#Z^;`#*69${veDgS^ac6L`{)wIgIS&35cDmBu-K8iLx7eek9XBjDQPQU8f=yP$MZplf{nz=;l~$=D&LJ+WF2 zp~UB@X(f9@?B>7b;_)4PP$X7$b^eDZpTYbCO;kL5!LLLmsJ=UzQXF9c0d;Fu7E>;RC(+!QJq1rZh&pqY?6AHZS|0g5IQIT}=L*Jhrq5>SY2{fi zh?UmKz~ww#?I>h41U6vTZ2kQO-5ZNhW@AuFuJMD=JIXu*Zg)9rcLIyYX& zfB9R?X*V0K)rHsbk~gtf{5=h*zj6vqfi?JFNlqJ4K_GVm1IgV7L|t%qo#^rWP5vJp z#Eo4*p2p)2e^2_5Kw^bR;-ZMr@ll@J%3^-&|WaS~IyM>!iUS_}b zJ(7B&!L6DzNvz&&Z#}af3~yraB$SXEj49^xB=E%Rr%s2viqQ5oi>VuLj>Z|RrnS@E z+{UOjPnN})t}e>9w$OPqXruCcM`@!;Gj11$gL1D8b7~Nn0BQ#!>X~5OFfGN5=m0?X z*{O=xc1zP$Qvq)j0MXu#BH`tNBdMZ})tf4dCs51!MMtB!0r}J*CN_=u?q$SCNY((= zaCpDtqqDWIf>HX?HeP*xuao$c?V2at1c+|{diQs7laqd${`$`FK%(h&Ipb%{z^L)nEDj)&T&VVNRD8!`48_ob1NX6Fv#Yej9 zu}i4{H2Ud3@A6CPEV3BVG#*Jjr*lVtR?E(yl-`h~#e@KfER`(8Qu-}=b;^=h&X$AS zSEMcn#`O#|yiq3;<=^ZH6d4L%Y$pEU`N#wAiBe6_RY7*<4{epc5M}EpK3$3~LrIsD z691{oPyiCme1A_CJh3Hn*fAigu$;eo4X*(?2Sg@{5v8By(12yQdy?ZU^nJ^Ve8))| zk38{XYF8!Cr-e$dj{vM0+v>1vFVpHcWhJ)1r?|0 zJj*1vqQKba+#f$<31SJ7?@4L0IRwb<9rJ};5hO>h+zVV^ygkKW(CENGiek)Q*o(rr zK+a!>=~}Uts9IwikV0$Vx??FSZq^D*m3s>tp``=uGB|o^Wxc~UwkNI}VY+F5Xkptv zDkVZ&J}Rs&*FxP_i#IOCEbSGzn*gpIoo$wOxj;f@n-^6~HW(JnaUq`F#BYcjy7?y} z-2!tWW}kjlPPJ#Xm}W?!eI^OU5_%dk%~(o&2s!@t1rUq_&?giuQ?LtB`sn7)(ra1m&2!utAx*#4A2?nT zYK4HgVyK|KZqz7bT{r=x!kB2O7HiE648!}0T)fZql@j>!zzXlTD#X2`TB~nAfAw0= zEKlYo^UeYQe@u0d3RQ-itL=S4;o!?v7A4mggH#(`BBkz)k^Aew-}Y1UDHg+TY4^~9 z%LymR8`mUNi2}&)y(^O)t&!$#%55?VN2WsU^SP6dN*#ylU#h^-p%Y4bB#Q z@RJ4drv6;fnPkaFXixIVJQ-mmGB@$c0j9A7j&9)2L|)67;B+u!sP7P-ii^X`Tf>QhX9`_7N_W#MU9o{lSW>d2)TYdld7?Zpv%cPuH@s zB+@t1t459`a!?mGo!htXz5Ty`smtc#D?l7Jpa^39PsfCNtAIyqCgWKwbxiadOD0{< zhqUF{J9H``U0e5jO@dwZQntz;2oE#Gae>Vn+1_lI(W;keo@HBJ6TYz&f( zvk+t!y1Re64RlSwU$Z6Z8H%3YO#9OczRUosG_cTA_AF|qtALXuh zZlYMuKnPfb&#|`HzO~ZblSbu*=<5xq^3wV(|K(7g02LC5At$kQrn4k^#5$DnsjT@{ zG|Q+UX9~f zTo3pVWQ`YG1Osu9(~8{>pfa1}JD(vwh#}6&Nueg!Cow3=05eQK*j}9HL-~A^nPjl= z>6ua@og7PR7#=8M+Q^YAF<$R|NC|d*A=>lxro~=%w#F;5-3l}O&Jn7m1Rkd&5Xlj+PBSc@A>&Duwz~_bn!F zkB+vVo-H1h_hG;N7k%O+e$+uMXmFT`HwwHMj1GhxcM+x`?sZ=WIv0QHWfY99-2rj9 zb&%V@aL^2U%0~;o10dq0> z#cEspSy}BTOPKl#+=y#ejXC@ z6~kZZ(s_lno`JF2$0m-^)NbBKJd3w>J9vj5t@=$TXRN{@y3`DsLjCey1+)=<)@M)1 zFt2Zel`#)V49O+f9_=UIAj}ZmBtX$TQW?Zr^xrjUX@8{fgrLq^M` zn4APgR$U3DR!_*PD!Z3oxQxeobYb=BuU&HFvP1Mksb--X={7HK*;{UHazmC2e8Jw=y^D$wY(g z&C#)Yz`o*Qkb)vTiy`$sH=$2{HBsA4HrT2vA;@Dq;coKNWc4#y z_L9wz->M!DWICB;%E%C0;uV#*qx$T05P9Z^kzMY;y$AxTjJJa6$FQwJTd#?3QlS;? zMKw7wm*z63W@Rv|O+W?^Kun(r8F5!6k*k$DZ-jUM8Pc==sL;9mL zLe?PBmS0c9zsp>P;UXjEBVMN%=Pw4v@F3&c=R0^#+5{30*)sX!?wJ$7{g<=f1fE?a zNs1H#Kuf`X9d4Cz`})+ANJ`vg&{3Xq87 zv!`<63*Ko^nWg*qFCa-!Dw#~&Avd4Xl~?F<%Jhc5wLDG@CY@^L+R4NvcoR2Z#&dsS zQ%8Bzh)lt<#waqVi4)7D1z0akOIN>~e<*Z*M;tU1KKkIs9qSS_?R6Ur!M!S_mNwKq&FT;`5QwG8WajnrW1n7eIl z?;qnw>d~lv;LQy7NeN0E!1T3!@lsraww^(SQ7)%^jwKuw24w%9If>2VGRIMNh0j`p9X( z77}Di3=X>AL#@if*Y#`%nFLv_4J^S2lT;w}!&);jr85de?46W*3VI3)PZhQ!^hF;4 z;Y}g+CaDSM>bLm#Om6QySJBx?5OwcBbej=PvE<9@Tm>M(EQ9F{021Gd(Z+3!?bt217H+b_)0#sL|V*q8Nup+PP( zG6hl(Z!xR7Z2fHa(QTYJPv_ZSu9Xck$L)0?F?Lzn9d=B~4Dz*NOAjB0OwaZbnyM{4 z%59;8d}2zO&h(K95>@qlv z(!-^bgDBBv-d}I9rJrQ2LpQ4;IEcR}i4Vo-6Waf(_`6T+PCfg6SCN)zHItxl;)mL#Xl0h0vF7f>z1y34v8b5(Y2kjbU8T%B#GZJ0Sl#~eQ(+NEV<F1CUly8`)t`X-SYwiF{g8|vxr@KKIQP?j+@4TmI1@bFWqga_%MZ$V&TKF1*u z*CX6Qb`JRw5qA)6PCxbXM}7kiribtkEe7CDS>HTQQ<@rtHLDj7F~{ z+be67PE3K(pP5(2!tZWiRQvpDdpY(k?PFTIOWsDHFlX!T<8p?6B1m<&E~_LgHcN(*xqoJYUXR=UP@f6?0QP{ zXAK<9Lk;N{Y0?&bw0@yNC57b4LBDmrA8_EL+7dmYO0e|IvbGpi@Ik%9NB})jLJ(3t zcnGqApmMrN3M%q?e8y^&=GnnC*4f`aL6sDHtMO@N*La3}_3S0k!UNz9_BjIkTIm0G zsGM{G@rUyTWESZ-w)C7TzQ!OL4mb@2|A+ar9~1f4JhzYsJrQdZMDZfXZXR;TpGbud zKOW}~>T}uis1L+I`eYbs+#`sqd2X}Gqt}I1@Q{THpRDxTu7_i(i{8K^YbV2=ZncSj zT-1E*Kk}QQ44?4SnluGSq`70Vb4#w(r=!E}vlt*b^Bvw~Dygc?R;BnX^;1D*>x#zC z7S0HvEgE7WS}h2XGgx_#o8mstupx;a6rO!-GDG|xU+`eHRr)c&smV02WQRqGVbo-b zdbyfDl;F!#3o&_cKglWlYq?@M%3 zuM1(x^I$4{OipluBY%x|srr+mJxf1XFaQIaeKNQE=V&FwbpxwFwBy2EspKI7Uq)%TAQo!4y50}(ClOi~ets4w{Tg)p z05;zIgk*{)6(ORO63UUGEDly%m?PF>MG0s5_-c}e8lS$i<<}SNoZ;XdT9hYUG8fi3Ja#)*ErOm*2F1KXa@@V`Az%TaQ(2k ze?pm-TM*Z?FkL)dJV4d760Bn*b#vb&>}i;x%`+#iNo12x$N1bl^pn8N^S^pD!}OKe zCw3`8Bua@vRjvKOo=Si-$2jkI4YpV?^VuyJz;{T1!|3&2Yxi-a4JHaLmy|@1tXY%+8Bvr69~dp#T~>!eXwm| zv<%?@Of$xVf~exs8QC7HsD!sJ!l}*0b#CjCbFvLxrqm>J^la!0&HkXTWPa28S_u{2 zBG;N;vK1m{Muw_SWT^}vGqi;*vj%oi@7S5oO*$`%eV@^W=odghEAJ8|FqWRn?*>Q? z#%a{DUAEc0ELVrmfXFpMc!}&DC6mh{ckiw~JG3u4Es^n03DU*q&@YbsC3gk{KVYN% z3r$femnxUmiw$pPH|*LXzHSG?IENv%VkG+PHKs9d2a6ym__dHj`D-zUMADnuF*mwo z?&qyST608TI)fgG!d`RX#>oMYh@kX5Ojjvn_FZuB@e{vA^?4T(6+VPZ9pGpaI8ygv z_cyU3x&U{huqN@r`I%&UvT;{{TgNJky9O9#Ej{10r6wVQlBK z!Kw*27X9tA*&*$2T&Ha*ip1!VtzZ7%oD3&tUQ*}vdb7I(w8Z>VVqdVYxv?v1|MMi$ zv*q*L*Zjdlg;;{JxZI~BtL4F~W!`<7=C=PmB)7 zvT`QkJdfnzZ3r5hcA~%p?MD=~w{C2ro$R^VgRo(7bC2+!$UGe7;IoOgjN%B)XOWr% zX{`_ukxXwgM^2oH%fX50KPJAo5lriYF}^wbQ7fdPj{j&Ou>G;Af@@~|l?^QR9O83u z{Z)da+6zWCHTFwy>T_;*8WiYMh&ge*s1vG!MXAvnepOh4{K05#d-c#EqmuJCreP@4Hb8fcXjnf=bt;{xi){la|m=K|-fmRdJ z;?=G#cx7{!;g+FkIk4G(*Ifv);tst&Ij(VCk1&0XS@WwM*}MoU%Nym~3jx1D2x)7x zUmfxw+i+$iU(GOTj_$~8AY4RyZcKgiMvcy*II+X3Yeg*+fLmSk>@}s%uOW=&NqhO( z;+moL%LQpUG|`I6e~xaHZ8Ef`LM0~rheGX7rAZh)t|bZVK@Esw3E&YQ-TQ>SVF-JR zOk`xw?jS%~*1zB2VTs#R@RJ;Iw}dHqR12%XDRy@c9 z7Xxk$m?z_2{9+0Rw*}B1zD*89#>I=VHL*#x_a`W7_o!Mx-hbeAYKfc=WMu5r-~Yym z$T{qB$@UccengEAtY&G5bp*cEV?Gl56P^CK^laeomwYMi}{{SNwYOeu}) zl{#mAG&1+nuVOLKh5JaBUQ3D(H*B6VbWq*5XGD;z=lNiNm> z+OL{tZKP97C;eAZTrgbN30Rn5e6!XFdQQ$y=)2M8am#x-WoI)VWaaiJn@hlJ>+5v@Q8rP*^Fxhv<$lFew#Qbydocw0zgEWQ z0wMMHqTTVT2n$h?ptm>7JGq0^X z1AT?geL<9*e@p-~%h}F#p!x9fMN!Rd?WU89|0VpM?P3qt7RTX4|3S${!*uCX@VlHl zd3rU?VnTU_({2?yP>ZU5A16s!7#cg4=wmsnkD5B2%k|&Ezn?m%J?`cWpTo|l5pKR5MUK>^OOtBMMi8mI(LH&hcg#K^697JrReuLm) zSAkiN0P6KvpG(VAS@Lh^KnKf(E0^|T9DHT~D6M(7mto8q0Tq><(zRY>7ETT-rkaWH zF6iI%^|FHUt>!g&v~5h6{`+^Q>|$Nl6pMdj{!=n)+#-HvAiNzIG|ZHHl5209h&M`(CLuD3_#1m4L2u4HM~ynTQ*SX3iD6WU&bI=mB}Jf@ zWrCI#lcTcWm1Y4WUI;E9{%uVkAaBTXO%Z+a^++L|Z;$?u?0EBTkkgtOO8MZk_a8U< zZy&C;WL8-Z&-WNvw>Mrh5fpqi{MP&Rk)oXt_Le}$=I(P0pgJ+qBDqJR@XsI6aPm`o zXlm`t%($_Q^o`$Ncgl7W(}(7<%65h~BeSn?ogU!t{JPNwPC~)mEG>vBG3RQKrr$cx zKe@qn##X3gpbaPUA$M1r>l$Lj=MW^YL2qo8XFKZb*}Q8DUhQ*m%nLifPq?W}f+C}| zquRdSWtfItyFmX+h98{ep`y63ma6~nMH$1gdA@+vQ0u}ZIOy)f5(D5r^8?`oZa`00 zC?^0FBaKwShf%2~B{EQ{e31){UC8J-&h~Vuc}C)Ne=ucA-Mdh@w_Ezz;iDsZy*?A= zdWFeKrH{2%Fu?3_@pZ5drD20yUgzJK7kNq2%?hRM!ZV~j^Op5HL7uSDAYS4x9Y4cfjQbS*^)$H$Y}PZ50A>l8MC;U>O<3tJYg3Aq z;wO)9yB^3I<#7vcle6M|>zR^Z!0Jn3ns0l+`|e0PIrngzkh|p~fxsDFEjK;46`xi6 zce3yXpYQprc`{`=z#e+1M=u%A&}6atzmHDo40K!U8Jg&K?thqVUuC;z^6`^X5yovlI|^VRKXHyD+L1XwlGz&%f#pb*5wc+|Btjd;%l;_o=vqLa9{eyYo< zYnh>|ACg2X!x1abxcu^t=k0@`1+zxOYS>mVZ)?K@gnDaOudrP|idNq1#4uJkvXxwh zl)Q~4#r-7f5ECP_YV4stH~vW7c>n0hnpy~Z4^PGCQTxa9rLqvi>LbZ3E*l*MQT6MS zx;J!+0h^BEhXo%~ie%90>xq_oc8OPB zNJTHBWE{`a?YbIw^t)Sy10vM1z~Ec_>Tac3M4Z=zi?|WB=2BmY(Vgz?xRrY$rqEu6 z`7TEw4=imMNIjC(3_&KDkiBWFR_2YaE83;09H(@@1U!OH0X4w-sY|~PL7&T6hviO< zp90PXqMGvkN4JDKQ4v!d{A1&Q?=iPu{N$~Bg)J3xWR6yIHi~Wvq>bq~^hB@;`iaNi zzWjJGpa5#P{@~H;b9!NQSBzqs-)`fkbwKH_>8tt}hRP5FZh6vqR`eeQkt_8pp=cY& zC(*k8CSjjQ`=V1;<5i+)M6KUwzyz9W5;+;!Rmy;9AP2Z8{`Y7@%J%9J9;zZv&Kc?T(y;kcrR}Hi0i(!(86!Jn@k$PvAkL3 z*bj%s6t$ortS3R7ggcJe6iqLV7-=+a+Lhc_@X!#>-2weKjkBK;S=RV|P4h0h0zN@) zB;h&yy?cY{x%{p33`5LH6_&T91rmF_knQ8e!ZUBFw0@J; z4LoW}dTK^B2zj8{!1`^E=%|(A=JqQI6-8H>&n-tuP_{MQhP3wi|DeHf z7TfQ6Asfnr?+_?5{KnTSLGDXZ8IpqWL6M#vxB$0}R`bKiW(wJOzKUk5Pg z-74T82x@;y{i@i)@+2U{{z^fBdddX`fOqCIg2b)R&Ci5|a}!rT$jdsQy=*CbCtm;q zpzUB2>TN{zuoAlvVX{tgkYZwk_SrdW=T>ylN-I)9G_}7?*5CmnfB?y|UHyR_X5Q^^ z!_HeNVr9qL7ue_@&rBKwgRiQ?u2&{;b0{+JuzdH{x+Z!K+&HlSoWSaKrT7eO2nzZg z|DS6uUzsP;5`A{?zWbPmguN?=!25hi& zGG@vAe1N^@agKqT(v(!r5~Efoxcn5+l!zUVJ&2&&Fzs8+O!Ct0@)}#DsgL-gF5j~9 z`GLnl-+-{y+W8ZpwR(H-*ZKKWR*~eGoAoV2T-QsRj+zHcMX19j)CdH#$@G9ZWs(M1 zRt{fIs|PtjC?_^K{3>&Z^`1aaPMc$K4VjTY$G?-Ehx1L(cPWy8$6;reWGSxL(w-?IdF=H8Y3V;66oM zTT(T#%>^C&_S^1@wol)Oi2cbW_-O10VWD`lLe3jS=QV{@*b1KSRD+MJ9?y2?X`s)i z8r?4K4<2k=LCvl+q}$ylAEytrZhxMP5B&e=de3M$+b-@~XY>})NksH6daqG32!iN| z8WFvh(TOmK7SUVul9-TaBM5>pN_0l=y|*#%>B@EA&;6|RyvvuYH6O?v=W*`6|9kKM zPl96;_V{^nzz9PtQLlq^U&xcwC;Wty_TTxzJ&qnq@3&3OzqZ~ljDyz9Tq)@iYbXaYgAE{B4i+0HZ{GE{ahaV*dtF1a&8$Fk24ZlM76&j zQ@$bf3+|&b^$8dG+%KySf_ag7iWqT|6f(jBOK0_vab60}n4=_QTF(N4@-4#=-l3&z zWGZa2lR6+d$;9=W{JMp?A0qy_*l*8Mh;joLV6!U?P_NOy%Vg{r#myt>@+3|PHxJC3 zj_?=0;rKDfw6pnqF`)5aw)^6uXcNC(5&lQ*l2lfJ_ICE;cC>u=!?ub<70 z;61#OVC_MtTxZ)@&S_+7T>kVB=!nOMR5r`_Erh!oGpZHBFy!gAepcz5&JaXiu2yUU8KeEo`42x>{DT$Sjr>*6wnH5O$XD{ocugh4uesW z$VRr~7GnE!d7=ukV47+q>Mhj$iQ3NzYSf)#?v$z&{`Oq1%|ooM#}#=)!-owHRVm96FB z+TmUv34s_&pN}RYjI6!oYeGkzx;*io{FR2~x(*-`Nd(c1wsAG!L3RPzE{|-nRR<7c z_5axdzCJbhcDNd`2sob49>ZB~bHeI~@5yBC85OyNazqJo*U|JbhZeoOHkQFlfu-Ah ze{7IhpQR>qQ>4mfjKXx&gRX8ESrp_e!d*8*mcIyWaG2U4gH5GfhiyzwFZQL5bN?^M zRb+bIB1U82n`fs#D(<6;gf7`F4|e}K$Y{W{<(i@Xb}*z)?xx|e*Hc<2`A04nZ_q90 z>5?%bmhygt$oTQu=z-y#nYuot-j5dlqiDXcNcRl~+Nj5II;1HAT&yB=+dIN9UqB1# zScVxtnDGPLUL1l73>9L74vXH+L4&eyI9OUM%-)_<`=W#6xK;@>R*jC*p*gnnJG_ck zDty0-J{}ghzDg`&mWr(p!Fo~o)CA-w`~_NS0SC% zoX2=tc9zZLFE%2D<)D@LQ_0yw=DFe!Z}D=|-{=Qd->(}Y5o!zp9NXQaS9&L--PYNH zJNFb92?LZoj9LACPE@}&Tq=Hp94$Q=f|%M%ka$lyJ7M&StH_dnWgT@@mmhkuuaG9X zjr~Wbg#cK@Bok+cNZ-m6>EXKhK~Ndbne>j)>)4)&*j0_@66e~N53hO(`{dmBzSQ(N zBq8N`65DkT>7j}z4GHa=7k~_|a ze@w8WyaM5E;@do2e%x&6Cl8*t&93rR7+%G(Sr09AAX9V#GU|2xA0ij1*13_!*C7Bw zWc1&^nT!1Qk%1o0m*t^AZvmHRvs;_gV!*^=C~Dc7=HPuuc+xWi@VmhGcyyi?ufeCk zqDS6m@2`Im2<7jqIL08v+%tu5|I51q1tqRA%m=ybpEW3(=P-h&yO!at{nndk|D^R< z+Rfg|f_#YCHY6y61eIALufBvn#{LHuGq265)c*B8?9RPK=H8zTxzPTYc1c}+RQ%z| z{kCe|Emd=qM;{7FIrYKs@}7ZOTFsh+1<%-C4pUTLWF9TbG)W&sP)5wnUz%BAmcC>=Zoo^Tbl`pv;z=I3>4Ii<5HHFYV$>MeLTLK%N$uaX z$M0alY{57Xpag^uQ@j5^Sh8P9jL9qapO_xPRi){jWf?#-E{HjA#wl1 zy^TiTbEr{j@PEIuTjWu2K7b}FAQyfWhEOftw}Xs_$rvu5RctWvPwXTTy`DYd-keLy zPfPnMhk)xXd)0JQXu^wri64M+>dWmiQNKg=w0Tr zdj);7^|N0I*V{tjKWZuDr{yaI;ErCe6&dDoTP{tE zrO@}a*WG6aF%f{i z==c+L!&eNc_}p?aXn`2;r3YTyrsAlEv;I?%2a}$TJ=5maBwZ@7_AAUb#WR)}%tm`G zU2kz#5jaD<*}E5Y8wziKT#89%G+*=mmmy_v-Ja3S9TOL`fA%duACQQfhSA$YWQ~gl zEqj&kZtO?;l$B?%u5i;9+XJLj>{Ko?WeZ~89ZZoPUZz+|k%ph)O$W=0Ug+F8lC;nU{nhz}^th~xDp*UF{t{T}(ERJ@I?sA+@xlB( z>7q)utB+cCn=`Q&ma~@=Sq+4)&eIz}GzD|0$5Hs-R2$ZNCk7h2_WP2SBosE->&SsT zu!4<7{P4G#YJ%fF0KEkXz9;bf4_-Zz&XN*~&CnaSHS{+G`Y(?u*OORjuR1to#Zd=h zUi)F`4brty0G9A@&lK=}{V)E>d;1yMnFZmKqW9GaS2iAHD!w^qq?RG4E={){8N9+4 zxP|*Xn9i`32KG1`5W#jC&|Z0pb4Jla^_V8ongJ3Hdt(3u-u<7mNC^&tH&<`~+@+#H zypoE42&y0@b604tAN?D-n`GC;nRkm80;Pmz_A!EKthP3#gZf~7qiF8)*5Q)?`Jv>t z*Z>Mcb>bDPBHx?QC4j+_8@*JLiwDKwNN9z>!ts=((EM|0G4JMw1gfG+Zdi zu`-zLPx+~cDksH0xrlF`sm7~S-TudKSCu^E(>sjW6!uE!dM7WuaA?+6RSATC!0bY0 zxM~v#Mgva);1GBV`KiXq$ulSK6*=@Q$epj{JFUT|bV$=pU-h(fV8PpyRz7cfGn!f_ z2OG{!b9gg$3X~gF_>wLGs^*eg${cjYWT@}N$MNX)fH1_#zGZ&%AST-7&h>zhAj7;f z>v2eyWpi?97LMCG8^O1&bk^}7z2W>*9aBH1LXb3p-Ip-M+qa7R`d-7|XBqH2`MhM; zxdxV_3`ITQMP7v00uH0x&D`4TF}i<3z`%IIWB+Hr;TE?jBHhd4cPvpn;t=X*yQq8# z3*?_GxmO>hUv#U0{KR|?-GHs{I@g_Do%Wp)$fsi#iZ#_Oiqu3T=X{oDk)5%7hqa~# zy_CLGH=F1C;fFZP%P&Ecd-+tKMC2a&L3=&K1xXqC51EsoV{X3wkMN*ZuY-A>!{*@(C}9U>-2`u6hdY$XroA^NaiodsY#^HWE!9TYMd1KtZmDi zHix(}I=D(J1v9v#+eBj;FxMLp4A97)mmfG+&c?;PjzagS6QOyU2QSF>;?d(P{^on* z2M}Q7_=4>u>Xh1{C@(yt2q)hNqYAOtmvAI3ePB5)RG-k$0Z^tk?2879gFnSZ0qY*Y zLp5GW{>NJXTvMQ(U~u+sh8pvGMTzR+>yw4S_CKcbr0>?`b@PQ&aA&1O4aqkMJZ+u^ zSA?Yu``?^|`4pW=^n!y)BGNV@r~Nm_Co7Po<9jGkGx$|>sJ@^crLKEt9^}oFb$Fq( zyZ43k!tOf&-ZX<|b4(yJ*w9tj4Ex+xDrgD}l2qy{_^GvMbg%CuIZA;^TM`3_3PR#A z>`7_y-r5&^h8jv4ZWwQv5p|NDC3?1A%L%&iZOi-r%N^oKZ2_a3Ltb_fpD=r5~JP&D6qHT*Ct= zYD6Tw1}?~>(;5bM=4S`5dK7Ao1?sy36_=6)GI@*J^~7AeGcizN-(&tO>Wu`dFg-03LPvn?M1=dM+HL z8gg9SpNXXN2x_LTM;pX%N((-?`}&6{*=E-eIpY~h4aZ_I^lungrwMaS_lo24ZYC+J zN1gxf_O?&!=-f6m-=`AvZM1>8j^AGCsc zk|49Dy1~P&(k1)cOsXioP&vO~?VOi_v_HR6n998h)N;%*Z@=&_??c#m3iK;GC%m1U z{zz*73hr4h@$Aa2wjjB9zSXn!YWXauBfTR>IlXn@xWu zf9CVMZ;uK9Q5E2P@;Rj_dYF=i9NWQW-yemQU2~&4R#B=BcRz~b`L@zMru#f=nzUY3 zz<}!cW9N*Nn1t_eW49n6E30HM64$(0=shy8YjHXXxo@rDx90ulHKe6SmNxeQTm_x0 z0v-V`8RH{|+FwYVoFsHWDmvYZ9P8#vJKzn`ygcmq_YKbuX+Sg{(TfKABH2czslo8X z_ahb)HxB5~=8hydmFYSU(dhSdF}2gG8WR?v9|6SBr+;H;2&?B4*7nM-t5|{uEOjjp zHGj0SG90+w^T5wAVex895PFfFrkc-6a34(Mrz^;WOQC3|Qp)sLd2)MpNchgP>Tn9Z zOgGA6uFdzGMG7E8ielzKM)6@`$-$?*Ir-G7tOmp7!xe`XV`3TP(XU@E)Q?V+g7XU5 zes3?b>9yTmIM29yxSb@M45hXW_x39FgaLcK2(b@CNrm=U)Msy3U)o`;sDwHSI6Pgt zuZs(1>qsdcNcU`RA~T~lLm+23$O2wDn5s35>i*W4wlYXbI}f$W$DN}&7BGlMoF4$Y z6>yJ^w7Il!1li*2^{c}(D$wIx!kj9(|G2P z0IYg4GN};JlqcVxe|phc1FMNXTPMd1Np)-%?eu}M>MZ4XfH@iC!HI#k_&B32HP})J z%PFcxy=n1>r!LZc3IfNO#4*WSUcz+qc~nWEB7-6~rmQBbaGaF(+%R-I3m$7C=9>J# zYw??_{t_~|Z8^^CyD8@a-pS!m_nQi03AEF?WiAQpM2HW}Q7P5(LgXuI=mwi7+;+SF ziKK(k-XuNvU%r;&u_}zZL`jDlLSPVGdoHJXr4(oYc*pVo4EY zMXZPPrB1SXQLcQ4YGY9-c)U=(AXiCSh?xg0cFoE|C^eayuREUF?Jgf>UUBA*mz1V^ zD@3((Wk=FvmEXC@lsRZcq)NZQMODYR@2&TH<*QQrJxeifV`g8sR$*a}prI!BcOK>7 zza!P|uyco@EIXw!HjKFg12h|lp$zwGN5mcB%!*M)CASab9!?OGix5^!(d|h$GTLME zNB@gXGQ8lT!sXD-n=PxsWP=sJwEN$W0mAdr0NM@MnG+>bGKmdX>r(eeLvf1eV|r8J z6~|Ooz%ky(&2zUEGe}?VJ(~Xc8X&{r4@3mu4?5;u?C(d`|KN1|K=K5$8VC0D(+J$K z+2s~nM4ppw?LRABeu24SR~k?=vgV)+c|^ds9zDnGjQlnUpPQ0bCPJ6X>_)u`R`^c0 zImh5p`x&t1B0r3C(r)yAoa&x+pWv-FPt?C3-^?)a&HXFqz#t5mK3bBI{lgf_%q0tTwlz z__zgic1muJu!;z87jCt;bwVdAZv3$~^B{PFf`wknRJwVdU+Y${p420}U%<5E-Xhl2x~8pwTxZ}I`Gz6FpY^h}NaL*h zxNbQuFZout*!?U6aC+$@=HvnBx@i)YE}vE}I|eQ;N_n}(!edVQMdR2R!&Av!1&ooE z-Twfg*0XPZPqn($LZ;2}+ySo96n}_J3^4(^LO3L=jVEo%&6ZrjUJfdJM6y>?Yzy1B z#8O>@OBK+e@BFOv<=M+`%0W}c#S+t^U0#uEnoJnIt^x>9jP`y$%Mgys>4RL)6h(#! z?sUaq90SfNQ=B?^UfO83c_nQ)gN}B z+nngy!~~=T{orH3`C_|S27zeNRIky*|Hgal-Y?G)p3%{9h@IlRcTer+$p$S2*0!59 z3sK>>=n_ZEv5^sLIe?dhB;&y8HpzLY>F8{g?F#+nx0TW&qL%-aO^z3wgVE8(i>-z^ zVNF)XR^paX6K2X$?(|+Vof1%B-wtFPWPAI+m&zvpZJJ)$Mx?g}Lkj6B%ZB{g`|< zR#fK-{*oyv3Z``Kq6}8 zL#m^C)7KP-<`qi0jFFkbU=gXHLx2ALD%WGG;<#Z=zOhYVskP7uMq+%Rlp$FoeeWQ_ zHnX0u@b%U2n-LC-JvL3mO_-PvU0FcFLfV7|kuUXUl53OOYC{&)G5$ASVkf9-kDSeR zRhPz}u_koTByi;{w^B*|;=1Y9idm;Xi!u#SqeacaVUn=)w?k6u#~!-`KS1OJZd8Kn~K5gQz)>^(oMyj!l!Gi{?ij;_5^P? zM#M3oa{)dOc8;O)7F{1lb4!Qv8-Vx@D&Pck8h`3mP?}>loWov%^P!GH3Fan=&`NQQRCX}M2dd}cA<>Uds zVKo3OD%akD=|kAdNHBgFe)ds`}~V5TbzTI`U{3NvX#5+>0-H*9c_mXPnjvd zDG(Lv!OHMNKeN4gq_p%49Ti*%e?)+ixXN}lo!@&gHk{9~>`km`8a}`+N-*0}8lYu# zix=A)h+vR@{V;`<<}$kb%HkYJwCOkdACM6bD)Vd5H1ft7Lf5llFPXEeoFI%LK!h*a zi*edx+eUg{=*D!48{H?Y+aH!2SpI_p$|-Wc-;62*OyH8Ap@%fA38;G3@xnx4A3XktUY3z*gd;!85I z%9_3n#!V)%;8M?K+%AemYmbmFaqS^?gR09w(g!tfyeVR+em7%8yXYlM33VvY; zgI1aDebDce9nmdm2mBn#qAJxgI=^BI<>{>u!?zb{dvg0cA#Me<&IbH;w~Ci4KT=+v6Q1BcfP5n-1Yu(-|s&G&fu+iXlSdsRmQ z9eaIWSF$bSO65Fs69C;Y$S<3*>eyxM)Yk6T`m0nSWf%1ewwSMiRK6C7wVr(o<>o5b8Soc zDgs6)L(ouh`&gM#)!uhZjGAg|QH%7bPk_y@*4=NzWx^l7x}Jsu-N%xJ{#2J}K<(NT z7A1~}-!6a+YYgjY(p~?S_Ot8FQG<|hwu~A{S(@YBJA*BK!oFLYPo9`AH4J*G&6yeg z=9Tn<&@vGDGJLn9+lFpwLm6AqOm95BA2-)1 zZ#7kJb8ikCG9_?t9!hKuua)-c8`V6!6nDC+Z$MQj*EpM}S3`XO%+mk)knZuZC6`Sb zBjTMN-s?fz_o2o#!g(@6Hyuv6aJGJ~$OK~Um~F=Hw=^i(1Kl(9)0_i|13oe_4-1}L z4&Q|QP6*~kPsLvQ2H&}hm%#;f%7vvIQ${H5^4;!$hV`}q)S4&P{fqe1syZ~DO(I6e zC1w~!U8F6Y;N{5GjwIY;jzQp`>-1M{zJ*>GPlIU{#V`lQGYezluvQ3r95n8g;=T`q zsW-@shO?WmMihpK5gI(Phn9{f^N1Q}RNbBuK8L_Ns;=l-0nQH;R&->As9UrUBj(E* zke{A*98Hww+5WFT*+OZxLa}yN1f9RAIyx=x*kJ+sszFw50v0}}F8`ijhmXbQH3Y5~ zhBJr)Z$QdM%9Q2eWXLk-B|+fwgtRBi+YZ;|lTM14&k6@X4C=sTY8cMN8j@j+S6u(C z(}6NYJ|mC0nLAi{iqY7mQLl>8n4L~lp5RfUj12HjnJMTJPmz424$^eBK3z9Dj0RJq=Pb4gR^YM&vYR%D z?_%AQSmAGx=zR$y8LFBc5wf;4e9a4mn|iC!Wo2vx{f$WB?)91f#@u`w>*%`rjrX>6 z1!fPR&cJSZ5M$F2tLCm#ia?1tmNdM^d_ym#^{C*@vT$|Tec;+OZ?Js&+Z1P2beJA6 z3c+Z^Du|PKu%gGBc7I>Cpj^or#}K!ORE#i!DprJ0x2K3UX8^pbdGcDEZ4o*Vy&1zK z@hWprNUkzm{jKrSsKZ*9w`}v0L1e`b1+tkPAHSpeN$|cVx8(nqwBylvJ|W%vc7g5p zbQ4Ycv~)uBe^EP~L$TH8dEaAFi4B)OV+1u;YM99r>kQJ@;hu@ z6p=cU3ZeT8h?GHZ%GZbeIXtl#qhW(B(KUpX&G#`P(S)DBQ1*%~JdvQlK~*_<&4Pi~D(h;Biw@UgjO3mvQuH|5FH}a~K;uD;>P* z_(2|Jfb5el*Zejpt*!ThvDC*~AW9sWNrLnb;BLMdF!1#`3xoYx5p435=gnHNio!pv z=GpWO+S+-!;DnTVAi>yru^Lg7OX{*?M$WOD0`2`Qqa3xR%ss-Mb=Gxf&SR12!lhY~ZqC<73~;s*+MWQsh#s%g2kkVQW((pwTa}ctbM)I$ zM#%k|exoxg0hCB^Srl`~T=QutUX~9?i5;WG=ZK2ru?s((rBx(A16wz37Yl$F;JSw<+O6DEu);+4w>u+=i2 zCQXQ+s?Q!wh_Qu410%PYE!1R}C)PSDCxA|h_8qCplx4K6zC=&OcOrIawKYdm3-@LJw zl^RpIO^-E&Opsoft@jZ_wsZvj%CVj*4zsnog5>?Fl*A#MCi?eOJFJ!!SP$7%5LMxy z!BPHt@_jB^)#Xsm!O}wMf-wz!J3~;P;(C%JBel=##Q-)>(Z}}r%rR`IoZ4EGS=-$X z6tOYwm~kW`gwki(cR03HJli{eU3P`;7uReP!o%xMc0GMPx+@o2CigF=^>59~44Iq% zmwVGs7w{kM4WrO4_l9}~Xu-Mq&{V}&Qgt~vNE4B*M|`(u`l{etjQ1@5^_z&UWFY^~ z-rzXLX)ux_K4ZrS`it-Rv9b5t5`;8O#PD=uzg}N1x8j?TUsf!|`RFE4vXC;HtnekI zXp1^xbK_gnk-obQ8PxmuXa3H7pvc^XbZ_7$$1T6;&Hv#SrQW!cH&RSD@a-T!{JPCJ zdoVHScT`M2d3#-z2(wB>TMWs;UjBeA1kgw9(|LudglTKAHTR}Z2~YdE4rA+{M^(Md z&A=(_HkNzW5gV>`i9@2mBoxDk_k{bp1iG)Sb7(Lbb+&UMFWFEojA%loUv5<2p{(#uWe+%Nxd6CE58K5%GcGSIuLI97EYI(tP^m84WN@y5 zvFi=>g&}pcZq|>4pFLHP0)YqO9ZoeZG{L*_7lS~bj=c5e()vjPTi2mj+V}i*F$VJS zDJPECf-h}#mm&`m8^4qg%|C8uD1^U`=uQHjfY}WWf|Vn_8%G)ia(}1DD}hHCs2_{* z`^up=a&G3>15Nl~Ed_tDVp|zzDNc5<&RzqF($0uL#bpcPeB-Y9Zh*flOpC)Q1kUPx zn&+#Yp^j3`peY>EE!T<~lgX>ze)f9o6tj2o*{Msv4J$w&>)T2L zH+?KuZ)yiMIXijr1HLnZNpdr_k38USGU6+FB9x)=vGGsu&u~7}Wv8~sX6NCd^-}u9 z*`0#O4fkKsa&YVHWaZp(=aUl2qVwu7>F;5#lY!0j$*m}3HVx;s+_V%+WzO=B#^xlJzF(4*s3;!$kh`VSESq;kg@zpwW8`k-%GZ9GQEv*hSgoKMf)u*32kpxV1Su%f>$LRxJ4uM+VlW zwsRA`j(wlZ5~+O9Oq?eF;r?@!8AXen2A9W*7N_Kk@(9i+6_f>{W0M(JWlF@WvRQiS#zB_7+I))w_~zmaTI=jwQ!)0PQAY2?a%o} z7kokl*ORcG2RzxCvO)6*sCZEpQvf)Ys%vNghu!WP#s-C-xP;Q-GO&O8y&hpQk|3mg zoF2dbPuTXklq~Hb<$OO6OkdBkHJ)k^%P`^OonBS*!&5Qz!}?4q&E}^1+^6&#?Ncz0 z=M?SKox4V`bnIkyJOprZE>2dfsXpeqL{2TJVCR`nrG44NA{S^P?%n112VY~6UI5Nx zCoAP)SUxriLy%0!r6!#ZIKM=9X#?eu7uX>soD&--c&e-2>AXrL!_B*6YWf_CTC|u1 z{T$Hnlj3P7<{aci=9rp_@Tic-7WT%y1(0-ImdQZ0gn!?2ox>)3s)4P8^0a3-u2_Rt zzsff+t}?9WIZddTa{ZP5`id`qGVNaZk?hy|8vqM=8X{-?gAnsLjE;YqW_m#QNm>oO zVa?OmX!$C8R!hpaLvG#2J2xeOalq>t_MLM@bE#>_+9NNYfF2~+=T@;!{qN&IA924w z4rAjHp*YrC@`5bRbgn8%RvG2ejpdS`2$AP1^ycF7KVyn_B$e*Dw%VV3gILD0V)2G; zA?b%Vu1gV~oX_exzj{98G{2LbBA8zu5>?I?rKjk4%&m#7t3;iMO-ZO~V4H$eN~Ys= zP}Os5SE2YR=%#?5%RKMdZX=c8=`hH`4Tfm9$a!6sx6FXb@T7d6kVg?Rj{2>8bzd^;ZT0Lig1O4Zcm;iSoo zha9y`#(Z~G4%4wy9)EED;IS=aeHLZ^z*n}0mSE>8H2l!rc+zmR#Yvv~-)ab&M*JbX3Un0 zvl}Ais-2;i@!`&M9H560Jk@kwwUMO0`M^uR$EDZauDBCYg@3Is7mwb4xjO&}i#|QA zd4=ZtW}Mo#7&!4YcTdy8U}}TPIL+iM8i%6)l^?6p^RTjSQNQ;|`!`0Y?0?|5G+|;!Rs+XA#yDvN1*Ri6g+zcY#r;jBHZ7vyJVO zeL_9zlshFh$f3UbAB@;Zv5i|yeg&!)%g2m?u}itvx7k|v%Fb1hycLX)b^@g=gBzVWla z)W{gbsq6+}!w)Oa-c^<1F~*jkv9fUH!$rWzX3TM3&*I9m2fg9-Y<7L-QcAdLf6L^nLL>ALyM^#Pl?Kz zI+K10CqB|LWo#|3yKVC3QzfJVq^}6MA2IpO*Y%9!1WNLQ8zkl?xPG(Q)?T|DU8m10 z`I)ZkiTp4k7KCx#+tp`0x)4ne`dDSanE z55aP(u356&4Mn>zh*ipT`BMg`!oW{cbmDNLa4yM+B>X>qMF9gD2(s#vGJK8v__ULe~A7l!=>jh>>bJ1VnhVE^x`&*WzmZ&jBS-r#ASq{(6 zc$eAyPS3W{L8(2%od}`lw8Sa70sGL?eQ#lokyCC3V9XGZe^AFqZ)r}$C?l%*)$uJr$Nv6O-L2KcfU8w z2|!%}yQP&+Os7MR3AvEK6lXk}0GWc3c*@c7vxemmAbAVjvHMrj8s0>% zpYny-S_C&5mzxcX^w}-)Xs(HkP~bs=)Sn^HNnX;*aQ`#PxUPAsHq-NxL}c`G&cXBb z_ZXg=IARF9ka>B(UoWAx@H!E+A`e=YfU7VQh~*-{$=}~W=o(Y}4R&Z_^_ zP7)9HqsovWOeRORON<6|bGm;(fa{9OCG^K6&^rghswbX zT+CXpv@bTLtV0$ti1D(8_Jr-{tV>ddC{pdQpB*!cm;_QK=-=VOx9vEvrY6GnFp!cZ zreynCo&_*-LYKt}ziBbnnqLh@1Mxb#!MlGem=hen9KLONJ#9H6t7prx4JQR~3)0&& z4b(U9kp66eH$?C|!8`BZOu;DeR(hbekD#s6FBn~0LB*9)Ao37m{#jXqQZLlTIwkha zHbKZ_6D2b(xZ`S zN%21|&JH3a)qGtgs#j`Zx=`t;% zT^gU(KB!N{@QQ+??yJpyfA8L68E{wKmp)Bn_f9)u_3dN*D)|+m7frdcdhTD{d4N^h zNcKCNtaTU^aZ~W703kq3OJS}&$bm~6zZYI0r^R&W?>P~K6ZiwYW*HSztJ!_V-6R~-K& z=tx==PQFv0fGEMA48%o6Jx7Xy0hX?va**0F{<{Oj{fj4gpg=nQ0JZOjvU*tHv`sAO zZ$0+1J4gI9fm3J7it>&P7)7b4I7`-`LvZ5eJn4-;z%|0G2?#AdYaAV~x*Yh(>WN+N z()7Bk`puj2hR<2!S z6KhZcHP*-7OYO`0>#CP*FJ@XK(ZIAf|4q0&OjO3fil!0SNqnC_7gdvwp>RrvVzLe$}J;jY5r@pmgYNsI5ReSMuQEhqg>5Q$NpO2@+mqE1I_( z{!+wgpl_4~A=QC@2I~1-9~V`RMkjI1{b*WK&0p2Yp#11Qa?d2F97+q7h^CzoU+JWv zT2ZtP*)g}aAyO@Q5*G}(56Mfss1HV$OT01i+#BY1%e!E03g*yZ6ioYIc&755>Qg|; zoCGg)I&2yKAZqD9d>sFO`8aqlUM++o`rqpiXT|d`L~J;G@oslp20I*+{cck1KuEB3 z-F93VN^+HB4_S``h;Z^9E!Ptk=X5jge9h3CM`D~{zm=d!AMrr7-Os~xAePHG5iP=i zv6Ig}*y*0anctz9R-eme4AS)iYM^*^E%(mU9x(%)DNyenkH`d z98@5lN=cXtvK*ia;uwn!cN4|;n1G29kq0;x?Z&DEP!bjUF~8E?+or8cAHd!$Bo(oh zL?&_!nP(Xt)-{uDrz;%KKN!r=us+Rf##;+=lhFHtri~!n=|Ugx)?eq=9UC6MKtI9X zo`&MkPZYv7aV77Vzdx4P2~ZIrP>={*mBs9n;0pINb-XRRGX9%qQ$@tO8iXS5%}^CQ zCXmvi&{ev7Zno~hF%yx~!oZo#qqj+*VJWfr6pu~9lROQ1__58~NQpZ3(wcVy2kgh| zp^~JlwE6OcRhG#$o=uD=DoQM|5p0d~KvuJx0P1Z+%aWfhEXYlJZ@p_h&y(A_S+(9J${(ptclLibaCrTi+6}i~$*!>8xF&LIl>^z=1aoAW-n;>3+eON@ zx~&&x@E2obsiv4UgCw)^n;*QD`cBogF6UXX5a-o!+8{=I+oW}Y29qhh>v;Qxbrf6g z^sPJk%FU180i+@s=Wqs^-TK8_`a3FT9B3|)Pu-n*r?>B&H&U&%Yrm6nR4<-b!j!eP z^MeceFOP`spAm+EoA`X7iQ%RsLf2-Zf~SHs$HN%xQQt4Ql1d$lH z_h&R-?Y=`-2%b<#X3I3WC(w80`s#Q7&(CXuchhzk36^k56kya5G$Q$L(TF(_G)QUL zWIzY;4y8UOX$+NhMJUT{>rCE^q&`l@|+l7#34l)6=nZ-F!rwq3UvEM zaj3AfLxjr~W9|cP@^fKz{XtS>kpyr79+e4-;Obxd;qH^o2}zW8VYE*a{XR5upkRb= z=v%dLPLV9MzBqznm%1N9oKQq)r!E(=5 z9+2#Ls1q0KJD3`mXv%uWQvF_Fl(6Pi?EsDJEkCiOT-zMk2aLk$=Fqzko|AKPuQou` zR-0P*GI|C!mbjAPHMgRfr}|N{002M;T{~$6nn%fMMH)SArbx;4!dVgE5A5VhT2pJI zQ<&jyYrxvo>ISgSzc*mX6^8JXNW#heIftMQ`J~{fAwS)&T^f{T3&z$%#r0uM-`(tU z(`S9I26w0-X)BJy@!9qOI4dm;CVQ^mOR-OOLZ&W9e{33`{nH=>GA2EsA|3*%;vLfo zTm6s~7Gwi2XZ2u04~k&y*c1{A`;&eNM;f&~F1r;}+ymSf3slkBtXdKi60m0F@E%Tq z<&L)}CSGZ0sbRWYWEQ3vy-#O8SZ+>0(TG`TG#|mQX?4G;cc`^&CHzLk%;ZnWs1g)y ztu<&(x+x9l!`*dO)9$^8as?dOfdAvz#$S*gc|;?|!w;0bE+N7oa=W_@I27~RBIR%A zD=29kdwY$3Qc(Ca`l=R6i$fK7Z z!V8}4ZWN6N3{9iG_GsAjUQCqMd9@FfaUWndE{Je4EV$iv;34a9zn$>I1r-XfANJ79 zfD97z+QB-2OI%lQDyw%2^(IrfQkOn^%yul9@+^ADOf8URBp~yIG{BOFTc%nuC}`8l zt1$g=l1pp4!5FIv>0~TfCFC3UE46v&6sl8 zWMP$@(z|Eo&v@aIU-pyQsJ7)dp;alx0ZRG!-OQ3O9oV%Wn%(a{W~_vWxbG!94T{+|I_ z112Fg9n9M9 z!D~)e?dkAFb@|SlX?Pt^;Du8_`?!UCWgXu3ojg9;w~IJ!FAHG)yr{*OUR|!8U<(*Z zkJm|ID9Gd6jz&xXbuoVmX7d|xZoW8MbM~zm!E)&WFnMJ2y+Z9c5~Be&Pt!SgJ@DH- zR?e2MJ{sw(l)$9x^EsAR^K+~Y;?F&nJ=YTLKL;INw}i?V8l0PkU;2B7rJD!eo{x6} z#P%lqRg+X4x{wq5ZLo)uWEDezjc{#&$UB&T9}!)iOmBfXT|^8vg&ekpMB#fQY^4?4 z`Xv8EB;yOOIaSMFg?=LI_moq96XO3T?GeGtA&xhFiaRjFz#6NDsf%s)~ z&0kQdE_rNiN@^JxL~_84l~HUdpex~FK^{n9Mq$NBml8*jXGUQT0^~z}PXHFI85~@9 zFEfeNQp}o3w<4+3qZ81K2ywN&?zN1#cqSvI#Dx?nuB-ft*$g^_5Xkwr#s~ zcO%{1ND4!zlpu&SNGU^i4KY$8Iew1uS6~_N)VKG!};5Df63_VeMT`Wx9GEbe;b=wXgkTTY95okjRUQN z#fm-5y1nxn(5J9oWmE?IqVFP2@7b~*O;!|rQK#_eP$B0}+!NvYq)>_o9cDjkE>eB| z(YK2bK5un7Xoi6JQqWTxHIgJIXQ}nvKgz!X4Fr%wttbN4{2q%GT_5wu#KNk2^F8k- zU(5Zw77Q<$>(6km^xXcBW>m5(?1;UO;@tf@+Z ztM45j`Rh0)@&gZP1|?ZuY9+fe1BBwX?gI#wv*s+Pf5n{fDl5~9z8HyMLtw~;O5jPG ztd%>?La>MRK^w=&c}qwp=MQ_^tq*dx1&z&}R)gZ}8({(6SR=3LxIR(`77Z~3^6=mt z150vlL|io8ZV1hLduq6Ew8RTvw0kM~_3j*i8yHZR@{J}SmiQ<3`-lUuchvqtb%5kP z%a1&te)yNRQ0d9ePF0E*`=|?z-XiTIHk3Ic3Ne=Jf}>vxom;@K24elZ%~8JQPptaa z+~zBa6jz^jr@Mz)--0ST(kWkx+uj<8vjS5yG-YLx%hXHKK!cWUP={b~DO4~$-9&N7 z^&wzX?H8Wn@|l{Y_s$Jqp1WLdGt4RKo!;@m#B(ya6oi3`f8RnhX-BEZJ0L$!TTN(N z$1FUO`RpZ9J2v;oYN27;jCV=e*WqJz2)ym$P`%9?)O}z2fBdf%47~N^X|a*A>S0fc zE^fzWgDiA?25?*l(Q$O>R1JW+Bjmyr+Jfqr+No9L@$RE=YVkgPri?Wc zcCj+Q1zV>0K(*vy7i{g+-}}N=``+-qF|uTm703NrtWXzSLfOuB&<4#@n|ith4hy2t zpH2$f@Wp&|L+Z8&_3JrA0ryeK4seaHGK*b+m4lU+U9iKmRkGgV?`d?kHtW`#uH*~D zDu{Y?>3cYWfahKo*AePzfL=zM_H1A;4m#Fpj=Unf$~l@hLN1(jY~$uJPTHXW#vwB> z@w~qQ8oEDD`R%?srmfA@$Y)qh^fL^mmBCC?LVU)!_u4b{@DD*dM+ zSH)K`QlbnMyJd&qU3O|)?5AZL9;ihM&=P#_kBuCoB?5h>%-!%)!%j3T9-`{V5RC<# z6bD{yQXOdGpV9&4*qRFBCP_7SO?-QjMj#oYW=bKNL23#5WY~2{qg3RVT4eee;UWf! z=rE>pCazC!cm$;g~yl7{E#LQvV^A}gF!4PVsnJblR+6aG0k%Ka7DOLP}mGClM%9HQ8a_y;%(r+94BvoZjp)yYgk7pBT(2wNw(sW2(V_q+MQ|=RUbwERF1!yI1FZ z_n%Q&UqrMar4pmO)qyaK-b&1wgw3fA+pbu3h`Jv_s4Ueti%Ri{T}$9u`Qz67iikGf zUS6yOyQEUSa{0mtSn}Xag^!9+F(rlOgH^+WI4*Tx)y_@%khBs5Pn|Uf1+K&pUTU4P z9Gl(8VSljK3xD{oY32k_QNJ$gURNAq7k#qOR3FXo@Dt%4ldF^K1HVF|gGovm#}smV zji}M@`j?hdKATZ8F%=UwnQ|403io+W7lfJ}9oFSbXa>o;%i`T3;xnG0jB~8e2F2$Q zaQ9Z9K-=XU&yZ&iUPXJ;@1@QR+ur`K-H*pTvakQ2>N*hfum_ab}n9uDeSDIPCqS9z)4Ldi=Q$8*s{$5T@_RWZ@_y&kv#B z#RYDi&nXc%ZYg^$J8j6%IBYbbQ#ynV(j+t8K^EVT!aJYzP~w-J#k=v`8}xKh$?A+L*}I!*fRck zM#`xEChnEr=@`>t5!f^aPc})fBtre_C_sDbtX+uQvy@Vkkq29p|9j1&q*7C7lkGVB z4-(+$7dlfbaRUk+wR0|04N1)4>2!ncqgs(u2ERXv^QkqallZFiq`Eu_J|y`+c65XM zH;FXji(j?&4Fs!%LH^w_whn6hV4QMaRp(<+IRgib;Q zPU`V@u5nkq7>z0wXy34&w)n*SLV@bwx9P&?=Cp)ruQ2uVK|U_zr5k@4g*y^^y$pVH zgfd_JzDmj>TR6VGhgQyov;MMKFeg@$`U`@UP^8`~Eqi4XTP$X68Z=KLi&VC1x>Krv zwbt^Zit|mBKMp!ytZ_nW=iSXDfsE@cj87*#^b;4;D&Ns zP6-7WDYn~fEUG;DPOH2zFEff-;yYjvPxfV`)H!MrZ9L%W3WSq8k)*@ppi4@Ls8{Zx z4-p=jG7gizXe%_q)!xa}*ovg*aKcy#ry5MuA<5Z~sCMg=v(y%0D)aw^VeB0_$HBC| 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

4uf=uT!h1J`nu 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

&$V#T9268-e71u=4#L=sv@u`e&cZ~ocQ zbFpMhg2D4hVWM<^$~WE7YxyAGvuY6>U@U2;4`!!^5D^@9=vqo<{O@{lBLUV ze}>jiJEb@X%zK-<;~OXY)duj4;tqSaaW+ln9G2R^mEzhF$!?#i&E(nur&k4`T9)x* zF&ze{A!0o~Uv})}fr%%PYYh$&r*)01E!q34)em~8gGFBu2pr2rw^}&d#dv&Ael(4d zGtfV#@!T2wL0zr0t`6j+;!c16_GSGm6+UEhRvUoeiuxx;wtcx9@UVu9NB?>E<`|8j z=dx%h-V5pUG7=N?fEZsObg(GbiL`{+Ue|$3HQg7)5GfD=Voe=PkpAFaXK);a-{CD3 zAqF6$PRcBw1=FP2lPIF0ju$t^Txs$`mhx7ra^H?JZ5(Fo{)KEf#PoGJL+;x*vm7Y3 zc@t+Wg8jZ?;-6JE`VGaqFuJ(iyqNPw2^`E-4^w0JI9mAn>!pck? zjVI82uA07)>Cy{vCxQ4mDftANZ?|OHdhO^1FKv)=?GPf2m#=<)pOu%7pTpBOizWG; zFS6zuNl#Q$1+sP<+BXV0XmbcDa+iI?Ks;3L-66`i4)P-1NtmBnP_O0y)0P-M7LELIO-YZCgklYfN2 z3|tTBR&gX)&I6-EP393ULsvbWhut>T7g;(8ZTsY7>w|k7zsNDFi%^zkO{c;>x?`b7 zLrJ_g@`#6e-MEJj)kpGIG&Aw(T#ORuJ9r5D%oZ=DaJ6vpDw90)BmF078G7vB?>5Kj z{e>B&KKNX0jtK|pz>u3*aL3!cWPHa`uF+xJm*#CxYBd5psUGI^BS+75^8Ysm2U=gNqrqeSq

6I=jG}x?cfiJpqVueF z{W19fht$laYTb#7$I36Sy(lhlHBAmhmJreuby(+Ju@E7;qpd#U<@hMr*(rRoaX$!G ziK5Q@&~MHqb&nr%YmnrleXd{}ifE zul;Um;V2^OqAq>^oYoTL;>bF5?}czNWopZIvWZhv2fDYntgx@;-P;MU%{Q8@2D91+ zXLj-NpUmlO(+uW~tIY<&RLAkj?KcmX&dpO7Q)THwH`E7x_bY`zrV|r$Sa=YMQw^}* z7R__@vWqjC;eDro1W8fdlWvrbyRC)Q==lElS$^CVhv#<-qIwsgIJ-pXcyfa!;b_x6 z`3u{wmT~0ZS_g;ysX)BI((IcG)N5&o5BZ2Eq`h+RVV~ed)?z8Ex@HXjY*aSId?QG2 zes)uZp5;eG+dE$4+ouuDdR&Xu;fK1>j6pIk-%BA?%8Mt);Xhy(OjAt^gq|+CllDy0 z55g7B?YB9)I?XZ!2HghMytN7&MCF`;H#fb@@)-TJ^%o+K*6tqxE&T_nUyZxcscg*n zMXM+1Yybs3trmxJ%$9Cfc}a{uO7Exq3M=4p`{@hF&X2PG;zEDdgx3TtW^_Q30`SP* zRqv=TQLyD(4vw&&^7fl~xnpFJ6Ak}{u>vgyjWshC>lx~KdiPNvR0FV@9UHf&vYjbu zz9oh_8&b`X9ka6Hj3yKmpGIIFrz>rSZF?F=CBO1OPKwBPeJKm+vm_KL!EJMetM>|w zTU*u{vzjkZbu2tUmG4%NANJIvhP}^?xMUs+qQy!r1d;NWya#gOk2-4sk2qZoH>wLu zw`*u3P~H0hsJ7?df0TXNuh*w>WOD2iHj5_m^(yx7$zr&AX5(%Et<5SZODi<&al0#$ zYwIo&tRd?u{IuCY;Q$9H4`7(JrKT@hzBC{rRBOn@;qq`JIrL3z4D=zcUzAICe`pak zAHz&W;E&SWJ`viiwVb^^YF@k73VmDg*xzEXB|I;rvtEeOoUa40uMCM$pSv^Vx+PS% zTT(0wfqFZHv|5s2bRoCU9AG}#BY#HEl1@^TjgW12S#>YeIAHL8z*^*rB4H5&XSnK( zy#3a8EFH0=o0AvU56tq*+OA74=pIH-caCHdnm^97TE)8;WiGoY9Vz(Na{A5ja`7N# zG38g<>d|2vm|!Lnog{i~>ZWk}KHKfgw9K|eSg;5%;EHBr{$4d$CMM#z5Tz^h)Q)P8 z*~;cK+@(GQ5KQpPcD}tus7npQ+Fe_TGU2S?R|XUPFu%Is^?H$O5p!35UCa&kAV#Ap zMvZdA?d4pU*r+q@S=vzss&QR>%j}8*KTNFS$rS9Nv@;?o=X24^@_U9crjf4QexO|) zx^CK7Z-$Rb!Ucw;=+uh1q!PJCTjW{UrEknP-KAR+44=4|)H1P}%?(ub6V*G+oPs@3 zCFQWe=!-|kV)r4pFikpjn9g%rgyTHY_$vSuJ-mJOUXHf(D>tBdCQA#(h%2BUTvorv z<0C?>v@Yt;@0VZTO7;oJ3=Sq){0!KBC^&DHYRfY{W}7o;>T`CvK{wwv>y3jZ(oH=L<`EDLgH*fry{mjQ^n)o@uAh=M^8WGFjxk1a zu|a|!Q}t%T4a4hI!h!mUs(7lGcNE9UeRp}q^2sR`jHU`+Kfd?0sWxSyA*?fu)9QZd zt6S8_iK{1`0eT3|8lOQ$1vKH){5eaR%Q<3Mvioi)Yqg2bP^;6sUaoxi93xq@g@gfa z$5l34Yc+MS*j)`w$LoeEF(n7iYdkZ=+64WSr`>T~J)fZ@<6?p%>U&4};T_&?+tW}+ z9ISsqV2+?Ht{ko*mDI&ncN@EG%5(+}2%7nUuX0DY%Xb~Ll%X@w$x|ljd0-1;`hj?k z$1*P(%^U4OKf4JAbt6whdA>GJ2pE<`q&bC}&sX{pxF0a4P^MArnu^TBpy0vpj6Ry<+BNCjZW4b1X1q4J7l`UWAHsy3Shq zfZj0Y8ft%9Sy^@zUWvzym(^UVcJdnA@@*11mHueDUx)u(%WpI~pjFl2@L*%n#${Su z{e<>aRIo+li8@$9XZ8fkzU6+3k^yC9Q75*XhM+A&QA5w45iqO94%}ZkEi+NQ zYqH@%tj?lFGHW*`x2)hxWBH^3@as?^3Afa-qSHB44JL!Fc$1Y^d^<}UX<3RP*`V7zh|o%kA0%@iqkMIVXd& zoXjoJ31%_<1q<6trEhaEVv#WUV_@ieD<64_7gxZAf^w^XQ4ge=bHo*`2{L@!^u!?{d&ce!}SZM z^T6cdc=oWEC)69Iz7(;6UMus%V!9Sf#xG_zKPd_8&*C$BYqy9>x4>)U?p54yUu;~1 zztm62Q+(M{=GH^t#gC@@in0IE{Y^Ob^{$L{H7Ru4U2tn{=2d&K&bB{QmgJc7>`cUJ z;Sd>CS7BfE`vImz5A2o!HjQEA>oWs#0bfM2Pjss2Mnd?Ic|pFT`AM)t{tMQ9R`rQm zRqtNtL1|l@lQ2Mf*O1z^_JJi8zQfgZ=D^V{pAzHhrv zsOaUSdW-o?DvE9Q$Wu#?LZOKG`VY6QJXHt{2li@}Ud}Q(K0X4P$u_fhF|%vNjT|!O z3@`EA1HC8}wM=&ZYYX_yQ+Lt6IFrjYX*y3PCE;5@?4W;)KIWOlR9WgMxm~WE2{mCCN=Z=Sg%$6L=Rd%GT>*=rXkj*1sewM&jA?DrwtYZ1?Fk0voHsHr1EC1xs! zkQpFFiQQYRA&j`xd3VMZc*Nw219b}@YaX@dKMO%VIL~YJI8O~%wiTCn1=Nj1**%tw zH2cLd_NlgTSfxN=@lsKVLwK=erh=_qnei6@DKP4`qC0RUhMDFth6WW{RpZl$#_p+m zdYmL>wVm%*PGtLB{?)#W1MD>h_h=8#0Z&vHd>CK@E>s-qusXRbtL1dn_I>CpGiUT3 zAYA+ck>!RsI!_88+#e3(pQo}Zx25Kq@s28;VQP2wfVf6yx5NnKlhryB^spk~Mf_;F z<;uWpRw@pD7P6(thW^;iq*8Xot=Po;`dECSzwpUGWB%c&;1 zF=r{*_?CRQ7xvhh$dN*V>_9eRX;SE3vWPQ$Ph9+YPY((GG=@*dPr~cFq`@qIY+Zuc%_o_OL|0i>OUe|lo=h}1eQN5Igqvo1!Z?6o5{ww1!YYA@ zv1z7-67#EsRqHHgd14UPD_Z(N z>+11k{;?|g+a!?$-e6W5_y+9FBtI7+a9knWF1O^=CAEO{8ESmx?fV>aWv`-+GEdeY zk4hCsS9-l}G(!yb54RfM6elNDc2BD@(4G`@ELk^;78+ypVM}qdA-hwu>l^x-KYwl_ zWC`CDZ1+pwV!qK`_jf%G2 zQcf1i}`@4t z@XSpo48ou0eo>d^rnlHk(M0?!hH#`x(ej!VZsfe}ro$VOJs-u!c z`(}2RS8_zNK1E!?&LfK0Mp=?)Fwf}xn+58mo)`oFq~dElKI(;+gEl*t^&1rX9*np(_UP%+gbe{bo2 z>*lD|$^%KN$7>}ZgOOO3ti1MjHMA5AUe|ckOXxjPeNPE?TIGl-sX!*PPcJ0V_+u^o z6cNggCqo+dzKL7)n21j{191DmxhV}QRGU66MiqQHIP)}G{i_Xl;xjdf=)8*_CcT-1 zv`vPXwx;bo=vqU*j?HyvSuqc~#sMP{-09VefAW$|<2C*wPbjXY-&Ywb&D8=6tziiZ z?$&CKx2FF>G*&Lgx&RD)`OB(H!*H`P|5H`X(u|P;lk_^D7Z|`w#eIWHv>cUw092Jt z3wL9gIOCMj)=*66uQ=Z8fQ2*?SLJURoYb3-S{~5lb;rCzFf=+bM+(inT)s52kb>WN zxk4PmAcQ$ujLusCQcHfb_13DIBmA-q5(Ed^mA41eeIX5|efR14TE#bC)3FQXg04c0 zk4e1xgkO`xfcvsa9$%&f3% zw+dxhgH~P;ZaZnK#2482rf6w9_~$ZInbbisfMq+1M)B&T{6jA=HrL|5>9s^ z+^9V%ph^^x!YJP<1hz+Ms~@(}u9yoY_1J7xAuG8BctW!tWKZz(5TmvX@`Hl`wfY-t zvcW3OA4h0;FXyx!6{dR>kJ;a|sxFGz+3SXM%M^zXqJc0-%DHIa8SkcUHc@%zy4sD$ z$lfJ=`Ndtl$WQf-19en0ompQH;)_aHi>ms%G_`RGJK3?~ViM`xX<@rEddYJ{ieB6LTSB3vhyg&J)rI`QNy^t>JItkJX24j5voGg} zwgY;e)6X3pZs)kF&@gO4NP|OFhj!1DfkJKzQxkR;E*E??O3ya_ER*Z$lJVx5*|3zd zXP`gxL^Gk7^R&s?xi!_{#EReD;<;BzM@x5_oV=^}Wxga5jgxn6Qo9%Bv+GY5L`-^- zubLJL%dq>7o_eP4YJhoU{bUyABdLX=xfY%tRPUIG;oV%I)ot{&R|1e4CQRNJBC5Jo zj+X`TzL>43AbdGv_+x79W@bI??LO-celbR4m9xeeq4RD*(Cg-wrY_Oo1uNv4h;Y|8 zXhEt((E*~JhNDAZD9!%PoMgbN6UL+LrYb^Ac_AgwhfBrFw2mfoZj0$70_siK0Sj;R zh=9JCs*_q{QE#N8Ax`w^Nj3n4a?SOx&Bjs5zCE~HeY|I+mA=fap99ZjVmp$&7|!t3 zUMjp$@S_Z~&sg|OOCDB{t}DHm6?X0|%cxY+n-59*0Zcn8Ij{RZT5PRBbmxj=%WZvN zh}NGxcH!4C@UL#ODKInjhg)<5-%H}PS!~2><#1sa|6KB>bLPYS3ogDHRp)Zq&DXPA z#+7A>HWt-0H=ndUeDb}Fvg<=lMiuD_XUr)RgCNHUoaTa~;ebr1%J%NbxsmxxS(h~h zAQLC^fr3tvDED0OL|*S16HVIOeT*9*Qh;sutNW)PE-W41exP4qR{3zm+Ze?Wttv<6 zdODo743XZy&_VhN<`RmseJ8x{XSiiti;HfO@Acf^v;~M{>S@fo{49{!wf407&O6;h zizwJ}A@=wG)FP@FJvSx5TU>Z^JkRj~DAKW^{aj<#^J-q^V-D+3NDyBr|*LsMPrMB8Y-kbz`MEUWbp(+M}P*G?r=)V*BX@2$h|CVHC)>#IgDVc;mPounb>tKLGJo{@jXA;bvUG?w zk^tD`0jq6Wn4@zUG{Vf-i*E5Gy{zQHP$&&b?Uz;%77p*%-NEf{UkhDS4T9s>HC0dY zW3wIrIjwXmGwgkTEhy#1Z-4%aAcALA_Q&?+$%p#)b2qK5y28NLWeV1QG6rR;nOZmyj7~)tegbj$gzi$@T@(G%$1bmO5*pNgpMzp(saU(& z{`Zy&Az?N8+?K@KI~m2qx7|}I+kHxW9L?(ut$SEq-q&wV7SPp++L#tR8*hm*9`%)3 z1QK8X+Xnenm(U_(6MjSyp504Xys($A7pmkteV%!d;SzzU@d0Wi#^;TpwLB79l{M7d zQtB(Tct&V!RMP=Fm30O^(!z|=MSeplRwF4t>`gWIP-%@lUoUt(o(GlnmdOlTGFCh* zvugHv_Ia1HGS(y@57lR5{?Ia6tDd3rE6J(}V;*Mg{EDnTb)m`aCy}>Y0GttM{r&kn23X$di%=F`~KFts2L7967t6emsxJLOVG9kQj9?@74Wr; zYr4eVFwboAc%h$XQmZMFRfkV=J(S?T>KNZk=y~s(3}|o9uHQFDx;62S?&6sr!~*q9 zE-3e_E4?ZVl+9;d7@k(x!->*x4=Y-2lFsy`KVDt9z2jTgq`D5VHOpq3S$MvT z(KOZtlQ(AM>qT=Jo?dc{&@*Lb)&9^1?_(3H5FYkU3>PvaDj~~cNX)@)byFH}Y``!^)(0XU-(QIq-;}stF z5?$TX#!k*Qct<|#oJ*Uj(Zh}gQKlwjAyj2R?u-J|_Pc2x z!6ahmk4(B8%=~hm7&9mb$kuef*_LqTkXXjDwkv)!uG8(i07u?5Fi4Jw?=+!1GI*;* z`Ik$OKo9#X{$Z62ws9Rx@zn{zc*XOei^hoF7XvtSZlwe5q*(4Pko*KTGIi(x7||?L zU~O&xh46=YDN#Bi1e3hfH4FW&{Bpc6489%x66D#FqSx&{C)G3veJNW6$L|{PJJp36cZ)cLq4q{ zI3`E*Rx8&B7IejBeE=IE>hLxX-`MdN(wlCMqX7lJ_Oh@&i&v`mT$k4hx`i%VlC-d) zeW}EnL4|FvuOM5>vxK?iM++7kh%#7u8lJ?B7wm)dThre=eb^--M`3iAhC+&M$_=G` z!=6U^4hH}k#XKssIP1fxZQ66frhT91}>ZZiRMswsxToVsLLeqz5?p2#V~RU;dlaj(U$$1~>y zQj<2ECEci-T=^*A7)FeVUo-|vjt7zy^xcm*&B_FAV|j>XaLZ#R&?Rvl!3gy@l&@Ny zo?7|JIWPV`tv4d3@8BVkvRK5g_wYcpJ|624%vKRj5|83ChdCUH6>H>0pJaB;${?@Y zfBAaZEGcafG^d=BiEBveBiBQYNhsypmJLPYFKmUM!P5_PI~eYH_8A|aCADwkK$qA> z{O>eB>IU9*%Oaem3>UOM>fm_}p*}9s2}DOnEbRD`nY%9L_Zs4G%WENOT^!s z{_-PBtY`O4O;A3ESFou0k>wRT$*e)#vXKa9czH|>u%c(6?}B4E-B{I)KEb?bb6C5& zqOP*WSjq6qZ3gH2>-$~ShDg;V9J**x*7ocjZnKc=xCS7;O};>c&Vf1;fsQTUX>=Y{GCYn;o7#J|2^UTnY8)r<~P={+qDdTS>U(yp$R| z``r~mq?TBzSDSYqf@`@U)$mfvExP}y?-xnzT;dusxCs!34y>^{bX^61W$y;%XHp9` z@fC%|Rm$ZIF8P6$ES5LU-&ojvGs0^o=I9fX#Dz*C(M5cl94rZ>3<*Nsr!YKJL5Q0t z)3|4#ELBAx>sSj_p;{xrT z9vwn()v~R3vLs>)Thk1CE;(*s`BW1$dc-Un+0a`_BbJqb=R14)6M=Ecw^-=BVpz=+ zm2NXHmnoailz63uL8CM%2VOoT_Ud|XB)cRy40Rx0kLB8CeaTK!rS03{z*>A-RE=_R zVh4&20Cu!eSF?U5z802Vchoxne3b8#&V+c4> zaJuh4!tN4jYAc=^KeG7=>|!*BGiAn7N?L)CTuSxESK=IIoyqg2iM?UpZXLE1`#^32 zf=+rIiCX3#Tli9^8I3qB*FBUcTDi{`Kh@k=uV}Apeg0f8H8zB6h~h}2swMVIVzd#2 zg!~w`4Z!km8m!^afd~n^>~_8ywq7WdGUGP)EBfmi?ds|cHe`C|3$VxAq7r5rB2 z;`vblfB#tEn00&l0J+>{@W!8Ff@dv2f1Hs3?_uI2R3Y9wt39^wOyl?n`e@^T{Ng$9 zvWOpN{!f0CnC>_4M`2OlB&IL(YO)vSKl;CzkngRlB6hhtkJ$pIrK)zKz+O{I`qTtz zk?sO$f9N&dqa6t!qPH2c-EJr@==9P1&u$$Y=A>xYlY{PvMPqS8#j$4bTqHmtzos%; z5O|_h{E4K9VOclx-4e1}QOCw$_S7n)Ev1Z!zpJzgUjc6QV_qK0J&!J_6eeg^#(^mJ z=U(Gg&f1w{k29RHSdkH1>fE$lBmcEgKOZL}zp4D%*bGqTOG}lc6N$_aa`Eo3jdY<0l%a;h z@Gq9g$wr>+G6uDZNjDxqmqF>bV#dROjf=yWb$84L^XPgV1kGn+%L zO?5+xnUgCfObB#qXli-GM6P)aEBhVK8Ckon40j)AYHy%*DuXsOEZJN;h> zUYVbNe6}R{g>hI_+Qg&Krm?ogncmge{FU+K^!CO$W_op^dm?cg?0M9UOb##5@w$gB zKO+@Zdk(C<~FBrK^6LJi1{>Z&UJs9MvtozexB#{4i_^m16nIdgu_R|Nk zFG1PHau6`-pq6#MiJdZjzuRxzHD#rUjdb3KEO`bPk-kMOo7D(ra`f_C$gG|THub4V zyl;M_Tg_#uhbHujKa~%OJS|#-_0N2{Y&MiXw^aS;WNe56qWT(mu^rPO!fyIUwO5d` zIcU0lMs+kF>TV!frs9Gu7hBbUvT_)&M;<@UO=!%_dD^@KWsWwZsm0Ipli>-`Tn9;Z z#Z1I%5quM-+lX>H`So6Q1?FAJIUsdVac-GnS|GS>mOjtib=F-B+8{YRZGh>>+OZ*UC?+Hw3%CugL9A-3;QC=P}9Mop<;foQ?aKG zA>OcHYSEUcHP{bbo28b4g}u&?p2K$SLXD)`9IOy0V{_c&EztKzwxp7@EWEAOtA3!A zeV%sfwC({2SVRWg{6L|5G1Ex}YCY!7S0?PGZ)m33mH8KL51vvPF`ho_u_iy;^Jznf%R(HPTbH};_ldTyiI%0t zz~^!dEHbi(NlAPDAq5+N$4?LNKkmS?W46ybbNW-~t6$;?y%<&>l0*DN(Eb?XwPZ<& zR(cet%xflp$P{I!;Zh@eo6DC1K&MH^zgmepKLR)|s*txk!YQsQ9`?&6$iLCR!@HS)hj*j)?j2kUFUxov?$2K?8gf#2Wka+ZxPx0(lFE{Jcoi{(7pAvy z#{`b@`Yw2Q#2vrifAu&Nn&aVR_9?uP)bcdhX#o~;4fxGB0E1KTX_&6*0yu$Y@5MU9 z`_yYq0~mvu7ao*L-k_qpWwo_v@A#T0%yh|9ctLMk=Oy*t>t|sW#ul}7tPNw-;=hKs z`!Ys_4=d^|AA1SDjHO+-UaDB_RQVKk@!-zk*m&!1*)C99ce2=|#0OfoIedE90D|sr zZf=%|)SOrOKwEeu4mhqI(12@(R?Qs=?6nrd^}LA=gU>Qh`}#QR(jBdOjezK1#)r%o zUmaW@u150+TpU_m{hlE1MHcP^SpKvWv=p)w25UV)Me+GxK&};cVy_z;F%AIC!6wi3 zWGlhnC%*`bfLy}pOCZM)3`KVt10P7?K0Z%`%9;4C)?GUU#{Fq{Ak~}8FLeg<-y*!r z@~@K=YyuDKS}!1s34dSpK;eRVSsYO z&nIEe2v)ngWIi)ojxvDvp?v>zc$b~^dYq@l#Q0)v?~-0h;h(XYYe+a>tFDvwdo(Z8 z5y9Q={2uS`OIBAHe2=rVC|j{jt)dESkc%Ej^Z7`KgqGj%>BXeMQ^3sVJzUVbl^dC0 ztiyI)e?CUTP~v}CGCSb1R?=$Xw;jbZ$<@!?P;+W-(=*W{Q5)wZ^XJwonIsTQhe9dW zSpM}s!$gRnzsZ+|_|=_Qgbjgf?#Em+D+mki5o*GcB&q0N`bB%!NF9$OB&G zTGfo0XUIGv(&`_t~AiyGl$7JYKm#tio-4Rv_=>- z?K9wNjApVY?oPt-WKXe>mX!eN1YD?&?wp$Dy?!RP{8ga|IO_qtbkl}aMgJk#Th(w^ zs5+a>W56L2WKt9f73KE;Tn~%~9ad#s+M)ON)%*}1EwJ;ez3YbHS$kc-^YN@*Amr5J zdNn^XL77z14?Jr`%S!W9%FEIDQNNy#l^6vT#NeSc@2A3n?pkFiB634$&a=Z1PO0hE zY(G1GMMV0C^g<2y@;X_gm3nhm*00+Bk~)(H97|6&&0p?rLLK~k(0=o$d;)+G!aT8L zi%OM#`RO7leIOB2f;~$brQ*i=2wl_9#tnsstz`iC3TeZLUL>??JZghy68m`8W+xi0 z{&i1c36aB7Ie6kug*6bVZRs=tZ2KVHiITnsZAQt|PV*$3^su@$ zy~oZVOft&ofaFCs1A^;X%+)@0B`ArIFmx~Pd9?AjTSHC8))_*(UXO=>E>^=;Gea*d z!LguZY+Vf0ki~wG|N2j%( zrA->npO@|aP59szV(|5eM2h4wq3A@xQBkLxqQIm@p?qV#Vb5%>@>$<5u)La!@ z0qK7JttB@0>M3w)%S@rA*Q0LhTTmq_k6W|fpRo&p&;0#dw$UKXkCVZdSmojZuiaPf z3U$Ww{>Fl}_6fD(i~fnp@Pij`U@?i{T!5p$+16%F$5|C}jZ+sT+&J z^9p61ROIJYTYHGizEJBgaV3Yhfp?P=mTvXcHi###sLkunv# zs0J;-it` z^Xrp&tQ<}OLm-%tlC7<+O&s6x(^~n?p!4VJoaQN|@h>&pQ`N#5e#PAE52|pfurq$^ zL3vjE=>!{ezWk+P2Ziof147{w2^o#Xi0B3HX|bK?*jfLu@g#$<@RjYlS=HYp+>-4F zF^09w)y;Q$e`C-Fqe_O`)C6mXlu=WTt^GKf#X4E@KShKZRawAkP~HmI zU}dK0-J zA82m{h#hq#Qa?|C=6Cz$W}jQ?zz~NUle>N$P|lem%(#}OF5hHprhBS^>N?HZzxOMp zXJ93)iBSUnNB!l+%9aE540DxvO%vQ)YOznUn_F99@QYO*-T8eY2Z!A^=bzm)Wc#~= zoC8RyLTO0;aW|zBkVDn0z744}_$kf?Ze(3;Y;M7KRr!4{5vb->E=Z$3w?!_el#Sf3 z;9~sW-t6;?%V#zEd;fBF&My_%2>#{0;+xnZA^-A>cX=iM{U2Jg|9C#h|J%(8t!Hhm z0csEbacwE|2lD^9?aGsXyIbOZs-VM&$xH0s)^(OBM6czb?Ns-4-J$p3tV5`n1b!Vb zNdx)WGV~HeMfuO9{H8e)fXxsH`s$QJ0wW83=VH$7WF54>FPN#$M)TJM7@%=Smoeev z(R4LeUMs2M-$QU#h*R@dqf%u0qHwYr9)$Ha$(~SFbjVrJ%NBFQ^328Du6*?4xG@@x zeMnGEkj?z3v)uZ(6#W3-<$w~(e%YxwB-<;Ue&T79Xz_AorqrVK)t|LIv9Hq}{L@AF zz?@0%6OsOOzx;)dKeuzz#V5<`gB090OiFWR z_mloRVtAz+7dU3rE2Q^S3%EaDf|!~W(B+|@C|Y;fF@4-*1UXGiUN+%=@CxHUem zqLf;Swn3@Jr5CDgo}bhVPS>%3vB=r7y}cDdl>53pGeq+}a$9;&bYi}8NCLip@aS*a z4W)#6ux)vA|GM<3qMfE{(ODXqu&HGzKcR^<-us1(*Ep4*I~KHWVz!-@MD2yusXQtg z?w!i4ZP=>0y9=&U-TbkoA}EJjmj|Y8)q`Emy?^ahs0GJl{V{|OoQK|0DsnxIVlG5a zWpJIg&-?A%wNNWR>C%OH(~*_Du@SY#`Z*yB$9r{()n0AI2WlwgP{_6nMe;mXLI@p4n{I&aW++RB?Zu)=-30yz@JlD@7$&yyM^bg_@ia7YX+F zYifa)*f7W;PrR?$ZB7?M4Oo9k8)K1c+o*>)$p0ktU)iNwUL7{l=Lfg@eUSMB_b<7& zwwDPR0Do)HO1i>BMQl#k`FnWN!rqi$dD16I>K|Q@ma_QASX`eX8E;b>qaQuiePi&E z*9{xJ2)A#7v@qAU_!vD}qCLW>EL_#C>QT78HAdH9b=-ettU{f{gMK5$m!%ublk z|0inxe8c0v=)4je4>$MU;j~KoJZ8G}W=eqCjo%I5^&c>vArbI9DWCpnn10Q6bSE2! z@Pvo=q3WaB8j;lBx3s#M{evd(;qP|5p*vD3LU&pId`~9|eChB&@y~Z*n!6TrPjCqj z?&T=>pubs??GK#Pg58q@uYdLU|99}eNg~d`>vJoALL4o>TKghie+K*^ZqSo>&fh{R zUnI#kaQin;Dj)o9qY`KXD~!8iu-LmtcJzod( zA_=5kGIQXiKC4A;>GTjygXmdV%+x)K@Yt$drV2lOEK}vw?2q{~YczLF8M){>Qw=-1 z{$Ofr?Zf4*twivgw%@UCFnX|YH+r{_9!H|wk;k$Bv-683%2vJ0HHRxp^i&Aw%H0E(@YaLLu30fJjD;ZFDkFF1!+_LQVe~<2W zM^~gBnY|g)nhCWoB>FAJuO!(R|CkdCM%t$d^M_oJ+VgIQ=2HK&kLrM4TJ8#@E632u#|KKU2ra4v_W))ERKKh}zC>!R5DcjER- z=thNk)l!q+p<1sy6N316km>{D(R$GDEcx5$a|W_Yc|jmRzq0{g8GMmuZf+**nDK9w z`jbolcZK$y$Ij_q9;;rvqTPU}tkm$UE%4l75@41y`QIA-U+o2sPHMlkTxy8?-!sFR zm_I(x`9J*n@F%X!#f6dor-tVLty5n1or^sFZEtV=nBPXDDL@ZHU20a-*B2@pTlk-P6}xwyXx6Rk_t)dD`GWs%mg0nU&csBg zE@sV*i-?t?zXydB0ygvjGBil9SPu16Gq&=cAiA@K3fo z|Cw-{8g(P#`Qi;Dc!3r70w|?C@H=Zl_F=^y_G~k3k%MR8Z4>%j59?Qrj_i_~WO_di za~KfnvEU*}6hdK;fK}SNaPZR3TdaL4}6TVRJy!rLU=chRY++n}ja&LEeSF+u!^*Z$qqG;eLHCKp&|<~ScxLYl-MSnVD zLztMn+HuOivu9oG?cNkf2myM{Qe28n`7^-H9%_l_h(h42*@u>CPFVaRlA5+IUGAx& z1QCHNcVcwC+xdypiW3@3gwA=+(Ss5b8kp&^H~jD93s*CkcX8Qc7NFdmZQN~&+4aDb z?iG6V3;i$Z-aVe_HvS*)oK6n8OXaXqLW)vRjzuLDLLo+_rJPp88fM+4q+-R8oNmb} zLxkDJRw>FHDu-caNwaKi%h(n(esAjTba&r;e~-`i`}_X>t-0RU;dMP<=jWAcXeoqs z?pbccxLm>5yQ0NMBo50ER_vhDA5oo~DVa?uDTjj;70He0QN~>QzynAdf5yli?@=a+ z$|LqJj15ntAr>=_zdN`6bEECSTu=j%z_WI*81NQQ|0ni;}W!1;dG=3zr0n`CXOg+-%7C{BXfP5}( zr^lc(&AqV-+3jHe-M~wbt1FgL*(aGd`msDjX;ZpA67z9@(*>q72l>L+uKvdg182{8 zcw7aVZ@pdQ?l#h`<<@9C&ZV33G|3mg87v!B(KJPgpz)Fa^6bh#Yw8*YfcNfC$Ao$y zA~}NtLg91Uga(eug?!jAqcLuMRvn@Mp z;(Lsrlh+K+{I=6)bL~b>w2>`>3t@culY>{)pzb9kVUYNCT2F)TXa5`cU9y^osdwxoVZ}1P5un3C=98x*gUiVwJ$HdQQqEO zy6R%YXcUn$6qxCiCf(R0&m0YhM-R_DbJ9k-&9fX=iJ^oFp-)1sHcF{gd^KsenDx8n zm|kB8wUH#dN@|4lMs!+C_hPF4Hc^Agr#>E7<$*;S3|hzU^G0l}b3%=29IguI)#e^h zKKj?(!>BU4U8otOK@UJM@{GFK8C}|z2>OCItL=+-cIiW}){z6&p63QTunz@_yW!N9 zP1ODp8)JmTKHQL}`F#?jW*tPFK)j*~*NVb6S{yG(zr)fmeWmDj42M+#x6vA%P#d=f zRd5C}Sh*rox0VQ@p#aA#bJzCUrm$rO<4-&P#ItlBOC%?I#ys%z3u^`-YIr7tGkawqBnK6t62pEdAzx&AGU}I_wenL+IJ>KL)&H=dJ$}KkXtW zE|O_qpRwikLg0FYgzXC7KfVS%7XYircaIZ0v`sSBQ5Tsl*z&hC_;oU}R;u5PZNN=` zc*>rcY#a7Y{?BwG;=m-?>m(1yO>`F>_fjrDh4l8@|muLU49r#z`dxfX6@o zSI;)HogZzH?*#+GH-yUgDF0+O7#k)#QzS+|2??f1_zC{W#4$2UcuoU~c+cmThinr( zj*>zxL#CH`zQeQi*=tLP{EPuRb9#|NM9G1lS7gbvo0rIDqFOmww-+FjXk~>uj$mnM31eEg^U}lVfm!U^dllm zGI>_UI>1r?+rvq*)$qX>?#n)q8>S^=A3Q`pS}ACUX-E294FTRcH$W&Xwuxkk@wOb3 z!Dv)o6QHRBM#7`tZ$gV&n{!uO1+pyKjgn>oS;NfI{_?lOa(=E{*Vh}BeUoUOhy1h7 zZVYH*!heuymG3Mfn!5~sZl`nbf`yAyq!HZ=Tz^ixvK4S64bcQJNoORy>f|Q0PMVV~ z3oh)h@&Z@un!!hf=fsY9y`fEqOvV`iq52V`m)X@BNv5AA};?sK`X0x$G!?d?mr!=8P4nsGSYqpLbPIBbGzHpxI@3=(Gl zbgGkAsbpE5LQ}qI2&Tr+hQLIJ=uy5V@4WBpl#a@_ZHk-q)3DBF8j!Oyq=*9<1Aeoq z&-6_qjIP*6*z`HCz1uQsWH97=ny%i8y~msnfXfLU=wbN%aoM_A z&Q==qfu4nWHg)TooL{E5yWO(##k|)${sLnrPDJqI_1K*YK8&ht%uM>(+r*X$A6!^zZg`zQ=hPD@8t| zU>&ag+jlNHEMN>C9SuL{r4zUS{Mq8lUxkA(HogGzaH0KrINjOhx`!Y-J!We~%U?1=%%XrtsMzG3UjGlr*$u__ia-Iq}kaP1AMNt zORVP=d#()&G=x4@PhRMyR2 zH{yTqt@2u$jNUpiH^8Fyjw|XWPrIqrpu?SYd-UGU<+R2Hg8jp<;D%~TJ?INn8#1$B zyk8BY=wS*Vyz1-0*=7s0H7Tnex=)Jejzqh=i@fB>_YEy?GsJCA;D87UoNt?;S7dnG z!9J{eQ=45xvv7#y0p^HHc5fl&bcauFx=)YwnagXAxO;gRpGtk^ON7m~0KG6vZ{%kO}GD17;vO;SRZ8V!A zxIMYqpz&?g{%~%(H3-(!peuTf2Iv>jwkw)8G1bf$gR$1&<>wswb5Q{un|hoj%oEh$ zkRf5p4!=7ASu5x3XiN9HTcf>fswQv)A4Kq<53($cp(a%#jL#1H(MtjyE%ab(oHT&G znUe_m{jxtq+bxaNeYy2W-3y>#0IGCz<$P}YW{i~vFa3yuZTb=0^lmW)q!s>TByl;Q znb==6)9CLuQA*8agJ#^QW=$QLkndkfca)*&>O#Zr-MRi{OiN(QI-2>g&Hc6KR4?h) zq#5OeeCg#e6%O5}>W~30eXk zbDr_`fv6K3PAOG*RzFn9_~Uh`y)p9jb$T3AXCIl0!mP3cz99F&W5*E`V^M8&U zP-$0}+L%vBq~+s@`GlieqMoT=&%1N(Z4A)K67dE{rXYiSiv` z&sz7poQ7XKCVBeC41P4}j|mn2E0~S)>>39S?JL;>sEVyeRQy{i9ARTuL95&x`3stb zg2O>-Amgf#vXHXyZLlR&1OErfg@rx-_ttH;aqm9tbWl>hF-E?9tS7s}Y0x~HSeTJQ z9n)*H@Ji;}lQ!hA{q&CpeLpvIjlC83O>e$WqNGM7@vQ1}TF$5tcx$dEprk0Kqg5}L z4<2fN#W#NoDCq4L|IoSXtkoc~&|0fp89~6Ho66p?p-k=O1xYVb1-Bi+jeF=p0MVc6 zQx>)RKCNhZk6wu4xKK6a^65^$3l%rYyujbjRyrdB_q&ajwJLG6Uq5^tbKbtMTk|8Y zWx<=KY!a*c#P1A=t4D)9o+YAgKNO zG-iJ>u>S!rZ_IFGDBajB;G$qX85wxCp`|D%qs4dgY%x*6%o5dv)gTLFAZA#(|1g+;noLTNm2`d@AqT z2cPeEj3jRN;(iJ;Jy~&q5#J|hI7sL+Di3IjN$rbVT2h$5Z~W5<4Qkf-6Y~c5-7TDt zZLYA@G*EEMIV%0;^I#(p71#Ty`;=o--ISB)H$-!u<33u`7Q{L$yxXUNKppIP92g}& zs!G1GHQuUp>FxSXUnp!(p|;JfxyQcz##lp0XmOJL!?2F zb>wxBSWr#fK)6XkxUhk!WdUhFEDO8H%yQkYsutdrv2G_YA1@4AE?p!0M9rUudW)qP!M~Zz zjEu=kVEWv7CDDiQzBU^xDfXS_-_V?Q0-J(zSHyS-hf46FK?KlC;oo@oFH8A)BbuY* zcXC&=49Yj%^8a?5e{UQCG>04G(UxQ9Js~z3A5}o_SKgj#{a?_&a-~*Vtz|28uoda! zXmY%h$OVWEMfwLC=pa9KMV>z%k0DuilK+YuvgB;PAachQzaWvvWCWC#uj39B9-Ih1(j`6D?!c2oU_fb|m!VeNUr zNEI@nrllues}!S>o*9zEg-ND5dp^m$pKwdvXMf!~)0^=f{NNvg?ia*DY94{4*s ziXycV-_O{GX@#~Gf>4Y|=G$xG7*$;C5I zC5cbh!ORSXrL!u-a7>$wB58R#-flQ=>V5cnO28JVI(xgZOlyyG?Skovl|NttJrP~} z3PG}O3u^tqJ1z|&4ACK&ei2*I;XyRl!m)smOAAkh2t_;D7evY5b@T6~;$qg7fFP1D zq|~ikzo;Q_PEZW6o)C;u`eWzSH+}$39QZeOuk#TNbA`{72epq?4`4oRIBE1yO$frn zq}+{_3mT?gdIV^ONkl+i=;_|QZt5XNq_b{62^uYle-#jg3GCb-1K0yl)UsHgsRSsC zXIIEhEO?e+t=xCJ{x;wotoJz#W3$vu|cBYRp)_M&?w1W1Lv$!MhwRyC`+keHH z1G+%Q^U8arDem$A8z8a@@32anz%3Om;$m3IaK4Tr<@tHX1cXt7}0C=EU3ow~GkXmFZfQ0*-D`u3JHbFyy)VGr(kA$9vFfH_7>TD0D=Nl7e- z=ja;9G(0^!{MLXTur@}}o9Zs_&D`-#?a9`0F8xzY?rJo9nSR+B23SME7^4eL??wLo}Zc`6S&X>tXD#I20ln*?m-N0f#baur!$un$a@Qher}W zeHLmh_?Rhwgxy;z--xpP!(mJBV`as85dj1sKKg6G;MTZu-K)Jjc7FMA>4_GUwcqx> zMmG`SH+qH^U@J^WEF0g0P+tb==aj__zg@W^ko3|k51U|p8A`A;eIsbN_q3{0u|dC ze7rx*lxMoO!;q@9HmmV}tHg2ug8 zhWTx|jd-zBra(sr@CG*@+21(Tu_Y|CT6;)&q%8$!4u4}hU+zp(ZskXZDiwt2P%ESW zTHJZUK5;->XWQg(3FOT-b8FD zObR>B#GaF%LxXC?az`}9e(ZrUWe4_(hC!i%d6`N-w-({|&c!`F-zj>NNtfoi1E$mb zpeYayQeGLi?-<@0M%@!}Q}#!JL@sJe#T_#f)E9erbZBP|zS_7rQKoQklm0tr)9(K5 z8No4A$>KM2%Y{nUihk~dqRy*wui}oop8;wC@M_+0q{>|dmUI^84Jo1)>tT5el=|=} zC@1x7_!L6)-Rde>A?UStjmB+-y&*ZV619=W_DB3oN7C*Y=po#=;RS}bY!ubF@XaNd z@<-T#kCcu`e;bEx5pz!^(`za_VYL^~cJ#>@=Jui^4ge#=BeP)i7w@LJIe_6BwFk2u zkgXI?H6F?7u62uYhji2wc>Qp1h7kpHmwpt0$>x}4C5}_OW*#5i=)#+0Q?gJ%6P zkUYd(%@WK{q(B-1;fu@SJ^*%Twey;tQ>pn0*Hi06iOyPIFotktUrX3e5XjwQv&l3s zb&onE77IM_;KGE?ZiIB*FKeE{iUCGtjEo(t+F;6%X;A-rHZBIWg1F%i<&rHQ@4ld) zDmCF6Z&3V9KyBTNbadS@>e+FIGc<)o1>m6E_A*n%Za?m5>X1yEwPW%S-)`8Fv(DfP z^fea0)1i`g$l`Q8PkSIj(#Z=>e#R~bh1T~^B`84Z3KxK1jlaBQ$WWqX|oRG`Bx*kS}viJfhP6+acz`Z}EVC0mk>|B4gj*nREopKQDew1|;H-;bs*6fO@d1Q5@07wFou# z_#VyuKKns;--84zACfmUG6XE{`q+%+y($@@Gjf%QCF>p9`YGJNwXwy12U_6yO^?3C z`DO!I`QNxRUoFPS;x|?eA>oP-ll{egjVW3s?+&Xb1y!?!(jHF)oaS{cY0mI7nStR# z|4d3hMYBl_(5+zisn+xzyLzFsgXO73&qOyu!o=GK3Kqr7q=KSCj7MSsO>hnGl0)8G z-e0Y3wPVS@>kN+b7TvaUpP(JfhLd`+Gf`@FE$4#N14Nr!`b&dyU6td+a!1&O`C=M* zd46>9U?#NtR%xvxPh}PWsTR5Y;yyR=mM6g-aFVF4Z;#(CUa8*)Z3wWW zm}RkEQ=uy3${TebPD%277yOzGx97!a+JMbyd}M#&RMT$MM9av);>Gjd3DVcLiw5il zUw0&P6K{PmE&FTSF(Sy}Y*TvFS(5EaOzm*oLW$mM;aaq|(Aj0ZIjFF|s|d1jzhR8& zRCoQc%axKb9+zuVkjQfkR$YIhTofA5d46_n$Psvzt)x=YcuMQ)n65BAT&h(*q_9(m zY{8*G$hH$6dAwR+7Y>SiwR!Z_)5;h`1Ww2EVV$-p8A+3LBAeeN_SR-irJ{g9{M^D& zY@^%by1hU+yVawfwTOzo(X}7WmVQSxfWTdY&kt}4EJlMW0(bguZRt&bs=iT_yY&Vz z<}EDxp&^q*`4@>Wn2ljec(P%iLuZmomB$o{?Cl?Bn)at| zbe^3_y$)0oq=iMkaWXl-n|A%;IegD0XDsuu8Yv^BB|z(eq`~?SYE1w}k^l1kWa8C2 zx5<7jl}uWhXKspm{_#<0*e$QXT9})6#|g7D(5Y;hlsy{k#W2kVTIwpfU7|}^pdFe< zxJ!JomveYitREr)lVo_qspv>iUC7#GR!pXNU~fnF@-Bk~f;)c6L!6@5OJW(WB|u|s z++=ueTdT~{q13k-NW2Me_I}K zVYV50L~jYZidnnzvN^oUW4oSOcdv5H!8%uFgHv}$(Nti$Bi^pfDSJ`a`=Tn@HVQc> ziU9OGIlpVCq<;zE4d(pdbN{s`0)1yhl)=-WunYM9ogAKbM%4o>u7oJ|fr{;leA1H< zBSPh)N5%yBWR(%o}nCQtcYk#|j%h%nBR+VCZ!T zp?`Bfpa_p+O6|Ae9Zu7h$p5)Twbw-N%IrzR-l#ZYN0(E|p%QVP%tv0@-rFqt42m2vJ#NE$rSLz}gQG2Smq|7|>i@?B}#fE4iqbnm~ z@HejiH=};pT2JK>Yh<5v*03~Nt7uyh)W4I_S6sD-a{abAweth*{XR!RkR;sCCH9U% zA$Jc~<*GqyxpYvzX8`XnR~VQOY(U27)ik2qDVun_E?5z@Jh-+QRJ61|Bw8shuePw; z$zAuO(^L@uRih2Y#1~7Y=?dwaX-B4j!@qS(V{t$lujTr)a&Z~=qu<6UHumefo18V* z{{P{Z$m_+rqaC*bN0+zZ!UsR*AuksUL(I>Jr?L#cNA!EIV8%C$QPc|T>Tw9#hWs?%J~9f#{IL70nyDzer||zsU(lRi?$uzP z_R^42dq4L#8Id0{0$Yl%qJpLANMF+vokZe;!ovGq`K|ea%;68GTx$;oHMc^L_qVRL zh<3Id&iCf2?@Bi4#2*Yj&=sr)ujo(cm)r$1mIR=7EfoPb$I@Ct)^+2bazyEo!W4K@ z&IX;S6y(?K3dWSayC=zxo{X;SM@>Xm4lV6Dbb>{%C9}A7QjS&K8+bR0q@$?wz%|(D zjax4z*t_dyr6HOa6+vK@ku$TP02yY&;V+#+QG8ACfNHF?bTSREw596ZUcGiN*VAFg zC%1RRgcl_}bTe1vMxp`!X6KouokcEvg)$t^qkvV{f7a_zd>)kz4hOPqQ|QEtcHc9Q zRCWCZi;WDNOP|SIKGD!`=|n0u1D&XI814}kw7-Q-t3_x~GudrrE}kExjGt<7wVb&`@_gUjnzg z1TMl6^3OGT$seAsVLTYKEM3Zf3m5J@Rymbj_O%Kj#WRaEn@PA_QM`v&r!70Z1Dt*? z@BiChPGl0pcOR4{&D3k6J5Do{1YG*s8%M`oPZ~-~8uI*&tLY?kC5G$Xz{9qTj07(% zF23~p%;t=qRaYxHp0xID(* z!WDZ4^%5Q2Dah3`?s^6|nupoyWk}rTX{;+4Gv{Q}(a8X8+yq3tmVa&kH$+@>o`i@z z^YZ2(oZl@be}zwuW+wY~L_+Jhy9Fn?bBytBvgl^vR9>THTxd=K$z1*PfC5gV`>q$Xm2H+ zx2X5m-HEi6zCmr6ZC-}^5vnUuG3i8L^OHvz3lP6%wrP0 z4&WuU{J_!R4o~*&UPnJ87Stg-ee3jYX8^{o?H(-XFinu{L`nS2v~=&L!9|Kk!^2vN zO}ZSN%rn*J{io3hRAd2T)Cm>hi9LzyBQhi^)HLVwG{NBIac!>3^OP;HGdy z0t57nC4k8QDMTO+gTa2Md19#FeWcMpG@4Ua4U1n6Eni~TrH!2uqv}e5|A?% zj>~W*!El8ZoiuF%yYWhpTQ^=Q<6|0|wdQ4+K!+?-$iPxryz+=Q@ z;1Rq>ZXLTZMceD1Y0c3h+p0K zx(cYEX&fj$X4xj6nXmijHcq-1Hv82l&4RTs4O)q&z`BJ$|4f19Q@%-v%LiQJL$`=# zt-H~=$$kQ5tB#s5eMidRgH0ng)7!428U3}8ab=2r=6;~WzQmAmh zN4wju+2h1PyFl8YO@C0 z(1RbTDWJeg`};KiFq;F@n9XRV=X0G)j2h$aL1og{O3(i)#Yqpu48dd_kT{!}QQZjR zAygEPM`)nni*fDMt6p&1-ZfNTc@W2fnY@J_K9G`75Q_zvlu@F zBgQs8<9#xAgyD}jC|7$52~a8;upb1#J6#j?zW;4{P>b(DHm$a;dYm*-0bt6oNgKQo z>`ruK&?+E75(g2xykoHIf%{Wg!Bx|&R#mgZMvpKvDt75o)A|M8KT0q z5qp`rw~1ZzpH95-j<9?%bM!=3UQ2=}Ig zV!@aQF0r4{hcmkF+iwBRmN$^ws+K*506e3@n-#4m2nM)?!gWvfZ$A=y{xA zI<~otXI7k!$R;BQW)o3&E&iuEpIgDqCMVm}Lx#y$#!7;QlpA_%yfMZ-_%_*T2mp|` zk7PB*Zb04I4x0N*Ibna7#uu9?W6%vHy z7WagHn>;M0p-};)t+wux&kbs$Tc>i&G_J^m)+TA{^(V4Z^j{OQSJq5J&;8HdzKJ;F zG+dOlV*7p5*#Mwb;?ttDZIWb1s>cR26B;V`+Gg@!4)TN_KYk`=4Eti$sqxTT!(+qK z5t~U(i>bnJxhL5fX^{lnxX}W${)u+$e@`S%e5tO}T=2>l!^%^r*Fs8V$^5{V?94zD?}pxk@r{3#y7Nmp%Z7<^mUru8 zv!1n(P=IF?FZVK}>afWl9>$#TGAZn9h#;_|NbUeKDN?ZtWoMXG2_@yArXhbod{5ni zoBDLjCS`RjHDEx#WB?Irr=YGgU0q}_EAr@&cmjPg`w}J1F`Vhx)5%=-==9?oC)84JiC3_XzbmB z>7eZY^|#y0yiKBb47lCf%A(ny8_K7#2S5=%}Y1ysF;i9n>?71eCTrHI2La zO~aR-hzk^(x!j`xYC)MSY*DMHl4GYH0r-8Z|S0@M1)y~aU+r5I~`-A z!MWI^4ZgkWPetPRg+njZjj0r;*4B7*=tLt@CEmw6nYX(8d{7d@Z&rzrUx@c+kse^) zJ=q~J>e?obm6!|#En(AyqJDDQkk(Z^hv!hoFZ4Z4r`(OkBT`{s<0S=5+L`o_g*P-onESlLUoaIqi<1U=dnzU4aL%} zI!SNR%wzO7`IA<`w*iz|!4oad{}qkGdS)%dguAhH6z>{_(L`!G?(i%)BCuIoAH`8N zmdl&;>GSs?QRgO_jckq|B+>8O3W7vqjsopQhBtz`grVhIsdsp{t+saR(OayI#oNva zY1@z!ckKbq8tYay*QR z(v%K6xqoW_g%q--cF0V&cz;d$23E;^zQ55ctkzk#_}oMHjIcw-$Nna6y1C5f zgX#@~>b5M1ZMQ>JPI#$_DjN-A`HSe`l}E}Tj$@_Mo|{dEBWyY9X-jW62TieBoNiR) zz6}CN3g1S}<*QylI4m3vy?MUd)al)ad^*MuD7pIDcbvpFnALcBvg7(okU7jM3E)yv zp@%&AvIvLRfJWvzJ?S=0^rhu^^Fu*hriWol5L{Y*)=f>eiGjemDSAg6s!5F>?bUo$fxt*v`chuJ4=C3+gocNlrQ;zaK;nwe(H z3E0Q`4l6r^biE-uHU<9FXd38?e>R^-v-0&8r>H`l$G1nH@NZRo7faTZnYpefP zImpm;*!y+ffm_OSq=8HkAdF`L!pwiPZ~ri(lRwXB#_zi&zlu5CY5n29m#{sL87_UI z_rL$ZRx?gj&qR~FlD;J^79D7!UVIKt0$V^ z|1O45oGDd&?$+;U3EV8+M^B2a^#ZkvZxunS=z0$ihV`1?QAP8^=fJ-oX1jPk1~f@? zkpR&3T*Q6t?fg#RGD-IF4_+I977VlUS0b5N0Clbpz#KTyIuB$LR(xSeon-0Rtzlbx zgK3KwUCn7lJmq^%+=A~cITNELH7{Zy1VaEP%P>G(&^gEk`noF_ZMzXE?z>a)qnm%? zH<|oWU#S@!vn_8Dsp>V3J!&rH-3tlf6`E_j#D8b@*`;xO0}7i+`;03LP7`ztUT_5m zkDC<2(ggF1^9!v_ycPu*d_}I!kab@vT8v?ya#ke(_v_z`FtT-wc7R$e#AN4AbS+D0 zU)CSO)Qr0>Wq(%*$LyKp|4}Yw=5q3fJP&wsN6Mc7<%(ndajfA*RR`wOsSq}8$t%GY zbH{>Ub9A&jC8c!hFneRTy-p}Ujb$vz6v(;cjM~8n*O{R-~IX>-|$5qP~2QWD$c!W|y$5Xw-!6z8BpvaWSJWkRL zHBo4xXI*l$RMzIm&3Ojg^bLpN7$Mwv-E55bLyM=ezN)jS2?caGegghdWpXOj{t7|f zeZ{Z-MFbeJ*LE#t;)ho-xcE@;jlJVwW3`nMUDq)TD*A!pjSPmTs%|s(rClPGVgp48 z2ZU5{6PlB?{IjEK@H> zn&;l!h)QL)htn9vAt#eenD{ii)VBd484(T>knp3tt3^d!gW}dAsy=ZZxJt<9(df^K z;*}D66*ji=0S87Pj-5>vi}e2@*9{{0TAw=uUnpC7D4H`}KKX4eOFN4kPB<Pk_Mv zp{huOx4r8PGd+7ATR3jxeo!auLE(MIn)7g{Q!NI0>ThgBgsWoi4k2CrV<*L*WSgBL zyuF32v@Q{5a1d&pE zHc9xsaf0Zyt^SXUh{{ib%o=s{!-Hm?suM)5L!U2>ezjPpO={L-2QY~5SQhEF%WUj( z&8){i@%UW>2wq?0^(No=%U5c_bA5M!NbGN>*T_kF#a-Ip|K zbB}uX@c!bp-?mJO(YbSM*6#3CCT^cw1Q6IvgWA2ZEr(FUeeDfb!j7h*uvi-$M7wid zXSoewmmB_IVB8yba7~p)6X(MAH^QBBRx<-{X|YoDbL0os{<+3gV1ErOp5YP>Q6^(JW> zODA}vT>U$GzcWe7*7ZI#NyyRGzRG)13RCT*BnswULx&zQ&IfT&9&HMDz+ho*?ks4D z#Nvvti_#YH-5v@>f7r#J8qop3O(D31Vi+q{0&MxxT%g3dQJ;15X}^(5?sw{YoF zht59Z!Wq4T-U)J{om<8cf^euF?|Azn7G35N7~ZH)!5)h)5j@yi?wC}(>R$X(2A>BF{Q znASso+L{BYL3HDM6x2h~rq>6MU_u1&Hi$!-#iukZj)jUJD2Rh(Z^|~#c4PGtM;az- z5gba#pSJt5fn^!_Z38Xprs`+|k3`{npS8$6P(R`o6%k_`Y-7ee&Em@v`9N&}d_!QV z`pvG_;G^s3e&dy$nPD^!SADEoYBsb}lDgtiJz^V!uxKYc=cNtUIA)#j(udlyekj;u zoT}?-`aD?FuT5z(=PaP~nnKsyKk#An1rf3_r)3SK%c80E z!-_hp#BdpmBw%OjwDOOUPA{#AsuYe9q+4A!G~xsj>dI)&tDRQP{s`!fh@vz!vN!Jl zZGBbcO{C=VV>J>T^^GzXIJec%PF5Jp)aMvi_B_1_e}PK9OA*5QhiYrQ``IjA=);l1 zTD$Um63*^p8^8rzb(T6xKM9F=0UuOVsNCK-+@B|c zP)uu5$kur|*{0Z2bbq8k;n;(MgB?-K3@TFWGX%<~X?NTBAm3cgHfi-r8>#MH7m!8^ zr^DRV>|=89Ax;>TLA(j5VeEYJ#+1Ro+71rGj@RMGxnnIJBM#k+gJ49mYv({YbMyjs zK#om+Me+dI&{x$DZ{uu{@QqE6#aoYwcC3QVkBKw;fU2raShF=Jw^(_F!s{&XSYu|j~H7<&l`s6OTFFpjJIRvV}SGL`}+<6DY*vVUwo$*1zzWf{jVRC z!X*LAVn>}M! z<0linA1ToNF07q5<6=q=!uLlejHZG^|c_ zA>L%zWMV_Xf7`- zG(b@3ZMzpL-L*A8*bG@qpwDg@6WFYGBX~Tqdzg}*;uaB0xNA4B5*7W+n%BUBDFHA( zz-fLUZmlN0X+a{k)e{@`dCW5u`v`$>0lQn_CRo1*_`*Z2YnD7n;sJ_LIMPY-(f-1-;I5%|3E%o25+y@|o_F@&j=XTzHCP!eE>ws=; z!o^X(#9G7aQcV$&C4B?uP@hLwvL|2~2(moSjvJhYnE8I@Z;nnuPIVaOx2K^}7B|H0&iLxmAWd&xQBnqKp}tl%Dx%RzY(>wQY@~@jFe^n+~^t2{YVGjH!!`K$1MLT zL;nNvJYz<{RZ;PlA8%E);ue6Ueet)A*$1SO#xhZB(74NX|9&y1F%WR?=0r?hjzloP zX-FUz26qdXW}RhM^$G-|74?)xnjkMm1PE}-!=hR$t0Ytg-wkgA?a`JHjD9)wJ9P@7T}?WAkI}O#$R!Bxlwt>yW>Kzt8oY=_3rjG5Gb&05M7&$FFIo4dOL-Hzzy+A zR-=Eqs@Wg)PvF`gh$Z&gT=nil&UXNk{|1jaDo;OGp4(mUQZ!oM+UTGHWfA*)c`1tTb9pVUYI~aIpAiJ{CpL~;u+P;DQ28lj$ntN56z3*dTWXTdSTV~)wXa^;3 zsA{9YSexxh;)aX$+WgoQOT);)Kq`kCmU7{!F?d*WPLnIO){@gf8Jp2N=Euer*2Zo0 z0TF~BJh|-lNA$h&;a*NJ88VH^K_qIftkh zR#4L0J%G0Y#(D*8ysP7|=D53bKYhucKZ9-ZCaEkpUvS-Xk4^D?Cmu=M9bjwJ6`*~W zs=~+W-OwEW)+^;3bOb_$&((7=RlF5Mzge6G_t^W-n12X$%aB+ljnM0Jl>tld>2^ER zM!IX$nh%nGNHcY-Hs~q9x=w4W%7+AqD)L{m5!47_GT&$!U9ZHqZg@ck_8`JUUMAi&`s_aib<#N+b!VhbL#{~X|(-NOVCow!Z1bw7#uqq!Nr$W9#v z=*T6lp)R)%0PFZjqG&DaKD)rX#{GMg;=?Aiet_?9VfZN}I$)O4-@F zh6}OXH`ps4bopaR#_o>FmN2XPV?B4SdT`}Bp&y)w0whLZ;X+E>_0DWlXl2oA8Q>KQDXn?a%) zTG0lt#P~&R{QJROtMi<46LuV&}|iR z!>g$ETMDz&Kv*k80?9LGyjb~9^)nOD zt7QLrHy}W;DY#Ye9C&o4FuBe%C{$D2Drj&S|D(LzEAmk3Qbwk^a*d}W8VaFOYr{gHt{{NyKFF4>PH z7pYy}M>rN*S!MiJn!sbTjd5Xh<7{-@1tUygeNkYSDq8!O8?;*^@sB!lwu^XfZ;P-% za^Y?1=bGwOwJ(m=ZW>PmEYF{C08nZQr??i!Md40oU>qHajxEMwGu6%gNMd$aZg|Fc z8WR#E-m#GmPDWUP=ZEh(SJ=ysrv!;=U$q8a>TN|RjfZ1y%4ovCv|y?;C|ac~XA=@Z zQ!y7;Fh`{T3UmeFQ5t^X*jspVdt>{sOb;i~SS)x=@!TvZ8(-es7 zccI^CX(_M0(_1me1MYHUJb7s0Uqz#CwfW>6UoA-el`3r>vb zH-v@PfkFvEV%GBWsTqt6=3QsFt>I~+-_TrkhowSJwSUEQ7$_hlN7vycE)ezd zt<8HP(6HhE^ZHOE6o=)U>Xv>lD2R9h^Fz>p}ljE9c12ZYI#knq!; zRlKmoUk#iKYrAI!9QXC82OdkA^-tLQJ!;IDack=@=Gy-N%)OW}OLsM{M(h1(tWLZz zik78^b{+ZA8~R^%GJ#hj|Jw_l;s?je%y5K4ZEa}21s$(hf4IqQ9hM0gvS<_hgpqp} z9F*$VxVdcfx}`z7g%WRfuZ1wN6IQDWNzt$}E|dpsI~T0qpTYt^;=1gbycL_qkHFk3!pjY*p(~9Q3yS7dLKL0L9fORxX?8BG!gVf9P93Egxgb-*OtpN z@ZDYx+6LJP9$MVt#pgZ@WVi8prJ_>nTM+RfZaJs8Lgi+ioONZXJ{*!mI@7%AvcH#j z^r7fUS>WAs-yi+M*lV=fLiUbnLqUWffnpOnz3r$etrdFI3;*gIvU3#3xV0fB$kj7AhSc*A)A|BLb_7+Zre~lIXHYi3{onc_*?Y`qhStnM zh^TLk*@>zJ^1t#vO~r!r5?=Pl{FYvW`GMt46dk6)*#E=cdq*|db@76+cPyx&QY=(y zQj`vgm5xYnL8^2i^s0g)N>M^@5fPDIq(cH02t7)XPQ*YW2?+)W0Yb<;N$~yN@7}xS z{xNH2tywdy_wFowKU~|Q~z;ke15Aj zI{CP%z5;zP&rDra?N^-B^1TPvsn+Fd3ht3p?H(UY}56)i?SztK@JX~hE^mI7HYry5yc2){MnILLnc<_yT_&dC$k5pNg5xTZEW%)I*wfQ z8XJm(28JkUsY)KsjYuG^x`Szquo}Oe@x$r2gSQj2%sT#)rV|qWrWOoN zGt#$I3(g5!_8Sz4h5pN9lftP*zc;jg=)&wF=j8#+b@YRY;GNc{zZ--G!$rZcrtjn^ z{LxV2DSWCtb~?_QSQoS-MJeCY{5?Mf5lTyOd_Og~NU9oXtleAZZ{KEin?rrPTaH6EPs8>qJSW8`a z^rrCmX9OJ&425HA$pwA)PUH0>7Knh2s1y{%3UWskJE4qg8N}?jt0ixQRO6*--u$|} z2pnSADZOxfaG^{)oqs2oemQUDcGr(phV{Igvu#T!M!2ePJp5C2r#z#+ySHi|Y-qm?N>{894XJ$b_?lel8pWzRp6h95WuQc=UKfbJK zxd0Kjl^1U|_hBDd9W>{<_G#hF=?zM?mxXmmi86l^{zqenO!sx-Vfb1bo?Knv`9)Sx zwaM+HR1F&Ykq2;@IZnnAf?jO)WRR$LbEl`Aa%X0*~LcwI)D0(27c4$-vUigjxD_qmNPkw=!?hi ztAYI5_?faqZz7B@h}Z3vNXXVlhhHaFr!Fw!L+a_doBLsPihWCC?J+Ic)6{D~3Mw#K zZE|)!Xf^a1o(!uyvf`Z|3!Pq5`Hw5Dd!M83(ya-i8#+MfmU{B#YOfm}AxJN!IbhaZ z*!pOBck75a&w}wyERb;64ZZ8YAjTu1+OjKM{^3%i^2v|uE&|9!%zNNn(U63$1Hhx zx!Hs;!Y)$+(3w!bNix2{L1cVr!Nd8DDk6Mt-$sb{I73za(x9a*{EZ{ zn%ju(g#NySsck8g9|XS+&ze=ajSmw5d$ ziv_>AHm$R8D*W3Sda3`iSkVUCc~GJeV~57yFmzKsH9aRpM{srD`>Y_!`wv3`iAMe} zTHycBw$LTBhGT5NxLz&<9zrbU|5Tp3{L4+bWCu9nlo~lk|7!HY##JCs^Iu>ZK+8MY zFkFZ~Pk)UB+-)Ah*l^~rTqDh&xqjYoF&yE?3JChgUEd`$T4d%ysUN;k81_n;)_z1| z6xbf@`zMth0D5(rw7C`|;X+!($ca(;XGgkDGJ^yDCSu(Q+|*t)u~a2pzU#_A(}$3b zGN@(Y_0(`i$hTB*ID6C|4DV)J@e<~I?AY=9{c=f>m&iTl%#zP z-*sDL&$dk~%DQ#HMnJhK@KE(KEj~n-XJ8Nb8_p(>D4QdLE8rE=u7gZPsMFfNd26h_ z4c@!~uTz0jlgwYx@S+;~LjH~M$|#cF+E{mllPGx7&zED(QT-juZZK(7f*TEI6G3;7 zsSt{vi$uZ03&J1WrGC=Th_FHr_R|{o&Rn{sc5hfdLK#P=e)KxXdm+iE;7{ig*CfH> zPYw{&sNe|vidz)@zt)jQ%4G6s$==ydT$Cl7BL@JA;1o#1YWCevTISXC#CEv-`lI%$ z2^ug&fSpO{6`kFIq!OJc_>~6joi_b{;4n37H~i4tN>(DXq!}Qf>E->=mpGI&XEV@C z1^>T9QyhwEE24?OEkhZ`2!}~QO!2maTj>$ zW%zT44tJfanlrOfGML7I9mOFwxDQZq`%;po|HPQUyPer3al^J5qE64eePKQ7b{f1M6HqU>Cy_qAIUm5cc9*Fafc0TSu7Ck6YO z0|_wlOTw!O-Cz-l5*0`&1aGEGV$bFTHvpfgG*Dh!Sd#+(M;S`LT{3~Y{DU{=YC50! zREp{b7j0y|NhAkXfAh#f(R5SZ7w-|I$B$EwzeV+R-k(<{UG@&-e{hPhI)PKscptMI z7f_PnG0}LQvNPQb^+DAsgnD;ao*&@HX${5A4#EN=PpgAd&s+agex45Ty1s^jZ)V(XeE)IbZD1M3Q$7Aef_{vi zlwy@tR~phYEKx&eA_N@u} zzBfY5g;eE>Uc;+D`9MN&pSu)caeoytLgwlQIQy`==h4Tt@LuVLWBtvfAM%L<*#+3u zUc~`q0X}nDUu%nKd-2WbOD>bZ2eCvxif)~XoXPbt&LZSXS)1j?!Ih2DmZ9cwVhxZn zwK^*J)~5;iXYoh1E<7R9UR(&ka?C=hMhmZH^m9zq?WQ7csL+(tCjIg8Sj2(}e!)4u zi+?XOc=T@~cp$g15Yl?EJQZO7f2lX$EQ1tQ5|V$Hvpi8;%16x*sX6T9jONx5vHTx7 zKF&1br`(+sOST7Hh;&Ne=W-Y?Y8)ukU4Nff0RhJ z-f?Y{m3U zDwTEp@CqwoB!C)&KtJ98{|-Rd}GqWXN#-*>P>lgu)Ab%qZt2?+G<*k?@JX z1+|I{rqn&U)q^%a2ZxcD!;OAmZ&Ef?QN>(SeuX?@`Jz2F3HPdN{^>9=Ji4ms-s+8+ zij=RyRdkoHa|W6rv2U_~W@Kv~I!8luNmXEb#sk|PydVtk%<37b{*JkRxl zYg;0Y-a7gbYhUNImPFUHmgFa1-fmXDKs{rxui8ljFwrdnIs&wi2eMqp^K7dkRl7(p z#`GJ#evt&LMi+KF0w>#2^&3E#Q;$vgLItVip4)%sBc7DU3J2PYJF9bVS9e0vC?r~{ z7EPnMbcZbSc4cr$oov3Y$onsvXDGYq=b%kdZtKc!Sk$vL<)_RKNp6SlD7gb&qPMOn z$DhADDKlCt#mQOh455G1^IA-)I zB)%UAGG+72J9KW;n)iZ%UXy*yU$S2lL1{0SVfkVWuJDN-_$yI@dmRx#AU*T%A@D0& z|9h6Ri#oQr^DpO~)7Tyap+We0qYTSeQH(Wp`QMJLwm_g~;MFyTw0Kh028{kO!bxHe z!1_V;t8OjHv0fp-HDqZ_Y9p-00LYohT*FqG)vwY~TW=17X?yPH?tHXFetbCe&AL8g zPCaON+tpL-B99cO!}fqUrZ@S+(-sW2mmHlM+17;=jz1SVzN2T~f->mg-WFfR0pN#& zZR7s5a~P9iZqV^bRp}?oI`M2)r_4tsA`iQSvWVz3Jvv>_iqIq(6^* zy|Bh1*t$Rco(SV7nh^prJIC&{Zx6s--;N#EdJK#->oCb+ds2cv&-K;X=%rto5Xf#| zlGmT_7X)P;{+}mtEf+|Y0m40%_kXlVjOpp8b%__-u_oZ{o4_ogt^P4>Zdcxtye~blRE^m_D=G}f@Ur@(LqoxgBuW6ZQjKm2OWaOh9ykg19z4#>Xt z>w;Hsw*(NGXdZTTfwmLr_Ar6A1Ge#^Zo*IOi>IM#1+_id4Z_-TVdMbED*$8jO*g_Isj`{o)d zLM>=5sVaBYZ3_G#DBdqCI3jnppbRreJ0PL%$6LUDDqhp_ZDnc6jOhQ^E$y2h>M*HCztl00$n!x`>a#11Cm;8Ib4S!yRC^ z-dMV)E3NR%UmuF7Hs~Aru?(1m>RHRue|NW5NKl|`YIH+N>wA0Py=Q zsm=o^9FB7rlLipiMK!L3@?4LY|4j9cUAa(I+B%2((#Rq4B<@3(4{E2xZ`;eYu&Ji;d4I0rD^{m2G4KpXRiWCY~3u ze|<{rNpTLHV#-^<E+mG3Xaly?|yW7D7WwF zUUT#_e{@{6dAEJqdT)?i_jR1IzYfALIGr{TusPx5{l8ru@RP~XM(kX~qbZxZW$;{O znKj1_wgQ-yJ8$SX*{OZB%0H0@eNE2qcd+ZN0Aby=vYtCf!YIG5yi=)LXeKe@-`hH9 z>?H3P`g62L?`m-M!ww~yWQKKWlS)*1v(3riGELFEquwUlM<*%=##ixsiS~HJF5|M3 zW7nJsh*}Xtc!Q=T0`aiS!4%j<|kD!~g?0cf5htDtWSe(xI z3csbu{1SoVoJi8`uxOcT;N#yy(YzG-&x+zL#95u;xlq%e=JWvr5il{AeOc8GycLjcd;F`#Q0`e&z z&ew)pcInF|c9zH9=?!A)o4TB-`i<1`Uk{^?f%iXo<)0LA_QAN&% zWnu&9X&_{4R)=pE74o5R-O*Y#?v+w^WPtDvzrBcHyoaZkTVt5pHA>w_8|V1q3!9U> zUZ;`tQaWCR)RhHImU?ZLL_fc6`a`8o;O0;r74=AgWezL*tlL+&h`AvWvvqb)96Up@i?7x&_!U5J-=03h(AdDXc3eX^c@trjM*Q#cA^U zN$dd31L$YcmeTH;1FRchRR61z4ueAw)N=^12%v{re+_5FCSb*qm}cVdLzeAIz)X!$ zH?Xtj-r=%KpJ@};O)VR)YxXtNhM#0S`l_|;#^=hX@!y+Tb|pxyW>%(>u2WOrOVqTC zG+2_jDbzKth3jrT;vsqij7eU^!t$B}eo=*GRk!R?x3t&1&*M>W$uJkWd-L-Lq-&k> zC#iRM$FB&G)v_6!W`z$V92juMKdBxKXhJ*2OINq#$D`IPgX7Y~gF<&K)~);UOV+jg zX|QyM^?T8SF8^x&$z3|D$sfHYYw?i}HmE#}p1ej|AziQ<9-M6ew%V=dZlH6`I_Kv<0#zm|3Op!Jm}!pO?6qPg!d zQ<3Bz?Lsr?X#RbI%-xh!bW0_SW^bl#W7OaW`(;MuMKvSE(9{8+x@GBjDo$pBd?+nA zRY|Q7J<)r*ekywrjqFE?Q1A$8+JK{7cfvbHZtF2*U3sq)U7F@kJzC_3_gPX>2R60} zQMW`Gy)A3%0BebmK|b z1A6)ah+xQIEuXump+}l5x^j!y#d9@`V%6P6C#?|8QZ={ zsL{IaoE&97)x4>9qfEp0iGlWxo%`A4K<7Zv)8Dh6+ysG`|BeGsA3pSz@^Ex;xi977 zao^cdR`Q{zbBuxB?L+%dGbe$SnH?A&|H1ex2?uuzR0vBz&ckV=C zD}UnWL9&Tr<*{RhpFbO2%&~kYDeTwtSS zO3&%tH1k@R3?b&M(f>@s0|Lrxa%?6^=BV(ggudGgjc)b6zYVN5&>`D^G3qX_)5B*> z!p{T(kTGElY`>BX8H}sy@BhBtNjlZVn5k_^XCEX#9s~0`JR^t zt{xPX>0p_Y)us4w4ZokX8ZNTk#FuZnhSBOGXm!PExBCI&JaoU4D+4Ua)!Zp3;%_%# zJL*IP9zXK%eDAO*;T5FayxJxePbdqyl(V@!fTY@(M$pq?K@nlJ5&Hn7V5*8dVllb= zD~z!Q^U|siYf@MH<#`4i&Mv zWRL61#?W$1(OBFJu1rEWvdNxGDqL~n|3KOW%o*iS)ju@mpTyY-4jd{byz_1d1&52P zJIlVCuHdAHkH#pFzj9(^VQV@(O3OsNKUiEsm9K?-rsb}1!Ws<~ip_C_=?|hhQ69gZ zxKZ1u;CcSUxrLaevU-n{VPFX!PIR5qxmH{@L3S4=k+y#vH-0y zQ@$GMULSk)1U>=-PwGnSKGaBSo-1v#PkNDkDiz%% z+xD{d(~WBYQ$IcFCv)b)^y>a#BH- zRdu#rpN9XW2iX!DOQ^NPyqA?q$SmN5LnLFmQ7TfN@KP;&U%GpQK&1+vZ01Z$ z=JWEI==8rAbAM75;2$EU@A;BHGUUB~2sVsrs&C~l4*2w*X&$SaTITL_=Nsy5lrdk& z+CX|QlRtAIF71wtByZr<1*g{fzzICP=saD}m6U)w+*=v1@@{;vSs^pLX z%ptEP$tg~T=q5%K__lrS$A!F83yjuyBpEPVTaan9$cha_&*~#}tlo|qR7ran@%_NB zG5BrM4aw)0_5plf0$0hJb;Fd}a=ws^rS+MVv!$c(%1nz>arQCTk82L42qLP zFVu^9eNP9p*qEV(?>I-F5}_oRw==mY0U9L(h;<`hz$Q#T!awj&>*M-)PSlG%j6bn8 zFcr0Q`H6?un*r4n3toK+PT*AzcWA@$DJ^HOA|p0hFdt!bcdJlx8zpRA3lM9bGfo-3 z6bwHjP~}hS4nNZ$6Dh*;@Tmbj&8wN*UeDO1$)D2!22l%blnMG7Bm9duf-&Eo+-Y8@ z11L0}Gr@xUavY8TqAXqm>~BG!m$z9uwX*v8z$8%Mn`E*k@btw{=Q})8eGB&6UV1(O zT)ZhfE*(2cs|HjSkgoNRor-;u+31A@%-qp|JgH@)@odU#jyBc?Yx+xeS6aOaGfbJ zhL~I&oA`;yi@AuO@lsm3slW51apKZ?jn*+>*KPLwLndK#0bWpMgY{qPo;q4^`65O_ z|033MTk{Nd`k=Juvs2(NA+nA@N^Tn{l7($<>Kr63Q!O-M^q;^xGYq_S-Xu znWWWJPZ|qb$xjH9fUzBoKu5ki!ZZ}W3*k(Z44vOfVn{iI$1aXf%{rX{6u zvEI;KjEAOatvMV#xmIb~mZO?l7T8B61`R3U-10J-(Qfc?U}<#Ygnq6KD(jsAcbIl+ z>j+;PYTFDsuck2fKB&HEoAQU39IkMsd`Vx z6`T+}+Hx6Wq;@}y)Y0tb)ena9esuz|MHgomEw2HZv&deJ#*aULnBI(sAaPq zG-=NQc%IUjuX`_gVF-N&7`sGa=V|DGy->6%DQY zyB>i@)1tTsqaAR$Tu-lEXDU>)21eD%KaIKgb58*cikM!!xUWglv(Yh_Rv6{7PJTA- zRrb-ov7*t{-Oc4Vb(B2S3Eu6W&CjJ5d}%@Hf{h9M0?xx$OU_BQYo1j#wxd)j*n2{M%f%?0sxF26`SkoHR<3(q2#y9eEy_QvPtR!Li~1Et zN9*L(E*sOwsMBW(8f8wJooi^E?Kf|dL7bC}SQz!59Kw)aV#2_3*@tGMBqU>(3Vc!t z@3pLHD^^B=zNt4<<*KJwWZMF#sstp2ag?trw*$niFV|i^T=}@ZSYc%_dg4TCm`p&v zYU4QZ*$D(%mdPWwW&Q6iR;OIB7lN4nc%CV2|Jx_^%SBa1kByO=A>b><=@Tb#;J}r^ zuX5cHIZT#OU5Jy?jr-U%_hivKI65J8bkA+?q1jF=$0kLa+KtQNXY2ztCwy1Q19z0DEjIGX8&#Nr_B+g2f(Veetj;H!*H#K-tD^gtPQ~aOHjM9v?^){ zg-P$~{3UtVI&%8cjy;%`jW3<#pZq!B{Z)7bQBJ`Y^YF#aeOU5zU<4hovSE}TMOtOU z^cvr|t{}50?o_w2QU#PxN7C+g4c+1V z13WSK+;|rF?|88ov|S5m-ax|kMS7RxOqyHYh36DboAb%XX%EWh|JL z_mi}zOzdMjrT^>?b_;O1=VfI;p`<&!K})yxVC7%b;E8*(3n*&-?Q$Fs3;SF`j#clT+ZXg(9VC(P)F>A zm@Ai}l&v=ogvNs^Z1L#<0!%C_=~5hX3T*}JYr8I%vyu2xMj+$%=J^OP1 zFFm`qhA&$1noXK_uUPGN>{J0N{CB(Bk-#GZaX%mzn>}!4`{~^)R^uIMECOyd?#r5@ zk#)MoNWy$Gl;GoZ*tTHoiYd3OL;2X6fr8GM9?<5^;M zyrPfEu5ExoT$gQRlJ$+v=^L!^#mFVG<|yK4_##OM&lEEVYjLIuXh6TNn$TCAP_>+%=z80u&{U$-h$q84g|X#VXdqdH=8k%8Yh37u$7N1OL=Lv zYqOS@y$r>}>2mDdXa6NXJCRgo4_A}5x>zHCE4m65A5FbB{{{cN3#9+rZ{j9QIz z0P}uyGm%a5$rcA^UuL#7M))Su*OmZ?bJgG zF!@2wG$CCsk2zsML!==T`2V<8!^`6P%&R1BfazJyH^^}x9E%5L{b-kL#v`OVQZE&7VQO6bL-u;DO_Y>eh11+|Bxyb4aFgk2i z|ADnAJxZ*nAK9z-U&@B982%Sx0W6e@GSeM%GL|i?@Be3JVhiJz9I^FZrBOcgF3X+s z!N$4Yf;HhSerCzdmS_pFI2W*D7JLAq|7r!ZEsMY&6rfbuW{~ahsr=r5mNlvUX3i}6 z_;-6wS6FhJuUEj?01))*JwKUKtoQrb6c9fp#bSH5<`<_#M{*mn*vRnjK>V8~w^Y1< zEQ`t)|NCeZoUO^OeEz8evwIEA^Q;ypS;F{(;2UtGK=}b%=WI#nKa)Jo5|MrE`aS(; z0jeI?KKge(ndc`Z4R9Q$1!G2wT~joj$nxHL%SF$!!VY)>7F3$~tq#Pu3kmJ2<{l>|f!kZ$zvt z3Ttwu75kSQf`?BY9G^gRO1GK>Z(V^Z41y!4FRcTckPN&DF}j_YZcK~e7EC>CLM%46 zbd{0=HdK15nFQd7=>Bz|@wj;nta$9BW&AGCBZ=3~UL&!c}VDK0#2cwD>GX*%y0H?7=sF>U?=+<-ltI?04;qe4Cv;#=hAY}&h4P9nM_aR z1n6{UizJ`K#Czq0tH3_y-u_Mj1H3KM(0!|IWU|?tuZK^lwWz0x0B^rP$nK24`Sa1U zoYQ%u=GtkUCqO^b2Hcc^t%J%(*MhbgltFJ;Ks$!gj_l!FovFD9Q}SF}txJF{HFC#c zRF34uJYK9s@aK&>AMOd9upfP!HNc<#V(F`QEVLyAJHl5!Ms1f4Q|=Oeda?2~Bn8RE zpJDI*()D(%Q&1mHwxvZsJy;x8zA>fOhqmp`+wmsX=3sHeq3C?mXRXq+egu^q zBOgzW9*!YKBZ-O_nvces7iPS->J;pYIP9aB5z#V}d;EMC4mZOMZxL>LtC0D_*!|To{*ORgX>KjHTJF?4LW| zjq`PmO)QIxe~^Y#3^N(>ZxcD1*(QsWK>7s?g;zW_yRrmHQw^E$30P>dGxAoRnnCr5 zN*8IQbif+;Pt|QGBI;Zd++7_&?pLJ@DVa*ZP8*WQ87~x3-gTmo3mKYnv{Um|S=0n) z-hL$cyy>8iVYNL6ZK?;70qwBbHW52bQ!M*fv@)AkdQ1U@x=#|ywC~>c-4s{BAc}x( zn&oaqh>v{8dX6Y@J#69uP8&I3d*(Ob=h|}-+Nv_apC|1>=;T_E%JLHNd+QS%+x}p7 z=YyP<6&uq(6QS3#nvUYU{TqCe#oX4iJme6t4`VOwAjhhQbYKHb&J#%OqLm5Vmk$Jl zpD50CNUNGvOqzsoEP4Cvx*~idldRZdf4BgdiX}%2cK#t|9{HlR=(bTP0;311qIegU z`Y!REc;g7aCM*DL#ddQ#t9<(zqQ}JAfrmdbNGnhMA(zs^b%XbjTGx_w3^qF6n;;aFy|KSK$#GD%hw ziW%~Uq9XKu<4#zXy=ZB6Wr!JxY_mx6Ij>mVCs2{T=x_o2f>JEmKo~c%Y1N;x?-Pp| zJs1@0%E!L~koW^B_Rd)Fbn|=N%NM zHby&ep~^yuqa<$Q5}c^19asiu52|=C*D+}&2yJ!hu@{!rAlqJ=!Tc` z-TUiCUDZ$L?F#^E_Q}@$HUp_>b{Ti(dX}}`n(<6;c!_b&TXPUE_!=to%;lo+DG#GR zPOrrR8$Q?CEG9Q~r1YgUq-W#|sC=9^X-^k>q;Ec3dGGBc>VD2W`prYIOiol#!ra6` z<+|0trrOm&5Kqc8-UE@KU5l&ln&&?|Shpw_t;})v8jSkN#Af-bI8QqFg3DY>QXJgn z8{9A!nz#8P>UfXE3E`G^$H`(!W|%JQ7BZIF%~H0DWdq*YK4w6jF+x~JY1 zuIVf_iLUnkSwAhv@LcCuY(t21*|+3aRF8?)!`cDdCE@8}V+y2dnbVT1@7cx!ZDjAl zti1&9nV$+jUg}X=^fJRjA3aS?1$7K1tE_da%Lj(fy^|TG7OgB8(>!_LXX!-gj3@!A zgjZrV`6pheOu61o?3_>H?zL^0090I}1BT3Pj3{s>^jH@y9sJu;wrTk+{|ACe; zOjy}UF@6tb#UQqEdy0<6QY;z5H9KsphF)uqh!~~kTOSx#DiG8(At}N8s}3vXHp6Yz zi%0cfUxxa$H?Q}e*S$3GBW>~ua{mqb9qO}(4zyC5`qCTBA*w4{oDg5= zH$BY|$1U$6sLzTNxA`&-B6FfkS9wx$J|(dyq|f@V{?BG7rjCI*V6u4b2aBNldOS$ z(o3LqtxswsDHW%fn~Ki)OPE=~kg*NgAJJVXc!ZubsKPOrK7BUjq!V_ZZTIYf30jf= zt!e)tD{zju)0)i5d~2?y`p@vE<4OK!JQ~%o&F8&{yIpd5E^qLb;Ubq-G7|o6)mUN_HurX8EvmMR8T<;xGT&)~MOX=2|e~P58r6deFJ`M9S`fII65US}FmY zxp~H{ENbS!K(h(@Ki)+D)X{1MObz-?g94IG)s!eDyIa4dH;tjRR2wViPEz?xtzad=)W*%U!io zJ$0t_3zm0tlKKc);cjur#no^3&X9zKZ%UPqwY0yU5fMHuW$yQKs8nvs`>0y9VyAeF zG{a-Hz|OaiZ_-xh;{yUc8z&UW3uWj0iZ~7EN#=&^?wCG(gD8!Mn*j zGrA_flVJCoRDwE}&B~f#=0Awz?rYl-zH85VUrCXibp@7gE>TVE)nNlQiS?z64@=bh z7Tf@3Eqtos%$#`4t<3<>AX9=nFx{Z^%;byTb!Sj!bEn^B=EhN})4<-;_Dhk2%uVM9 zJp$hhavoRu#zbw1VFkUHpW4}cgU8+Qw3E>$zHNwzL;B3t8?8*N|BVG8I_hPJTfm?N zr91Rsq4}z4%wP-S`i{G^}U=kD$aOZGrgs+0@j-d z{_@uP5%#NdDJit!#Sm7p7wMUpHoHoSDUFe3EY+GkY1#|>qEe^}6$on@(F52NlFXq> zj#Tjd69b%;PHO5s;7h;X#ARICq39LloGw#o(S%_U8(McKJ0_xFC*5P~p=~J!g{O*%|lXnrjZTPrq zLa&UdIC+RQWn!anIT9*UP90pc;1}5BoGX2EExi@iWnH~ug(%#`h+CO`4;q1yD(8vc z_Zs&Pj@Xv=aw>NrOkD@J|9E$d17cMT{;)~qls=+0i*)35Q{k++Fl5%pM%E4c5~U*D z0k2fRpcWN3wR%#nx>FRhhu*!MTe>3n_VomX+QkAW!77d1gm^K2re+6~Nvrw1|S7#9-WSJzZVV9YI>ujsqlqMhVuY|2`wT z&;9n=ucc|TkZX(MbwWw@?dP)wHuU@RynRo&-saI%@EJyzT775E;QXj3z^Af={QK(9 zBAHIxM?<_X;^O!nLzXtTi@!@^92sHzyRYJxi*HnUeG>rA#l87Tuaj7Qq&ES7zU6W+ zvmMk8ay$p$qUBjfa;%|Ebi=@ChieZ|p2v%MFwAB9;a(|yXSaB#d|danFwx-GAKA!j7pV}6?A#miyI_BGj6FuUGz&Jk`3v;6fVLYqrfu%%a|4Ke(uBD(ev zM^8mL1JQ-jtu-gzE?(&`qF?`XxO^S%0(s6h<~tX zKKHV2>kjvO&`nOM4;DFr>$1DX`!E`7mmwq02t;}05`WQ34_VE}onchNFBhn* z`>V@DIbi9z$08kBys{*%goJUUsT*W+j!6x&*xxy}Xl#^#q@oRLgo{=Ni{SU0>80Jj zrts9@(qXv-$ZuE}=*l&`NvA`(Teha{nM@<$7I-JEmupV(Twqr{eQ-CGdcc_Wn!Al= zZyeG#Xs>v5Go4#dc8%=(Rm5fW`)*qH*VREXRZ4tf0TqwwOu&JusG>2kmo}r&%ZdR@ z@x&U8y?&#bx^r`jb1XGAfd;{ZIiXLZ)j~#z7Y-%Jd)O>cw8~xhaF-Ss29bdv+e2{A z0?sdkF3KE_@+A0`)1_9`TRM>=ml1TW*mnC(hasEh_N9ViJ2B%0gwm8gA}zu=_F@rd zL4p^f()Dm0Yza>$^H~e`&60_y`HSbmVQL6^guPMe#UR~c7atOqcYJ0pG-i3oY`2?^DQ z1($S&GbCOOlcJpjF4{l@wTtul%uX58 z2R?#WN7?y+h}a_YhL>0_%$?NFLj4Lk?_1O$$DmTn!jmVoXJ%}@c;?y_CvR4EhC_bI zr=P_|710a01kD{w?}~$5UU-UNn3RO zmE@f{qD%=RrDTXrKs_7LFNSK!HmIudpyn3Px2vbG;H7qbOSF326S2^R`AkY{R1Y9_ zbM>s5n%Uf%hB=K;hwY7WJ16;JX0?o=3F&apc*0k|9AydN&p~U?k#@%+YFM~2&FYi% z(iMhEe3L^9jMr;`A4&hSilEpGSTI!N0BMQ!5Ih`DrB9NVmb@W1y_D{U2IBo@aV5rz z?ihHEBRDgNW80gnIL0dRW%M2nzSx8;f5%Wv*CY@g*y{hP$t1_PCZU$MgJ;7o_F`I4 zX}f+M&w*BNlJ&wAr&maKn@9Ag*nV5vSvyclCq}O2oBt8WE9AkIc63Bu?^Td3nUYfE z;B#qk=)@yYq-z^#gWHeVV||nVf#OM!*+V!5wjG3g&iL*Rgu%_<`SR)PGq!X5L+aWU zPo@j^SjuiD-&GY#|Otj)|`gUAM5K?3+R?_+kGtUb2ksPaaIxWaB&M(?gj6 zlwn?a02>Q?wVNJ(knOtuP1*C;!CckKQuF-}9FIVmxbQbCseDhrJeD)Pml6#3T&A&x zB{v+>buZ_bwl;ms4Lvw%)zr!I70abQ16tn0>OX_P3jie7z$}0UxKVicMoXxd1#3d! zkw7RP8!mc0_0u5v4hL&s56V&-MU^^P7=T==|FZuL8>Z78l!2%CFWYgmiO^tEJ|6d& zjU@f11S{LUxy1A!Kc0%8=r!I#l>HXn%L=zln(;}+gAL4?39=BtDQKN+8#(?-CDP6uDxXU_9^*w5X+FgpBZe`&pa;du` z|E>l%0LDCEE;tr|vtK9XGC>KsR3&4XQQf~j|7Anrwu<7dMKQ!1$+OqQc{?+x=|z6l z9gb&Pbduu+eDYwHLmxt6b!G6Gjq43Tncih4K9lb$-#9t=H@;PO5+LZ-kmvkDCb`*I z)?=G89gfDWRso!gjSjpeVNd&L0-f%E*W5m1`-VNF{QJOSuCp0HJMz<|-Pb#rwC~No zc2I%^JHH;>$Hs<)W~Ergv<5q83|LIE|DDQOJPWcoR+!oNAKvczBDll?tG*fae_`Ta zhN8m)Y)*;^-k$U6&0h>o?l(0L&0oz6a69OLz)jLG*PqPJcLfV)J$%CEm^tEa;`8aN zEIz>+)(yw$v2m4#q^A1+04wh{@&`2kuAO#t3LANSJ!Pma3}uHkG~8vFurbWDhxSBv z3^57u;Nr~!&Y)XNeCI*YU$}7}YyNHh-&ok#@gk@u03I;WwmU37dB-AKTViJb@KD5& z4P2YE!yfV+WLQEfm-?4$c1K=2_$+cu?A~3AI6_CT=!G@3POkpJo@->d`fe6s_b)Fh zK|8mwy2-&fy+kI&24Fb;_hxFCoxdrxN!Gn3!{X!ZqNak%?7)VzTPTgN-|jCThBI~o z1b^0Fq5eFJ3F=?H=W>br>zi^mTe&Fkw0~pw(D72of`xXSXXD(3gGB!&JLq3-B92sk zVKX0l-X;N%Qkky53WT6j#Df0-YXo6oNQS^~+_S+~U|sMmr4hr1VU4;9{{q}BEc3V) zefrJ%7_g}U2zc@i-j|JV&iOT2vttbsnR=v%g~vT88rIDIee18zRCSUOWOFBFH~rcm z3!}Pv9Ui&oFdLNaSAO{C>OnR!GYAwKeJhw`(!m^vNCb7gn~Jv)V6EmZeEzi}20+rQ z_5ew0+0gWRJt1W+rUV~1U_*B=K3!5`BZQE`x2$!)31|-p>sw^qt?-F0oO_Q>MmSSv zpNHGjo%v7D3?RnVZ0S1-#I|tP@&a3U&;iG4x#yZJ{P)#jV5e0!bH&~VM|1GXun^{( z!TKuX8(ZN4!Srx68-XqqX2$0{I#vjTU9kfm;JnKIU)f6O_y;j4kV*dUsUUHWUhS4t z%}SOjv9aBo$vPan|6#^lHU|s*MJd^U=xZR*!DQ%5R5>TLXWW^GJA0HShkB29W5DL6>ZU|JK+5js7K;iE1Z(NZoyEnYP8Yh0sm} z3-;fI-z5~yma0MRNZ-F^x8p%JJBVo4ttcMz&*Fxo+T$nPX7(LDg;h_hJR0baL;lsRW>C2 zjo{bxecu4vhT*Au*lOUNyqQH&q9&`zgED#UgLWdUUaoqX1wfM7s$}6?zhM+h18s+M zHd?b+b~*ev@Fl>v-0Od3Kl|b5eOsuprUz3uxBk)$YMyyR1Yk&znFxEYqy2p@s(~FY zvK|@!AJaLf>iyf6=fi2BmPrU2hW_Tix90;e8s?W6k4l$o>#QdH_W}S~%I@!{xGw`c z0e5&p*u1?*bZcxdt1})nGqkz(`kQY!b>O!J`_E?Ub>{*dSKPrnR9#?C>2ILL>4Uv9 z%zzN!M|*aivS4Z9?RgG94_p9w|7ixXY=+>Ji_6c9hC9zsd{g_e(n{enqM=u%uehlT z;vIZ!nd;j%vyqssOt>-kgut(W$7L^ANqHz;_J@0$Qv6JCUz_;r&rQiKtq{i7u$jLe z>ngN65esf~8EawymHdc^&k9ILd?yvUnn%7$LBj)PL(s?Nn`v2owG*ejHZk(1;JT?D z!{8RXrw?mrTz897cYS9DdyJ3}6;hH%nnCU}?oz|qMydjnn>@UAT>ZhN~DC) zLr6&83GV&u{XDyj?>q1Lao%x~F~}HXu#&9BTyx&neU+I>I@D0qlZosN8p=vzi6tmA zZ&R~I?oJHdTQ20gR3Xu@=&>Y7e&tYN`@sMvFYp))-kVHsvY%@2!XOU`o-)^Qp$9)+A+jVMxk_%D%^Ir6PDL@EAy!oHZy3)ygevS|iDo{1SKK3WZYr)i zv{a$lbb@K9w4)QYI4H;Br4_=1kWuE4oRM&SI<1m6Ggv`?ziT3B$d!>)&=E9t%OPcT z=F9JTp9O_}=h{iaqx>}DPh2Pwscy&JpgDfmp2?SudiFLzpW)v8$va`c{Wo)GdnK1A zz4278nas{-RP<6o&LruX+*y3D?F_5g5Fr%8%1lG09(&OkW(#iVI}e|SC+-tf3)D93 zQg$;eu@d9Not$bKDdC(7F19!mBa}br1}}CVsVCj0LcDKJ`c<9${-H=RCUizYs#znB zn&Zw;Kas{$sjXVK@OX7H`Iw>PxPJW<^ z7bpvx$f&tVr<@6mDOsw`$0BVQOFh;b5#|f|j~hO$;785fstHGPDl*-Bm$P4e4z5u{ z9Zorc(#4^rr)Dp|Qm?j|dL|1t4N_*r&iGX03lL4F4gzG-SxCqnHGKzb)(x}W3q?VQ z3616*Wi3Bs9l^PcOnu4#D}r4v=oKz?)hO?^kM}YnBnk$)TdllU8Ug#eM6pWpSFJ){ z8-So_O=~F^GJGbS64W`Vs7DE?GQ>Pa@J%M_94%g*D(?){H_H-t^OX25lKp+-ue=B6 z4(guNw)eQ`z|}c_R4-u_m~d#!yGuG`fFoX?_O-jZS65s#>;qUg&kLZ&qEPQwrK;lS znB7O`W}h)id1HGn0y5PR+Ki3CXYE z7?2|o58XVQCMFS6qoq^5D!Kif3m&`gqtI2HbJ2CW=;byuK`;|@5X>oHqC1%>^;0gH zHU_E$6OpL&H4)Ee4Zq{^Um@HH^LM`VM;3k>$*-W~lawgF&Vd|X zK3Jq$$6t}_P?|Gsxvj9_&L&*@Qj9apg1&etG}kZS4*9k5ld^%j$Sc<1Z3f?Pnrv%2 z8IHTCw^u zOnUN?XOV96@zuUzek-J8c`R;Okz>?RI&R{GR1r|6a5zOmeHPlr2~cKWO@~i&8xNG{ zj`sq$u;RXo!RaeJtCFU!+m1&fc3rtcKC+#&Vo%hjy1nj=!x>RkS4b8D)JW&uQSqL7 zuRL3A+YvyS;$B`*ax(4GuAB6+?aM1a;N|k+SPO5x8$J~;Fyc5j^yE1N@4-{vKC04fH_^(Vddqk zUL+3-2%Oc|S*;jlAuNO#4~fE`$;3@3dnkU7P*)a4FN;Eg1CK)CWfSox%p%O(GPZ_- z%kNXoTzAW^=;HAgf`tp88V)W_KJf_c-6^VV9w1b>_#rc}d1b8NyGJ_~>aQIz(}ArH z%2&KT;PagO^y#WZl|Z8aiO?7)d6(HxScfwoJANmV zLc%I4W*GIvs>05f?I%cs$$Ypo7Q%?ico@p4WDzk(HMA$?z~Q9r^PM=mu< z6~p>WXz6?iJIPoe_rjh?!HWt%PE3>xd)}7Pdm>)r3_%u@%?XFtL+L+G3~ORmCU1Qj zsa6u?fzDr53|P7;9_)dVObO|mKkLL9w`byDsU1iDLl3IK6HDeH+BHOV!r0RxT=9?x zA4|iFf^?hH-kC~?RdiM`U%##<)=#E0^5{U_Y;;|3dmb%4Q?~MFCTw4BrObf zBSUtAG!=quZ}Owlif6LXi?QO>8SU#Gs|ri}uT*}sc9fIC@k7wV-ReZ&0)-zQ-xt7O z^C9Qp1Z6E~i3Lea8nn6s9fof)%;y?PhT+a+3Q~zBL-hd)ICND~skB8AeJSM?cdvka6cF($u3!FMST3<%FYq+;r z+j!gFx1wkbFchVXvzAp(1CM^bq0-P-7U%V0J>62jc8FOPQC*3J@|RFwCwb?^7ZcgT zh(;5l5XF-EqkaOvjoS5<7UbU#a?PI~yWAHjdEG)I^kM%M;Ug@dNZWMq!SgL)u~(9x zYiQrbToFy5@4<*WSRzhRaX`Ks)=*u*$KKD(MLt^rL=z&@bZ8 zSk#$4n@HUlF?n^T9DJraIOnKLbW*3^B^AA#x7+Hb%wYGSf(HB{oHZX*`K<^7OJd<= z;k1pXPMxf%KCAe$Ud1wvK$X5cDe>h6#e!JBS%IUYglVhjP3P~JKNEAzGN}mKUPI*< zB;(5aXB1%m&$)4hT_)8r2|*VgOU&xjj+@F_y~~^zpIZ{7-95rDK`cL41n-@B7b^xmmMS z-Fqi3adE)SgU>> zH&G^eoQ-&Q=v+-U(dStN_Lzsrrrc$D)&_pKm{WJpfs%F<-)&+1M&?k+5l>vz&6l*7 zi%Nn-hm5Br!|vx#1lZKzv-dg?xc9aS&g+Nieq}_~YDMpuJ@RLj76d zmDjm)3j1X0CAmUel4i|?Y{W9BjhIcv*n<7?%IQkKX!_cO^kzS3!tTR!)xY*sd|52w zF%`TZNQMpUS*ok#Z@CJ6u;b$88{d}e@q1#^ug&)y3F1pTPjUa!ztD01!464NJxf~H z#d+k>pIY}eVX*LeLo^SXE{B&?e{M?3T4`$};5vzSq zspH#G-3ps#85x6uT##OxUA&^35&dH}-8=W~k>-ryIJxlXdZ5$dRo70D+3)>Vw$~d`Ul81S5bj-}B{9cANw@LLYA(P+ zdEAbRZ=~jC10l-w9S2y~83L%4v9v^pxytNdVrI%m>b0=h&N_<2@lB4LN5pmA=i!p3 zmC<{|$@9bfQ)KesNJCVj8Flq`yYiU@*?F-%I{X*K3znG|1rO=kA;wVu3qBvwQrI$&$cOvz60_YZcs^Bu2? z7R0vLvhylRqi0ZG^1z5e7Sfz~ru6E3WHs@88<5ZJ7CTF9MS^aQ-O zH>NF{c{Wd+*LUP|Fdw!g_;H(89#@BDg#z-2Ba|ENJK z2_yN#+g;9!u9%VJXaL0wU+>1Me>C;A^sv`TDN^GKOlvNwM;RV%Ni4EEVOERnbKKNy zWXjtiK8i$$cb~zCx)HXB*j&Gy{L52HfrNe7^P0<$ES|f)`lJ@CEwqZxP*$*Sb|PQH zgi7!uuk8^IPc`S6U+)*U6#TGiIGb!8t*F2I>$HG$l+vpo$OqdoDz?%Qk#-Xn6{!VK ztvZA1J{`V=l`>rI_9TM-d&f~5p(Dn3Zb)T>NLq-d!_w(f37@Q$bie2GUaXye9b6Z~ zaX;)__ya{Fo3f~yH^l93-=+3%t1VtaRPZeuU2+#Eg?F^SbWkH&s=OxlUcllKnKH@N z1&TQ&{fjz=`1oC!3!BQonGS7tjtFo*I`Xh7{&HT&TNL>vatC-Qw2Z)p!MQPapN+nEmQ|+qJg@ z=5H^mhijU|+}ZRsI-j&n#BsJ<*Giw%fu4l zPfFu;EsV?F;*3r!SzV58pUE$I(45M5&_M&r6>r34ORfrgb%pNVB&mQY^RU-QnJ*5} zruN$My+AZaW_!G=P;tKBygc`e_rt436B4PwHKZKee!}A2~G+%5l-?=j5YIJWnBzx#;k^@R5x1=old%EmfNIUhc;NOGeT(`!R$ici+A zOL-#<&6pWtxwuTXK$#oy%=z|IVV>XS0`)s$pLq>XfnZpyPCVeLJi5*7{sse&ND1TL zCX&OCS?iNma#Tc>FqHso{#$0tZjMbHz+(V1TZ$k3k`)6Q!P-YTIQYRUtC=kzvBloq z(%D1Y#@!O(;9`G9%*WYj^7<7xL2WmV?+5yTkA0=7+^aJOId>n~xbEJ!kG!ut&+t7t zjSb6n68(`^n;0nAnsR>U?z-ct7XG(c+D`K@&%IAmqU6eb=By+$tWBSR;i&db62vg%9S zQ(M~xzTQri40CmQdVWNacjp=PK0VD7!p|}X%stbtKY6joGD3OBr-UYR2N@{D)6HD> zj=}Hf%owGo7j{*bKMgT1W{UK`9BIrCA>wwTYu?WD z(fH9XhgFMJqY%l4nPZ)aU)DXZ7`>(Upe76f3kW)78davaGaFeuVHaq8BSxe?U2b>7 z8^7E810x$Fmy6e1sHVJ7uARufVt#LfX&c61r4EG-gV>;6)E8WF_Segi zL$7fusV{4}z3}S9^t+*aWotji!p2FfFJ7D5yHxq_ zXMEu#aZU^Dy`6x8-oM(|>2KCicr6^Uw~5-Ll1XR^2{^ zhJs85oBPUk;a=tOsdth4W6nc3JL3++b3Ua~_3xEtzII1(MU?RCZ9nFFR>OO9ccOLR zGYsd6qVtj1mQ*#^#WcqcxdpdhWwi>aAqzHJSMGbsx54y*v$2+V?}1}p2c9E89lrCp zNZ!`P=)RK1yPDT+vU>EeV`dA_C)(&NHo%S+-n%pWPEehdY! zKFRjh!1NOZKi^0}^PP|0jGa+;nsAo!`Vw)0OJ(?aS5EfX8IF(9N*nt3J0u*13}Czzu}Y&S;@hauCh? zHA_`PyNC6*hY7l$EY^CC)eNrR=kw9A+$UpTJ~szOxZg6kJa5@L+lsF}|D4KAwc)(# z`*6nN=zU}%#!iL9JGq|<30&WN=}F>uxqcxEcS4_O(=*5x%qaOFQm%UT zlElM_B)WjUWv`{PL7T+B_Mza7jZkiCoY?qSy5Byws>nb&uz!IL@? zW>4MyG;)xllV|GOwX};W*#B{6)9y2|&-Q+iPf)elTKhalQ)g+@XW5i35-Nro-H~5KZ<}UTE$!t~ z;)ouwQssSn^f@qoB6Yw7!p z%KZ14`{4?qI#UdHcj{DKJVxk2lgF0c?8(J9Bss+~bSP@F`9?tT(C*flA`|a}R__a24h+j3-g50Sbm-7UK^xiQd5j`; zWZ4nO3D591GATMy^JAauQ~19g*{^crsMtoZe83l7Udz~vEfx>gs$Dd^Icjw!dZaqY zC*5`O+rFCgXC?OxhxKM%4+b<0>RouNQZ6^X>5>Lt)7dlG-%7XjRR}FA$vkm>d)0IJ zqD9%Os29Zn-=4U>lJ`ovVo;4btp5DXKC;J%!9BvBH`E=RuTE{JZr4b6#h2t~wSCcZ zczIyC&SW@)aJ&4Bc0Xb`Qeigab#quWrJ})gt`A$GdY;G}Ee@)wQ@$I3Ci)Yp{fKO; zSQ^PtVJf{Y_N%Y_0RhxZtAp=legy+wwam+H2}h0z%@2HW+IH>CtJIyRJlyt*?e0o{ zF)+^i;Z4Qn)B`DYhaX7V3u#2SZ!!MGV{+JeDsuNTS^K6j+Z|s_$TJ5NEKb69amm>6 z#RmN__!4XP@x#YFk5pcxhC3%U()io=Chs|_kQ@`*8+Ud4<_QEx-h$uJ{gRuccHP3; zZ%eWCC5wdZ^L08v2eOz%& zPHnx+Ue0~<9q+d;ZZIfEJgPfey7Ow{=$6UJ`j)htOml4uq3GnD&HiCxU*A9E?@i|t zYRr6Vksa5z0*$rOV4jW9(-}fE?v5{%$j{t3s<+Yl&gaXdTMa`ORRxQ#?!Sf?z3D3P z>Ad&`+eE{QT6n*XqOc@WV!e-zw%D_8>$bmm{bkJH@aAsg!gz5@qlRKD3;uISB`v$h z>!s;}&kvO^7x{JOtq4C&={t;gP}aoR)K6;O_n_!1v7=5@GtO9u$L^lwvf;zXSkzeB z%{k8#CEtymJF@pyw#S`Bx2L$$&M!lxT}}kZ#KGwdjyIuCpX|DDFrjV}&s)tiX4}t` zCMCjCOiR1Z+}?Zd;*@}(vSzbbb@DlTR&fDqYBIoB#w>lTx_D;bIabUFGi1ht&X#kA$+CzjRP|;Y?J__tD0e*g48vYQ^ zDEZg%j2j0yI5q^W#WSvK5;_jvYn_Ll`o&+)e@0e;U$(ejHud1(-~)UX->!A`m{vXT zBEP4qiKjl?&J$tjZp)$VVC@d~0KXm3wX<`uwndZAf`G)Aq_vdC9&(?5#4yR6=sO`6 z{H%~zw$4fLp7_2%O%ChLH@EG?R^52{Am_%mN1roAxc2RRsbX^3JLmZw6S;F+v6UMZ zziimd_12j>Z-7X%{}y&VY3#-A51;_CwKl7ind}_%vJ&|@UVNC($$z3fhZ>p}oiBo3A4-lH z&~-{ra{z~AzG_ULveAyADR+6)mIRcfr`W$HRu~w!eUmc2K!3INF%A^b+`Ryr6i?dQ(|v_0L7&vpA73^$>>UOp|7>|kbkdz ztmIr|Z`K?-rpeA&JGCuzKX)Lc4TtiqS-j%t=!owWW2wu?%A#|T)u9su_QNAXO^yU= zGF59@RHma{8kCa8I-^zjC<8(p!3DRA(BIFjwL>)xvOX;ul3A$g$mM=-MNOw3#N55* z1eB|*s}&RGWWn4BHh_vi!{L-+8_9DD!l9J$`W{lD2LgehhbT<>_$v(5Pzp&2vbik! z6fG1n<}o{)?BCY2h#XVmWjqP?^1}XF`vy73qj8H1A&W66XYh7W1PrVGn)i|tirg3@ z#TQGRj2Ui#tZB76UC{1X8c1vAD)Rgw0FTlopKsTE&pW?|YrE8?e5Rs&K z1P+ZvB3)4P8c3J|?uZPz*mozA2ZS3}kSF4}xw&0Xv+xTZ3$AhuPG@lk^h}jd4_|J} zye&W$Xytv|`u#^6V_?zf>M_sdheGsMB>`jox%o(#U&{uxm9;rotG{`U*jU`07__H_ zyIvN$S08@hQiph>`sV8QTXQi3-i0B#6NJ=J18oo}Z{_J@dYr=f8bvyA@XS zO4OUxftNK0ks#v>XNlLxejlf6kft%^cn)i0iOT56(1PpNaLkLCuVAowEpScud|Cx$ z0q6!nNpXmH+8F;2szm#*Bhe1oR|np=y+vehcIH!T!d(=P{%_Z+qccAJxD;%KeHif$p8Q$Fu$K<@YWizc#hw({lLC8E_`j%?_kLH&U(ZAY1~SaIM5z)> z{Xi+sc-HtV<$X%*I3Py+dL7X>l=f{yt$bl@MZ|z={>UR5zR@lxt$JuCl{>IP7Y@U; zC+D@y$BP!rdgPtm0O8wV2P=!_wClP6MFG3;$L^M&y( zOjjdbK^E@h#JEhyLr1rw;0g(AIBYN=korx%5#6)`&<_?;;s&r^G5M}{jCRqd#TpB` z-^?lo?Oa}79-{X9Q_L{)L-Dl#L|}c+Kk1seax?M#;Kjv7CS`HqtTW!DvI$>9i9hEt z`n{*8#~MLIQsc?~teU>QK4Rf7L_&!D6K%SS#bshu5Fa`VS(-t9)PU!}mzE;+>397h zw}8XOyoY&9+OMLcqobH00(EOqqB7c(A(SrC@Q5b$&xFyOl^F>$vfY`LK{j`$D2{t0 z5Jaz40196Npf&&&#~XjA_spDL1AjjVL|~7-2A2bmnF!)NJ9~SQFR*MqbjGwtf~!Zf zU+xVK4u&SMpi%`Ziv%=og^1}xF=*z?e|rs9zk#iyF#a96SS{)6NkS*(T>a7TIs`V0 z<(adR4Hz$6Mn(pW<-XuguyFfEajwa!OhL+uf5<{k(S#PDx#kEO-#~GR8N76%NIz9) zWpogp%PK{(I7I=wCYm-@*HYVf3v@8vuhLyYXJ86o@L0R_cXcfZQ&-2&o(Tr$4O7#? zY@um5*cNYqZkN;Dj$~f>Tas-e99vQnP!Zmkb>sSV_f?JzQH6CyufG)-pxsLBrH{7f z-~r%vU|l$rVSf*rot>HT-r@Et9at28)^?PB^M5PETxBIaP_?TBC}fr^zjR@|n_hEW zi|`zOw`TE=T_HQ8HF^;;dAeQ%KRS&c@u>n02l)X}ZFs5QVrN{3%rJZ)`)51nS4J|X zeHEe;IsJoNYehHRFGI&b-092P*Fhcp$nD|n^TYNwcGB8s+YO9$?2PQ%BFe}n6mm`$J$E)OEiEf9 zj?fuZ)F5p;n$`tlHGtaM4_@xP_Tnv4_OI5`?4UL}1Z8&4=bA zMfewq`fJtgo1HN=~MHEgy@e<}a@FGlyBNgYSrKA&51^ zZa`!*nFNA8Mo>`jmCq`9+YV5FYOYf83VPnbyc;mN3eGL&Fc?vhfwr4|T7h4D{|}J4 z+zbk~Q$zUyeB(@%j?uC}MdVRth-c@ZE~D{wsQIa43X?AoO&0hgXPwuw(&P+VMXqFU z-6^v!r3)PbM#jc4^pXG>ZAfI5ZTTz8KR-8j7*hTL40xJ6Yn}0`)|InF5;|OV(^Zp* zZv6|04d_>or~g|a?tlN?&AyUsik>Y$U@J1#Q&{|)vg2+B=sF)EPw;`JvpqHolMgD6^rXpYf5j|cS%NU=pf{dO zm>+8SRAu&a)$g22v&R;X>%V;YG84z(n&#x>lqHkNN)jK4B8w;j^PMD_lL3vi^oIpNowG{MH3iiUv8Wglx2E@0XoMvetU`e__EnuFUqZux&kT%M#ng#WuG6uQl!A zRnPqxX>V^2jEaiFOAm|c{F(7v6Bl^R4%cTvmZm%Oa3I94njR48!B@}qoKFZ28R zO%shh_VV4h%sw=0g(8P$GC0L<6nykp8cO@e559&Fl=8 z;?W?4=yhuWH5;T4d`4Xbgf*M=FOA1FBv}e=OMeEF1mB@>twfofom~*sO$bE3>$0i8&%N;j{YUcs0;G&@U-`^wl zv4#K(KpS@`x6uhB%Uz(70DOm%BPa7N=>MBUDT|83ivH-LLd5+HhbWoupxOK7l6!3= z3;huYYC=+a43^O8uZvM$xhe%kF&VVFa1=w>tYl5Hcn#S$Hs8PKMIIO!NC7J=Q7lWK zhlh!x2eFb@Xc&YoS%Q^|%>ByAOTbQvJ@+{oGWHAB!GvIM7A9{9kfEu8FN`CjQ{YyCsRD*bz_Qh;xn6z*x ztaY(Uy*Efb>8oZOb*h5c^S%Aw>M0QZ6d0p*lqe@0%DO^86IYQaTnJPUZk^_cc>G+m0z?Th)r%i* zB@F?KyVGA-+;xtI!yRGxWMoH+Bb`oefs&31a0kv&X1=$j>Jkel{Iu$)yifL8Kuu%D z?`HVtZWq5%Fg-Qsy0o&#m;t1Jzoj|e&Mp;g- zU~J9cP=F(22{4B4_GwO`9tyT)L0v&X0ls>^*5uc+BxwHu&A)e;J597Qr1G=oU;zS6 z=xbAti}B9i(s>}v@_vD=&(z!@^EGa!6?~{VnOQP)9H4#}oeR=)0Md^`nFKCA0}PF> ziJ6%|dR7+R-owL#$@=!Aq9@dAOlo#^X7o?-SF3IYyvxFiKzvmN35)FCNi8JPONX!E z^Qxf5|Di&`&>)Ry`m0pNUTO3G|IhHAp<=SC;D5cZh`EkX)*mqb?R{iEjmY6LM%Rr6 zws)JeN;Li$er;6AiR_lP)tNbGW1(ze)F$+^yv`D?l1%)ue8FR%!i; zaLRAlU+GzEAzsVu!`PREJxbU&&RQTKds6tX%#%bA(HJhOD~44;6$mXw{ewIqc1@mO zW^TUnyQ%P$xHt^t%ixjH`%B#=V*(JXP#uA7nb(z-k$D8rKBagfv)G0F_v?Os%aRg# z0+F939;1^A>%yVFu67H6(6RyGRFJmQ51eg~c-B(n(r-yOztC|7|sz*gm%!p&aioIrORGEPYHUr~q>Ql(xc0kY_yuG6d#1@%*fz z(nHKM%sA*#`{q}^x>8WLsop|tBRT*S046cL%)RRDc|P+lU>cZDFW9Zkacp2$JEr6 z_GNK_-`te`To#)Jk-dd(1bH*7je=N~k4nJhf9RHUbu98@Kta*vqlhX4yv^j|!bA05 zd-CLDz=cEbCbVOalzlTp_dh!ZA%52gbN0Xrs7u?pl%KRxM^N3NQk2BzuXa|@&6!J2RW&tJ*c-Uv`($mwk!~@)2?nxR~85TZ*h1(e&4oD zp$R}g$C+74%^UhntglQxP1Zq<0bka86{(Z z*53KFvMXzaO6)@gxPGHJ)?j}I+pOyFaup_8enY@>830KZtfu@#0SLYwLD{TGnf=BI|=n$+AL7Oh4|^vUtxgz&vRjoF)t?P6Lb{EWP4bRIM#jM<*EM+ zRp}6OV)7uI`e{&~MWy>?pP>&7!B!MuUd&Y>te7M;{R04D@gILV^w@oJHV42in{aH( zhs}ch3LJi2wVS}I?TV@e%Czpkb~kxj0`t_wLQ}xt7Y3s5Uy1Dep*5Y_N5dgR0)bw* zNMer0{`i7htZ!AySy6!lbW~cs`vM&SN8Y!tH4onarPh>J-!DR z;OxQDwc54b^rQDDRX#y1{+aFPaNEJW6vD7C5(}tajRDAOp+=D>&`PUGaIh(0%_A=o z;OO)i%s%cwG*~~;O5=Yh7pBs%`7P%FX$?Z@SQ`Tfx_Lp9FzIhC2-`W9caG4cIN*<2 z?Sts`^oi{=_$F4=@;~U-%U2WeShp|>Ed&c9li>xb72yW*L>=fg2gcFXQ;BHSSOvsC z{`BatbpvS0XXduh0)fh|8p!L=OF`3}SzyKP!u5YiH1AYyQ;(PTx=o#?(rB+}q*qOL zoruZ*%%uN4PNA~}ea2BvP&tRJ52W+)ho)k{>fGYkAJjyzHAnO<7|ub8fBDyCzf2qy zTBrl=1Y_t32*E2NxD=BslZm&`&dy{hI+I7|$Di$(#S*L?Mys1X?fV&g=c}eL@O6;L zVey5nPiLFt*d{r)Nseuj`(JF5lN;voZ54q+|1uJ@XJ-!VPA5>)2gI}PWcjtHWjb;y zzJkmG!@ka6r@@$aIb-|0hd>?kP-V`3t*NkgowYE2Ask^14879d7!+n1eQ7sSo`xql@ne! zoZ8dLN(Sx&Qakx3i&kA-P3Y+CBm!AoAi26`I4f7%xkNdGan=wl!dnDuQ@ z)R{#)1|$OX3Q*eFH!;3|&|prG{e#md*D!y)`&W@*02uWZbPtIUN}gDaJYu%ORdPTM z(8>}Vr4Xy*#DuniI09NN2+t)8Gu7zgu`J*|I0S5k7QeSNelykOFHEBq{Z_y`7Ub*7 zjRPHj4P|mt(OzPoR*!HY&_m!DWtnEE}6; zW3y}^#gR>y{ddu2>?_H>l57LUf5DRiBS8mRTU*=2g=R-bN9UHA;VFNW;$>uHqzoK6 zAE^O9Q@qR`fMkr4q9Q-bwKjL*IFb;2QN%X@91(v2j-~PEZ4+xsG0X_0@(sST| zH`Q)Aj}LtR+cqu}6FMEB1%hH9#=a!%QNq4)*7kN{PYUdLlD%}Wmqm7^a8i_AJpFAw z*-7Im0Gi6Vn-T>Q&|#oq1uV#4Sp$1^&b5iJlw0ILf30Q3Saqw~8nD|&5!gDzIV%6t zr`et4I|v@&_u%vTyX;AGzEuUM7u~Nt(nJdVBb*tPhw)1O7en9${GwmKRq#O`j|$jKQbdFf?WE@f18A+KdA9N-qLIT~!>2#|noF2rX71Vves zC+Nkw-eow}s_5qp08&Ceq@OXDW~}~^wT=9=^))BPR|cSMUV|WEf(M($(}EYa1t&le z4py5Zx{zj6<_`Ul{_`KW%Q*^Ez^<;YbH7q?(v7mY_~{I1VrwMOO2M5t=|TX2!Ce9w zKS0_>XdcAhmmrJyCluw38Hww`IfD!?z8)8l%1uuOLa8iRiR)l_ma~&ni8WA4d4o7E zq62g>D|GqyQ#UX1nd$I`uQcQfB+UAM#zHg4dqy!6aJp!p_srbvc+9xA2Av~YxRgeA zmNv11EfZqPgxE46woK@MtxO2||N4FkW)Uh0xusb`v-S^x2R7rcJ+P}SZBPjW=B~#9 zeM?CO+4rwS*lWuot{MG#WMsqtR~P1l}Xk zK_ir)E(dsAQPsJWdGY4GtD5UK?B>|Su^GH3!tqMBoTq#P2S?9d4vu}`6<1eJaT^Cq zdv{A`4{;|;U$~d&88IJcr%GcOoFKCU4f#kpFkSk>x<+UJx8s}Sx;N!sxn>W!^YU2S zdeskyBfD1S6`s7k)NSA-IyD>iJhhlO!^A+57Nk>t2lcL%rT$J3_$ zqI@IqvO}YO;|5XvT#>Cv9Bl=wJ0^*@^EsrUbjWnWu^Z;=ou3+A=j(J!58G3hEzi4g zaQZB-WX=9ecmC8}(DkV1?}Ilbp6EY~+C{3pH(-2zINE)8SUq4}Ime(|=&4qVYtdC}P8exP~n0 zGJLD6Zt(p#7h8|VZrgPKsY1V%=&W80{QOLy@Gw)-(T+K zWl%_qF#n#J3;72A z-WJrIVk(;}_JUpUE=Kk$Y);y1SrB~FYAhz#-MtbWKsx5kD}J%k?Xlds6SZX;^1nVoLbuOym(vbx zu-sL!SAZNSp$5MYy)Cm!Y*A%j8uozJ)=sM-URy^|r6$4Rz?Pjg=ME1jF@(CjS032j zkJoc3J92Gal*VPJaHxKp?5FA{E(yayM^1`FgpxOLHz^*BPKZ>DIk-c0=gW^Oca(QO z`Q;-zqW0FHL~Vw&T|@J5?vrPhkdL0ptO3oFU2-KAS8w)zdUiBJb6s!3ExX~(6I}z< z-F2`T5ymr(QZ5U!t^$uy!2xgji$Eu+T~N%Ew~bq}jAO2x+ETIqrCi>dhZkRzSV(NO zKPD-w0+k z)s@M}Eo3y25)zR+_xD&EACYJ|h}XLr7_8+Go0#BAxcjmP*L-?i-&W6Hc-m&EvS^=# zHr2F5=NBhq!^BO-maoHgUS}A7)PEmr6Pg_UJUJ@x`t{9T^h-2fBw7tNX%?z zT4a-)VP1>AY@;20^Wvq=d^$>UaO3QEO<7+U4j(3+m-Dhz|Dcd&fL{kXlrBh4=Hex6He3P&qp1Q1SLei87s_C_-z^Vtao6`cFzl zc87~;JRBS>)_RVApZC^(exrDDJqHKz!e7jL)^I1dyT{tRH~GpO-XpR55k-^?y@Z3U zH#hTo=g=N1V)!BD%0y=B{h`A~LJB$ClUb-{zNB|;cjOLVg{_kzy;^$W>kNszaid9p zwCS;d!8FJA&`q_61cRQ>%AJQoYB0?&Ql+PNL=PN3FMcU8tsxX5RxT%GS@ysHad`F_ zU#42hsq;@dx@)O>bS`flzijg$uIF;??p)e2YiPu@6C2y|x%}XQ>h5b=ANZcjV-*%!Rz7V}zNu9p%#>G)Qf-iK zf94}~bKOOh>F!+*VNo}~@Mwtl`!64ndT_$Hw&C#EOMyqPx(sApKekd{Tk*hGP|vzr z_3|de`Nxvp4R2{5qISh^xE%KEj!d4!iPt;y%`7y9GD4<1b3Ln$!PhJ*!1BD498P08cZW6R4upIj|u8QR-E-)hA3@2wCsP4^oQQSU!3ulhCArL2g; zyTWniP|5M9C0k8io;MAU-)FEj&&KUQ?kr6A^cba}ZFrxu!nSjdcmqYAQreaj*7q7* zk{5JJqf*mp+ zJ9bGp{gQ`nm}71F=FxEd>D@DDnykIJ-B#|xSrYg4dXBVj-6n?6yXo3}=a>5pn|ANJ zA;V#N0M09`Ki+WAk>>6B!B7EXo%i&UeyPH#i1^#1B8iiA2S2>iIFO!StPrU`!F9*B zr}TLnLZz7RY4JrmU6+F+D-dlqmLV zZjuoxd-N!zq3{ZCCrR!clz^`B<_yT&PZl zG#E34D?@at6bc<=9zw}@aD+@n=6TF598;vssSKG)G9>eqN@SKuhNBEc3BT>Q_i{eY z>1Tca{eC~zws6*dt>@YMc|ZHv`?J?#9;jpxJ3QJl*>tKQG4r-2s*tzA&u;kh*V#<6 zOHVXM*)S6H+Itc$#dj!hqo04txIU%JsXu=0+##ohCr66YPhIRjJ{r?cHJ{z+95&?E z%AI}KreV;3*)J?cQ8_;##+k;xRVhEuwOi3VTr_&XIHN^bTY)E#&B~*2G3LvtGfji- zVqN_m>l55O!+Bm}LS=Makq;tox!JHbwlYu zPA#c?CTCJuNu$$OLpqzMyn%IYK~<$EPx&|G3S#ZL2QJu%EcpLKJg4l)VGCf1E) zX#LDb(ggMKy{?LXhq3(7Y^7LeXMU7XpQR{s$DsJ3wC{9B+aEJzB`2jLcU(Pu(n{DO zw*U0u*IntE$YSNfVyK~*@68_eu0Kl@7!K9GyBgQbm=~e44+hlC z)HM|heqbV~rT0tWHy?pdib13QTT4#HCe|pNgdA7vbJ}KwoxZ|*r9YH~I9o1z96qDY z#Zblmhx0fIKZavW+A@{yV;}0rOr%hYlwwM(?xdL**~%aZ-Ls>8X;hRq-TX|YJM8=H z(S=5N)HK(N2ht_&Rj)ffWH>+3mSLG-N15vAcskhTZ1U5SaeAMz-^|r}ZAxgy*m=qgrguhsFcBx{LZz*9P3ilB3su|k&` zNg!wrB#YgDJ7?#Ba#VA;Vuy3>QPgXzUSWjX0L>Crs&h6_wzCZy`eQC&`1u zUqZWMA_^50$0|CfZQo?rvtv$$SEHs9<0Gz}pFhLa%Rf=Lj|O3b*w+3&PUmJ2se4J5 zF*WJv$ot0r8xNp?XtMK*^IxuMp3)m>|D1kTGuKA=K)7Hmg@miri1Fv!sr%D<;uOLQ zI`*AFN*Q7~th1jd(9nA9<&=FXGrs%c4EDl|a_5-*_P2?F`v$E|v@32sO-<@e?U~#2 zL~79`u<&kzwd-O-()SbbC)^eq-466NmP5>eKyrZd5#cpI|BVA;-)~v$_17 zZ3frM)r87|XnGyxeNyROKlSesILz_Fo>Ga2-0aagdPP%=?B@{mt26D30qW;|N)6Ra zKlCm_K6oZTABR5e?fK61r6Ca&!}ib6UMEctVgI~!=2(rW=j^Alc$eAs%W{8J`4wiQ)SOWX z5iS~eBgVK?va)Qfyq(-!LbD?{G>N<|6T9eq;5=)(%hHGKbbERA3xC8r!~u}yZHpqrU>&=xSi)m7*rK*3$&LNjq^ zNc=VLY%tyB3^kL8G#T3B13ITwhlav#V(fl>%A(0o6&;(@A61+{aqbxVIKs()Qf|&c zHr#+SXH2b6)PEx0i2E-VasQ~)YQ4%5hKKe$$;^;Bov}GrxFUYl8fl3YU9m>wF?r|@ zno&9yzwS)LqFwv1B}p1Wovdh?6(ls__jMkr|BC;%`O5jWfxZJmKUyE}A2^uxc!qv? zaiMkM?TCaL?JoC4Dnix3vw|<b)U! zWecKX$`=`T|y}#%#T+tbD0d=iYoN`_dyWG%(z9M)ZKTRl78@O0V^t3eP#R zxR(Z1jmI3*C8X?|#L}voYcQhq@d@lL`xbv5)k5@=C2vEXi8VT6p@W&pkKw*Ut@Svu zUF_|-kT8Co;|!>Xs+nDkElG6D$(zq zb2@o|v81XH`M^ju{Z0M;z|W_cathxzpv~kEEv~HGJ9WBuyG2O&DqYg3)o{6?KDbMU zLBg0?FZDE*3hCjww!Yiui24UGI z%u{x(8KvII;3@m`6}tLRNS{52=26}FobHW1OtTmlj@Ln!T`w4Bx>-y8v&aoxZ%Na5 zm!3DQl(j@Dqb?8f3eqaDjy1iCtKA>dcJ!!4M;?0|pJ=3oKX(z@0U)p=$S*=*!@#rp*ogU^6b@nXwty_HY_Ss6ZXM^UE z={kRz&-ZITUSbMKVUJb(`BVGGx2*R2^TtdOvt>H-Nq0rBBU!%OVa47p8#sQsER?Z% z{L|;V`#$chX>}F2TZehHov!KIr;#Cw9cpdX#k&j_T5e_@D#dnKtlXQDTHODTdFP!E zE8QJ$hbywE!lVAcMt}FZT*tG}+uYA>ZII(4cPfZ+j;(W=OFzemB&T1;ug)2`?pjQN z9iL@vZXEo6lqqB?Qa>F0TOn&6`kzcwsh&Bd=${kq%R30^x2ZoU)d#3E4QP1xM*W&z zaX|e~!0SoNJyJyFB{(l|=9)rW_vI++i_v%_hV(wJzCDB;kudVScuxp@m+jjmXb;aG z%IbO@!OH8@0wgkn;WQ%iTHmOP7{B||tZXuIoWuOhN{4|~%o@V>j}m*bn$BmdXq zivf~~3{Gtfw8y_YJ4;3!iLiXyra;}TD6C?u5g1bF7ubtobXriJXHL?lE1_@F^R%J>)N%32&Enpw1{ivIJPI{eaDX? z;Y)um47_(}NLIQ{l753Z-`w=&Q@RDzN37S#`Yx1&^f0u3z+Do8a6y8oWdf!3YVC~w zTsU*Z)(K_nWTOJG+Hh$c2bU4NKCjIPqw zCUbQY1VYo;34O(usA(-}@on4ywhP1}`#K5y)Uc13Y2rj_!~;a&05RIJEzvmeY~u$f zLPUm5m?*AAKF{O>z{mk1;^X*Oh~l;uaQHX{R-!oK+PW`l2K}Q{d>j%?G7)Eqi_6U_ zIF>N(5<5{GaXoyy_e+y7&IuSx#5&@Fus^-SgD@`iAW-BRB#I z-HagUNOiX#`2-lyol5Y*XvJ(sh!6}=wUAqBIiMUu^THX}BmxYA5&HF&7@gS!7zFi-PBG+QB!Qqh;Ew>FW1s}Xw@zu~_c(%U-J_R@ zFATxh(So_a$IXxZ9!IbYXfRZ@kpR~DZ?Y~L`+FS0!o+RlQhzhBj)xW=DYP^H4~`&j zqk{1lyS?8D@HQNztOXBzqXB9r+`|FIzhOx-D21TahF^uT&aaVeP~a}55ZcDr0$g;k zvO`&{iFO^K)i$YdDvTUjZ44Vk0Zs?nTb& z;ZH&Y#kqF*#dHW-ZTJL>Z`r^@a0iVE&kGDFG5>wn<79c&#>Cbb zZB1|}>LkqWi`|8w)rN0IR2Mbe3^78EMD2f_=qm?7s|}y@h-F^L7MFoTa5=xr7*#CHYz`uF$zghA{ru0u)fDY`V7=og& zKb4;U9R*O}W2RzUV_|>*m=qXT6c~TU04xtB!om0#|NiWuD45t7H~?Hcd;&tEha29K z12C{2&S7EWV&marDo1~IyceuFO4QXxqU{_`LNp@* zbIQ45vH07@3Sehi@$5`$1eFnqYm@&wRC_kcbN4GT|9N=`}5E+{N2E~$doBN`f;UUqf& z^!D|?85^INoSJ?&yNF&|Uiq}TwY#@}aCmflb^ZOv&ClDre^@@$?te%=r2q2#hXgjx z|6)l2z{GsuiG_)UgNcKQjh%$?P)AtgKsIbvVMR(DA&`h6l>)9PyQ31dzmeDr1CE?( z<#rl8CvoHRIk3Zs%67m7ZLITSKTcJXT&|k=hsvY-m&cO_B5LXnR7}nOA>-ou^dCNf zLBS#aaEghGPxue7ynNVysMXf}7rBmCo&Uve^zDB$T=;K_J74~b$CcS8SSsjX!E@c(FQ71>y-s354k@%ix;$DEUXrYl3&GQWE)ENdLM%f0X0NwdlPP7a5}QtmM3Sy!d%$;P=-MkJ&EUP>&Ru%P zIMZe;IwM>B0wb>MO;t`(yecNP%O(BN&V|x0hfhzESP@KQvM^2XYRd0R)Z_86iccx?A<;HhBQUDx9(z-5seodWLupY5d3An-@n9xWIIO1E^@HHg zS}=GZo0zU_DKyT|Tl6p5Y?5A7J&j4WaI+ViM-hlNS*6h=eGq^5o1!C49El|bX0QW$ ztdd!b8N8vSN7V^B>Pcyqf;904PVkHonTErpcFKBzz?VAwq$o$-^wTDfqv>>fO0DRU3K#<$PjSO4s8?rBgtL5<(*}z)CJzGgt1;248fgiR zv4|hsXz}hyuJd-a;}NlTZYd5!scBwj8OJX{2ptSR+}aF=VMZ9@oV|{xfLp} zHp~)OL{5NhDz$|~4O$><=?q;avvX(FbI{Uwt)05XPtVIAfk!H$5t6G&5UXOCf~f-G z)j1C27{|>!>?tHnHraOac?D|RKnENy5g*m&)i1xg`mo?t-IbtMe7Wx?GbA8zJE=D$ zzASTwC|e&7xDAhjv=@uN+srtXu4=Rq`*M6}e;IPurc~X1vd1OtIumd$(|2%+e0^}o zB7HcP&|pq$C?#O}3sHNy@vP{2=kn^qx4vhGo)D6n@7?+3WNHL?Ra3F5B;Z8}KBIvB za@Qkch#?P5BPpf9gKwG3c-9XkS`?gl`Z>lWoL0)pTeO+djm`(Dg5Qzu2P&rLK;cJe9wPgxgbl?2dX#RdYph4hpQQ%%vsH` z8ppACq-}ziM!}e8B+|ucQcX(K)Pfq)h}C5!?Fu;i7HlFF(MXr0sY$7UT4a-o@!X(i ztt~mcX!0=;;qY3tH}%!0O3;dz;3%@xY@EWtY(KW zYUbD@EQE{a=FjDWRQg#B6Fay(TIzX~x;WiTbjH2%4IK$;l&FpJn{soRKiYGO6mK@~o-LXyl&xywZdEwVp6t@k7 ze`21Q4?~1$lSa({BvVW(vs*P+Z@eN?ZA}tAq$;@XgNBN4NAahJ$qm8A{mO1yI62^b zDW3f5$V%H|C+L;VBNWVlsi#Dyvm`KHN(|(_!#IbJJvX0kIKoq(wLtyR^3!2UJ2eTc z(Hc5sSC0}i$nR}X+UeGYh7l~PxEi1c;2={atM6=_CAcyMvtd=v$GCFUBf%ikCN5}( zRQKxt*J`L6>BDP6TDqI+y9XEGrJGFU;jzDq-^kV4j{~z5EtKf5nW8oDGdjB0%>Hi; z<64rzZXtV)4zs&xnfkODNB!`(e*46?r%2eTV?vxYCh?A_zvP;Sch^7WCDgp{Sn`oG z^VDO_TWvA2{#)3e*m#Cr|I%)UX2(Fscb3A^xXxGlu3D+gdq>`3)~0cM3GX&+)f!H% z2keygTe>JL)=!7T*P#Dc+c{b7N%A@Gnb!Wb)>1*RxbLw^PuPHu<6i*F&J$JiZQ-*y z0;;Y*{%1VJ^IwP7zDfQWTliS}UiL=5*Vi&i(tJdECnBmB?MXy06enE?%?3U8o=!%Fv(5A;x zS%FqZ$8rxX{^Z=xe#BtV%+og_OQ!1fXx}hYTGM#x68|?L%V&{4dSoLnFY2F{8wcDJ z`Te;jJpYikkYy)-Sk87*T64|k^K|=16Lh%87?*anuk`A;sp?cbEK2_stDSW45v2|I zNz+K*x76VO`~%)y?&Z4c|CUNqF&O(5b!mcW?oY9mhE$m+Br;gu1}abpWkY7sK(!;( zue+qO1Zld2@HeAVZR!61VU|xBh^9*1F@a^q>+^<{Lb7rtor^X`eMqX8IM%wNC6WDI zrtwRhEiq%TN_2h8e*eV3Ew%Y2{1oYp^pfJ-XTbX8V?_Qv0)`#I|CXY#YpQ_oe`}IP z^sg5=1;2|C%^Ev#n3%i}ccAGn8*GZ!-7tp+Jf+kp2hCw_k3V_2V66-dn$Xwvdi+n( zo3W1f`-V%4c1|MZuFU^D?@wMA_!J}v?Z0m|`vgZs3wm@rcBB8#mfNDN2}{cQZ}<@15oE4gYvJpt4J z9zQSq>N~H%^LI=YE1wA4u)iR=q&J{1pn}u}`(#~yy8fk)L6fH3k9g{Y9#0X0_zJbo z^`G{b)&s9iv70fVk`=a0qTVhG(hP6|tvClebL!!dcl0Yf^keA}6}q zRX9_hDUav;WfX>hb0rJuh5*qg;Bfs$31xM;UEkMdY);D0 zFpzPzOA(1mb2bhkd7|gDy>JyEx~!e*a80+4K7x_jNtF><2~-O0ZhUr;nYtTUmbPEn z3Pl;W;r8r>zpEJh-IIU9u)Q$Vv@IRDBrviCqE*=td-Uh_$I6;_bvGKHvpQj^o+#`^ z)$(0QM-Td=O(o{o2Y<7U13DbD7Rn~E|9d+35c?X7gI4>Df>ttZqXcLr_D|Hk zk=SL&40eSdT62ad*}c-H76)Zj-Y)9=zmus{PUadHsGS;o7iz~ieg{$E2mo%6!BvSj!MUT5Y^XESJRO!B;+OclRU@dt} zQ?oVx=%EAczESW|%!9~#>eETWy1{(M4dG6B=QBU4v89u36(ZhaqI4CL(wI z_T1DyAN`B3zIsLeFdZTa`-*oRc6DIsyN3KI6*PaRGVHTAYOM8wgVN!6@8@#&?-{}dmpO1UhOX0A_Pl&!jJb@^19q7ZKOAKvtO-FeDL;L&aqj! zzF4~~=aNq{zHto7QZuLQkveXnA1B+J_fUB^8Xo#R+FZS&r!Z3AdE_fKCf*Z|M5={i zZ{bT{{mU_jKO>Wu-$lRM#qB zkF#`p>59xV5FPhQ=p3Ai)2Anz?4{Qu9J@_59 zuCqyL7w%_EZju+GbwE2`ZC#exJog2Lb}DNRXTY0oeE-?!d2Q~8S4;DIxr14?61h}p zBkb5KarAz0w@#qT*OI6sX2WHv@9f0AZ6vLS2MCfMK{d9Yc*}j4l@V;R>@5LbZtP$_ zTAL{6S5lcN+`liwMLc2bX~BCf+6d&#?Ma~zz0Ta0|6&M$>>e4J8zU2$Pbtw%)TFIKDPxSeEQ)mOpRb?Wzma-8&+!}cH4oO^% zQ|G8yg4j;+8JPMzV{nyYP+2ok?E&+=`m3iKFwv9H%@Qtek}aJL9mZ@zi*ued7=cnF z9lMFtr>64#pOj#}#;esQC>#1%(TF6*w|?QIK^hK6UM!0ff#ed8?!=!sqS!!ZOuPY) zWyUK$tsZmkhQuA5YS9?^D;30;V$nIjRYOCi3`+Kh$%H9@1Ra#xT6pA&fGIdGejxv{ z3VSFbdtT-EQM29>m?48lIhNaBEn8K>DTI)*hXIzDtIF;|?#5S0>ti8r+(ArNpgW(j z?B5YQ0J>t_^!o7`cG#m16Pzi4wc1c6Ci_b}&E{^*et|ca*6RyK(`whhG>ddz6!@Xl z7HTkasAKphP75`ksZ9Swd^sP=*|O~?i<)c@2XEyoGN*TOXL^H3q*8ZF=B*S-E#zV1 zsS){|A+Yh1EuFTHdN9v123QbXulp`gvD)LZQeB{~hYN zbFC^F-qE1v!F$nHf%U&P)(YL^LMFbMqTdIll)x{W)}$g#dR-F>RRM+(qv_Tg%NEqq zDjTXp>dHpi5rAHIz0upzAb24xBc4h|MZwaRld9+qAtZk^Ml3~GfEe=vBirW9qZ~Kt z)SAad@p%edeq4~L8C?~IF#>*`W!v?@$+zazA!Ph(OM`6*c@@EPdWrdNa}1?*tUe(V z3(26rfC~4E+o`=8AaF^II<+rESMxNN#OKwh(|*PD;>&n6-6EIjwt$p@FcYYRbsM)R zer_Db*f`5(ojnaqveeYd!LM$ZFcp_1P<+)K2|{o@1~IB+mC7l5d)U%_{gO8feVcR4 zVB?u*klLtUdtSi!Q+7eCtUhB*Y+0_hQduFK;kYRH@UBv{eP)2|A_1=%SzTbdYItDx z+JM?Z2@*Wz54LCp&a;jH9jm6Rra52Wq^h(+z~LR)P4QpI#rYOD?P!D@ zaM-a)*LW23Sl{JPZJ0vl?8Rte-b=8$CW&p}aTkEM3^Wa5xBH#_HoGwW*y=t|fjc&F z4pZF99L2QjvWcUpl=Bx<=@l?ZbFJY^_1Ra(JkJ`-1{UX;j&TDX`UupzR7ZZ$+8GrI z{J2c);CJcikM$sBocQW$v->(L2?4L%ABqR3O32?83;GH`kg4cw)FH!yOI!tl*`Ox! z52_jdgEonQgSq_eWW%9%xsBrYh?uKhv(V%QpmVHd0gFP0neFiS*jBqSI80_E0(g9~ z@`Jc?|L{L}Yb1h02LYQ5Pij5zlw0b&4 zWlS&EgG4WOkvf^uE49=M^X%HG#@gKELm`}ymPs0nlNCr-k)7*qPgyg>ZRygQI!xxX z@D;Nc@OzZLIY-qGWZUKzTD^AR8-gKWl&(@g)Ox?=g>qV|QUL{HhS_4MRGpYZcSC~` z(_X8B_cE`)B8U4M@m2|yWnS1^jks0=Kep!HAkki9TEKX3WW1b~EwI2v;i=Jyxw-jd z@2R;tGDjs^tZhFIIkUA~ivw}gP9B#qHu2zF69(okyd__BNAtKsp}Co^jjrrm>aN7X z6W3vQ=H_N5#~l}fcxmGa9Q}A{V^Yr`7%%{um-F@e#OQLMxPL8%3RNSibnFOWXp$1W z*wcL_Lx{T%Zud#5 zf3QNQajCUR=Izc5)-;Sz^rirgX7g!?a^0f;@%&KHnC6o9TiWvzb`v7)@i{bl_tJ$m zyMyr=Ysz6=jV15{c!Ogqb5yCIwA{I%>iq{1@i#^nLA5GP%3AZo=%Dca{{H1Ih5;Po zvs|owwgk-M87pJZ@HUg|1u|2}BAxU)h>S{#Y#%Z~6sYTO=R; zgqTMJlaM)KHnF(Gg%D~urPupeX@h5l#{KB`Qo?*?ByfRQM}Yxkq>pEA7V4%(MHUrZ zJU1=%5`X#w9=8Uf$jywwD)$|OiGg#Tj;%%*p3bT+V||Kvs=kNp$?wgf zHGZg_PRlN{M;LscMf|E#;x9m?Ip0}9V+7nn4ULaO@quFC)dlgf)Rb=$6S9};3ez)W zR#x>qu3>4hYJ~?%bYH?hcyhII!&{Iny1DaTH_bLR)-=?-_>g5rE-er zutdMVK_ZcD>jTGG7QJ$EYhHcPykI}!jJ4VY|4sUO$Rg4>P28`y_zsg zS6+%@E_H!IiPLot15Pc*j`&9&Iq|vs1F8-0YTp~FL!+OltEbi2Ww!BiF0R*H5b4-L z$MRG)y+z!Ii{0`#Ync7mvUf}p3{Aw4)Ea%9*}4$jmPzqxR>*t9z)UExcr|s~AMu2t ze>A^7RG-ZNBs6Qv)02U-2&PqXc&U@&InyMwy>?(k-Lw!$HI@DR60PN`twFfgB94J| zud1fpYe&@IcVzOe=r(m1Mn#t@;5^Ws-k$taVqO*W_(aX7PUFCigEKuT)+M;#IFa7u z3|N$sqJ>5C;=O5uBB2qc+l!|>qDC=Px|lomJSl~&effiZ3F>+QyE+nJo41U{>u#J{ z5S0$LhTH`qqE7X@+{|ypu{&&An6X$!B2J8DLYH$whU`j3cg9sI3}dPFJ_Y%^Xu`Oy zFWHHD9xzFldn)-&m1XC44!^gdF4f;Rr-A#+d@Lsxa# z?gTLBR7XrbNF$K67|*sQ+~$0jmIAK;F=a|Y|BmjB>Ug(){)5zwP2|$&t?0M5{dtvicW|7J`cEfs>K@6WytZ5T8=QD3y< zb*j5W?G4h}8Slv&xg$oFyI;?k?o6@mvd}g-cSV;Yk?7qK@J>Bu+M8jE$evhR3@0hx z9^Qs*T*ZYhMgG7^`cxlZ4_{D<-#Vwyv7VB|#W$zpJ@92*wf=@NW~L>!##6DpHRfjJ zk$8q3W}LD(z@WXUzwyYiG;o&pb3w@q^^a*q3xR}rB-iFZi9Hc*PyhEB(*dPLrwG%L zXE!9c);%k@{SoUZW%aFPcKkQQ zxF(KCJo+yefQ@q65lJkQoUs*#oCC4w9AmJ$v z-7S;zW^H%Heb76iWF0l}P3;+;0;)+Wh{ABhbY`hXS|OKE%_9p#zsH}1i!uC_QjuOJ zP+l{Fb=Zsw(T#@%mFy&a?fy7Z^N*_)#i_h{CJ%bRZ+)%iuHAKyke%RD- zio0ozVCNIEYAamS&< zh{d}~>*LUq#q%IGv@hr?3@)6s5Cl`y5jP;VVN+$Q1*>Rsqc?z#6>}A#Q zMR-z9n5d~7V)0O$pccJz5p<^ior#G_zO=S>ZdPU+1-KxiO&fnW9~AT#5T)Hm@cegy z;1>TAA)Z*WF!NX+L9oR=2w2SPDH7kQVWXDUKUXnx3peU0U=@ftJNmG7KXu)s z>MMZ5F@WHxz7*7LYHE`SSl5^hY;GT{#cKoEo7yuq%LUn>kSLrTDwnbVk#ru5#DT1u zazC|H{FSnRTmSin7p*1`F*PcTy*T0OoS+0-`{(<@{Cx#av$azfU#4SjeufIr?Aif# z^Wmz%I77&Aju>#7lSBmVKLzJ$)M_$E7KBeTbSUKmr*W?P+;}uN>(D}|5=FdD)Cjk@ z)&a=tPYSP9q3n*SNULaW#8k^}?{K`@z+i2E|G`I3|EEQ?f$6+M2Lo$pq8EW0uXQ9^ zb3*s2ZQE<-PiI87bm6-J{Msr`)G)H)0c{V)9|qNgB)UGMq&lRRDs|cs*gDxRO8-1y z$%h6e5W1LOuOh)UO;FKZ;ey2VXDh9-9^^>fd0T5~3>^K{3JuD_VPf%8#t z-H)MS;k1^isjcCCp}J(jHV)&?3?s-TB}0H!D!bLY77i`hO||?6!Hx86luz$_p;jd% zk0i7wA4rv0nqWwqr)2C`%aL|~Rp$Cc#N21V=r5q8UteH5Tv{XShVOiXn!RSDd0!l~ zFQz!jSu;)f5PmC%Y<^(eFGexJc)c$zT}d8#;Jrh zWiv0tsSn;o!UBGbYrw;NVwDy=L6s1Tce*1=d@it%0ua|Tj}H{y3KBoAS&PWk`zAiD zrq{->iCTixabiI-owKVdwjWku?VXY#@YwQ37i;fv&I4~k3U8^kPn<0Kh#p+ey4|7v zPX@J}KN?}>?Np_nW=bDi>b&Rq%}V_;HcxMpf1nQ@FI7=?YoL2H2p?b0b@zTv)}2`D z;yyJpSkca2Gh1+yRQED8SWQdwp5H_Z{m7-7TJU7Be3jnrOXtKvc5s2S!-NNomPnps z*{li$U(QP#wPAx{9D_9W0~5FYZ2Q^AuU6ap6|S`RhaDr)k~9XlsK`CJu*mb<21gJ1 zvqqzKYI|IG{9ryJfys;>SctOTYq?yy^^EKqw))KPW76=?!MC92Kj%kXiRp_t{sM+Q z%$qf<0{C!W7|ok##m;{*(`@*v`LRp6%`0!UcCccMBhT>9?YVmJF0osOxKTFwyGAMx zY}TEw=NFm={!{LmUCaqu&|8mjm3THlJxFP>i<&CCXokT!C*9CK*a*q7R2h_=$tTt%_6p^{CHFN~V&~V1l8f$m3I1*~U08y{(IUyl zm~a!X>!y520i|2N#)HseOq>r=U+cR!x09qyhzTLI}nm_vDN}s?mv4J z{}yLvU9(qp#h8fn?z=D!`776m>BP++OWUi~>Zrc}(^(m#bLGA2e7Jr=QmQRpc+!mW zeo`)~?qSu_?~R>zs^jq}qwbSBV6o%lXDK{3GDk!6lq?+J8Xnu`uB>}YbGu2Y`-k>T zb$G5_r*OrN$7wd!DA2~4V$@@1f`!**8}ZG7?vk1^W*JhKnXA;OlbRFQ=nnQ4<(`Ck zu!Il3RcW+FPA?BV-?NQC?;anY+z>o98Xsj5B6p4at*5ho&n3ya4}e$(YsBm2<~Q)D z)z#?aay7kghdXpliKuLGak?#UD)7j*Rf~=#FHohtR?wH)hTeD_@d1;F&2yV9+MHE# zxA@U0^)U0~98G13s=y$V6$FUE+@MkXAm-Au2%Hk&WMB!acgf592y!97@P!oZzQ@`$ zPR_JgU1CdzG^QtTYC3|tb-Fb%TeAQ6G<(G&jCC`tbFB8X5ktBT){ z+_(gE$L3|5jvBvQ3$(kgznR@ z%T(A@Z*{zWcE?UtbxBi*t2O9ccASl@%%ve>Ab;s+1{jkQ`2lAzDnNO zY4_~-jh152Qz3meVl_bSEdQ@60K4iMSbbwsp8S@bosM4^E?7`Nj)nNOT`{p5cqj7Y zjuSVem*}3-hvjhP^WnIY)`4}S9kZp6z^v_ zZ1q1t3lI}D1US}cJdIvHL!(ik_U?YILXJbrR~80Z9ok4_!Hz`I5jT=?D%<5U_(3oE z*C!G=y??(0*(WO4qad5dZQo#fa0hSwW-4*Up{W%c*ISvNz^^S($B^r9iosgUVGPJs zC8JfM19Rl+YIqc=bZuzWgR`Y0DjeF@k!_xRCh>4=l%Sje%y3nQDz(4Qm7?B52Q_Xn z4ymyzH0GNO6LWpiPAhv^;)B2?+HFDlr3hZ9o235WA+fc|;}k0&Tm0OZcEoUy6O|+K z1!|S=FClCyv29duq(##8CL;w{?aw8mkz2sFq|yROl@yU%Y`_;%1m-Xj9N4ha^Ve!E zmJvSH)Y?i2;Im472V#Pe@12Ldy23&t!D#f=E7j%)CAm;6v}ql=c|84W-gJakN)bc1 z?z{=-O{U8VS_iE4{H%m37X}8a3b%O0lC(@25nlIImNk5_$>grF>4#{Pz#Kn72B={k$jE?giblYfA6h`xTWG*?RG%Yq^YNacv zv+!LO>U3Ybr`8j_gP$InX=XAAu63jkKK?}HS@iO2u^I4|9P~&oxs4}ZIN)J~rE!o8 z#{XtWM5*GGs|@;Lp%Zcg*>5s!N%4PyC9X@6yz7yJkkWx#8XC^H2x){@?B*KPHB9i`m^;q=~p6HTpDttA)hkB9SwTc#7yK!D7dk7zpS#F1n#xIvGgPcJq9wI)>x`gOuQv7G`D~Kpk>-kwny=6k#Uty zqaW~=zPJ%g_?4RkzVFOsZf-x6EVxnQNTAKF8CnD%Mb0)IoI!#$U#A+H!y@l)kZl_{P1NRv z?Br8gEiHN2=R7q8_+2mDZEYjWJM!srt7u?630uy+`}ZGo-&0$BAyE?tSAI4A?&c7%!8KL4)#ptC)o4ce&& zCsitXk!F#mTHf%iU^c$mg1eb=##j{dHYE%Wms$Rn&hFv($awv3 zvxmdo8_g{Dc`l7+ftl!2yRn!{Xt2xuyNAa|B$?ZN4-Ss5Xl~SRJh{P`2aR5sHOVU0 z@kvl&eGu|(Ji|8_(`6V-(dh5)+8-DQ8k?FYEdck|2NpJlf_Jjt#o9RxmfM+7BT3Vx zWV8)y!8Hn&hO)7_rk{AV-cFf9v?d)UuL#9Vql+}y_OHbCg73^QM~q(Cr~?PeuwSX_ zhZ+jmRbzUDrRebx;CrOgII~_B5Hx8O02c>K_6+3i&!q`3`bCQYdV- zQ9VE&AWk4VL5?Ce0by?be&6A@eBmBFUdt-23~w#iy6}z1YD@4G;UE@8-Roy`TS?da zGBG2s_=4puTksv~!d8j4^rLN10;N;1V*q9ag5Hj`OZg z7>QvEF>d}3bA~SdghKO76;8lq%9X+G#|nFKm}hY?272F4b-!oH7R=8LyL{v7ZDVw$A-2HIDyg0yjah40AnlTaBug{gKgVu;3fl42bBl4|F6 zr#%IV<*Y~QrP}F9cV94&X?|q@vyMnDp1IqLgINulJp4t3CB}4f>ogTa`UTXd1#@lu z4cFTW;+qgWG~whaL^mnQMk#DO9_cbzV=~H`T4aOOzt(;2&}T*`8~SQgSenZs$97s_ zQ!Mj5m(#jTOj!2V?q%gx+WXRRmK1Mpwzl)gyQt%ph{z2XT3R%u zxws=El0b|2vZYBeSIZ>Vt`q-#M1N5?TUzk2Rwd8n{5ykPvvxmj;*95e&+kHS1dCM? zvP*8vp|nWqAZl~E`^sKkjjp_c8t3GNoVdYc?CtoF?hE`@G_mH(vd$0ruLAiRd8{V; z*)|Z8xAwY0#tejo7Ol&Sft$bHz%Vthp$3lbP#8cn2%pz~-Q{?C`S$q7)O;rsdIe7n zhYq8`U?Mysk(8%GI@n zbx3hWv0mYd1UlnrA9~XUeQ9~BzmIy58l%P4EX0C?Jp@_=vRIkDnqTVbWfeVyR+Lm1 z-{RqI35HqS!WncdII=4dWNd%|=jID|7{em2#Dacxo!LtKVCsrwfZA$9mO8^;B9PV4 zJQ^C9c!?;en5@{~EoYUCDhr-DjKQV$Bdb|Kt=-66)9XlF^>xG*RnV#4AH})3xt+st zCg>fI*9>xO0nOnFFMv5sb9F%u&y6Q(fK1$nhYM=WmfyeLm)mapmbs~OLo9X< zOWKX7*!~Onch>S@Cy6}9*DS%zH{x}w~0wz87NfU^`Eh z^42L;Sn%vxWquSkU$R)Su-3OZ4@!TwT_bbo#NvAywh%z(-MtpAR^GbosoT9qpJiq- z^clGSan)gW*>^gqxtS+$&Jp9h1b_q2_#M%3dXmB^7r_Yx!qknWlY(*GEWbu zP~4cQS4{pqk(*Np&e>uUSyvSJwL45wALIk3*U742WUhXb(`-?XjA0(qsX5h~%Da+W$3lX85y%@%|ypNEWX-Xe;1rQW!?z6u`T&EQwx1@Cb+Nd`(IpRbv=<&!nw)EW1rc?j2y)FpXZdCP8g zRVjyjrrH2++=~ObHHSbR1HP#$jbJ<_@AZ^`wSoQzt<1|?U^G2I4%11!a?Rh3)ucFT z^mEYUWZ^pXFR<7W>=TP%w~P^X4eIJE#_Crc+ZJit27$lAW_@3#9~!y#+jv!Ez^{7t9)!~Vw1 zK>3G*ki1_L`$ZEAbmPNo-knpG@||PW+0HFOq(( zRla@8l0Rvtyzu?}UC7T<+*lVPc>%9dR+qO_9X6?8;om(h#<>Kj0=MAT&C}L~OS_jA zIvPHt&zqiF`*S^x9(R8$6Bov(g7`fU7__Qb;9yno{SSb^N$5VTaPsak5*wSb;JBy9Bl*&Y?(IQLAm?Z8!ZNUt3Cr-pjEt ze?8%H1gkKDSpz?2@)S0WVs)VK{|!!1$>9vcNSsZt0o9Zxg>3B>m#YX*b7xP6?F#+; zHF*=JKDn>2Saz#E=_Z5N>Bw}l|JDq1x%>+ValP=dD->XkV)5~7ju)Mlt4fa99u=N+ ziIBO1yNBzj&&kqAsjFrbDzbbnkZ0ljm3II6Voef~;db`7=z-eXhuIlfmIddQ z&M!y)UmnvdXs2MSs3#wV+k3Ny1qz6ZZX79GwWwPZi7iMlhdo z^_|&TR3XY;Q6v9%2Ne$`L9rYK#eLleA$dv;k0;e(HvrlkO5=JNUz=Z_ym2 za8c&9_iBkEA{%COF2H$AkecvcfaM$B(;<;SVbz#| z9ZO0Zp@E#jLb6g9-Kgg0pL`1or!k`q+9#FWbx2CoGYu*GV)j3gjArJ(rGF%_$wST~ zEnua_N=U5E0mpoS@yQ0aw@zuCyiB2X@@wI>=a1Cc=+P_yt!EdOQnc5=(h;hJZsMrK ze>YR(TUL@^zpIc;#Ts!vNI-S6M3h72=R(u5bFB34^@hR>$#$V#wBgq~S#=xXee%Bm z+rzuF@Ug-6TgC~SpW(lEy(hD#pNmQgNe|-D+Vkv_O$7&xTifL|b5V8d$uUNQvpB}s zPgYq@s-J7-jsZ<6d=jX!g6Yt*CPH(_@HpTvTq>z`{luhfQ%xt z+s{i`UY~(1rC2lH9_Gb+cE=Dl_iYn@0lcAp?~G#d6KHq+Tt0HYA!Ux&r~C2VCW>A% z>T87^qME)Q%!Q}P=$s_4AwmeQz<_|?&QCIi#QzQv{w+sT_+^jJiFSKrUY}(x+IRQk z&Kc*q$0Sobp!76FFY$4@A?{Hk-P`0uix)NaPEY##)U^S=p6wEEne*uSQ~gzL@h9*y zc-n3{yySMHpKK)U$C72O1v+f}G-lw?kO&tRaQRwPczvI*L354G!jyYH*);Pr#hLqn znsv;eb=2ctov#C9FH<2>del|#JUynPh}mKn_$;l3pw87zUX7B!PdAA;vS9e+dq5>A zDUS5;uYg?y)tQEx*n*YMywW)Kb)Uj7mye|ST}QRK94Q?Yw&TZ9Gqs)zlUy4&}tu6ysMC5$-TMM?r#V`Jz=Dkj#!h>ItdjV0t7TaZg$r^3)3Yd|?DV%Wv z75=+PEV`1Cekhg#VG%Kk+2^kJ_^)B3y{CFu(JlOEI$Ciu|5|jIafq)< zuoJh;E!FSKXJMK!=hPY?Yjn}>QTq(t#T!%k+R2E#xi9DRZ^ljqmY;w{ee|(-)J*<=|a?wo^bL9(~q>4X9r9M^Z_*HG-uacgyW1lSAfe}aS;<9e( zxbCCh$?M_&g}lSk3D~WKg_7&&@ZXlT;|R7$ivJ#(v#fASc2avQ-!i$E80zv&&EB;= z-Y?dsnE1n&Po@(&v%!|?O;YOx6+P_C!}hDh{XdsiSNYHJMm~OB?zMjU2nNs zP`9rerz2XX7e6?q(bHX0vJ2?DMhO8u6<2J>U#}$1c2-VraD7v#Dwq%L7VX(kEBHp% z$1-z+_4@Ad^S)Cl%G>r|VQL^F66szir)c2gaG579_mHpMY3jNUov)W-;!~8k$^QDk zcq(^`Io$=zpRle*id=X_%G4e%=q>vUc1^^C#H=ZlJ8Q)E*0cIBW1Y^=$a-0Vq$>jt z<0}?gxR_o}D7xHIjmZa4P$_WHM|C=ri2tHk_8wpeY0r4}`K#)X=b^Xf579dH{{(Lg z0IoddUx4|^UjXRd;QOD4foAZp)z@)V4|9W3cwb+uoAe7_1na$io{&GNk9Fg(+*HAS zJ1qa+?^izJF3G&cE^aupdZD|#SLzv%Lyqcpkc0Kdv|bsW7v=BGEc^YVKaDj5o;TuW zh|NPu7Wsp4$n_s*{qMG9c;-rX5$NN)xP>8QR2S8;M08W*4dnVSz+i83I&1knc!#;o zR{6+PK7wMi`g>3%`cLB_AkyAeJks+r`qkZr-s{J5KeFN;Cg7t%;-{&f=SU*oE)M2Z zhdp=s3&3jIsI95gt9|`;?)neYKTe@Phw*;0yt?}gV6k5({8h$6HZ*en$0;3TC#SmT z7xb`Ph)KWe_^#jdWcRT3-l^?~Y~@d~@$M1tLfY~-^V>H4eeR#pjpC8RZ0K2khM@?L zo5nFI#Ov|%;~?c}`D1UpxGuT0=X7QqGKz*edxzC`9;E6$d{YqST1#$E1n8<#kvgp~T ziPg&XLbuSb3R|~!&-De>Efs&>4Ut%$qP}nckb&)9e0R8&ue>WVt=UnYjs6@MM#NNv2h^cYQgcDVxepcp!`2GcIl*JSXv#$dLkSrhn8;) z_g~N4S{aD}Wc8sJ$dCMb8A124qfp54w9}4aO#)uq%r;n|zQq5hkWpl3i-b5e&?KVf z$PNKtbZ53x5GTA|YTJ@utdgs!t9;l8e{}E7qYsFF@nTmzwEwOn{~{Pd>}>kGvzAhU z8+W)fQXWs~^4e8pD16u#flB7%?H*Q~*7r>g($Ks%2C_gqxw?5=)4AQnqnN_Q1I009 zu$bGnSS0bjLQPKU2f6Y1$!$=u;nrccoLk(FktnUd0Gw2Y{`03|2)1<|Y zYcd_>HIXI%WMMqhy(vloy?n2$bbS2Xfk*Adyr_C(XcN4g`!2_R@p|sKZD9N&D9ZM{ zXy-EMwDvZuS5;z|bl4aC%dV|qxf`-5D-FHSzst(Hq6!ZFwV|)y*S200hq&th3qS^k zhqP^?k3QQEAQx`$`ema(<3yJuyqRAIyq+_B%o!f6l!H??>ckVZtV!(K0gEF+~)MuDC~u#i++uPcyStjN-d|mpS~) z-%(cVR-{JdruK648VSx-3JWPax2gefzxkS)lK%gPvG)#V`;GpGQ=_&NK`CO^ETvWz zF{}2B(AuMB2c@-Bt5%6wHDlIZrLC&1YVTD#5Sz9_jD#e9@6Y#p{jTSFp1&S(y(N+L zKKHrLdEKwqxlhWhI^8y8>r}kp>UIp8?<%yn4yuByE7m23EZCp(NjkR*L~E#B{t)Yy|!ke=0$dX>Pi@l$a)n=3teZ zvzaeMzMwtZP18_c$|a?k_(y5lmPd$^x}-<$XU4?LCmdIxhjJ`ZJK@R&`i`5yE^w?V zN6l+XX78er2@*$}o^TaC&EmTjTyVLF-XP6rA^dL0D>3!yNIyL(12)O~m3%iWELsz{ z=M$<%=5;e`77o$YA9z7ibn5yl8iM~lT+(esnNtt#BnyHsWdDra!jJI2;!eR0+3rETv7Y7q_m>l+=8=LOFEx?PyXZ zj#qbkpS7g~WND%zn-@26OhjpC! z77Y?4WGa$W_scAj4chmxN6s8C4LRN=$_xDsNx47q<8HA375HCCBh->Don5q$g+I<+ zC|SJ5hy`mJh`>#Ext`X}8p{^1{!U!@h}zsa4LmZ z7$P07r8b-&?XZWGb$Ih7fwg~D=BhplAe+0(P8s4XYm=m_CZTe@K8~mR)1F7R5xSWY zHwmh0hR2i%UTH2Bq;v1%zXK-Zl&TxR<_p;FQg*4tksFJFy1iN;;rR~KXCrN3=41Y4 zv{Ka{3R5(uR~QQZuzLXA?pnV9DW&1$Bg%Jb=C;okzbX$D+<_GH&&*C`=30e3A2O}@ z2pgSlYmEMSQo)90T#<~gYB)!N+jNa#puwVw=8A0ZU>Yo$W`xf;f5 zkcxu4nb>mJka7Q2E5_%fEm^WWoEu@VE|wi7ckGgEh{Kg?@`X{(;l$wu-d~fBy#~f6 zE5V|PL4IUsPxaWtS%;MBfIkMLw50}l(VB$`Yq_hH=(!6J_{R#&lIqN}UqOVZ8K9P| zU*GoB)zaj9St>d%$0@t!+!z@ zI(nt3(H2q6Tw%rF%^MSJX&#u-XoC*|68x1;k-p;XOj>d(7{(HTXWc+>UkX2Qginff+lHb%JeSv<*1kK({-kt zhy>fI0~x)BM|Y-TbZ+-3 zK*r>(lX`~Je5s&n8By^l^yvjCOpO9PHa8{MFm>#Wzw|@nEI!Pel>Mg@{PK_Za`fsC z)cI}+uiL`MhT_@T&X}n^L=QF$N&_6OmagE{!O<&tH7I?DE^Jv*VBw>TF5hfTy{Q8+ zjC=}hvu!xvUR{n4^ZCyFi*a`wx->MDOHebMY_opN4IsBU%(nc)cXhgZH5dS0J9ebE zT#DsqN4z`^T!(&z{j51w&+~W0zwca_qa#?UIaB^c8s&zkbnU8eno&+IAhdRBi7F zNI&M&@g}5In&(2|#;K?(5-@v4A5?&vDkg>#bPK8CFX!g=4$1yV?dY%N>5StN_{Yo? ziLbcQ;#DquH+L#)5|vS`ed2gM*Sf)20rnhKK{D~9S~G$2%`wgly$sv=k*$4y<{(U5 zchzFoL0@wKOXkch0Mv-5hPxHn14-4?ciXUmU}h-Cl>&HQqaGXLzUQ6rvIr&xB2nF* z;A$My=AJ$3iH%huPdQaRS(@2AL&mPey6E*6_=~Rf9Il^44`3oT?)&@|pKq5B43^Zh zSM%K6-mbfI6y@+5t*vLU_dRhsWdniKtju50Xo?teR~1sta_7a;vl=622p1V<1iig2fZFuey(o%4jo-tE?H5!5k+$n zq)IoR*?@M@7oJ96h9Goi7G1|O#2c_7O}djP)1+C#?zWi1!q{{>d(oeVvokLlA*sMIhzdd2sk6q69YlO(5SEdp)Y=0Zpf4Y?yUk|uOCWQG z`%ERgyOdlqx4nI4Z|cg8mguk(bCA#n>u^>xIsO|dnbz)Ca}*smtM248;(rY+mf_d{ z-j;ws=kWI-9kAu=-Vj9PWY=$f`~|3p^nnc9Rxg(#b#1FbnohcY5B+!VQMze=&J~H$ z&A@(KCA)O8Lq3pRI`O3It%O#kS5Fob z6Ac)VIR08knO;@0azDM$eal!Gz7FLME36PW2=hFMI|v+`3gOhWApTN@qQWxIEY7rN zX=XzMvf`!|}}kNO8GsaeXaokywzz%Uip3%&7Z5^{=l;T=JIWC$+F2xxR^T-tJAiPe@eb zW&awEHT|?c8aH|(!K0eXin>pVZq=r(yPCiy@!=3UkF_)a=Xlf3qkDdoS?9LS@s$Tc zqx29R^5I7le9sD?rHRh;%Pgi=II-NqcUyPU_5<_!1s{Oej^QSS6X!e~p{x zu1Pv5y+GdIa%u>kQtq{Tc$;O{J`8Q@&76O47oTl;lDiFCU9=d0DvhTeO=n55R`bD7 zHG5DW12=nhs1ID>zE(h3M-Wi$F3WBoMp9=ofDG4Z$XA!^6jF|C?##e>gW4yniQ;#! zTrStPF8RP>0^FlA;_m&u zhKZ?3p12x%S>zjJRdv8odb6=wQCQ_#+zHzmacLp>E>#$r$*cm7ka!A&mxZJ;!wMD@ znkLGv+$8rY&dVWqtHA{&^u11wz2@b+WC8W*K3z3fZA+aG<^4%-q@|UrHrbKZ5?Wn@KAt|QY$(~WEdE1_bKhW!OLs- z?Oj2eF<-}SV4x`nM|h|(+PZe06I9%L$s>O*c6jU+Sk>-m;tH2eppG|2|A_QPVZ=l_Eti{EgY~w~u{64yiAO4x z7@jatvVIfW!+C9#VMC(S2XZ?vK!%g*;v~}>>I0GbP(_UkkW~zQTEG0EnIEv9mv2rP zjUKAgpEbieRWhp8Mu?uHwlDjkN4Cdk%z4zMO(oE3K6*3w5H(XY*fH8vsiNXQc!8vE z{=?!}WcM&yOSRC#n@=B3lX0?aj@*X9dZxhTrfFM<5lS;s_6V3yA|TMVv;n$#ETg>) zNd&i9U9QILZJx#bYB)58I;=3FzP2W^rVN%49@1p07x$-=dOIDj zl1@3VL2B!u0JJsCnFe^Nbk|&_f@FhyE7XK{+s93W%EUnf!4+v&SJ3RdRQdA;^u>xAy)}bJ6 z3X7a7gwPPi_}-y@L@WkYClFxjzq~@I)#M3nn}CdRd>_q9ig@xaE5b2aLdf!Td%&CQ zBp;xb71vWvvow?%*2l(2uO9MJwZ+>auHbT}e26MW@1C{Z;KE8TtG87-+esT%DDuc- zx z8YN;hQN7r-W2Us~Z$Gx?1o~cmQ|}}C1&Lgev6!dzC(@h#1}7HU}sRI)jA6TiQ2p~= zb#vZf5yyA@!W_{NuxDmRA!-rFj^Nf9!miDEBpfe~x?$(0dM8{kMW!OU%9-B}z(Lc; z=LPCdqJ^SMjP*~FW}+vj=I*DHvi}DhTO5TUb9r0CF+M$84$#pV!pl^Aduuzq2OACv zrZ_9qR|skXvqSG%RaAw$N3T1i)R!W9cA?Bmooba(%Ndf6mL7-Y-f7J;0(XAITRCVc zhxkKY@!G{0YhY#)dz=L{HA8s4^o~CCv1leMcw{3qyvu#Xp4yZD}?`$2tM7+Sh)9)0Pgr5NaY2=iITcgi4U^mIR?~{ zH+sU0jITTb+}~{XXusloYvEt2LO>wwdBM)_2DTq_JC3J#F0u#E+4I(w{~D)K{PzQN z_ymC{7%s7Z1Y|YMo&6%yiko_{Q&(0G_-|^MIX!)uTGZG*x$=KE+QS4k^vkBb26^8*fG)CT|#sm7wqpy@=&pS?TY-7Nz9$?@JGDVHY4O5y^*}@3Zs1 zLB_@9rQq~YCFOAI59}f{Hi9Evc-!fR#eSX#Zl7J3i3a_sGg~PryBHKZKop!2*OBPm zK|V2)TQq{aP@R4xmTXT6TXVCUR<($6q`)H@%tMcu9r5=rKyQXWauQi~Cwd-Mhdu7e1t`6ngFx{hN1( zFin_^VT~%}42(z#l%tV;zqIuii|Kih>^?nLf!~eZKMih^q)F=DaJq*IRP>K)OSkN` zzY6tvBg1rJyN6{D3Ulu*HiW^ z^wS^(HpTa6`J{ujp~4C1&9JD$U5MF zZApH*01a@!h}79hpQrFm;F+NV_yKN#Y+;pvw0-{`8phtoPe8QRTpyK;JDY zg2lf-Iscbebttao^)KN9Bya)3(l*-i*ksQWYD_ya$5gw>vMt%9LuXUDU_j#P0bZZQ zmCU}=nFQvL)TdtE%;PD9PB#&#QSJ?Y7;10S?>ipe4%=yu4V53HYlulS%WV9){}vhl zl8K+N>);aPGD#Uaqbepzb#i9lB^|gZS423yRDSv4AlVJ(R!# z$|@sc3vp=+xo*?sa-iGJR^jyC527Cn=Z#H95gF+3R1dkNx%@=YAgF};f@S*q*`a?c z(>al=Po;YvzUW_hMh?86z5Ay;rFra6YuSX1H1d=jYAfHD+eLs=E%)N0-Y#>$|Kf7s zLEf(Hy0h|N0EX#=wOoK$9<0&8rFwR|f#z+@l0_IHvM#+kT}>asK~nqz#P!UPH>n(( zBsCqI#35#0l&xG78xV?CylK&jT!ScVky-64xyCrE4wr8#MYGME7k>}R?=Ur+>^U{%V5+1stpv$H^c+rI$4av8YX1-C;1!)sHV zsTY^DE+g=sPB5~!>GQveXp;$i8FJRF*rh)SB9-W$uY$1OrSqybn&TJwKHms(EUHuUV7J04cSTwlStjg$Vl>iKY2v zWwFH+S%cguwR?}Nwz_jI++E7)=Z%a>@?l~MS8cC9tA#B9(SpCpW^zV(#wnVb`vFpE zKkA(6Ro@&sDk*#J7&*wI!F>PTVbJF<*01%)T!@KZ5F<{=kp)NgFa`y~Hv?ZXE1O)& z4aAB!r)K4s`b5rCa$`+kYy5wgO7;y{`cp@49oW_na41Nvhg%iL^^$UO8cI`qe#nL` zADIs!Ax_NK7+lGFI*wV(ih9t)t8D@EZ;P`oK)?xOZ3x3GNqc1I5p#bM2ONr@ON>q8 z{Gc_4uj>19=PASTTT1$6=WH| zvJl=NYseLyI9fa$v+9l!lMh{rLx^{T{(F_sJGk~r+&ED+ZwWCL^zAj^?;B6uC6IWE zzOe!LfrJ7;wG?qk(VL9kE?O08Gf;;4MjJ%^qU(uS6*8VUuV0BGFz~0o*lR*IHFGvFPlvdg+z% zyJ?11v!Te=;%963b@mrb5irU=OI7# zzsAq;X#wqoBt%tSp4cH^-;U0&h8^1p4K_kAK=fb&hZx|^U05+GTlqMpE8JI0n2P!f zzU!Sdo8|U%ZF6JPG&g&HWCj%#P`@fDyOa{Vx&Ft&g7A}cw%bO_qAk-N+{nV<5PkK? z8ucA7m0FYT_b*Mwk%~d_eajBjsKK_?1!(2g`FripBDvDc+;iz~9j?SD!32Y9UVZIZ zcYRyS!g7hnBmx%5d!+gtiC+Ic54O0MpSD>^9FbQRgV@th=R?imB?S6C-k-%R8ios1 zVP6TT8Y1c(0?bxG zruW^^QV?bT^Bz~{?++@V89z3Py5ufvqq)~Zf=mC&oM*dj(O#fu=JD^_@HT-S^%B;9 zywN5?G9+?5E-@%SbNGBYr+EL{!S0{C&C}Prtyz<3sAD4KbkjRK7ytc{ORy%H)eJpM zvM7YCiMItE<6zbArV8wCtsOe(1Uj_FRl?YDa={(xA9Y6i`2~$y<@$)_snCDuawX7& z!=37v!t)PG_CU=yh&GG8YRfdozbJ1OTDJNEQ_9vt>dk(i$0lA9oiw<1eI?3VE&Mp^ z^+#{q=~IdzvLkYCQ!_d$d_I~yj%cRWx!#Q&1m-Fb>yY2yAqN{5?WE8%@WQn`hWM>G z^P1)Ar_p~mzxL`;j$ExvpuO9doG50|o-lR`X<%Cr^Zd)hAtUz4Z_Ccb;&SJ8m*026IUxNeoB%By!?`Ig9+l%6)lcC2Sd!Op6` zTtF|#3Qa$Be#Q&$oYJ``6aB9+|94LYIF~0c#O(V^;R1ZS&MIhae|O;U%0A&!e7z=R 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 diff --git a/文档/robocode机器人战斗模拟——视频.mp4 b/文档/robocode机器人战斗模拟——视频.mp4 deleted file mode 100644 index 70619955cae733068cec591907d400351c646dae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3300589 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

! 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

-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≧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

0>I9i4QF!+g>FoER%OXOK! zHGxoGO>NbsUGR!bt$4bdhKo3`t==?1!lC?PX!sA(0Oync7(hVjNRE8^|CjNjI-sif zw~J5g$nK*pq**3B{A62^(f1)H9VU5;-@6WSxUH%onRHx-PsY_sPsgmtvW z-c9)_wK?cbt*^@soFEDm3RDOI8FCAo*wlM({pF63$}6`}N(O33;XM!v2&xepY{zU) z8fNxkY3Y`gc0pGImL+f5r!GoiX!pWXPc%#eKzVE|VBP?vU!q*~Et8uZ`tMj3ej}N| zhT%YiY=@+9kJQu38=Sy-ghdgLT^DQ8yJ~b+10rTDr=@3+Juxk| zQ}(T3{rRIJ0wgGg&C`Rby3U{{lSEn8e*nqS1`kAl(F{F<0aR<_?G}HCZ5@?~0e@rk zI3hTu9P{ed_HFEfgMN@g$gb^b{0d*?w#gWQfZ2k`*x%Hk<+>KTeZ4-?2*A?FLR&d- z){o8$yF(H;%3`+-IK4X!Cq3DK*v{5Eb}Xb18E&E zV_g@qZHh?=6%2%fOfAMbqlp;+n6AIOqia9rOrYINu#;yd__-|LQpEB-w5h|5Mq4Yd zU9gy$xj%-pp-X~M@T@fn88eV6O;I z$CCP$d&_kXji{GUBU{Ajiw$s!T-TT7E+_fX+6`Tc-l8M1*VFNe8GxU&b=5}VhAlcl zZjL{f@|_>?OR@ByL-zK3(Qgbe;2Q~JisW&}gA4q_fY5Fv)z95c`iqI-Hf!f~?bhwp zq}bE9bfwahR^T)e4qRpzda`XwEj-!-E?X1l4TG}!&O-_R2t^P|y_576{QOus1XS!{ z*T$Ao3roq}ilfD%rOop-g&dG`MADgsjyZ?9MV>+(z{;6J{yzrm@hEb9g-NT?6Tqjm zu<;Cv8eqhA?TqV9RN$K;(e}Sdfsox_T-_T|d2ho;0QZ467a<%bJ{(a?Vtw`Po0j@= z5F$CrczJ>H>o}9}R0d?~H*aa2uSX}OdCE0M{1t~EHKgq*H$p~ zOqE$SZKX8rBOYQ6tEVf*C^)`N>6jKE_G%G&H%~+|2 zh*0U=pbMEfd$vG|mOttq|80ByY$P!OjgDV>n1R73?D=r}ptz9|m-fj8tZhCs_SBAt z=^q3fmdrptHqC+^3*n|vHuiZ2(2!?WMq={Sq6RPJ*uh%S!3wjd;e^TCMKg2?^u(Qv z#0?ll@-1ok$T}!hzPe>Kv(?4pI#s|L6~Pa$3Zi0VZ0eGLZ4cx{pPAXVjZ&9AWS5d4 zy|zPhtd2m^I-8rMGA`)sxj4(p^&4r-Uo$Dh!^%%4be5LMjX^-m<+7BHu77*?7)h&> zgu3eHkgww_A}!O@%dQEr>s_iT{%o@yu|qRxwAxL3`fmhmE#pTR#C3{9r8d^c4Q2=^ zenTU7Yt@!PA*%iGRf;i3H`{tz8HyX!L1vpqeRqE34rdKWzO66dWiOPRufGGJC&TT0 zwUN~#D-F){u)KiN`(Pm4_X*m;A5okAUZvL9Qm>>WlU&NMPdT@c1;fxN=@`3B1R*ni zfeVeMAt?ih@(+t8H| z#^3+~qn#3$lenAK$+!4_IRO5z$t-By^I(RR<{ksNM>7eDK3u+9?w{WmJF9gJ>p$3~ z==f}eg_6aG;g`d3+|m{`#QNDo*s9yzn^QU|gcZLTBG)0?e>1@V>O^XpXyOuM7kY4#m*6d#5Y^6?Cwqq{00!_ihK)KI|s4Q z)N?rNM_hpRMOFpdbQl3_L!28{-6RIOtU6}Mjj-CC+1K9ggr7zeeH-LO6>NIR1T5fx zS{JDHBUhskG4-QE$!VmLRj)fXfPj@A4LJJYAD8cu8&}E-un`>qBVrEt^{;%|DKAHv zI-rQVT`S*nVbo{;Sn*we1PC?kmC3tV6~2J=hPAb*{V%wsbf`IB;FGKsDqO|OZ97=a z$y5^ofu1yz+~I&B8r2<fhV{zZl)Tmj7p;p##x5%nNUK%FA$vk- ztRRYcAyT1PTKO&_0u&ZXCROUFfT?&+6#}%jMm!M?H9{?xvXrw+ST%8S3j{jGWFtnR zU~nDr&Sql}RyY+eOpVJRKx1W1k~mgXY)izWa@1^E;ADObD$Jwo{03QF!!W;gLgqlO z0SG)ZCW3(p32tFVP%V#GDuAVe#p&MJ6UBr<2rjumtcZjmVI_rByj`flb9io-@JlFwbjNH6>0ofJkeqGZSw3YVe&y0r5)@oqG&deV zU0<$|aam=QDvgDNIv-R_y?LB&;?x)8Kdog8f2K$pv(KQlq{@Dudn%fK2^lcFj1wdS z5ZyCWo0%hev2uE>Iyh5J-3&a7oPqJ8-vWSNLL3m8UDp^rPAF8H(9IdNRp0vzPo%h<)?YW- z(YJ6d3F*-pGTaC$gTo{l$!ELjwr=ShXuIStNJoh8w%MVnpN{cMeMa6&S3p5bvBT?c zKa*vUnM5ez2$J4>$E0RIA_O;ti`IjL}f-Xx-`5mZK zSQ)BkAe)f(2txrcAErA#ysmu|x-2yGqz?wg_2ePT1gaB21`flQ>$Q_>RtEBGe$mK_ z9Z%vQo8rrN2ka;@i^E8=r_)cip@LS`D6E3Or)cF0`>-_7Ws_?&f^Ts&*ev8%TE`Q- zLg%tT#=h~VMlbMz_xq{zYuJQj+;i!$Sq|if9s9u@QZo};0N+$E`Y<8+MK;<#Lc-f- zL`gJ=*Dk#MM;go|$1nx`6t7@!C){)}(By)kB+-Sw@3%LICtw1Z_$ALwfINQhbc~bF z^TS7LuHwQDDgsF@rkpKl6nml!W&xE*1I{~bXLAE$f;D{>|BT+gBEnNJ z4i)x7)sMMLQec$7TFMH3?bH(b%ZQ|YlC>SXov>h1)k)ksPKT6-QkmKvWpkwfEGF*L z*NJCCWla4)Fm$_nMChh7GM8W+?g(Uh@qxs&cb~l`yZD8wT(-SBL(coRo^%fm?c%4( zMbx%7)^)?*6~jWo`{7GvkSTLGm2RtX*g^KMbjd5rtZC}pHJ*>e;~z}vQ@G8+=uDq>kPM>r zb$K!-ewc}daDBW!3}E6~Pc(#+@L`suA^7qgT2A2c$Kns0r%(9>hR+Npw$?Z7JLnZ9 z3^N{~nPrGv_!%@&I=S?>b*{;=)pz$OKXJk`YIbCBi- zvGD|MHyKWn8D#wby}mDSfum^wzJ6Lft?Dtj2#rDsAZLKPy31DjH;Io_#_kJD28#YN zxCjpvp?8o3*FBW&$PR?c6d(oEYejoXCcMpVYzdGy3jpm&dTX#~<++VyEr9<9w2Keou&v2fvoZCr|rR#oUq zBML+psY|exEtyme6_7y#l_{z~WUc5AS%dm$tG9iF4sbw#BWfUg3S^9%eVC>wDa~qFEHbSAI5M=!&hh9JAcgR7r zUb-~644n&}yXGSN(NLO7gj1H`ok)JK`qf*hK{@i!zeis#Jnsl!K|t@HpJigcvM^nm znETctr=3KVaE< zZf=V>Y4OUdkh2Ua? z@$3}tPM6~9N>nJuO%oSsZo$3CQ0)!>*dlhu@F`!>?$RvXfr~@-<_r0S0InYR=UR_f zSHzTtw(o?h%4I0K8CVG(lE@)b8katqZv(s4i&l7;J*pp#riMd>Mh|RCAa75V) zOi#7ni_R^ggBciP=cFZ2_D)83molXESpfkeUz0_7M)4l_x<=|HWC&y%(0|=gTc@6> z@W>+lJDx9M`30?4*ELZD>C>$i+8nezo$Ja

0Kzwo&Qjp$7w%dfBI4eCgKw!ZM=! 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

NpsKK1M`_Zl~JZX8o=6(X%|5Pq1oRsN)D6 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


-SU2s%-+BTh0pPrBDbD4rmI>){$m+n_^1^+F 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

60N$hpqy8t|o^ZGMh&{W-E_TRn{DR2q`VX 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

p@6k@P+twx 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%0ArDw$H#54B-~Bb- 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�Ej?v(o~Ggri*B{iExVxr-^pA(l+*%qC!+8 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 z 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

&GkVofPjIwc^=YuA4TEUB zOdJvR#9A@RUST^q>G;96B~f~u&?2&juNPU)QBiePg)xpSV_GF$lGs{22(c9_=DBLs zWbmxR?csvv^bQJFIX#y;ZG+~*7T=8ORD`-3p=VvD@r&Q2TQ(h@nDGXjI~jYRzttPL z_bv3L`fq9;!HIqKzOJUQ{tD^Y>|N2%c8NQ+sqy!rFjI*gR~E@w!^T*1&_Qt{CIM8N z*Vkxe1$cAJ*z3B&s#^(lLdraW)dhw3xemK%mPtHKQc=PxErk}I&+Bxsz!2j1BD?x_HpPPyyD80my&jp4F~oF;XS48~hBQk)ueIH@rL(9Z1PrvCOq^t0{b`bBvP znO9@)%O_<2F{6sQ`Y|n%u|mOW`|(wh#CA@9KXtO_y6KW^prhDgcAG@xtb7B}IY za6DhDUqPE6#H39{hy6rID&oQJVcpSF&1&Y}Eh>6r*>w_R-b4@dnHeJ>b2bn;+mX4L^FC0&;Z;EQm|9VwAkW9SLOp(PCQ>+ zLl(%nui}I;pV%-~IN>;jH+OcubpRL!<`zkH6|NL_rK&`@*InoQ)YTSlwo$sq6Sg_* z>@A}|&>Ei6Eyku}?fWYzQ#BI^mTS3A!S8A-pGcpRtH|QUGBYbS#O>l!x-SkX4B?L? zMPtos;-b{YaoHVP6eZQA%}iR^y@tDtZkF_R8^pi7E8v;q*J+FBwM|#U(kFe~thVpx zwLl6lpgo_=q;H15GKyScn}ASA8oKY6ncxiL#3LD~hbpR!<#gp8fI5{(Sa{#tu0kUY zHI?o}okJQYzFaNqe*A^`InZ~`jWh2NBH{8BJ!pl4b@DucGyeN321i3XBVNZ$#ya zW$O!oa5sYx$GAkpJV_Enr0CEU^sCt^9op|I4#KF*7p957-j2wCNVw0u06c5^r8hS* z=8@YrDr&z;xBH{r8VR5YWBzue`hxkdNG+M;OAK~Q((Ir_7N2zdXf@>tYHXX|v&Yy- zh3Q?4T#G^ee-edd+j*odxZ+te38<}${V#aHPi`BU*NQ!{!rkNA;IA}Zr4G*Y!72KBnyf(#4e)dl zvd-d+DA)CIk;fm3{l=weG2A%Y=M7ZQ(ZJz<=vvcy-?);&j2tgy?I>Ay)&h_=Pavqt zBSTVtO_Q*sJw2i0;5{`1PkCm7gOp4HvMuS&S~rI}00T(I+K7k3Zp6sMc5R0!;Hu z4@VyLO}P>Lh@>T?)e#>RyTP~R&)p<*)To=v8l@A9Su5{fi;xAgUsEezTQ|^{9|N<% zzAC*~Ag_d_!$&fK6*@EQG-r_<(P0<6Y}v%BQ7R;RTsI(pHz-0CUAA(i3(77{8G$6J zF@9Dg9tavNe9E2k{6!Kt7IUeeZ*P~e49?#E0%`1EabFvdTVQyvvc-Kd32!Vy{d2Wx zU@9tyS4J5xu-oODCAUi~HRUnX=P3!c=?!f146ZX)9I-RByy~UFa4WRiT7{R~Tfd`# zHIKrr+vJ_XjOGcRg}e{tsXK7v+a;Ou7?(1-W;$f@)p`uMHCk;bpqDk$r+hrPEVI#M zmhI@l=7^1(#5t^mltDbY6fSz5wh<&UmF|(yOqc`Cy_hmV#z(_gIu|^TTl)If!)`48 z`#nWR^se)+?Ot#8;z-fq{c99p;fttO^FG(VL$6QY&udqJQ;rzaRnRdN41qlHt-L=x zy$d|~u}8q_+jW=>WQ+Nqtx6aaX>dFdxCfvG!F;qMKcm0dcl8H>k&Dk-4QtcIN! z76&*tEmt4vw-v3z&Y}=?DFliaX8w_K?ehaMpXZ#j6%$uZ0L;I%#=AXGO}?dT2F3n? zCGlMQfjSw6^YLncc#Zyhh6!LJ$_>jYP$teZK8eK15T??Gf$Amgps?9$i_n5*Z$zNSPL6sxDjpmoxKc#stt+TA&hiWa@HneGcW$z66>Ts ztI~utk}Np`cbUqnFT_aHaJoZvz#j?dH4w`6{$=w)zxq87O;aU&R%%07i56vHnlq&B z+bFrvGM%30c^#EJE*AdTN{=@|*O-!9)Y*1{Cr%>m5CxK2Vyxe#66doT@Wl~Sc!F@; zbQ;<6#qR9^DO@4H4(2){Fx1;bqU=G5qD^Ibf&MM1%hw1BPr@f`98~Y@G63SsP!}6f z$LvPx&3gFBhKY89*_rtp_58}VF*{HxpM7m9gF5o?G_@-cPJT#S6=L6qq=PbP{DsG= z)zYx+=4Bfx@%)b@PpnxY3XJXsS2!Av_7tZi(H5!(I1hdMS18>Y+feV-x$&kY+~UPKdolyD}kn?fLWFMuIMV{Ov2C?qmdDtO{N zrH728Zz{_NG48d#<}}uVNHz0Q6-#}Q-D#9d|8kIRY)VkM=Hax$_^tO|y@Fo%edD_R zv35#VhJT4T1p+Xf?#KrohSoBVz6wWcq?LmE4iC#>3~o9060LaA$N*26_ACszK=N$Ke$LR5~Z$}X^q_YEX0MIa1x=pz0A${tMTm=Y^W5d(^JN_ z>n?S2?O29dH=$3vr&w#Q5qiHTq38TOph|!uL@4XH-TY@mD{$KdHveno57-D(!uQnm zeEzrM`4$5pJ%L|>a~+sJa<`%ECR&1Eb+L+mR$Gus1PmBa@N>J6k*AJ@JAroU- z#5@kTycD@jH0^{f0SKwff@Nry>L8>iy(?qax-prGYK0y_k3Ih|bNBEddoEMGt)|Gv5DRsBKsJ>^;k%XvecP?cphq#*a_QI@)B2f( z@ZJl$2#?ikW0KJb&I~Npn~s`?6N#uu=X&VMNPghd=IGPHRn%c_|HlUwPNARm>7h1^~SVB6KM!OYFlM6JI$5O1*8j zC`kzc*IklYlW5ONU<;>z)kYA<1V1m=bc%`;e5*P(YC2M%)n>-8>J0hEvncRsCy`H_ zkm=iOv>v$q@+8(bwHtph(O@?*8VL|9P&Yth@y{gucEat`sD!sA-wc~su(?7DUXP(R zfr|*w)WK?ch(f)sSfC!v2#Q1CIzMV?Jqi_HWUi|E>jRSKu9QxKgb;M6Q3#d%qaQc& zZZrbNaK6yYx|Jxy%NclSNyp-DeDUS&`4cKJ^X<|}ygnxf&J1N?WpkK6PypPmlV1h# ztX-;^6^x_5H5v`FE2nJZWqRwtZnb;)yz)DtYV`aeASR@rWMHX*Y9m$hdn%W*0vRV<|v(gU&yj~N9?fas77$oL_*j07ncqe0AAKo5fP`&8h>b8+IB z;@@53D~+hk56`oKj&_mxRJxCkbsnl>Ip(tPKz|xhy05i@w01l5gS?qgj{B5efDFk) z|BlV3C4^Kj&W2VAsJ7Kcbb`P5tFP8?ICtkhT5;pvoQPuCsCN^z??-phQj7>THbT6lCELq8!0?{4aed zh-Ey_V6bm=n@xeS3WVZZsl;qUSPjM$YCZ-}F-+YP+)6srE@tqpTdVRs6ckogOM4G@ zAD6P1g$T(ITTTd}gH|Ri5+`JIkJ3?p%Gy)zMR=hVZ5r2V#v;l4vA9?XATR<-mhuR+ zq~F!oRRo640Mkg+o;pWIO;-7stAW`!rebS*^YaCeDKP#tB-LB`0&XYha<|_JJxtvF zJe2-bbBhvFzf(K|cfN~1ik%BK>(s2C8#&4Xo;Ybuhb6}_!=U%tg|29XCyd9|L7)1_ zK@or1#ht-G>dnv@V~(vl_ak${;WTtEo(gY!^Cv?1&ETR(m;AGh^!6Uz08YdI6FRyD z>Xnyx2c;Hv-KATKgrLI5-?w0YvV#H$9g~r#fejNHol|%zf3{0Wc63obz-(+iV>ilv z)3XaHl79LAG}mF z_|zl!ipK`t2-D5=UNrzFwiQz)8g{K;^q8DgO#OxoVmP3%iI|q0y5VXk0kqAB8J9nH z!bzzQs@*RBh0=Q_A&gO+fRG*4Tn#$+~b#ubwUA2#}<(B?+)}-$%o3Dv!NGwTlCVBE0I<0^(R&iUe=aF&9inZsa{b$oZ%GrIP<18Z34XqA53oxU1&cx zx}h}im&zw(k@))AW`Z&Mgf+>y=!dqp7B)u?f%h8d*iC%2+=Zo7=zM7#SOx4fGD#_c zW}q$pS3cNtJ&sOn3y#2r4rzL@PjufvnJVr6DL&HtT*Nq>-meB?e!S#A!v1oAee>u3 zTBjswsIaygH2viJqMYg|-d9d||Irm^9+-{;%b!3K6qB%dfqNoCmICzV=N*COaFWM? zJ3;mJ%Ur%F#a%Z6#)8jZpHdaO9T0NnwI!c^s#q%$Pp84`P_qoyXeY&x$hes&U6Cq% z*Ex;YDcKvfk#YnE0`CH4Ml{lu_e~zwGi4J9X=#DQvGJ(Nfdh>oTa{^}CK$2`n_X5uf=e5ZgBmNX#=T9=lNuJ*kica z-w}T=fgZhOTErG=c91mu=>pZhfw9x8SE!jGo>QLOGyKvA1lW{c+=H01%8fA#UZ>#7 zD;I7AGF_|oqV9Q1R&^#m=YUzmV6d{iU?rI{5gD%_cQFZDsjFR+dW5yC!hk?GK+(-Y zXY*qZ20=&(e<@07^prk?!D)7}!lQx*Ts$z?Xf>uNXLU(+9pA{mdgo}J@U6hu;!qT- z9~-FgVn~w3NxF~bt(FgJ(=kO!A9zIkyIlvZ`0+_uJcn4HJo)l$HHYUqF#cHgjJJGXcG% zS#lRL_6-pZ31S*sW=pFSL4U7c%>B}o-I+>Abt#5g@Xi(da0i8dQs@w0$a_-t&3QOj z;#`(^^AxW@*p6Sb+)dY0yU8Q)L}hKSU&%Rjg)dT(!>?UgC2i>osVJ|@J(LPwN`SQJ zh2mWrgq&u8Sz%S;G#p{jsT92W7aTac3X1kpGQ zR&xRuCH&x*rJOqmjZ3A7^SJ3sL{yEsJMl>{lXy#MtDJhYA}iC`l42<^8kiM^_;5ma zdlRudpUxZ~C;u-yExb6Jc^tXsyC{t(zA$BsHT>i4I(jjBu`MfYZX={JnxYE7W;~uH zf|R*f@=%<7*fv-q^Et3CIVFKVEw5T3o+P9eeVB#rFhr{a=K!QBuUF2!vp?*8HFSBx zTp18vER_o9sulkPxUAdG`13`j^<*E+IY`^VWuJ9mdJV#42Cg$|u9iElQWH+5NgjT4 z|BM|FV|xK%?N6ZYw8*rzdBKAzL)1^rki?y`+F~pVQfbm9>J^I9-yJzeee(}k-mt(W z%0vNwnVMOrhMxgGMgnahGcoYm2fIt?6ug_!(wc%GQ z>DNBl9p6nt1(-+XkHCJ41-%`xdRbP^8SE;3&?^;gd+9H-UB}8=p?|dVFeYoG`Nt7h98HZn0Mcj{X5;?^duu!Fn&`j zdTF8x8#ZW;_IY$$=b}S2UY8ZLns86+C7kRGr=~TtoSd_F-$Lqi`=Ay#xEKgbZ)gy8 zBk@mTR(|eW;9wf{M>iZ@QB#Hu@|;p!0Du1J10%R+Cxyo1{`f(Y)bSzuxc2iXxjDk#-qDka2A%-%ocTF8*tb z){%oVZnX*6|1Q&k#b$*Idp*+^g_730y}Xi0V5TR%f8c0XT>F~@Isa{6)_>x=aNls+ zF_peZ7uk0m4ia!|)Qqrqn(Z<``e*P?2;X%$FendYKP{YWg@sB#St-W7Zrfu6qKNQ^ z_Z>T&lG&v*0S^j%_{+{`gJcT8_FU5;vd_s6P@MeCv6s)mCtqER3ZM#*P=20O!oNrCdV-S+V`EGq49HcG8$UcK!4E#BL4@X zaD|?{WE2jr!!~5RrBPYKDdk9T_+3+?2K`cTT5PPLpcJ#yeB7B17fy7=HcRwH?UvxP zn)$;|S_+1jarunF1fg&fhp@4QNr&yGNw)LE@}N5NskdY}^UOc-B9=>3>G|#vyVR7D zjPrm&SWrbHe;ZV?HK;{53){N>Lr^+7N-($71z-I^i*D~K?TpU~B}Eg$V>D1)kRD*jRHU^kePR&Hp8oX}jRWt;5ak{D3fM;lkcc^%5Ds|&9`hL?yA5c~3a@(Lys z6u>NOJXRGdoR>@W!r^@Wb&21I8o;fEz088Qr_bq*ih}Ii+o?r6SiR6XTWQCcL<3M* zKowsbP{)8sA3QPmxTwqKXY!n;S8(9x=vX zpQ(31mNl6zRR8}kO)_LP%?nYf?~Eld?Q>SxiK>T<(tr?fU;?+#gxGUCpNa8-750XT&m7>3>L6?QShb*_IvDLT{SgNO zQ6KfSIc5SMzf)#LP+VajFdUaBk}&za>|pED=bA_`jKof`a>RX_h$Z#Jn4i&!!_l(o z2?(dK_(6oRf}WASLLW50_Q}JpEuKs2T9KRD((*QvbDf007T_PI$&&m z@i=fIHI`$EaRzOWgK5*XxEW~-%s#VWs}qX5q`b#-HC;g&R=F~~H+5Cpax|v!2S-;i za;McH)_T?(5Xv5=ak|i#BpizhK#~j2?R<9DaiiZYqEK2bAe!r?ahgFd@JV7dC5^Dp z)t-KG`u8G*Onrg3UL4L|ggTN=0EDN9J+OVJEr7LrEVp8BMWe0_wX>#s^vb*f2sCAc zVAP;Bo0ykgz7}nLP2uD^*V;Y}Y|nWIjg(H%bwso68z5b}Z!n#=bJiFFo z2Lxi1<#rn-tkxed)hKLyX#qi~(%+j&6@h0)Q)Ynd?`wm4{P}yRpQM?5x*(A=PoZYj zspy}5?*_!YcXX@>e1;N#Kk5_0(i*7)=FkTG@#`5j@!T0Mqy4NKV7Ci7t1oyba9kkR7}wGs<#J4u%iCQT%cUYP_;@%-uZV&WF% zF4WoQJx{X0UyAz6G#4GRp@a7lUYq?^gB5J(gWyQ3Dwmyz#U=9wIzK|fw;gF;TK@Uq zK!Pq*4*}VEoJ?y|?{XbQ9*c&{T$bsEU*_-ME$^vC^o!qCHpDrFGvB#wDnDk7NXnAo zJsBi7x#>|m({b@GKf|57jc6Ycg^J<)lIC$Fpv{Clumb`T6ss82xbPSNfcOGSD zUK8lCF#EW7-8l$AuG z{mLdo82Kn-7NnqpwPXBH_WIRuTXVfeK}44Z z5N5{0kn8Eafp*m7l%_d{#!vk*ULi_IlCCVE6frDSzI;YFH1Ex5fixx2{5>6gW;s8l zqty}etEBE>>C5@L8yCkBxWK{gMZ5hB&R+)9i@K#GUR5U11FIbg$j zY%|*FtMx8t`88Qr9&vPokg(%n6N>tl%p4oet|W15a|0}Q=%ha^XRxZSMOscHiq zV9cw{;c)!^J2VuLN}slkc0u;->fp`in04PuG1g*(5Sv-vlG|r66dKHQxHG3IYxTE}urG5I%V3)d5hR{|G>qN7pm z@6hYQ1#Z1XnxaF8r6C&CT@{Ln95Yi&y0RKTEYWL=u#iNSxz3d((8{cdkrmi8Q;AjH zPwYp5dDQ83Ck2r!0|kxW7}eiRWe(-m>?;!;X*83T5e00AV~3W$?Q zph#|zCPcI%;yff#BI2sKAdmn^*abUO0BCH)DA+n@d}(L_&=(QW5d~NdY%-FT&WQl~ z-O1kkPV`_brK)}#C8lG1+!e#RR5ztOmfJ?_b=m!eqZr3hjD;CVQs5ZN>@O&<$>AUArec0hNr| zfq-&^zJqL8e1%Y)t~DdkX&c}WGS&>7E))B$o|p?xx`Q*8M(=lr1Is?C zDXWu^#E;08E_*kLX1&J1L+WS153`tC(YacbZg$Q9-|vD_MHV}tWiH>ZHaq=nJnYB_ zL_RvC{f8mCA^u{D6iPRK@ zbB0lAni3j>r8Qt)88YR?yaxd#Fm?IM@Hc!zOq$z_T{+L7v+kw@Sy<#V0o`(T!pX8J z1{*Lkae+1S2;DHZTUhFkXK%6R{P`*}PcI4P0?1PByJf)Gj>U(M$kzN~#72!-y?$A3 z%09~=4Sp|DR1sSbR~CZKpYVcz;m9QCQ^b|y`svLqH`qa{{m~Q)s+-e%hnZg`HNmD_ zvHu*g@%Befy)qlRyf7$c8wbT}@HQXL9x{n=Gah&N4Zc(paH8)tP2TOeD4a_T9c20` z-blq@me|6zx3-WOu|on$Ky>z#A+hC2G>-?d8m|j%r@d z)hc|!io4`kx7rixGOZ?5ImzGT6l=&a`d4wUQD#l9*5Vmn=^G%*y6q(V+rMk(z%A9A zJi5ZGP*1R;iC6!r0%x7||TK{Y;B9g(TaSZHPD54sRt6e}Hd4h|#@OZMSI zl~H-I?;VXGo>7fmG?+v|@V@G4ilHx}EnWcl0%>Z66vwPZC?CaONbm55wfM3wSGaCP zAR2&lxqqUS?&FjFt!oO^ut{?xhoIpPyFK_sT2HVVoLh^BclM=}d&-v^yE>!%@s2bY_~<_M8Du=iE}v$|gTddd0St`ms>;kc+o%NQL+j+Mx$ z%Y@hZXoDiWXI7}^vPcw_$r8s{7ew)oUp$z-0S^`hu->g+A)4xIN2x_L&B!b(d!s|(MV2_1^quNl ze=xpOeZEYH$Ol7iZ@GhoJ!R^04>R+R@iHKuO_KDLIf{B^YXW}3Ft6Rw6({u+kmn3= zEPkE{Focp#jD@S1KSQs@cDkIAjr=_>(0z!+n^^Q9tYpMJ-z0$olgFarCP28Y_R>_S zC$-i{A&O;u#L2UUEi0*u$XtzS34xupYIQQ=DK9SDJHUv|JAN4-OMSMkKyX-ifTUU! ze12;s-@Xb~XkiX7v)LWvyEs#VymZwG`pLH%1BjaEKPwief!@=XhS(a0|{A{MkD60OSSryUA#q`T=BABx_5Nd z|4TV&jfmOU{kKdg_S&?TBKcHneOcCHAyIHIOnDYea#xDIf0nOE+365=K@Y&w?a>+I zCiLkErKLJOyc+-bqov0`%L~&a-G75JGrlrIY^29HxJRgdfx~6+^MVN4H{2a=EoLJ3eh7d;Rk+27criSS24Z zrrK)+8rFA!Vi{nMPnkd8-%^C;0?er8_Ie_Ii||+rSV8Qu)958 zGq4EoMNj5j_~;kdS-e{F)7?UD19Iiia`1HWJA+BJo@nSCpM?CQ4wUp~ z{P4;YhzGyBZ_;sq{UT{7q5NEYgLlMCiu?*!&tH@gu)4upcZcpAFeUcnUkv{K@j;YqVQ>I7`|WG$ zwF^0hA+{nH6^vpkssgNqFXV|p8vjQar#sUmtQ{e(IPqe9=c|@emH;gJEN|X1HzX~a z;zm6NAJmS*0e|#7DOulJ70sM2RJj1Q@>`|1aL)OD-Dmt z^?Hq6=VWdnmHuhs%0AofD03J+atlW-QRKAebPYJ$R5moEF!`YI%ebe)Xi9GY_u40+>N$Nr@=%O{x;6U1RIFO;Pyws2E{&lhQ;AVu}VpWG;*7&%OGy zHl{KIUW8i$Q-je_jhw({yaH*!w1d-npIZ3?hR}0OJAXTKiz1@G7taM7m{e+P( zfESvmbx&B0b+D!FQQzf^QIVAxX3V<9FfcVuYs0oy!=QW|Fjhf_<;M8_J@3Mjzj~)Q z-l;jqcCd^Kqj$l7Rp6DV1jkdrSv&YdhC*vp4V#0uI&m|_fw+*L2#(I?vq9}UcAIm;pn6|X?7xG>=9he$WLrs^$Dei zr3)c9v9Pk{3cyr)F27LSoAG-52T<%AQI28L*F_{5Sg_b&N>qko=Q8%XU2_XI{bTZe zhbWQpKOr8TMfAt0i6U>X+#9wr_rsZut#{o%w1-XHKvxM&(fGxRBV;*gJ3X{Jx;Ot*Fd zA1^KORE$p~?C>sQT#lQYIxk;j9vdkEZpmL*v9Fh6t@y+Z$$T?|+G``#>)qvsM$~d7 zYq_T%+$5NzCRN%qd44KDAK!?Yr(h*Kz?HLP^jjT)s+;~5Cjf+0OR!9QbF2O^E)$e{ zfYw-{Fm7#w{9ok4CW?u&iPzzD{PG>{S8aEhJ?ZDR6>!(VC|ZZ6C3=Ol zM}kKV?}qUxv;3*l zE}^FB+);Gji{nnl#XTN69;tudX!!l-AzZvpd#~Rl<_#nQl=sc7U8fq-n}i%iP~6!r z6#%XbyF~tdhxKs=v+LVuPM#Bgv*pShe@7Wo9ze;(U?|)VTiT{!e0<`H`sq97P}-UC z0u?wIrL&|@pe@u}+{Jr0QN;Zaq5@0aF-R)*aYJct@Uj1ul6%mK8+^R0?O-PgN<$lD z$JJR|4$uY`^unzK@OoKy|BAn%eKl*;UvKV20tY!rJnh^h#auJ6hWTj5j3LugMDjE` zVg8#L8*WePG&dFY6epeux%4eJ?IE$Gh=gD}Jg#MY%a$kegt~i-!TCPdjD;%e^ND9X zmZey|dkwDiB;i1K#|fuK{OfJWneV6S>jFM$%tQz!e-1Zvepp_t9t4bnGcX} zkHq}=aBg7#2UQVh+^14(CiA_Kfl^s?uuzCRYA!Q5a}o7iW{V*xqEyxk+)uD)W&8ge zeOXS826&aZX!K{X^n93Ye6YVbb(l1Ggr>aVl`#nK4G(AFu26Z>qT)>lw;`$WRz$H* zy~H9eMnVfk6nXMij@zlp8&H?Exr5Y_QR2sl)FalwEH90lC9Z+-FW%Z|)%PjaiIBwl z|L&j9%d#0O(S=kwkB1^}SL7C<*N=1m^Pk?p^kvNK`Xbk@qiSB{-C<-qyfL%ySh*Vy zv8iO56kjymcK1S^0ru!^b)Y>Kt0#Hp0qp;z_@wB)3tTI4HQk~4gNzPvrxiv$-HmCZ ze|#$5#h|^1mif|2Yiq&!n2cStecuqPd#z-^uKpz0b)VbFYj1r0+D?!!HL=VW=%9o+ zpDF=QE7ddC|BWfX01dM)vs9elAZ4$Jikn?7IVPoWM9r5i&V*dYimd%1#)`UprQ~}9 zMdWs~ZD$irw_7px8loen&}cEuB?WArL0HqIZ_l}WItXU_v-6BxIxyR9YWEhpE*`&@!BQPHKk;iLS*i_mh-irMnaTS|}GCF8q=0M%L9; zz8!$_e+lBXwuFp3lUwRjSZk}Eq}cjqQo7-`*1{Ac(yIG?A>{A2b1G?^*Wo&Loy{EK z=GxT|A({axQJK@&KDG~K;CbbGdB_N08C9mnyK?T*|82EE;*(2SW6ZY9FuxX4iB9`P z(gTXF5)lFXGtVP=V|c$s_bU0iBG)JsE{orUX9vI=&|kFs-}m6NiS2!S5-f%WpGjY6 z!RJYuqJH}mehnP9nJ&nOURY!FTt}E>2@>s8JbH*Ai=_yaC&TPdWh`c#zO2{(MFhIV za8D){;4KlfV8-^VR(2{$!?JEyBe)usXCG`}cJN`1HUo43b=nVs)~1M1i1&WJf~4vv za4zjZm_CzkqOFw}B2YtP^Xf_Qv66PTd>ZLjDNnT|WEo48bKR#L=i^#Db6soR%=bZoYht=iB{#-S%&5(OM0 z7LdK$Eh%k6UFI22q!ULCu(C~-2kZr(HrsRx;eI5SFk-!U0;?AgtH-i(!_15bP-B6rtcLLQ_9GKJYS(qxLe z$FT(?*`A=-)sj@@io$L`cJwC?^do<*EK&MBX<5;)yCX<9@_7eKrTR~QhEMR=w_E1D zp%NRq3+u{d|7fmplU-!CeW1AdXpI?w!MiibM~L4WJO|b}}aO{)?Hl={g=qqfmhUh248#({H$H6{spZ|*+y&L%n?ve?gF5ZUf zqCC9kEA;C8zFhsyxM>{IloIjS=oqKsO?}a13_(xt}MggargZ!VzK+D%g(i z9}}A$h}U|z7hv@c5{-kP3pX@t`#9wq*12DP^7wg#r!f81d{6k+Rj4J8xp4Gk1|*_J zvWNL*6!fPoP6Z|4 zclKSnMA*u;eULe>${jTVOLv+^r>lL)?eBmTiFZ zY7G7d&xn@Ts$B!O-J@NbRMe%GhK^G4Dl9!@E*1PXw26tz<*Z@Of^@eS9nG6DgvpyI zD#}OvUOq)D5q8)3qBwO*OfH=2kuSm+&F1O&Cesysu#Yud#^&zEWKj9fu+Joa2FNh^ zn9N;sXZh1)6aTtUSor%Fw^%nWyf7jB$HGwP;$v3)IaFUqe&ewK7&kRL789fc1tY&- zY6}~ZNj<^YcqO+Ui$xAnD$x=C*?4O2lc*nTs5m*;w3+!|GW6id^?-A_j&90Ls+*LC zzhdwRL7Dh`Ix%WxRvc<(brm|Ew-Ot?c;!9Jc4R@?b5-gQ-(DR`Z0h9l6ftCe4sFs& zy4ka%Wz#ZW5L*?ka@UR@Iq%*P2$2M1nQ#o{vq*4x7a9vaoqHs(a3XqyG(>F;ooTRe zi6Vch9kjOHbGAkp{sy4lYwrz>?ICh$^-OW>0@R#1hohN&;`MR4)J)?4J;JG$(QSz2 zRK|ww3;oD*R5T##|Ed;cwbx@%p`zDzTrF|hf~yDjFTI>i>Guns+tIf0=F-rYE4l4+CAmjLF}i=VgS9AJ)Jl+ z0Jzi~P2?r|=oN>HsCXgbDPkkY4g}1ZO`!K{KcrC#=MUR4vxiH7;~Mo3&fi_gUxx|c ze%7nDVEk8*z4fOi$-NjI+AmRRs^ORSv?^@t6+8bM7-)TRbPB})%AVpKD z7YKzP0irFS_vVQq9LUv`45E#KviUS%N#{LAY5sG8eis=E8UqI{2k7K)CjxS?nn{67 zJ>8okF3ccAf;H6e<*{m?nvB7qiHlAL^u{}E&HdVgD&xi)Sn_G4r*NrcO-v=5&|Njh z^UhSt1;g^*0)plUKTIeq1JGH`pqcWyg5kq&_a!^x7mi$EK9?>%M=02ZtxzuN4fHjr6=35f>c=rU4`pZ-Yh-;l?-;cIuOaH* zydJ0kunC%pX>Alo{Aa+(!lf&?HMb12;pqYb2immj6izZSz)=H)OZfNVNRL+*1&OPX z-EuAWlj!Yq4!@IEWk_4$qtL6(J#2+U;*Z?a1E(P*cMDnK4WmwMj}XgK_9I8AQ@+&Q zBFjnPVjTj{1#mDslySFog)o%(m2Ck z>O5g3@*FEwV@m2OKO56`kH4z69UTYWl?*MuvbTF#at4ShZ@Wc^UOLPzXX3o6%s9Wg z%B7or8Hg0fRjy!dMd?^mTdXl!Bfggo6{{rp&#b_36z@9iU~O_FppW>cms$znCr zY;tz?IZ$<{ZW-8QhkvS9yEAAm`sShiJ5Ju;Zhfj>oRZ!Uyid@&RU)zpmrQHvYGW3; zbUJl={rEJ;)@(7BiUk=;^Yf=6yaah^R$5r_O}o2_{e3TUZJ6G!(TMOBd-L&)(jW0plD;O~v_k z5+23AET?gcd7 zYp-SrM|3n;Z}SpLO6U{38VmeCJ7ysY7d3I|?YUEyVqYQG$oXijD`sya1IJhRI1JTx zB8>oh1&bXF0F(Q7ws4H6b^X#iWOsvs08ls;;aU{(NPUSpuD!oJS{sIicYB!D@uzAm z6(mChbg6or$D{ui(3nc-Y-jX-HC-4MOBh>Rs`+jZoipPdEHZ^ZGu{lFmq! z(I;^iYZjoTgBWhfzn8^Rj?-$?;;eWs)%yx3&j%ROw!A#t@GbhQW;>gcjB0Qn#_7IE zz0YLX+(mt75_rr*#S-y#ne6n*j zhdT2|Y%x9J$9gU6RVcDYD1NssE0C-+-qX)CzjSGx6=k+UPs~ilX`espA;|;@VY(~A zpMjv5y6H64odB^%6c^u%ePOS0qvC)<3wvsA+?$T{~m&X|&8YFZRV_ zdmO+sg!dUl(s|2oCITphA$ZBE&cbbe4@Y8lz|(rs`?8}%b4ulUZNCUkQM_H3Z6|1| z&K|E5svI%YsRO-Lh2FYa{<)@w%5*t+=n5Gw=4cj*B>{R2K?N+|yjI4vR z3OtcnxQEw&iWY50vCfYe1KFTS65Mrp-xm})Un6+>4xF$YGl=JLOCu@3QSs%p9|9_$ zdA(|{)q!jleeh%Bsg7|Rdzr{hFwqp-@W!%;FEfB*T_o5O1C!^e^pc+LsAEm!L8g?B z{Vsu)>9-*o)h(SMGzm{$&1KmtXa$@tG>IevWr>trJ7`B2GG_vku*Dp*tu0}Y%Kzs0 z5N}w1xUpT#?M%D*XKj;t8+;~0!y6ntFB3j}A-cuu-0=F5yHiTfLrmZJ+B43Sb69Aj6^o(JD8f>YMC0Hp{ zPz9w2Ghj)C?l3Zpo$I(7`Vl@Z%U zL_ULF{!IIav&G0kI2`jK7Zb><+%|8RNM@FIajFmr>?n{rtT+4y#ZKW;{cIyM?%&t5 z5NqmG;`^<%a%ASF^ywsgxbb34Gr$kbx9#w+^We?pcAsLiYgxzUmMO_EL!h68T% z-*OufKcp^v`X~}Vs4rmjXgY#nxUC| zxhkRFSxAra1wd~~`Ib2o{u&N{*J5+zme_%(TSRvc;ZS0L0kZIr&))o!O2s=K2#vaD z74q#?k5+ShVOtjcCA`Y0=YXN^x@m=FUs5PT*GSf;jFF0AkBC|sG- z?IQNJxOa7Xa6%*1=31O5L#6)xD_TcpKL0Jv&aS8s3kjdoy&QfiUlb{rqZ5LoF&3tmhFe;&2!eL`_2MbYpFFCf|K(l4U-iPMD6 z^hETp+x6bKouHf3C&NG_5n2SirpMbH;E+rX7m!ey0E5()Vqe-ER{SVo8z>ax8?;@w z6G{&O0*d30>24Oy*HEg)m8C(Zj>K_&agT1)eXdk{P|@j7)TkYF?9pHAJx;|)@(CN5t748)KudksVhoPPqdIw0N^t}G4@$h}=!wfz_U z8U!<|6;j+dfkO(qGgRit@rYLfdZ!2kwV)K@?Z~8$H&t>BfYr=gaB0TZdf(G)AC#aZ z&pkOH8&a7V#@~Upr0irCY#G1BVP|*CCsFDfVg)9#ur8BUXBq|{Uc{-1BbCOp`o{r0 zaU3bu=~0(Uh~g&ttV&X07P}rF>*1l+jJePhI=^@aOz=Az=RKjy_^?ww0+ZZH!v)ug zKh%=xcVZx)Y{1@^Uf0)~p`aVUQM!|xZC2NKL))A(iUB>vDp-M$i+F%3VnMP{O`1zg~aC~JW*9H+?m@6ndB5oGTX>x@he6;y4Ul>(nNZ3rikkyfi#q^M2$Hv z#ES3hJbZ2+=~i|DPZwC*>3e}}9>+LSyHvurjg94a-dN$iWz>po-39W7sCD;oAW#9G z`)ARJHiU#`ql-b)b$SF~o;a=_t)%f<%abiKlS7%%eLWWwa<^cpDbNJg?AiPbXHGBu zv#&@-B-r$7S6%N5S0eL7gVda_DcsV69x_n?LD~#pq`ap*6nH#fWa&B192YODswpgM zC@714X-a=)pfdhM4#t$(2r6>>uEly6NL%1kfLA~y78!T1Dw_o-XQ+zw2&SX{=2KMi2i^tDHv6e(iUIyMACy-$!ML^RXvrne7KHqhW8S$J>cnAEyam7P^n< zqQa~XC;FHB;v>B@3$S8(a9?pFn&&#ycNTf&EgbWjVKj#|E~a$0 z{lPL79L__t6N`WOQ(Lj6WF>A(%UcRL6^~4BX&vh&c5S4)*pMn_Bm`aFwP4REGohnI zLCrgNPOW>vv3-3rZF)goxIeQrzs*SKDOWjpzsv9;yHFF1)*Vr#4Et|1f3J8yUK+mw zMx$XDbI_=pPV;~;mT#`qkz$-^5f0bj!2$O!vTozPE3YTTvz^cC3X@Y|Z6k8C?gcd3 z#N9sFr}&kAHqaH|X^_4Q2TQWcp^kYV4B5!nFE=8>#4|!fb=DhpZ`L6|H6)f@TyVQ= zcO$wj)`C{OZdC1Bu&?)_e3!N`x%!cU7RZaRT6|asj2SIpJVop%26C&4k5rV*MG{5H zV|?%IZz;z)CK=4wEDodyGdd8QIe1eR*i(4De8~-p+wE%m#GKbtAK9u-Rt+EB73j{m z3HJnrz)Ecw9EMDHM#Ys3pV?!|8YHZLr)R5I&ibj>lo=+rj{;DO2=6b8W!0Hih4#XC zPhq?#iriAdjUFYqc#pi1`@8%oU zi@-;=afj1mP}KP$tMZnbg*oOL0Baj{F3gr^Q!#po`=H%EM-r~!4L|Jjm+MfXl4--m zul!c_Ac&b@jl(2nP}{of6-6!aE-u5`t|&(cDWffOx^*{$7I{_6r5@-$wnR{jmRYI_ z)r)7D+pg9wXL8GfZfor2P*m;zdy44W{Khf`%JPh7vwHw7O6{rM&Z<@T>ZwXL>SMwiv(lQR*d?{Db)~pj5^! z0BW|2Q-}{HcjwSa=uUjN8uBJ^g_f-!_B{|b`u&tG#1Sk$Cr&|>wZ0t71BbFw)9hut z_89#iUJoNkL^JbXK`N*n%g|7BlPST>V$~uUpR*COxk&qS1JHdqh+SS>qvzPsS&bIM zs_$stu;NRAMnr8bx?3VFI$vy8Zv4H5+)8p18ElV4;|4pvF`md3LJ)(=UICo9q?KUG zsw^|8PCoY9w+mQf8$Q&oGBUF|WI3F+58?JY%q~;m<1jn{QZl0QBxfqR22ieAC>Mni zgex}qV}Ke_p?Sfw(1AmBZSL$5G=X=}Uyi`64ssEnIac#6Ono5qT&ng4uL0T2NTldu zSHbmpJl2$RywY=frl2qAJbkCwc8$`jc6upf76K_Wmkbf1UACZ z(HEf*=l+;Ly=Q89@*9dHvslY>3>P;ku0s(azo0jt=Eb8icdhe?7ZE}8PiL671Zp6- z!NRiU{Kk0++_wuXELmI@E`kk@La1xJL4Y76?%h_XNJ1_!rN|EU-r}QOYQ#F+3qMKp zhBDP_Ruj&&FlS}<()W(Py^XDTr@M(l(dMb0M|0uxubC*M?ZV|h*_YFFq1~sNc`=zm zf6+^g6Kb2CJy(;SEu8>Z{zs*BUdD&jM5Uro1-(Pf+Ng=ZcyjZ6-@S%y9~oG3Ac+~I zkC-ntKHz0u*-M{XXb_wX+1zLRP|)9zF=)L363VNjLmaMsNM$vFsNrFmx16a!{5o0n z+_)rYho=y76X#dn2v-%a6qK#9TunYeP9Mfqy@$BH)s1*7Ud+8H>F~re>_+%Yp)u)# zyeo!3x3-TW{q}(lYGC0PL6Mh5V0`@!pcTO&n0c=nsNzV3A(d%u5%RaUL-Mp2kVTZn zZ19;K2tzbB^&{!4BYry}m4(GvU5Bb`O+c|8kYynutnw@N!wBRmERpw$Q_GH?Cdnj; zmGp{^#Crx2xbGt3XQX4q(V-ubpxR6tTg!a9X=s1<;OTQsWh=kl$ zXr-hu1QXrPof+Obkoow~D7fR7r+ECdTfQ^SLcaVz4g13(j8chDua**3|PIvk|FhSLf{$a9;^{;~$;7mq`^{$x# z3$=AMLXQpcs1>RNV~8ar1tjB(!7fK^cxDrwY$ z$Ld(dAalEH(A&K{clMq13c!Fuq+*BT_97cVi$=X(*${V~EX7XM``lgzWK$m@7sAO+ zIWeM73wZIO0Y$T0`3Q7%We9D+n?lqiAc=Mlt7@A9%!uX4`Tv}X5d4dSVcRlBYgF2V z`_5|jbF3MLB=$icC~xYme+^DsNC)>m^!g4=>_YbI77ny&Dau6;RyHTpF4*BO_qKkqe%K- zq!Z24z1i*mq$WJ(g|r2YBirh%0Kpou%j?)Pdu`aT<>v@5x36lnAKTf0g zZ3MF%<@0JL?}zN0;|rq1EAEm-%U!F&1i3bowIP2+5O_GdKIM-}7PotPeqYxZ3}-y0 zk}AMb0iS+ai!6Np*{UVECV_ifPa9PIO%v5B&5XTha8=;Lq7d1WlA}I6Y&CVq`&ouo z2~%|}Cc5u_9c201+&0X~KFh%zGwc_saKJHSY&j=Y7h@+#$KO4U$nJ+`EF3uUHzfWo za5h+4XzIEkVvb##Q!J~Oib1exs`-%`G;+*&9U!{!~@oIAkI5s_0@<1ZvvO(QTy4@ zJE0*O)g6(Rg&TlnwNYdXH155UYfxQ+DcCl6Jnzgqa>HZQZ$9CvWOWh;AEcy#C8LX% zY*de4rim`1!-BabcDG3%z; zLe!#<&IVj+YHr`nW@GCq`{2qw-j@giOQ6fiyjQ4>8pJGs?_-O%`9!iJsciJz2AWMl z=WG;!Ard8veRUB=M1jbQkscugRw5nb6@V;CS4cpS2=)^@0cOo1RYt~>DwG%+W`GU= z02V7jn%5o>|0YuaQF8wP0BP@xM!P*h0Zo*yDG!Ztz9T$THW|lt9cOg(h|ShMdVchc z5}1GCze^mlFmW3+3PhiG-9-BWh-y*bw?_l_%)$t=L@E)Slx!YM4aZ(%V82E?$Qqy# z$yxU^_5idtZLf?J5Qb)X{H<_giMb)wcEmZ3q0fVRkgzG)ShS-cvpQ3Itkd(Z^}W%j z5FkdE!uov=9cIaKXspf@kXWq<6odBhkEHdKYAj**=elFCc0gSP;4?6FS6t2PPp?A# zTVETRd(ai^7L4EB3)z%q|8x_J<{bnamlyj8G{cQCnnp3rFjI3OQxf+zg6U*LmPi=f98`@KCJ=KKHz&y5jHKKKtH7)iKJT}OVx8;3^__($9cg$YnObnS%z8t<^zu!&oUAdeFyQp?Y zEQ9>$U=@s=w0uWC^%Aew&l7^a^8L_P2jnq66fiEnWwRF09UqGWI6XtGrr z{o6$=I{8eJ!H2HNdn|+GZs@}j=|NM7WrhwmHU2Wl2vL@Yo%Sq6rC}V$E(1QF67_yB zdw`&|BC_oX#iI61H3=*M()ZqHDd!fT+v9*+Kv-6m>8_3$t0Me>Yw)~$xH*d$bRKMZ zfcENX_MN4(u-UUAkz!-Cty>N$bZi$2iFyu3fB^x2lcAU=vR)*I&n<;e##&kt50dho zyzb}}4n%v^E!H$!8iPJF{;#aE!2%HnoPhjhe^W`a{(=&zNL*!mwz@kh0n?x+bP{qG z?k#|@>RvZ8d8qO}S5o!dW3QIxE+N|2%n*rh4#TN*hZdIA0d`bph*kXU$n%)UC`ig| zxf_W2-;DP*4D754y=pEcmc5|00UR7Z&ca=q@NbDcFmYZed{d-$=vo7tmg*qPoHvGC zEN%HGY13z0oz)qYptK6_Q#kRYqo&;TJI7L9enxYNwRsB{Zl?byy%m}PF zrW?NLL{H;zf$S7l1=RFUXlW(o?<@4_NfisOUbUM*|JAS3c!~gpm6Qu4zmERAu@`Dd z_ZOjMmxFOMmr}+pa7<+tr|0ppKZd`=`=u@erAXObyciST+IxEQU%`-g|V5mK0yPl)uyj-vzCKCJ14`NzWGk=*0Gcg?($H>9*-p+elf4{fH4 zt(e4&Uy5N#3d9&vBrKl6_f8@Ojb?}zfv`jj_rytv;KP1)mNLvL3$(E)ilU$Bzll>@b{wCX7uDn^2Dd>%gqf{tyvW%QkR z=%zl~CxX15QRFFP*jLW>_*EIk$fV0{W}zBjJtMn(ZJ57s4aI8i7o?P&m^6))MSTiS z3BLy;((boC4o5Z65lAO`Ed-H{>@uR`$cj!p$332(R(Bria%idvhyFt_UXPO@s%pd&+Qx6 z@bS>l->xrs`}XR@+yW)nu?2k6?(S~kgLW5qrr9>zQ*v8KV&4PLs7IZdbmide@u;Sn zvMejLM}LfFS@|w-hxhCpV1#frC=zWouVp6%Awa~6I@L)Xfo9{g@iJBA+}KE!MCNpi zBzGLcY^POyJo`#7JFLNTv#l{Pf1^>V^+hPYbt1h06;-%rmuTl#JRR0G+CwBzwRpFP z9yJ@{qE?jHmT^Hv3Hf2OI3I_Zz2@5hk8_E;sx?t04g~cT{6n!5c}5rjU!7?VVAr!? zb8pYUQ=kHi5;(u~nfqf$&Kgt>;IIa~8^2(yp*F$E$0)c?pc=v+#!TV(|dwuT@(vofes)@C%{|o zZPnFpxv+)WMLpKtG0fJcjEvm3A2b3AO58J&sLK;iCQc#sk5LVbe=yAKrJ43Ed2*V{ z@Y(vMW=Qzs)qJ7IEYoI~i{?otXUzv}lg5>-R7rOPCUPEp%ac#L5hb+{MFIa{$<(QB zOE2p((5U}FF`Tj{B6$Z~Z&Bm_IyGn>KR>rl80%%;bh(mF@l>5Q-1sV<~txyP?JZ&a=PoJ2qBn+3q1H! zDl4)p7w3-p;ojbpG&JyY>}_@)?WpWZvLEo)Z-5o$h$~rD-+(@rJl0SIcNJTC+qu`` z%Tq;NZ8b661kXvQN+#|syOk@Hjx}IzLqCm!vv1P`<-^;35PIba#;dL65y|zeyUJSp zZ8>#qZG??^!YXXMWx5UIg}WKmF?8l&}wrL<&1HN$8+glpu#)Y+@(nYQ6l zb~6VldHi?vpDrO{s@x1i#GL;YwV(=C23Qgq!KeEz>YLTY38u51S~_61GLTDho*-$4K_(I&&gziCBa? zq6zYQo@I2MPiXHKd_FkLW@OQlmryOd0;2bM2&gss_7kU)tlNX%_iEjJyOKliQ)=f| zwE-O8#Ab5m^dMC0lp2mznaEolV>`X}2h|&Vr2Ps($gZ@$&wjm7tkZtK&1J)}D5}&6 zAshr7(aOx-0^Z`py!KaaF<|SwWkI8c2Br(>lAc7o4rzL zOF3BW5+|1JhI_cB%Hapm*-JMb2_JjijQd$wADql*T)TdSD)P!SW)%6Ol3q{V4QAq& zp=GMd>ZW_KvFoZeYzn(!5m=8mQ8G<3d2gl@UaQcl(?VEqk-ufOf3%M z%2mspNZ|os1ph#OSY@^AZ?#fN(xQMlywVM2Vp;ulVM|GGgfXJUhJ{^OxgVAmKL2;j zmCFRKkG%_W3vD4vaUP1Y4oD}g3Z(1;lZK?P(LMJYVyOgNzg*j=mh(8O%oxJwMZ`P>Qx8+ywK82E$BJ^7-OSJqn zC48KJXi2LNuFD=~PPdO6s_mSX*Q8QPLf`8F#@Rin#n$?oN24ve%*VL{m1 zy5J=rsYJ_Q`nO<2pWdd?djNo{o)*V{t|aU)xUP=izAbVqyaQx5PZ^ z^`dPvAf~R>&|jK_Ux9O;3n-~pe(|WJ5|$(8bPefxf+>xX$;r^wn(fd;IromyFwRAB znf{Gp$UD?PsPbS%SS1!8EFZ!L*sIB>Ez^Gsw<}zEb?fiLv%5O04^4 zST60kzsLAT4uk9q=fk`W;a2n5((l(PK|KTI8>Hone02!rvY2(J{b;<6Y1NjkZzM(C zM?V{ymzhyuU|Yoaa`l>_u4VY7jCV}PrFB#(+F7UHtx0-07Mc8nqMh>WQGOA;-uwr$V z!Dmq6k-NKP4*mjbaPL>49bqy97l11I_xr^=v9pd24eoV3@wwkz0$$jHMjb??1K=Mc2xhJwO~!RP)dcLj z=5<^fro{Tcmp}FReo|)D^nB|Y*MKV8=vgaeOE;Y+B{KXZIjMAW{`%$kWCq~vQ^W?D z+(x?hNtcnc(S{cS461DTC9nzuf8{}}-v(SFSl(HTRh(Yoo~PxkSAjX(j`Pknf75OW z&Z9PHl~OeiPT~w3;wXLHk$`{6DC0?syvh7^fY1RH%wXDOgwHA)2}v9hd{_$9V}!kD^MAS#+$hMYtQwVdH48C z;=~eC@;(-6QR1!@7=IJ~2uSSb4Zx5-2TP>pR3?ktOU&)rtY}P4O;p_NC=I~_v+f#g}()8)}eh7x@>V24^d0@$(gmq!KAUl#lfWBncfSc;?MMYa%@-~$xHbVb z=N&ULE_h)Zx>v$lOi0P!`5*hdF7NV@*=%6#}%0Q2FR{27Jrb>WI4N z$L{UB5A)gGMbV=Wa-2B4Nxd2fESo>@(S8rZpt;)AkH_my@q}|=_Y|n%XL$7k>|ia~ zRUd$oQj!zH zEY!r-HmY=SXKJBDS1KnKs+on&DDS6L0<}?&1FQv|m>hk92uVcOZj@PdO(11j$+xA_ z4>52QI}*%j7j(-c#ZOkSQ>CAD91=i0uVI2cjaTG&NHN#lmI$ERYibjV7RTgs--?9=H z4ri>eN^c%bkVA^T*o*&0%}gXRkUdhr#3LRV@^{^)OH6{n*Lt|Kww4O>lI%u$HJw)< z_>5r0?}-$n@ZZ7*x;a9GZj#Y}DlgI*O|$@PK$E}9u$SYRaVhnJrbsL#Q+d;dKSv#6 z#3zbVrc+z};5kb7EPm~kbmS;W<|t7^d-3iI$^oo2W`{e9&Kj0B_%WhnU2v6bd!1=r zp#r$d1uiZzCvS<3QWkZc1nKg*h2N4u=S5|=T4w(gd*(BT=~{q#*g+@b zYZ(3EK_#m>8DDM>hN{4!&*uaIDlgm%{^RM^#IY2X6gf4M{USI>KvH*I2_-A7sEYOO zy}pB^lsSnis7?&mmnWs9o{^&OGE;i5?EWou@8>$$R|KaJS&g;HCML$BX2TY(gi4d9 z7S9-lk=%b%zdVYXoVg$h@OOHor|iHoSF%%a4w7Q<&ZvkRc9nNYd>ia+4oC(&q^VAjNp1&0dps@Zhoba2)IrnX3rwo}ESXSNlnCO^#{L-31cVAwA>{rNQ$+mOsSQ ziq#G%3^8py@6jD>ZV7i(n(0BXOP2115)Tr_e4<9xgV3{|>mz82WJ}VY?OcYD=_*29 zxUd)nI6jF&kCCBV(|$GUaW``jwW9$4TTy$a&}d2u|<3Z_{r0 z*18m8gYuc%Qk&V-csLm+EbbmH38JUxOIgxc8liET<-pL z79zGMbMsP*rZvx}UB`1j2(~(f1w)cKDJtMOI2D+O@|uHOMQIOEnkts`>J{A(bpLP~ z;#Gwtr^FGp9>1rUs%ZHk8Ct^$Y z-9Ohy1jNx5ElS3VDPY3@P)S0EJuEOrK?}r$?v)czxruH7Qq@LSuBzZgM12(TWKZ2W zKV-M%QPEmMKo|nTS%L5EKL%c9pL@XRE=L=_Qs}BC}Ckf@!{o$2NJyk02_U(Dl5~OZs}c9h;8%%UAQF*?qdr(p!x^La&&WxP$MD+1pG*^& zk}?Z2faT1VFP|KVseO19MjytNT6wSf3sGN{rLmauo6OpA{>lq$- zhBT`Dtj#S?jKT;5Tao>t5XeeSL+J6Xc%C)=M~>MBLRHEjBA#!R?z;{VS~;2*Y!es* z`7ctAL^CxIE=V0lV{d}mijRbUzqvWy&@gukeW@ z63O|f8w7pm#R0VgInF*pHm#~^i?4&n@L(&(MShonh#L-?(NdrVmGTls;L=J$ zdzTq^YYwQ^{>BXI7-fk;z&kw=f zra2tpo}!O@# zWpj-*1ttYA^u?x&Xv%<6sNO?nj!%zD^ld%bT1AYzqxji|czoMjm%YUZh8i{WWp5S9 zRm!Q+1{owBV31fQ5QC9%BF3-=T7!K6pU^O<{a{<8Q?Xj>T1ScYftvyi$2eTil20Yg zAN77l5>p$r1opYE?pYlNRfDWKT)2<`Q;iCM3Sg_7AlFu5C9mwLWVReZXAHqfR#0}} zBFZl-t3yPZJppHlL8J@B8*Iyql0I))7#eJYpPW!eD)2kNn5AwAgI%BC>yYJYXE%L{_gvGx1i@wv=sz$bw zj?bm%rYT3fk<3nj@0A#9H zrl6l^N%w^;y4S|JF28@Lev9DpYaFIQ#lv$|c!S(Gsx+CdT;?QJca{gabmUt+C)WdD zbfn_W*+ClYD=-T(kT6dMg+hUOF_vCI8OfoEC(L z+9XdSSJ;e?#kE1~Zu37}RM~h-N-J)P5kyHMkb6>~2!dx-CUfGPcJVqSVFJ}Bv}ML( zjk51vp0yyq5y^AzH6saVeZ8O3!V5fgVP$EYvaC7dD`Ztv5K2!~|A8kZA4>4Fv^RDI zn=M^D95CNqxX(ElNo=x>;cLBWVv#;{IK_w^AU8|_hV{mSXy)|Mt z0#q@)cs{OmGz3Mg6sTy<$Shu*o06!8W%bTIH9n~T*?6j=k~_#G>4PAfZE|Yr&(st* z4?u_dq|g~x@(<)OkF0GHX=U{AvwI;QVz!2MNE>x0o_A&fMAR)C)Y|4{sLRK5^G4-NzOL1E4b;RIIv$XyQd4+KV_99*Fua(4$R;n;Ckq|#?T4c2DO zp|_n!R^fIj3xmO5)=}q#NzTCwm^Z_dpW;yIFjUa$rZUW*4KxET;_Y8yYj;W&0Cpym zuu@QSRi@vHB!K-TB(oOV412(wll*V3Ts$83mI5Ij06cy{Lj^-jKwOG~(WZF{MWB!= z#OSZC5LN6sguY%t{tjd%PeRD6(!(s@$_-0)KjN?K9t{jUjC`ihp4SlKz3zf&!tQ|^ z8@x$;q2%(OF@1UfZtkIb)m+^3{o1^v>tsXdvReu8NXNOWsp;N(^j!u#!%j3Z#jn~I zC88b-x4qG=5IY2yKH;>?8MFz^+m3*H12SSee=14xbZ)QhncDw*8$2=w8-FUj~n%xpL7h{d|wx zm3fChsmw4%75jM7Qe|RM+}03xotRk@Yahc4n{tUZg}l>FX>j~iv6yCEPB8KjMy*9d zH@g_xyoQM{$1=`aH_CU#C)uBy3FRWQSLAwE*o*j=ZoT+1%g6x58MHTC2cLKM?sh=R zjliBWvreH79#O(Mise%b2RZgV74;(0MW!F8p0>gp08ADw`7|S^7$d_w+y#t6U+&xB zk`<+Dup=1e#eC2;cMsbURfqD-uhcpVSE_DEUjAf9bEw)q$W< z6aBM1CW~IQ<7fy`!wfM-K`~dhDKFK`l848k=kX=CDKaPP7NqS5Bg@~&pDUaL@wT7G zboNF{c0uZLy-PuXM)hJm1b4;7fyb>^^1^Q!QgBlbrLHb!%1jtHLb#0XaoU336V(GE z?Lp%Mb$cMi*&2RwbQQ^$MTvejHM~lND{L{6%`i@2#!6NswX@a4*D818ED(A?+hrN2 zC{J|zIEGgI{_l&H@8o|G|xMbMyV zDtjtQuE_nxry8AwnG->xx1DfO%*+<;vCnxmXvAzcDrxGDh3HYi9HZ|Af1X9vu4p>u zvx+zzCYQpFxibT4nL-KBk?}h;xKS%KQomwuaU_7$|G8=3Jl5=Zw!6w%0>8TH8-K%& zXnX%7sBy4nwpMZ1LiD|}Mg(n41VE$i7@^D!1%{fCK)RsU*f5sbxah<8?=fOt0eEGLOPD4QD`hu_ehoc76RmE4x|YwuvVvJseUW~4}ZziU9Ep-O## z=uPX$@r66PXg?}{rJu4_4Rs>S@p9$XtMRUQ1l<`_q9^f*de^{2n02=_v-Wt(0L?b; zEEw@&m{rKG6Z)9s|a$?EdxF zpN`ykPmAaH&V4<1GG}-?dO-C~eI7`wb+!37aj4U-v>8M-3Ni5x^q);fjn+VojCpfr8#>wVhrP+{lOo?6RVxw@&FjO`t#1%gQxZGa%#`4_sb4F;vBdw$np?7w0E-jLa&|~P>GqwVl+N`bShNQhUOZPM0wA;252)mHOmaF-$eB4xsb(G zv-9dr2Zh(VhT~68DfW83cE+7=ab={Ho)d`;NPZjcg-Oh)g6tNhZ_J`Rak(~BS~|JkSW(Aw1ePXuKfJB zqqF+@bMtZ?w^B?o+Vs^tR}xtKjaAJ(E_QlmLo%6HEs#K?lHFjvk|~u6Qeax9%8RuL z)nLvL2`3PuTVX_j!Ucf~qMX6Uc{d%v0YwR1V-=lJR)Kn2D=88)8X7PtaK?hEdT_eC zivvAsVo)YhTAX^mhOt-a5joiLb{DBuGmRD*39S_kX^?77tNEWyMm(5~@EF zCg73Qa{$b25{AF$GJwur#qS`rOC<)J6)6H%3D{Hsadj?*WS|5v2jUX}mbnxg#x!tp zLGY(7ja5u~`~Sh*-QD*@r+d41!~5NT`sM@R*VI0G3DXgJ7 z>x;K{;>=ROjgyzkijE4R%EcU4A9E!L;giKCvqY!zGRThO{tv~ubdso#m@jf~VjolH zdx^nw*p?RC$^m{3Edvoyn;ve)%|GYo4-~@sOBcEwFZo;rz#!gd7O7VvmZ`paz-cC3 zP*O}yaGx^q)gX*D@TN#?k88gIucv}|(8`EuMudYdNfN6lV&M8TbRQxDTx})W=cS9K zZ4uW0nr*WXyY6wY#Gb8y3gPYA^hLPsCK!t>^DIyY&L^zxvV>wfAoPt;;1W< zfP`>13nSUFGa_!S&9HUqp%bmLaOy%21^nnYUViolR-r380S!kZ>;UB4yWh7#m z{#x~_j?b2Dd+SPCOq7lD5XLEGWu>u_qm)|RD@M&w^H2OEcjUwBNB*E=n(DUk=o*UU zvc=^`)4*l#SkN>3ZWK62Xz#>E9VCBDVZT7 z=2YJV-qxRhri)gz@$Tn;XRFVS<#rlY&V@2)$^37hn&O<>=TgaI zHIO8YNV7jeyW>=8J!Q8@~g!$f;ma`2fh&i+XL4MQ@Pv$Gbwvt3!cvRjOYtc*#Z; zwwj{_7$$u`ZP7~&HMEU zDLZDcRh`erUZb?ofmBl8weKj<71_0B_>32Ej6Lh=kl9iWaX3|WB&fQSXAv?Q?q+Du zGmqwip^LwMDCH)Wy7UdEyIj66)Z92GnM9Z228ElkeS_+syNClOyjn<m{xI#UGqJZT~!L=hdNP>WJt-NV7-*INoZSmNERxce4h6YM{h`)Qm?ez|@S z$OCOBwqRwdl8z_tw_62`Ln&vbr3ls%dt5AM!@L{Bl=dNW)az>j+=s>Y6$7Qc#tpml zzM-_hrg-M$?G2sWtk2ywK{3yJ4wE|-sdgN$3I15TvU|E02LzuZs23jPSGtS%q9(zh zVqeG-3zYdd>Y%sw3eQ~4Es=F_95782vCb?SXGrQbK=Trh)eOT@5>)DR(6ilPL>?*h zpDRKJx8M5XXw2}P26^fUS;$|>)G{wefAjMGCB!i^d#ICm0ewn?pmNuKM6vx_J7@~KdRQ@a%n&eVqZ}= zDcE@6Tf5s75aB6(=pZL6-Z_lQC_DgTMyKXLmkd~&rP)L@$CtAdjLwcaK7@!j z>o$}7Z+)A;nv2t>m+veWVrzv>P44CuZs9I5^+AYx7MCw3EgU|@&FbZTg@zsV&chMS zvK=ZQW1?p5?I(Ypz5DFY)kyRRO1X*tiQ`U%&y-?zfvCY#AxZYJtYRhKfKGmze*~d+ zV}m?AHFarAnQ*|ECrowEE1S=v1;5l5-b&Z~j>T%Lu}RNIY(acrJ?=e6`~|HzALewc zf9aq+mZrp(VPgVJY_$(GW3<7Y)n0kN!gp;n)7H0sDODQ}_UtCYuNu8Vlk6<#fKm=# z<31%O{ceKQ+V-mcv3P*qjMQf69H?_ANEN}+v4<6bZ6^IB#R?+&haAVe(*$+8mY$A91ox4Dj2pwM#CwVGFF;dvaHME#s5U+z5WSs-8qa z`&BBqcQ53pJaiKQtl{I|z2ouy##%jrR?ghx1>R#TkK!N3mz9^_jv( z6oV*a!J&!=JQ#ewqmsU@anac2ts}j^Sdk`ACl>?{k-lLv!MRI8?){etd&^qQT*Lmj zR@8#3OkGa(V@JHfrft9lwMJ!aw$X<7VM}6J0#_ejLmQSP4V zRiAZOKX7yQ^Z;KYxkU~Eox)K4MtA~j#mrkS%5N()SpQuC#`)*pm6N2sz_`|A*DdUU+4*_t$+LMb-8d%hz9OdfR@76b|w_1%2mzu=pGPvvk=$ z)uiZSfdmntE{WUb@a`I6vDONN%magUiyIZ>M|IU8~7baT_K%pb@{4ipzYG1RbQ7hN7`T= z>~8Mlw1k2+X^}@newq)8ZNo`j=p5}TYCuT(yN>3AOI9I1jCMjl&vg(jRw{kF;h>1} zP6+}96jgBEL(bi(Eep_#ER~HC)}S z_>YzN0rzj#Bz2g&04}6Trgi3lseO<&wcRY*O|9c|aU?ATrHE3;fRbV!-*R3J$DAXs zaz&f&B~P63P`VkyHirQcYXqny@i_mj_RZeT21kI;T>7;67M_k)5aROKG~3QFYR_oi zOpCb<&5GvCm7}S^{cemvND!F~`{@O7+IDca^b+f#2bNL1vqt+^!3Gra37(l4Y*dNe zo&5^kS1-^Vkj4_jxHi`FHE~V%#0+j&toEl8OG>C%Krd*{(}5qTtufCF7ve{yfWK)Fb*?#7+ z^llUtcb>B~k;-W0^g?i5OO6Nt1kXmTPJkCVqiCH3XyQ_nKI`EoY};@%nfFgRf4-7}kics`DuB!ewUx0wusSA*ONr)E(HVJ^TyK*k~X<3~T44 znan^R+Gy=q8p}p*^+^o?F>)O5_q@{-4z!s^r;s5)GrNLw1H67o0h!7X=N^APJ z@;Z|aqk5_}X}RBz;qbO+t-~rmtWij%7{OMN0hA{Hv$wje(dmOn42AluwPs9} z@QW&h0wIu&(n-cDz?PC38}51K=6H6j^xZdzQ}7bNTV|h>W}uOGMp|K~C-;pSXR@Y< zUK7;0+o2l?x7j+lg_sPRf)zg%75D>vNzhd8f}PvEMWS=+Ud~qNl&hVql23^xUy>M< z08Be2q4E3&C!CjE|8+xOSYZ%qIIkHWLmltCHF|2B^sGrnN%~a1 z;P9)y?)@uXITQc%u&_St43XSIscWE046FFlHmL=|=_YUDt^NMfGI)t}AE5pOYYF0Z zOAQr3evKjvsF&!!0*=u1p?^-V$O|5&Ev00{>p7<{<2;JJpTCAk(OjhrJf7fm>@Pwt z3vjc|x*91?_o({;Q{cgX$jJyL`T2do=h$w9s51M|1H+S~X5-l}V}E6zArK2@H6_Fi z=83i+aKz^oBfAW7)(ht}>~JcMWH)(41+~q_$*fTU-^AO4ZGaJ{K+ZSzB$&=Yc~y{- z&fWImIEcjOmSDRzsWgmJ%PE+W6ZN~i(J7_f6IV00^n75 zaQEK(2t*3f&5dA@087a&`d)nT-7~T4v5?L`1=aX9Pr<$P7YW_n`>p79jChg65fdlR z+j7I*JvtAR%pWczK~So_-~nU|8%onf{GjAJ417yX`3wDcX{~8TpOK0osJ!&uGJWw; z!9UGeUTY(y#HZ~8l0?0;VF~?IL(E7CLN0#5Em~K*;-Eg~!HO-7giTd_;2rXQ@!r2E zBTY&bDNDZVB-cTbhAQo0z$y66c9ZN(o0iLAR8GRC!$&7Q;{bKy90oB&917UQ&Ya}8 zHi$7xYQ_|XLV8~nl4>QqM~lBd1LHLllAZm&LkmC-5Q%I(=mT(j;7g$=8Yj}8QmKrw zWP&lFQ&vRJz+CY>(=X-yqpIxp&!S9Z)dP3Vz-L_>*Na2%`G=R?r!Z2E3|6|DaEY-E z@`Zv=27n4!6Y=$3mnm^SZPcg*gq;BJNYJ*M5Uzk;R%EU}9Gn9Juta@pjO zi1(HR3Zutai?@#qe=4z#XRqAs?`|)l2aV5OY! zzPu_B80j{p_m*me1kb4kQj^kj>yJO9eii#d3$`R#{44w6W&m)Efq>R~bj^3f#hhaQ zoy+kozyOfqez=;@I9w%SDZEP~pMci8B(pFi%>>oc(d&XF4Ote#P$yIUSJzT;`Qnc1 z$PfK*+I=rF>GAgaUIsv zDo0=>RWGgkkWHzUK+D?`%80^w{a?SVGbYhXbS|@9w1TZ-Y93ZLuo#QAfv!S~U!Dp` zU)p9#S)Sm_P;KMRaxPN@UOPm%vK$miyf4~@Nd#c;4)q{c6Q+$2(r2Hz+V<6=@$AU$ ze9d_=TDx4zDq<)lk%Q{28LYrpFaD2swaEa9je={?6;il-qs2d5DM*2uUyv!xWjHX5 zP()vmYCT?xtbeYVUE>@pHQ$krn=C*WZSf@jI7q6QG2=jq-3>tkhh+0c*Zi1SB}Vdx z=R*LVlzr0@5y!2i>)fwNZv;8K;KsHh{yrBnLB7Lg#VI4e+gIIla*mG1%PLvF7Ja!~ zWm6};4<$f3a(H!`4jvbUZ}}I$9kb|mL;ed400=*YxNwsv@cGaRINYeG^~$GK-*y3 zyS-b`9azKTp$aT3*K!AsdA|_SfRGe&V;~V4f@M0k*Ww>u$8|v(xJ*^)ova~!{J`Fi zJ2#OtnWfS{jYfjMpQ(kBK=Oa@HDs4@@=(H}p0-BxvyHT{27`HQXMMS5DxlhvRNaSa z|3~LM`DVSXlY8-+>dXbAbX_NLer)Qr zygwkRhqf73{&ek!RBwY!6e|aSjMptpwxlV0>Mzcth@dC`aZzVfVM6akv;i{=tg_8( z?GwP**x_cay8ffQ8H1rfOMtL3oT^|hHBvmC@O_W#Gy)@}f|F`H9gsyIac*(AqTdKB zfnJYd4r3flHkD3Qpn!*R=N|!hkE@D0bKX=~fokuPDW)H1A5FIaFs7FA&Yu-7T9=xz zYDLB*_*s7Gi*7fqOa1%b_!A<0;~6=?w$~|6scFtRRWIVVFc_OX<1BI5OQeqP{%TMH z-n^p8Wc}?D)!(`g5-~~iJZC(sH~J%YY3FM)qI1Qg5g1}Wn&l!+VT86q=JL1;XIf$g zvOnen{cMG9eEB~z5xw>dDHa>GSDzDc}vb1o`J{E`MvpUl(!upW^uI~W)c<)Hg0jEb4q4>W`|d$$IWk@hwi&uSLD^^ubh`&E8t3;YP-`+8d+@1w7{^5Lxa zBy?~51Cb#9s$(97F!oH8OLA0jgkT9?@N($7%1hbVq(fes^h9vxD2TF-R)72JW}=f_ za9{RrPZt*e;0jmn>^JEShJiW4lL3P;%gduTt(^ZQF&ZUL{m$8*+6fpY)BOoDN8#eM zX_XXZFu(Hsa*Mu0nIZbkwtDB1Y(EhqdpYAkY>I2nlRPVu)n9J9xa4kBbgOURO~%rV zPL6`~$Em56ZKc4g;oFLT^MIbw4j1utUF$^NxO;O7kU*M^QGpPy9=~x9O*Ra=zp7*6 z%Ks2Fl)kQ(n?V^9Lz6mtz^>ajFglSi@&`CDoc(_8p&}Oi&fg~BM3FmP<^tdFLi6;3 z`1-!a>ydN^pwpyGTG8Sqo7A#>muL+Scsw^Da@BS0c?%+b0?1OY*-)WfL^+{PRdHaa9K%sEZ?#K2Kx! z&a;fg;D(~qe6w?y%jh6D!Z{7O(N}oA`z~k8vznWi`zc9|E63tEil;d~x*Q*)r7Vex z$|L2Gv;=cm1u`V0p9WVtE<<#9h2*E)REF^V6EThNHY8vlfd^rP02D1UldOl7+|Md> z)nH3p-`dJVMzB4>pRc%{wwaTRg)<~4xabcA6CGIyG1tCyzn5Cq->!}MkP~DZ&pMxt zAr#80;mVF{K({t-H22aH9YeQ_Kvv*0yRf-&mF~#UrEyYxK|w3qrUEk?-2a%!M?ip< zcT(`-tWzz>F^TW*Ve|ytRivC%12HuF_%42KVxddl4gU-pEaBpJPpy6n>Y>_Ax={m0 z2aAQ7<+0X9qd5k=M7TfcZ$ekZzD|SXD}f0IA#c1i&SewQeRbx43PZvsNXm1c*y(N- zA!Y-v7RHakFi23)<<$yw=e$Ch(eR1;l7j4p0F~(O-&Du;oDFv938530O>i*|Fb{_{ z#PSV2+NzZj_moLlj!>;TTnQs=tpMC^A{&=Y2lcp*2UBVvsB(TCsOdK{lYqecT?9X4 zDR!aJB1~{M$=bnjOgcB&%KJJKd@WNb?(3pBz}a<&EUg&KfSa6NhU$i>7rh85t1vMO zoSf%?r%dn<_39Ir#C#g37iYV5PdLW0n=@tuqyCagXJootMhF%N8k_A}A`7{Q91s(k zvz|H;mgJm24}EuVXbkSqa6kAA=h`hnHvy0~e@(aTyf^Myhi)!Sv{obgxF zV?1o*b)E5Wdjv7GfoTSxgUFf$m^616s5<~*SXa!)w2|s(2H0Qjv1x3IJJYyJfSP@W ztCB<|)ctHCEOhGdl@w*0psYBves^P26Tj32shSOL5SxX%(H8y`=L)tevWq?+8FC1A zhGQBRF%Owj;Vdhv)RbQ}#5ifzatom9V0Lo};!9`TB^pL-@hlL3$=WnFe+OE93af<#Cz!(fkM^~_j@F4T?xErlp1MrZTq!?F zKZD~g>8Rhm1q|+axxjo^a=IRd#fZMjfjPIYm?I5NlyP&6kw@_qCG)tDO-SFqx}vVA z{bo)F))DE044vU@flTnlQ`TXR<`+gG0+j?xeL?=})m6)i?@Ri=$H>czD#JePt4v`IP$OZU)!0NjWhGJ*DWteaG=lyNS;oTTRO z|3^hxNoRK&K^u=F*sEi~MEqf(^{^#JYBJ3|dkz2+ou1dK(t*Kfj?i07-`0flTv-fc zE1Z+{ZE}VoTOP6{ylX$~PHvyK0H<00@g$6e4TR%5cVUvW@JZSdY|LgC<(^7%m1CY+ zkt>$wU43DH^p~6+k0HNd>qj!7yjpqgiipV(F*tz`Y~Cv9cwU4%uqV`qd!ltO^dZ zUZf55N(Bh*9|IcD6lmO0w+-FM+Ch|!2$}=HFE3U$<5($g9zHd(SksG;g`4Y&-C_(< z?Y5i2Li#iaKUbs*FROVaa#Ma=r+lhKp@Ggj4^rG0KShygEg0rs$G=VT8u3S?!c3`o z4G+Bcse07rwk^ITtkzod-Q5Ucbdu!g2$4Oe_V>Bf_3P**#8ZAiD>Ka6dg zjc8y;=X?tcoxpCQY+$4wP4dy(pI@rv-UxGvX7`^^?@GFlRvHvxof4N7cedf2vUie4 z|D{t7JvqU7H-+?IWf!b$kKq0M{xAg9Fi{9|2+T$-$3oSMZJZ#*D1bbp9KPEF51M4?h?)2k_!3B49O=2H*8Cs$l2J#N$>!Ch*nhcj zxrKdwyan0w2PxJUwdlS44p=-<+!h)V1L`4K*F<)Eqa!bL=xvm1S7v2fjRxgd!%X2@ zzhc!wvLR^OX3ae@y6_T{fxXaRt$J})8g0k*7j}5M$?=Wo9&9v4h}MJwiXWD8G!H)A zJwUeAaPw!K&S3J|vy;!x`NC^ZA`RqemUjlglrwH!u%}F~HAAd-?(s^FaLP!@p(}zb z1=LU>1NK=KL}mvElU3Hhm(~1WY~T}t{ykSL^&XO0&1T~q>7X@8 z(V+Z0*E1Z;Mf?61t1}wv$2G=;I`3B_$%M>;B4j3K1oV>Klk!W7W1C+bykqEOCoiwr zUfd*CR3A;R(I2J-jBYXE4_?Kh{xquw8|=&70$K^sFe^4knMuf)-YbGEZ70**oWAx| zWsNZ!Gp1dcA||%DzLIfFzfdtQ`mSRcbRe-Ry&xt-I6%ZB!I}pb8m-=#o0FfYnJ1+2 z{8*6pO7yiwm?*fU5vk>8=$fQSj(Km#fI!PUQw&%k8r4-Lj7T~UIt5rMXi;G+sd1@V z2-JBf2jhN`FTp&?l)Y;K${+#dva`bH(lAi7!oE!y&Zg`yKpjl_7r90Q%3QL-;Cu}wuZI2Lm0$o9LKgixOeGXXT@JR(d4x!;n0GS) z-H1p8BJRQOh-o1Jp9Bryx?zn~QlvTi&aSSeAO-*c0AK(d000#3L7N#K5dS7q08w)P z005+8uzktT(aA^wp=1;?*#JN3;t>(%(!Zc3>gQ8)A;k#Mq2pfw66+|X2Aw5M%sTGTEyPq6k_ zWoBhSq_STw^(bSbj?%;t!hYmGD}3O_sR?mwpKIA!{02dLtG~Z3F|6xToYY#E@vbRFxZRQ}Jg81+eiNP+DmG}||nOG}t z3ol_0Qkn2Yy{tdzut80lbjEg{EuZt3nIO1OBI%JeJqPd9UcQv8R{GG%5HAvsUE>Iv zhw76ZJ8Yr8|^@xHn!Cr8{q}n*d3SAW<9rsD-xlCE0lcK{XIdDQgXZq8p zqaiz>4J)IdCm!KlZ-}|QQ$2?gCU4Td?yxE=gQGn2jUGA9N8Vw}bro@$(@Np1iXEp# zbg@EfaOuR{&9K-7LVBubv+~fec}33z`6*!oo5Uc*RqVYmu#$4&j=oj2>W&c1c1jLV z05@flQ=3<-W4`~Wv;ih$u-w7<-qv(tAO%T>JXI_cLyNtjRMJr;$%(w(Cuyc1eAStC z>%Y2ax$jEhw?8n$0+6s+fT1wDMk`FLO)|4-cQ%rcK{JW@ZdC%Erli^P~cy} zsfmVkKlaf?oJ3hu+01)r5}Xq|#6Dl^%=9GwS>hw6*pI6K=|8nO7NQ8IoGtn5>3MlOoqe zEe7xA;EU#hx!I;Dc}dhkfGYlZYiAnxDO_b9x}!wVv74|UyT(njGz259ad0zt67U^! zOUjPAENIrWA>+kP&bT(=gYgPrM*|tZ`45ALw5~Hmu!ao-DOa%z(KUA_Xu+yO5{Bh5 zO8^sW{`!77Z z?_?1QT9Kdux=(@t5LIWbUKb^cr^&L?ZR1!xND{tui@@EKmnN)HK? z>wtr%BU2YsjgN}dBp*m>YV%MNU|mKUld()+XrwO0LG~h$0QHrkT_N=!L809a?Ni=@ z$zYA;wUYf;D_aJByS^uC)>6oOwh%1WQQ1FmZ7~R2v`~R|{EG+1`!@=iE z`YoTedOcn0aT$&9P9-0*5=onMnH+Qfr^!Z}Jd8MCxzAS44L5mh_A5XeTjh*4+rDY~3%~b<_d3Jg#XP&VwhC&MO+M>(Dm94bhtc(K~nkMzm8l6}a zspuV>BP0}HQozQ#$%Vm?VichVIOwCD4xb>ED#7GEWk^z^@-YB&Tmd5T=h1hF%XaBu z9%kS4v_A&wA;SpakOD4g!1w_dY`7!b^Fzw(G`)XH1dMAHyfyEFzODq1brV~DzqS`^ z=!om6S_z@!Xb@2u?zvK&u@@(cq%ld|u;%KhdXLbh(oFJw(ccx|XxeZL|Hbkl_SK}g zkFsc7^w$X+i1C}1f>JB7#5{yfXwa`=CNpDypVg0FK(f+Jego)jG)225zysNgPp}C4 z7Z!c*-f2fdz3WQ#ymghgysGkRvQGpctp%sy3c8|3X`u~h*}m=PhxgTMb0f#T8! zrTqTtrm^UWPP^J=Q#r|9X5FJ;F+{4`tWc@b+Il}G_S-*>CI@c0mGFrB7P)p-L) z{MYq@WO4`>SddFE`}t<3L!>W)Dpr(-_Go@~Q<8L+ymR-dmYR?ueqRg+9IFK8gfgaC zz%6et1Z2Kp*;tq}^#-pAgaH*0Sh3(7o;nhlL)RVgKopL3k9;*m&&;ZBe2g%}5pO;c zfw2-ht?(|MH5LUL@QyY&A6`#I1KJH6UHNfG#jKER7Dc=kI>o1&!D+LrrpA+i3g4Qg zc_uZs9zf>goad&G4Or3PUJe+@vugeN%9=+d{%;R1z~vmC$#Uc!l_UId{&>He_!>#_ zMl=Ln;jbO_`nb=al}>ks@qRMr16*f>wlAifz!q62-KcT z37nyIV>|s0MQB!Q*VBZOJ~RmZ2(-P;rydF2Y1vCg(9 ztId*1WnYe7Du#c1w-5Q>;G=bxTLGTS3Nxzng6IBoMn0Ed{?(UQ9~ zF%KG#O&a@gKW(2XTwyk@L6{&<~$?{s5sPo;8s9GoEX?sBO*;ijI^CQ_C z;)PDPgj!51yiS(@%IAR|wTM5>NxVq#PzA#;>KY(rJ@0i`vb8yqoTO!@xxMSg)V7m4 z%ZNSY=Wqn!YWf$=XQbB_@{*pwU$%XyFXpM zo`R9|HK&Q~iGTs?7M**$`%_on79(v&3yQ9T>=E}dnsDTmA*yb@tOhV-E`0-_g$TSf z(a(dB^W{RI#SveUd#rJTFrx2Vl28{_?iZ~?*?VX-f$4z+%0(XELk(?l)=5xQDWa4Ib_*kXz`u|_u5W&IjV<_?kLgy9ESKyZ# z<+Hh3c;<`S`Z;j+fVZygyL0+`@J)e8ZqJ>q<;onRQe%gwa_<|tI;?HXDI&%jf{V&t zD}wVUt`9i=y3P;w?5|VT3N)YGHZ- zG4@lz!Q4N04(HTffN>+YdTyox@x0j;HqL*37(;Zu55E>H!*QTR&I-Lm$37>p*U&#V zT5a?B;+;-Kcg5r$CzLhh_l#+kRmRfO5T>q)l>xDn|5B1F4cw-8ZwLozA^j}TS#9uW z6~`3v)ZqCMpPbzf-o#(*nivI<-Z|1vVf_P^fiu1D464u)sN>YFf|8O+SQTT`<;ku$4KCQv_R50zAHw|j1 zl1g(v2gnBksV3|oDg|w=LPvnL&uBR&x=nZW!-~G}eD^>TU3_erYu!0E6GMEU(XqJn zu&Lf>pW^rKrw_?LlhducCy!tb8ISpjk?+5o`Ye&TcN99_pfbem$5EVeHuV2fE*-`4 z)hcB|#|limJ#F5YxJup8JKZeAwfUWT1<})q?2s(YU$>~+*7>({nWA@o4IKA`RCaGK zIa~kR5p_W(vzUjYhl?(^DucI_)SMj0TnU~Jud9sbT&F8#o<;J3?iBEl7C@!p9I0y< z^Pa<{~n5dYQ<7g|etlq{o)AtK5>v?3i6zd3nxx{l})o&0h_*{An? zG24R%yD?!gRgJ{dCcP1`Uc+sG66Ubd*RHp}5DDxk7Y@>wXrX+-4P5}AMK?$?h%C!h z5|UFsw+%B7LOPc^a9?xre-Tm%0La7yDa!n^zXHo02M&O6hq8ucJbRT&=v$yeC`s+> z?)aCAb+A$^WxjIPdVy5S2c{By#p46lu1Al7xGwN<+f;vJa5I#13>S(1wx)+dTRmwJ z=Q4uES;Im@{h(~2p=>mJvW&_Vp|~3YLT`U%XH1I&a~&9V>Pkm5={Q3u^N~1``Hq*I z)?DFl_)i2|mmC{3FzFBHft-z%y4lIAN_gyvZX4C65PR~E2bLmC@k7}K{@bz)p@jfI zg?ObUmnTAqD()#Pkb8Tn^~;H^xG?Coqv3=D)aGXp2*H(Mvwt(3S(O$rOz*454y(Kl z7O?;aIEVRFAXmc>EmcD2fql?vuevczH+^ z2ArQQdOR%~+w=U>uA>|o_h4}z0&K=4UEQhTElHUIz8Hc2*WH<4L&v+}E~sV5TG^Wq z0&+Vz!eOTj*9h?oL!S{FEM{JDCqBw=74jX7ozzv&3wk1=O;2!WH;-GQ_ZRKQCHvkn zZe`Y2Yn6>qcH451y*9y=@4fVy^n^Pzm6{!D#L>~%@3&xj@gl*^YW3O(UcYS z=R(+QSkPIbQP}mDq1Bp3YgDB_31}_Y;oX(K%37-iBw<^}Wtm6d4;$tu%ha3UTde5; z4w}SCUPnX1nv;3FKAgkcBgMl8N8ukj_IRFqHOjocew7`JS16h6d%~w1C9NKHU?i86 zA#=*zy7Yy_-HfoCRvhKq-$9WXG%MRlKq_uEduk7n0jxpf$Qn4O1nTgk0Co|9Y^!4!A5(TfcQ8d z<60fpbm8rAkdK{OsM@HG>icD~&aBblU0ohKvbxZgVlR`MJtSyF5wouf{u0ygtsIww zIvT=O3)0MuwGNaF1=0gOo`M4Z`5~dDkFKVx}XBF82UQ;jwMHj|c-nHIU>2H%UR+409hQMSI9DYat5EZzy ze*z-AZP$EY=7!Q3nazevs%(qu@rCd4oN(LKTJ&4Ff_c|^rLjYvOJ#O^D_vi-&z&#YmS z;A&owfK=EAal?W1Y8KW2%!bBDHYDeVn)A#H(I_L6H{ODK7A8;-N{oK1;X>bNpVn}{ zz4PdNun~~a94X(X)_RIzLOuwe@rM6H51J}hcJ(ek4KumrfVws$YE1>^CHgV_1Bf~L z%7q(5ygKDTzbTJ%!dRrhxX81FIyGmjfZY0JDX|*p6}(4rr4*4r7b^nH`a0tLWde4j z%EzAUw=`v;xXZkuWTe7AsgUZe(XnJ|vhfY!iJHTD@4Z!vXC)E@2!JSzlGY76wcq`5 z?PiNqEB?8OdTl24qXGHW6{<`6db(~w~j8yBd{nqql;V$F3&pVB4=g=RSg zcr4f&MhwE@w(rxnGCB-VM*4Q*iMw{t9-r#?d6Nm>#!sh5kaskBrLQc0a}{tQD%C70 zS~La4+P5Tb(Q4a{+)=`{dQJsj*Ly2L)bPrp`cVgfYEo&4uI?I~@Scu1uR}~PhO0Qb z)J!8Ginit|-B505r~hh7`HTS~dAx8cCNIEv{acAZ6{Xce0dL1uz*Rv*B!ljlj0Gk@ zp$o{FP`Se}e#A-!p%hn9*x<}z-~`LCR0|I4t+lNs={N}$G(Y{k9~=F6X-$ZPq>d&K z5oxTN{Oh-fs}Xi8M@LVL@cBO+wfL!5r(nHa-aTXKhN>u0OBtpFmJ*4=yM|Z-f`h)_ zjXT5IKz7U|r6spGW)emM^P=j7$w51d8R>SD)eyBu<`Z1r1Ee6K8$35H;a!Rl1YC82Oof9cxaa`+6KY<6BT_WE4p|e%g^83C>!6gNN)6~hc|8uzo!E& zc`8s4N*2)8C~SK=#qN7f(nM06E{q9T5G|{MCOBW*2iUm=)Rv|+q9!Wf&3a}>_gFy| z6f=f3BnyPR8#@2l9U;RQr&`fO0I0zZSKBd zo<7eG4tE)`GL4BF7%gZkFhl)e3wG!~Xn5S~sWm3b;C8{)F|9Nmzg}HjLK_`Chv;Gw zc*`~21&(I1D6PImn|-Ko!JB3wOb8ba>zc;IPMwH~_;zT}(a7cddM zQQX?0Zpnsd)tu7^Ua4Is>qnSf4e+NzVy;@LE1CgL>R0J!)qmR3PPH(NCF!qpM~N>x z)Al@LEdjx|4JfaT+54a-e)IvpC$GEZm@C+vJpieajI1qcrJRQt?wGU9 zjA~xd%IKl)y1*SC1fQELoB;II^<8O=Ywt`8AQ@-G(5Euls&y{YC|3T6WR@&rP((j5C2ok)~iG|uPhi(B#*2c@1xjdBn{&EQ#_F+C&a zK0pG!3fDPNMF=rz~bHyYY4p;0wJN<^1woP z5Q-Db8E5hE#OU#*T(|Df9(Ht5Z&V>ek(IMU@XB!A3^Sr__T3NNs)NK6|3dzh6MjhM zp$1T>qY1?C(x2S_h#scV0-g)9Ke`=u8g6foKn4X+;ON;Xwm@w-1a6X>Be^uss;xjK zBt|>Hzyxl7y}c-x3``E;Lzw#U!Lee7vZA1>y}?XX31*bX zbwXRFms7OL=C1qi z1@`FNLK5G1^H-U6t(wWznY(>4=In+I1sA1YG(!^6{IMOUrKai_K%uyWQxq{+^*V~k zKx`dq8hj2w(cBm%){m$m)V6tWLKwpL6D;JK2VeJnKTZZaS1 zL%TwPofFCB1gAXsx7R);J7fXG%$|5OVPx_5j*;Rm#*XvZ?}4ewBUD2=kRDPJi%oaH zfqi6srQjzf6KtR1!uwe?<=2(Q>UFcp?3ORMP|-ctV>WUkM(u94xY!4*DIzcU{s1Y@WlDwAA4977VJBK+bP1q|coI7#T#Ymtq#{uu>4$e#l%Y$|&>Pjx zSIA)vqcFh6ZKb$ZT@oSP3)Z2;?u=ta>a-|)=wHbwZ!hz!RM5};ibl<|sA=MN=UTQS z2ZkTU*Z(o>wp&rG0|EF{#yl}7`H=8x%j&biopk-Zd`iHiVPDQ5lGVBZ>nN5IQ_C6! z&G^k~3v~bqdycxXvLu~9QbfwcwcNbl#QkK)E2nm0`xK5VOZU!*kj0rx5%K!#6r1*R zfb_)e|9&9E+Z#%Iq{4%WdbI}_*+Bv-Vg#OE75RnOZJ+aUM|`9a6{Q?P>~LJ%>pF2k zY?#9KsxV%gfSm{&f}cRM(jwk_5F+p*EY;n36C6nk7UyR^4#LY7coW);FZuI8INKzE zU6duKluyUbB+)u1r;s_YLCf5tp0 z%W*#KuPgq5h+pfULl@qfaiKz(Le~6)Ln(A2lC+2N`c-R;b{%}v>g&R$@&YoLmH}J@ z67#9)9rxDb&5#|=Q%7xvT3cv1w$m!R`+Jes%cKCLe>`N5xEi!A7K z@vLHzJ3IV%s5tZp;f@~S{}QR^nmfCW-=Ub)Y3rqvUT)Amk11eOBBVUp zH|`wy&mdP$G|7?nU89wTE06-PSl{(=l`r$Kzm#iFQJ3NNHvWwC6Wk+mQG-A(ut7BS z6l2gDN!X@?&=@SopeBHI)&Fs41Ec%R4<}le`ymFFMG@Txy8}s7jfL9l{HAc-$=Wa^ zQaz0=H7Q+U#i1Y&Bx_4>{Ol?>_yXm3I?t}$F=SzES2jzGts+hLsC@18y_W?^H9;`U zpLxO3*b!VBRE+M)_DOb*9nv>@XfpPSK#upR2GH28=}*kh#yWWth)X!o1Lyr4!Sp-0 zR8>-|i@puE+2BCV8=2q;41hQQ01{F`n>rp4|0YuaQF8wP0H5Qp*5rz`L%UR+@-mjY zOdHR;GRgS_=3kDFPLN2e-9i#t&)oP^3VQTBw;shQ>cvgUxC>Xk)mtn#=l6EYiPC#PRX7&7=~El?qT%b zE5!s>=)2!%w0xk>pT+9tkruox_80C%vE6yk-7HVN0SrfAafh6+I^xL-z zLz2E3osUSLPXGl@cjN97Cy0%2t%4c=kUiZdD@ZQret<%P0l1ie!4Hp{tiKFUCQ%%0 zRANEGrg29l>MRP0sdVnAgu;OTy7{RTr~XfS*HBnoHwScZY;?>|T=t27TG8xUyw+n; zPwh=`T)DY4KPX^oN;2B^mgwd_$UO1koH$?{B3b2-Nwho@#-=hVWerRfJA7fuLxG#c z@Y?VjzQUs-1nahve$F9)Ds2X|IkSNOi}-~B=yU1ZU^3qUWOd~sLnfynXuRf|YA-i& z@2{i=GI3yBk)feAFWHGc32d!XS4bm0Rw?1zC>MfX4g~AlXR~aOWlJNYyjS#W1oq2v z;PrJ|Ln|{uthPs*RpF#rp6VYQGFUe~eCEm0Q1DEkQU}dne^X;q?7y~q^gK{6&1jNt z(NYPpu;`2AFybHh_N8(=(`N5>eV)oN#)J7&-Sh*P8V+MgqRbvT;ASOQY#!)|IA{_@ ztU}Ylv9SDRnW#@o=91>=NSyFVz6u@(z@dv?R=>L2Zdr(M>-xsQ-tOwsGGe{qJBDm| z3cU@Ata)r6u8>7l>_cUphF@#+i~S!|d?F80J9vj5cj17_=;nUST={^?9P3if^CnCb zbXJn=D2ijNjf1;w`pdf<2Q#f$7OmUOFwwLRiNN;sCKSjI+h*P1beT#V+N2kW9K4|% zabi18`|Rk2P>C56_}I0$a0^N3mvUgBHvvrPVT)VCNJ=qUGaYvsj*teo z>jsB3%`Ddlxtr>bu!ahW)Rz|DjU9oFY0CI9oiJT0XEdG|_jbILHI%6#R07-wo^ik@ zkn^6wm2gxWwWcv$T|~V_FYE|P51TlGqED={uQXUrkoZu1EprD5p=FquBQ?`zrKVBC zTZ@0Hm#h!VgtMPYFtmtb9+g%S6xOT_WaoPhw3c{HV{2(Kea>A?!{Vh94(g!3#eqLU zKh^6^qpAG~GHS0?&KTh8p{n{)XL;ZXv(+V604=UGCZZx)nU5T?VN*0G>q)|Z0-2NY zH?oHe(*qX(o@xP;VQUkNODhSenRrcaHm@M!DArd9c+^+xR%({4x-R2<9 z6a`-tLD?lLT`$E;1J)1`!tVQ#G_Jz^%0?Ohp8_FX(p(3eSy=}dAxohrK32z8lo7!t z2QP9D8>{BE*cefbK(752K*^{@6|^-Pp}(9YSb?9K`4!s#!M*4F6#A(HLaSj6OSG@0 zd^4uTOCiCiQ^Y#WjSacC&|KBil?TqUM=Ixr)c6FX3jE#VVOi>Z zBHFXT*M*`icRYwEOX*xASz1x!#B5^N&WTra_BS1JOycKN#d8@uiK2#ygFigwas< zIFcLE7q}m`qvQXW_Kgx;L&3X?a2k7K+)U?g!~`BU;xNtHiC>sJc%3 zyG)5z!R#)R=uEPM7J|)1w^mbe*BZ_Df=oeP=z^R?k%v9SI+}yOV?5I+@#Wy)ObSeSx7uV$;=a!8Muc?&z5DQHMe#S#$Sw_*&)^{hwbRJ>cqmF1^$hDOi zhxe@pe45Tpz|xA@tVyS(VEXGL+*g%8TbivjNxVC3U3iF6Ec^@Haf~Ot?sjwr`Ff)0 zV-I8BYmGUGIXW#L+1Hl^hqb^yBu4D^Prsr10oA%*!UiQa-K+L@`;c7wOk$u~D?iXC z3WQoKK~>M7rcqc8nW{`K0yBAcT(h7cm8`A9?oU;JyU_5yC(#FqUk79bfbSyNl5{s3 zSmFs)SC7r=jLc+axHcs;nw-bzVKDaIg$Uae@zH8<369qSDX>7_$&$p(6Gz$hp$2n& zgbDtHHo%!!h&oFG7qSdx62gQ6<-i$?=3XeoaXpupQZAApW8;I1;WM4)H-1Da5Qgo^ z(2+;*GsAP0vzk6kLlQ*NE717AyvQG?78LC43t!(o*L<@7gaHocx-{X$4wABk2pu;l zn6h4sJmfw$#v<|>WfDpu`6Mq*DNwd39he9sc>OoE*6OaITtAC!eNyQPWBXG zjY)Vqc!S#_y(Wb(m~oAAg-*Sqd$N(5_!30_};8kIkf_%-s?Tkx(=HOt)u$n}EmUC?tJb z4m+3NtD$;3afu$Yqe~o&06)3bxM5>i{5a8q?5UyjS%3PJaoTAR zEn{*QHv@)Wx`3Q3Hc3ljIfe+H(uj5?Ir($aOhdn!t(Y_Mu53fBaHqpt4d-Xg??urS z%&`gQN7>d;BIXBQC~dx65f55}pARP}%|M!{>q{+Cjp8*(Wb={N5;~sz$fyHa8;h`t zd-kj@uVT!05*`LtpK@$7>M9Y2AiWzL?dkMlSe@ngkU+TjovGvb`PPeCXF*2H7ar?{R~M@wV@ z9WqiF`-b28aAA~XU2sl51LA(+QZ@eH3E3u!x`QxTJeV#;OvrO;(_*%U_n9{x(Sz4j z-rsp%aFZX9CQjZ8cWK&r?vf}*pxW#!Sk_^Bn83oPrF_!kS4wUK$s#L2;p}qu_AP%G z4rs*f(V}&aACvU+a2oI6oSQ5e>8GQ{gC^xF2l)@jpQ(~A7Sk%5Qzj0mVn{>cTM;s! zsG^3&JL_SAyGyPbDi@e};1fx`&33dt>p3=%6(orwWn#P+DPvvdNg3x-w|hTOy5a9R zMyJ)-KH-LP$WTjXFrdWIOo8+|AqBe-L56h%oT|t+6q+2x*pK&sqgf{)VLdhLnf?hl ztD@aRQNQgycUQyb3d>%O+g$4gYJy~NEU6bcAU9GUBFnPne1rb2w}E>#es43;7U=fh zV$^N%2(NJ*+N$z~G>%FrB5DUn9ZEHT`2jagZ#DaFNs>otgU9vs;^bhoeft>gz&*)u z6}%Dd;-xv#E<{g8uli$b=~GZAztgKnE$-ZC$w!Tu6)ADd7mxRUxPXM8KRK6%J>?+|V zKxiP33j^Kdz<59_HVTk;fM-(@R+y=Of*QqXVjyW>ORgDWcv)XL`M?escSE%^D|Lez zGtoDEj~h8`NNbu@(ey+oP_2avWz@R133c`{RKIEn?qT&0GFWA59bd53=e{+JezoJA zL7%w|toa$%8hdIhZu8hI7dutgYCfe z-iLIP*9S>%n}a$$bRXW%MU~o(bj|NzZ-Jo1pIY;{jM*i6;< zK)w4{7i>yj&D;{!+)4NXXZX9be>J@HDL9}JKPoNYo>OzmB6$vB5uE{g^OdAc2}{XG zWi8%t_nM(L>=R}RiJRvbU<&Wsm)@$@SQp2EvQ50-ibzM5y>xrkwb>zBo7-(cdo>N{ zVee#e>3LPLqJMPLJ32mkoYrfT@7|S2Ry$dYvIE!+rdoiiKf>%IsVT4f4gT>oLn;xR z(0LV{Z4qx07VDv9nsp$6onBVzVYsqS2rAnUJ}+GPRcWTrXWD7-z!WpGBni@H3iM?y z`;NIlezV)l;pvK&iF6tJ_v#5V(o6khuz44FSsMzkC9fTbn zV7QxwWH$UsP&xEdJf7rU`>Ug?w=1Nt@{HNq=LA;be@^A*#}DZ(N#=zq*67-#xgX}z zELO)_7!V($OkcMe&olI*LKT%4d?JPi@w{;K#e}4!7S8L%0|)-rL5mac5ejy6VK)~1 zD^iBOcYKaFXf0rxoiy9$tK%gAjagSeWGbEQU)Gr>YQ}2G_!rsv_1GFD*hxG%+qCXj zvU-~JyWqutl%Qsag$C@UxLdNcXAC^GDH}sA@*& z0}Y5w>#9djjY3aCu+Ay--h4BB}+DKXVlqJ3s3Y4NfnL_6<5$UZgIE zQiCF^e=aD>#8y(}Sd!VU*bA zpUAmy@XY`htlPX^!*jb<)eqeU?ta3*Hz34rkB1a^AAF!oL1#CLQlelwQq8}K?|V=g zYc0>u(j#Kj6Gu$-hJ9$>>F*RC7imk{@~tT3Y*WlD+_jo8ld3(DPzx^;%fOhuJgTpQ zeyzUOo}8rTO$fcHV&SL)_VS(+uiP$R7s|jYB2i>ktJH5js{GCAa><0bzIRyG8W`41 z>(;-Du`0UQQN0@B@-OQH0Lqc{j!*@C;13AK2p9Y~`k-M*4+`?0Z z|5+aP&X3#|h(5Z@2A=h2dOw^4y%mp+nB|S9(lHp`%=;Qi+k4qI#yxD|Cs`^zW;Uab zd_NO{iXAs%IR%p8*QFjF-_`{SU!##`;#IO9@E9~8Eq;@(lA)htX^BBRAywC!uE5LJ zM_S<*BSD_zfQ<_8b8Ghr`8V$HJ+GaX6hLUah!#kJ*`hFJ2M^-{!ja8!UM8=R{Gs3l zdc%EP*ZRn5CzZ(ZMB~9u9>c>1$K9e%dk40ZyoiL@K<3DIBnZh0H44-%l=r2)6sVVc zw63$1z0~3<>fn&n0N-6*im;X$Urjf3;0QkV(|f4Dh=Sdlcfq%8E)4MLckG9|0*Yh6 zb-@5n5yQg8=Kf<$wu+$UT1tpx?8>nSAPiLaRP4o{CgW5R-P4g| zP6VqZ{AR2QGBz802$5M_zYRIU{eL9eM%?~egp9@3XW^dqbAYra_zhqaw&N)EBs8u} zqiQxj_vQAs2L&U?&6nfy_o*06Q$jPM_K$5gXiLm(Kp}e7O_CZ%8G#T00s^(DxTc^M z7nywb=sJ74n>Ge5AzBd>qz+!I8vY0));St7p(cLwLRyL_kRB3GyKcW>?DFkNvF5`X}mYf1lD zZVsqGir}h;qDEj?A(U9W1=g1(*nw%4r|;SOGx2Lg?;fhyD}ijx6X}Xr(X@OCkWmTB z6I>8zDm|9}~Wj1qr`s-%)lgF`eKVUUV$ZP&Yi*^@QO#O@2Q;D{l8V$z;`bAY% zFZR8Cuny9tStAk0LsXjMwIUM>&J~aO^o1{?KA+v#mbY?2+?q;>nRM^&uhT^}`TISG zs-RW+7#tA$Tz{jd>Erk=!`BUki*^_G2p{s9aq2BCaRI8OSeDD-1t)+zOo&jyRDR_k ziTld(mi)%q@wgX|Kx_-OmM{pWG4Mp`o)x|Pm(d>$9~GJ^TZ+q#CK{5yE8svoF5j*6 z`-*}^j4-TygcpnVp;Ak_o&>M-gHp>c^l+tTYQH$o_o#ii!g(`rz5y||8MWys2{u7B z8gKeaJpA{-Z@LfJ#nYBGb_<&n(HG+vJU_++V#CCH`1y~AE9Stk7%V2csM@7qRvG&I zZqTpKQNKYx+~aqG2;l6T0?FYo2!wQ@(%fGJLd-F9LcoF)W2Z`fiCu36FaARz%X#+O zsyKG)aR3G>2VZ%PX%DfHSHKvf1hH=UuHNj2IoBb6a{;A7e=?puK%SmXbbCuDR!lyI zq`bfZ;nMWXP(yA^_in+Kg=t?v^Vp``T;|b5{6bflH7LIC0pz_7WYPW)LX2m5N;)d9 z?pGj_9V6#`jL#nt84a!}8_cLtTHzHT!7Uw4D@lSM&XI`8zH%HI==4-%$6$-s%%wWi_tX%S74rKoA*PI0~#1F5Cjm3r=~5@VAzU z9!o1y^N0cLPWJPLK#fBrv#C$8Sv)QIS_NszVmlP1=ttueC=6Si<*$Zvh1z}Q_@34N zw9toakJ-PxemMFgJ$8(6fd*MZjB?{&{fkjB5dkIs`vL_&c(faM;7P}<>y=BW`l4K zL0Zp`e>u%8R@W372?{ym@^JF`(P0%OfHL_4+;^x+k5E4llst>TX{9JndrP z3Nep{3nX^;jW*vlx)hEbk<3G&_>ym~8a6f(gM$4vdjBc6`SkqNBi#9SE1hga=DpBuDo2b(p z%2hvhWe`4i;hP6fi*2={^^EP>wEn%Pc+WIjY2afBV%t!j2vtR~Et~0LSPv82lH#>o zO}_Uj!1Snf*1Q3U>-wZ-z(Y!>;RPP7M>$XY`Nq|>d&KayX@G-Lg4uEY#BCTc5VLj8 z6D|KyZu)Iz*iPU8y_Lp)0}f6I*s>?U7LMgz-W>avpI1i#ML4K0Q;b zeaKT)8MT6N+Fan&VgGrba}%15<;;CND|k?12d*d#lHlpEo-9Qne8FemttIq%|TF|A0m79|#G}(mL$mb`Ck6;Wl*A?Pq*)lv|=0E!(`yUc!iDdftD?l2vdkWqc z&vNtg@6oZ^&3Q~|2pusStH*d|RCLfMCrKJJH&~c@`fJm!rGGouag%<7oVKB@$;gzv zN4^9rj~6m^)6<_55BS37c;f`~aXL@K|5Nne4c64}j&N2!GT>wIs1}-Orrb6bLW~y-|zo<())9iaVRFQu|5UZWD|m5AoAiB&95=Lf2Gt+ zCiy!Y;u78#W9W6D!c8>YiiV{lc}+8_3LcAXf8LlqOg*~;NYn~-VvPRzW%&?`CNf^- zPR?r9@l?odQ*sqWH2Nlx=#=ql=U2(Ztskt!8bzB9vqr_j2!Kj2M!o3s{UKHxfT#~M zag%PM5t>qpsA^OG9WL*M*U-QZrDmh1cXO~~AVHY$s~1kn+fvde!p#D(*L4*fB3xKu z48V~bIj6zYD(hmVTQu`K#N82cJ!Mb!n@vaV1 zf|NR^5*x@wt0`F-n`~!M01j8XXVzq^WnN2LreQ0HcaPCkC#p0^RQ;DmL9b=>Vh4SG z)`=51?Hy?xQ=kZlof|^y_%~wu9|XGd4;R6fhU#$)_6+66_Ub9>V1GjbwywnVX#_fE zOdBy%U|$k#MM*dA0()%~;=WV#?0aOC7}ylSScvZM6c8aA&;S4b|NX16!jR{1G>{cw zEW9>!UAJDq5^NbKlX5q>M%*O@8L^fV0h&>wl3VAIFVf z9tEozLUQgHC7^dDh`_+KT9hOj{Y_v*GvITOR*($Bpt!_EH&R(T0=FZv<>FFhBwU^7 zR1>mO80aWPA$Z88<|q^t-V3G})kHYrPrj;3?*2uAfB*m(0l)wN7EnQ(Tb>aACQ|@W za{mATU+<6n?`;8-z;vcE*i@U9GFF@JGw4kA<{x%5TywyvCQ;KKoueM zzMPfeGD}+iA<%I`-FW6jG2gP|t`bIz=|HkgDfa9%FKC$_^F~cFX8Nb(H;0u zT{!!+miad^ao&>79DvE{lPm~>PYyVH=QU!K3}%**`My<%h1UGA=@H>wb+LgZlY4tw z&noV@*iH!Sd&)>IiNTHU(BE8G0-C%GrGGemQLS1c9D!A9=C{YYk4c<)Uy$OL+ns2- z#HKhO>C63#bk%$2L*hk<4ZN)wK+00pr&*b()4(qQr$$PI$E_df_kZ6hp>vWHU+O8K zMq};(g`(#DredwJIhF}T^c9vo5b`q9OXnbyg7wQnfh!l0oYrrN{D+RdG{b8I*7HA_ zByqr%T{(N|a*9czS*W_*xe!gqqS0_3r^Tei*P1{Ei9tp^nky(Kg4r>G%KlYp$=zAHw$lgsQmcDQq=S^Qap#S%oy$BCAftXgTpi-PnnfNj9*HSXw zCuo`d20Aa^r;ot}QTRL}h)2Z=sy<>tmfE_7 zUf;pxd)!ImM!rv@!8#>1ta`usrpDb6h$fq<-3bD0arq!eU=rO^)chTuuoqf|0Tzgf$UlWl;#il76rrb$ z+kpbgVU&zJH7j9)-grtSa8iVXxF1>kw!690)G6Mhh7`~q@7{Foff3C)_T)F%iC>(v z;B(R`#Jb8Qi$^4_mYw?YNT692z39`0(w%>tY3>I<&Gz|mRswif2pYDSMt=yK@myabudd=-)1;kT+Q4@& zeGy!_zwvW49AU=L1Bo=8Fa|pl2Uhj*;by#s-O@Gn9w%Gt3TGO#QZ)q5WgTA-N^vfj zJLu*$0%V?6hU_C~-K5KMjc)PgW z85{SZJot1fr=OuUB|Hi~ zS^xd+2nsrTZ%dQcO@YYsD{11N%B1VJB9W!Xqd)|j?AusII zbhK|*UeF*twR){}wxguvy7~{~QWAlKS|z5O5zh=@vE9*~Lu9-Im*>t9)(1O7=O&O+ z9&b#%L5ZAiC5XzeOq&AyT@yLah`~BpgQrGlhk8tmHuoJNZzh+XCF8nr@Nem?nT3Dd z4Oawzu>y$?CRWInC~DYPw;Z?%O!zaADg6ZxevAX36SY&M3v=QCyA@wLUjB9wz8H8#agBHY|gN}nu0<_rU?aZ z_cjZ9(YAd{zcyb(iOBrl%y?H77jTB^Xey`zWwi@l6HFf5se8UmdM{`@F5vie9lP5f^o#*4(qHg#x=d4vv4z@QX| zjlx8<65h64-V@{|g*;_`OZ#Y3b}Y&G=8me;0esFge89eUC*(jLiZ2-1 zQ5c1F2yrPdYiodO1M|dTa0gPD%zEv0h3OVP0Ba(orXFwNQ|D{?S)O@u8aznpG;Q!P zCv1NMe-TauVHcB!N#8z!oJf%-szsSrMTqPG?c1lF=WpIJyLRPmNtg%Rw z5=>ho499WVa_po|+18Fm@M)vPRy))%u5Q8yZJ`{YiNnI?2*3OKdUXs|J5_NkLUp8& zy*0PL0J!16!cv*i#eInk|6M}evyFBWL3m49N}3`nz$Ys8GNyEq@4KT5)A_g^$`+9$ ze9JzU$t2rXQY6wB6ML(;9B6pYG824C4?vGHvPQaPQe5K*yA_P57k(tvq;uJ>V^b#> z{XJC~l8XJFm>FQNr+An$rynU7Ed&))=efRL$=o5ZU$Wlz28>{BN+_QOezNS77-g2;m4Yw`MBj^I;Kg+8!EL zXnNePAmuDY4+$K#z#hSmB5c*`HDZ?L4iY^EMj%)O)vKHzvXT6}b{iY3%%rad1TjS( z?}wiQbL_Q#nCsn#13{~)QUI7(a=sXQ*|D5XgRKWSyc#3#sp-^-9%)si4VeT$nAJey zy6Dgsky9+FTE$CU-{7l009~Qj=4!dJZ2{PlNNzm=UN|gPh@&94H8@ZS{rei`@@)hN zG3ew>e&5^o#3K8GMKWt30On&fH12~$rpXmjQiX-Sx+z;B>g%Kt1mN!5SyL`sR^;nO z3%XjdJ~-Nze;L)>dG1fP(_xt>_MgZ0wAJ3Gi0FNaXA7H$3p`pY#FljcK>DK(pSlOl zCR1e?_<&?rrPZoxAOB2g5b|9w3ddLAirAJVoL~#kY{@|TqeaD*Ue^}EjWY)!*Og@g*BaD~r2N{#M!rU|$w*lCAh`o#c}K z2AG{zgO+Lu+_(uMCXW_QxgpP8>AM4sLEl8q!*4S(2eNPSrZU17D8}9sf+!&wvE#Sw zN(2f3zGZYaCu44zpTHI6MC6FcCiWcBZ+_f9(a-K3<-t`&0nE5uAfPXRYUZ02kFXFC zg_(;G8e6Eq*imadvREcgH%)VvFhnBbAv5k$X%2VpGs>6|9>(9K)L6juM zbf3KcTb8HA<6tO~Bj8mOovr(c#hJ?l)bcmLxnduhl(KQI$pZ@KX%96Rt>}9xJCKBn zWTl{|Vky0oj*wQPanCey_&BD3F&TxyMb;+43+r6`>2ERWR}qXel?#{8G6TM(MxtC~ zhr~DQ05O%ZdV<#nz8g(Nf$1CPq^ z<37t8Fk}@cz9MnqpXNH1D|6p2cZBjk?OklEjXMlqTFN~evdq1p__c_-JihjVm z47AjfodgjY>Ag`xQI7}%Czibkh0(0pOL|^8`4poWj)l+wBFfV?{Jl+&I&rMs?aKk6 zIiX7dW!ptOM3fPvFDc=LsM1A5vT&L721#Eqeqp@(^=Y)BCjlfTxq0G^OwkpNn{$ zsrc_!%VIzpOGXhWD{+cZG}cTMIm9TF|+X zL-}ipn|}y)vE~0#>JY6ele5&pOrcn9wre^rFNkXc7QzQSP~DkqbA>r=+)+SYsZcrO{_(d|{0SgK#BF(C&#R zl|s^|1xns~&co!Amb|e;?5c?$KeQG%D~KI^ADlHVZd&cS2u4=Q)zC&oxyGFI+@ooK znS1q${1J0-AoqBWS%5TNMa(~J@WgLF<^iKsRAl$$3*oI8X7>aQ6pi0o5Dk*QQkcoI{hE!vNVAyU>MNzr=^?woXRDCKnF@-mMwNw)Y|Bdt zHr;S*%Ix?oV1q`ApnmiPA60fcd4z(Ub3Hysx=1#|kDN$I9*y;6*xGpHC_v<=R*G%; z|5J^&sw3*XdLZ8ogewpf_YIZcm@5#!j6Ji$7{lIGd?yc$Y_V>BDpBuiX==G@$$7a2 z+e{fu5vvw9nxj?8ms}Ad4ZRO{=khZqDinMA2#KL-vn<#*F)hbBBSn<;x$~<^r^#gi zU?9cd`M1lK(^^oAo)|Z}GE+A=_Y?>m#t3YHXg4b&VDC_j71FDHE$}SYVoI=qxJ1pF zYM{DfOg0h_r96-*KuifTtCcpCgYClYYpK!>ZAWJ{s!E7c__d<>DY}5R{32BZo63%I z@

p|5)z)&;KccRlH;025RjeO5|CN$D>YEwuQgs9zG<$Ep>D(h8p{_t00XY?B^f! zHm}4Kz(v%ph*2erqjyDwCFPT5ILVO{C3CXkvuSvO#ijKJD$g z?Kk#F1CJ{G!1-5h4@vadSS3a-V6b50$X6dr(=1L03nneM!i+4*y0pjK_3w>vXHnv_ z_U3H&M0`Ns$n01Va5If1%|l(XU$|u#oLXqmN~c+JVdZ?g}T6>_g(z&j}k-=^^k?E?Nk6gpj7BKW`PU&>mn+>L_5oBG#6mGf`4 zR*87tDc4H6GV`ae>@L+IvKw_I^ks zvy8o*Cqay0sWy*iV?K8>2hpgDKNWVM;QC{1>BZum?QPt%P;Pw7A{$y?_q)sMX-r_u z<1UuwAp{c`9hKbjUV3E4u43n}01;@h07KeUp_hAYmDH7un=3hy2pa0 z)&Rn6WcgW5=@Q_sS}E(8zz3PgLGi?QDFCz){AWs5W-wbF<{!{k9NSx=?W0CP+?_o$ zxYktQT?8u1adbNS#t9$P`{E40( z(;S1%ouTP6+4#D-`>6Umw<&fr2|#9|qLgh~pCIV-AZ#otvf}f&QLN9rT&kYr8Bq2; zJ*;Y$LyXFa*)j7VQH*LEw@Rhf!)WP8qbweiB0*KT9?|r`ww!^?M5~n6B49YW3%E;n zopFKnzCOGJWgn>?NlS)0{e@U@a1L^%$mzSw#3E=P$c+cR;=zV7x&2}%;z?0$uYe^; zyrPrb@^T5`eUikL0ZT{lysRhOf)|zJ*XVjPMt1V2i6s$3c5|^I8qe?l|Nr%@gfY;A zV-OQol2dX`Hi`*_rIUWa-Ywpn(fhg7Sd3CH5SZZ!G?`l#?I^BeK+1~FW#vq5E)y)1 z*V(|?G}KyFOKbt!6j^Qj%Mysdg(Y2_>a~jtoF@guDQlA;5T$3968c1@U_eUBZmSNa z-(-YhN}xpqcs>Q>UMPXv1!WzUZWXS?IEn*?P))A`QLLH~I;^qnw{*NafsF&R=mN%^ zzn+vWdCWz0mvf~mQJ$D4m`H|e6LqEKvu3`PoouI+GSYXIEE2kPtFwkOAq|^)8^eQ# zlG~D=Q8cbvcU>vK9ejDN&dsD3J}}ev;NR%qT<|w}$Y|3lzifMSZ=c zOlCIi|AQf<=Gta_`&CG^0}cQH2<{=DdooHcUjgpRBt?4duEZSfQs|0z^-s!QPI6br zO!F1_)y{EOO(;B!=Ov?0$#M;_tvmgnci;z~soRQxSz6JT z<6AOOMqXT*MGx`%q+|kL9;Pw;7OStPN|a}QFxJREuU+)VkPh-j<`aCvYSiL`K%66DC?&M}mA-Q~{l- ziDa|9sQ|nLAc65XiGd>sYoD}v6f(-{=al0uQkA@Y-wwLRaRnl8hPk%U zMBqNV9yrOs!_%&N82c*t@2<0%6qnhC9rpz=wyh=Of%ekNg31xGr8V%QAWFhIxzXAk zgAXCo#s;d_SAGNW$UXz$8u<`AhsNM2LOrV_>cd~6mtZ+V$m%g%5obId)VfiBC5S}% z`z=C_lU~Ba|CkXMB9-Pk$jjz8$Eg8T%d-{kS}z3Xhnk$PAcj`zj$Xc6S;WK%OzdFJ z))*6m1g%FULmPEG8El-M@{qx7`;HFq8=syc9n@8vF<8Pj)?_@-f@5T+-&WZ!cSQO} zl}65)(}*;veYHfbNkJ^?-K1v_fqaMyt%CZ2?mtm;A~lgd4th6YhhTsLS~ls~qAGm2 z%l0C91Xdi@Hj;!{HFjH?TU=r>2267T{hlf~nNFo0?mJQU{=pqD5|yzC{ujB@pGr&@ zIQ$IqP`*m;$9!?PVn(77i?Hfgj|AMd!ywc&Mh8!5E5Ydv|MA>UT@yN4+@h3_&A{hG1!tn zRKDJJckKEkJBAqm2CuWKp&+^Ysm=Gm_;iJ^i)6>e8*rk{yv^=Oo4T?1q`v2D$I43V z2_(s|eLH1kmhrNU>3#NY4i&m;Wlv!{x@7FMlH*C%lXZG^UTbl8aq8IJg|-+Q1e3%J zz=1+!-A;bln!<|yWefBJ1YB&;4R4YItc*qf6CoxV`5Igr8rH`cANqc>b=|OvY?Tg| zI$p5V^u$mi=jE9%;Ax62X83^L6=KCPwp2iG3po$fgy1h>H-Sxi?o0=zqhZa%;2B6& zP``U&fZ?F2u>e=NFMw_v|75d$KdTTTJEm7M8o`@9o_T_m#PB>jXO!lHLp1 z2IB=XE-XzQEJV9@rYFn{$26?&p#L^V1_7aY?bJq&V+dc1+|WM9s40*BZnAm`>9v-r zGcu)(bdoz1WgGjI8B=vXNfHn_jJdQC&{-shz1xo>2ziXMJ8Xr|6{GS z6w=O!d##1q#iEqgj2rPxndn`?D(pfdpbQppkHfigkyOj+Gj$FgRMT)d3*tZmiM(A& zoFFWc&a@-294l1|?RXk<{F!eDd0nQpNx_JsD&slS}+Zleno~emkK;N!I~|f4lCy z5ZRhX=)6EA?gIub)t&WC`NnGqcZW(hSBJ6g!%Y?VtOO zKvTU&u!33Qx%nj~Q<};#)a~8`>S70^u+`6|Zkdr!_katogfu8Jzm!VIRLR4vd6f*W zeX$^_u;{L-yMmvN$Q!CR3lNH1R&wyJJwdFNxPozvOobio14l_?5rT&v>hd+omAU4EI#*`X-C|JD+%IlZEj?8P3v>s(nN(f{Ps>`*B63a zG9H#=d@|FYEfrb~Q?ROyK~lS~bRNPE*4C%5S_oiWt@!(v z*IPGx%PeK|#slFAB1Zhwz?-^0H_ubQkBkIFjeMxi?%;x(I{-{8LWrNR4Z_HD(7l~^ zJg?c~f5`bD9(;x#eK!l~#ul3le(9QM+ms$s+sKaWMay0{NJO-}u^%CM-U5_?zK%^K z1I>d!+82PqvraI*SJ#9tq8P2*sFAV>65I3SpJXM09)M z+!p9H)x3&jrt=KlR<^*j?c&(rGYEWxc(9#!&5V!h26DmM2&v5NTd!;BDD zA%Qn2Dxk)}I!w#IJ@8hN6f2NIA!x>iT6R#uErcQ}1rZ`v>9%;JHZTXw^(l3GuD&(o z_=BJ@v}eI|Gzc9YJO|o$<0`ONuC!F{!`6XI&B<7E6zTb6b~JAUyEn^m$U~EEDbyn? zPxsgKQilLIXT=;krTfrRa4P{6%-EeuIGkXr=5lD>^+-b|7sq?~g$TjOS$8|GIK!~n zSVIqg`7BaEFtG+^Sso6{HUJlK000U+0iT+-iGKnk!y2;BOUFDs%k!2ywBnU0^k)ny zx2}v3BkFqxCK$y)_`pZYIyx=L@h{0?JcvfS7f0buJfY=i`6N$y?RmZBn@Bh_+vcRh z50;KooQ^g1AiQ*V1Res*6P&WXw%S2i6r1g9RL|8-lp>-EUauoLOGxWjA#Z#3_)>rA z?0m?`im~m!H@W^hNn`zW40n(EX)c6ZNm@Q~-zo?LTSL96qgn|E&{Ea2S$Xi1)&uQW zUO|q3@{xR^gWf?WJpwTr!7e;9eSJDarpWAeEp||ZDx69eSoV()yj}K5E0)q*?BNz- z^tGcr6?~4!QJfwoJVG>bVF|HdHrbpWS>s&h9;(6bWh!MZ~9Nw?@#y_q7& zPG7I;?K(O@?$BnJ^TejM=otK;jX5Wm=2{ zgea*^-j)~k+K1hwyuST7R#3u5OY?QMh%HDukBo*SC%Pf4YK8{umRl3lUt*doH4Z=) zl>ky)FJDX(erGqMKr=52tgY9u1=N3?x1$v%j41X!Cg}8S?1n&1$J+DRIAZX`p;fH+ zaWZ%l(M>AlEg#-BCXG2VxPPx6BEgrO#WB{Yf`qz5Ub)ExQ2E1**;xMjRqiJUv21Cz zbZ2A(Ks~L5_aFkzX)~us~-Y10H~Zu5#!5+84*4^?mcS;RU6? zT93QJDV{G$HhMM*p?QXv*=iUW+j5z_Kg}VB^-4k22J>Zg+IpfT)GQ3y0g{C-PoD2} zMwyrt7*=4p{f+r_0vwwLITWkIW{oZcJhkQPH2dEsmxI1J?A1;foYp6|%gKFZz#tnr z6Y}&xseD8nT*9|T*o~7jY;-TD$wj~uPzZ}ctmNEsLd|_M5=5^cMRpvd(*K?`hrcqh z?kC7j9IW@rON>AY!jVO&tX{a2lJ?rlL>GTm%C(F`%p&t+_xxGU8ZKHJ`;7b9bn;-l$~{`M4~o#LK#%!y-~Qj!VPR2BG?7KiW}WB{YR0>0S_xMEWU$QQxE? z3V%2oBRdm&-Na{U62%sC?SDL^wYNNzh``l-U$0{Xl6>7$4KUZy?XH<;+g56snrpIP z%ndp8L7t0CUC$qgAeD5U-`{{9kHe@Vg(vFeYNu#BhrzL%#yCAR2&0)60ae4^vBGuP z-;%DaY#=Om5Jp^}t@$2-vxFUY3a64M;^y&pkxleHcOe&j?G7eDs5A+CL4h0X3S>3V zxOTX@(ZR=s@K{?|IX0eNf>e0Ql^I#?8#$z$?nLV{P$Rcn)ElMutgA@!-LGRFAu7EZ zK#*e*Y>>RH;{!miuvuz|hIvx^?;xKkGItBh6UHmBl_2Urk8U}SUQf? zID{vKclO^<*kdTcqWhS3PqbBKu0%r3VxkFRT8%c@3@Ms%N6f>z`eh^p2G!tl8rG6N z-Iryv~gH z`=((wbq-%ZUGq5bxxfgfEyAx-ea~*FF9LR(ktE;Z0wTI5zNrVG8|2^{+xW4d{ZkB$ zTa&bUaQd-d=H{tI!PxSM#)U3fP$$0rOiIHeH;V!jGED#D$02>2O1)p=!+)~W^!1{G` zUTjUI3`h2_Q~9Jfc{e6SsqpY9f5=m9t)T%l9sU<0{znU&*i4ReyQu%3)a+817`dC; z;Ie5t{6CJ|%Spi%pHX``kyNa%DJn5>Bj*l~n~#DPmK0OIoznKEULd*fiW}f2r_cXO zoHf9+`o*5T|M;J-710kBsO1X>yTqL({yJpfWc$kyOM%-906ZD^I?n~;)fhH`p0~~& z4hk#GwB2gf)8OXcN^>v~CBE>z&R?->!v}U8KIg!xV`NyXIMgG?S<@E?7&!4hoQLg%s0fU_>q`?4uA()h!emJfb`=I@NzCi%q&HB3F+- zlt0;UU!|))!+mt#D4e29sSu&WtQb=79o-OEqvfQT7AFtz%m^)hSvfWp_2i~|YrPTB zHDEZ@z?={S7!6TIOw>YwZ5}TQhso~@hp9p9`~s#qY;0av)4GDtfnb?gFOEL`LksC4|9&?y#l>5r{^9T`TTi^KcLH|}3ytwW#PyGB`}wLG zhTLki(aQcFnhc8@4VTK2`aKEUC`r5q);QEV~;XT#76645%Z!Lz=kdVMkDF zl&vTQW2Z-+Yz~ZsGg}V7E#@O^71}7om^35IKrpJLW0xmPby}XbqX3VAAsW?HAVk9@ z4FMekn=}h@P;rZbtRn~WPu~xpuU76z6b!?-Mye8F>c+IPBvH^|0B&n=7SQ4O9 zD4-xT#3`(hltI`D4H#oX16#&87Ks2cVr4Kwc6L~)dR{fu$IC@fK|O+yU~$EaNA=;` z2FcbgSj40`PG~R;PaJz`R!X3odDUwWT|p0WbONJfXf^wBK@_N6N|RTBHb5ed)$O-} zgad#9d_rr@FoeNAAnU((Se1Z-OdGbaMbh9Q;Qbqc1$+Q~ zg$`1*y?f$rlrqzrFQ7o$%RRBQJY|omPfS<4!3KiJ-wGExxl&f>qIVUY>|f&Y2r%Zh zhb5$;d6lP~8&efRl2bs@69=tQ&`N;101GFZjf~R}o~=}_;-!>G!j^L<-gE`SXcKdVo;eBA5Gu57gpJKgGn6IOdg=wE7`62I-K0^lm zC)K7qGnUYOeMiY~s!bX7TVCh{ykt2IaS5Ie#pjz5SQyW`pDA|+?J4AxQ85A%b9?Xd zs2=8gWnuM_O`0`$!HBf*5S(<)xyPnPzSc=PSZ+0< zrhk#TipBeed5~As>uD^ml{v~%)XK`T7CINQEph$Wp}^d><_WsX*=(rEQw@M8?j0sC zBhNN=vLp8t=fCdz&FQT&7V6mqI60Bt73kU3ZooHDSo2?OEZ5b2=yTc%`Fd7C+h?qK z6a1x+(EBKkANre*hsYfRL+zys(`OQHVwSqN&&p_d_bw?qa;9&5mlCI5I&%$96&rhP z?$T9Ta4c^Z#Qozk?{gz@-~}3oB*|VXwP@+<3uRjpQb^2CCr&5Z%UA{nBKl;9xJ(T@ zyLJW&$*iG8)pVG> zW{>5VCJ%0gH4keOOncKf(O2Zq{+82^kY63xZ+uOqLY+F)u;DZ@a zCjn2649*sf7IPFb5R^5P&28o}@oug{V=#(i12S+4-}ty1ZLkjL0zD{Mgni5!t*JjhI2g`CefgxYxo;YS5b}5+9_Y{xXDl$RN?~ zBTR%W8RkoY(zLqsEWGF1I@Y;fa`xx~9gVDFI85#v(EPmU2sv03%T*Of)v+1cszTUwAS8Tgsz5Zz~+QlEI?j4Udef*axw z_VMZ-c9T-NCuo#W1=<)nHm}D~t$Ge29rQQ*VuOrEO5^@q|5BgzkBrkWS$s}>n|81S z9>6m71vV4&`0z)ZyH%DT1ZPwCqjV%HyPFbI8Ysb>Y5MD+U1U-$TEo5Yi&U|YL;qeX z$=$!CO#Hb<#E!bYE0N7cD=Hxl{sW8wKfv%Y_HtXc>YTB|IGbfJ3qoReOGcgu;sgd3 zQx1#*bM~0vDM3^sQ8it}CSgTaBoHUzVHIA2V?e;$L_f_%2H*uo z*$F5Qi9lq_;jStGIO+&E7T|mmo9_9GtlC2O70^7Wt|>+aB@<-VO0v#hV>_Xv4nwhN ze$ShHBFS`{i*Kyt>6FOW#|wZ4`6_fPV{zF2?_(K5F*kmyb2M-Tr?qWV%JAb~aqJB5 zG%<*Xb)RUe=1bR`P)Da(?U@7m!3*3M99;YqBM?TY0VSjw{kkzszZ?BJ+sBW*xQ5{U z;$XOwXtqM}lTDdJZ@4$l&#IenW%9R%8v&mh^|8b%QnGh+puL{k_}N+GToKE`N%i^C zgu5LaL(PR%g0zEaKJ9}+K)Y-!is6w`f{n(QD=_9c1Le^XMy8rRC{J)+WJvVSK1Oo5 zP%TzLu2jjy?q+ABXVBXA4XexX9zflwZOwrt@0?e z7|jEVTHrj<*U`z|eJzwy8q%+hZz_lNQ}FPYk8%W}da!5$WU+koT5JKzJ$(z5doA*m zY8ZZrK{q_0sM7!r-oJRbzoW7bte#ws03&2^zK2^7E|}A(B~-u-czSVD7)9d6_us3x zV-4xzvJsg>Wmap&@ep_GSA*5yho?iM38q6UOzD>fVYmsDOLP{3(227GsQPL^eb4wl{RX6LLTj1~z09p4o9N zapRh-eGPD4&=Ee}FrpjcnS%#+rDSEB+Gv%LLN06my2kJ0dieTZY z_!~27w9vzabecq3g*|sjEK*fqCH&g zU9=SG?Otf4HdSv=x0axQ{k{#gI5xk4Fn2#)GFIhyO$@#+Qpk7G>1xJ5W0y#aIHG&L7{q%2Bw1QrvsN@ zP=P%FCS217(unq1T;fC_O$2gZtbXs@edLtD#|_WoVv(0;*NN{!X^e;d`$rEe!!9N2 zqWR*&yS1@{;f+;l5Ur$9`5E^Wmr<}Wkqn}X*hY{l%vQ-(ympQ`tw`4s5+cgYt*B1d z_IusAUY3&7?WVHS|Lu8;lRcj#COuk4Nr0MCwKlm``V)YIH9ESy!&yN5%xL5asm`Nr z-O>{#gf@l(0K3Wj&fsR`xuVo2qBHWIWZLaPn1QFvke7!$f|lF zJ8<65s>3jwKD+!E-KKG-R<#3v*x|5#dAVmm?`MJdo1x95W0B_<5A{+nig0xLu{Ncw zc(RT0iDGHP_DCLw_OEUjkRqgl`E8CH5nu15m>eySI0^UMZQVOlg_!xV9MHr#=lkcY zw;2E=Hd%ob#$_xDMcXfpICH8^^09UdF{yg7Vd#_ET6U#tno^PyBn}9^C{gNd2{hXt zN$pD{sBapS_rTq|I8sDEJ%JyW-H3lH-r=f8I&J!J79cY6vqs8&i$=X2UC< zVY_{{3v)=;Q#dJ13?zno!a0$+g4a*r{Hzl1;EsC(l=P^d-uhVM@XVJ0qq09nX|qL3 zVRyI`7Iv6Psf#mgv0^4|NS>-qgE{-fiHdIO+rPF75Pp!n6F#Ejp)w=Zf)kOFDr{_i zhY_rfUY7s{{iL^tEUxhX<|BznOraZ0vLh0qabzB-*rw>clRwi|^9Q3^3m;%C|3IeP zBGGQ_ZGhPg)-+{gtDB32q><;dpDtHx5_A_uLjgH-f1ViX?YLi_qnRte^?v(#NT}f5 z4@*lVG&bcwS5x;13mGfn{DCN;$TxpR*|PZ!^~@t^j}Vlm4e974`6o}MOk!aEsZg2N z#H=2dC^_97?*S>$YoS%dbln*^KGcyY_uC6fe;!)96wPI1SJ!EX1$0jzx1Bo&c+ZL z*Go*LOf9ImNX$fYE1-+I3NCsFGlijL0qWJQ@v|frYiXY7|1-Wpl#S2FUmn9nukQ&- z>DZPhwFXt`H9K__I*bo&|D*)Bi$iBdjiNUJ?kVXz_208+2j&|;fHbeW zye(1u>U?%eC}skQ=6iQ>(uTIM!dlpbAOptwm;G~8EmzwX>{^a`#Ia3!UerWatk+M( zT6{jk2*oq3S>7qY>;nTgwMz-T))9yRT00G?XFiWtRw2ASmpw?9EF1Zg-g(JNg|OYo z3rWdFBO1ur>k5C%qSKzIu`qee`o?>o5wY7{e$4vfV&wfS5sE%T1?PW|+-=h7sUvPz zm|wEwXgZR4OlGwn#V}{s!F|o6o8yvqe+o<+v zD}UorBWlL^!S8D6-k9dOZrJ)xaFM%ymCJRBjroiTyaogr%DsXY)`^&ZBRe!p2TEai z9U>*8c-~ln$f;*jfz>yXljui%#ZpqnK<%Mvp8dqf(sfZ3r)JpNcV|gmm&BDuc*Sow zWtCKoks5@z7>i(`Frt3i@=v@6bO=^7M%=!>rI3~=ZPy7GCQr%Q*c=;7t$g&G8HF^I zv7Xi$iW`uoL~AalhT(VyAjBHgh9hrZPgHfq>79zDbDEhw91!#QNR<^U(;zL9^C#-< zdJL+)#q7fC4Y>@GSpr9Qfveh<%wjZyGU|I}@pWN!b%}N3C=Dk5CfWR!@z=FF3)29T z3CipvFzwa2v=?r$(zwr>HfVuL0W+*)wj`|kaE7TWQ>4~sus)sG6zI8fHRO`O&~%mC zX^CjR$8QF%J^$HRB9Nkq8*fojg#_IEs1B5Hjp1t_cu{=`PQ4_Avr0|qX$Ux&6 zR(}pzl=$>lA{Ic?{xum>grxu>rR z50E-kEyml3iOkY##L8XPS}0Q!ws#iOkWQ34*^5g~wy;vCD)HUV*AYI#NspW&>XJUh zG6Xtg0KGy$!N6Rh_du#szFf0Uc$>dnh~+Q}hdkkjs=>7Fe?kOHOF0di=HC@t zozX)Yse61hv;H2psRus zh9rUv)CaokVbZ7*kJLUDP67unJK5n;Lue9{FO;#p1vpK^lsjMk?`{;oXC29O20)i+ z4OAsOGF zx5z&eKoG0@t8CfkdQVlQSe)3Ap@;mFMfG@7j^_Z%{^w6|QiYLOqZ!b~4!2B$nU$rE z2r{DakV0(J5;}%rM;Bw&Bh^LVcsdl4X(=7hAsW?15tc_ffo)L?wL;3N$R*{& zGy(f{&$;VQ8?gKGy3_vXdmK~6^DrQ?nPM%Z($KMvH45!hW+umvhpqQ?(nDp;=CkfS z4M{~B=tnn2-a^1m6x$bR30M{Z&Pu(G-z=D-LU*y(bQl1?XAOy^TLnPD^Y;K1M9cur z6%bTG8OV`<4QqPKB9;R%@opkzrGp~ea{L_I{BnGTh&k|h&s4IfH@?+M?G1}ko6%t@ z+O2!eH1>AgcW@g5?p9n>V!$;!=^E@|z(!wouYK=og=Yl8Ucw--%VNYMO4*2%)mbk* zeX#vHzygr5eE_%+`Dh4)A0%3N!osvWms}gf^k{NHPDwwy0FAb3rXegm5a-Qb+x4D) zRR+vI;0X*+1ULWy2{|F3ys}C*Ujg@_76Z86sWMxKR#P3t?Y%`8D&3m!{|_B9d#dx6 z?*$JFPaI9do>`l-fxdqUJ&DVT$&l|9zDwU{ZN*HRyDq?^2kmrsRFp&#EK6`o)S`h= zASh8!!i;Xut6fXI40dNZg~%f4(!Ru8!wVt>iXrrfEdonq&xBOk_zv1^nErx}J@jO5 zoMbTUkCbeiL6f#<4fjKjzs8-uWYu*#MhlG2FZke!MR+j6MV(0iPGL$;0G9Yz;d;DJ z@1<3ow+!l*|hVO9rwg$nkB78J0+aYLY>OQ|4tjbawjLe zaYhvP)y_RsC)~UNzE_LM0wz+P#60fNz47s}cen2YsoV@suEhgE9xA-x<-Wa0>^IPJS1Tq7z!gBljW+R5>< zZ;c7BF+)$niuUT$We;BVz&eWxN;`|+5xS5(9aQ8%fx<1iUPM-L ztI0QkCyyaJByndQ(UTxE2vDjlgL?qzUUjf#H0f-gd~D7?aZ?FqnLBdj#lfD-74TQ( zn3UqWE@?6U+y|DJVuIdYDZYb)ztcJ+p8*l{hHg6i830E9|_ zWE~;wo|>GnKgFeB$0-03aV7P%t2QWq@b|lsqcwfM@JEvL3(=vWx`AP{=9+XdNcR#Er>zpl{wxRP^1@WV7@_JMVJr z7K%`Qh>2jf;d%Vl@bpn60>9f0B71T6+BlNh_lFb26G1v@2w`uU-3_EfU*DS2#Qevq_hth%d%>u85*kM zY!(&+g`3O|C*fAZl9&|f@&|<>2kwN!6z6at=0s|B2>!k7&*#(WTYc}TbcgU^uEy)` z9QV#ICt<#z0AB;M3@4yTla|n4$QaF2N9XvK>JM?}Z7i!*Hfeb;skTf_0uAS-tR4e* z2n{qj#QuHLG~a4F`uC<nI5`NW{gm7YHW*+d~V?wmHRf^ptL4%S{zkRhq=h11=ncHR%N@rlA6yH zbC*VB76mE!Clv2a^GR}lWxx<8gIAG|%#f^B%o*~-#2+I~P-RuYF_Z$-u|hjq)|f!4 z==m1Ev&lz8L!oEWxxl7&_tPP@b72e`o#IY&a(!m?Pij2WIPyr&ySmsB7(B{H{w-{0 zUG0nEYw!%jY6O+eSdu;-)zSrUK@p4SX~sw*zlb6Zxi{ZmbL;z0zb0cIt);+QFvUUD z6952)>-xD(0r4@lAk*MzTUDyD{nhdFy1<58b6N`}YpOO8XxX*%mLLHNn}qsCOM0L=!%10S-iVOqVh3)XvK@@5 z;7~x-n+;k+oTY6$CDPvS(iQItX?5U;c!V4}d@GMQK1E4dx(dl~HU3IqWcu>I;!&9!E zwD5_;3;Q^M10wD{BDHYv?$(km;$%>$@zmVK@qaI;YM-LQOp@WZo2;>H)2y16*&s=Y zttVY9&a8NUP90uCvOt|ac%UFyF>9e@Bfl?t$NdZr1vW-}bX7hH`Cq{I9Z2H%9NpK@ z+djT63Jw@J*%2(z@1^uKXIsi2CNQgG!hP9?dJf5@+VIJZlKmXg9ZZ#XX3+z^&r>&^)qgYV>Wr zP?)Ac^x^2nU{F;YUXt< zl2}Pb!819O#C2}*%GwG3A>F2*6fTz8{XJ8`+<3TaDa2&>LPU4#^M%7jrt^SZxlAgC z@l2dH*}}Tci%zlaF#f3oeHirl{B$4dl%u)2K*y?lbFM+NP9b0IuBB2mK>P#?5TH1D z{C339x>hhU8usNdp`GZ~{nvzU{)XkUId{e#jrn|-@J`%}D@177n?TqLb#v&fd;5{( z`$>Qx5H`p9NGXEiUPHNa9Q?Du!t4t-hWmIkd(N1dNho2~)~$azZi>t)aJqBzgmgkc z&r{N|0iJDebttEi;h}QJmWjwu>a;3<4wTn3sD3Tr4s_F}j@U*Aww{gEq1yJUIE=hr zf<^jS|H(AE*x@3QLsS6WRRFKxbj7nz+(dl+#dj@gs2(1Ee+Om?lTkNjs-jn>aplS* zXC?T-jR*O!r5H0SU;kP*#UR;oA zJzZI8j!jp0$3B0O>2&^j;oiH^`xia76<+ZuI7&lf>3n?C)8>s9Mv*#(2B#kco$p z&R8oc0<9k9D3sFPFq3<`q!D13Re4CDfEM;gUo@GXdeqH2 zT4L^Bdsw^x`u^|<^D~kwB8K-`Zn?!LvQWx}^+W=pKmoHM8r4Od1jIs~Kxv_f)3x6& zJ4y(UumNfdbi1?}CC=OdjX<1_7wV>yA9i{2`v4%e5#UxuYE?O{8)IM$%_hGdpdkxg z{XQlDFMb%|&{7yDa0W&tkwA@GAlR$`R-O)!L|POD$yS7uR=1&1fWVCu)UjYDG7Bl7 z%<-@TPP|s34qZGimEsZ+VjWGzKI-ewefBm&uRRZ17I==%jfrAJmYde2Dd7EKB080D z;LMC@M#RY}b}99`u*8;6P&Pp|nb`o-2+bOIr{SnjT_{Cqkr3xvg7FDPDdoWwo}iE# zWF`_c)@$4pTq_GK1d%5ZykACVB%D%n%mosp=Y4Q=Q7@Oz}aDUf)Z6=>iv-CZ+L< z{Z_U`p2|e9+TrI`iGWMl=Ru0t4rimog;NMd;7>@u0T ziK!mA#dL?q`3CbWyma|%+TRX@k_#<_IQN)$D~4t`S?%H@je_3j?Z9^w{>R|I-Bx%6 zo!l$b1)*gtdeK&5#XcJP-R{^-ier@Q6L|t$8wI|BAuNOK02i&F-QPZ|8fT;PH|3@; zx1c5g8i+!e@U(~zSW7(>-hmqxUH1cDAXw@~knOsjXi{Lk&!;NE9;UTw(#4<2>bcRB zbz9YD&wAXBTZ8gHJh-55hGrSjnK2xZ5RNhLycQWb_G8I|RDb>0QtUkUA|vD$Lr$q& zIPN}@iomehle$_{FA=TZZDW!fqmtZNl?o0=fbQ$%+r{If=5eWALdz!VYCHjIkb_Cm z>`(`SBQjQsRZz;6C-%ve0O({+<6IaxM{nM8=H2Nb&hL6ZlJ}u`c-N-r9NwMfi%9MV z74!&9fkZ<8+^I^g3 zgOPg`E<_ka-2=V}y()QJI`Q6=@kNMVX~IQhie{@d zjh^fuIP>I&?;{CJqc&=8?}XfVUuUmN1;lTMk73FikyZ*5PJYbHRdDgVaNBl9HNAL* zPX<#C-HINAT!14HsxCAnho8Oa0a^a+uF+;tBa+AE3O;HqMxSBj(t^I4j3Uiq6QkuQ z4Ac{N!DtY|t^O`~+XnCos}-OW2b4hPXB&;l9o$ps(a-OAiwJEzo!5KIn=gUM2+Zny zNg*JtS_=0G|N2~{)4Ym_Q4wPGFDdmzKL13&mFgl(U14_uKQ(rXan*2)qBCRe6ms~% zS8XUa4hms!@QfRlnA#YNNDrd-=meA}X5|)`hNT2$rAkubirTftO#UxVib%Wvj09pI zL%eRZ)WOV1oj5cf5~LEVtw=%?#qYkdTH#iAv^FWkz6>dOsFmbo5jEq>Fka)(b%@$i z##Qb(|6wsjt-B(_M+BRr?^S!xFb68G^u2*^-z1eb)nm?pVL;LuhOWK)Crb5xfYr)r zJFz|PB^_&x%$FbbNA_AWkXvAELK0Km-=*pj%VqYh9F3wgU=|6(-K;v4u}qvE48L;O z>%QE3KNQTb;qa&GsBMge=05RW^l=+D{ca67jH&*6r<4E4;f)SYDwuSuMbm;23}mVi z!$Wp!_$1~A)P7EgSTNeH3lt~AvJM`M#|6&3#Baod4u5vi2J0w`w- zRkfWEs&QETjqpK%ufuV>R?}@7<=`z#<`ylfgB2>y{e(!dF}QN2J{hk{w?>#>q>xAFJzHPVVy3wqn2&%>i2r+Xo> zjd?^QIFjdJ=oJgK;3#4my6DEPLs|Kvaa1|hvF)Rhs3LZ`H4D)d&Fz+DYTDfge<)nl zh%R<%=>W#H+} z$*>!FLwPNM5AT*b(icbPcy-+7Duse-i_cT0fWU*F|h`fjD2I5EV z@v-B1!+$UO(=v*EEc9}yqtUyy0X}vgKL3jzU0gI97`5tZ7L+05Y8yGwfSZ4BAxKP@ zLC^tdblG~<|Fna)AILRMD}NMNRO?uhPibf=+0965^Wh)I=NuxJEeR0;{oQgI)r`VI z-xzdFe4yXqr-_7iMEiEHzb;6@OrL9^p5_Z|_xo&g|IcjguxkxA#ew?Sh#pa+FN&@I z8Mu038LmLP^A|RjkB}VwRidUf*pWMV_~Ivw`B!`O-7^*0d1|0Ib!N1#UrH+j^w#ia z@>&Z8%H8K$1J2{a*6}Q}gf7XRLZ>aFr|G5YyW9w^B}E_6jq!u)o<4my|J>p%> z6sfO+KU=2wndG9u2|Y}=**&1po=kYY4bYoUk+Fi;8$Yq%*(0H!`dP&ccY3h{-R+w< zX@yND1zl4Pb9Z=L_;hfrcquN$+FLXzv7Rj0ZndpA6>R{_QFb`Rov3Z!4$mE7eaxI1 zG^owNe@IJEPz6L63|g^t`5k0vJCq=2WpW>3lcl)Qn)B{cU9ibN?7dV7VPLcd0TX&W zvDR-5SGrtVA-*W*kTUwz5Ro?iy#?DE>c=4T9KbD+u2K&)*=^y02%i~?$GPLu-D5aH zO*@VOqh6`5A5QdcS|AxIVLmMdg-nbzgP;mQ^8)WD6+=E|eNl%R043oe8r4OW8hH_; zm&c2`Kn<^vFDkCBb{TWmEwG+paM(KAm^*u^1=*b@jgEI3F0KBXDanWO+-pM<uCZI?WnJY_3G{nFpM+hw(fCHa^ zQH119ph0*lQGjWPVZc~bP1jUFVaO6wRd9QR2O#BsdI)RO)8JuLrzqHD9PFZxD3OFu z^0iSeU&^FT_%^wv8e)_s3dtqVGp&CWODIuK+NDBtDXucUO8iYU1z3gGUk5g!aiAn{ zg(Lwh&?~OO;ER}$MCr_7^=Z<~yauGgrtys)l=oAT5BC5AY1@0&U$Se@so(!Z7;nf| zKYZ0=?|<+?N`f>24gdfT13{bLCDb8aOr`?4e*gfsW3LIS`_12H!-JMXc}5(uddh(% zLNUneo~jgYL<4$b=7)i`-O9YvV|b4=NdJ=K*dXqUd@N^qc{JZxs0WZ``M%Cf4vvyMeZ0 z@D)Zb&nU=yWKnEIj&%$=`P$tI1G%mOV7~=ulyG5-Es1OWb5;=tWmDxe%mY5w32?{^ zT*(TrWw&o&oGTOdn(Df+PqqvmD#KWEC$A?r+{6E+Vf8)q2wj}EU87FYZRYV?A5#DM z8%a<_q0E$v2W+*yu}R2rOQ_n|!+?PfFlz<|s~$HxPfbLy7lQO~{!Lh*&|Hm`K0XGB zR+$NLq*)NXm3p1e5z-l`SMxvTV$k1j)5jCL(JgDM%>S{Zd{L*lWwgab_(`XWX58Jz zq=5#9Z7gYCaBuEpn*ikVZ#99y5b~?Q3U(pYfy#7bQCmht1m7~;MF9MsUn*D}(hS@z zw+Hcc32#kX$@^3zX0}tkro$k z(u}XUA-ZlVq)(#4Sjs^mF)3yWD`Q*)&&TP!=pYXQ@bJX`)Jpk+JEs~c0l)Q{gHWJz zn1xbnAz!nzVApKfn9j=?=H+3CC(*H>{Atu2&?f?is6e zF7|Ex7R;+^`>?YSYR0f(l%yt}Z~;6MxYG7yiMv1sxBR5m6Yp@jldAyC-^^`3?G^Q+ z@pCh$-HAM{9gNhTpzeDzv@)G#_#XqJv$d_%hG;^rXchsaJnXUL=?4P1AvqPR9nkuA zG1xoAcjJdBEb+R}ywKTW#Rr8`93zS7_|qKxVQNOI{u24pjN(k$M~8jon=vlN$ zWM)x(^yCD~qlCq(r{d}e4_#Yj>lqT_R(7hOqAnEBUvAy;zay3k`>M?!6z%&-uSPnG z$q}EcT~`HijFwL&#J|&11&HeIlq|oEBg)&BKFW1kG^^6bN59bG#e%~SX8$&0z$w=E zUM%W)rY*hm2htmN?ZP?JUC8Scl#DWC#RAe0H|~~>4{%GoPDG%L){$*k8LcCn% zs?GV2X^nEyL-Z}PLl3=B7gv}wi3d4C$BzvL-1lj;W-Zm14?>Ff@iDhTPTh~8iHO;z z{QuUB0he$Dg}_duth*x52;=1q;(w5Nb#*(g)Ko;G0lex|IwSIE)Tn&k93QMe;V-rE)R4T zKhpu>Kou@cvaHb|rOLF0v2FoGypJ^POcsUvV+i4XA9lRTFvYxT1|Rme^VLXlX9f{FqLMQ`HZbBc5c@)m`~ga8+P|=IJJ~< zZ(f-o9(2v0K(~&VfX&i_e$=GUu_%pfj`ZN}-Lyh^z? z!@?sdCr5CzV}^KojPjKr4zLKnjuA)s5qz^ORyX!NY+>oi1h1y#T1K1lWj2-vA7J%ZzaJ^z^Z{>2J|b0t@!zmQrLPV`kR`sb(rqlZpFQMi)5+ zp)__oFHcsQB3sn8M$~)G%Rqo|z{{}}>I&ST{mn-a<32Pbq_^PJoZt}B3Bd`GrNqbT z|1?GZVf1!`-(O4ckJ%!VLx56@8YF{0A>!tt<@`K9(;of8dlm0@{03LHo{kr?AC#_w zSOj$d_p^a=ap4eivtK&AFvRkrRiR>uS`^ik;WDS_oP=eS;}>=r)p1Ce zOom;Wg8W)?f894FevdYxOqaz9B^*uGp!d1iZA z3qr7qFx$luC2N7B)_`4GNJfp|0*^6KjBd7*ajZWw5v)fWs4*Qapo(*%@Qt?N0);Sa z(Z}Ho;e%qn&KH9AAZrVHWP>0nU;ne-LHHz1)sLHKxz?V z4|qm2tj0u5%s!39ZFaF??x~AONWyXn@b5m!ouwoFyvy5Y-HuZ{TmtvgrRQPw4AJ)l zjk7HwFS2zosx0#4!(yFwwIO*R6ra2&F+7wEbugb$a!2~J5$9#Dp)vhi(`NQ$L?I1! z9lZn+EGqMul&=}fY_GRDN#9rl4+PGwxM!L`BXl2znjkJB6U41oFN$m00|YM^w%~|I z=cMgW^=FU;Loc*5VoBXv|K00Lm1R20^Y*C(-YU4PP=M)*Yai0|z1KWz86T zYV7ZBuc!iq6T(pZsib(U5h#8p|j;e$)S9I6l4 zv}7&|K))4PShvN6@;4%5s_Ga-%qG)m%&`7y<(mV&8fcM_i7nqP>B1CDYEAT4)T0WY zRGg7jw8r%j3ZP%6?K_gLps^yv{BG}p{t-9nw{<*#5OcSbG*-O{e}6VlDBCDLNtgGo z@7yu!_UoJMv52zlAr?KhR#n-ejP=-AwWTM-3Fm}P#i^E7kE)uiPio*qyUax^1=c8W zLpZ6I0lXq!czBX1UBJoJ5_F^+7>o{D&I1dj$*90?Wj#kQf$`lYgn02X4!uYEQ_uj`rh&bWCbzq zs^=|TBv=5m(%2CaCkJwb-KxWqmZl{dzO+yGvZe#OjBv1rM6euDrY(@$vvs9~A=Fb+ z;*I{inhASwz9YzfOxq-PX$b6H3tJ3%mB+3Uj8vBix;PU~$nM3N*f@=iK~H!93#M`b z5Q64GH3i2?f9_Yf_YtMdry`4{;J*}!(3kUiPIX*i$}dVS-vIawygl^*a>&fwZNs$Z zaG1f^WN{&zIiBN!Sib2PKEyF+AWkNWkwPxP!USF7_X_5vmffnk-D&MpsLH8ovcTOn zM<1%?h{rsE!Qd}b0EqnIcmlqmI3E0R@>xfr*r-8eZ4fS%>8>fV#y>WOPMdg}Fp^@u z0GTpe*FV}T%z?r*)szlZs$@{~EC)OnKqXOnvZWDKeO6Y3Gi6T-O0H}gk|q25H<~Pv zAxsLzC2v!}MZa#tXEn~*sPKOMm~56kXLtFh%{IE5YN<9FJ&(ZD)>^uoQZ-VMv7Cyf zFtr5V3+p>>IRmD>8@fTiN-|hwg0O&)g%Md78HWZV95q@b4t#w~ znA_M^t*3TBg~D!N3yU6&J-|bn0FBY?$es!eCkqdA0VBH1?UiYbCU|(L?Z^46+#{(0 zAXLs;r6xh=zC;}|gP&>uXPh(fiKuKg2B3lQQ5pyuoZRak4A@|La*;2X*b_gvNUA+< zL7nARpsZpBj3!c)sJ$vLJSm1$vj~#f$yEVkdgucXNH0M8>y9#+-n!vzCsl~&k!`ku@{E~`=8fG=5##z!mRWd3nI7C7+^y3VvzBgX@7Yoi8RGpg%AcP8SBNftz z)W!~CkzE&CjhTg;!<8tnTp^^OT#!XH{%{M7P!t7xC6Y)ux*F)9-i*<(*rL)(Tn<(d zRoOSj7t|ZQbOTMXkH30px3Z{RQF3Qsx+FDTTQjo?Dzo_X1_q+H!gSsj7zt!_>A)*e z?*Hy`T3}_mw=-emiD-d6AwW`axTR4MFy)7Xd;%c}#!19ih9Oxb3xux~4Gd+$cnMH9 zi|E+old?{KfTB&^t3TiV(pB?T*t2E7{n=_Xk2YTagk*#Opa^gP00)#IpZ+pRK3@U$ zs-zs=G#>9pNrPm~`{Lt+F^^FYYy2e*K`t>7pinKsMX0UfDA=$&N$!mm4tL**gyNU= zjISTtWw9B@zI#;yRsvpO`pgY4Mvq>w8F50AvpWDT#y;*Xs-X26RcQZuHJ=i!A;Yul zq)PDf8oCN&0wAr^Lee~2@LSSDJ5xtXd|&w+yqS0IEpY0-Q^?LcD2k>{6(j8@ zf?6_|MrU=2k0)`Cv8~yZ?$m>3ZAF6(9(||~-}vkRPCsH+e$DEV#^&Mg5(;?fU&o+<>8Pl zW9gwzRn4{X6${$~6XT*`D(IrYCst$6Rl~^6-ffMp*A<=$M(BB|cx~yY3wOUo1E_yQ zWuckDC&tg{duhjaIVX54l-0b+O4nlzx*mQ|xd8+hI@` z|LR26qzm-3yhimW&(0W$y?#cyr&N;BvFEb$1N^YTM$1=r!OB8?748&F9m1HdMw1i@ zKkuJa7Q$(|A5F^8u})Tb(uR8k5Wc8dqZ`*S5zD%IHEf`{7((iKUZERxV-n-!cJot> z_xyChrCj}@$PePr;d4r+fFWDLuiF?o(UkaiHQof*$neCNZdYQNLY-b9OQ7E>t3Fef zlNjB3;TYl=x;4qHU$XUC05Lu-7cRxPP4BS< zSn7MLy6!w;74G9w*T5CYK@6m0xS{J|#lU7?5e+jozBo2DC;zp38_+K{vk02h+UvZE zsklWF7c<8Y-)-iXk_RSqs?@QF%z?Gzv}oVlP#*Z4$6S%IMEK}$jgl-^XhCu^WV zab~2kFl4bVTpt)zQropb=KMsI;c>~ck|`ubYLAkBQsjq$eOh6UeCkahM?f&k6?aO9 z(5@BTiQrn)zWKwK|7T11!iga{?g(5!Vffgk?rR&0MmCX+i>u51#F9)gY3Bf=AP!Hb z%$}@YlW*ddlN@>k7))n@N4ou5rGp z>5&c5X}8nhh6kec#SbU+3tuQ~NI>l2UtDjdc|CK(38~50;#a%|VB4S^2OFA0006P{ z;Jb{|9L^8a_3a&Z>TVWlIhnau>X3Sg{@9c2AijrVC3diLQu5hpsv_4&3Ofu8t2JrHl0Rn$-`8yY z5U15a`Xg|Ac>o^bfbyl&EMT~#h?;ZZ5mzN!cHSGv;a;_n+HOJh>feXyDL;EZc!k& zQl^LMku20eJ~$z-4vr?YBSSQVP&4MbIil8 zV9{HG>{R&1!EuhUBerHlJCfzO^-Y?F_^e-5p*@!3`d zozQN*=hA?n=+#3Fla==v_-4dNd;UE@ny=`&mG5Y_f!Fo)#l0h(+V3%sLV1bRO{+d{1oLsGasvPfVs5X8HQ zs4%PyzSUL9Qt&7b7`EPvij@0z+X;iR8NhiH(Mzc>mLtEP=#r)c- zuSdWM0}fKnbJ$5Tz*iOOBcir@3Ad=xX80E?tkI#`5uLPbDF006!K6;c`a8N#J@02{@$a#P-pNIPr*EWu+YWi1d zXP@UHwu`3iHi7oNoM8Kcn$ILy&lUhTR$rOd?RFb;Q{PDt`=9HJ!*RovM2ENX`Hzxh z41zX9xcw7%J|X|zBTcJbEc6NuVd;0|lShNp(mMSB=OL&kMTMEaYK5rIf36%$^7Bes zFl5=g(&H)Onmi5zC>}OT2rvxAZeW7+7(dTY)6=E2(|fVz|um)_h8T3+BwNTt60}h**Ai zL*kR%B7MX!$$^d!eI&3YIEE>82kmIxBd+iyJYv?fy3lVDA(SiF@crYAnXRE!wV1#@ z^06Y~qupYk;&*0l-hFXZMWF#gdJYXH!7hd9L){vSER0u~PoxHBHw|KHsBKX1XX^eU zR~j<}n%b>(0)&)z6fB+GLvYqKZno6rPu@~9o3t7W9D}ancgqFhPUN|z8_YKwc_Wcg8}Czf+jKEQ;< zH9GW*uuJ-*hO|eSqBhFjg4T0b7l!jp?yHsKIIt}GHQN%*4qb_|Cze8UjhPq}@Y|(^ zR&OK#vaNNHA~I!m-!XG~Bq<*}*(0V5o0r66W53vnVahArpIS#k8TC7K{{HUCbJrH4 zT4JqI51dQQyt}T5^AV0UrA^TueR~h0E|LBUajTGR(^U5m|K~M2A0*^Qn~K*(J15xo zracC;b6N?T$UmmsoeJRDfujYhmUtaI*6NER?G(pm9Oq0xID_vZhkO?#{op{|^BrFD z+VZ%OHuwqj6(94T;jkSVJa(sX3gu99J`CLjucfCAG2X`O=P_AuXK3|tiAojfY*qJh zax6it`cdcI;%!9|yi*j?3f@%vtQv32K9R@}2qK24R|5YJv z@b~o+Cq9kqCzYE~CKXvk@LFvsf1yMejdkzbP3MQM@TS;Mh9eFq{P-28@#B?GYLg^g z?M27ywd*7Npw*msip+U5lS=IuEw$CF+P^h})ap%w0K~cvItmsZ60|yt2H&E27jFEf zq}yeo(fItmsC;9Bp-F8~RU>EJNCPb?Z9K=XbdA*5YnEn>~{pt2wxFqV!Wn zSeL?XFKs|!p?z;q^@>Y_oJ_ILS5Ospk=yJ28L~uibp>Ig!X^{v6EPDPgT)4C$esto z{9-<84Go=^F@%+Pi3aPt&>THrCWrfTrWsA3nqm5{ctECTnN51#Z*vS{A)&$b7UNWa zpo7!Sykjh!8h2h;TnAw_(D$P3y!9;aV0|KR~gc_VH`4j?GmQRz7~_sYnfLG z6;qPio9p?-*#pN*l4QQz!7sl6R%})bMp@Ma`Ot2lLTZqSkFfG`#lXIey7vkfqC4e} z`gV>Y0xa_Veo=Ak7CJ;l0vmPE&!<8y_e?6G9n~J^Ao}&*hacwb%|Uh0pG_L0OvI#0 zQ2MLnJ;7|zA)u;FJA#cdId53ovlj2G=*wXvZ}Co>s)Xva@knsL^=K`(MzsIpa08AR(_g-+yf=cUR{?{RYD5>n|!&G=L zdq&F)iQ=GLSuj4T4OvVt%nqu^_PlJ?RxV`As`8uE7Zi(~=YX$l}diYcN~ zsd#}3NUS#rDrwY19#;B$RtHjZ{{R6GAsW?99h62o29{K4VAjo(C`{6lNDd?>ziH*JE9j44SGLW0qFqH1d!*;3$$hjbKJlZYO#%G}=BjDo%Cc z*5=3W03x|Mc}A4P+HkRFSE0Gf6NHUO6HYf1USvwD1_d#eU=c#$MG&YaUY-&m6V&DA$A~gX!M)heEzyDw(QrKfnQ@}ug6afG@000Fl0iGVRNq+(a zerVoL7TqtdmuQ$j+SLBY>l4w_3GcHx>S-9QHW<`1ynK8yt+<>W`zokk7)B>SDyPHw z1i%ze#Grq%H}dWfs1LcS$VWGB?_gYUnx|PT({V6Qd2x-?Gl}GKa zi@KEY65C)9Z$AriH6Frgs6RLr>dsJUG)K8NJ!<1uB8t*LKh$C%fJHhoOiS5Oe{e9} zf|AcKUqao3=L2mwEPs~UU-2(KhZ@NZS1I{T>6oyp6PH{U3k35Tlgl~W?UXD>BWdW5 zKlk0+Fe#Dk1SxHxn<#Ay$P$Qd8GB7x9?tVj^&Z0-1~okjF>&dS+jW};SUcP780$@o z{vhkP-FH?>DJ8P<$hUMJbp=EL28Eo>VOR=dcKRdWZ-_*9SU%i(^^b5qTyAs8ga05x zJ$W^?OU0!KAc@dOjegRWEcMoqa1O8k$ckgwd&a0#T3PP?;cpCoQ8O0rGNWZ9zUfjn z#?zd!cdU21wWT8%u}2nhsvCn{X(JI%zXj?tF&Lyg!2sn>;(UC*SMPEDHb93?Uqx@c zJtRTk)vJZ0MV~-6eVsnLGJk&S`2=oqMiO+#p(i(^oDI3DHyNRQ(hmg(1Ffc&QkIfK zM;)9E!!01mth}R5`X9fnP^>TQyo#%gzHtyYN;A9k+sR+N<*3EZ&5hwz#r*oe2dasDXr0@ zsvD@%)4to#f!C((Sm9C1aHUL@1C_uZP$)CwDqsUqGoiQUHF`&wrc?}YvE94sHX!Mt zX|-w1l?&E_S==g=bzz7yO6sfwp9}owOu3 zC4TQe;R;6S<`$3UFE5Jx!XYnuh{>vTW2gDbn%I`iiPzMcbLQ{$*>95vXE#Dx%2pm_ zp@>e#y%8Tm2MvuU0-4>I_&RgeV(x~X!mZNgf5ADoOQfH~$G~Jok(PmC4GK495BMv& zP0u2yNU)9&U-Q2vEfaJ`GmI?)XG66M(d(Q8SK?)_fb9$8Y2^VyZ3d?rP8$lyW_Y+K zsvot=86ptuGxBt*iA#-(qU|W({c00v%QQ2V5Bte_1st+ z%Q)B!L$tM1F=kgv>j~83K#!bgr_NL66Em{XT$POnY<12Itr&LS)2uyCiLV_RA!I;A z4^#otDLI2+TT4Jr`#KvU3<*79Z*TG)CoLp1X9B-cyr+2+8siaCjj;)3y9C0wNqhhO z_{zWJ74ALxt2_Cv$?4jWSKiWO^@mU@sphw0pw8AYO))cdzIje=*I;{@D(mkIbO#~C zGGV@pgJihvdQ*Heo)}fPoU5{~_FB=UzY2`$%Vof^Xa(V&1LWfkN;X_H;U?AYaDf)$ z-HnS0o6anG_L;IaOB=yumKr1Zhtf7dw);=AjA4|D%96Tk`SG|=IC|7VMr78OoNSKz+Fv(H zj}Q^5sU?x-BapBFz<>Y%5iCKP0HxF+Rg)=zu3rEEJ`*1rz9dIRdAQyYwZC^C69Msm zEu@|P&}L;;8@>{YWb*9k=X9Hy`Fv8)mPLr6;Usu&2q&g)DQ&A+!RlP+{5ML$ zRU5?`XRFW-{5#pBI9VK}dioWmO(mbMLdsl#Xap*@ugnpz2mkM+)oBjms!$R>iMEGlK%=)6yQAYy6rK-67vq-M6V5Z<4BiKcpBI?& zbmEH7%##Kf!ofX_R>R3s9hVZrkHTNZvz_i%5x;g zkPWba?XPjXq77CJx*}oq#Sgw%9GL_>5F85Orb6f0oHCQq#AIrg6t2L#bS%n}^8SfK zx)8*qW%G20su=TiI=~h22K6cx&1kSG@N#Xko3v45I6$5%^cQ=nqc{@e;DCdnTj)-?J9uy34nQ$<%VodQ6{kj12JyJyN_R112I+gi#_7P} z?o@8@-K;GkAD9%^`yk`-8WPJfIn>Khrgwn?_OLUoq+?jDteVH z?!{SWHiDMkL&0z1_QdU^B0on_K$y~rtjys``PpS{VKrD$2h`;G)rKxPVOf{?Nhj=W zG%HN$jzc~fP0tVR1T9%!TN1XF$Zuu#&DtT72?KV%^V0h!R%tQN#m?eTYi}G60N*Cm zAZ^I05N_v2uo$mUxP7@D5W-XeG%JbB-B=YH6NzZ5E`zlk9`)i>I@e&$yNXWm7CxyP^5JG2CC2Pl2cKHyK?{I^>DkYnKk zw6dn=xJG|7C}3_~hE0(I4XDYE)k&u=voQ_ZW|B^Psw$esVBGZ`*Ey3q3+*iTpOu#;)&SZG6z#(MdjAecDl+d(1nMVbz*TMXJv1ndK=4(4*Ia^} zs)jNd&~#GOw`MayfOa9{CYr(CnhAN+6NgtlychbhV3FTJ7^)8ywPez1kypWoi9=kv zW~35TKeou+j#=^xX-wn3E}^cP>$kd8DqqXy9z9o#st@dn0K@VQX4;dj=YSWPy)xlO z(gUK(zY7F(*@`wcvg*yS?xHE79?Jr}6gPNJcZzt&r{5PJYa1DhGP$@vb8<#>_DLsM zZnbwbUDA|WmAJ)?$;|m4{AuVpMtTH1`sbK6wyTDFC-94lBKDgX_jMt# z;4uV8@r=z%=)`z(obPLs@H%^SY5l3I+*-mVdpTyMqvQQYT7_MY)w$DLBuGlQQb7l_ zA;-c{H@jN*VCKGgTCMj*x3LfG-gu#CLz=rC5a;C41^eq?^n zecxH`r{H-E`|N`}zT>}dM4wo`XEgJ}%WjT=Px3P_)rYZWhDrGZE)Q}l?s!FNX!c`r zzCnJxTrT&x33PPJm0@DJ}_uPSSbhh z%7b3VQt}MIJvlqeU+J}VS`gI?L%QT zJt)jd*;`=o@EiPP_T7#5DSeXbAkCXkc!U-9ac>=>_2w8r_7Rh98+0q+9dQ>npN8bh zlDZM0EI^e@U7MWwsIP>aM6zbX4v!j6+Gw&T)}6}yA|s_G%DSVLbM-{w&N)i#r!(r zZcFKvoyq;!l>4e^fXSHm5Pnsb)K!Y8J+1AkpFOQUwg$^S^Q6N`Q8jDCRM=<*;ZnlA?yu>kH#;+?90;LqILu7feh_cel5?nF2 zklNxKuFkTU!^4XOb^?;)00sqy35OVEZS&qV6vILnVkoqylM6nfS<%`hGXt$JNLE0$ zz%Vafl8t=#A&&Bvy%J#DoDH>(dODlDZl|A+m{s2l<){26=tZ`H>wx1H9uYi>t!6(n zZh>fMpLZ6wp?_j3bt5uR^*5Y1&97f9ZTi$c%(;ct&rX8@WZ2UUw<@bOlP48#*8Qcc zuU{Wi;H>DGpVpm@1)I``-{93BID#)i7jpHSh&Oo#c@C5kaBZZ$vn%0EDxU#s|BOnr zUT_k-u&5I%$*(XI_Cczi#kZKQ>bi%;rvTw0XZK{Qv;4F$Sg_wGn}5b^{`QW;_XleY z60fM6SBH5H>Uo&YKkEw>?Y}`gSV@a-FT3VLVxJpWY@{yK;L=4AHsO|R8jIOaI?S#9 zHpVU{@pNj9;#c6JsuvT_sp#1MqDfw^F-R`vL419VoZEvQJJW~mn>=JgCt20$J;|N$ zskk`{Kv`=)-;m|oAs&nQPn@!3WDvM#H$Q7izM**jVs_hPY za0BO7-?4;*sGq~HAy|&Kl}6%QHu|XnDTNbZz%HOl)stedy?+N*UBSOE>O z-70I9&Ac?woVLR6iY!vzk6+(U?6nq*SBBJ_g1y12PEn;@byn3i%!G#cqjk><28(wK zx#;27y&-c<80ZXIay4~F4l3)Tvu$qJ$nK%97W#q=u>ZSJYEO$rNCm(H!mVpsNZBDb zIeLE-&L4m?#GQj8>Pc)vVCZq0QmNQLh!F3R$VR(PgtgpUiJz)}gk7@#2XPoNx4}Tv z0&|ti-aK}50fylLw#RU<_%VAQh!9*x{E@GKi~j6QVg&{o4lE=QKP}_>MnbP_#EAGi zhhBY$crO>vT>R2 z-_f~Bo@d!0x1{lM9t`4@c##;wBZ?D(hz;VOLRDNw6G?|ZTCZWGUM>)m*bK4oF_NrjqT*H^4vk7kgaGW2N5tl2q|F#OD zis*l_xG6Ejqgvmk>6#kyMhk<912-HUjUjxYMlWFvGXdPyGVBMMlG)f#h7PeXAh;B8 zix#L6|G^BBg3&Q4%XxRSq=KnWuktgO7QYfUB;Kvspg5qeZ|8YRog+Vjw zXK1Fk6CszLXG6zsV<{*`$>TgO``q6B?J>IipEaE@dq=Ksoxo+cVfT1kv)m7Xy*#|s z7F{Vv2hos|$PO!MQ7;-Hgw>EH!LSUkaA&vx{R!wTdBW6JWU|V6M}H{)7dq?6FlER* z&UlWtBT}7%`g^kuKs?fiT9dS@{XAOm?$TA&*Mf`#buUBdYeXeSQ!IDrSQ?}d3(6Hp;jI7^!`Ha=aH9#Lin4hM%TSVe0*72 zGFMAoGxd;+eQMLtyO5-KFwqIZ_)dB6mLkowuK6u7d@Eejhv2pAd_-_s`(!tV(?$Vc z8}g{fU0JKxUuHSOsbM_nz{J<$R<>BG+UcF$`Eg2VO+Iq0*)Pnz4w2x&80Xr4$zzu8 zYmOjJNsgt*Z}(7kO)#U8ar0AU%qh-ycm8BZ$dfO|0oFEbOT>1LB<-_lNMwFQ%^e{8 z4GE61j|ZUeq?wpVsJ;@ZoNmoJIfPTzU^IA6ReMtyVt^*S=6^c$9UiG8awSu<{@vc{ z7~@aLj%%wNSXmqgtVB+$78*;pvl9QJFb#$tJNva|+4TpMG$uuz-(N@hp1mnQRWIkL zch(P> zpx9l2FJ-gxMJhptj#{6$2gtY6IcstL28Argyk;{uWnUJb@bK2+qXfs~MtAS`m3oJ4 zweJ;3A+*7WWKT3D9Cmm5w!AAjOg?nXuG^9au0R|U58jR@dDuhkWpJlF=+DOKEjH)y zY7_3_24T*!aB}x*sZ$)S7Ld5q^?gs%*|++gj<`5YLTKFbq9qm0Lc2ld@?zA009g{)fDw z9L6$gopo+M{j);ohVJmrC$r6+P~jqDq`>x0d#-g z7+8pg6}kBsa(b-%edwif6|(817gQvf*^#)}BM8xo%r0XUo;3-t3k7m~vrcV@iL3L2 z!hd_Xm3#fUdRrVBV4f!dH~dYHIa7H=E4bJDn@t1lJ6YmdpyyE21$vd9EQgJ7Bw2v? zXwm8nh(k#`e%BQ5Hpg*5?@pWw)sUl5o2&UvJb>D9oDdT1g|w zc~eBInY529%|AA{nohi@vB z8}MTUIr>-n<(x#cM!3ND=6NMS0lFNHc#$Om(dt$Z8&{(HQ+GN`ihTp*1T<$v;Cek~~uCvtQ__XsPwUo^}5(~o!6$%3M0|T5TDNf=7>xt>3aKO{SPnAIx7;aJq zLi7NDNyu2w&;Y6c!dV1ykn&RboC2!Mq1h>NQ6NU3&CY^#Zy7TqAyoV?LnH zpZ|haRhw-*ZL@#-ru-zlAPE3qH~;_#c_E%4GD;Db{{jaRGSr3gmG($h>t0@44Mo_9 z?J_{j0VmKs)TX!eMjok{OD)3zyIG`_9*D`+SWlOWKFE@^;rh}Mhz##<95~~3#)KNr zi;nE=*`nW8)QQ>4q{OtKcA0DzrV|>>YKE>jT!_bB8d9-Ij*)(qJV*UZMr6J(7FuwW z++i?D4zYOk$wJdFr7{EAZUFILXbhjyKbXgyNxef*4h2{}hzS8@S_}i%+Y6!f5Sr(h zmqBK1;gc!^K(&mnQmOBmCbEzPcsHF|AlPRY(q-kHe+EsoW09my=lN<|3Zq&LBFo;4 z8Vi!RrUkqknHFy%3dSz_WH+3%F)?`?a4xZ9yR|fokk=E(=(+-}v^XOpzxHC9v~2Cp zfQt58r*P9h3|AVAAc|2g)-zgSKZGt<(UQ~n>x0wNem(22r9M_KMe4>0C3>?P?4|tN z^$`~@Yb`usp6i74Pqh9($r_2_p?MG41h-mFs)XC#u6?Utkc4qCIPV6rirrQ#_R~m( z*n9wYK#0FOyAP~zLB|Dbdtbrosk3f8yvVg3TJ6=hT||K~23s-sm+Q*cBaDtBI=?YY zIXM}kzDZq=!J?;ozrv*FPxlAMgBs{`-w33IrM)cPv{MxU^ZbZD^-)01ElWPi9!Su-&Lvd$V|FG_|+OuHuNViRu0@O*kr|ABi$NZ9A&GqND4k1m!B-s2LfRwl3Ax zM#^OZm4(OLJ@od1`Vy#YQB`;{P>9;?dDt5N&IRAeF zOde*>Iu0HiBWFT9GZ=ZzVAaWF&Dw>gltuwsC=TEWjQHy?wo|gIPPZxQzGCfN`2P`o zpH&T(+PL$#=_~Imh!T1;$2b_{Z(K-eLr*xc?L8R%HK9GRwVfDbOV&f)60F(!6(mBo zrG5y1=GuiEx+lA}cxX4E*<{a;kQ_V+VE3v2W%>Q$Or9FJ`QGgR5JiHqZ3>()1rC4f z*y6~inwdj5wYUf&2&(Z~NOg!a;-9R!{EKvKBH$P+fbcR(&*F=3ZVVn_Q+YMX0b)3l ztXrEIC&G$;2%ChT6O+d8VulCLW$p*-O3@Ch+*$zo$H zRHK;GxMRP1S5yM0@}zSL>&Zq?WeX*E8|T%NS?N>CAyA7$B#TuZOPIfn7JpxY+3o7b zqKT_URCsj~$Qhr_QHeG$Unxf<2~Ud?MQhB0Do<4(Or>wP!NwIcn%=kAT32p385mb|I6JIe8nY%DnW9 z0zA51a?D-!Tco&Le(P(1|c-U-r@F0mt0yGhAKzo|jV%^K;%WQmXBZ?RBY>n9- z0LNpTqy#cZ4SLZGVsr34xBA%f6KY3@xI@!`OPrZy)6K=nw0K?kw=jR|KQb>I;jxZx z0XO3u&a6FqjdbM|bw|3BL_ra2_oMwivI3PGek86^zDrj^>RIPC$N)L?=GQr&x+lJP zsDNyt(lK9B&7wP$|EgtQcNZWh!7B5a_{aV-^ApcaDBn%tRn$`$*c34X?oq4~$?u?r zF)R*1&mTq6MD187+*_}p)yUaSnZNX}K-}E&vX4Mpbf$i&b@j{VKUE!yux%P zv8rfyPM2q{*nWH-uI{Ow-7dh|vIcoKS8MupnySXt`?CEOx;!%sNTGLV>ZY|b&`ABD zBChFQ82thA%LgoY0TVG@TU{xvrDUh8z^8Jg%#FfQKM?rKo{S?K|2`Ia>ey^WrsGN7 z2nU2=ionParr!S5+4+c{{c4PM!?6F9c@(fr2Y zF_tx`*!_S^$t7&3p`||105u^Y8r4-27==3m)m}lEyrD}_5h9cvbJrZd{rU0zj&-B( zmd0FyOCdQE3zpvV!e*?q5e;4pM9Lwvf!)&$&;cwAj_%Od!$RCe;GT*KDP`PTuW|ws zA}3kJ+6p0c$v_k*YtV-$E#O3w)Nu1qYI9?T(!8~H8k9*k75Ez&;aEhu6at2FK(UO-wcHc$h2=8aBCIGmDueLy|7+VI}EaOn7F6p|s zJ$3|?Y%8(K8<`H9tV1z`(OPi@!82M*GbAK_k6a2Zop}izG)s3nHehE|>ORlaed@Vz zh||3xigQ81kAulM6oOAF0;>$;zf+a|9tZKiVXJ-S4$0URfR}~xPlwId1g)!L1q1-z zk#GwyKR%>ZP)}t%qm1T(N}9QZ^T5hiby-ec+L=)KGTaAbMk?mMCWt+2PSRa5FTx=w z{X{lntK_Iu`2Ix2ae+kK<-s_L0cI{0mqY6T&r-*FgQ+e^V#p!$nP7p)IRU8=zPE;OAyV>8H;Vy?^y#Fy&0r92 zj_M{2oAs}}YSGu!!d(`d2%KmD0WrBU&Mv7g-o0E|3o~Ovhg$bZTfLBu9}2U3&Ov#r@@lG(B$N#qb}%C zBn)(mc0eNy#NaE1grxzX@H6@H$kOCBli*UbA}_cBy`bD;_pdMeVT z?#%1z&&ll5h5$}+7@ne+9&6=4D;B_Bhf-l9_rqZkq5Y82zUbf>5UbQbm1o&wR}35f zkRkC!m>g&wi0#ut)gV#BN3Xv<;D?B}UFb-G9;Izwu0@>2<3&Gu&yk#f*{<_Q#BX2r z6Ni4u_1E-_ZSQV}T(mcU3GFsa3*07}TWMazB1NR%M`4Y$6?(e1x@^mEHgN!E`M70B z?dnTSFyAyVL5ts63%L_Ht!tJ5ZjDj`R`x(F%o^Y3p+FM(jUxVfJ-cYhp73LEC~bx= z#A(y@L!f#{&tR*kCH|%XiT{6b>{&_y$obhKM(ZSad8R(v9O5nj)A92?BP;LG0vx2T5&%ej6km#3UPeIIvlCb@c@gu5vsk6)UL@ zWH=X&G(*8bp=Sv75$89o(|ciWy^50leYKQqZ#4RaGKC@BdUAC-Jb67Xh9F-1Qsh>u z6c2!H)f#_llf&}Y;q5*MB8u+a`S-bX$)o@)L;X}7@f+7q&&uUqV$+TbABLL@$jSdb6aoOuYjumY0yoeQH z6g{{j0%|+Sn}q5I#9iGuYPnKn@t;J${$L_grKETbns_b|M{k_!FD}<%;W=G(V<_ZV zpj9X*B$@xhxQCnFaDY^_0}r5Y=7a!pmlT0k*3SZ8Tr#BjcUxEcm(3rq7Ezy6JuU~j zU)^U19YBiCeb=e$R*2r+*!B}(X^X$xvmX4uu9idsB_WK$H+(vtn>aeC703hHY8r5ZyoP`0APYjGUNrfq&)NdvF)(pja>+) zRb&AftY0<4juA0>Wt~w=e$V?que+_cD8t`12IHPtX z6k`|xOJUXd!W~6=i;@aMpr|U0(-I&nC{!jeiji720m&(Z3V;m}n1vIdO`vLsvAZ1D z3{uLG1uG9vgT}6YO>%Rd-tNm^J$f6ys=AfUwn#&Pph>>08r%l@bjs=S@UEfU+~e+O z*9I9Al}y+P*h9>Xj+0?(kTXS~_8O$_6tvnX9p8ZSVh@6*$Q{q&q{O|0HIF0H6#w000vv zL7GA()FD+w%3v#({{R4VZ;yDq`Bh<~%4EDQ#m^^ooyKVB&15kd%s*=rXc@y@>x;YZ zFNIXxvu(lNBLz4f+V?A#<9EK+FwSn>l~9WVt7I>xIe`K2Mr%G;-T532Xe~ecud&Dl zP!s19KgDB0x_!gp%tcRu^YymUxs-RNN=Ld!M>iGl=1?c1T$?jVmVak%0n%}S7~g80 z@BglPZbLbY!-J-r(O+i15u>FZD*Tm~vwHa5KWUbb!ouxbpL>rhK-lCIL#B%k1vO{= z8S-jCAd=Eg(>IL@T?6kbIQy;jSML?>JN7WaxbbzC@q{J$B`yQYqJpKl!Aq;jWHV|W5QFc7UgBF;Lm$WgBFKCI6$ZT1Te zDI^lI0hLs)<&%Z*g6n-VFdDY&o6ZzLqOIZgDbRtHsk@u$L>yJXOLOYC94a5tfVJYN zR%}o^hkK~wto4QNl>1K=D#v>AU+-{-_fQPy1$2=E-#0?(NIs{X4=kYdW0#CYK4o?+ zF`W0F!fx!IfqEC|6;dS6IG_;69_K4B)KLu+OCIYkKkK_byR-Ez+2TDTu$%yiiBNYq$-TS5+b zJc&G)f~uh(78qS(DuU0xT9rmm$ap*1NME53U)(+K6|uYaR;% zhE*CT#%fWHXbL8SP{MVFuEjm!2hMoXydF_Mx=rB$FQS4F1ulwn!efY0%MKi7q86ia zRC6nv5CM(DpT95j#!z8(l_JU0#=NYUdZs~bZau-@aXJ|QplIy17!ZshT?@>Jz+w+Q zgm++-{Npo74dB#0k_Yjc=|)(hUj8s%6qxw%3ACjvt4e_!bpeGA}ulVwpp; zt8~TM>lfKHSI+;Nt_#(FguAj#+B0MG@PgIQ-D*}~vG)T#Lx=E6W|T|PqwGBSgJjgy z4u+TE4R@}f%5dd2?LJCRu_gM0t~gCq1R`yE{~92Bz-6>UI?u97%mZfdhF6X0v>K}w zPhNI8t@SLsj^!r^f`}Hu3#lyEQU-m`kAaaQ4Iu!uXdF@l`iyXLO&4cKQQ$$*Btg|4hphEwRLpV;{)|FtC8a3JxKFy6s>s=;109XXEa3>W>h1#g(czq; zUp5=}8VS1epbFs;g>!(Sb>b(jp$$aZ`nH)M9SV9M_%gu$^gTD+dE`w*QK$n$qE?}5 z)H$Pr=lOY%JxAd}Q!jvC)1q0}Lj)glTnD1E1bqg}LQRvQAX>S&Tb-KURC@I{;j5_f z{o@;PaQlqO86W!>Ug-&C#1a?&o}9*{E@{d@DUdn99kk1h-iwBLM)D9rh5 zjO%$Utx4O>L8eLwW>==Nrygtg#i5589xF^)ja~a9c;2VxNg9tZBPsy0n{M@G zM=cPKTl|AVEop8f3@B5M9PzTr^TB7DkU7GWY4piq78-eOqSC9PHQ!L>yk4o!Rf}${ zrxgicxv#7w5Pym{t=q+bQcMvESxjJQbFVuZByy4s_GDkxu>z$#XTfU20CJ;E8Xxs` zQZ3#S@29{}SA@%>CaM9!8IzeD8JYI~4YRe)PyPX)q`Qx}0U3NuecMulUKEx!1j&WB z+pv#kfYDmA4d5}G%oyiPb-EDQ23N@b-8yZ(b#hp7Bfra)&{%Ku`EMK1fveg7TXE6e!NR zXk5LBTXN75!Z;-2_ayPK{~@ZTiI^%XF+{$s=Wzz=EW3xZzr}U^3kDa-M#4J}RcOSB zAV^MRgJ1Vh1)_^5jDD~Ty1O@jv_Z3$QOH%9F!Xr2Q_#b%&eT5$RGVxo5b5wNSMz@~ zd%%s?MqQC44^n5I`=Z&Mit)auo)~z`Mfg_niNyD~$_a&qQa(m86<|hMIN4yK0~uw@ z1fxvMc<}N6JOE(ZNv!2w+o(N|S~;)#O-s`r1EJg>uL`Ya6bzg!(J8q;(=pn^Iss6| zy*=kQ_LG*XFa@bLE#Kx3QG0e49y9-7tc9|K7yixquHNSyrk=@%I`{%jibNnRi} z!N^lEsl$kXdbg{ym34gE*l*TjVz51P7_bfcG_F`-1in|D8p&XAe#}}LKm<|Sga!hhw9zUPE7{er^+NoEvga9Pv+&03L8U z%G~Ft+(#HRkRx~wEfmK4Qv{3UO8z@F`sdy+CVh3o-oE(!kRg5FAFbC0!!oBcSjzjoRyp!}AV>w=A+P@%D=7xGf7&NA;Cg&5HQR z(o)IF4YLX99K^hhTFxaA2n(JlR?NNFHKB@Gs4=MXdXoo;Ux=bFJ1%k~T<1 zO!?NJKoAmmR?<@h{o~fh`&hA?w5H9^5MH?b(uu*~xG+$2-E~IuJ9fd>-EC!g&q}3; zh&~#TP0N+gcf|`8bndi?lndXOzty~?Bq1YRnPz-C{uuk2DJBf_i|L5g$m|G679TFq zArTHJc2az^UzO*Wm`*+}X2(#MLwb!eL{%j)0$a1)>8+K&Gzs7oWy0=@2O4*>vb+*? zq@L(pEdr5=0O99VwqR5{(GJSSHa1EZ*#vvvUac7>2AC@Fay)+IMz3C-L70-RN<25p zs;Kkg^h7|*B!&&hl=Ri5l$7m7npp@gYLiV(q+p4YU3vq=wkuJe1TwvbdX zDhJF()@D~t6W1dDgdua<5`U5gOI1G#;6Ox<2#OghnQ~OD9$v`C&N6norbaJ?HTe(9$*a<(^k!0sG%-#5B@qh<(pZCfZwy)F< zopovj2#&dp%@w-kG2O$q4i{02W=QU#!tymeK#%PdQR&W%$6~A^lMeSA{|yFH z934ev+#W8LMk;D_xlliUCD_u#^;$g^i#;Wldc%N%L1kx#KTd0Bd2(8<^{Lbd<^VBK z$j2-%l!Vjl4Z%qiBV7=K3spF)a4+^SOpla7u8<5BTe;CGD71Ucz)!b}XCU)gn4yV5tyML@J1@Mj3l z{TY4v?*bEvrqpKB%$-p1*1Ls=$5QQ4I~Jf37{W=@88}DY4i=u(*)&W!n57Byg0F#O z>hS|r(AE$Q66qhAgGoP`nWkNr1K4PX=>N|+;ln;@_kOmVE%1*&eGTOq#i<3XgKKP7 zjJud_;vDG}Y`}zmPnMl%UhldGmDlxvd%by6) zO`6JIQfT1WmOt?S-M(YKi88tO>;!=U^^9NOhdnY)+NER0!P4qO^4a26^-O{in{L*C z3-IicN9Op@o|#viKL1N z*#CM7LMZYlS{&+`3D9Aw*O)jJ- z>+4)>0Q(gqP7|atWBPxdLMxN#D9xwm3dLZ7GK*M|>%0sIl5tkh-NwvVP0x>idL*x3gFNx2cF7tSD+)4zS7xWn=tq^)71JJC+LPkbKh? zB8T)pn2@6}dX%(QqxyupIGKX3vncwW?|DV8#iCiV0tp)FK|&yM${?cXbRhCRo$Hrf z$3WadsUV8|2?O&eyhg1LHJd(J@AsWaxY-d9lxRJ?-?}6tFRZpF1_{Awc{aJAIEFTEq>UF-N8IA_4-B>(DM2E-*ndZm zG<6L94ncc9fU?(*6bRt)hTB`!E#Q?dl}%a1(F-jsNInHCreh%7V9mPBSB5Yv$6;=a z+ce!&DW)GA>Wj#^6W5r96-Ue)%^*M`><2kIAy>3S#`qrlartEVrl>4PVj*ckvj;byT5qUA#A_|}a`j7k)?-7w4`P|gw~ zI9l|G3Nut*bP|?fASzp;%q&Ax0GNQmF?bjYmkMwV5tN4_i~wl2Iw%0-BEm3byB(R1 z@0YTSt`p?g{i9sh)r7fY#pcc)2IIOQH@+e8fU+#cNb-pMBb|rF{7)xV7E``qJ7ATW z=Ye#|NfMV+@cn!VHh?7wrA2;!w?4tV7gdig-Uya}&Q9ypq@W`1CN7yMT&^5c#G4dA z0lYIrvC|*AiW%KT9WZ=RRTqEzxdlR*8$b#G!+-z)2lFAGVX{gSm;V9?KkR*Tv!gF_ z650^g<6~G zEd57W)nAqsI<@G3hL#CoYC*o5s&Ug~5o2)2N&$o-!O~`!2V0l~r&&;tF5ip2X8`lC zC&yH%y6=Ks9;Lv+pr1%Int;9j{RScal0Q{04U8gPCkP zuNJ<@$jM+Y^9~Ry`j6=>f;nYta8C2-B@jE5i3@y!n^l`SJo0tBhc^;gF4(@CJfS+EllV~GuD@$(?(e_Z1zmNeNCZ<{1njo81WbGKs z)80DGq23$2YXjd|I-tzVJkJ+P0xL|=2)XvuH#-5N*( zFVl*UQLajrtNl)p{Z9EX?;oGW#TM|Mu&>Z&AH0l!Mz_gEWy=L-88IN<*?wVJQ8NCv zRw=Lj3Eh=XG@^2X?gi#iWN8X5=N8zuzkzp{BW*{mAH4J5_b$G_%F?A1lQM)1uy2h_ z3duj@7&f%@M;NC0qa{(O!Hffq=8fkFB~yM7S{V}B-63uJ;z2}3Yz6i?XzKm8 z+w;jdSrA5b?u>-Z4wj%SeCs0gLhYL<4a(d+&&)r!HNh5h(k^@8PYLZr8{hG9Nq^mT zmzF_T-Omxdl%$F&@rVD@iLTU8-LT{RQ?!oPA1)H9 zwJ~@cUPx?r;`xP;=^*eBbhGp+5Mi?n;lM^lR$F<)R@gw-s+ww@qJfjJeILyxZ|W-O zFin82$3d&j)H>p8ec6SfI|POGP+}EOD5Z#^UMr_-vSmu{&;NQ|com5G-c~CA-O7(^ zM6JhMnH*xr0E{;o0zU^v3+|R>DY1w!o z#+H_6)2;k$V&=<(lYqebK5hKaA`tRDdV!pbEY4P>fFpkZi;UMttgSBDVYef}2_!{j zP0ZJMBtuAo(=*7BAZ|>8T{Yf}LTg7Q(hiR?squLYJYRCR^PS8K0X+C`%A)TEzj)sL zQN3>@Opyn#5i;78n}57#kM4Iqny~HMqKQf*DbQHDW*;K}*9%x+3mlKPK%l}q+G8hH{~qL`nT`a4sv+dp@0fHimfjhWwI$BjP2HEiE<3?-IW8hs4Auck248AQ}9bd zgPh5Eq;cbbm*C)aN%Q~nNlA)Yg=tTVy>$EZ(thhmrP8sP`b3XZsI@^yXEHG>Q~UAB zb8s8jKWX7_RaiCdALpcdIm--EXE1*5;#m37Yc`^#YQXC zsKXYA+*@FCR^N_b60=U zI^?o#qw5=LQL05N{~iLM@u00$p*oJDBF>n#9qy)LOrMuNgAuaOZY5%fqp#(YNX6tS zo&C(lg|83-<;fFy;E8Y3R@Al-qJb?jtWfkcV^me-k10=6g*QOvXQqCT#jAeh?d}gT z3vCblJ$fYz#>Y=`Bfz-w)wVW~Tq)BK-=k=VGt@UrEHkq=;-oneN47J99|Yxf08n7k z%7yDQQXl=|Ep9U?z%jp9E1%h+2vKl#+ypolduGPs5G~VY`s2t zw;=Ol{VPFI!LLc+biHFUfT5Fyzyx!GhWAzG)_7OeJ)D)0U;EN9yfqmgADu0p7fGiZ zWN{9wz_hrW3Ih$yOTuML-+p6-dz(-<+0zZ=;^l%m_{)*Dn zDi;4&*$edEO_NIHn~KdcEtzCJiU<|0k)S4n2@!E2LlT=Pmmb?B>Gtl8lvgAk+hR2* zz8RCGMIc8&DZ@w+tJm^1{tD47MQfC&6IB}x^j&LsN2y&*&82~481o>&$k8XZ2~zKY z;kO{7`xMF~3aY1eJN8=?er}&zfv=>g_=~g{NXvK^I|~^(Fc*LY3?UlTU6qnO2wQ+< zo8Jc6(TEoS4+HZzY!Vxn7~*So9wtTF4=4oawlkVU6@v~Aul4L-N;QbcjVW42g@S0p zgzM$I7&DmYa<3%GL}z zTXw?;>?M|Km2VH4MJVnsa8g>fih&DAvJpkWAXH2>LIIQn`P51XAVjq&)R<6r+! z1Vu2IApq1-PXwSVC#BgRVA@j2k<`ufTn><6*l-O*0SJsF6|{LHqYbggP*OmhpwV79 zyG5N#556l=FJUwUHp%wQM02%c*9vjN*qA8pZ+>Y~ETH03$*!s7J2DzOLrGp%wIZ+S z(Y%H&&yp-bB;3bkiZ`7XGR@S{T!cTRqTSLqv2482pFi-9dd=ctReS*h!!*RW9pJT{ z;df$2%B)Z^q9uDdEmQ3EgZ_cpGU>~ePrl>{OQ79TOVR^ZmgW#KEMde1#wxTEZP9VL+Jb{QU7WaPgKcMYfwja)M*UI?SRJPfAeL5+(^(o6Czx%=U?G zDVZ2~6%kRj2M3YY zX$XX$@)Z+6=Z8R_wg#nb8=a;K1mqy%w2((R^=oXxVz`?5RlGLud-*$fl+%~;KoA8#r@nz}G% zt807Aeu}CFNB}H_k6mM4M2b9POjR~@F3DVD2y_Dn+v@{gfIO0sf~~@r-;&vHwl*}3 z4}7VuF@E+8?jCe29vBDTdleVNUhNUkJNYR}KJ}4tJG0uGAvLw7AnN0apx3rT$Z!V7 zqI?+g5;K4faboEewK}nKW7^wV6aD6$AG4sgR<0v-$OJTOp5Hv48t*cG5!O4~vkMrX zmm3~@zazNzVR}uXo*$-J6OD=wRH)fEFzDdtgyV8s)eBMk)+W60zUApuM;Km)c&-3H zeRb8LMqxkDE{!J(xU`p@hKRV4`jfB7-PVuw+AZ53OU}n&MO@26L37R~$gPo?UME-E z!>WOGWs1e(%fYILiwZ!>kr4Y@6n`F`y(@h|B@FLdHyWaAr~^RjRgH5weqQC^TCSXA z2<{?=A?N@F&f*!KJ!!f!cdKnGlIr`BN-}|w66&%8ukOj`T*NM%z7U9aTV**t$Y&Ux zW+dvHFI_(W(q!J68lhC)CfXsw7KxhO;pE?=%0$4$fgu{zT^*1lL5vKctst>V12NX{ zgqIYckMQI=whi%ID;4QjFKfn$m5!IsgwZJ6fwFkW4U(odPoT-p^AgZ0ewd0vN-uec z$j?_+Kp@KkcYT=)(;$cqDqWg%136T$-nj7a)6E6DIxl({GZMCZHH_^tQHWaL8w$Ij zVIXG;dlVs%IcNcPY*ZN)N()P4KmuDNORKQt`eLmic9_Q>F-hJ+jx`Q}N^MkWZ@h&o zf^rIks+1?kf5XRXDe9D~-|UH8@ZVd(WwjNI>Y{-e7PYXEmx41?21E(|n5BIRr!YH% z0-)uGY;rwSPYb9^O+; zwn_LkiAbh)xYHf)a+opQb_bJ>M@$lFDoXsEul4ZpmIuuLDKg82Z^ZSbVE%g1e-Q6{ z7Zv_#12H`z*s58)t<+0B&6nU3$}Vs8&yPnSrJ+IJN?Ufy1GsvUW>nBby_B^m)W5YT z^G@w&dO}w3`)AEMUA*wV^z-l?liUpsvjll>auMd#m*@z5t_#?&r_&M_*yT+_j3W{*cwzuduT z6qY+dV4?0to-AVI=AS_CtV8#DS>-f6-6h4vY0{9ER~JE317%G`iQkgvYP*T@VaUj; z*1q?gswq&UuN!jmz7oBKYj=@C2Fs!hBDsbz@k?8EQ_-Q5_0_EZ;w?$3p%mE1=I3Kf zm@SELeUQG1J`5O3tKq;wn%Igxm%|G}QrF}1ra~ls3_~!506q)RD8TpL{_qxy+~FrU zm{1hu_S?%l#i<$2%)KGgTsnoe*wI5IW;nM!gb1z?x6>NuZn*50=ZtL9l_Ab^HaG}zpf6l* zq02`}BFfa*W4`%=L1PoX!1F)FQ47Vy;LRVbs17?uV1+>oM}HGqpc+elMmmZ3CBzj- z6U>?_q7E%E|B3i%*MYPZ5gu%uGkGj6;#}x$(Kn_JpB@3loEKiRzf@7QCayMT?2j(g!dywxG-0&dX~M z)vkK6Hg+wJ|LM^eUr6W*P!kC7Dn6&twJMax$WZn5A_O`?1Ak$OJFdv&=suHcupV5* zCe<+n5uG~v%p?}2R&It2v+0C;gbkVX18ZX&^3>@T=NtZHHl6M$%M9klT4c5H{E8}p zm9TmVe7g}2_QsuUK!htrAmU;kvmVdWPkx-h>0(B#zKQZ1>9N@Z6NXr7G@{NFW{Tk^ zECxZ{Lu;`*GYuZ${g&7S^KJ(pq&+6Z*FN!GGpmoi)UTG#_E`Y=M#`dj$cTq7wEY~b z@#Kf#ud_BoV-3gsO9+_98>Mx8{+mUdP11e-l8GhmM-^t!3_;`n;X7V?;2!Jf$J`2! z8(2k6%BEA7TnCp~1{(jWH4XMSStXKHmHD(-{(OLr@~&URZM<(eS?@T<&%7d9y4`EW zH1?Vy;QW>n5O=a6PNs#H#5Y08%`Qlcp5^+Tu(f%(BZsVkLsT+MF+Dk-q008&lPP}j zhl%SrBI@XJMdN%1u+7r1*&)vJkL(gI-%Z-OhX3TL&U#uz7V5@O(W{7?D=TP5&ZgD3yma#LsW?VCBCL%1W;J)1WPcbY2vVZ&y#NBSA`=q)D-h+Y3gQs$J zO&ZU`rsp3m`HO}V@cK{Csw^9?ff5wJc=2`(r3CCCFBs^au{ENt0nK_4 zVOvdFvT}>RhT@t18wRTD2PuSvpU14}m+gukWnnybQlkD@u{kvr2A zq2+Yn-USB>={#RZZK2Xe!y*hoD%HlmlWbNrtJ@17*w?`mx5)#JLtlM zi*{gexX3pG8zX)uSwna1b`h7RD$9GcaCm2gh|kZvK%FB!dBfVF4^Uh(yy2#Vp9*dn zuR!9-iEBb9Q*QX{CQiyN^(|?qBsy}rqkfjS{G)H69Dzusep!ejk?IZJ&M|8PW0H(F2l zDpa9wTVscsdH5@di_&*;wP_gCnfRl20LHRz)9XSe%~+p}>&q_(47hWacDa6C7~@X% zjjH%dJ*@Ive91i(>`%fv8bscaRV=068;zQ8wC0 zzFC^ZsN6`rq=|g!>QXa`UNr?@WESe6vnEg*8zdfoM(IEpVOFWqXw(~4r~FHKTd4JC z!eb^fFXa$iL$i||0DUv2Sx9hWzBE|KfDWaU)UW7v&&fZa-60e6NbFDBD9UH(rd8Qr zIu))G_}Ql}m=r4mELa=zrFtln)Ye^3QZWzTlXctvz~lRF%%K=DJOgVl$ti6Dk%o%G zk#K+Ro*fAYwH05jj-~m2mlW!1t&9TYoVa4@@1X#wV6jDD62jk>Fb9-{N;sPH@1Sq1 z&31KQMFocmAma}OlDUZMH!dMLW(tq**)qCFC}j;~hZSYGXO|{(ea#YguWHgUrvo~i zo`qT&v$rH+a(?0VsL4kxn{qooNi2CV4+F+dQZ}I<`wCcDQHJoViuwc`lgzzIq-U$(sWZhyMBFj{ z6{sP@2}=6P4@ccEuZTuI8NFE5^&R|`fBSlaNrbUnI{s}z0h(m2$DDNmB8(klv%Rho z=esfkCJ(5I=rqYnb5r14_A0U)(i6g{5}dIRMGE((Py1(Am@1d>a`AK&ldFpe6a>Dz zWi;RlM2F)bcznfYMs^zrAZwba#qsBD4v$r$d<_4{br^LFj{ zLrx|H4oOL_V6@r-zbaj-pY9*;*ZJKXL1odxl5Il86{ZqDYJ*dgC1FPty_uh2R*b_s%;Rm#1zo$8;{b#W45dpQU`i>do$EfgFM=yM?tv_W z_00&MejKe_ct7DI2uVfEd+fb2FsW0a%Cu)&?pM9hQt13py%Fh2*RoxaU$G?C{`$`W zMZ=l!9@F_`k~SgwEPOTye-^#&3v=I3dOQ?p3!!avlkjDca=z4CRXk=liOS-4he@gsn9=eTwilqJV7|TmHElILnmi68@f{ zh(5eDI;OkZeTU>^W-X!8$T8sd{Of`7Vfsv}zJ52v5`8_s3`z=cvt%F}@s>wCGlQ~X zKTL)&29HGygSyRPPcZn)wT|k9`6Rf#Bn<$4K!U$Sh|jJ1eHj2yr~In zA;aWROzf60Tx=wVgDcLQy6haQn&Aw)2udbeAc>;i(x(-c9R(&-q%v|EiX;GB9L|Ut z2@{j|vK9`hL)kbW)o!=rkNGZc+e39JeDiA3T$1s>JDSy2?w21Z3A|Uk{E_O2Nh(sb zIq|aG4VnX(Shj`}W=Ht^)X3lsJ{69z<-hW}r*Tl+BAukzaDlTXVbp0BcLiNh3P9*K zSw;6+O^7QsU^ir-WyG!)Nb56VTYG{#xdl<&)y+6>vzu=mDWt|SKhDUG2P|Oh!ZYKH zuSbz2ELAAxy2M>UAAybVO5*2z4&6aGS!zhu`oFl35JB!Cx8cu0w)FIWv7CeFg)7 zbEgv{#b&`p=}R`VdrPxPbQK9#U47ao)W$eJb`}2X`NzdJp;q9)Uxk_vs$$Qbj zS!@lG126O-_-F#!928ABcXy*N4U;DdUrs}?t6EdCS1(;e{wER-;}l-C5R#3%j?f3f z9^0ue|M*OuHqnlE_^cxe$S@v2H%ru=U^TiDHGNGBpZE*rT@HwUg9&Ba+n=BRkCZ5b z-W0^X$5^7z;)JPY>Hk(vhYMe`B6@S*G`OEh`7wz5+bihssFZj)*_uXsrN+8kqEy)| zvE_loI$8AjPib*6=vt~PqD5W_piZc#0-Kd+x7(jfdp!4k>fah8D?$C08?x80KU5p8 zp;E6M5f&A2a!Rb{7w5=JNo7ARSs?uZOC2>%} z2D{r1Bi&0J<5j$p>l4!OsI0YUQe9f!?%Q8EgoAv3$7?|$Ds-TK(^A&&J#(=C@*g$8 zYGNl?^Hz?a8pJ(LO0TqLpB^sV{Oa7jb&y!YtGCfIF@;v88y+%D!hI0S!|C>;I`+9P6E4$sFB%hf{jC!d@{C7#lYE{3GApBnL@pTAP-~`TeE= zU(6IGdeAD}lEv7S!_!&}kzx7>tVCsPzbFLi#h(MQ;IbT1!*?i)MbK37!mQ3Eh&)LU~j$iQTSjWU;7 zB22G%AzT@)z-Cw6RFXaMM+UG+>78rmBiiT&90(PxE1_8Q;)o3G=XCHakVYkRNPXX0 zk*H)2UN_gd@Hr0Z+&00$Mf-mQlvA;GvyzZZa6>)kB_~EVADEYOm}$UPa9>yoX9-V3 zmj?6^Y>r@-XQP}cVn9~vtAdd{mlNiyYde^;DPHU8WStfLYuu0#IdLzvX)UWY!f$L2 zuFSs9^gjDQnklk}Y)ye)@KD%Z_Zq#og^mq`F2ZM9oxYC~yVFR~G%8-{o*MPBA>KBng(hJO^-+MbvSvO8y-u^z$>tWo zNxnGpI01CXWeMn#3#_AY^~X5Ti67~W;=XuUorb>xB??}!@UZ42A$`=`^M_O>=_`ewaT>{oj3$Drng;KE000P4A)cc$ zN)wm=0tmRA->!P@r6+MxuVlwEbsL)m;GMr^SY}&(#xT`sRj)T-lz!&kl&%M_;2T7v zdfL=R4;xdIHUG3g#IPWNW1{zwo{FMsr*(Qdo%H(#Fx;Tfj|I}yn+PcWNwHv%;}Pnn zPZKP5rs1Gypn@D_zYfx42S@nm2UzCUwxCWTPC&gF4W5e)*Ha-%VxnGTnAKFJ%rH1W zx``#^iEs$SwEq4kC@bnO51^Ju|4|$--|5TW2RNH6zc24dVh#I;Beo*;z=XOZmw}G4 zs?`gu45xu}3Yhef#%!WE8F3s}nx((-9>s8aqxX@}QKKpKH92H>cuKcU%Z+Q)y5T4` z>-3|HqprK>-H!owd#Xz9F>*3Z5%D~2ql+}5?w&8E3feS34#a&I*{t^I(HCF zVUjO54Mw(t&7=W>7dYW1;nWeP1$@Y9IkY!(|26k#e9+EdCrqZ7ZU=C=N*f7}ktb_K z>WN&=@Dp`tHh=8+02%*jW!5naV76?Pm@^GS^fshDf|ii&4Db!#Bq@yQpz8KLr?YSNZ*DuvC15Ila{mPg5 zoZg4-2kz}-uf;uLWg+qVAurwE7*kK8GnDQBM?~6br^!lGS@xG5#MxHTlH&u%_*4O`8 z*$S}aYq2o(s|%D!!Vw12C>?$hUPa4eykzztUW{44Kd9^gSX?q`p(Hb z#6BJwSQK1EINV`I@kAw|JIc_o%!3zL=BIYZmZtx+JJMiCzKSalbZ7EzChc=tCvqIh ziIs0E*1ng#7ML_E+)%l_Kq8MdBIWRYASr*f0|;;z|k;_|~T_?LQ~A7sb!G6GaW3Ado-0Zp3nj5agk;ld!qc`i&H_zH$S(-1)-EVLRGnQNP4HM)aIEW@^HD zW599;s*>zMovw|Mhf%xVUvf>k`!5hIk?VJxFdYZ7bULL#By)A|TW)zij;cs|QgQ9s zAK*vbe{~P+{;8PXBGwkZ~p)X(M*ovfYKM;~Tt&cu>CPq5@M zZT`id1TC0WV*YXC^b_8)^WWl+Mgor;8OqXU;2JMPNmL(?0$_6Pe4t#BLM5+cU#}3` zl@wfB;qXNmVLw~NEwaC)+54&+^w$~MCjqK>CyS3dt?Tscc7~?z;n; zq`FPzd$TFBJP$8&;!ERflzk1cw*Mei3`ln0spP{4`c6_Xo%$SC4PBA?RqLIW27Ei{ zzun?ufil1gggA==++)J!Oi22FKKt0Z`hSH}zxm;EOj~syvd%PblYNE}a>H}Z;o6p*x?0zYvE z_pz(!0~-H5qiD?}F@)AWlY&V9!|3EDCZ32n2;xMrU`rG|1B+NyG9%a(Yz;$JMXt`+ zdx;rvAcda+`td5oEP|%3DX@T9&tF`Iw8kptwoXZ*u8X;mI)Rvl`a6tlMX{=-Sd*^mrp0(!N0kgW zU*m6wP+;FM8Vv@NxAWc1sA#0$+pdza2#!`8GmjuBpdbWOW_%vmVnwMu55qZGe|FsDyeNg(p#iS2wshDY3gu7%J0Tj?U5X5i zI|bfZXt1gPWfIn#kQ$a*6dojvVK(9>V#HG45V;wbu-$0xb&VJjc)*9ts}t;&sk#eQ z8h0CASBtM@ArfhCJ1(0`%EKb@9X9fcau6041!H!8DC`$1R&?No`kK=85rn01MOg7P z;5KN z6|E*=Q(<{s!q5`iJfr?tK+=X|E(yDn($%#enK&UkZUI@9?Zq z;FpaDXKD!84ga}6UKFOl&Aj|EJw}BV+OPt6&TNr_Zdnm+a2LaO%JbVT8MTiwYR`jr zqq8JV=ajhd^1Rx9%d%>^5)15>|6}n%^$%9(xd0ZR*wPWDETcEm7pPn|!2EW$uZ2L6 z4-%4Hv{2Xo9db(-H5Nq+=I39qS3y2N@us3jQq&DsU9*=Tm_%r7+{6Bk<-W6dQBvRI z?TImmc24J}`D;VmzZqpgO2x!y$l5??g-^E`m#i(jn>v+v|fj zGXT?nAGAz7h2Vk7pl)|0l<#gMlr%KHK;Oo1S9aeDo8oYXiZhdv6FSHw9BJ>5ME_Sp z7>3FF;C`XXvyR({HpT%i=I$)kgjrC&sb;ky8%`9nuydg+w!Zk5+QCuVj1>ZnByeLT zG}Xd-H_{~o(UsTj8~^R!o~f$ll&&haij=w=YhiMMoW&I`A0vSi#v5VU*^K_D7@b6X zU+4y1>y@$q^nd5^q$^i^Dc3x4g7O6Hghd*JAu~Q+OXbjpnuHKioNG<_t$2$ z4=W}@MP*bYU5sxm(VO+dv@MWD07bCdtPBz5of0{G+0IlQ1dBXZyD({8ikY33IF z#On&+7Ar({nz!VuiZp%71}8hv>(ug^ObT{ZbF}4ZS#oxL*GGRJvScBMg6{hyyf3@S z3?)p`H<}MB`;lE5Wt9NB&Jb|IZt3~^SNU&x3VzDkaB2(Shei}#m<;I3A#36_dWdg4 zZ`ugb<4;kC^8K9aZ_9(RR18r>=<8#ikzhuv8le7gzgoW5!QAs%Vi9U_`9iPz>}c_M7p70F z{4t^0=K`gn&wW7yUCeU7_QiF`BhCixw?8LZi)XY&nGQY8-X9CFr`EVi2mZNI%QVeX z35zZ?92_}wpYf)dv4NR)qQG*p*y{@)W)s%zm8Zk%HI21#3O#SMX^2^+f0lNCo>_4Z#gXiU!%n=;XGo*P@ zO!i(})7WuCQDYb*B9q%Kdcvt)zj#DjE7W4f*MeBuF z2y^&d5+GXqj98}(8J3XP^xfY%uc{)4S&jt@Uj!my;p;1*z!{wwvfJu2!-!`Ww!mK{ z0vjH~z>BW#2<6P31-nB+VS-)Bn{)KG&QU;6ttt)1*g@bjP&{xe(@mq?cnuDWV(cC@Vav=XgwmY-zzqyV9kAzDhfZvUeqst80 zoI$qf=3hT%GqLU(RFGAkn=F`=*qmU*u3P@8M(v_efT2zgW3UYalRMd?Tcp-%djjFF z$DN6%)8-c|52*kYHkF$E!?>%*ewimR(AvIQeb5_6@3k`Y9?|P|7J2Z&^#yLNbN`4r z9Ye@}8Tv3#`<^WI{M*91t^R@>xl4ScTC9+=1&Bx>54Xw4wMlZLb+s1jSgMz$Cv~Dr zDEJZhnPLJY*cm(M~v=YNpe`aSASIcjQlJA*vsyo96*d_;0 zkLutMjc*y=wA)|za9&pk&`OLJjNvtw3MYu9vLbg9xddX7c>+m<0aPiVryxWSD!ENZ zXB~paZ(^nfMGL@4A_5t|ECcWoS6sdzO7Yvn=m2%E6QcH^YFf=wcbr0DW<`9dl#xly z)J+2@(DZaC($Sfm3~G_?BUOVGFrgKA@xeWrB!LJO8k3}_7@P(Gf(s;KC{#pLaKfbE zl^qpOKlB#aTpeC_VHdNi!0`Uu-6$<%^s7`!C8`Pm;0IA-un z&>@YMzva+ug9@SBf#jRY4BfO$8(i-dKRO|A&ll^yVwD2csN7!iw4xE$vrTX;TxkuD z4fuj5XjCJ^$+hJQ0lyi4Tc=AM9F#jvz^We5RWg8;vJ;eg^F3ymqIm*5oQ))JNGIEC z1Hz3~0|C&y1A%p}LJsODFslUo|ASg3`h&}g;pAucRop83`v7yGj_UG13+*5d`vwNN zAS=aC+xH*Km8nU-eYT(STaN?)-(CbWE`L5Z8W8}?PohB!y-7+&0UpIHPQMt6Q-Xu< zU06KUqI)+)l^61Q?yQ8#GfYRP8_BC*k&-bw5swGzD@C1yu3zKZV?Su!mJHC8>QB1O#e zYB`Z$B4vKut}}T!tR1Rlh~kxj_*5rx9A37V;`79=`f4H1q5aZMWwWWKcP<-H=RHAr zw6lfN#&QsEs&>}}{neBMAwujm}`RUwf@b%h~zw4!ZXCdAB#=NK8TXe@c0*yVo z#W3s=;^ECgo%I69tL{mi0^}Q}bu|tYF7a7o9*+WU!%r4Z?3V?*{r4-?SrXi|%hkoI zD?a9;rhB?=Z^IE^REL_@Ww26r)H+0$5H0|WJU8>n`ubwby)^l&iIo_5F4EPA*a#aO ziBnVLbYjpofbK#iLN8`j`7|12c;Zi??^KM`So>Sz0-wII%ydSXd+eQ5N`iS#<&(jV zaq}$TPUj^+S-rsM^m~c@gYe`7en;807=LY~&_+Bwudufc4bmoCA`veFte9zjNpFOd z{HS`XIgkwwP2uX!aJHAr- z+7PopCMmLloWKF-T5xDS)np|>_lYEZdc8TYn1zSB1^?%oNHk#xav`pHNTG+j7|s34 z{9%<_a%u|-5{h5D2b-@u1I~KupIC4DKmfDGu00(A?M!il(h-qMpubWb;`)DV_B7SA z%NQHvCD931a6(iNTI|i}Aao{HCh6s=Yxf+zZ0+ut3)PO`3fkXgu{{I+_o69HzkymdHS^a|=f2O9G>vejM*>Jq$d=)1|vXH}F)1TkHgx;mj207!K^ zFkL08H3c$wNY16Lf_0>oLG{cNdE4#1T)hm7wJ@% z>z$89AF8&5C=viqa#B_z?@QTxM=06!n;7$SQwYiZbOP{q6U=Wy$(xo78C^`sqycPP zgQ3{Q7PKAO>2loS_q6v4d{`=56d%U4)Vvao`asn7D%X8fCA!HC$tPMr4T9@o`Gl&O z6y}7jzcDy`mpc4PcOjmG(`Uk#u_?7_-`nMLE%h&Sbhz2b%{;JVm`!4Gk&li9(MPH!+=;e^k2cT#OP=L=Do4$e*_*I(sf?!c!8s#;9jB^mv{Iy%e;%;?^f zSKb)UU>#M;q&txdXKG7%DRdVi9=}r!;a3#d?L!?lDTff3wP+bdnBKqYrx~_cX9ezl z25xy_+U7h4vOV_g^{D=orSVvW62Y0unj9RyzJAm*{9z|@0vHOlcGQJY8Ii*z4ANBz zxLe{S&Bp)1N1lBVYPrDVl|{?6fIaWC;nrpeD}t6EK&WzHQn=-N)JhF|F*N}NFi56HYYN%b@qy*qALXeDHoX%@3>z=-aZ_4Wq7bpWy}mxucuo>Ab;Tz_f_b1Sac zt={5Fe0;(8=n?}Irlx?OPc?CM@aI^>E5!lRQGp)JLS|l`nVz_>JoXfM+6O(&jBGLC zLf}w8Bs5Cr86_I=lY6tJW_^lkFDaRmg^I-N)1~atGrO}Y>!GJGK+Ey+azqPuof`@} zpJ=E$EoPt&_&-gtJuuqLBkyL-N8AT*UR6lx)G{ynW2s@dy4J9A%sW_vCV8>^D679w z`UjhQ>_>zAgRpGx-}D>1_r2QfFEUkeiHO@sM-%%~P$11$im;`-E*2Iiju@SzWz5=r zG6BpPxKjlh+|$y;Z<+}0pWaXM#uE~z&N-j!XVh9oZ=)UX$=3#F+Zenf-(D+oinxkc zPNJ6m9FnyTlo!R|%AUF_>`_zP^2LMT*k)sd zL2tXG%e8OvSPk26tIWY0znV82cNpt8xJ*j&Sz}2a(l+NgaBs~XI@Jg1tXGk@~B`IJJI@-Fg&V&FX& z{WvYFBftr;sB&F=N|_26j?2e9mUxR3LI3o_y(V=%f>v^LNiX$Mu!n$Pac+H+Bnno2 zc+t-YN%5L9>nF3+;OO8Jjp$b35I7b(%3kf@eG*J!l~q;govrjx6Jtf}o}u@_ia8KL zvR4sk)u_k$+`pdU`|#t79^L&jpVrM{Bd#(?uY}P%yV5shKT8KZYU6A?olF_1%!)CZ zXuc<4ONZIKp_Z^ClA4YW4l&Yd{Y%anSKWCYSELHKRxb;@xj-YM=xDak0GKBC_azt0 zSG7_puSG%sY?M@T7_@W91EoK~4 zcTFHU&lN!Q+|A(|)mDTz6}mQE%A(f=5`|m*f}2;YiTQD&X_+=9q(wqHj|}W zRTklclY>*~0M;8(;u%cTr7(R<8@~u(R$~QF9I*GW-p%nJ@GJXxp(I!ZDRTW-WD=b< z98)wm-zxCFc`k&iL!a-3poLXeoFV={s9`{3@aw+0jQLaLTd91Kb}>)Wn@0PilN)o* z3MiuELD=Er5959>yJ^>y6Bd=ubQOyF6Mz!?i`{?C)H@G-LHhEGR!VJTO>>JiyPWok zH!6`oVV!+%)~)0dNP85lpn+7z9N{iOWEP?#b4ppv1vq2@K1x z12vE8+VO7PpTT&j0SjGgp8XK9XC>|9s4E`Vx(WiWQ2!_3$lGa1fMhjm+};77cZJL9 zk7H~X0?^Tbs-&bnjN>VdCz!M3$pvpKwL0N^94>|H(AVaoOCy3WBJ^C{N4u_-I)H6L zGDzDVTmEo@?tO%`uv;?VftWq`SXrY<`7)enUk&LHg7$0#y zn$il|AxEu4PHf&MTa%X_x^@{bFHOTh2I%_ny|)B#k$rI50-533C&pAhEm6=4Sskmb zF}^Q9#E6FQuS+?h{EnuQ{<7}J?EjYmuf?MdK}PfYV>_Fq)p3_|WYSYbPC(q_LUrxu1Lk;ldWse?Q!a{HQ*?r1S)};qIRjW6@NI@DRUnKsM;sUv|y7i$JKBQeHfxbE3|j^76nw#W0?`xVx`w!=oBn z1C%DUtU`CO(X}gPRmc&NICy@KqNdjM0o5>d&Bh%+VDZEk)o}@q5JseEElfKzFKIT} zK5O&zn9BOMB`wY5QuW zND=5we;lt=LDeeRu>d}2s*iJ8F&htn*;8(0pg3y9^lpIOCCJQgodS)jU|umy^Ewf0 zpqatH2=6}KymzL?UbD0G1rV4QEQUo>FhpP`ezLMNQmwd!!iqxH&p-)DoI%<>_?(95 z=fuOav=SJjnuwuyu6|P1OT@6z07=)*QN-3X#LE52AznhBg`i&Yc#16wKi>=+WFp)T zmu?HF(diiuNnzM-K}5N#BF(F;@$zfa16a-n$SAz;_Od@K6GyH#wL=u zrGl;tHILiK(UPDEyDSX9{%VK?8BJD7n$0%-?Gnt8TL7t|VM!9eS%s$f55U`yKa4oj zSSho6SGg%q0s>Of#4O=3yPW3j zr-fJZNEF?r<7U`$dt5Yb*yajyq^*Tv_kosk$Y>&E8w-7b(Ar)Ok(;Dh>Du**_$%w} zL0o4<8#G)-MlRV85E33g-oRsqF>~vJFS5mqxJpLS-dMUXb6kS&aA)W1C)ezynRT-` z^#q|00lh8sMP|Q+wp$8%s~3I{URD0vU3uuKhC6{ZgwZsY^K3nb?c2#lOd*^czpxpm zOVUb&kJ5Fe?n3;{HtQ)g(%&7Jn~-ji4%*#H{GOicXGE!+*cCIegH#(Ku&wC?_E1pD z8ZVbSc-+1J3{qg<|tnmjvYIJ5YzaCm3j_(e#)Jl31Xa<`A^ydc)C#|027#Rwgxd-`tJmHQXtHy_T+P zW6P!$?1%8o(Z|ZXjXY5EoZxgls>LyUA6M3{6vTZ12;{(*>e_sIjoTZP_PWFOd}x z;zV^YG~^#K9QxLL3nondt$aS*vV$d$#DH?X2XhcgD2q7KWS>~T5efp=TWa3nrHt}? zStan!K{=2{?6{n}mUgR{YO@Z_S=g5%_AF7xtp0m3c7;;?WUm8a55Lz&MN?nCIjMs7 zk;cMy^U|K0M@Vl_WtzvDozo!XaySEC(1bPSCd66W*4BM<{XA9s6SC{&h@W#;E*+hH z1_xAB0Aca=v@+na0-5)a>oqeAzb2}W0AE2q)L8k^C!vStIrXURUoU*#Cvu`q9Xa_z zXS;BUfA9u(aIQM8uZt@^@|}Q@t<+fOrbc!aDOETa-1%|5e(xS^=$oUXKVW($?i}ant)ROpDlKvSudfMoNFF+LBxPOM10RS7 z$xnaDSxG)_C}Ds$m`6+(U+yLGC^B2o&QpPM4)FRoK*}3<~ik&B&zWU3x;=d5=elmWtQTAY*s9w$-9BKRglS>#z zlkqgx0TyV}&(pQv%yJg8Pqs*7TF9M&?P!|~)#|fDHaw=P2KDyvv_1}Lg`sWMAs%vK z<}x}Iq^vUhZ;g$?484S^4@2JzwMuh5B zhR?Ys7gwAOCAa(SS>#&;9jC<}(mRzk+}F{V&=vy}_f??3E-D)%9WRu=h;|Nikbe!n ze>5;xujV;=j)U%15)yT4+kor)B>dMnee7;ryOn=ot`#VwbBa1mt0~-0{>Of&+Vv~V z7^H!#5k#JKG!@g)TwJ|vR^x>VqjVfY<|AE@7M zEpvY1bvOLYZI04wQj|#L?cTAdTo3C6dRm;vg!f!W#R!zi>3LjZz88VpM|M=l#@;7o zs{%ENE6Vv)0s`-qORDsf>T&^Ci-=hAc$yANuBvJ7BZ z@hxMlAaG&hZPdQ|V*rF0Kp)EzK@`rLNziybeKp^Jz zs#>tQE6k|<0eDLBFqTxAcY>2rm4gPp%!|n~gyl(1E0Dy_T&Y1MxzBPfh%N|RQ&`~4 zlQ_sAk##q0GSoH7khRH`prM&3muvIjWXMxs7G$wKY*Deu&b^SrVnTKjx-+mQ zvDHIgwk5NLXj}U8eHABafr=C6pju+{Sy>LHghe7ckES>V1jA+Bt?WVQfGrUuZiFt5 z`J2hRAOPVYPq9ExxZVS#I-;m9x*?iotb_od1OdPR00vP3p9D6Ee*yz`U6O2n65pi8 z!)k}x$PiauklC0x*d%J0V5m)!Z~@U0-mg+9ZS_o5JZX3<>LH&gd+$jx!z%d?v!@>y zzutigDUv?Am)9^Gcwl2L;oCz1ps7mlC&@nm+{vv~0PEYzRrj3eT?#C@A_%@yKmIGc z&bBgZoUh{Dbn4-#qqY~K)7d1H0|GK`uRw#1`Ny*Sh@b%*2~;*9L@d8zG_93=mv(%= zuQ~1PhZ&Q87U7-~Xf-KY$$ntC41VpB3{+y8JXU&iC}%rDi~~dFDwU-{giEpe-7xJ9 z!>ds@L%e7yZSR4zt{02J5k1=x9e@5|w5iNvI+U%xfV9-}xMWwtkc3Gt0XS*OX&Y^Q zuy?+!OV2QXs6FSn`$LrTd0vM)2;=gt--SGJmj`i4#UPl7P^+YE{gwy7-|>$ZP$fHX zPt)g>1Uh(Cco=ObhFopZjM`jwQ}~dgmi|VRg!(K`ifeilGA7sQ#QX0H^&8aw^u~N! zE~Bos^X&99IWm>^gG&6#a(3ld{4&C-j-+h zCus4YJ;3S+EiVb3T{6vE83(3`>wXC&8UFRnMcemxqX_1B?8L$ADyhX*(m%NPnm!-G z2Vf7keu_ifRRAx2`p!W^2&|Lakz`_wCKE-0{cs$lo001l(CK1{)C~dkS@M?kgw!={ z`w+HN+$Kdf^61MR1UONjM|%v^K&po*u+tIQm~ca?E3huzq6)L?U_xKHP+ARQJ(==c z&BlV_jvEN?BAi$Y$zF6M6j&h0^}i<#Je*wA!Lf@M@L)#LOb+>CeIpw8n^nWS!@IwL zSKM4B3Z=F2XGOM?1J*`GbLps)V%xwgNe3C%**$mIP-jXu;6MggV|8nZP#vJ}Mn6LR z#Ft130z1Fqd+HGt(JOvBSguC9R)c^(6i0v68ke+qao8&un`ld~tmxWqazHlXiSfr% zRj!HH1p;0=#V+5Y6gSj#&;mRt_3l|X^dXw4QN3OZ5$x#fpE*MF<4)!b2vEJ_J!A(qnwq7m19J`ItY(+;O{toZuyYw&azAG(Y8_9GL?h zIR)jG*<75voV3QqN+Z)z0iYRxpiI zCArLl2CcFg-~8{)>?Uj|#wdAR;5f;yl;uc4~gw1Ikl5lh=U}260B}>78SS+2Jsee~g{9m7P$==jZg#7yU{PlN)*Pb<+ z3jtOKuWbcVo8p?N__h{h`SK(^XvH`w%+?nQ-Mn=xd52$!V{Q$6;|yT$ ze*AM}kGlO04C{F>(0@gt_mJWdLo{wz;N#T(1+$SlUc94e>@>vE)Awi2FIu0Ka674g!mM)}QCNBOfLyx}g z&G&77I%Kc|@qkC4mjoRTNxF4WgGpA?f<`E#uMv%UKdcOQa+7IlX|YmI8t^sCQGs z-bo+xb%b}jOt-r}ElL>WtAqTG(i^A~gbihvxApG*5zI(swQY$%8Cp&lzpF0n#+TbN zt;H<6_p_)}IyV=s$vU_LMfa_=a4+s=@9RW*JV}lAUgHU{STEFqZNpQ2D$i4SrqRkdl@CN+#~2`V+FJ% z2C!!tZ#xx4Ce{(D#oa}Kij5(15V9i1gp|%28~{Rszz{+nq#8oCFGlc0M#QS28!KtZ z0KQrRQ#g*gC}3#g0Ell0-zXK(f{2F&Y4iWVFX4j>_wk4UKnUOf01&Q0n+GM-Ayq`m zU@MpZ002R~RUrpsUX~GlVrA*VCqV+rQY`mL?yxQ(I3f=O3a(UdA18K)-SS{MODLEAr)w&Bu#EXRYV zgozjT@`d$Rzdi{7*+jajYz9_?DWA4VV&j%;h5xzDcb;$B`s|C201(^0s2PJ2?E6ad zRN=-f@cfm6al1l=#g8elk2CbH!i%6esGQ-J=X7&GcFs9=yBc$oXPjAs(j};so;*5g z8FM|z{6Kj zItlDYmjVX+lJ<(6lp-xH#hvdoKeW!&cf^e^0}GlmV(}#2qFS*}JX-VT+&z~-cDwB( zsa_7ZU*_B6_p(b3eS#!RY?OnBl{JE^_GBcz%cYN+qplOD?%Ls~U23|2j06P`F6k1P zA6V>sE)JG^28?unq!IxQ8jV9td8INIODw_#nanKo2WRL_{U?`c^klgohQSkZ-KV|l zRz)6B!k*IWLwU#&TBARV|C}dnNkvnfx6sIc- z7(-WTbSy%PO7g(64)fB!1XCv6xD63Vyk7imgkVNB_fGldxoST zLZn*}kQ(DFn{Md>k11?SERB_C)9p|E439waqvExm|DB_<`1&id!A{8dX%)HRTgl4( zWsJ>RQ>WkuE=YQ{%eWQ>i?oUlqLlW^HvUAT&@R=p|Y=eCXmbtUF40eV>Gr*yx#G;kZ?aQEk_abw|pjU zd5Pj@~t2rX!`A+cE%@Wc1Ji11f-jmDCB!#t@0Oh%O29l(Lu{AXIC#oY49 z3?Krlc=0Wr8aG%AfXo>`DwY7u5A#|r9Cs?1S>SGENB zq#MU|j!eaa&+jiZzv2&C0)lsnK2Lo$f5q+6{lnK{=o8vcrALcXuf(Zq^jg7{7v*Ek zw1Y9a1In`lmkq!E2Ns{Y?vNIct`P5#3VsWtJQm}vcXyXG*jnKf83(@X?$Md==!Y%k zW1BOx4_PF3ud&Q7HTe-Gd3v>b4oc4Grr;y5tq=CiafT~r19Nma-Ts%{DLXOZ4RIi3h zkfX9;J+$&%iX=pcn&8?6Cx1~~+j-vs0`WNrMDMp3nexI1%@*As^+t$&T4m$q zZO~iKtLp?0N3kT=3_?Kh&;9I7cU||Z#>JUjivsqq5VivVd2dda=wf~@xl$hcA!}j> zcz$*IQ=BXy%&xiIW@ux;U$)utc$Bso4mQwf|AeW1x? zDwpfKo#1FtczJvUUoV2Ha=6r(k{hMHc=Ausw>~OR;s+rqW^5}7`~u?9z;f2N(s@SQ zLFa!23yr(gAZ(K5h7`yPityxT+ZQ|m*bBZ^PM8QG_jk2I5K^Idr&#AZ7=?3;4;hpm}W%i4$Sf4ih zet@-t#7jk2@3VkFYlk%+=e2H)yQI2cUJ);QwzI$ITWq>lrDMx45y+;TT3tRGbyQkL zg)Q0iuF;`AiOEgHa{)@N<7|$4-Z+s+sG*XeFco4%Y;sb*si|!1buFoipW{0~m^LIa zD_?uH+YT%)&?uH#a?VI($OVW2chhI(1ou#~-Mk1i(%Y-q2klckP#1$U;y1vY&t55?82;@OQY&+gy@nnZ-|f|f;aN2`6Bq6H0fLl)ywt|VPKka*_F)(pF-yh4|vks``RB6Slo?402dY=<7bqMC> zS<#VxI6S#>*}ZUS3(#TO&TmA6`%%#Q=yEdRMzcUTWH9>G%sxEmu-Bs(Pl7B=>T_3Q z4^D0XnR_9Vf}+0Ld%De7>1>2KyW05tv<TqX?(Znnw}0{9=_SE z9ONaDxoOz+7O;hMHX-W(qhvn;aDZA*Ok!?e#7iN$np+KTRpD7_{svK*1*IgCc!q`% ziVTWQ@LRKMsO9R{zc;>VDX4Jyk4uWmMVmKtw76*gXM5M7*c9kVnXfDZ<7OWqSJcPW zKv}`qRe^Gf(mW8~YY&62`>CNSvOzEFcr5qH*$bDrnKMZpLjuI*uV6V_*MS$L?5i0C z9sw*yqj(x3F0*I20(7dnPqiAMCZfm4cNdH>3AoR-&>z;#YfUV=?_X4gG;;6}{7SI% zfQ$ApioFX>J;N;5uriV_9B0%;Rg(%TDFbXD3apUdg=G8>u%5Z+GiE8(A*BNrZMctxivtj4jJvR1K`tG=OePd22a^M+4R zrYl!ekRqzR)DwCk(<|?#D{E9(^xXl(PEKC=LULg3dUO&|IQ=+nGQmtnrPMsQ1{0D< zB~VYipgdMQf?}=hsOvwQ{23e_4~5BH-teP=SoW;0T4}p|-8`f(-aBaDSKKUPZIe@H zT0tj#`gLUeL2P0vkzr?Z99`q+zG>P9$kna50bKk%dBj9^R8mGNd-+otu)^HJFoZCqMnk-w} z{7ZDBy%XoAV9HQg3)XG}t9Z%!Cb6w>fJ=Nc%ze6=frLFnz({Fm)~!l8t_1^!+FeH- zfKtIy^d_(oT5lszdWa{GKZRKVa>YJE@f`gJ@5e1Y_NQs&6v5CeP6*Y8drLZ4B&uKQ zM^A&x&Ag-{Fl;n9Ta`1A-GR^B6cgwA_!d)f*hk=ulMY~;upH17Hha65j_O|8TIP{C zvL7K*O;6S~f>vS-sCWpBRl_798J3yHRoQOw&?uyC#)O>8O5TYoj3tS4d8p_B-Z4RY zv|QXlZdN4#R-n#sK>xfm1qp0b==Ct(JtCx_pEtXWcsDf0$m+6*Bm4P3S&Xnr=1|MJ zuW`S}UM-ssvYie5uUw##9|o<@8o^eMh~to7z--7G#A+RXl8oRz01veq;-7xaDIQ-i z_k=a)O5bqiD{%{{*F{|Dg>eDA@$okMTR!SV~LO zmQc&442b9!)=mj?xV*jbvS5J<-Y74d7KvJ{h&Gu;{D1Lz{q<$$h@# zi*>8$E~+%ocSz^tSq(#$1(;OkvtHQ%Oy(HWC_>6Q|Q$=>!tM=Du#Yv>`bh5ib^FdcDROZp$R1o>U@s?`n z+Nc+zdcBE&Do&pUuv;=EKK?++epXR4501t9@rhiR79ma?0m0XkXCD>^)HA@fb?{`l zW^J+F0m9lJ<(@0<35b6WHviLK2yghmO7rjM!StrgnBfA_hHvMRf2KQt;z@-3tA(DU zU~ulIi=2L7=MBqvO6`i4_pYF#>3JF5dx1Bcj@gz$%4&b+K{O?6PBum}vpl*Jb9X#` zR!J#LCc4#$oHV6a&%#1T?4ez{2(`JT^kF-M#zrNuu9NSnnnCq&K)2P`nMLj;#`(W< zX~znMI>6o&H(gm2W9lQjL|w;x1Lg*tO@%Rh5Y>}*{tHPV*A|@A?9Dkod`Fasx~O{J zTC!GQ=Z|-^hPb`M#IhV9uX@!GyNK9~{E-j$2KCio_EWcC_s=kVYVTJri$*u{^fFm< zE`OP!GK@0Gg8fz%19Ch94ka=>k5~R(LSPh{>pL5{rR~eE@D=j6JWh#HE6$9`+$KHb zjy{7%c#A);y;@G8BuUf6MGht|8JF9m#ri5S&UzQ#)@;zQbPs(kW4~{3wH$77^-X3l zL~5+tW9w9`0neGnpaXB!imUEkW?;~b}nk>e~BtmT*QATI~ zw$R*}sv%U)Oioko!xV{30(n6adoV{hMRZtajjFmyIt0PtkpW0`rKU&ZQIPLI9nOzy zCcCT-ebR!&Yp+@E|HkiDiHnpp!O?%aw--CK?L_>hUu3WXJwfL)B2g(C@THPZ(V#Aj zitqvJZ2SDYWEWI$x;QKH2ycXIakp1FSO(n&xatpRUlJ;W9gZiRO3PWb= z@!a}@b|^q!Y@D~nfQvhw{|Hbhj(ESp`;&msDHi3We?g!ordq>=UVAvy-JQuKHk6wp zVz)1zY_25fMN`BUAXY%Mec#ALH+c6My1Y%gLqrgOZh;7*|Qw*DS%oTRZ?+xjp!7UOIcf#j~eFA zAP_BurDbQrq8)-LN(|~;U82k%(;wwsB|Q0Cy&mr2admUwSv3y4;iL0X*m9&wY;_5G zsk#ea;hRLyCSm-O4h73B4T@4VujS?J@Qca>oD^JSPZJ6(jK?vi$V-%fYJ^bpm|$dFz@ou#4#9zo$%y$06#RUe0RQu~nPPA|fx zZjGWwo0{P$371dTt}kEey*oG|SoWEq285QQp`;q81JwhZX7%YLQn=bFsdxEDuua)t zK+2X@J(5SV$#D5K|XE{?-^n8 zI}2A@M0g}4KY}fuJ-d@KU+ZOo=o3=nV6^bkk1CC=;b;-L5vgF?k`|N2f~`el!m~^b z!dg|F#DxeMAOJsmMwh3D0jXA1SQx^#OiUND(!gu>AwEg3{M4yQ(mpc&J4?qo#>0@g z%N7qvZLcM`)QKIE+)BbRBofeptDiA|Li;^qp-570RVdE@;UTn-M3T2}7OO`R@_+qG z65#xyw9WN-S1P9v)+yoiMZaeNjp1h~i7jE( znyEO<`KhA&K)18oDks~S1l;kuCk}>em}Ga}CB{TlU_)H#)!tLU->L$Q3(j_DD;XFb z;(TNDQs~BhBXXq(uO`5&%n_>L>e+`XH(l<(AdyK4Rg3WML$f*}zYWJcWdpMI-+>U~ z8bhn+rV%17Ag+TaK21i-;wK^Pi?ABSSQL0WG#39gkavK5yU;gURYo%q5&VW#Vq_aO z_LqkY9Ev%m-xgAX=gj2!%Md?tE#ypb%e1H}**f!*vXWeYSn~ad!>F9R>6@agl$5E} zK%Xx4HG%^onU?NU^XN`Sexe6F*ZL*8Ez|I5mScUKoN1!BBd(h-YI&j7xYeg=ay6o5 zn%M7$L>vCHPg^RLP3>;Fo8hCl&JbN?SwC52bStN}7AgM|W-v=GRAc-`O?V9A^Po^HUIXxs%E@#tkdsVJk*AqdGYHH8#<5u|7mfD?^B>7FJ% zeh1c3YYxz#Y8a;rswrV}*j+NJr!TB-s0&b_#5DQ~MartpZaVq#)H!xnl8H%DN{|>O}N^BbD;Vg@&7?C%&-jvxOUzxOjCm3>3M=_ z0{YQuMBxiW0n~R!^JW&>*ttC)mM%ZhYPic4OML}FPg>0dZw^XQ*1|!35fb2DD&zp$ zn-78LbgE5$kIiz($B$T4#Nzqxt5Cl}b2VN_;15&FYLyUJ5#4TOijd8#+c>)@s*v5s z4VO!+DPj6Tf5WRRD{%y1;OU`j8sNY_&}tWww#>az!IBkCfTK^!aqD&<$4&mdjn4~T z1V)#J<1>&WIfdMAIMNUQu_$D5zLdBTA=g2EUlI#0 zc(R>>k?@&){t9--^vhk zp}Zp#g^GjUfl||?A$Qv*BR{Awzb*B>VtEh&2LJ#DL;;^gwuyfN19do|fj6~)b=fU{ zW!tMYAl#5gFj7N^0kl@uN_Iv=Ek(32AOdiTe-MMb61)V(Q8_CowUV;`5LJ+x#eNhS zkb#PN|Mzf{Lirl~=e&+H-o6FS3e!8^3Tu2xJ75N1KbdrPzFA0{u^zk=Sh5iKr&~MZ zoO>JfcZpkk_r>1MGo@Pby!)3(z_wuBy7w!HTK?;v{9qLjo*qC|MsqE(RDQ8h=1`c# zxZowmS-yV&G4lO>&)Qz>*}lOg4C75t>JG30anW&?)?8gmq0gY;0<%x%baqUm8-bU) z+^)TeeI@@Ye4Qk*Y#I9*EhhdE?}lPb5ePksm6j*|o}OQZP;mCjL>i=8a9aZMolCge z_il64g3&A@JM!Vc=~>s!llLefLJJJr6#UZMUAkC5cgcPs$Nj_PjJ7ENb@RO^rI_<{%PLD0o) z;o|0emfcdY>}`L(+@ST?SN{5?FK|jbp~qBUZ8jXhD9Y91Ugy{Gn@D2s`qm%}8(9&l zDqr80q{$A!r(MtKyyuL^gx-OA&!kw!&4^Fvi-h=Xv9jtRjF{)~!6{WY^6QsTx@Y6b z(B_MW7M)53EAHVr5CKDBH)X&DL8_%)&~w@CKcCK_$*XCRC`--_4QLi285LrUvL58F zxk%KIvm{z_Dg#4$x&qZ5ClWY0gS}WYV=;2js{f^EJ;##3$%YH7uic0M&^mZ$xBv>u z)mIqJTp0V1H^7sh`+M*H&P{Fx{HFtUj+F0kD3{u7W(rQA6aSnT4sy2aLi?Fx?AU4E zTGz71tttl_;2agJl=Yze;j)%$mPb|As0W6v(FuQsR+`VH^Qydg^BLS52)qp+Ep)>h zX%PV>)|h%Qs0 zC1v4}tZG0c@0En9b$%@7HKgEw-VB!BV&WatNMq=ZsIW2<6-KB7sit=1h3|nXtkH$7 zH(Qzz45YLxwzL#|aka5$)drQ*dnOjK-1~k)qcOrT031fO75m8Pd;OwovT`CXJ$Kb< zH1-1V;=mt4rtf)2)WQRx{+;!i`+`t2`JL^#Ylk0%N_rK4hZKkhz%Yu8-LGd_Qr;P`k?hg)uUkIz%70qC7s~o--G5Kb0rF8C;Ogsz-e<% z3gTD!{}QF0k@;6N>i6Mnw%f5`kL5g^6#7M#KV;9FHEh^-gP+7t=++s|%E>q4QX#wf zsI)%}Eq8*jY-Boa z^2fKz_Gc%M#>BQdSh-1v5mq}R+kgTj+ZRU+NIFZ}Nks0tbh0NU!C$Z?)3oN&=@F~C zkO^vN8c|s(%$@%OtZ|=n5!cFL(dyYJ`}TCV(Cwmc++TYY3o`I70d2O)NESwP|Etg+ z{~mC+y+Rv5bgMc-RBdl~_h6`E^c{ckE4KYa8Z8{zdMM6|?+V9 z^n%Z`WZ^YwO{KhPZ3!y>!SQd=&7K|N z-0~X_PYfnQE8i+Sh6P0HhKl7}vDa=0)1PDWbC&FkZw_UrGTt9*?2~?OpBM<{+wsuA zF*DdNH5Ussttrn7R)O7-hu2x;Fem^4>meG|HHr*|B^<)FTWdmq-G%H6X#i8M%UTl2 zr=2SUEa4(kCIiXB>CTCG7xA@bHYQSy_4FTGrmq0Y%!JNAXRIo&@-4*+B?lgyuMj-4 zgd)>I3)Te!1p(9>WzsGYjk9fEhmkY|6u2DKf|Xw)1%y&_BvziURGW1q3I#2W5{4rn zMn!=T$P^SCEplAUuxp;yCkFk?vp&vh1un*zik{`BrGjdP1#_aD!^t4mpbGugjFIaZRq?B}Y z$*3zikfCs(K!mL+fT(WLA5bc`R|duif&fqg0N?-s1}6cZMzTqN0tXR6x00*ev2Za` z@j#G=GRZ$sa9Q1K)dq(qq^sV;-kZ7&0bId8X|^gaJR6 z@8dwC?kf6T|5s8=ppCLH{bVv2NR!Y?wer%f&9;!YZU1GN4=r=;@3gQdhSZ8^b_;$U z^uF}yS|w->zv&c_)|JZKsGmF!$4(-|({IC|Vy+X_(C69Fm+Rq7)~#1%`@yPJE~JK^LR8WQh5zi`I3tIyi6y#X1jl zBF2VQ>^P$8^FYPjAFVL8{|e;J!ph@A%1(^n&k~4vOVSKPf&X4x_l94*De|k~7rdGH z-T9LYneel}|IBGsr5#>dZdx4yJ)V%>b8)*!^Cn_kLTt1#8u_A+O-0QjQDQGKt6EB> zWWV7D69UCV5e2WTV8GB6Z;{z-3oA46bU->OUP6!X-YKuJnw8PPgdsTeTE6&!u8})lq&~LkSV^2%grE|t>8Hy_ zN$gbqDTCO(ldJn6-ufwMd=N!IWJzqe*a&ay{kO5sQzYg`UupNMWy+0tj6#`PvhodA zN^#+_J1P8kDhx?`UA_YfZ;99-_YjT{|E~vw*_v7@RdI@f@g#c!>eO_6rZ))=kAwEi zNm(y0p`Ul8&czTJ_6(nT*8pJGLlsd-$-K~KRnC7+JO~8wDLuyV%?W=&^@gX=ZG-x&m*~QD0AM&a?G!Kj@IKH zTB{H^X*0`oy)(cPDi2k2lQs6yo8(Be*LzRIoWDb~sp5*3VCnL5MCrA8CTSF5`mWd- zdkDm&3%e;5ll%$5;x8|a66P4Kj4byrn%sKY=w z0{etmU%m~0d z$l$AP)X)I=x3M6(zyMa@#$qf|-Wdp~OAvK_V~VRfMEQ^QBAJ6Eb4wcq8L)pUc0Q?v zUz&^{kqwbM-UZ%!AJVA_uhL?F&`EN98?>IDy=S{eJg2;9oS{x)8He`&QVKsZ+ziR4 z$?Eu6^guyZwZtj&YUe9W+?n%oC(+F4L1N3o0p+Z9y-xd*5J$o3yv3eQ;?w{)p&=U8 zMU|9?I)X)z0YC_(F5m@`WyIIh+M5EyLNyufA@vGS$ORM%x^D-BSuQ_?e|CD!IXcQS z;bO9g!(OQ6OEUThiF2J#28~OcTsOMgA;H~aw-SH?kw<0O^TLFvEU}n5qV}o=0gxuL z^0?X#C2GXh^sT)l&X8OLN~l2%j7LC>gV?Wo;TktGz%Z7Hnq32b-}3QQp#!R(-Eh1ERYl+BBH7c062;mk*AUQ`uCQ3mjN)|1*9sX6{ywo|GA6}yJ{!_ z0l)wN5m!N*NTt*vRYb~QE0_NO06^OxI@>Ka`Vtsu+=~8z1No&La*h6DN8MAt<>bd3 zi8+1<5aPA8|B+@Ig<g|`Yr+3Kf2avkBDEry;$*> zz*a>w0${u)mz#cJ&QK_V_`}FMi{zocG}Y0k$9Uvt6;nExWi}hZ*)$sLgD7BPP*CDc z1lM4MSr(GVgj9vBCpj!#yuNr1ztIh+tuVSd`wrROzw(1g!=03>%o}%ar``95&J-8{ z#OZ7;0l*fX7WBL03{ux5$95q1i!+!{s`JNH`;A~qaWwm*q(ZB)-5DwUN@4{+Ja)S$ zyLHT!-#zA}+Qg9TQ@5=6;l!h8PdB%j26Lal=Eaek3tLN%#&QN^+r{0wI_rcmTu{FP+EZN z01k}DJSWSO!aYkRz2GX|NqW!jCgT3*EGVUjHvI&)#}dcO=@V9v$uYd(sW(gfosi{PWu%;<8r@d}H5fD$_;0ue*HB z>Rrjkak!JMh1sGXO?g;hFq%6cP#-B(nF}f?22v z*hdp#q{$BaAz~tQWeDX8#0ApF%&x3z~=YQo& zG$OV!v}ch_i?|d%=d!ZDvoq?#!0sl;p<(Fbr2y}Nkwy-vljR0cK?2G~Vg-uY?7moo zEyYA3UpjLJGnb|i^;KvCF4lyWUg= zB=n@rCllln89SH-tjp`Xl$>P%tg~y65Y(m#%1y!h5^pkNH5UtN0|}gxE-O=SM6ll( zZkkX|D=r(^Gkd*jDj~oe)JlKu&HD$!xfiE!At?x;ZO<25MQW&NU;ROie^K^4`g@F( z6{N(j?I0^QWjTNGO<8W;r?5PQf=yOb@HyzePE~K?+AD#rqcI#8g7i*fg|_Lp=3fqe zz5oD=bEPtE_suZA|i`8ES|EX>qmue@I zDg#o{c)kFM2YvepLO2WvX&;!T-f$6SeS?nCGvr8)5RZ!=>rviwcdBLTy~o;q^4snZ z3yDxuszYU|@||aMPi5Dgb53^R=|w@lPe;PQ4NSCTXuSj7@YhJwF)JVS3MztB$lq_I zLgtn<50q!Ey$>UD6+8sUo$6Csfdc-pp2<*an^swhMvX2sjzgmr$)%~{@NvEuPjrfm zlHEHs&aJE$%_lEhB;F1^aT_K68&V7-!<_*q9f(cFqV+3wG&!d1Q-7Iz#sXZJASqrj zvRLz40ARiJL}~}TXeCizkw8F~^Nk6rFVa(4znsqUIS#R?sFPvu?5?NbOgi`Qgyo1w zARHBv$tN&>8HBv}yPZs72lJ|lB0RQdT4BJ@fl^jJ-l7LQ%L8ruacX$AD1zK?p z_~(KA?pfJVy0h*;t2(HVWT4J6B2Qgw@$jj&1nbQ@$FM;ShenGX_0^DqQ;i{cr7gFK zv7Oc6gh)@5cl^-FPLE1wA`OUu-Auzk@oxrwhZCl1tUq0~zk=0nllX(}u3 zSrs#!^_F5LF}tQ$m3>||oCpe3rdH-VZ^aSJg*Xav3w~+cRqM8GdWy%!5@6cN7Opvv zwVJ4v{#@({3Sipzd#%iHfs)}QQ{GncJPP_zElJv*EUzQ`dywIS`h-=Qjs60|Zh`tY z4Vaj&kvpjl$fmGx=qbuU_PX$nXE|%!>c}gwg-U%TA3k&If0KFE7)pWg&btDSHgAw0 z?Q@;{gq+!S5$>!e%uwwg=Hd}k|Na4^Dq!DwF23_-!?=Mh=lwmr;q}h)If<5-rv5nl z8f{BEfHGaZd}n9|g|(TSq^#fDdd&ulD*9I4RZ@&RtGbfUZXL4nb=IVx+?S_|`WNU( zs-4GPIL3V-3GH)L0Fwj9T|B!Ul_gbw|5{G7C87kLmFr81GRnoiSL>CQHQ-Oo_To@u z^5WjpC7r7hZc;){l~6>bxg(tY17fQv4;efM3~Zn0j@bD<(LLnL@7Jr;`9^nJFr$@O zAQq$z`d?KQj=cBya)6f47K?ElR8B`}Fesl-D9P@BG*3xbbc%F^^d#|Bl5BDLe3L~F z_~}-XC3P@t1v>y%Xv0r(lZlz5Ode;R8ycwL#f6SyyM{A)S{k0hcVacLP?D)(`1~Wf zXZ8wVU=QX!X=3`z?pgDYbf5K`l9a?QNdEVh03YE7Yw~ML2}e=wfe~ixwz;;(M^7Sg zdXel$j2+WN)6>3(x9Z+k?Zan2m((Xb7!5ljcc4wFoJyjt@(lg@ZeC=F>_PYWPwHK8 zN6>>nK?d5A$aPQ6Pxo%~4!Y4CHW>-L9t<2Xfc-8;&^u1Pw)+kFMSgKraLC zK6%#krM~Ld@VELDDt>tuTtf#6GPP1r9VRU8ECT!g>g>yGzTgHC;EY0-%C(}iCTu;F zJ@IPMS^)X0^h_0a*fWJJCGPsG%@I@;=2?i3?pMC}OiJc)8jt!5Irb&GC34`Rl;a|O z%y;Jnk76!S+<(t+>W`!@K)>v%hifXgT*|jvDgc%6?rY{DKhd1NUt?;cw*+orP}b~W z@gcRG8$70QzneMCJiz|$jH8uy&qh8RMkd6pwwD=dr_|#IyI{Zz0C~VspcClIIL+PH zs|;mUh2CYQPLNw~G3}bUizf~_QKRElc^n?B z0xg$?fzdmBto@-X5ZRg00&&h+@og~(^;~CxuB4QW#7*;UsxJdmWzq!$ zMGhJKe;zJ!qcub>cFpQMcr`GnkQ70xJV+LhMm08F_P0nJk8acXvp5f0pi^^z@9J*s z&5^(~gt=LpuZukY^Gkul0?Y%4X8eaMxf?Xlg5asQhqaMztoaB#9IXs{Tf(nJQZ&nY zu7`6iELVv9f6{QQD@TVi=$xT*TS+bsPuJ|?e7E|Y0J~vkUOE?JwdlVvRzY}SG|*J@ zF~=JdplSsYB7ObD3!fQC?o;9YJzT^Xfp!F^{x<+BfhXpvgA+<;tVWY2Q}mHY0Es&c z$l}OGYY|B_lxp_b9G&B!mh?&bbdBVV`GVSFXWJ@C$7^;>aLf1e^u0lmJHU$h_(GLc zUbZ|FI7kQuD}s8vz|KVG7Bqn^lf|&ME>D_Xh&2DdDhyf#aW*6MYGsONy!5QzO}5&J zC?GE|hjC$V3aqDT9Jd;bQH;%rKXRRy^akTx8K?0Z;hU*BEh}qLQL7zz$A=0FBsr`esun9aAcp8nq#NE^%aoH+gl9SP zFTWCVO{q&flxp*^eG|u>aoT~qDD;#Ynp$$ae5B>uFEXu7B=Cvpsk9tvF|IzD2o|eW z^pfe;qB;pdM&ffM)MHv+j0?7dxJgM_9%I0_`)vMb!6M2M~{C)YUtvufWi z>71~Sr(sI(ETl@96Y%BcwBFnpF?;hdO-*|`t# zFMFg#T2_V*SxSxEFD1&5?1% z@N2mB@>pvH%|wWrQkBNl%6p9!&o2g%Eu}8+0J~Xy3^*)8buL|Yw=#0_uVvq9MdB-h z&OhVx2DIo>Ue-7}IzWf$BT9O^l$iTQ>f4xeuFq{_RDld*%}j#xi9KK8xLH!YL%z#_ z4Lny=nO7oMbU@D>7tPMv12|E5!B-R#r*b>11lZ^>vU11ind))g9=Kmnlcx-Im^eAE z9!mFK>ufeaeTy_m5*{rQk63~LY~pR@V)o0vu#=(yx_!Fc5oDjt;Qe56;t{Ty`Qym7 zW5QyEQdBL@$cHkNW02^ONQ7)@s#~<`l|(EspJ09uS=~fFy_+Ln`xthBRU%&cEY!|+ zdq3B86{2-Mm+U4ht%A*JS7K>v>YMsDrSE$u`BOV8t!GcYJGa}z zjYr5FIssxU&GUpJy3}!-f~5I$Cc4L%`S7&!?rl=MBde7T5>Lz)z%sFSHeS%XRG=0H z#E%Pa8A~_K+pSf)qx{19e<&hAnBcUe;7&sIT2EQDI@!e}(Ug+0#FN-Hg?B3B`d_Ec z@}KdbFs+s63}d5$o&m3QgIBDbtayt*+rMny5@L^RHdA#)jK$7IjDhPIhBK{FdjHhV ztT_ScZN~{eZ*;~z**pbrBmKi!{C}iGk76`HSBzZkdpSqMi2^tIMDl4dH6qosUuIiL z0f9xB0#RD+sS&P7X_d)RS7WW#_{7eTVIdmTWs(qzI<7`}Si}IqFg)#Y)!&e3Am9_* z`QfGIlRmY_Q?o?2#f1?KYKzA;*3m;zvldZRp5o=bj91#u@y8Tp1j-bVWb17pE3h;J znNc*ZVO=myHugpZ$W)&#ZM$hsGn^oas6~Y&YiJy^nE*@xNErm;6beflFp_fz4fA$n zURlkEph+$$1N1N9Bum{VZsX_2E%Hf3=wwlDK+!T73M&G=Y`#9aE@Ryo&V{Spoe3iE zWt5R_prnFC_@tn0(u*r*+vEMbK{}8ZGN;)aI0=F?jJb>68@o=-C3+@uhh$F8AS0#& zIXjwI)u32fA&53<4yXd6v@wA90Dus1000NaA)jb6N)wm=0tzN=Gfp?Yp7JAj`dzu; zlT@~YeU7SNTP8j9#aY}$%Uf)WMK%jRKYHz{{Nabgbht>XlVmIsNX3wFylq9h?TJ$j zf#LY!ZeW;gv5EV9mW}5VxE`OmG~uO7uQ3EIDin~8k0|~$seH+Xy(aDF^#u=Il>x{2 zi!E}lQ(9`)+Eo6a96qn6rbKGWFL7?sNx$V(YL;TCvUOh_ikPQ_`@*Z=CqaokfthX#q*0z_vB^;RD+XCKx-S=E} zo#L`wjaZxoNvUVRyrG9&0X=>{XMa<9M7;YGk#B`eo**7smLED^7BBO()+8liq$1e=cVn=Gz%pCAf6 zw$wEb`_;ibT7|07G@YTV-U>pzo0K9uOMvEUROH)RBPzM7;vb$@7~(0&`KskvwhYG} z$d)kM@p*|h(N(9JAfS1k>^%7uua(cDt|rK_Dc3e{Om&XsyN3q6#R)VuV+W>tk1*aY zg3_67R^6P<9ePHt#6J=F@s$bqp;X$D8=M&;2R~Kr%rd)=4{`KIh-1vz57quDyP38l zMJY@unrhjh^F|e5;G0M}BS3@qnq_^9W zxChdlJ21^8f3WJ;$gi+nx*~lkG<8f|NPU+G-ha@IpU{AZC%9dcmC24KogXS}bjI(O zru}N*x$t>a%D6<@G>E|8@7b%q7Q;8UGo|Ey z!gvD)S!198i16m2>+4=LFE-Clx4J8IqGtcv{QGIgB)qs^B5A&q4GEFv7|Agmp0Q2u zz9bHl;AY)9*YjgYK>ci7ouUe+-+iWoaCWIWv%Mt59NyMxZO(25uBr&^tA$|>mUTcd zqNUY2#JSW*v$4X;N{5La97Gia6Mh?=2N9y&B%gpDFWYl3NT^p`k~T3`4xG#cPy3hw zzc*u`E#LZYzTE+Y%ctSktUZ!o|C#NgxWr-f;o-RDNS)a!J+!NBS*^Fi(&d}A`4p8U zu~%{*CL3#E`EN5}+dN8)|)0jyc z=Twm~>~3N2G2VpFz2Iec*?-d2A*j@Fql|QD#l1%TjcEi;U~;8s*CAld*vDRn3QAbD zO`(aZK6^@8){fDFRPC#DQl5Rw;W2Z#h2%{rp40i|f8*nley+%fgB@L%YA}bLtIGaT z(j4fLKW7NTA`6!*0;L9)xi}pFA`NARhX&*%2U&YY5n`dg1PLHB%_(1=-Iu#TG%e!< zC6dVK4ra#2Tsn#X0~&}Q+$RCV2h9lg>ro6%-C<2ULfg7tJdZ;fzIf{d z`7|${$%+Vz(g;u>#$(nH(@}i68me`BxiRRN3-MxhH;z@rU!m@q^y?{1z(~KIIE5h` zq81)-0Jy#&DMs+3*;E@A)pA6M3j{bpuR@kn@!@PV{lL>c14=HkPK7PRAPz?{31TR( zV+{MTKs4PAvw0rjr%rQXsL`q&ubFaDa^#|o&=<{s5Vk_82ySR{3PDvvLP)ER<8$T5 zRl{k2;tTl@W15+rqWvxIq(j^nOKV3h+|#0t-18fvh_&T%X2U%NMwE4XXYxmz5^`vM{k@*#W-=Alh;nv+>Z<4dT`ilTQROvYc)IBKh zkGofW+zM9l26e~NE7EJ!kLKNZ^y_zofnwu5$@LS0>**s(E;EZtAC4Zebz@CQ!%zdj zfX+Y@+kx8Ot!UCG&L4PuIS6axX~8v0wmEh~$Waod!_Pg(zBuwMk%zpKqhvmF^inj6IN%u`V zH$c*swS=lKsBJf>uRQdWs_IQ7NjFY*9086HvH z%D0!{xDjXxQ9_2rEvwqbo;rn**FuO#Y6Z9CtfWe#{L&`9|WBn72O^yCFb{;I;7Xu{0Yd1cA*rngUCayx|JE4Jk^}@~xGJhD0J< z^lU0V>Brt>C{d2-0PW45_x(;bQaMF;UKcz!E^L4|9_9KLch7DG2O2d96Py^he0ISc zv&-8I;!-~WDQfW;c1kD6<8iDFt3inB-$q44+R90@6bs*Czedn?!^AdDa9dn2LO=*k zD9}__SvSJI(S@;Dj*vXKcd!%n=b1CTh^{0O*!hP$rQ#bh?~Ck(Q|M;!`iB2jyns@5 zFcC2#cm7-g)Kg$u%~K2|=(rO!+Hoo&1t5}J;FWnIs7*Dl(iM2H`7vLum(=;EQh%)p zrwdJ!b*F4iB>L(!&ms+Q!rgNw?D+~(2Nu;2V=P!!zVuJV$3toh}?Qzexlj|rMqlWFlc&Ltw{q( z0*5w<4hY9n-EmkT(SrUn6n((c#g8b)!+XhN=g!)p9eD2)uW#n8Os7OMufmnmD(#Si zL2RPrrNu;!9JNnk_>ST1uHf)mWT;`#lE-BzWT_~uI2IgQ=sk%MslSp*5-6I-4LiSn zX{_63;Y#WJ@ktb5Dv#&mK%n?hoi&R35`%RTsFRImI#`+NBp3TDMBR&A>Vl`hq#T5- z?E?urGwd4dsB<1E%C#oNQ?baqWI&qK?E=;&%w@e&Lz%?Gl386^Wzr{VvgAo?;@7;n zi>9`_&U&UW>bI@t&^(>IbJ2L#ZVS~COstKkK*X|7602YqiARce>~PH$hR%7T+r;{n z;tBj>Ch#Xx>T((4Jcp@Z0R<|1jw&Z5=JfcuPE(6(YEL3(s4Jwzj_jKAKyZoxNyq!_ zZqEB68#1_|BQRVlE+m9oFU469(k1G7A@0H!Zqbhj%n2$b8H&ODLRjjSM4uUOi`rAl z=xR67VLhSlarr_>=Voc%7bCMQP{^-<{~)?BNzSVkjfW`Hfq=liNmZ`jHVGz-I@AvE z%~H24y#KX&=(-8rJ5JF;DDeY^+A~TmzORP*Ewnp7#|uW979pNW5wq4mH}qCbflD-o zfI!V`2-qt=(8FSK0-X#6Yt$uWQiTK_+-a{oS9>xe83j9r=f&h_?-g~7HN&ij^v;@Y z6*Sb%DyS;QTWb3v@a5=mF0AzOE6L6cWDiRO@dB56&2|PhDnjyk2RteOXF!<0(KY_l zU!c=V-L7`jb4yC5wAp{v_n%nZbI%M5+EdP#cD+n?wym=6)T9TM8~p7~qP<@n(%Zp`8!s8{ ziK!#FRK>Mt1kH5PI@1Z-}jzxg^c4km_;9bF-{La`^3UuD2QcpeuA9vG_}INIGN8N+9S?T;Z``9 zDo6p!@&o@N<*q?UvfmV8%0{h_cAJQ`O1zuQ^$@wvSDAdA(!fTuoi{{MR5|bGQ3G+7 z!f7Onq7elzy>@HCbhxbXE*Sl0StWca1X_GJhU}EI6obFzNpMFGt5g`N)|7e(vBeGlm{F^&#G~V9KM*%A0dxGqE-!fpQ@KDx zX4o^1i$pslTF`oRrZtttSohiOP?#Y?>=H%vW1Y_?GB8KgW3NAwX8UIVn>_)JF|9a( z42t(sOaUWc+AMLU=CocuEn6JWV5yTlq&g{ zD*aYU3*jc-UoR2lIp--qkl6HB2GBL>&gWI%nQ-CpWKPyONJ3xkrFa1!AsW>!k(7%W z0J6#`ZUV|AE$a3rf(g_nm*XzH1g4Eoz%lm}iE?2C)Wg35MHLX4j`A#(5{Qa*gZ8;Dp+rJ* zT_H@G?0dXOlUX7FEbMHgV9EEiZ-+%<*v()i0WL`(0h0)F<0;b_N-mas{>a`FCjM=E z3Dfo)2jR0-@dQJYs(L7I-?Yw4Vhl66*2fwbCjaS|kL77i9D+y_4d6OLsvc(rsn7nv#LQ}7Se z3}Kv#4OP)V^0W1P?9rl%ZG>$o4V8vY@Hbt$xG@PP6|1>DWb&HlJwIgP2^O>9T?0*eFg145KS?LAIOg7{>sR^7N;)Cm&_T0P$6VV!wQ0S*cVH2b?w6c? zm~Q>7(0~O(ULded;-C>@@&RmitS#yn&Wext4O=kp-~}Gs50C0xPcQS#Ofj z(rM}XfB{(|QcBZ~+E%CC=oC$GuNG)cq7K_&JIUu`Qb13>Reh)F4@6gL0)ZFY9mw28 zs;I){SINo@s#YIC~t=EoxK$Jm#1U2PYM@c}Tcs~~lU_o;2XP}^J} z``IuMs9kfl#O+T@bW*|}E2%CKk+olC&d$)#|AYSe2(W5x{r`dy9#2w_d$%}^^q~md z_%z=V1#lCOX8XzjtNyD-6&<^>aH`$BhE-|QM>XFjA8RMvX|L-b%2!bTd8Y|O`sH>y z=yhofBIaS7TeD1YC_%3yIRu;;;SZOW1~LBLwie?{mwtNUxlW4C>=Q(^matQQkCAgW zh1>9)S>2`(_f@1d&~EW?9P3OEbzwT_db$1~i>DJrit~pBUK(dGO~ZTpw=b}?%FI#Y z3%mYtN4_NpEmDa%@Ecqtgep2zR8iauMLQqWNXyad2qLdiv$KSwm7)y$ufr#LLm0K# zGrc^LG-rL*{)C97CIdtE*FigZKjX8igy}kPv*nLFKkTs_WHJ)n4;A~CgqNo~oF2+` zzTb(akH8*ZGPiL~@+`TTU(^{mWHDyp(49&c9w_%P7sPvYpNIWYE*0ftJGX|jUo359 zk(-^&NsS0f!9AJ#H*g)D3T+>pC)&>K2?~GVtUxaw$bFz*lB_^f2hVJLf{KF_p#esO zb@;Aq&55XAC?c4v>0xg!mFymQl6&}mXeY&xoQkN=jdLR2+>sR*)iNWzyO9*ySlGG` zS$Zhc;=D;pH+^oVDwcPU3VV>Iz6 zEsNyRLoy6{**Np;4+Z?5h zW?q3mg9-!^0E9U2eslpb8z(wt8l6Xx%+2}Sa>uA~X?kUVMKd5y(sEc1)qefdG$ zUSkO}JZ>s8L#;bP-D?iQn6(+CHdgJwpf%gxTSs;~Cq7hBa`e>+W^Ssv$WKVhFA(^X zfJazrv=eo>(;$)nbQOz!nW8a#9>8K_eYgr7Ss?K3IeW~9WG`Z=t+_!g-@^iqx1X8< zbAA5PmUQ;3Qq=-7_-CTe6ij(%RtWwPE7^RW6?HF;O{?izzCB>==(XLFL4lz&4n;0Z zzW@#H+F_l~dD(b+rxOHK&L3o2d=sl*GSk>xm}k zQzq;8Z@n@Z(>$wn!SOLO%+iEJS1yTsyo57BH_rqAXzJI_6Du6?5OLy z1SgNrz4V&YCC)6*Fe0`J)yQA~t1dA5Xf(J2LBnLRM7ymXs_Z?QzWLBPSsVuik$eLMfVBGV)RkN^-Jxw?hR2(V>b;M0P#A(MhDTA}< zpvM4d*Y0&{<5#oi9aJ=VdL5I^sa!6J*T#3b8lfVNov6p9=Q>|wfiaR=N4H?f6O!QlQbyvzh~v)Y7>E=gYWWa${S1*- z4Z_U>*rz^RSN)B9S=iGsqqrtp?Pa_~T0lqAZ997pE<1wY7v{l;aPB6>2?HJu2}Vc9 z%(>uY(!$aht>0`mlHxKYp0druK!NRone8=@*Q{qz9;pnQRFcL)y6 z@^68_if838P<$Ag`(KK7m5M2#;7Zj+!KNKGhL!#(2Y{1){PzaiYchb4aJubG3SHvz zW3!4|dtD(OZev(tftA*U!))1NYnv&;sTPzMlEb~WW3WpVYyU>^>mP0c-$1{M-?^+L zVhMURmT@#$EwNy&Vi`qDsH=+5haCo<3pU!4n2R>ZG&S0wPhzs)ngFECa$87rw6O`i z9fuZhY&`ZrFk?)?st7H&728lKn<=tEAzu)xgr${|zb`MD*Y*uMZSd0Z;wKx>w(1J0 z)8^p?9u82--$(4@0non^{hRE)MW5$ZFb65CdLQ#{q5MTK?HC9i_SSXmPeU$_S-c}uPUx0H9pp<;(S7B2%=EMd;Eki_j(8Dv+OWjO1SMEYzCVP1lEJzNc_s;1Tpfn2p38 zC}gi*)Hgb@nIIsLiEOVp`7g;nmdSx%F;J=(j}x?hx-Dfn_e^SQ>y|b9n~5)${~jY+ zO9}>jyk-VcViYy#Pxb}X?Hn+@`9rzF2H!KvcSYGE59W8$3c$r>cWmwVSSnsXVx6dc zi6@%(f^DykpUoUG#S%GrbQ_xD*9){#UrwVNta7MMJmR9JQheb+KV>og-RkLg>{Cld zSEk;|so@h0_4Q;qAQJNl7XC^vYw^EM`Z0yVtXA|u}6j|hFK2Un)f{39-!U(@P2NUW>P^}?mC5ln$7JDTi6ajlP(XdWt-eI-8gz7X!%4hdh}^{)nu1of644$q$gj+> zHn8%6qVI*9n*SPIAv^mJpAc89$9|uDL*rdb04YW`;OM&IS*kmz+u|F@D&~gn*{#|= zqE>~QdYi}`8^^vt$S4m|fM|tpxYE4&MTt%`cQq$Xqb%Im>!_+WwPiL)9;#sCBHKdi zIIIqOq>ajkv+qEjHI7!+nV_7H{HsVkpv7c z!qnK?jJmIvr&WvvW09jN~{Z*^4vq5d}5UQMOb6 z>v*xPZZ$n_%5XbQ9P&2nL9H~nQv*tM@mts%`?x-DGq2rJbtbnb>-8ELV@t*+D>+qX zt2p25Vqx9F6@U~4YeM?Coo(qT&KH*|Fbm!a(4=M60_j$u9P$D*mK=#7ZC>4+zHl~Z zw7BS3!8k^@jk=Pbt(Ydo}vDunAeb=f2A16!eUExAz6`^l3o;Hs)`#AIa4NuW8~(5Jo|sSYvv=>K8q|#`1SBeB(8Dl+%`L}i>K()#WPrRWw8Sa z#`Q`&mU9L%OPjgQ(@oUVum_EWgepi4NqvKPvuG|Vd? zK_Z)o5hU()PE7J*JI+f#|JQYt$4x|w!$$+|5#*I(84Lhy@=9Qk&P*{bL%yfzcIlRj zI1xej-^W}jPAf<}eTq1cT0c*ghdwgr>&JXWA95q&JR-&k?Zt$&Y_;sKPBoiOmD-Q^ zF2*z?HxnX*qS_|#HVzA$0PIGrT*;A4_u$Fd`lR6AXyxqXx{$b9Eel?;>}4$*hHmCE z2`))3AN0K2xU(a&*-Y5COYswIRB89-h3*X3d%u$REcKJBgo@l=0O79DQhh(LZgbnq zyXS=ms#4JHbx&^mfj3M#xS2KQsf8&I=#NkkwQ)E0V7U4`Hi-=5n{kf8I`prqEv_d~ zm*#N|n|@P($+%=l+#%w+vi#2-B?n_05Bc67x6io@Nd2VjHHc{9CO*6d8uI5M8r3z5 z4#iRqLr!4fMhhLT@JofrfQz0ia9k3we36BTRQX0JRiQCae6qR}ig(Oz*9OwdT-uS3 zT^;A(`MBkd`9zVtTH$rREjA0r=8~eYprv|~xC9ooVwk!#5aMH$Buu5Ei|Yjy1^5*b zh?s<=n5Cq#5r-k5Dl<*Mp_E$1-e>_ogLwn=FVZN>u88D?fDNykLjmM3 z88O)(a39MKckuw(xY$QeTB@66xwd*MSz(+m4^ zI=-%$qkE@3$$KU^;48T)dC~O5hgrl@Q^>4}kXG{Upk;z$kb%=;tQDemHC--JMyxg& zg=bYSsFF5A)0%QWCI@4A^xYIb(ayGJX&{|!&+Rg+(`-=f!YcaXRul{FmB73}5)@jy z(YZmKX3eDIG{P31*|+O=0=85`8$B(YX>i(2*HGgtknFY z=bma6YC?4azIIxH5$V?2+ULHZ`@=oGOw2TD>i1lt4`1Q^ILSPD=7RriNRSW%y!;)d zj_|&K%(ukk88aQ3hP>FG;Q2+Lkh z^D6-zU|M}~lR`Q`4Hm8N-z7{qrF2Q2kJpZ2L)95EELk-@0$>iu_R}{_=LwSlzx$3q_~)H35xcgxH>?dx zs((h3)3K%<{{Aqz6oWY%3aLdHOin0OmW4-cLZcGIRg@wxQTI2`A64|;p$dK(!&YmA zKgMfTZsD(&k8w}FBGM_2Y*0R0VqPg4>wpBva_FJz_0tv-1D0k=6Dq}1ZgiZ?RBaSJ@Dc%>5T9cmuP7GPHsr zBSe?A_eTn%tGiMeL5FBgN)jzWE5t`&MWoqT!&Igax~t}Fz0jc<9z~e$3JX+S$;);%&?RO4V?bnnfbH8whY_TdkNaLeXmw{poyztf=*?pjeX^LUMt6(F<0 zZK&Dx(j)3Pv?Q%I(1R$r*%d*-NuM=Bgw|#dYjeJj#r#ru%oH1L)KLI9HEO4 z6_q1G0z(vRt`u-4^H@LN40awW(#K!k!(x1d7rCv}^u;M#_aDq2(W3%d6i}M*5@yiD zp+PK*UKJpY|B2dh(ons0{f8>*vfoXMSIXOdnj_g$_&SSEzOcoH?x>w#-2IT`fj>Zs ztq$z+{+Z!X6TrgKILQ{d5kJHbvYOL@$fw*`|4(&71M>f5&sBQVZjqYW z7QKTd6#kFT%jhsVd)uKLPE{`toUScjZC;Tp8ZP6Cb)o>eDN`ehkk@r)v+O2KF3MV% z|6Qj^5k>KJEEO#CKYH`c0u_&-Pwk;;e+V@fSD?a9{*Cbebty#ZfNesznbMhCHvE2=X46xj_y#_*CYP@x~1ybsqY;D&;2Y}Zp6%(?b|4?|jP2)~i zFKh|%xhO6Oq4>-Xg$kpfr5yb>es-;m+ora1rB#n`rcqfxlr&c3ra2mgf@pbxPJ+a* zKU$aJA);AptMuiS&K$9rIg4)Qi{b-)L}Y0=d;y%Yq}NsPGI#tSnfJhT`J{8fYP&tM z9^tQP=l(k)19Rm4T?QB{t8R|^8tNwv^gUQ$_G}#mKO_9C zR>47HE^(w8ko+FZrD9Q!+F4qPSJTm_1PbaY?9uyG0RLQnCS8>nFAFnu|MSmS2`#Bo2=-BOIqq^hK=B1-^PdY=#2K zIytwcYbTbDg;p3sGogZowI0bRi*f4DzAuEhN*L)~;;)?03E~yNqovDxv|gBzSdH1i zN>Hw=ll-Y^Z8b|67Gu9$g%X}3J4jAC`n<%&(rUhV!(?jY$?ne{=FNDwTzpX`f!Ae= zPjDKkB=Hg=<|}ncQS~-jW{?UclRQz*iTV!)*l2I55lCYOg?6{I)MBA;QWZr{2!z}= zYdrq6<^7?;8-@}Vzw3*ahwUU*`RPK!V0Sbi(A3FA6wMS>bHCdPr(IfU&=vObrYYr@ zYp@aLXE|GZzpS-ma*{j^O;Iq$0$S&JYBI#GwF4_&o-j$D<7!Vh_rKTf|G;8pC9rZ6 zz13F6hme?5>`-%K*#%ETpXx1^We$Sni`#Vty?YCfxsY3)3o4|%r-O<2(6(9ilUY0w z^$q9$lq}~U1+_C?x{-OUZX=DmtP~@PRr-?c~&p4vTw_;t0 zeik5#jhf%CFJULtW0U01gf1EvKJT@MkgV}M|LFJecZ;M>lHbFvx?69t*%{CkB`YGc zl6kLsYz^ub*IJH`)8h8}S&3b~dJ^Cb+A)i6czW?wot<{vo;POr(0sCt9+){9vWUMz% zPuFA%l|%!e?uo>wnpiP`Mw2jfk)YJE;>z5cC!>!f=SjUG2&+$Je$_eta$$RUhX+N1 z<$na_Y3dz!tNBw~@-(#qU7^VqJ zu$p1?pkQh*H&(p{EMi*|i`j#@Ok!6a?-7&p`v@;s~UOGJRD5L%&Ud^Zy$s13>UJ1)(I(vW z$5<_7R9!#-)s)p+Za*%Z<1Iy1R(3*es!;svRs3L9qIL6%Uo(t4T8Cpw3GkT~FD(yn zJj7_#W6)#1r0R!ZChM;n3LX2lN9pF01OP5Crj!o@SE8_x96}Rra16i|0^87O*`1@U zas$3pYwymy?JJri=rmW@0iT;AeXahn>lGdVMx8_Lt}}>~ zD#$k~QJTVuoGoLe|JyltGQAR$12Z9X&vk2nY|3H_30fJ7YSxCc{1x-ymqmd|RRl*G zD8%hhsg3j<`O6TmS8+*Fn%u~)OIXOQ*gbu*Lrzwcq!!bY4D2ESho8UFfxK>696>$HY^q=+w|{0FYg zMo7(*eqiHkv`vKh3FAnfkGk_3agN1>;ABLS=BEz?D$xq>7h##nIH8~{OLTlNdbPL6SAmoUf*5Av`?5{_E(Qh|m1&YvBgivLRJPl!cl zYt;fOIB0knKu6zInQ4e$o#&u!P84Ofg~0~6mcMp~Qn0E`wyQP{Popv(JTvM^pvmI| zO9fEp~vvrFV4C?1B3B&j=+qxEH|u>IeelBvbHBZ+7n- zS#zluV2zG@FpQ?W&ZyHCt|rL1lzGGo6=d1|Nnk@|CI$OItw`-rZ>y_EASl>r_SXx& zo8bmtoTZb1QXaQ9 zr&dnrB5PdXGoP(3k$Umt+Cu{-?x#Yu5Eo6`o+;s(s}{8v71&ju$2vPJ8^)Cr5_;N8 z>=p2ZV>`$5!-Ssc;IEYFiv{|bv|dTT-!0CM!7=%_Wmcp1h2b{o)WfmZrbT;5ik-3- z2_-&Q0$Y(%jc5K;(Z}%#!OM%3M!1vrV%>VS6JT7vz+bz(0n=4`N$vT!Ru{46faL3H z6bxRve_UsKC;Ji3PZ`$FO;iMNbC2;*~Wx&FB_a1J|L zN~@;w;6-)kh0sQwGvF|lO`-o|GJIy00_ER3lfg2> z^iY1%+;|YdSV$FaS16a)iS-Q-u3b&)PR2Wi6m?6l67?c4j|QFiEa}s_13Gfp3r>A? z6;*e9HMI55m4=XB+SN7&_k(2JWQ>&;gL&D&8T7BN*Hf7C)?@+@R?Tm9(X?}OJQ_Q?#7t*>k=0c<_gO?qBJs{+zJbf{ZRTv zIC1_0a=HdMc7jD_1%?`zdtgt+NGxP=_Uc_n*Sq5YGZ$TzWJFus{a5mg`QEtyM&Eh8_4kRhX zB0aQuXkVUerl!g6wZTAMJum4h9rr%)_?%#D>%lD1+12-f=jxb5nMf*u^l4BmH+PcG z8=l+1k9+s#syjj`!|Uk-xc|~ryxMy73Pv=0nzz-Zl2i`D^V&v>glt}Ba2fzzmIaL5 zK2A$Muz=}JO^M~RSVHG>-1P5?Mc&ok1)6r(v_5d^Y z2ec>yi4gX*2pu=eSNKr0AUOayJUU<;Lw56@z&TipaY?Fe4~Cfbaps0+hk;3`)kWL&lS_y> zxH>r#&^pAYwxOSL29(F8k8OZN+MG0d&0^3)ht9=Ci@g3-pDHiUlmM!21WSbcHLY15+@r z+7!^lh@*1ddvzgdY8eRnusa`t-eCzO8i29GEj-=2l_u&)hAyUorRa|iPt zO+4- zCO;ul%vr9?yK!A|&ahlRJong4*P*=j=$706O)-=@o3P*MT$d;s-0{qZKgOe2<2`s> zw%ey*@;_kL`RBpo)ibAc{J@t1rF@aPuJxXxfsS>PuVimW5* z9&74b<{Fo{rP)-zNA^a6;wvfEN2p%i!hMyKhHk-j<1N^doJUvq^4F3E>e9oFkNjzW z{Et$G8@kT+z4fL+n-P)Q*|4E^zwWM{(IM-o-4g4-n@Lir5F6h68zxH5@bZ|t)Ds}$ z!p5K`&uAVYlXNX1)@|jSL#@>|+1B#H1qQYB{_poJRy`yccETPuT{kLO=1n6Aba+pwx-5@Hgei#LOhjSwU{ilNl~;25N{j^T$>wLD5~`92j^u zFVC5sFCtvHIr(Kt={@>oS84nGkJ9=+gcy0YHfl>9bTRz@SdE1+N6JJ3s7p&=t%H#a zE;f7yHrGzEl9Qg@z#Ni;_V;NaKJ!v5xbrpmg7l!reql0paHLE3TaQ^D-cJWpxkip3 z)c@o1vP5!$#N=i3rM5&gj35@Y1(l55_X8yM7DLcXMX!X{!MO-CRx=oiIcK}}3_?24 zZQdwc+`GX;Fyv+2BqAvI^wmEc_n#`Zva_UeL?*myA_M+&OOD>PR6r9Fv*8*Tr~#rk zRookj>g@-YPr_LY^n`8p8Ra4jnjnvSeHiz^ocvjH1zd^wJAYlKV+9SeuBix$UmuwQ zXIOff1FJKp@z4C;AJq8wI9X#z)oKi??Avuen}nK@b_1v8)bEGP-0RKiz)QT0n1|Gj zdTDl0PSD0vzM6vYe2_qdWuKhG{Ya|$^$@knoXa+cC-5e>7EPc~@z=$L;9F}K)J6G) zK^upU`AORA;mB66kg5E%-ox@;pjeNhQ{^-T3m7dkb0G*{V(gWoqEy2^?~mI}kNi2Q zzQuRmZ)1zTb5?4If8-OdxLOS7v>2`zJ4Uh<$^WLN!X)2Rin8bO%p2$w4mY{1bXN3K z?zGVAB=t94w8yYlDOhi@0j||7Z4U(u`7bp^v!#56B}+n;iQELXJfQ|GIB5PXwgcHLonX*X{qLiT!(z{$+1~zg;J;Fqp)UGAk^E5 z9bqzt)ELwJDR{6TuwXITA?4`i1eENb4@POssF*p3`e|_=b|$;D+&jjJk+kRAaj>Xt zl74o^^S&2DV|}wjCVHAl;K|+HLgmbd-4Z*Sg`v05294FY zdp9(ylyCnj1aMw4)huI36NxoqoRWG27yyDMu~|YkzM>;of7?wVUS~?!m@}iR)RJfT z-G@Di+;rVvAn4#hYaK%!#2QQR+EFUt#XYvfasERSINDzWg3pw5K=iusmA}q0#O1b( zbn_aVm0j96lQ@wDPVDvjkN0E7Ou6KfxMbzsCpls zy^?s%?Z%4$5g3*Qr(>cfjI4b3xR-!$ut83iGs*^kQiSu3dnfhrz2B-4oowxO#Q&J%9nf(V))zzL#!Nb*^a^OFCC4)3`tP}jEEH5 zX5cMgeFv{;t5S{+GjBbHrHJwP8d;Zl6T$2X6B9xNC>sRgFKPOvrsF6v@&EhTA6Gh+ z0BJh8H_{E@lo-n>@C(X_iw93iS6B)i5MSX^!hvW>=L0;OTpzt&*+i@x&Wsc+$gvQA z`tN1q+pshYx!LWgljlVV8KIjjDoSA|Kk0tUS>cVSn=bhK^ps2Z;rUe89PZKXNx$B_ zrJ8$x`5v#{Y)PCrgvqUm*odA;t9<0kA3JX=r++h-wxD<(27kkiY7#A&P<64*&RD{Q zp$|#bgu-KkQ^`<#1%8YcRwO_0O-WHe+u73Ai^JWP&!+yCa@`IdxOQEcb$@TDMZ*2_ z2pi;BanzspidYAox$}O)p`i@N$epxhTK8s2M`$UfGz(LLx|4^THU6NGTN8oFM#`{` z3bprziwJ7)T>02*v$z|c;nWAf?~_|;+OC?f)^(#P^%beB9Pl9;)n$o@rbLaL6F0*} ztwGC`=}jRsi*Dcmna8~3$BjI5fw^bUq#e)^bN1xE-^=gb0psv>jfmXH!q%kS6cJv+ zYNjNO9AXHgIl2?W`gjunMRBaAw{S|Ja#GU9Mf{C5?e-L`Q@=2nOppY{H-xScfQVDk zSxAAP8%{L|wPfoDQ{gyIq_GaSG$_}9P^%#9}729o{jQUPKX>M)rF zhyu!C0v5GMtPu;$Zw}BF)RVHJffJb=1S(3q{>$A z0i+Xh>g=m7A*tKloC0B&((34EC-M7|^`q5Zk(enOoQMp~ zwHMDCFPZ7$wv0xv!eY%=xUa3Rw7?H^SPb4%F?>lpzNhgIh)0EiFA-zvBF!U1Dleey zhmVC8iOEUB$I}u*CH?{iJ$UH#a4gqzu$A3ORmd;WU*m8{^u%_{C2g1f>DCHQTVNZb zwio*PF-S-e^ZftrxLTXeym8YHG6h6$Oba+>3)jT|Z;vzsO(PsI1>?z^ZK#|SHQ5t< z_zrQ2T`zlyT!S8-)O0G3Z0ucm88chkL-14uDPU$AJC#V$e}|$Zc4tN0>DjPa=6t>-jj1n#e&zOq;hED*GVUpNcB>J?Oo>;}E+**Z zhdb$-B^*5gD5KfM+?#QVxlv5IJ(WlJ#YOPGH@)W|?{NatFe7CE(ss=po}EIjTLMSi z09IWanOco92Za+BABsOB8Zr85WP4+xUYmb-(>|iC%qg_s<5FlwR&R0D`#6Cap|`eZ-Ezid;f-TnYwp6SS84uA(J#a%|5a z8ArxrZ}plrod2K=3R$n3;pX7z56=%MTnM2nyDae<91ux;ta-7UYN}`P*0;MAfv|>2 zSA7)xy8c&&UH3<{uB2%#z#r+ud@l|gJ)HFFR7Mob0;@&Io%%zt=lune#TBs>-2(vS zfBZJU2AC#a_*zF$MJ(=5#r3hrBu(ePud;jVEs?fNz`>udCJh;%V zC)CpbKSsCt*&kWc_2&*@A`XNR8iR+Mk!yH>|1$Iyujayh#G=mh)6oVNF>lDnBac*> z1l7=pYZ7oT3w1=(z!hP)vhCEGL<3>kssk2A7rw;!7hw6Cj^!sz@BGUCo#A%| z9L%~LxjEOnAhd%;mj&4p&B)Imf(icHxtJOqpDpu2Vhm~=h2I7kY(=Srh+*jjXGa#ETvu9vC?S8eG0lhDqvGWS4~_E|G$7KPy8p^69GE#7%+e1MT)qV~+H5 z#?QzfHpP)%MXkS{h{b;m=jCw+Ch5kXri75-e%a`OXL(8ZyiwBULmNJCO(Qge`1L+s zfFKFQuLH)5owGsCQqob*`XdrU%|9xvCYN z6mj(^9WUnvX@Dsx&`X|K-7q%8Ybm5Jj6TSAhqlRp`chS$#oTS_4Z}QX0q1RpR^r1J zqcMognLQPX)cUy0Vvr8L?jyDaT9}jJ;&QpHGti2rRMNc9exDmH+=~HQcQE~>Y5Q(O z;^NuCdsrn_tBXjwyR6)g0^}Q+HbmOXzDGLsS0gMI@J61fvSO(k( z%+qcRt>^`Wyph`F)oq?_G+aJAzB*bCBl}ft#j(-)k(1Y(OUlk!O!eT=p;Olzs#V7) zKB4jWB-gK_##&ygIA$(PV_FoiO>?t|HtwM7G$iqNQFR+9lbtyyVaY?d$LE=wI2nWH zZh{_TP&B@AjMR6X@?#d_mZ=iiUQRWVG98b)*_rZwixg4AdQG z)#&dyy>M@mb%(lboH5gwPb=>;2^V-sg1Ctw^l6Ns#P%Xi`~RA71uF!}za4sG8^v3P zqkiU0-`trNNF_s7)MPYUd74=aYgd#qZ<1-QHEL~TplLa?k$}jxya?k$6H~~@zzcTJ z{;RJc>LJk80*>RwwT;WR67(hUeh1}@K%wsC%<5?CApdoQ-VujMOWdx(@(<+}^mza7 zU1aGYmI`T&ad=?}Wc3B8vt|#!ImPZe4){A68>yicPEi{(cfh}c>NM=}bcr34v66_u z6+tU<7teuJQEJyr6e>-k;nR4{=5%73GFm7(Z>|3LG3|yb4-BImXZ0-D zFWSy0h#MFJ)LjRbvsiD2aPW#TS=^VNN#|Pa(gAFU9OVEu$6sJpK z%rDq_F@8WcVbeP0CtKlK-B?L?$oomJ`P3E=Go;g|j#oya{v~Hq{k~5$l)`I7<*KNC zJh}ab2w^!w@~D~L_layWj-1m$iLO_&bV_&~yyO}#N$TZ0F4TKaPYGRK2*5Rl5|7ex z;=o{NWjAX%JE2Q$%Rpm_z~ZsbVH{HqMI}%HUm+UREs74sBMrbsfq(?c9TG%X zKPitN6{p*muvx4Yj1@v%fzA|`ktIMq$uQw3R~r3a))d}S*Wq8@^@M3#PKeg?UL$UW z3r$eMDZpL@A||~NF6{}nC73ssfWp6cM5<9Xi<1dPfm==>P*TB8A#t99rOIm?L~ac# zoeEGk1QBs}QvsB8&J-T@AN=E>@3=c*f027Be&IfkHSDkid(GT4|k4 zg`8S`nYUgwod>|DOO*x8-WOy%8jJ#2YcMu#7(Ywq{^8Z>yV zp0D$K50LmkxN^fkc{VW^gA>@$Z*t-1%@w;~m9$MzU}YaFOBbq0;F^>Nj4pZm+Ra$0 zw&goa{?*#YteyNJN7sKXF}~9%Rrr_!{)~H+`i7;~IbDx&xX#|ytN{T%eVE_L-z(3o zLZ!R?l$SJfUpq4y{6Rv0aIg*4@DE+ZPFlH(S$}F(2yz+gl)sq0G;(gM&>)mwjruFY zc<4)gPg7MEw~acJY30hKr3+puX5gvur1s`|hP{gw}c&v37}EOSr}Tczvq=6Idawz>ZIu* zKKK?@V42xi0D+F>X)-)7`pzZNPmEMotzytJ*VH0Lb|FC1X1Fg>o!#My6f{mAYYrl_ z;8{vWBGum2b3AD@YaM}Lv>ID4@05YBC)F~ILSUe6wj2I70QNk}nBOt*{P9haWMfMu z=JHM&W9*zeK1YG*wPrl3Xy&J2EmJodA^ki&Ta8=$(=(hUx(~cHzaM^<`80Su(|6<+ zM&En=6*1R)lzp-_T(B>}!L#KTW5j4a|9Y!A)<=qFA(Fk!{{8l1ypb6yk-)%@PXjJg z0W5!LGl%|r6TBD=$WgQp2LDmes(=r1zoW6={~?ET8IA!I4@V~QxJ)u*F$!=U3!(ak9jkfiedVj4pHS&$M6^%iKx3>Rc~qHgc4)09?+bhY zL_oX0=dPHy=n_8s0j!bAy#=r)b%`JQEM9hseTM803>I7~wS3}kHudzj zTqtq&70?6OCjj@jmP*DKQZ;{?o$tTEun}>6E_YP%Bu{}!AOAQG-LOkn4cvsK!b}Ue zi3S3$;BL_5&10`VF_p~L*Fq(x zWxUxgO(-^vIwBG?&)jn@41{h|e(XEA$(u?v3PI_HOOUb7XGxPOA+$UY5Eh#Ed5xQS zq=+E;D%Vi=-vjrY?phU&g;@q&?fGrK``?vzmP!J$!}$bZeMu?cbH<IDz=N!5iz&E^!=H(nO2Q_tz(J2!Veg`PZBn{UP2HLyHHg& z+fEbn-#ljZQeMn=TuqP?F6g%<9BM>93jr}pApyFco0lc3xZPL?Dw0)i)!7*G$S{Nq z;JCwQd?M;6>3~H7`l*|(i_=)A!Vu4p+3Jh!1If~sr2NfjNPv+&YCA5&AUtaHhZsVF zZu1+@a0r)ti&oT2CCNZGxJCWnx%O;M%x*Z8Het~PS*2h~{VRb$pVMs!dlA=xeY~z4GK$V6VpF=Cs`zd(Tp1P)ZCLek4-)g^NjEJYZz8fw|;MEO~cB z>cg5mdT-!1mE;#+B&KXWRk-cS6O(xMxkiNDWe+%Uc3^uk5#9R{PHc}e)0bKR2EL;3 zv+MDjFDWmToDKG+w(alD8lh*VewxSr7BFNn6GB+?FKsqVvt!Dj4rO}5GaxjmYdLEX zeK<|A)t$eVj{Ophx6jD4jH_G2#v2bek4l=%y|*K#$(uXJ0{Xn`#@3F}Z3j&7_fpFo z55H-zO2}PTpFg_@5NPdo2O^T3UcR$eH+c_xo*W20baf@<{kyKZ%J%8|n01JhPB2)k zv(=G$F7_^+4_SE^B||W=;}xptN~aAt5|*(QO;YO0?{+x!$F|CG#~riL%-HQAq?EKH za-?e<4T5w7!%F*KU?M5>0tzL`ptr(u$wu|ojRaO)P&T-@3N-P2SRv`TE}3>F_`&~( z)2e=8;cQnuEVbr(#O|@2fi+N8_M)Kt80jxW`_U9ieYh_L+An&b3Ak_1J*I$rX;8To zCX1p=IDp-{4~(53>y{Ku2cv%Vz%Fr9b2tBKew5~Y)aDzD73}2=&6kubXF0s|fh( zOH0^oL-%CY)nWy=#XVgHqcZ*2eNNX<`#XJ(+wq`A%u&e}&>kW_a(stkm>hFWxUb*@0J+w`b@>;bw_)Ibx%ku z@AdjRuk&f3?MBk27GwvPf%;2@pI9(Y^9EOUC3;iGQ&swtsC2~!W5$wdm1yi|>zf5D zXLPe}CM4e2uk(8U_|9bh(5*A@9)UC*Qaw>?v0FXYSxhgBx(u3s!p^+_Vw~nu<5UR# z&O0&-w720^+4{y=UPK+F9k$1)o+d+SQiozKa&q> zLs-wl6nCQo5~Ap*I60X`Jv4vNd}zhEPb2#gN6~G`DK?Vaz_pByD=974pDyE^CfQvG zgs-Ey?u4TleqvGIMcG}jUoGankSw52y?guGiRe8>Czz@O+J+d@6Xn7&o8RxEQ*}b1 zf(Tmjum=Bv@I)?~UyRxPp4v`F$iJ2zwe@HXa5|s82R;s>qwv*Dy@+3U+t* zX}21m^l9U}XLz;CqS{O`#TUfwT|#M`b+DZ#0yWT|t23f$l{KA)Z1v62Q^eF-yd34; z2v5+sJSG+=%qu=(JzvL6xw~sS z3A98JrPZj)160*8n159OU2cy35&`X9e2rrDiE%rxI%X`D?EBCq*K^fPoBk4F+#EX{Zp=%2w?b!)F4$O~-y* zS9zzKl=YQF{7!kp8XO(h?2rU7;^NZMeAU!Nn@p-777=;r?;oaLuYHh-%4_Vrv%Wyt>S!*Sktn zm?M=5jN@V%Qes*KV$N7^7aV-bev7h$42ymQYTC|)cYQYrNx4<$t%|tm)%COKW~Vt( zM{HSt-Z|CDYSl{E9#oJdGW=kvj#79OgoZQI+6%gUryR_E+W9{is;Yu$cOCN`D3_t) zdWGF_@GGC&;SU;G#XfGO>T z8>BOmMx|p}$f>P0p5M+;1LbxO)>L-Y#?%e)P5olB+`(-xB}TQ|!O>eBaic1G0;tj5V?II*nf5Vfr@@+Lb2MBbhkbot~aUC(8)O1 zh5FJ$cg8+hMOa1iElS0>-VvxQL3rG|E`YlvR()BLpm5E4&WGwnh+n$yp&EKs5w`=Y=JiSBy?)AbMK+E!#EAO zFVmO*PJ_>{{dY2(PX&&*_8VYKRI0tNbk(t>`tDn4jm8DOvN@{cIL#03_v?nVo$Z~P z2OAZLRh5JBrSpus7P8e~oRt(g4Re| zM9ITnq1V|!%4>uI3&H9ChIuC^@~eR1g7-ybytp^UqSx3cd+2*MY4~Yz1i!B#SsT}$ z1Wl^Ksl9{J(9>%~;-&>lV4PEqM=LJA&lLq!%z0;$@`K8Gl;T~z8hV_ldb+O6zNbfX zwGB(A4AKkB+RDnhtPVQOz%ecqmJ*CwrK9@e)`ghotrpbU4ve?ckB;uzgwklM<5=vR zvkv1JT@N!%TXxKPrp0bS+Yp1%z}T#q%)fO?FPyZ-EWMjAKaWV;`$J1LNvCDa z8-@}e$eaqAABDf2KZwVS6y{Ff0E-GPnnj1~DJ$}1KW$9JFUuUolbb|T@k)Tt;`$;& z-8!D0U{MqD&&C%5i4bAmcWE7J-y~8u$>ht6`{V-Zz3RJbV{;TG98D7rGTAz z=IW+^;falpx@SQHfSxbNOK8w_8sV5t)FRo_?3f)@eRfPJx28VMqB_6A^bW^2I$L1J zc4EGq#c2J-vF{I|8}+Q>P>uOUVL^86K7Jm-CP?MPc2xOx)o+oKbg@-my+{Vt%Dc)y zBydhv3j=KV4+GxGPObrY=r$`P7Hg zCU)vSOrROpl%b5&_6e&9N^;Z-CHB&u6T0q+B42;n17WEgkbk^+Eu5`RwgHD@t&0%+ z+B;SIchH5AmIwftZk%Ndg)n}^j#k~!(RAJ8TJx)U^udRn8~>Wdexekzlwg2D;DPcP zi(nKKopn0`^QI`2+diFEFI&!!OPS}VazWr(Zs#CY$Ci~DfJCXSw0L4^{iLtTlm%MD zk3&3Pz<4(SN6LxD(dR+fMqO(M5+ah^T6%whPC2p4jH~m^cQjnG)IzHaDfdN$5qCan zGf6~DDeVl-wY-w5v+1B4?o4hB0C)C=W%}$Kt|s|QaKj+%gvT{eql7;Mhjw}Qg1J^u z2@^o_N!mOYYiCAf@W~z}wx8%Hwn_-4Um1Ug@9}j-6$ez>F_+LJM5sT=Y!L3503NAh zan{0$4F(1$6_gCjTB>btBgkj9DCsCAoa`Ke@p+-LV9lG7XU{**;;ov`Hnl=os5D$= z$oH~T6*vK2C%sRk_KHAaaB}pN*BoQP2q}=Do;Bc~8Fg+p*zGV`5wt|%haJs8u!Z#u zhEovaXJoJh-%HH*TQXz|LlX?HAp&R?Yd5^ZZ??INn}VULIzOH5FZ-&+*F)=V;!(`^ z=DvAGj0SJMkhTn^I_yy0cIv;uR_^oAo#<7kH!84WY;KRG5K+~-1}Zz z{fAo_Y9ZK3`tmydqP-cumPnATNwNG}{ke3%ng)Tg(agr(Lh;kjt*yw=UjFPP-Bb5fS!-BI#FLm{ z1wPttt2a`+$#%n#<@V(I9jukjFgL1*!vwlhPo@R)Hq-JoZLN@*ITf8F3Pyw6qryeC z2NVrRxU0N!kX1>{4<~bt^pu)aJA2h6Ysy4^Ws?&cxr;p}ldI#_$H6rL6Qlmj+HfP+ zJy(5Pe9IrkCakFuS`_57Svu>c24ML%X3jGm`PM~6m2xB4^5fX+J_F8p5+bK_U6-q{ zOfR}})ak^kru!rdJWu<*T)EFU!kP>`!Wwlp7WBNt!TA@7@K-`3anycD_yFAk9 zhTOfrxxn#570DK-+@fpP&H)F}VEd0~L!T261@VfPa05 zge!lVkG{#^$iN7xOM`dGIt6+lN*`(T#;)K|#Xh^WL6bc{lDF9v+EGwzdaQ51T**KH zbbBQ3(58V1oBWlyDU{^4Mu0;RNKn4tOa?F}GKN&$!)gND8du3k`NhDOzFsW%wq`3z-sx&xQ3Xtq1eRuGW{|&G`OaaEz z)*^Q0rGn-rnHS57G~d5$T|IA%#<@ynHWnjUA|prTQv&iK&YK_HSf5HLdD&J#;*|ha zj17X9%ZNwQ3H!%k?NtfLPvkXKF>)j+WxuZAO->@X{evGcsehzTnvJsLLKwJOa>OI4 zW10E+tPrJ^jyi24?jl?Ms9GGIZ6*45POHGVE}sMMk7R^4hBs^O^(k3w&s7gL7q6v} z2mGHL7~7i)3*FZ4z?PM|dhG@Clk>@GCK}XywZUoOn)_f%4S{k9v*jH~bh#7u#TySm z=lo-k3?1-a}YkN;vxGFVuccR|L5Gf4I!8Yiw2X0JOVd6N{p|nR67YYYJLz84h zgw6WBfvX}ma)KybayyM238MFuxWNPTfzwT;`EX{gEl(0ML2vJJ>U|)9h(fd10b z2enG0yvOB?WhpKBVtp;QZk={K+I5w&8ot4q_6Ab_UV?4}74m8MROmuq z&ZC7iY}#j3Dmnohf>s-BSJA^t?=U{k&jQ)N*1E*#!sEhntvM6aI!$TEwnwijtz|p@ zxTYs@TKy}siH>^N(HH&(-Jpd~tghVT6aFVZ8ht6xwc8$C^oDY!-oG4#@EVSph(B|! zCCJ<^S6n<^STyZddmA9tIL5!pBwfb-3P(JiN;l7c14hvYmo%dQ?9qNdkk)F|8jxg% zGzvx{i;|6SC!T5luq5P0f_qCYB4Zl>sukT_IQMe~MvSMV&pk?~*X9X^BrdYYd15y~ zr8|njt?HBP-_$=KP_UkSnNt;zf6$CaEt<)HL0}In{z(v?Edi@Mc;7U~9)@HC^XDfC z3?k-ld4}EJRdP^7HwYbt#qX?5d92*@d&5Imlm5XUkCl<{I2^DkF+l-4^NWRWAmNVh zy%OkS+Bxu=ScTz9_(c^$`R{Iq_ab=XEO@sA3JlrfGl$1$b}yl6-MGu zG>x{v)L4LQJ9#&q9komH=l=XC9JT@e8fwg`7eZm??{z*2CICR`coNFjPulv^(@X9kUQ|Y=+-XjIxoPDr@5RKm7G+yoFGs2ouhL8w! zM899CUZ^{Bt$)&<+P@Hn$`Ah*n@xLu(#P}9!6|Kc!^dK<38s+0Ng+MPS?y%`vl;M! zoi0yNgN7c7HfNX2fdu!|rq)9Y_R-KI*ySLcCHI3P=J_CwF>ClZ9~;NSbsDFT{9T4! z4zS)bO9n=Zuz>(E^JhRDn8oGcad=lnyU}jB!e|CL*V@3*w1P8g1#W`(6qH#h83sRh zhRcjFZq?XMtv~rcMAvCj)XmuIT5xf`mEFFN&^<*xvqUCC2I{~GThUwSn+~XTrq|>P_Cwq+lnb>`DvfPLkfA0=!qXylndZ%t%FzU*+8Hnu03XvELi! zjbkBQY{L;QI}~Z-gjr zZNlrCn%%?j${Q2GGXAFOw0nlhG}0RZ6(J~1#dR0u(USV%(r*}nrvM=CC3>>=`8BV; zV=lcBk`Au7v-ZNt%yYW$?XM&w>1`(UrUt3_Mr8arI?;liUU>eyvKs0o4d!Pu z1TTtLs@mh2HX6agl)ll%vN71WtQc#eJT=edM#+iT-x5gbbbV>M6pu{TRBj|60zEvwrG zWpqW#&4+-EHQ~d>tk*7(=XVfsZ7QbOR?#&Ds9SH`QlWn;;&EUs=jk{fw2hWsj4S9H zU;XkjGT8jGaC(&${f?g(ZXD@iuc~^_-OY1#o#Z`^g3$zA1}YtFyMvc?R)N8Fz7F44 zNFV}M3th(xUU0g7ve$Q+*|!$P4!O>&O!c{>fr!JLZE0N!i)Wt|~kP_mzPNbW^WP^WpQY1kVo168C6wT zUkbJ9sp7W9sWtM#V{R*Sz-!9@S8XOtiv#Je>c+`&HM%VL>3lJqB4j)tOpL32?H(RL zB>twgdTf>$WLf{&J*NG=esTu7LarI%6C&#u*!c7wGUCXnj^N*1V9X?6C<>-|H%NJ@ zmkV5as~O2q<`3h^#7oOS>hu?e5hnPuwE4o?lTkoQ2nd z)frGbF8NRIsCI_GO-xB18Rj9lOu$*SXW<*$0@yX&RQ5WQN~;Hlbk-TH3%f)7KdNACt&9pt!m|*^~qnRAqGF%pd+v?xS?f z=nb%?%CW;>pPE!z6<&l!26Xe?+D0nEx9Rzj2>G|c4e|<#suSeRIHKXtOA6&dcVf#I zl$7}{T4uAy0?AV(L=mCwgG`n!@&!HGc$E^<4hq3po>-sP(8IFkeN`mTp@SAFMWfJatpie+LtiT zf&&7YQ?4Phq4nS%CZ;U@-*Q?H4k|E>K(t8g4^8^9SLB^TZ(nFvW1;~2qamd?t66>z zOyNSC8)l)fBO-1(ujQ|YP4Z7E%O*|iv~my>@yy__1nS4lZ#i{d*tZ-QrK^fahw2u) z0$GOZtP0GF5M$dpWaZ``C$#)N@Br6dx5q)iiJq5@zigAYjtkSO?>>xSt4D7AH%Jy7 zFuinw07QHLW{fq`1cx5)&FV>aj0NDZ>@PjBlEmed2sn%$t;$+JTh^^zM_lgRhKMIY^TLySq!1n*XOoC?ThLj}FrqB0_Eh!*KFb{)XT3~N*9|j*V z%gB$M?sdPlOLl^-1=MCzFGXsCAT_3HhIZ2YNTWehjnL4rD#`#!$o^`UdQ1aiS5;|f z4B2SV%ntH=+nw@MToQKhZ>~oXIZpWJ26x!PYrVrEH!mXoPZ5;_6uJ@CJdjhvxyd?; z_OI#KP}U}r6@C##h%)KUcnt$cPs_%AGayGg#VP9A@vw-+a z9Wo@a|90((Ju{+*ZXbHuKrH9Fa{l*mM1+W%gHZfRKY4e{7Pq9`b60sqlM+Diph>Ue z%q{tIfd+1E$f`#^=NtQX4^&7p4B3p*bq3q^m9RJ8pkjiCG&559aP*9+z-c_uu2&m- zS2KnZAfSiiPEs(-{7C4VMS(z48*7p6b1$O~;{_Ha<+p*W60&~S>=~!Zb9wXg^^ILa z21z7+>SoDhF=%9LytH8YCruVQVWxG)U1LhkfHJoQ87Dt}jdsupml;tv2{wo#{EvJ8 zS*eZyP$WYr+y393Rvg36_GKA1KwqU^6(z2@KEmfnt=p~#=p>ndCl>K%hljn7lPGs9 zt?g2ILUMOfDC0uq*qLPI3Zds4l5e3DI_Qj2`VquXJ1sf$G%_?yvS&J6&k(f+2VQU|9`?DizjQE>8tqj&K8aMY7w!Bpn$ z&Nk2}Lsl&ha~RF-XI^M!u2dp!Bhn^)LVktjQbZ3K>q-kLJEVkAtu~^2EgbH}5~oE+ znL~**d>fn<1+xNyv-(Aog-dk+xJo4Hx%DO?S;0AZE*iS&F6?_f-Jcx>fRkRu2mItr z(8Y#<7EsUXJjprx3DWuTt{lUKn{W3p&fWVIY8zz_5qi7tjiTwXV`NBrMU{jZ3=qQ( zPRZeu(ndlCzGW0xXep?Fz^Y4^{`HL4Y`!rN*2C=WwQ6)hNc~)(MT6-n-!1<&f0v_) zf^1WBlit0WWlgR-{dXA57~`R%vK96t7KS}cS#zJsuUuZ{k6kc)m`vJ7Or>JC@98VJ zS5|jOLaH4uSu%1;we}HA5T>xfk_?^;8oDd}s*00E>j2*N)JDBFQN(z9x-w?n`%S5u=)`d3AkvG!44D&tmxngS|TjOhP&VQtNFYLn!Vu<{~+tuRzN zQYRPWlmfN~mSHzNfj-Y>WGoTW%ZC`A1$2>{FvV=W27Rct~yW?Ds{v zLigaGu}1^hBDE2p zwVhgT$~So(H1LzG)|pU1k^4vni^Odp(F7A$5B@aq3n0TWTf))lQETg6-k zhP^DAjx4oCEV#_1Td`DV|3)HJwnrl_zHp%c;7FD4`@bCW*5-NEdPngg-`TU5^7okf z@uEwENmlB`^loE?NYd8%dsO(2bk4G%6OSl10GG45u5x^aewT!C318kg;}R7P@eBA; zW=Wfd+^fJX9z!9gm_yS&S(Jd@g6o={M`$b>Kh^l2tjaj;wC?1=eAvYUM+Xt{Dv)$p`q+`lJWZ$SAtRZH8?kBG!w6Fs!A4nC>Uy;t`gJRF!=S}~a zcQj;|EGV-jPn4Z`B`u|0YP#4I1S4~Vg&&Jro-yN=cXr?TQiU5{%ge*wVAfO3M<_16 zr_r_{*v`&Xj-cTpmaixw@C{VQqm5uq^-wU=10%>3*riT~CS3BH_WkM5BGt_gkFdJ< z(@TG4bpX~}EgG4xaGdq&5Moz4Zd4e5&fcz48!MC8?H!k;-9ELlvN0XwK+8S`RldPjGt=uAzJsVh=hKMkXf~*K#-fY zoJi-C)4wAE&YJEL_!~}deA(X5i3mtwU z!lLMD2}`mAhB}&@dJ?Is z%z>X}!j~Iy;?T3rmw@A&9zWJiwLw$&L^UF2PooxxqmC|?_JrY_XqmQVeqR#bf}Mx3ek5StovSosyzW>e z5(1943WQi@UPJGKECf%&15pqZO77wG$2OJN#7iMN3@D<<4yiaT(59YQ&#>OnedPM@ zXgjjC#d19AzgbM@1&f;&REU~K;i=1fdvF6N3eR$pdp6)L(_efm6L$RnE>P{gu!M?_`blC6b3*NM?be z-!?Fha1>%WbFvU(bi%g_nyp_URRZnYK_FYxz_*v$#F0Pk1|{)o(if|Bhn0YxS9gWt z`Y3LRKK7y1qd(h6S{kXig42UA8oxiLEEjh2nujOf*>Tmufi82&PCPP;Jz2}n zvh-%od3a@)mp#FP=VQYMnSlL&D>|Gbt&@$(z#H^c%RuwHp}oQB4NAC;ejq5^-&6 zxm;pk@6Q0QQH)r=3c&d-p2T1iUPytJ8eA_qoDM=?M$dbw003Trx+10pAsW>!k%osQ z9KjEFwz3ofY9Lx!AbYM&f(E~vlxg<85rpunW$f4Y>DEEH0~(fkmU4C-;=4?*R2efF zH2)p3c+ga4ldFb^yFY7g6l$ZMmv1BoGQ_k+2$nE}h9Sa~;e<-@Nm*7>h7|9_2o=)= z$O1^`iKSd}0I*b1T#RBs(6S<3Ax6*zsI|r8KsukpBdsTaaBL}Ivnuswv=;ALokcm^ zwM0a#{d&I~-CR%30%0bd7kPOlkoi*RDJzK-)jQ-3$R}x%P9o3{W~(@f%HWWhN=i1j zczEG2L;`N%n%0}nOc=`wfPvm&z;_35-V44^E1?AsS;DPGg}xA#iz~&YCuM})^sd%QB54lM2(2`Jbkjc2tjSJ*632&b483 zEtu5r7S*)C#}>eh%?b7c%SS5U@DOh)(rk5AicD1GB5*$1c4Qf3s}hnCq}j5x{8I5Q zoh8->f4nJ7AT@KUXfT~(7-_82}Eh}AP; zU5octiGEH>3pR45GnT?wz@vjw9Gl!(UEKxE^&Ft2V^^{A6FRlsBKHpK-4KNUb-OI;#6N23sqVjoL$*_i z;m=fbVc4~ZWB#LJN+a}qV{#!)O)TpMNG8%e7s$3an4E^lW2d9tKT5E$#O z&&4M%=Njj)VxgJp=Uq0Ga@Lhp<0`Jsiyb$GrH+-D2BQ*8_@a*Q0PNkp)7j%vVBVv8u+amZ z@2@HkyKDrKk_IGNzOa+szPG``NjXR1VG}1LY&B==g~n(ctKty43&}df2jZd-O5-O{ z8V-wr1S>4)?z-lPA>&b{axa7&9Z{v}zxPh~FJ$GdBw)=7($`~7&dRu{0o5S(N7Z_DPxBsZY$lBS)a)1*EKE9=EK zB77R3{aPeqRb)3p{Ymu&4C7Y5ESSjk+}# z_8qF3TPtPr+25_smd~sRoRsXNBn) zJ8Sm_VI#5V977(u?^zisAs)}8YDo|TvUPW{=KL6pxL;Uy@~*tS?$pno*Bb`0ej=mD zR|VXNe=6Vu!R4({6S&KFpp8@j3rL@lJ@tN6wU~1nhBgYQC<}Hd$8dR8`{W0XE<0T+ zr@gxwNfz1_e@QvRxIVnPinclI8^f=9273=~sVQddhDEqp1sgF4VYMm1@D4t53rlnOgkzNayr)|2-tbvc5Re`u;Zr#@|0e+Usi9(%-*;a#vgX4V(%sk>h)Zz3HU zj{2He)R2~bE34t*HqJuoFe>Mni>P%olGaOr>r9EL{+FavW9K-?&^;lHBMg}r{Gz%u zB+&|trCO>dL6 z5^V&%x1h;fPA*3@$8jvyn2PeEQn%pYSZn6r!FMVXR-$S9v`R;O+4QQ34M#t&*0Uyf zW2Lf$OIuKSR4_1$n_0a;k2hB;iAaD_5y0B0;9eN2--@{*gX8NItAIOyD33ji=7ADwXg~50-Dr-c4yffs!koO}c*!fu{-+sw| z1QqVfe6{DGPRyb%c&}E90~Sh*i3?3wlL4AsS+Iw(g4A-?T9Ji+HJCqTboz(%l?dtS zfC2Nf{u02tpR8j_FXnlr4*LD--C;z>T1leO;U7&M(0;w5v61<}$f1P>p;wmL zx(f4%?X##*_)G7bw?1pe0pbd2Cq^a5%iKPRHIi=aAaa z$f^AmV`B#RC($GCINI=iSDY$QjR@AvFevyL@94bu5ty>Gw;&dE>8+M3Koz=S$x1`? zF|C*(QN3H?G;0`4=U)7THBns^wuUOJ$Js2jWFf3J&Dmvw1NyT%)ivvfB^5x|+Iaek zov-lZ_Di2TCYD_SEWCTViEr2TQ;{P1rbj9bj_QCJR?`b83}D#-fc;oO*$>;wo#Iuk zbZc4LXOv^q(@~v^P=j;aCU#CkK5^jWGs^{1eqaxq(xRxYX0-I`ZM1m}U=Heki0h|` zw#6394KgdA6{oa4S0aPmE9PQd^~yg{&cGSS&B#z;3cYXg1q3#fpo$PxjkPGH*Q_0F zZiSbb_mDMivP8DKLo;!E$VvacMd3vesB7bbv@0U-s4_sH3!JSucd_-mL7&enV%X-u zLzC8!!g&KzpT-p0Kr3OX&gIDx@(aZ4p=*4&&p~@x+zJjem9FK`+PXIPIA2>NxZAT- zwHe$)xOlb0e~?!q7jJTh+30~ zRicB{qPGbolX%-x_tvXOmLl^T54+$A&CL&x^A3diJPhcE4UfsJVq(3|oFCM%NoQE& z5Xo#4F&^RZ2`*>Je!7K~AXNT&b@)ixaVFeQe*-c4BRDbr!;u%E0@s;~xy*dU(VH(6 z%B^Jcys|w*4GCEFVhc>qSm3?mE7~@8QTo>N$7hO3+_5r`RZjD6#@lQ*-yk~Yo;ymd zv6)hoJ{LPm?TL}O&Bp2ra7&DcAS{%=d6;o3XqrLYHO31q%#SUDgfpF?%M*$z1V9xD zCE-36eB1=Nd}(NJZ;-W2jNne1eb_j+yXZb9OjCYXonY9cjt3zvAyyH%xs^2;G%p!M zcb$hC_P>2F1@8f2HE}~TrvUbmc;J<5%n73LYC`CV{15n;JWq@FuLsL+VE7ST3T$f* z>(4v%65U`j%D=sadv>7g6V7{=8)c>9(Ca6o!{Q2Wg4+eH@`mZ7L#%x!v9%Tuoki*bK`b)JR zVEOlQ2d-t0%s6F+zHT>3*ai1eeDNG}U$`^XS-vi`f@9mBtLhHHLNAtiGR?Zi>nw5P zwiziZB$|gM?jUlK7IBKzs203-WT36;F=NZqwpTYDyySx#B<%`9$;aSXi z3Eu-~2mrw{mGj}?$pf}Y`9;)@y!faT-$CMraz*VnE$~9MTSITl$2L#%>th#%ah)Ja za=+%)65?F@@c2tdT{d9#_#c@xLWE^|deoWmhfVF3n%jAxV*^c24)dru&p((Ydn(BgTk+w3oA}ARXA@6O7B_0qdnQHWarV{q9g=t8lk6;SSKopH+F(4uq z3r6x&P}&24xTvzm=mT7Ymo7>IK5CkyI0a!`7}?VL{fcta5FUyv$D$GbShgf=I6}HbY$Y{XDa$p#mvTrrh4+b0u~<^09S$2u0PA}_G?X^q zl$y$=oU!K*Q>nP?d>7?wCO2sOPe%|8nr~w7jO`t?UtX7n3dIAfJ_zCGt!SfRt;*^8 zEea-14-pg-%=Tw@DJRerG2v>-#ts!jNJlQqlSowXNmsZOC(G=oY@LcqDGmx*+dN34av1 zH709Mjm!`MkfC^u2S9&@Eqhk$Uy6!(k#;f8q)(2T6Gzbq=Sdq5a(EJ+TTkd;OlOwZ zG4~Ze=-hw!u*{7=#Ve-n+S-8^UkS}=n%&3k&BA56x#+baqfy(4eSc5~;1>y~3d;xqd z^{ST<1NrNq=uU-)0gR8(l4C!O)mC!mld<;v@#L)KdPMuYKxCH}SYS7q8or|;>7lBd zGSHW+oJrJ*8pd$8+HF3|k_q)yi@5?_DIal_vb>I@DY6`;MHqkuyW?Q)Q+90-J!Y%a z(Gr?GLRrdxc>)tp+{(YCmkng)Q-C{&(8J|#TUof22qC;T7-r! z<2N!x3k0F%s1Cg0bs$zk8E&GC=&|uNo7_~a$tWajsdq#257+Q3c9oA%ty$Xm5cqOJ zK7e}F=xLi6JgW_II#ZUFz@TR3i(zp?j;0rb6RURNaAgLVncrSlr(qxqnJ}FqZ;L8B z_3=PeEsSU7&hm#T9N$YnORn+N4D|?ltxp_R4j?RXwKY0i;sIq3J*P$tvaNwx8x>6h zagANwpo~08`ih9OHIo3&k5c%8Js3`OxCY|^kN}AWJylY^jcQ`7JSpPgfiHF z>T1tGjuk>0T6j`Q=pA(h6a3!aNoVj1v0AQ>5qu;iPQM5;B9_KhMShr;PX58_X%BxF zAu0b2ZSrA#*Np|@1~@f91>m2d@n`{YzVdC2yj){*G75z@yRByW0&nN>61T~wM@U1VUv?R5 zDXHYL>Nt2y-?=!No1&Iwoa=VV5@WP?8et>qRJLcfIKv>2!$R20=RlDTZg`LFG9y_m z;DF}ZbcjGu4(R6f8Ob(8Oqf7s`DFqx2ZCRQyU1hNpZ)K4ZyK4QN3XTk6g;80^lpWL zW3(W6L0GlGdP6a2Aoue4@?72nfNANH@jEwX^d*hBy`TWO&AE%uO70M}#$iUw~Ggq6Ei zdM$+Z%A@KvOm=PmT=Gbbz5L4R+*RS8%r0YgK2yMk){RZ32Ar(wWuNXC97t~A4}BF| zC#2_4ae!=pG1y--3y?iZLSq5PIshpNb_PIpR0dJL16KrE`HnzQ@-_;g z0^4f3Y2XOOPcyLZJ}4Exr7s8*eC;N9*#?vndPCU8iS56ihw-ryvhW@V7`k z(z%G8KFl<4yTm{y+Nlq{Fr+%jbYc>w(gC{Jxj9fAU(9`aKv4bLK6P1Qvwb@D*+_E- z_wz#|;4vZ5QzJIafdR8s3d2%+-tJUzfDOj)Ah>keo-qpC(s zV67+x*+&=h6eE#0nL5KPeE0w=In}$mRuFl{1j}h0?PONpoj+P!nmC1qh>kQ8G@xQ5!Qf6y;dqr702WvYf^*5AcI0xhcYBX#`-iw$Q)&~qq0{US!!{V7 zW8%1fL-Ko7(d#+c?ZYXE-S3*OTr2o6)zB%?4;)724sL@T604c6m0%7a=nS|P7BZk; zq~mJ+npQFIw%51$aHCvt0_0faOXH$4n82r9n0eP*^$c_7ly@%8)GEU*nd>H(_7}_)1n~ zXCa7739Gh;_G_}5n#3N5jDy*X2^n(;>Uan1c%@_9T&S}Wh75R7Rz*WVafrH~s~)cK z_t(=@7q;!(j9?kB>Qi<4m6`X>Ui05jcwlRR;V|t}A!1p{F#1u-zv}+gc0|TtKN>Jx_PPmR9 z2=}?h*?#Fi>em2(lYh>1y(#ttH>Bm;`@B_s(jUUGj)3HNg~J0a;W!Oy=S>?P!;{>U zh0y~W4JJA?eCUsKYAbHIA0H#@lLg#Ho<03V&i8q2S35?OavI;stIHGU<;DVT8p!QS zKrB9aQWyBnrCZ33L8)rX$i_iBF3YH<06{>$zx{6=9-hNG@H{{K_gjAS5Fagd|_kUo#91<_GsB^ zPXKzZIhoyhy~e!zou+K2Lr_PjiYM#FrfLe8w8hTOKBI4{CcgFG8*W65@UgKpnnq3e zmy_#PxUHX_UXSR;y1m*gs$?pAoUJM3CLAA#`d!y`B~NwCy*I#&TK`p{L{ICnlV}5g z>PBb-6-WzM3qA%T+f6nzL*8wnL~{7s4E(DIkMzll%B)eHF=L|bvqX^(mu<`ArXi#S zBoIW9tWgKFH4tqL9dZ=v6r$w96RKItsJi01vGPRn9;~}VMAgzrk0qft+5}rt3RlH@5%W1WTfi=_wduLlcI$uT#K{Q~2tRa+TF2Su(zF8}q+n3uMAay>TZlrZ?5}_<`=W%M(%IWU?0MF3P$( z?nq3d?ND6MV=BgU?6|Hxon)#HZuzo;_8fhs)Jdmz7TMQ2ji7Z1j3vgOJb2DMkO85L zHA-d(NS{jno_7s0EZnK95pf{KMORF?M0Y^zffw z6PG{JHWh>$fmp-5VF{#)@4`Q+QVD6r&8*O>y()b;U?*Us^JqSs1YI0XvwDG?)@bu= z=WT$3M^i`VMi?#WqzfP=HqlkQF0;YiFuR^Apkc}?7XlhFOUpYH=_x|+7-F43s^2n4 ztIqR$SQEs|>G|8I(xv@`!Hl&=$8ScU_RB_ntQFfoYr>is>&b&AYP`w{rQQIY-_yV8 zQ#=V@J<71wh%h9f=R6Z=0*1;47yyZ~z|T)V6t}%&G7prgxWd!k6j%{-1!Q$d-LX0q zS0GZwv`75Wg~dr}n85#*aKMUQoGhe+73~)aS+@ePF`m`=mpj1$q8wmZXupR=2rhRHDC7%3iygB;7A0i z=UVt7O|mCwIqm#ED;W-x_lRFgn95ijLfGTIBK;f?0xH9h8R8wqH}W92FouCA3OO!x z>g!8@vCv`x(5Q?zmoSO;i7H2636x(d%tnsej!61}C`dEyqn3}E`>CRA1`>PcV}^$c zCyND>4yNCu;;y@U;@fev-$2;Z@hLTsQ%F+P&7NU@uTR1STbQsdEc6RXIK}D$?7bf+ zy}v`E;;(?krK@G7O)D7YU;fHA15rug9Y-u+yY>7V@I2V}Y37WIV(%ydF{~3oJEBBk zMP|4?Qc)uo3-f6I3a-~!_0%lNA+6ltrXHDdxh;bO#Hk*?>XV&<Sr=yM0gHunyEmsiOtDBovL4 zJe9RE9G(F6g%q#OKTCIQy5}X;- z5Wf#^tX|7QpIH9&+?WOyG#<-J$U-ss3N`Q_U#>W2mpP;!y72W+Z?%M>OczTLdxnl; zo(L5~4wf7Y+J~(J7nbAbTEr@XH0mGxJ=J%pfpnOcH)(Q#)HJJzUwpy9JXNk>w-pi)zUX3N4W*>%mZOH=TYKS3XwZksqYksg65 zn(l=iyFTE%I(s&8^pmhAt51eG#>u69o^!!;7dJL`vrUZRf!K}Xub>q={I7gWH7ppo< zcKu^4%PDqeSPjy-gYQxxYbhZ9NG$6h!b`WyF^+i0+R4Ib++Lo~hWF;Aqb*X^mql*` zx5NG@{eZ~ zR#tAhyEN-aRLr0BcQ|pG*#?2c&B}O+1kYdTU*i0w(pK6S56uH$nzVfVP6IPaAWu=P z#Yg>c3283~M6wQCY$#}Yh@|{;*j-)JslB2WxG(XtAl!(C0wJXmdJH%-c0GF~Fb%Y5 zw!KDgiM^^I!L~d^V}G{LkKJ*D{E(8y|7SCb&a_8_;Q(lK0N!OPB0tn3Y@8(@lz0x_ z8Ji$Wi(|pF3JGvs|sIOgJN1J)adTcW&-@o$PJyp{f_u+~(hxER>G|~}F zJm*7;H$TeHA|nbV30JROR{DJpep85epP4u*{YvO)$|p_PZyX!7bk9H%EGlF&6D9p% z`KZmXtb-+77u{Y$#UL_oAeI{hAv8w&yj8VXKHyt@bBk4TUxK}KP?SwX5~ar_J12A{ z@~nzQXQRMpqw!S*4Z-Vjm7UR+b5a}-`Nu5!s@i)uWQI3=h&EIApYLYoQ>r<}b;g2) zx}8|LrpmpRRI|35Jol9fx;&*u5rx=;lVOevC1946AurvKXz(e|l35XR$a=D#yTP+9 z+P6_U^D=iSczAr1A^g(iRL0-4Wm&VxyXh3Xh6YE;>W2S`{GDGgA=k!Y8& zRj>Ihkys?Rd^!b;NBaM5z|px`EJwv!c)&B|>_JJls7`@2PjYcT|3^6NsnP``vm?vUp!EiIdRT zL^bQ6|H?Ae%Qbm060Z1_D(~Z7tAm|mQ-6UvyVcv2JS*^HEFdQ{$FEo4@qA~Dp{cpW z^?7LGwV=C?Dk^#e((0zPlU2<<@|KW#6{N=AoGCIpLf?tSamZN%+hK;G8`sG{^*kvK62-ive>T+sNn6>sA4I z%R(CMz&ch>aCj!mX5_Of87E%Qwi^us*M^!eW+c6|yaj(0jC#^3O$+NdF(Tz*BJaFP zQ%xB@>B72bBIu5H`KDNog-@G;L{oIXtft`mq^Jj2j4cBf=aFtX)RJ_wsZyN}Rbf8h z8>Mo|eBEEOh<{8lHxauF;>0ap#TT{^iY{`jr^%iMLoml^e}i2_Tp_CqdA8%=AsW?H z6`nU5W$M+UiU25F7b55(rtYnz&Nn(qmkXA;J*{;@6?7ys1|iOxDiH^8B)&yk(7+EO zkWU;m<@wK#?)z?c?|=6-$;h>6it`)62+gY5^+9Wrxf&b@w!u!aCXl#|FBk767cX1t z5fIO;AXc{kTMa2iAW+*t08&`s?4!6ON`MR~2rkk}xCi{)A#cYRC$|aXi&V)Dnn*8- zw}T!;ht1`>$;iM-98>~!SwItf@`oP3Q5E(hDJL045U|40icRXl!o)I?dBg_zphU(T zP{iyYPQ?T^s-iXxLBllwY6XLm01grxs!sK1j8-56W{~QDfU&?B&@?mvhX4QzT>+k9 zH6{N6d!7<$p~rbJT{ZHf>SAb&AV)5-R7346ovGPzMt*+wEla|SQ4W|G`T<~cMJHGy zmDs<00N;cFT4#8%)Ro=xB!MZVW%h90ORUJ8qqatVXWh70< z`y9q|ZjV=s%0H|I2edr1Y93;tTKKQHY^mAsP7s9VH98Tv8EHH_@niW-B{0q7w7+nI zr++FvvXlx>zWui}GrMgeKeM@q%s#t8_r<3V;c^Wi^s>GqHU&;(@lP?I_>CL#+tBUH zRXjr0{G8b-2W%S00$_&u_`+S^x@)?83X9U!@H7x$aLyJ9$pNvf6p&gX&rTtC6NxSA%F#{Cr@;#DX zPk6kNfj4hkx(%(bD4(I%0jB|h`fj__&~$vjUqu*Ck3K0GCZgM$4047Fo2Kw7Sq!`z zgn>%*!TV6w9IJPx_v00OU)7y+^eseF8f?pEtLSHK#Pnto8#10s_zXJOxQ(8EX;kO> zfqr9Woq)4}PV4T*)kpYxcs$O`4@~5VCVNfe3!vvi4B5=yAwJBABz)oD-7BKBSEIVt z?dT!6b)1l%+nX|D$%aa~2-76U65Zm^=! z^kB@;u)Jnefk{fyl&98q%n5CSjC(pb^0!we+RnV785hu8pz5RhQ15Z46_zvY8kItp ziWzeINSPf+gJD-4_mGrG(Y~7JFANy~uE6ADm)e1-m^Lgcp=n4+aVFz(G)7?5x~`cd zR@Bcnm6^E*M{bTWccaCGn!ohkDEkihI+LH6GUrIGDo+X19`!JxgfOkIaSS zMLH~j6v(Js0S1q!E3R{}bd2q2ma>T8Xv+So&$uSOFj$0kSvjf>6q9B~<2OI@p1R zOv+6^KB8(p6ubRTEjn@hF$5lEeX(aU8pF|(lwa^BYsWYQ&tn6~Kg`SqmHr~oZFg<4 za@`Mfp3m=})51dQ(W2NvkP_`{hVH%&Y3y}0`Z>AJJWnBY3dWtLbVoYpu3k%R#?HX5 z6N(3xWP8T#LwC>)WkJ&EEXMcdC-q}eGFn!~L~@xWVDJ}-KF68t`q0qp zB#WkUHNUZN>EK~69U53jA&B@gAawcxlbEE+@k_wb^wAY-$)WVme7swqsvO-q5-=HP z1N4MNF6303uVvX)x7*lA4?!7l!ff2Q$Reo(6R?)-e;D@7**k`IE&NAx7z59!$!}x1 zeDjHX$JDOA?9$UArqEMZ8a6lfvCQM>Re?AL0IT!5;8oh$qE#3rXL04N8yYpP04yN@ z?i6XNbm?SZbKB##AS-2dif0p?;Yd!9l{OIn$x^kld`}oK7rX2=SkaNJIx_cV}ntPgJIC|IO%=f&8eZJyb>dQyqu3L<*zf`tC8?XGMe{ZVpr2l#jnk*7@k? zp1m0(8+D)?_coi31t%!XKm*O6j5PM_Dw#c(M{v1?rQ_Hn;826 zOjYM$PrCfLXtOcuF>b>~%t%x%g-l7cv4rNZ6Ce@_!|q`v187g9*nUPQ@=Z3-{f@8o zv|%4+MNzTuzyFG%9S2<5p665hO5Dkoa|9*@D$+y!C>Iu$xgxalJ;71f`(j6@DR&rD z0a&P{ zN&(Wc%9cK$zeGmiNuXar028+B;d>f?=mH+1T(`rwqP1(MDgB8Ne2%6q*-JNkuSL$2T(&2;=v`s4Cu8!$^0vF&ZI zM;hCj4fs5ZF)e(oYe`+xKHKslV>=)$<{Y#ajd;W>VdoI3h-4O`+x{CG*Vg17Kdk$8 zhxZLlQ{?(i2s?Ay>IJi@cu8WYA-IF8bNzT~>Rlm9+HHBd9HWIY$SCdSt-98t5Snm^ z^d7LujKZehzs@w!t;p}00<`T9dT|Uu( zBO-obm|IY-)===X#SjxZZT3x$Y#Q*#qb=|6|Kwndu5p2>ZNvDpSMo*?M(XEswwaH! zE3p1sD(@)VTa+nkWE#+vCzkLTM`m>Q1%iNI+)09)`3(qap*Gfa#z4lHnNqeL##)hr zTerx{y~T?X=Pz@B(MiGzhqu1Ov;yk=u{KiTpvA#r6IWjxOAhpI&G!6l zJMX<=X(h0(xRGpSs;RJ?PYAX%OjbZ8wU@wk`Q3QiFA0l%)Fm-%u#c6+I+A+BLSvHWB;&G=pU$N)sQc;J>W z?eGRS^SNCl8?&43CJytG>L(%gZ-k^YRGrEoH&HbZ9J#D^bJ+WEW((1dYC=H$l;tb+h+*^vxXLGH1eN?G8 zI-#{*W*cvOJji12XnB%~an44h4lzv;yF=uE_6!s2rjZC|Bz`5yTQmO)^4R1}3Zjrr z@5$ncRE5KBz-^fbKw^B?TIw358>18CVYq4qp2ipBe#`PAvqKu997L{J2g%}6tLA2H zrJFntMpu^76>h?C3$s%Ni_+R`P6^KsJ4e}7hLo<%=ejNBPltQn?Ka@HCy3Y5SpIy! z9+@vHLnp4mny}j0ePpno|92GX>pka+^Q8aBX0cbsnx&lh@|ywXeroPqp1p^WrB85R zKc~>wqSPW4ad~4H?vb;`(eyprPb#V+UiJ@x?*RBiccY>13PeMdiMg;=zcQo9!{H7O zKmV`0ucomOo7b2wORX=!2daYeLvstqR-RHvoSTqW)tzBeaFf=YmRj!-j;l-Dm-QXG zBmz04PX_U?1UIg$<~I0rYl1F+zJeA=335y98I{aw7Y(MSp#P8&WJ$oOBb9W5Dm}ez z{myw`k#IOP1Sl0ABdO6W!;rsSveBBZLP`vz?gvSD!Z0!tijzd8ox~-xkzBQjh?I%# zI^$$3d6K6qk0d+-{X3MdVH|0c^yc_$BN_?S0vDqdj^}e^vpkHI-rKpc9VXk8GKNaG zbb~rlQW5sxx(){*%}7s00@s7G;kAFXw-7v56Fe`Vqr|j#_$e-oisIq#s~LadlgnoD zvr8HMU5fUZc3rBD8V{uPZCzY=*9$d}+!`Z&Nl-~0X9+s}>-NOgd01mJJO$o;*euSN zv-jvWNk$Pzs~Y9QPYUnKY$!viH-DHdDbC`HEgsoIr3`#b4Tuif_>4{b&s*lAOBA^d zWS?Kn8O>Y@G0+@lXcQmB@SWL-S%hlALc!6;8D^Pia!BSmkjcdh*u2VVtB*E8*BSx> zxRO$@LY>;PB~7J7DL!y`tNm{mlahMF(=j~<1S~>76@Zn_!m{#jwa#|!cVDp2jkO(0 zx=(&8n}(J?^@#Zv#u(ZHV6=R~UaZ1yhi<(r!Kc#TpbWG736Pr--F zs{cR@1{;KP4JaDk5S#K8asGO;Qu;ClJi-XI0$eUS&5tiK+6eNvVRMLr)Em1ZQayt%})nn)1-@C zJ&-fSl7*~brUnmQ_4nt=b>UA6?fG=6g;i_{A8HNygFu+<_qy-Xk9NGerxte z5D1@>%r)eUv5h^5PUcgspMg@eRW*z(uR2tMi(OQTDFJ30U8Mvr(0`Vcz0jT5zD8S0yy)W& z#FKt=ZBTNz3er_R@W>TwtnePEBH5lyuL zVF$+`+>^?hUh9u=so;lw;C+0&tN~GAj(!V$F+=vGAbf`@oSrNe^0dG|1D){}yS+59 z43`!S;D#vu8wYY;ypnLvlJI$QU!A=LIx|JL+z75?b$352BmJf=Oa=D-<0;|{3`iWtv#xp z^#p=RSmGh&4e5VdvN2&^J-wVA4D0-YV=bA|4gEmTwmPzASeWe@^(%$!`)qn!mwlZ(h~d#<+u^N`U_jM=W_pGH{vLj6E^ zL~kL2O@tVVk7s>4>K<;(BvnLeRKjzVuP z>$tScD}anp7Kq$uD#8#MvDn?elly8_WKs@Sw4mff?VL7;AM*v?gpYpsUPTgHF7^e~ z3g?Ys---(lybY-i9YtkO*6NSy*IZ`@(9hN5FnJ09E@9_V4}zJreOmsWPy^KJQ4Y|K zap|wV#G~Lten5#+=ypIa3N*K6k(Du>K31QtzBF=gc~9a4acAzXzJQaI6V;Qv~|EvP2=2)HzodfjhsX{vbdG zZ^UjrW{0oe;g~-`!3i=mmuN$7zy(v0`KA!Hp8~ZBwtIqGS0sC75WQ?P3q~opBIh&o z4vnWz{X!iL<YUx;J#;gUL#Iv>f3)iyVadD0H~LlaupKezRm- zUrzTw5#5DQT&XvAVIN;6w+oqPqeL`?lLRgKpODwz763~Myo^n3LM*CEySV|%AM>5X zxmJ@pA3>8m@H^lJe8nZ4zN~Wa*Kk2Uucg^zma%;O=Kn%sF&{`TX}ABPRuXHimwTGc zCKo^e3BnL7I27wP`O^n`OhILZe+rs_OrBi}Z0Jl}dl(T2nhqh9DcDMFr9gNMD+({` z@C87{gDor$N%z03P~AON_nmi6wWgy)>EhsOg+GARZ%*q>@wU}x^^b@rt$E3fGB=iX}^%djEi5;p&uTujG-*Gcnh;`YJZa;JxJv=>D0}BQ(H9;VwIbM|lPNi&C3AZptQ&QfgRt zDC1739RMPVnPo13#fWX7eRY`w?a3r$5fWzQ<5@sAcE3X8y2trac)av3wSNrb1X_%N z_>h~>XA3Xvn8?igbaiR<{ikXRZl;c;8~Ve`xE}4+Y+{u)*3@z5?@B8ajbY8(5C6>> zj+9K_wCekg6nvm3!YYsh$yhO$4)1{@M#P%si`I-s*5~(094dj&5fTjfsLVg8YESiM zh_K~Kf2Q`nM=@=@y=?ET)8!_S1M@#}mWE%Y$aS*n*)l(o$d$MdEZBu-Hk|M?kOYF)6osN?>ScPZ$TAF)FU7PkzJ@}aRx@G$Jy?i}RrAG9I^~2oNSRi2fi3^&0zX=)j8tKG({L}jv z^GcTiO^_NJ7})8rpQgl&#kV(BCRfP}wk}F#vXt~EQ*5bDXjsM@>fbYi$GnW?uek>xE0f)ll z%3`gySGb}5dp6RoOE3$qxaSQt_loB8Xq*E_UG(>8;Y)sY>l&ps%q9gMvW0P4&zt!X zmUnag#@Y{mMa9BSmpZoC>q6Lb4W9cvAYDxd7-=W7bNcJ9riNUttPJ6Z(3#`PJH+}4q$koRx6{l} z{*0?JG}ELr?EwOp%4A#Faha_a7XK%EPE$hCg+9teUk-Z+jU81El=bqoKk$CwgmRur%Xhu6A@H#`yAunBAb zP8XQpLOMSg5+b7Nw%4cCJ5*aL4StHA-LiHmu@xZ~M}SoM4-(=zzdO%$xtLsov-3QK zw)EYZwAH9d-9)1Z%Fy2-TGqtPljg#7oYd#uDo&%SVtyDs1Ymo8t7Nm=%>uZ!W^8s` zHuH6482_$SeQ9@Y&7uqY8I?-NgryBX|6KU(hC^V_x-4QXMPtT-k7KE&wo$SnpnVr) zE_kSVTn&!#^cr%yfYA>ky{>1RC(ssLXOf`Eam)_oim)mTBp8y7#a2XuH%A+b9B9UA{L(J94>C;e~rVg23U(z$uEvbpX=4a!R z-g-lWtjOyafe$3$+Kyxh#b`aVv<%e78-S<0yR;BwPSOWl$h*wL4>^M^GD^DNJh0Gh z@~Y$>G!JKVCJl&czSkiG8Tf@?MRWR7FicNWQ89zNwLkPDek&=d*2UE z%E4BW-F6(SeClKmCm?CzaZYu(_Kce}2_IsULPO~7v4v10ei~U-_o1EIxT+y!FoqW5 z2T^Qw+1FAXzpfs|8tl3uZu-nJBSBk><>&iKzRFn z=LlHoxq%@X)m0IoLpBN!yH;xSqNp)JYc$PVfOY1RrA)gWNXUz<#IG@RMYgq&BA#>K zipf!$syK$gs^dU{#TshumeW54Q<>bJ&hjjU6%i#|lG_BM0fe7dK}wVmDRN$o7;6ne zfpNO!1%oDkxdH>h&R~}UAle($J@cZ;fi)-0e7TRnXpeNB0s|8ghM^Ct<=YQj8Io7X?|oWT zVISfcNz-*Xy3ysB-j+E7I0xE9)ww-PeKdq zvUCoQ){%yxA%mgX_wJQ@1L4{dgDI72TapVDi6qO6pZhik%rt@6mSNbN8KOp)XX z4fEQoo5rO)d)U=$lXDpL8XBifONpO}dto~HY?uwjEr5;@xDA0Xg!YB7$wI>gW>L2Z z%>j*-D}s@#-nDY#=4c{v1&;jT)76KbSI#;I!4&49_RBa92V$De^=An?kR1#pYr>K* znIu#gbPQPHDL0VVz)O~mT)_VbO0J}%Dc3l464o@9n05$jtLtirT>D4(PZ1P2d z;8NUnVjNjQgoi?wYOLH@&zRO5C|2$OQ5z@PHd81KPZQ92AH#0kz)~Q^p3)7(A_(iO zlHrNny5_CpglS9X=6c)Qy|P!-q15>|RIRV4{8s1pGWwv5%#(SL=+_rUWv$U)={C6V z^Xco*D$b}#UF%+MX+p!~PqnA$zMvY4R57bGMmX%g7Ty7u=G}YryYfDqj$04W zLjf?c;O!|AC0It;qxddFYeb&xvVxP9sWYK7jT!P?4}+>@N&edIgb9doU8*R*y5wf6 z%&_GUw!3V2Zw*l8%MiIS*4jt|BZsK5*Mr!4iauHUVYn*#$uMX)Ydu#=IMJIE+yi^`kJeH@4|XO}kufeuZM+Ji zknje8MdM`FE!#YWG#~lJ;I8F6`G8w!$)gWPI5XR%SiB7Mpwpkkva62GM;}g|1*~pU z>Zh~Q4vJfV;@RL!vMZ*^akS*2+mp5R{|kr<^x{uj>1!s)5w&AQDF<_{k29~1UdtZ^ zdqgJtG02j{P_!p;%DAdq;@0OqifL=tLIYFQJ|2VMei^e`iXZX_Mgr}+Z~KkwW`bok zH#A#l=fo)=Ooqov1&<~Rxm7b<-=FiryUM|!@M57mzybJF0?C}c3x1ZUgFPc2kOyZEgJu3(k5WJt)d7L;!q-;tk5LKDc zB6x3xk^dFbT?h@OS-k@Gy!AeG75+2!3CtKMGKCh zA|=Sq$*mt16?Y0=w~2=>LNxH>rNut2aLaTfCuYA1s zKC0S-B&gI;@4b@*r@ag-J|}_dNWc(-2e!kX5Y8}dV~wj379J}K{bulf<>tPi%|bcM z1l23);G0q=Xq4IlNIx}GDq(8V^Ll#{Pjt~NJaKx6vmjVe-5-;!CoBl=HV3}M`Y>2r-yc` zsj+{Z#*frrMTP8qo9L{Wz;sT%?WIm0NF&&-AT91bl!j1)i6bzR8mP5sOpXG`*As?c zP%srdj{Va_q)vi&YpU+*;StW0tmF(;1Lh+XvOYqJ#dqcK@|{LNw9Nm;p{Atv{z@Zl z=+OoILB0$f-ca43MHJM@(ZYk3-Xrby|OsZ#`0MCbBony|kL zlE+rxCO8vqc8O5m>${h5Vw@n$ECY#S;sF^*?|wMhxQIRO5254$&wu~`2rvPjqBeXbCEGCcTKQMwfXBBO}RfQ{|3)H-l*}Bg0YcXXQr(kC*1iQ z4VX%A_p=b$HG>?FDK3pKJy{sFV{7Ea$Mz2^O}3T59>O$$d^TfyZ053r@U*X5F@W4} z$ial2H<*i4u19}FzRB>|MobYKqjmuZPW3;L>k$h+iC{kZPa7y;$25YN z2DR_O6Ga=-KRz9V_80O-MHU4Gri-ydL-T365d9(7i$$Wb=?5lk&os23R*AYV_E3mC zIJje4Z^00xzC-;ZOy^&5cl-^(K^Y|$!ne6oF=cscY0#QflOV?FBR*0)#^ws*4p027 z_7H%VBUKvT^r;r!*?3xwV=9GA9fa|Olkse!Ir9va{ZIR*}@l;3j!Yx3|)YfI{#9@VK{ z4yw2{0om;vZn5tEc2h;Zb*yY?Ez^jl5Zg6th&xNSIC8Xh%gtT?Fd_&<;OMBC8M`a) z8CfEL)XC*tvHOD}g$cQcpsnTIK-C!B@4&G1lGC&Y#_^jhY3550-wU!k=*^?8CAh?+xR2bMMoWgH}-6wOv}5_x(jj>il?U;WFj{<(~z-10*6#wkMR7X zL-|+}r-%avfsyAkO0JUSl*Z$=*%ZOleNv1Jq)R2xxHFzVqIdvgCKxfflQbxTm5 zAN%D~f2erRpEi(O5BCfhq&~avZ;~|) z$xqc>ejd^s9%9&Uyi^CD?MomM9NvIc@H2I899&x+j~{_2vK?TA@z8WtX-qbD)fggQ zpRe@4s5_908C2dQiBs{%?mWXE13i_3N7z z;8uEZX^io1GJCr;%zCHC;dtvBf1(8DYdMLOE_@Kd>Nde}^Lv~Fc)eQAPQef0$n9v{ z)el=5mVC&F?_yIx)U3|KF4WPyQK$as{crK9EvvuZ4Z@(PF7pJFxSC2+UtCCLXT0IcoA4dN6O}yYY^`q*bLm*e_TkYLSp*+UCd)O>N|b9t1TcB{d0G zTezAnXf2~n^ny-7c5J>|XJbO$-&IY~`#vcNQ=H!~e%|M$X%p`3XoROkn%9cJ@vTr0w_%IoX8K#q zTZ@tXYeOJ~o$rs0GSrQ^uNcj2#pmH|gG#?^A{5z^_@`~2K5Ej}G&pseCrK1>$Cx@* zS?u9r#?$K*c;g%j3lfpTXfw=u1&K=mww_C-^EiI>B&2vO9ARJwq>v8ol8&f5K4PoKf=wWnC{^FXhkl7!PS7!VSsPPR0 z2~jNjOD8DwzM<|V;qUvO^oJ4PYTj5(Ov62qJYONlRRYz)yiUgv7W^7 z;?W1^KN%J*0o@@Q)g_J$hhUz90#Ro*04)W{rQ!uHI8tK=*78e!2+WWI&ze9nLv#}$ zSSf0YKPLlM-l)+U!Sy|vaN#m>MRfc`GhHaIpkrQ_15vbTi!EUp0%FBxrK*a8tKt>K zkBi=H%Tw{hO({xulsDAYq_sd-N~)|#2$0Y$nv9V|pi$WwO0z(q!~jPejo2s`Vl{IR z3Ck1-UiOm}82ITrwf>}^)d<2D-mhNz?+plq#KlGur@4e`(21aa7qZfNS?&qVOAXKh*(8CU5ndlSE?=4%dB_(Rq=P4sm5hV z?-mk7Z+n7$paiBHG>24zlt_TU4FmvyH~;_<%R!o?CDbALGMEbG{{R4gZ;{rl2KNj4 zk5CW!@~2^OL?I^t16?c35V@;{O2&OK#BQcO7%b`p4L>I61f>p{A^2?8Z5H+wBA+!8puw-jm( z-yxu)K)SYs)6@~Ll~q*3aoh!Zq*7HP=wIMVq9K}R;CNFo1bi{nGca3XQYt2o4=K5J zeBsy)j1Kxwv_9U{{G|#=Z*lVk0>Pnb)?$gOA1N+(WGg-J`O~5>n%VB@>f8mpQO5eK z7Nt}U#(F2NwW?N8CK}~wfV8so#2S7rI>cHmpmX=+CRC9~Coi~?#UR`G=iN$HttLci z9qB)+va?u37k69JUCFP4U#|KClRD@SvtbN{cf&=FE}bp}cirpn!S`lddg;qkm~qk& z9>MXWbS5jeIzO4-zkMS!6Darpf>4!2#$NR6*o76Ejz78Tym) zX{~@G-qdgjCA`4-;8e=}oT#Y0um;7s(#p#$M8KsN^sWHz9;S|4+ml*7Y>oQZ+B__p zmSX+4Kmy~3bz%HwpG62|`Abu`);xPX$;)zM?4FuEhxL0=`Tn*qz*rsfiJR6kpMR&R z>tsUG1uUZB)}QqMk3NNGYjAg}VJ)sz{y>wLW&uk+Y#3!zKkg$Mm1lKv4aObR7)MWc z2E9_NoE#q?t4Xqg@a%L+7k!?~iD$Ns9jt!pBf^_d)h-Wr*pO?8_982xkXdv<1=i z74nT(Z5$GQRA3Qx0Wh^D^A1Whi(S*o{J^36Ct95y9}ch~ps%N16_^%2P$R}k!p&wt zciJz(tsmH)Bn0oY-^ze-4ca9BQ8) zTxN=^iltWi!dzvAVdTVb^SOH!hDY|*RuzLho+IxIn9a(jl1Wp;Nj8FUJ#k)wOf@Iq^D&NE5*(|fNkc3@RUE~4bp3evyGk`UOo|sh51X<8IEW>e zp)T+#*N(i}Zs6)*=X8|U1 z^e+UvLd2X5uKre;(P}!0>`IHcG2`qj+~>L0%E#(QM3z_f1~Ss*G~@?#J<_Z<;iGjq z`%uFrBS3W^y67my{9aY>t0-VJkN@mFIS$cF5BL_3IIaY9gh=*c^{`5%{y}GQVo3>}WxpW4b>9`1pkh_`V@!=eV>uFKSI6{j5iFs4yaU(ddXP7xXsRF)RV!jY4Bq1&F#_ z`m8Xa?OEManfG#$2Z1GO8T<@oK%MA5h?tW++;{kH{hPN`mtfOYCX=6Xm5M~~rnlUL z&o=3AIfqN{cAd6#BZQ7B{! zOjFvv=4wUXwBJfreWeT;?xOPEZ!U;xvgMptWHY+r%bAqS92OdNO>=mc;8E#v&%wKB z$|m&hEGp2u{3o<-)r9BhBjuM>o?oFve^Ro$!*m_>{JGvq zVOLi0Uic|a59sn*y%@~5(ofKkvjNqP-Yhdhq)eAkI44^R)onDr50Z1c-91gnFrqJhD z(98nN*m)Hd@oge2mPr)%(aA+^P9hzD0Ty$7@AiYu5Gq5_Z{3IG)LNEHexcdZ_|6gG z`E1$Rd4TnWMrzz-!dj50PLJ*n$4Y;TG-$HIUUDxy_>7%A0YUvnvL7++1V}Fo_jcQ{5}N*r$iUJK11hZG za34k_-E?9D^HOSQ#Q9^#9o(atc;e~Wu8e#f9egO_XJb30H#9kZ<1u5X(M?6l)+vXT zi&3orc@!_YZ+u?MS*paBRn-8(I-H4$=_ybgSY%K|GBtl+o zX^4mY2f|dSPD4g+Uz4_;MK(v*+k7V`_mIXE{-~OJLby>zc?kvisfnn9KpU5kLe6v# zRo>B*5#ziJ($)kKyXs}oR}3N#1AR-z*GIr%^)->QL(2@mTPOW%EgSW=lMYpQ4(EtE zsuq$~BACoM!Yh!oXo1Z^xZ7Q!qljKmT~KBvsBE@CB}>w!lXA9_c)$-wjr^}B_DzD! z;e$GM5xa!pEKOWdeN%0ZEd- z3)PvG;Xn78Mf$ePMETD%v9$r^ITd$j1qD?x}aM5wBy*6z!cBl zLN}bCVm~n%`eM=B(e4Rt#RsgF4qg(QWG@nO9{s!EKnh1oj6vqQ+S*$NnAp>rs=f>) zV&l!)7S^=4LrZF;dO3W9Z?+FHy;yOGaj0h7$9gP>Wma)rig@e`N~h4qCjY}?h@snK zWm;bLw2OK`U)YGAIq(Sk?A#8~nxidmm9&bKqXg6ki4gWu5u5RLx{`>G>g+$PGOdzs&jF zrRIhSTQ~YifWFHvQezjI2|z6XpnY}o=$U#{x>Li-t=z_knKs8!P|x&?zS4qqp+AT& zY7=6D9s1HzCmn5cXUVoLx2E$n;yA-8KK@SfydPDw#~!cc(V|X#4!znUc%0@^OY#_& zzr`pJl!=prtSv%sfHQcfx7FE2Oqh>A2LE)f)tdnDnD>{{J`1X%D@H*Il3B}w{Jn=HJX zf8}oofxa{QIi@H0mw9l;ZG_+8+7J$&E5^76F&`&D*xmD74(pzap=CWOBHG?vZR95}S|CM_=-kB4Ntwrcpiq!t-;#6?mjqHFY zMizqiT=K2b8M+5>0ZTHAN@O~0>kqG*I4B>h#qqWWgWgTYbN6t_9&GsG0c--{40R@rh~y}lWwY-(QA z`1TuFGX=KMFw=7$hWYm(#4WG=@LDG{wN`OjmhkQrRc_B{?#s=&H45f`;RDF+Vd#UG z^!aw6RZWTBeSpxE zKJQXQwe?yMGdyrveE?SrtHx|}l;ttY_(}My2mPoy7leJwR*eXgAQD)2c7IXX`HdJ# z8zdo)tjf#oh}cq;372n(tB z+p;!GVK6C!bfu1LR9gC9Kdn033>(x;;;5~SP0XHft#yvMTCYPvHOjGp@r1&QZ69Ed z;YX}y=E{)~tPc*EXO40r6DnE!=T+Krce5SjE|s-rY6E5)wr$>}J2M03>mylAyCFsU zs>~)aF(8WUI$pe_70flvahAQIDkNEU|2eZhJ8TMtV*PYQq$NUK?8Afabcw!8nSf+< zpTZa!j`dI{9scuOTMy3*{MKIj_U0E7brXbwjavR!6|_sZLI(>!jnx6xN9R0lAY@Vn z4g}3F@C=xOpJR^;SsUV2Z6bPCOcouU~Ie69DDf~mspdRaOei{p(Iut-t zy0)PUy+|165{jHQT z7%@USMhl_3g*u%0B{eY(DLS;i{1M*5!L7oG&{UDT^k!?Ad2~MIf4dCxNzLj^@t>rY zLEZ}6bz#J52=FDqp6RaV_`4de2e3XoEXR>)x)C&dMO)%6&h3x6dO>R?hOOAZZ0~vx z{lUz3Y-Nl&+}gmiCaB0;Sc zWQI$ed{;a@qnZk3#>;Y|BeDcN4vYZCmkluA7u85NTXm>f5lhbVPLC#9ce0WPS5y0OD5}+V1g`Z=mb*iDaA>+yKz!XWQC~(s>AKj};UYIDT`*%IN z=V|tkL`q97JU@AO!ezD^nMp(#hb0o6tni6AXwLSaqR5Xjh9vnqzcgNDpHgg*^wQ{g zE()wfg3Y{|DtG0k5kE*7d7^N>x7uLk+C>tGp)85Zyme}81r!#}G0EIaQ-|v825>AA zC8eP6OE8W%p^~Bsh`weRjJ|6_^S@y_qe-&-v`OL0GALi``>7thCPXx|FK=z^0U{lQ z;&rSpp>+eGK!DJ4A6}%mET55OlRC2LAU&xk_dvl6elc_j5yTB*H8fTEn@aJ2{6D8a zWxn+4MKp9rNd3z?UKlJPNOjD_7P2T9B! zF0lh@Wl zZ-jU;t3k48Bu|-FnIRh0qNx;jFHgbU^#Gwl0c|vtu&>1#?Aa>zoCqn*O{SnRcEw0m zk>=c@q5I!Tx{`D^f-N0dsV6LHoHriFT4pux%gILt21LzwaW~ZQJW`SkUw~rHnHno{#nJO z7J^gKiDkMIW(5Vf!*h%k(=MLU6}yfGfKKH0bJ^fl@SNbT&X_B<%N_vZp?uX9no(ZF zV<;#PfD)Rf@Esvl4mP%BKVP6=Gy(uX4gdfN2LYbLvPpjdd2Z(<*_DN1qc>zJOnMM7 z@$Kdw+fhNiOX2ZHWPXkWrgYqw%wpD3yx26Spp4xWT!sWUAe8G0Glzq02B0*N~xU^?taE zV$d0Ln0zFQ>LhVO6}sEo`SSDJXx8>@9OclT-#cc2Akr?`#eYTfqqV;=I?~Vodr<&P zx=?p9xTIzn(KXKZ6|xlnYNYor79_8zS8!Js6b!fkLRc|m1f5<24=Q2j>q_iuYCz); z0XK~FSd&+&Y({#^xLoICb`^(I4xRtxSkw@}O9@L?dhR;Tgn7m?_QOa-%^cMd9!O7I zl}CPKLMsFi#O@TTN@CR3fG05io_bjWYyj;W{wqz$`+=rYs@kWIAsAW}T@@*l1g^-^ z1^NWn&MkpJc@n^j6kxS!8~P#7&!MVj=70SMOXMgD_5|qjbnqQst&%0uBq1e`?4Zp^ z)YW3yKuC`0!BfWS*#$EKEwuPZ?UewVY zNTQ?dIR1s=p>L6FOLnwtvrz1EPGN`l_?HK~Om)p~ly$Gvg`_9zG4VPxFbj#%R$2Su z5|a1xiX_wtuW4KzS8kB8M6C^Jff4q~LDM$ieTU1W!d zkFKw+9|A|Ej)Z6ZD?Ll8_l^;7z8f3jS!lTn0~z>lKLM4lu&o(f;=fL?8JB^alG?1X z|1)-cUo-<=)L4#E+9D#A$cF22K>lqD1mTHu@o#QrOZsm2;%HqIIAc7pn|z*7&1m(P zYh`LPC`_V~Q7N+7!GUZ_2U@3wNy2m*$U@Pwpx=ix{Yq(@v}dYM6L+Xsn$H5EHwudxF3ezZ)8TJg1fPi$c*gJ-Ub zP8M+_y)AtP1G`_|=I;o9jLS{aP=&K9G~&_>cQu&PWpJ`aE7M|o$HEzllCaUJq&E39OpgvjS!5c5ma8| zyf#-f@}?RHzAeC6J~G8vLTX<4bRQfTWf2DjKGvBSw_mC=YS?t|^pR)tSs^|f?{*eM z{%NmIro;j(Ii ze_vI{mbWF~kjg?~y%qF1w$7?S_5>lkigm4a7?DP{yk+gd!izN{mi@szj1;w z-XJmLjIUrcKNk3@V``h(N3qD;iT_`<7WyfEqfgDHy5v}2!BQ~xWBT@dW2&}&H7~d_ z?3g7%Q&w#i>icb<-7-m;N4_@z)yfj9y-7BDm}G!}&vCZBwku2V6akq3I;;H3B#m!K zjv(p(FbNjuu$RC2b|x;d0%~;CN~dEhM^lPpszv&(L#NDTYpW;h)dZ%+{7~lgT&tnZ zA!2NGvWx@hll$5h8PjeZXed{ckOv^9hbu7LXs~0&JW3_>VC09rcu z+{@euJ{n2*M4$**FqtT|7$ZjI%X)enDq}oXnsr-*7`%9V!_Hp2ph+N`!&lyf;xm&_4}_on+Weo{I5$TIPb`h14O&ZJmG0S z3{}PEehD4z74tEpwR(@|3IQ@;a^oEzZWVZss_XKx$a29xYUUI(B`_fI<*j!8~u8&QZ%P)t?itB!bY*p-{7?ACt^TP3d&jOlAy_m6{9A z-!3ZPC16&8+}k1X`@e`P$9D#a{U{}Qp7dzvz4I3d(BVOInondE3 z4Pbt{oYJ?IW9>4p38z9pJ=SPaI7u?qN3fPE*6a=A`i#3#tN_4( zAsW?Hl@S3}99rlZaN}%kU@-34^9yde$vCV~7FiXtL{%9@cP-lDJtRF+1G*cvxW=`ygw@Ql(W$#;^2E)6q- z7t;$9(rg7!<)S+`5~u(RA}lF=WS)_pwYpPLN`{97ayTetH+_{d>di-bE*X4SGZB zD5#bI2m$~=8~^}IUS)`a015y8;9vmt-vXP4R$yOK)M_Sj36Nsm3us$V0009300RI3 z4P(CQ%5M@lfq(!3F>e&IfkHSDkid(GT4|k4g`8S`nYUgwod>|DOO*x8-WOy%8jJ#2 zYcMu#7(Ywq{^8Z>yVp0D$K50LmkxN^fkc{VW^gA>@$Z*t-1 z%@w;~m9$MzU}YaFOBbq0;F^>Nj4pZm+Ra$0w&goa{?*#YteyNJN7sKXF}~9%Rrr_! z{)~H+`i7;~IbDx&xX#|ytN{T%eVE_L-z(3oLZ!R?l$SJfUpq4y{6Rv0aIg*4@DE+Z zPFlH(S$}F(2yz+gl)sq0G;(gM&>)mwjruFYc<4)gPg7MEw~acJY30hKr3+puX5gvu zr1s`|hP{gw}c&v37}EOSr}Tczvq=6Idawz>ZIu*KKK?@V42xi0D+F>X)-)7`pzZNPmEMo ztzytJ*VH0Lb|FC1X1Fg>o!#My6f{mAYYrl_;8{vWBGum2b3AD@YaM}Lv>ID4@05YB zC)F~ILSUe6wj2I70QNk}nBOt*{P9haWMfMu=JHM&W9*zeK1YG*wPrl3Xy&J2EmJod zA^ki&Ta8=$(=(hUx(~cHzaM^<`80Su(|6<+M&En=6*1R)lzp-_T(B>}!L#KTW5j4a z|9Y!A)<=qFA(Fk!{{8l1ypb6yk-)%@PXjJg0W5!LGl%|r6TBD=$WgQp2LDmes*$tw zDd}ATupz=pSg1o92O>y7J807^feR+%(~$59h!PLxalVw4!me}RHOfBlF~ zR+nA!K_guA6uPHjjfxzlD#kNTf!ILf!^<1*)~o$Qjbo82eRuW|Gv-WU|A#CUB_=U5 zTAML7s6Fi3&C?A5a@l!xCso^rEQ3i2lrNW2Qj5r9a&fy>rzN0-k8fT8x7*og5qpr? z$hf~K9sgt%^oZ|uwxC43>}`YIpOTI5<*+BywTuM_`6ZHNk3RpDPwhYYk% zCeiP+ooN%kW1m(3N}oyWa+n-3y8drU8(eAO3fAym6~uy|PHPvbV5IIlQ!CfuU0+ zlbC=?Y1@je0*{P=8f!#PwS#CNR-6Q=a) z?6_OoS}Li8TS31b@|U9!iV+1Fd&XEdBpyhE54&X|wFRKY3IIT8-A)Y=({mhsz zcXxTKEMT$h3QU}8-ouL7wmx@aK^wS! zg=xxYa&}B1QFZLm_K?&K%t1$SHt&Pn3bbDDPD}v<;7$3B85X_Ql#O5vS(#9w*B7qU zo!_FZwBcTjO3xCI~BAR7IgQN#@ei|3H zQUGeVRx=P4p_s^iub)>3vBti##J$xApE6nL!imzg$f~OqqSRL1@O%1CRiZ8ck_ea4 zSrGVCyfQZl`qzI(&qeuW4}(fHz8B|9eo@hutGzu_BYg!&V}1pBQSyXH-LX51k_Ln# zThKe9?;^|+`IxuJGRc8Jk&0u%f{b{Z32UsdkV~Z>JI!iK$w{{INbODMSAw3HOaanZrkPDq%=ACL}zv&j47Dh8>Ztu0lJ_ zt1eJ9B?^hJVVXravG4RTVNbOD9i{c}uuadkUzRu{$kvePdm}smGEOIgL9w_Hg?TrS zGM=RkWCB;a{bTJC1lu1!0-OZNX6uug$!=fG*fR$Jy~X3!kIiTSGK*43MK#hX_C1h? z@28964dbBenqoxs0_WdxON3}!%qt3FGPgGlD$IAGOaH?<4vS!JESK5={c-K#lG*fn z%xOtcUj5&fdoJ%$X*uY4rF0%r?OkTP*2w&U1_y#zI#gu(_qMt zXQH^J<-`9{uaS~UogUOqH%=mkOwlATCvxSjCAJgU}*aym5Q$wjSX$5#u$y&=WTjiA>=v1Dg3@_}Rce&PR_}uy8Q_ zUAb;3+fKNErBb=knh5rcia{*q3lQhIjE1V-aEA|-&#Xh@$ErvG1bK?Jc$x?1t@7a-{+WlsI8GJ zCrJZnJJPLg*mpXUpjI5_o|-=7>`v*nuEA}V1eI*-U1?a;8JE}T4O+7KQxPg6b?xE* zDrd^@>Z3p^jTFz~`}a}UQCmpCY!Eb8R~ib3FI5lzZ`Bl7k6x{Vli zg2tNA3`30m{lPHsYzq8os@QA|sPip`!Fa)Av77K9R~i|#-BPR8&D~eL;7{g~(!IVb zllN0kMM0Bhu;9rqoP_m%}%q!G(X zed_WBuEwdchTN_fj30N+Jgb13iat2vcm5t2;-tXE_jEGNy z&*$5`&#pcl9TS`V+z7HVw%+zL1zsE8H~#Zh2Hem25sqqF)2+pmBA$Nb$#xN|QS*vr zO5G1BdlI5>d#1}vB_e&dldnT(H09E99>^OJ<8H$0CrEy`B4<&vg$My!0#c?BM_4+@ zJmWFc6|u()@&YwDrOJ6>v|}!%bsOyr+|8OpV7+RIQ1@Z*ec2amL^m#_2ud4cq`UTW z>R?;61Lg+%JTzh0_yRA_)#~tfKo+e)vY$~8*>0SIswG$46=PEkOg}BJlQ8-?{LQFr zj$)lbBvJhsC=`S9_GgJ|+&3Nk;* zr+A)^mV<}AN}sDSjZCB$!r1EuMLlj}hBAc^_IgXuUdQVXu1%hDNLqt8m`YM!uaa3p z=1}ws2VQla+m-j}mRbdx?3LYZ#{=L*{a>7M6l0$*lKDRAU15*#NVUu+Ao_l$R|-Pa zH~lS{Y}kMHFGh*(qq<*Cef_A*>b|HN|In5yh%JH-U?vqC7WMs5vN6!CL*3>Yazs3F zzC-~VOchHYpFV?0x&#o4i`~`K($m%|N9jA`73_`yI#qa*Fnf4OjLx^uPw#It;!Yj~ zg4#}!|8}X2mG->sx941^9t=ZJ&(7T{?90elQWkIvNQ22J!N+(8LC? zp5v<$Mr0dk{_^r9a>Y=#-UyezH%$W+xsa%2ijgkE#aq2}Is21gS{>Fju@La@aO51& zd_``~I5>E90t2CmiCDguTk`>t`*JgQ@t*1sKLt9N`p(mxNL8Tk{EDQ&hCQI(;ahAy z<%^E+b|v80@GM;F{q*rovd^8>t=RtavY)8`w|1i{6W=a%|4edtm!v#XUlou&%Cwv` zE2!tEjZqWeFswZ)L|ek1fLG>*S4o9+VEp?ETO zU(OMTsylH!hC1o7Bw3|Pa1J^+X@1N#IYM{OY>zzVNSIRRuoYFb@{a8}m>8Z>-%6q@ zt+^H=pC%H0#%;|{S3i@JD5-?0XS9>?QIP1X9x8l9Aq9N5?~u=g(Y?2xq~b8K8W}@@ zjqpznkuiJ(+h?Ds=4P$Hyl;V6oa%t#R(BmoGkUNO{VSRBTaTh=^U12Om_p>u4^XB8 zPh^coOVv+7JxA%x1-ykJuQ66s75?XW3p3fhx$1vER zKCaD9zOk0N5?o=@>*%i92ae9f?wp_e@xII0vn2F>K6_B&&_qc`t>s^y$uUXVPm2y^ zIwKT36H`yP7zQgHl(s{7o$xSo4DPVANFb_Tp1WvrI!E-MqbE@22bkVx;XBRQE^?Oz z2L9+x4L~dC3q@^M0xxP&&j1IVcS-+E7QSCl*e~3+H6q6+} zbw_{ts~sN+*qi}^AM6(%)Fb6=hcY5tfwaoy$XS`S=D&3gCvCmx5#{mWm4&I@!x2_BAK?L;3fCHe}on0 z3597i0))z&4PD8>X|K|Ar*k*JN z_W|*QeSlmi|DNH)FSQqJY)-4EFS&VRb4%T7EIl5jw2Bdt(|umys@|LZwP{l9$ON!f zLA@s;!;g5_^MDoM$#MCmq!1f}{EGk=?lf#Al~HR5^Wo_H zYdXIPgu^1<^W_i7XYu^1Y$SBq3WM{ZIlr%n>8or`Cjk8(TJ(~gd=FDx>y4tEW3!P# zs)MF~3dmDFAZ7enuoE6bIWIo*_Jcb9cOJqU>=6vdQWRn7RkpNy-#&v4bfWbDNe)3) zy>Ga3A8Ry~_$&0~#7RY;-YDUL7M>Vuo^Y+e%(F0@Jk>w5$i?+Is6 zvT1En)IW$&K{#L7v^%s%hOyOM$dfd2Yrd3gPHzW2o4T5mo(6s(8@3QJY0xO`F!x zjr6{Jq*PzMac3O{IK(m(936V~U%%<1+OgM$V8&)ym;X;yxVrO-)kWJpPPHa%Y`U~6 zBkIus4!{y?pfR41*%S^3 zzPW%sS~w>uJ*g)aK7QfX*3_YV*f3Q}_|%#g<_85F15NKv-jyyl&NB?5qaaR9${X4r zLm%8({1#f=dLrp3m4FplvSy=7$&g>*Tuq+#(Zz8_HGprQQ!AWl66g)S;=AtyF#{J4 zc8+STKxavA6a79~8lIGliay4j=jEP`cAC$oeA&q7i3;|cosK(nw`cY}JA{)YMco|%Z5G_K2 zw|ZcNF$GD=e3+>|F$a=l>kH-u0#aH^Nd;9QF3KuGxcIqcbR__5!s_8K|69Ijofd60 zkPE8K4l|yKPso&PKq#$CR1eKl8w*#WHeyfJv(9rO)(l@4x&woc@fnUI^-)XH=jxaY zpml)N9GIN;PvGRl=YxtSp1U*_Nx#KmV>!w)@E^qIT^?K_s&xWo8fm@1G|e3Ce;GU z_X>dnKltnG0j@@Y5q8ixp&BfB+_jN(Pkqe*eID-;xtMZva_$Lg->ODv{aaB*LYK`M zHP3~+JfsjcVK0%i-jgPO+WUN#K%I6bHKXjFUfAB7Ni653X8ElLr7=3}{2Aa|)>u>B z$J(pLx1vX@-Td&N1gO7j$fsxthQb=M=oMyUMsQtUs|4iG$EJob;rg^Z7f;npfuAHCw?QSCjez{IrQmPnIa zb;2h-W4Td=m0PAQoJi#hbVib!r+2|l+KDzlI#-L~`ZX@WZ_LDanHwBKFe5KgsC> zcKowgq_9tPm@{{sz9Y_I<#@q6nkyG-hv;V{Rb7GNeXV^)X8lZi6eWmI5Qxs}#qzL( zED^+0^Qe;^$3(%OaAg=9om{xat;yvihR12kuGGeo>3Z3xUhA7ZfBFN=lU-BQ%?K*h z#CmaraNhlOFCaMwO7dq;lQ!+N=%-%0~B0Q@s4nN*!qmIl|y zcRj(Mfp`ZW{x=*qULjN><@k#Y<-U*{w{#5lJA2Nqs^8rxMaU(MJ*81=$DAF|Pu1ldPED;(G*ZxzRJ^J9BOP!{z#nfMHuEV|g3`nd z^m`0U<^8>%8G!ba@AW3WwvhbolE$uqa-v-vvFf(UA*CELE`l;qKZ(u-C|?hhI@7KM zF;DO5*8^Cs*f6mWEs%~pVp$uBXUQ#AS6*f`H}L{uCkh2s&?Q?5$2wPgaE&(;tn8;I zJp3MeJytt+%gL!kek;y&-`QPQO9|^<%}u4ASj@s@M6jPMaM9I8-NutFu|Eb<+pJO= zU#qFccet;)9efd;3Iq)3Nz!4V7-e*q-bN>;TiS#o%q`>4@N~5{SO}7Z+?80n9S3EX z#8(~GbokMf22m|UgY?76cJKTZofxeyGrW-`vqU)aNe)dhK#oA2f6Fko7e2? zy4GF>(&x-m8*5{Rtlc9vsLLdfnZtbI-Hh+>yz!Xh7qh*YF_B(9`u>Tp8^e|!aBb5{ zz=wlya$*hsSh7p{*!!OH(Rgw)dD~9&CQyzq!}^)c@L z``s=ySYzpQ{8=aUEa*4C$h=a|?zs7o|3E#2AxYLcw^j@OE~x2j6v5D|dY*t+TitU6 z^vIrsn`1zRos65MWC!~fyTwPkkNZSKYCPa7Ns5=Bz@^gMN`-k7n`?B8WXu=2)L zJCXF6mxzcX0-f%A5k})6AMa=YhKj@9iQIvPB?kWW%*8T*d$-Q?H*L-`Ef`yTLS0>Rcz#4{}FB)3nGuT>`>D8-{eN zN44LB_#7Uw>P3>C?8<%_v(V`tRO78<7!=IVmoqf)Jt6aeH8*#_Tl9CKDC(wnO=k_) z)1nh=r`mj4LF6Ha#S*SMO>35dCy>f50{xJ0naLMaZeq{(BkDJZZx8Yj@dwC4bkR2I z%zB^!rC7%k+yQYs&Aq4E-XA|T=MfDTGm9QtpA`@H1CD>d{6(xRVEhp_N84Bz-lIIs zPF0bNvHPkjQV(vCqgCUJAUQn9A4z%$;F7+W&ATD#+B-kCvL=z_;p&=q^1y?UORu6* z4zEV3d|BMrxE8M?td(1U7fD`8PmCojfRoU}-AnRDWysybSsCRm6%f0oW|Hnrir>MX z3ai~p#)%iI@-EE&nsSl1vsa&Zu3V&NEw5f=KYEv42&)CanjFWd>%H*>MAI;eKz52% zIIN-3iUHm^Ey=(qKPG@akrdK4ZE4?eX7tgsxS=X5~$uy5S%9{*ek@?Rv}11rX2R!Z}2EsQJ)y z0F3)!*~!%=#?E96ZDv*u_IRTr6o9PG^+^~Q&x0rL`uH^#FyxqH>2}4nfhAJTH|*N)&oTP`EO&Fkn@tX!j6B$Ja6q zU&IyiS`vK90|>U0YH!-&cGWMy)!X4dt~t&1q(yC2sWY2@X`0W|g03DPpCbR*RBu2F z>TBE?zLetI1nb=0QvH_W26Mmm4#7H}61o#R^e%k4)nE$7&a{!SH{sI~6}{1?0Vv0& zFS+A;3rx|2;r-UU@gujT$aiFqe!?Vkf2ubO@6A)X|Ak$EB`V`4zq zP0G|@BXa+nun+Y?Ew}b~Q*GV!`7w(lGulanlcD~YFON0{Mv4Kp?ggkBp6?$=$%EKR zM%5lt9a~68@cr<@y`GbZVIuJg?2-du@bMN@I`=G~%_aFG(Ag72ZPFAlzs0>sb-Hrd z8U1`|Z9JXjNx59VP>110EB-4?sgedsweUY#A*AOm#^Tf*DN1EjiTA#aAUKkz>tpS0$!f=J5mm zfC}r_p+__`dJ3-25J!?@!c5rt^ z8E1wb*Q~-Gih-94ogcN&ZIDXBe;;PeAG-G6|H(Kc+Xk)F4}iQBQ9_jOKWyDtZsx(Y`8#ggxG=(s9tODx zF&slPo|-y5r;A&4YU{S7ItK?E5Ao@+g!xF2*^Pu8bF7=s>%g22!-l&?&4G5^KsZ9G zZVyfNW5<)i2%4UE9_lY4-_Gw7-zvU%8zDp|W6;v)rt>udm$MHKG*E!;@uOJ9GcCL- z+AJtWnGlPQ7*%4xU9x}tV4mWO4*7v8J4Yqi>jLV99SHM z)FY+1kWKmkwqTHVnb4H6mmVfo4g?=DrDP_>DY?ycp5M2sDDgTe{wzv-Nc#M732LBp zUJAH)h|}*5-iAW-^Cs20Aj6Z+jmFcz*i6K4*r32tNa!P>N9Z@+NNpPfM3bVTC(vYm zF@LzdOZ*VsDv`s&qF}DF=7VYyC^GFIPcvVcSHv8H?A)iVmBOFGCWQVaoHbZRRX8zP zV&S%)CFW-~-Qm2DWst186Xg^R-BtA2nn7-R3F6%I1J`;o$FlI^D8c|^dzl`NsN)KWf(YtXKn14W%HqcDF>&4uoet>qZ>Ju8 zSsgLX4c$lw(1xU5sKuvGVvZ2FRf;h^`s%AiK~Z>d3?j(-^8b9{LVTgsx43i@0r#3} zA|O4OJNgM(W#j7%^+~td&54Zw4U^FOvE$Nh69?MJ%02*K2hl51NOd_Kw^ll$q7^qm zorK!Us~1gnfn3@iA8g{Z3|lGu&HYYo`q;iWiT|5NaR%+US^JHK#Sg7qpNcE%MRbI7 zvY7W6|G^$K!WXhMkXU}9DcN4I` z`s-;%zb(1~o=IRf`RDwfdrzZyvJ4b34Z)>-lK~sT&?prk^b-NEvBiXI;WOqY~(2}y`9S7RwhJL=9@OS4-@|iIt88S3P6D+7>ipR zb`jlbwN*RWVr2lqcxbuDL@&^sO}<{M0F4Di>RJ~-w$A{YfVo?EHhoc!%I>A=!jnx7 zEcytSVHDWCL;cqqhM0YH!gb@_Q}^;Wjc-up?};eHj@{Ws`Xd|`+()mB-W!#3Y*1Pk z1L46qK{JYmScxYCw?mgfTa8^1dZOt;16Eu=ttOc{^e7|vi=V7nkU-!g4zzzQNJJYK-7|naq z;S~gw1_f>V69#RbJtMzVg=Bt>w<#_hrj%;TPG|m8=Cu=i&dpNm? zhGJahnMa2{>Q98(q3rf)iT|OQt(i8J?k0e^ob^;kPy}xE z-Z3Zq#}DWhlWb1vE>ab3yh3;i+)#rk53=-s<%F(8;X`G+-9~X~9-hmtR;CG8WKs}9 z{gcr_2dC+9$HgT%l}%rAOJ`S#&CYngmNm1~nK)#A7tQKiZFc+}DUb(mf!i1yH-9QR|wW+#k_ z;%fGkutDC6SslF-ddsz*LPGex2Y-?OgIDtg8S$4|#cSPFvf-@2;qbT3rWzE+i*RpG z?i0L?f)wG}<<{{>;0h#!CE%Dl(-MOAU!`eMR_xz)B6*8p1 zK-o~zK5o$_zWZM)K~T`9?66ErEBr*q(sfj%r#gL- zR0ugz+NvV3YGoB1OdB<~vTz{!ArBMjWnLQhxy6b6wWEXEq8o6hwQx0ksC#C3;pri| zR>klrR$@3Hyop(B2|ThCfxMLlD^tu%D+Gowr!%I1Kad8Nb`Hq$5E=tH9Wf^vp4I0Z zN(f63u(9i~&Ml144!%E+u8O2&Bx98?)!B4sUN_XB;43ISAy9HH?+({eA3paZw2y)#y?0C2@uh!S_7XepX&6#b zMciVaZPR{PN*JKx{-t4PRtk%;w9`u{Jrx#jG9aal?5iO@QqXuDvt?yJ3M@F*YyI-C zE&(alWG!gyp`hykF`@))9I=hvvE2M!qS58KxX@>P8b$@)93yxEsIT9`Tv#J^LBllK zH19((O7t){fG+NTP+MKZzMhjVd8xYc)GxI9y7c@RQH3HfJEB+fJ7*SO=EZNAU#-`$$C32ZC1xfA;zBcQDo$lF)$xa#(xLhei&rccFH2~5(7@n9m zRf$UMGk4l$X_+FTpvu0oDL~1FrF0V$-Liq8E36=WMW*@7-`-xAp8R~3ke!*+)Rw-- z!7;eWXI`MR(?nbPDV@8AtLN%sQ`xCzdkfqJ4@*C#3Q2}?!I7X<>5aDJjI1JwP`>%_ zrRK7e*L&KmhW7W%a}9659bB+i9<8Bm;l>HD)yW_)ZI~0(J`Td2NgoOIPzsDKUiU`& z!`B90Vs9EP)R5DHdj^s5&lgwg-~{HNF53B49k9ls4wz~+_nlF8!xwFjbhjkIrI zu^;^*N$3GT;2zN_#6ZieM;EzpVF!T_v)dSw@-eMku&L}I!(mh zQ^6pun8V9Ha$(??)#|pN^yVs>^$Pdb@2N)eaBXu&|D(W0>w2vI*B}nmLZ~Fb$`gyV%nF-;33;Gz$s1Hy)+!xH z_5h*h#j!)n+@FUXN&~^*dacf^?`rB_PV=~Gvf?2`Wp*3(!+%-WUS5B|!zTmV&_&2S9bj@b0SClsKL=v)T)li!+U>n!^oAYoFmR%#b@UKyJv zk3-mHV_hqr;Teb6;mp6zgjR6(W={}(72Or;Msy)i+QVVoqJ6h?8#a{3%NPAg?+kIe zz?NBu;3Z`7TYxM!bj5g|@kxN>O>}DYkd`>7U%6af)N*%zsm0`ge-;h#Xw!8evDB%z z_r&ZGdMaA50>=VR7`iv-dI?#!zI(S~nEwXBm_jQk5ip#HvEIFZEHwXnZ3C(gov z=v&)gO#D#~{lm32a80S*IXG1N)yc7bch;K8LYESGT?7gs=}Srry*e4)p7C_NQf^vN zP$_d)G=wh(qFjERmiAOu*hgpm&k|st#IS>()=uLHHu<(c_Q?A+qe-q`opwUQF=X6D zzT`y7hsT2$^lAfMPDswMqZDQx?3cLz9CbcmCj}{V;PwlL54HojQsMM!YH{NZfZA^iQ zxa4TeS$(@bH-nq|QbShiI!FG&VX_W-KY(r z6-@I(%uT^M8+)4RKFwLa8e{|AxuP>Vv=)&3Ac<=^Aje{-rK?7}(y)<|pUHAtAq3BurU&gq^~$ebBjb<@v~A5Fl#VzA4sa%#_1U?G`Rvdn!vvzeWQj(C?uQS`mU z*K;wVpv2GJELu>a)*Civl&$6#i0h!bgoe4d^>QT;UEK6nJwmpZsMQPH&V1?`=l{sM zGF-jmntY4y=u=0}s$mLw9rI=8&^ba#4x|{E#owSom#I2jiAd5GAZpt96lh^#CbYUo zxktms<=(@@DZ7Qow?sUK;K#~@VZoz}1!^KrI3T?U6&)EV&bCiO?V+pa zzpc`pmre&o2oPe=>;9peqd@*u;~&dCubX~bo6;KsvX7$#(YxSZ}u-UZ;siSZF$O*G@lwx&v)_MCjr@!P70 zS9eLr1_A80ZStpwsI^W$=@FwNa8y%HZF}&_TMBliuu4OWeL)s7pVpm29ba#TBu7** z(m4WE#_Jik5iycLRrq>ngTu{3ye{E@{RAkxO_8}=>@xtt*d@R2X;0^?Ult4V%@3M2 zes5VE9@^LHi%osRdeCG{JWlx-J$-;?+2@AT6PXwf&l3-D5ulwk?Q(k=C+RUJx>n9L z`vresVEffWvHhpBAPYiMMf#QAI(xOEVZl^= z3e|kTL{~*bmajnF=dc2$@50r<_&mm?NF4fb9 zN_E0;TiAhJLFZ@6D~ACze4V#bsis*Kn!X1Xs;*oj)U0?mR9$#8UUT8I@wb}}@29NY zo2oxCd$#(I49{Ag*ppAImd<(wSwBqfO@j+_U+@bs9wD9J;y6>pJmRF1wPqQ*t$?;- zbr_fz2>1@n%*Fn$t3tJmRN=i@p_BL>N5?Lps2+xk>P2TEg$BltPS3Ty-=LpRgEl3% zszSe_Iuv=+XR!s;Dx3L;;q1I;pqcZ=2{xth_?X}87%cSUk$xO2<;L^LBwgR4fr_Mn zAGqa@J^Cvy9TOlk{dh-~<^{;O@ccKz(@p<9f|q;}x7Jsy_PoSbLroa$(xIy1sOK=6 zVVG#1o1CkFY}9naJ1pdJV_4Vi2^9_gUc6e=a+6j<0e?=C-otzGY~7-r^mT0I85Mmm z95J4WGtOa_c!luoxM=aA*7iukfP>?P8z1$tW=h^{tZ;rme;1ioAyDfnpcoE9mDE=4 zGM33EG{26!m;Do)<5hgB{XJ`Q5Nf$M(7R*|4$;4P>xmHWUddj}#z?wsRSSb2F@e6# z8Hm+A9jxxngMpAWN)@Ox!}Aqv74b>axQ}gz)bz^-k~HHs2W8ngH?PM1g^Na<5yE9} z8s5Kt$xGQsSchUct+cJCpFjv7nxrdxO@9CAqt%4nP5;z1pFJQDlB#1|WD`2eQ36w~ zUKOT7_)8KK0Wg7ANopROG)?qBnXVwt!1Ipu2QxbFgwo5>ODw8;80Cq`=WtZ-^W38k zJLmY>KKnoq6hpjvl1UZGB{WnqECZfBz!LKWU;(hEh~z6ypOSk)+e0blLn$^fQ{(3+-xbb0VqF-QG7>c-hJRqHu0=QopT z&mnd{EDXX|#%DG)a~Bz@R|5v}WCeUVK!ltY*>y`hFInfmL4l^+A521}X_}dUnT$VK ztXtMY=eOamw;cQ^Ue9TJGo#irgLp*bJ+cL3e!F5Hc4ZHt~kD5DgR2&v~swr zN`)?L&O#H1UjlU--5WpY9#I*yd=y0rBYrkv|KjjvnKQ;`$_5VR?J^bn>)5V*b%UPb`?OZ@~v^6qZ&r&&z&@z{;;1UZi^~w3J!6t1qixQ zdtRf|LX$1Do}FJ3fNXz&YWVn-PE-`;lyQ3*C*btc^v2;-Fzjc^no2q-ItY6Z%rJo& z>dRwR!iUeR#Z<^kFBCx{i65c1-Z-OM!syj6XS8%)^Uc9djvM-kRWX0dA_ZU<&9hxo zR7Whcq#+Y7SpDr?<%&|F?~kPyHUp>0H19TsBZPDPgXn&zpm}UH2MS)G&{y2w`3pQ3 zmJO5KQMF^=TxqKHkp;En_+!x5_t;d7C;Ysfp5w`zC>g|A&8EjtI|Qz;Xi>AUkkj>K za;kzxw@`dYvuEH;@5vt)I{r>ryc|an&ozkt=E^<~v`&kCe?r<1!}pm79e5A&SydOJ zwBW7WIwKO6rDjpf{leG4gt*xbLKApv(T=pb3avPAY4kqaY?VFW2+(s&1L+x>4f1PX z9CH=eZko-W-Bz;x&*F=u&eO1n$<3V#I>s(@9g>=1m1VL`Wa1@QsxNTQJ<gai6;Hz0=$N$qiT)CzW&KKH|4c8o+e!f4+FEu^ugz!4X@^lfjDjI1Z zHBl*fb>YrpLm0JbNQW6wB{#J}A>(BZ5KI;YG*G|OaxtB+Dl;&Y+vMo_h;CHjFeDbN z>c?soY-jk98K9j-&#G2ph6eYhnk;DtU`9=6sp|EwB&t2tc`ioE9J(DTc<(ou&!=Cd z7pvE$GmUo+RLDOhSpx7;U1N_|9d93?*X8xzQZD1p#w#N4Crri&!Fl_C#I9fO58JTm zJ5+h=VVhRuCu^(w!6^r?m!F38!>{e%qRiS#p)L4ctD`fZh!nJe5QM_CaX|DU<)%s9 z^hr8wkCM0;L$-cEDIt|6iaqkZPwrM-FP$9Pbx5PbS)((;?sPb?TR-K>fU7uv+>Q1m zaYJgly214M-5f5EgHz`3=bY?irL6jv4C zD%!EPn1o1FQRE!AF=w!UH|vyO(h>t;tEjxZ%X;=)g3ZShDbP2J8AW*~MyPp6x**s7 zsTVS-(%;DvL>c>fQ`>lCYkS~ruRBmCdwy*EE!K@mpkN5|JTN2}CmrCpWx0OArRrWZ z_l=>(#n%IB0yTfbLHtbbV2}cLRuh#Z3oOZO=F-Ar;$=e*@7e*tdu#K>Yh{@IT$az5ud6=-4OxnkZ(DgQ7_G`Eq|j zc2+9@7Er;vw(&`uD?~AN1X$)*1(~9lFYfa1;$L$kgc*xl#qy%%Bmcevcf`@(4xt}5 z=k673>;0dsR|XvS3CW4znflb)KRol7ATJf(3MUq0MPZ^=ZDvqx7GD#w*H(AS4lm9Q z1^NwU1b}1AT;(KGw_#QXEJ&KT?USigP11wgQQB4r50?elpd3)!NsTeuH8?d!>|<9T zm(udmeS$driV)7Lw>i{ZB$hHI<0>qEnMfT2Ap^OHs<0ahQfyzI6>lvg4X@uqENXcF zP1So6P^qQ0vJ3x}_|FtwcjMFRo&0LkD{@tliI4PT_XzqwVXY+M#w7jV$Z@SO{huv% z)sacz?|ln}5?8Z(D_S~Nl*kOJznCR!1i@TG_`R^@sT``eNO69hm9?HlH(p}y8s<3H zR(_ALAGv+9n1|ByCw9Mwk6lYFO2NtDqT6EYl^&JoV75g`vr>ux;K3mbHX?%|S6Rfd zmAybKkf*rKAKKq8UyODT#t;458>DY$gR0sm471LiEjW#muvvT=pIIWg^P?g>xjCn#L@3) zEfC&&=a0hm9S$#65HVL7t1`z5+_?37h!0o;50`xRNo2d1^P3Bp?gk16WPu$F-nX{Z zf3$&ljKnZZO~#&Cmp6VfG`6dB)01?gu`9p;pZ>PKvLPUCgXglApH1TM$3Sdb-8vt1 zjuwwD#L9a8gcJDjMYT7>piZe>2;vNZ|WC-0g(s|RsZMABQn}tMSeD2MDrUeqvCkg^J~nD z6WR$IAXU<2jO&>hl0Oa=I7S^;>)4o^w#bg94-@dCr))yIBcH#O)IiMOAo(Bs%iNC@ zhRSDMKLtZ&3cRJ8*DY){o&?#B2r(X*0CZudco_4bck4l=Fe%)r_;f3;{adFk2eq%u zHH6nVd1@rr8DalU7nCeOCoE9`b-gMEx4sfdrI$}b;&pohCY7#ByyyCn;zKTL1J7&N z>~ULcc1d|c8->LQdD@7T>=ynoX-n!b-2)913Uc(SiWh$Rj;sf_m7B;jDtL&xIQ1pN z>S$p(8jq6F4IH<)|} zVlZ9AXPBT{!YVUi`BF&!5(++q23f6y>p`WS2Q8~I z@4X7tEY=|;}5*E4*hL28W%l$e6HzG}uRkuyaH zKX6@Sum76z4$BqbW~fBSTFdqdQPPJIT(ByK-rVFUxI@bbGv70`s_3|9I_;R1wVkWm z^(@nDBAht7#c|8u1E%a^5XvLJR+~ndnhUG;_y0^QeoV4=9)N~kybdX{9~-v!90Cq!OEorgBHhy2vuK{5$d0U;%o(& zDf95Y)rKvZci&2sF+AezT#Jr@VmT9QXAFS?&Bc0INOp|TK+2VGDnN1^Z`d!`4tnxB zwqi|SL$aACll@$PrxA5XHb0bF?To}`>*40ZWj!c{?a zGeAtzR^XFHV!tLAdrkZZocgwKEy;9P>RYIB&;EK7RgYT|_ zF3O@fpUy`u6|71>G^1NV1EtEGESFXRSiCRso!0-0WuhuiHma8@`gjnOOR1W|FV%kE z`geXL2x0f8wPgXnPjay44e?2L?tw<+fde-T5TkFJgs?Na@XG< zEy%$yCIZ@SpvxaWln>B$s*PZcqpZ^0Z1h$j$)+RK341{IoqFjcl#QpW=z=y;OJK4O zjare5mFSj*NCBtoYcR@mT;n2bB4n1K#}M{f9ssa!5#1%qVb>T~u!$p)Jp*qrp5==+ z=1Zt!KF>XHm9pt-&Ug+k+D_c%+z?xcA4~2f*Kj3kOpo$g^6fGfpYf&JP5+7pZEQGJ zMR_Bj(SS`_?7hTof!jQmQ_6x1znWfve`g@|xbQ8}nYYwayB~HN8sI;^pPR!3dz9w& z4BRK>-Z)4){W)0wLI}ks6V*9rz)6|d84adg2OroSkM)mO{J9{aXrE4`ipV*g>mnzy z6=8(ePVjf;6{_n(ei5GmY}396vGeKn1pL;J*m3NDfjYsrkh(HOZo|^v8^ z5lRtwFrG_5WIH4gm(4PCQDc_>+(r8+= z-J5-{oMU;!iR!03ppp2k3a9=<#-=!mxEKT9kJ)FI)t`YJB)znydJT0rpNcXe;>!d* zsYk}i7SGB2&rMZP9$E$UCMSs^3@IDgTMgtMe%I4P&I47@jpw{+<3rH+uRC8)v|Cvh zYir>>{yMdDO z3Ef&MvoAP|fz0U&sNBfbYy+YPLxYLS{-Q225^#ShyucC;#i-zeur@#?fKr+qk~N=R zFGuCC%jIS&a+6513?+B;JOxIpqDMugqX7XGe&2#u334uZQnsfwfYW_W3USnCWzde^ zrMw>>qOV+g!eO4uSOg%$RN9JH+de3cRGKO2>^5xw4@2})$3@FmA3_@ji5Asy_;jO6 z@qQ-xSe@f%V#pqw9Zh}oi_RJUys$EYHbofc3`ZPSk$+pAFPH7nt7gq5rVGWCekQG% zv6}lAH-;QX8iFdGRp9`tMk{FO!7$|kM%MzJrziyK>ivf7t5s2Umu*1N+gM;Bx!AqK zlzI_Mf<{5Yfv|V&QXYq$I(qXe*wB{I_!8~&@pZgKVaa+;X6}dNKFRQvH<|%z6rOu_ zu%Dm~9FWx}|R+|(wru9S+00M)qw2PRAvOMsu@o*|Mxc8cc!wTu`J zphYx!t-%9@06`(mt|%C#La!a&gq+gIYGs+SV(>iFt@VY%X_Htt!zjCc(T79swYGXl5B z=)!$)OhsEhY|mW>-S6jFIJxn1!#tn zh+bW_IrCitNBZ47La*5C0*_&b*GJ#?qZ?$20Qhh&wyLG%XM zzAUxsbSjM1IMYbFY@s=2>zG5~{stP4uN&}MV7mZThjJMEQ>KjLv8eHAd;d9|y;AA# zn0g<476yXwz=C#y;z6^lcHG(?l&H4hV_L(mq5URDkf5H-f1+9?nw_TnR zltr&vwX#(gz*<6@qci(_x2Em{LdrxI@nhJHd+rBpj0z8%sVCw#*=sis@Kk-~8>5ca zj=c}J(x43H>HovGf}H*5?`d!lFNh_%v#0t_`)Gl9_%h%oZZ5y$bT}cmp>vrz{dDm- zUl;AVq5N&GF}4u|pTx)keCPu$Dc1@PY+6b4jxp7Cgm!AzZl(`v(USkRizl4`0TL!r z61jL4!bnI)0009300RI30|1ACAsW>ck&r`GiwvLzswZxEDhmsimoE@$_1pc6#JS4C zw%iBQ<=KGKxF80Q%#Qi^=6>7P@$IEd#CFK3>$puqpjv=~n5#SNOsaA?RlO)GG$v0` zq}+Fa)B^5FJ5gfniPT#T@#E>-mv+?ATt+%Q>h60jIy#&u2eb+qfEwB>ojSyT3R@&8 z5~LU`2DL^V@CqO;E?lGl7Py>TQi1V}cp-D~hYoU;OwK(6Lxp6Pj$)oa*!R2WPn!is zFceHWjE3{6tplvaRp+TGc-G+Ep>bIb`IN0yiJoZMR>&ND<#%vH@gW34kw_Rz+A9Q) zVnqp(f;7lwp#Ulau1-7f$0^}h61kren>0cjcW zy8VUqx;AH;@?-0AeY=kLeck#l+Vd7mg{lE+?%PyyirZ#e^1x(WW8q+KJfrW;9sF(! z1x=g3ME;Hf6*zj{@^#a!?MK}9S2vWEE$4zfd18Xo34~JA%I_glV-iS~S~>f%+H`PrRB&Z_a+jM9>UaT8XGL9uR@^)_~<&?JqpDm|VROBqc3hthT)1E=4vL?m_a z8)$19}9fg8g;r}0tPQs2a3w%zl{f!@?9fis#m>t>7P?*5%=g{8|2 zCiiz17^;Em>xr1H-CYQ4CxUwGAgg-?#qIN7;)A`8_l^%fX`RYtSvpis*VF#)!eHl-vzZdbI(>VD*fJ@@)1g{;Ya5gIJm* zpKQprYaNGwMQ8|Ak6KABgLnfIfPx;y(heXPUI0r1@w~cPLwdB1Jk3@@^Y*c32KZ4*$+ukoxOzVb2ekR;SGh~Coo9|cuq^UserkvY-10G-LM|9Gtk?A zOd+1&WbX`;h{&=S(f-4i+2D#YmJ5l0y-X>p7^g&B97s9<+pO3|hnGifs5&~tG`-d^ zimiu9vvkuzTg*}epw@rJlK>}O#Ney`YP{`4L$DS3iWXQ;8D1)6vbq)wZGPG|1X1f2 z>q>C@$q|EIw2`dK_l>kA{E#Nq(H)f*@4Jbw(fSi4e^xwy0@!<&V+!~p=yZPbI5|CH zaLjd;4nZ=^6;~POavs~7cn~%EB%a6#)Kfjz1RTORC>;8`S@Fqp zKds2JWv$vzAhH^jiBNIuDSH;r8YPE}CrtJsaE zg2%x3@(0?{;k7{BDIl0VTFT^&;agg#(czDspWDv7fN3i2s9m1VauwqZ^4{qJv8M%8 zz4uA+r1*B^yA$v!sX5@x?M8g~=5;q&Guosi-l&ojo$M3COe1Q&0MK#_9$behoq{<< zIaykMh_d!$SypaF!9UOWsH5*!kJDOpS}&3kFMjnv{qWj3y^7xfm4#yy9T?#4xG^S1 z(XH_Gf7r?aD$r0clj_cvQiiLf9$A5y8REDu2A2cgGR~n5(`E8@C(#}wC}^g3Ec@XY zL&_?R<6$+BYXGMdk_^2ou}vu>ImR%dtb6^44tXCwLuOxt8x&%J6n_(^YTulLr+4Gs zR9M6MKVm;$V2?XsIMx;c#?GgwitHZ+`3K8t5pdaw&E`<9!4fw;s-?2W9H@2xtqSOE zep)~nJlZFHHAy?;Bd#7Q;4tnYl_;i2t7js=pbgpU8>896(^X*9DSocST)MeL4g-ls zjc~+nUx5l9j%CZ<%%<6zSg+m?YXcqZJnGr!!ULBtmeASqGhXGO@!2GRxOGi{FJ-G9 zJe^+p&dbtj(+isH@uj*J%J+uYPh_2n6#($PzAwHwp4AL8YJQ78v0|Ne>E&y3gj=ui z{&aj<$4msYWs$YBL)9eG2tbl3*(UDFuJ%a;`Z5TO+U)o(A-a&o#rYF!n7J#wOZGda!8M#L+hEGHqTDcO;J_{q8q}bkbP0%=)^L=l0+~9+oyFc zB>vpMrd_6ii;YQdyCz)A`R8bpuj$US5KA)7iofebd2G(7E6Ko?djrIhZHH=HfDqHC z6j!YgtI2;?P_N!WHWl5HWfkFQ@kOj#8+&wP$*}-@VbCI#V!Z{(I+I}J+P|N^nJc5#>rki-PV&a zHO6WgwNr{rg-Dl4q}+qDa`|N8SAG0A0<-%7oGGgEyqNNH{ww3u+0OsI`Eq9;xLrU7DH+%_^wKHVjX1kCFU!p=2yMx&uEWwjMoV69(soo z{p<54sh$3;G4TWUUQcNzmg`e_vS2iY9t%$G$40F4 z0$$S^I@-QU;ENre6ua)`Dv{>IOn)KJtK1u@R!DS0n64pJcFMT@ad-PI-Da#>l#Q|Z z#<*!N2W;r!zTfj67x=yavMpYgkaF%53izU$rfJFn47)&4IrZ>VbJ*;F0qQ=$&@XAb zS!a*>s-Bbn`E(WNWS)xH`LKVqW{x<)GgbP1s5}QC`en!+q8&F=ZGV)dk}Q^~vU;+9 z&3_Zqk11zjEw6Zd{ak%l)CceQl5&~Vx80G}7dG82_@!>t^nt@dFm=ezjsUS+fVlUG z*7~yQ_58~z-!s;q9T0ETB}$|mqKM$UFMd8W@NMGOC0H9)$=%^`rIDCf`z_Eju-DDn z(dt$9R~UWq+a%oK;A)&bFm6d8D6sTIK9Bp3NnyYQEaw!Es%{W)8M-AWPq5qqYRrvk z%~$w}*jK;`eg$t@j_stAwuH8>Ru=3$qcDNc4x?^z%n0yz0CiMsl>@ymm08g=|E$B|x1=x3Tf7)?zr4 z8z4WX+ud&RM^-3s9=*Gmh^ayd7n+IM< zDYRJaOhMo33W#3WGvVjz{sTLevss3B>Fmna-!Wx>ss92NMo;qiGJT_+wTg_nBS0^O zEzxmDZFe$wJu5^p%uo}of8(-@VOApW@PH=z0v4UeSWU2IC^FQy+4jR8k&p>;+W1gWFZP)Fn)Yt^I| zfOMtO{<=I;z`~Ev+$}E^62^Gx@+zsf7aXF2sB=!2Bu7NVuZExnU*h>^?uE504Ktec zB0;q%#zfnDjClW=1<8;Nf^K|_dU-UjRH$+sgvppm?AK0}zbT?ahgPK$oZsG~rFIY- zlvcP}@?k2Fth=@G&oU+BUr90D5bLq6F{`7*@u^r2q!(@L_nv6$#?~j4j~^VHk?F1v zl>#k2(k(yrQ8s9JpD+0k=oemGUa2i%x8L84OaQ>6vk{D!33xuK;AylOunFj$otK$7 zAu^(jgNG^FkeD3qp_9|Z(dws7&=YSmbc3+1w(`m3_gEK%CW^691LrfZE@CZ z@{OLJ!md-?(J(9SGQ5@<)9go@b6J!2r=)fcA}P)35dWt97unN&*11TP@fJOq8_iA` ztHkpo$2f#R1IsB=;_-JZ(bk|nAjygg2tE}_ObKLHz+28KRkKz4?@_yk62PtAe7@_2 zpG)ddRIvBE&Tk+Y0DQw|l~%K+I?DoqAPGz_A;dUs$@3ixfZ#XF3v>3zuz6rHS$N;| zRDAty6>8KQ4%+B$40R&c)jp29f_CHyiO+iMn`#yiP1d`DjeMJpl1oyLJnRn+ zk(z82nL)$|DU|_|&}h4pEE)Mt5GXuwf*=z(M~B*o_#`U>xVZ)A*hYlVp!hPY4);eJ zeT2}0{lOmonv*3)WvGOV**n)DW?BZq^3`)*<3NrQ;D>5~Q%(Z6wduD-I^}72%5J#k z2;H9ZDlfE509m{0HtsZq>Ie!e6djU;Qj7pAqPL?k0421N;b7l?D-RNF?5a!&aJ?zW z<{dM=sP4Alx|1m-Q538Ut*~rH%9N2uz$xumq*Xz($UN^wlWAJgwIVNcwAytGA}|)7 z41~vA#6vkqq_&h8tJOFO*mNaGM6GQBTUHrv0pYr65{shZTmqWFMv@KMLaG{0EnCmw z7|W#m7#bgESlNtPy7n0<2esXl~!0F@( z?~!t}f?hlr2!y&%0HD7;k<-VJ^)i^%ycg5|R2(q6DwaZZfX^QH*g=gIRH`qAUUUV{ z0c_FS?#;s6`ZW6lVOO-ycp^|}lEb=e=jZ>aVVV!&Xab;pGRChU-*rpS*&gKe3$glO zsxx7vel!$8lSUAiqr+1;mJ@fIh-|w+W@;soSSv=TPb-TcBdp`a`2n!^*EQzZQ*QuQ z4u7PPd$J}42`nKcFJ?`?4|Ib6Bi6wpEWSQn5sX<*dtaRSLyAEbWU-D;ksVV@COAY!T6sZ@;>96qzW6w$J>!->DF zqKD_qgITRp22d>HzxHSLs6y4yWDev>9Nuew<~4CJHZ`_$-vGGNOA6@T3XcCSH(4yU zp6WyE-qf&b6cw%Qsz{SbT|Ni&$SJMa`L#A==#$Xlr9Hv{uC~xCx1P}gLyJq1>~Osln$FreV}G&$376ZTS@!| z{}s8}JrqO8Z7Qb`V(B(ZNVid~MgrDGq3e@z=`WX&7iEcIOy?IdM zVXzQ{bBQ%X4sPoy@2k4Si}?&krvUkOB_~cxDrw)UKbpr53N-aUY)$~N=lTelxxFxb_n}%m;BAX zz#9>tOfKo(M}dD;M@3xn*BzeMZ#KlHf=uQUk(XV)rae#N$*E6S-Tp5+QHo zR)F{$m`q{c?z*Fflk8eif`jyR%VSC}k+-l36$o$hzM{XYxF+7`V zE?M<DznzQF-=TojiWTiCr)^h{Q}d2F3iu%!)g`5tcLBhJ zZ9o8vmurv(@Vp_qW;A0;Faq#Ofe~5&hh3tZtKlgSdyjHUK-yS-g^*zEri3v&<0Ipq z?;LaWzYBnyB7Ugo%I}S&MIBUZsEwdmIj0gJ8NpIAF&0TR2OfRpc&)F)Dqw;(L_-2{ zur?DSyhN$BJIctq$lfz?KqeAdOG#uQ4$CwvItEh!K}VFi2p#+1;Z!HXkqzxZh?5!( zH5xIZNW1K^?2{oME?1^eaxM6@)X*@yRW|~@TJ+57?Q6Tzwk*XFY6a}AZ2(qqnQ}?k zW)LG%*P2m;<2nl!y(*9+HSQ|tsB9$~X*9qas2Lzw6|#1XMdC>zI*s6)=QB6J8jIuvsFV{fRZsRDqq z94H|G021**nqx0ehD@d_m;V3&K{8-(KCuW)o~fZRyO0g^{7wZ#|M&#nkd%xI!pe%R zqYVD@fGcVOFw6k16)c()s<&GgHjA}A6+gG&VSFKzzwvUJ5Obp}m$W=PzM@n&t&G^6 zd164~?LiW6d_u_GaA@dbbqL6D(cPy6j8xneEd-%40ek`BY4T-)wNQRu3zlI4Y~PTN zU|~_Fy!qj$f$VQKJawmPImR18WxFgs3eB(o`}N)>{r|B>I6i`^$MA#rFT$6`URh#Lk=k^d-7MT27I zN2O|bXFKXnGrvb#kw!B=0!Pf!pE%s0mR(ziBMS;iM%YcOS6ZY!Hj~7_!PxIqsgKkA zAOeBu@c`r0&=j@tt-<1wmWrDs*DXKzD9tK|=sL=QGS3|iitWjsW1^<*GPaN57Q-va zp~x{g)T4&A^7|_3q|ahKIjY8wu8|>4aKJO<%Py2+8;SQFPc|_HH#w=lKZABP7h2eI z$^U^QoxYF;Q5>OWx-Sk8C!dQ)8?Xb0;bILX!!}LVmlqEl{Xz#>O5Q)u6zqXXTo5l3 zF%c%;GUfo&~!YzQPpwIzvKJ>RB2gy<}Az)<_W ziBoEa`&vssX8)u@)VL`-IDwOU@t-$)^ElXsDBWlrZ16q%U4D!kF}#N)7OC_Y6+o90 z2yv0avZ0@OGps!?X3ZUT|6_l0humRy2;tgR1VCe$s`M?BQ#H zjCAkgfzN3B=geQ@Gu1DdcfmVHp%58Tnr*NFwchH2hRpAhD+Oz)9#m$(1BS^lAD}_Zu>=wxw zi-m}R)Bh^Kv?v+>2cFsCQd9tx2e4<8o8CnG)*FU>s^l`6ZCSnVmmUuS_12%vB5S_q zK&CWeQ$Uy_CH!BzA24Q|>pXQkx@miv?fUe=&6Ta>q4Jv-7Qe+wa(@g0P%t`uO24 zh}6Fc1B0bE@UyS?D`Q%^`V6eUrw$=gQv{~d5~Iu~o6A&+4l2^m7`o#j0w8horC{c}?>!_gle)qYJlRRmk)1)w;A{$-gm zBDn-3LR$sBU+YCcIQH!Uj}c4|%4X1-6vkd2_wk=1r-_k8F&zE9?sbsMOj{A!liFXL zTPhTs%kS@p@-fT1Go>ych@#3J7n3e?wWYdMZ61iX;kculcj~qrnY`8Fcn(KU=XH%c_LqS zC?AD!n9mxnxNE5YQ$M%P0BisXR8cjwBH|GdQy((}=AHB$SJE_gS?#{hld9Ff_E`}P z2Fe({3irZBglQVkRllPLn4A<3Ml>f{T#fIM_2fpnw~ph1Vge2}98h}jkzalX05M1{ zj{~?6PG}kz&eAlIG)2pMFE!%;JU1C9-A;#Fdgn|x$3?tO^w@W9)-mG&i{BIEe$*%W zSU?vfs04S&K-21`#FE+NaVcx`F9L}kxqU1H=U#wQ!5xEvktC?Xlc3Ds-R;{T`Hi)h zmOUQ6Iij2tcaijm!7^j4AZ_h)y5% zUQsE`D6ALS-_x*VlodD@nC zD)G@CI{&+HyOxpUV9c`gH=<+CA}2Cfu4=Lulf^~bv&c&Be^a%{$#$ zuIzr9=h*45u#fyBi0hI@NNwmihSl11{Kg5YOLJ?=IkD^$#%k-@mSGKd$?ns-s%w zddK#Z;rv4gg6!u6i)ry!Nkc!A%u(V3s%2GV2*LE*Fz$EU@igIv@SBKqHW8W}Y>5T2 z`;x~(oWFape{@q4^isk=h42-iGpFI$M3i8<3%I%Oc{4~znwiXQfU)SyD9pg!jgO7r zyVwIXMJiL*Nt&;28yRi>rS{A4MwqYU)EZ(oLRkUSq)MqHs@vjt2oVSE`a3TsCvrTf zGuB2J7nv}LhCGcr>U_Z|_}`Tsb4davNOB%5WQmndsM+~fRDz!D=RfLqs=^4V*eOeq z0E=f$+(ZTFQrI-|H;r=CC6x?QX-k7@X8G~4RLD(#n;H0C8D$*dloBb4?gn5-5KC(; zTlyO~-G}JmSMK`R>0`s|(!Bh}1i&G5s-~RYB>P+!2amtC&TeC~A~|%lHTMY9?g*9` zF1=tXvyxhM8adqvQ?w!}>n}gndo>eOz#0E#oRF}c^ac3 zoAyL8i@t&dX<0V$xDpMSY$de4ITrWs+jf?_=;iojA!RW^VAG_6VO~I9*CQ}8$FI9T~OdpvnyNY_RTo`!0T%ZMYERJW4|B`i5S*kbIS}k zJ&P!U%v|C7jay z2`&)+OCTfUiMAUfGzSd4g>t?bqzQEUVu`zH3u;_i3X6)l9kyxT{T0TKTyC>do zbqwp$s)cg+WHwXs`m;Yc260CFl?r&f!SC%`n&j_u#%QPdfmV?`=h-9-Qr4a^2%XCI z49G4b6X{Svd?tMM>Mj&Gsp0hWijzn^#pZn7FA+>0;#dkNvkm)1l8L5_o0Vi({* z&h&P{@B(5GC=Qj?{O?ZXuG&^xPDBAx?9Yv16!j7#Z+=q{G_`vA{o=}g^rT4lzmTeHr5Om_C0n^-rc#9~1&IF&yDY!DV zm#(*_M{mrN`y^@~Dwd(jR91<_Cj9{YAp!tm00Zg;B0F7(&~Mlnml(M?|7G_(`qHm% z1zo9*5*ovsWi~IOx2$J20soqRAgeJBsan&d0^OzUT0E*y{$YHc>&ZIyTAWCuVq}(Z ztBmfQgx`8qM*d#)|JRZw-{{4%hbsUMK1ysPv#d_#OK&WT;hm_t-UFWfu_*7R7vQ=2 zpC&Nk3$JcI3U7xmZe`f}TQ(ZR&u^uq7qgdQ-ayli6RA9}xY}>5k-2U9N5K-Ird>ge7>u1Oov{XS4E}l9hl`pO&;LvKca_wWS z#zgH#aa>}2`bWP^(aWLImkSzyya%ka!b^8Tv)R-E72PWt1@TW9o@ZN1x)rC=k!{)r z-PT`1PG7LlP_KW@eZo+1c#%OutwB^I7jS{+AoY5~3#u8@YbG zbe1N7d9E8ikK7zmtTX$i7iL~I_lr(cC`E~#a5V8{(`|z9$L`)ML7kbWi)hc2q7Os> z2SqMtI(!-4poj5`vU}g)rImk-inBKIu57hAKYsTvYKZB_NqcsvsY-s0&z<*W7MQ~IB!qIn*fFE3Zb>#NY zeB(j`3?yO4`%OOD{}-(LN&bqOlGQhC@G^`<2tm>13Z1YG@V(-VVnhESNWywE&R|Rz z04MPo`Cw64lsxg$Z`_B!cRz|K@-McXlC^5<3tLS?sdcyRHo8d`lt~Z0#T(kjQ3)uV5kLnizuK#AW+dRuPqV~ZmnGv?G2{FeA2(K=mvjAY?f7r5V1GRKIu3YTzgjI<55+GWU#B=1vFinYZ+`_&+ z^+;Y4mHnBG`63Jaiv*z~Ap&TD&U8BGzislqz)MEUMVJDR0-BbZgz74=L;@8s#v&wS zYf;_sjFovP0#Qd7a$Z<3{>%k*{{Auqf#^WtYwN_Q1{9>*o?a4n-#mQsFgjiZB+bNrC_(X0QeV-$2V!WzBLq#V&@TBet1RvWhAN zhZq6}RG-iC{5qI`E1)&$4yi#~Y0ww|3;=Kd00eR&o`SU!{{kl(v`5Kmt6QE96J#>> z7^A)kXt_$hC5)$QRO2uQL*V^x!~T>DUl~41Kt3xHFb;@Bkq@-yV;9dEUtZL`UAAUo zDOS&-hbEX8;E;@Q_mPy=+Ys4dGqnZM4`CkFf*ymlE0hYMHg#x0DIqyA1!v|8zfyQ0 zn_+SCy$AYsJ1xue#VJdxlwGD-1vS>!;*~3bsGLw=q|u|}QNk}fe1u<9L!mn0@|(!C zHQkf1!M$MJj;~Id=}oH|x7nWI)pplXlW-!bs}ok`NG`KA)yYOal)%`hbq*H*%s-w` z?tR08PyOuzg8!$TI48awZo1}ja{EhweZLVpgYpDEngLBd`L z5ed$av$F~lJ+(QP9H<2GXb#ovXTRv=x~Zgkz{U+bSQe)|yJnw}48#BP1Cny6h=0u{w@OoklX{0Vsq`1eWZ;J4T&*DlZu7e#`pc ziW*GDrw4O;F6o`QCrzKaos-9TW&Fh6@;jmnX=pu_Hv3C&?|MdeNMHSSD-cFJBBf+b zTD;GAm5UES2cR&)p6OP$7lUp_CRBdhQt6R^0r)h0Vuicm+7Ct&;Almkv<+_meJ{@Z z5>ZEU%ErIQRHIEM*lAHOQJ;o$uChK#^0M?R7~)n z``m2h|E}k#>UCme6s(@C2l3T~@*Ar4b5<0Nj%WanP_^x2b|cw>LI9r9dtWD-;1=y} zDF-Qi-H|Dt=70Qny)4#dd>-K7mv2T2cr&7;lK#+GV$2OuEvF6eSa@ji>U*S}*}CDU z5t0e(b})t_439ZARhMa#au%r2bHy^LnbO8*v=vmRJ==l#e#&`>d<-JUY9j~xIe$t$ zJ*dncFy>>VCJ6!4;xdyY3?+%RxXtdFhQ2kC?B7v8W{g6?o>Gwtuvul?b6;&s=_A{j zj0F*x{X%c^rR_}Y<-~;p&YOtC7SAxRlr?c^oRk^9XIF|k@t1kQ(+_o z)z9s!91IWNv=AdSDU#jvkC;#QFFDBMTDRt{P9&AN=2x&nX`Cqhw^Y`)?3O0~tEn{X z?q7u*Q%qg%Dxa&gMjp-D^ECf|WVa53Wb-Xn>s6&8c{m-FdvU&Ng(r+%Yd6;SeEPE* zf6-w&!oD;6k6>_y2m|1iyp(UmDM|2d^7@wf$vjK z6&105+f1avYye>}GeVi!XI^icjTN(S2y4vh>e}PC=OCDb z!fL;=O)}THT{j>l{?O0IXV?wiNeL#HbaneD7ye7EDABX@oAfc}SbjU((~H`mH8J_O ztfgqs{xgSRYjqBZ^#l>;4SxhEW0OhKw`SDEDM#&}v?+>@tfM=Apwv z2u`YjL;12n$h)2+VS=B);WxqMr<3W?rC$^oDRg3Isz9mW;99F3s_Z4l zENgtXA}zChJ+n9g%tLPAff*|8Xe=l7!LHP0czF{qRq>sw68pJ}q3c}><`AnA*SJki zzy(-X9PyZ1eoS}sDO7QMH07F~lcv1nH{1=%n~P8L@7(T=uj4gt;%@Rw67rX{=h}ca zspD6#uAinK+No?)$)Wl!^ZFSz zTy1YRNXmt0hIX~9*=eSzCy|#wy&kiWrn6bm*ut#9`e()G;*p{m6Ha>bNLoEl$V2fH z<`=QMHvb*Y!sOJf#8WG#DJ(I7D!cDK#2WV%eaOGma|<8K>X<)EZu=fd?FOd;zx8o9RWZp~{Q#v?tCb<*(3 zI8cX!A;WI=1pT{CY0zqvM#(P^Tr75`_90fT;UMwkNGqMJu8bNLob(`#FZsAmoVs(pb5ON=C&earNwlf_aqG(r{ z3g*y?#irI0_2{DyHPq7ztvo2k(?oU8+H7nI@FHS3%(`Zk6aP)IE{pfx*fwCQDk1T+ zncD>+uur<}4{UqTYmuh5xY!A3W~ zP@Fq#^B9NyaRPoig|hub64T3Y_p}X1J5{Md#R>>1}m{C9XrcXy+{E>E z%Cw^2!T{+eDCXH2N)qh6${pRgTw9hh#x{j6?U$wsqq7}1x8KKXbc=Q)V^opxfLX9o zWO}Q2oJsDs;8muc+~b3=PmeW{xv*tU4RzjCz8yO`-yd1bmW9^;rriSJ7c{11Sk>og z0JodEXj786Q=F#`a{~3H*GS`lLR4i1Cxxx(z&#p+T|$V347UI_VIdmTC6*G#8-ZyH zHmV917PhWrSZ+>)`ItOsi`#DYQ9vgt;1PdPoZLucPDyJE#vz8-4Cq?H&5 z81g>Y{nx#v@03>QM}`y621>vU^`c7!3BXdLyv2%K7e-(rVYWFb@%h^RJn@+i1t%AM zj=*;TOoi71Ae2LT>Vknz0inXtLnDVk4_2rESi8AogSOORPsM_R4KLS*VHe3%x@Cre zkY@68_~sx(7!g`_s9~=U#v;znKp>y4TfrHM($&^Ge##|zJ zpqN$t97XnN;P)F^$w$N}aGb8&EvOGNmc_~+>$EU}o~2PUdi>`>R@$*%nW6H}Q0Ix$ z!_r1Q>sA@0T%D_@P?peSym8>dn{ShDN z2g0C4qqJ%6$+uHoHt1ka>j<^h0-OdR+npu{fLg8+e<*-kAufQ*BZ8`UNc}e_Pawm* zAhn0>e+rJ7f`U|!>NT!pY@~240h$fpf9BJyoh{CR!e?B@-cb17$KL@j!5a-M>qPwY zgB>qqo(=h>87&`;%qGnHICB5)%%5~vi?-%*1Ng1^-W#cLiHG)XD$n2*ThHEo#2x;_ zG_6s$jVVB)Kt9~@-Ro_k8ehOE$?JT_kqo>D(nPXQaOOJYn*A_p+@o`k{cKnrh6EcO zA!+W^U&b%g@lk`i5#<&eb=KohW<$b04p&)An#o@4rBEL)&ElsYt+K=!Bo~>eOFlk^ z#$dA<2|BGya|J~Zc+Dn=Zl}SuJPyWo&4>mMe7du=2jvY74n#YGDOt4iKt+gNGD!v( z;G(*3$gGhkdfvJjng~hC;t1WhiLA_LP4|XS1IO;&S2tED@xg_uNEP+{%Q)0DaQyUo z>gn>ePosjnF=6}QU!-N)YrXGY!H8`Eds87{PbyIU*oil${`lR9{ zQ>;CY1q|x2i$IGD5K@Uft^fbOnsP5H3nlw@1#G$2?N9?=5@MTi)7`V; z@35>i$t3*Xu;W&W2|u;uQ-FndkIUlnsX1~@X0Q>m{*}XWSHvp#v1om{djaT$n#oiF<2#>G$!^=Fo;@mQUC>?7ID+dX>0UUV z2s1oa7!&YvsiA2o@Y}eN6X(>qtLv!F;`~=t`5ABw7P<9(mZYHQUe$X>kr4LSqQnbfv zURHNsqUg(j7(tk4Bjfc;Bf^b!wqpeKEnMi!GPycT@c?Qe&MHSfFyD`?`9FJ1tX@rgVyl5s|R;b@M-&%~cUbsq0ai z!u5X%CV6oY_YZ0(4dI$O+5zc37nf`Uv83Js*fV4Z1d$Y`q zIb+r~-~vrK*Y25?CvF#oQW9 zHaXy~vM#^%O=9fnnl;-UVGp^SNyw5+EfmlEGMG zrQg1hQKqh9Iwr^Nzy1RSlPPw2xj4IiA^&U-#i8-sJU^@d8U%qoCtSz#N1lfk8}r~2 z*MLON5iZ>M^#Ig+GmNu z4D6UeL*rfkA;vF+fIHj*;msX6-%8M6dZ~EY$bHqcN>3_(XD>QOBKZGM z6Q$o{y{2240COE4`03%-MNCIMk;+dp{#B!k+t`UNzSaN7K=+dsFq)j>!rBoG#aJy+ zGt+oJdLl34c=Q>Jsr(!Byj4vf!v{VpmWZ{R4L!5aM=YfIBJ+*iANislx=67o$VUbU zktA)W6U@$=T6)L{JMJF?X1Y59jhS8&V<}JU32=HxuxPjf$xWekUv2 zrr^HvIT304RtAo)QAmks#^>Okos}f~%=_K&* zTGv5nDO&}RuC(+)$Sks{#45A88FSw`Shnz|E5lz2!Q)JM>l=)XGMIg5I%jEIwX2Fv zPEcF}axaZf!a1cNgnPmjA41&#vY?#1&%JrD(X;++_Mj9(5NV#MeUoY%VAlEBj~qYQXGc^Wk#Co6o8|r zVgm_To79NFgds{Tiv+>Y6h5VV$cYT11K^+c*T#xG5@d`AI)gak8KAEoDw^YF`-64j z64ae^fBk`|%f+fmChSdS)R!l*&{f}At? zCKo+fcS$m?OxMzHk{CvN>MR3F^-KUfw||(|0wqD!SOZfV?pN8yT|thjvDu=vjaIu#k@imx-z=nlp|0YBCDLs1+=ApBxndv3GB& zu^7T~70P`#E-}J^p!Q3hic|BgJ^Q z2b+FdC+V#$8~sCW82usV3M!GR$M7|`ti>5y#T{^BSi_AqDui1ntkSFd3%R04n{Jxs zky=UKJ^8Ix%9B4f+e@wzS{fE}-v5rVH1<>)>5n)?j9+lYXqXo~N zW6Y$Ablz5`;Gx*(=tUaTmd)`$+*ODCtz}ICOx4^dQVNjPOw7_q{t#=f%F!v$`Pl2L~l{d+Sed#^wpgU!l zqM^}J(^(4kUD{+3chj@UMsz!lh|M_h>j~LUdD5TRAS&(4J!QCL!aOZFOC@`ZHLcME z^J2s$Kf@_Dg1txH9Qnx|S#WO;FqPefc14IadAFB;k8bD-q_ft&z-!XslK$0#xOlGU zivdYNIEBwCLFdR}yW#PJjP~V{SjUM|i&;>F)Nix)w>$nv6c87O>up zzHB7b+KBurg>P{{9K3Si+@EI_9aIyleb{2jxi0sOU=dIhnqc4MkB`!LLY91p4oKgr zt6+VBRu%;)ZPZFAG6}q=$l(Gj8C8QqSffsvTWk47cv0yp479`SSa{wd>%o+c(~OfB zF241kUVzCPSWRE=M?Fvf6x`P!cV#QvO4(|Oq<7^W*i2f8V7p#gNEX&X3$x!dc%KGO zm0e?0v!NSiZ1X4>@oL`s8%-=g&LOhbk9k4DF;IQKVM!-Uu858rPV*9$thjCi8T@)s zjN1|cl|74A0T|%mNl9*P%6n8k7J>OR3lWXf56*m^&+sA$ed#=S6}w;|kr^ zs$$X>Ms@~#P2DQ}QPt4G{JX4B3*5G}OU#a_bf^$6na&{^)h&(=iaUjh5p1A=Ws!DV zfc0Gu*YMgLIAKS-pH?>Y={iXS*e$4O#hd997bad`(HiBvgdg z(quazo$g$(Nn#IdqT)KyvJ5n^etNu zjn|W@F=6SlM5c?s9}n`^lGuj5`Vfr*2#nb`y9Ww{u5gN%vYDmOyGk>)n(NJk%gi>I=%f^z_1- zXi~NU42m_#^8}^5smpzl8u78kYXCxfzWqH2@Wm1>1aZP255lcqUX&@;wrG{FW)tO+ zpnbyCA76Hms0=&5QC5-d@O1^f^c1nA2vy;fM`iBwCfBwIav`)hO?dKttfD_RimD(JuX>=ae zzh_I3u<~uewPqkQbul(m!Q%Ue-&mEjq~NO$%)JF|vNmBUXF4~a6a_V`Fwl7B%w$18 zBb3_FS%#++-u)T$RoK-s$Ul9>MnxeM8`G@_Qg<1{`~-)0-LJbWLkbwdL#DVpVbc{b zXwpIcj`lexUO2Ea#uz4hIRz)IV4y+6G(@+U(P`=U2%n}HDRHBFRuVvQ4S7jb864mZZ6KHD9OQeQ7qpZ^1}$9wMN*54T-WMX>|Evv)4kM6VF3AHKa7 zF51)AX~LLb2NORAL~|zKAsW>kjt-0(h$$kn)j$n26HBym5pp$;3#aIy4cU`Me1TZI!RC@7zD!=rmBuz;~Ic?>e_|m?VlZ26A z`axc!uVlm^8hnvY86cbNE$3ULwMx{HA)S=lL6PsPh?qzmT#Wa|37YGtE!j4_umWmJ zGu9}wot!ko(oZZp2$!X3rm>?-{vdeO?_~N=3(g-L+dad0Vw9fs&^~f z(LVqQI@v*7f8q4I`Y5gqSszxig;7 zyu6Yoj2=YWI_|iKhp{`Yvg6{nt~?f4$dh8m;FP4XV`=pccrELo``Suc!uZ_S1Dsuv zmCSYOyc7i3wl$`yYx0aWw}}a{7CSR(_Zhp)$ym?P$=MzR$56k8h{aTsyVAL_QmaYa^$N7eUDisyP&Vnf=q6`ae?(LNeSA$Ozxo(Z4ZQo zVM{@PQzdz7p1X#XG$BJNmY5A=I@`1Xxi)~egdkMYU#aZ^>G8clNq)Wox zKsJgAsIhhF5iYSU06 zMD7^IlcXlZqfG6M{eWMaz{?jz)(NOrTf6gI~jFX+-m1dfZLehEcGf2DC4#Tub zkpW0Rv;e%-TDAli@Iv0Anhls(iPr4lvgAOJq@7?DptQZG z@HWkMof9+dt)Y;UErX|RQ!4VTKH(eN3_5F%szt#z-~Hk&KGef-!!6GinFFfkEi$O0 z0T`VySPHzFvB%~A3yqY$5^wcB$dbIyC?3MLNx~gg1fNX0y4vbDd0=9J?CbF0s=ys0 zj?QSrSWp+=$0Xdm!q-5zs$=uLW@b=YuxV>M6dXa|pom?EC~M1xY%1dJjdPsBBKzvd z`B`j_ZZbRu8Y%cnFKxs#J#kM=8#O`L+?HKkJtwCmD${k6yRaMR{9=(euRX&91N3xd zvhs@YZ;_(eoN@6C6?_~35(yB#tsMb<>OXS%WlKVBUxn<8DJ6T-?N@`kT0Y1fBUiPd zFvEvV6iK|I5K?g7OTn^5{zMpd0|CIemEX}z11CGx?9N+<=+e$qN?75VZ#P+P($t#- zfROBMM++4TVfB#Z-~L&9w_yn?EK&Fu9{6wYltDJ(G06T=kQ~(#Tb`7{_KkiFI!`~7 zCqQ>JQfSgJ*uxVGy=z(g>0%V+fw8=?3oR1N^RIdJl9Lvl<4;QQHg}{ez`5BocHeE-banz2i9FxB-ms{=~aNM$DVZ9m+WvYojVT2mVhm=Y@e znl8r8>fr>CeycO5y7C%HU)mop*Mr4>)6IddJH`J;^Dze#j&n(FF^6MG>a!k%f_b-> zIB#Va2i!Iwp2~dK$Pd%RuiB;8w^f^Cd3|7q1!zjqA=5cr2GP~G#nHMi=F`OBY5wk($leTs=8Tp@-0 z*UV=+3!OTCj`j=n4OKnpGa8uoFd@>tNqr1Op}eov-pemPfVp}9>D)7;?`%}*HUg-| zFl|EW7y3#vp+3K53O&!2x_7{9UWIz7j@(Qpw5n*>)J+htA*1s-tok zq2OM!`4^xSXBl+Nlw2zqOQADz?sb?I~@@6nbW3@{T<W>ZZOrM!RUJ*4a|o#@%5O_IV++N*{sj} zW018ZBkP*1`YQJ<#Xm$OCxxlZYqFbtWIT#0wbqXY9_izwYope{2Ik+7iD z?QZRc>c8V3V0ZNR$v(m$DFZ2E3qr%o%XT%@&E9kXwm7iVZTn0^R#ulop~|N%_V;y* zY`ngid}-Brpbmb1bV{Kkhq17WA#gzC+(ZDPACHE{UZ2_YFQR(+aHl;K^_r}^BFDn{ zpFmHnJmwnaw%jPZ%U!+fjUr}k2p}L#O1rJ=!_0-r(X#T62`r~=5yzq${Rr=z)HlT8 z4n*&c0mVG&XTCrUj6W?1=!T4c;GsLP{oK0&I0gW)^;oKBmTU#{?|xe=G%CfL59pOE z+q419R1zrzMRq9nv*tQ$+vu$m$13`hrAs97rv!s~`R~SQ)T$X0pNDux?QNJ4O5N1( z1g!Z}or3GLj>B+Q<)+J6EDDG>-I)?|t9_W@&!M{s%x5e?!*)$Z7E!X0yqB-pI1YG5 zebO|)oWWKAeNyzH&?UbGZ8n%EeW-O=MaslmvGVZ(?+>>E(G(qm@7` zZx?WKns-;-Ae8*uWbKCR^{WMHeE-M%yezO?sAuBjz>CZ%qt5 zd@%{m_Q^qO_ znBLj7=5TC6iMO=rE14r8QFH*D6m{@qqcwh-jiI^F(l%_n>N1sr$0^=!Ai+UM99sDP zo7TQKjGiJ0eSy2$r5r&W_e;wVJqHb;sIi$(kvj#3rg6r8>A8~`?4-Fra;VAS&epN( zs!|<69W12BTRfyN;nN7CI2LJ+soG#@TDy{R2OK@ySDO-=m`{8>Rk=SR&fxQ03%EWB zKJW-yt?v4aW-Cx^MyNoPLIEnoL2MwJdy^y52YyA{mc(tja>s)kV&;F4BYhouabTz* znitknoa8tSAK(PGpkS%SAcEvCn`|11ZEKaN{}cBENR=*${QrFCVIrGfctCBS*l@eF zKY9*H6Ds7}@45_msOp-8WazywHD}nFSxJ50QP8R$7N#s^X2md-2F~{dpsJa(2G=$# zX;xscs4iSYp3Je-@@%*J0Plvs24H4pq;^vho!(1z2_|sePQutUSH^p7$&$@0)M59~ z|4ns^wSZPr%fOf{-$Jd^zEI^a_4R`{!5ddF2A z=h@@Utgq85l?e7BM(YHgiM5^m0=_bYo{`M_Xxje{bN0vGrB!g>0SDkm0073YTzcpT zUO!KK*jj91kIV?q0Es|$zi8P!tq;sK7K)=hk$NT*9rY7DSq-@aift!SD4^4l3FTy8 zLH<_fT#5__pz^kF9~AQL3KZ#H{iqloo>I_ru_(s-HJ0d)1bykL%vvm_WJ*d1u6N6b z`sy`@@jPcC0dtk#RR9}=vxv5f}5 zeWx?YM^DXKRW0w|;8e{S(p@ihL0PjVaA=CGV(X1z3E)|h0BnB?=L@3&MHP%7>pyLn z?feZqXIx89IV0I^$C+2eXQ@)Yq#36z^3Us0|KB!7DsQHGmYcQXfHKcVD5noEJ| zj-X`A=N^8$4M`JCxFl}`nn_;c;iLNyzwbyrLg)T2yXkxOBOi8bom^dnUOg^=uT{j1 zgj`x$Lep&~HUKOG%wA96$dZr) zWcLeC`t|w%p6cRjCI8^HwL_F92CwX}QMEqqtIDX~1at41p}C6|KrVA3p28f}1GUIz z42f$GqL^3&%$O0$0`{&J4HPJuxJzL0pTjb6iiA8#Jm;R#Bn&6D&ZNIzvgwZhInf`t z+<@zY`jD(l2-gv9R8*IUylbTneOAp57b${`|-H+E!o)c4hKcRNj&-qIs_l=&NmrHv=2M{i+57lu-isq1rzDi^D=825Ov znF92c05kZ9E8=GSCH zg~za9kN3F{HRdDqgMBs`My$G|E@6+`kL}a(u;1P_EP6#TGi~7+?H|l)9qQ)lXo5S8 zufU3OWxQ0IdrVgu>r=!;)5+4HR$ZHY8W9_XU&h*iD!~SKG`m;OLDhw2PNu*f#8{lk z-aj7|z+Jt!Jb~T#hm883*^P>HC_=6|tGH{d*6JC{%M<>dbMh&G$0GOPx96S2Y<=7+ z#k7$HD#GiU!R+h)&V9r7R=nxBbHcAL(OeRD?T-x1IuEIBkZ(sIP^fGS@3z?Wpb7ti zr-9&<&*TEkiK0EGzqPMv%o9Q&b=)HWFkI9LDmMDl;iV}F!$6Do>00F9Q&}v9YM(R; zzk|$$wRV;bl<*nL?ePAQN z2l6*h9F3sf)&Zc2VoqD~W(dXT&kv>++~F_NNg(fH%za6mI{z+f|KI)su1A+7-ST8( zywLrIQqCLnVN?aRvkAWW2358LZ}0K=AE~T(Wfj)&btMvq4O!24M=WeXc?gmL;a6jh zZ?L~&#^UJS0MJFQN*f4njd;QSu=>*tR!20r$TzYt`*HQd%7$V-gHo;BZXf_u{Yew6 zrg0(t`KWFe1GZP}!Fn(#(JRQJD+*0-18zyOauUh&Vj>XGb$RdFR*efM5=?#}HV( zDfQB+&=CM*+`Slb*A{_x==AOPjFORW-NBnCs|qLX)HX_2S_K1bxi_(Lo9YTn=kFGR z@j1ZarYs`ix~eo{7%6qXQ<{ZJ@Y0_ z&Dh=>9gup^zSrHDkMe-`({uRk+m8=tFhT`2ZsOG$S3o?TMvFWseqz$pXpArEk)ThO zekuAR&7-#Ymk5v36?xn0AAPA)K|=XU4g|HYbSVtQK3gB1qDz%qb{GiGncF!YP$5w{ z8Dq4TFjAa(x#mc3AmzZdjUc|`d4lhY;pmuC5)!^D$8 z6sVF7`_)#8Jt@HJqBpc#OA|o&|7DH4i@Z^TB#k{cP^5&aI6`F16>OjCxUkt)&MPgX zQGF)2Sm&Mobt(^cUAT%hfno8NdSyPcQtL)Ua3J;qg{IK9QKG|TiZe^9FpT=Er@}we zsrh~45(CS@u`Y+Z+A<$FE50WKg0yKgvFwGrT$t@1%d5rqPZX`6wY2CVgoK^MavNiT z^2%;U@LKGAWutqwfl#mxvP`rUH;02NX{*86yd=($^u!rwB-+?*c~Zgvzm(8ndJ&qp z^KR{Zan~*mbL5kL^m9(7KJ|uv5Z`WHBCeYfhraRgcjiwRFHU(Ssh^7ks12c1kV-I4 zSz|FOSO(=Q8zoCJ4OL0HcQT2zj9m+Z)WdHPV8>Qj1_o)UECI;HCPA|A)@AHE?l;%7 z-LBRA!^zd=n}1b%gS`E-+vZH9eWNmbotIKVhg6`=rNC>MBDnxf%gM&Lf@Ci~Ov@a9 zz|T##-1%Lj_7kFfWoq0r=%~D|eOyHR7XWG`&->EnS6nYow0q z`A;Y9%;$rBoIBsuQ9kjFBR!kv=iaJarH3f795`~vaTS5jN1X$gfgR;VEeOnbaD&=x zX(~tV>w>~~mJH1|;#4N>+ZJjd1qzwuBYPs1t5Tmg6r%tN$UfgVoR6PW^BZ6D<<8p1 zYBQDOf-4PS`j3)UcGdIGLIp1=UCJTZc}|7+G<;2ONRe$28Z$j^%XPc3Z1~&V(jNLZ%0PEr4!L z^T41_GcEv>{e~BXq_09VgPkIzNT}{StRq%TZ+-mX<%xd}h0_0ZaO@ zK-h37N3`j^iU11S&ixGd_R@gWr4Pnm&9Dc|W0t{XYnmiD#lR9c58^^^p$$ufr@o4R zZ8DXZWItNWO$!HePP4yMQSzw=Pn=WDh?!HZV{@A{6*J$5W|EoU@g;IJ=81=>SiP+3 zm)-VozpdHFbDFN2mcpm?$Y#nXxD`MT*G^AFpBSrZ;2fPE`crw|WBfRCia1lCW_;E- z_{KEDh~+$CA0ZmmHIbY}Isg}^1!KDdtPM+&T%becG^BLhT^zKH6CKw?YZC=4??Gi2 z_gNszWYwy)qrm42Hqk7%*J!BBO$1U|DUWnWv6W%DQheo$$_ly|H3Y_?p+FIi?I1|K zKsgxM7%;U`67IxQs5uf?7XUHwjKaY{P}y21Py)&nX~nc!h>0Ps%PWou% zys~A&rL1)tP#om-x*tvuTUm>k>a;2=XS&4hOE+RM0 z&xl-97c}`adC(->^g8W-={2qHS8zhaW=yyFz=J!rJvNIacZRl@c#7&F!=!ea=gQ0s zL=ztAF?i*z>LZK~Ba*EE1~ZcTZdQ+t)(Orj`PETUX>Fn+MML!|g}nNaCHFTE;Pn=u zZ>AcH>#M>d(?A@2}s8wauleryeqWvnvu` z?1~dPX-iuQp>GnO+n7d`nTW4dp#5oe!3|^=rD6Ip;tdlwac84J82$_?`iQKr>TjCBR zZE3N?>g)JYAr8fr)t{^-CgdumW2KIAzfnM-2Rk^}eYOk|Oo5}}h3_F1ce!MQF}9k# z0V^RI)fI{m$RZs;Bq1{?09bUA<&aKmkjjOdE%>-d)J756q^3R4K}HUqEmWdqO?1=m z;1K++iuD}~Q4ODdqdDAj43c}pR(fsSX`m9FEod}su#lF}Fp(t0Z~;^yv`DB6IM5 z?g5Un80d@NW&{*V+a?gAUTQ-xb*E<+=D)3%I4!iUXgYKxn;8B3^%Zpd-03%RvVdMf zjszy1k2rbYDh3>-L3~OG0~tcBy~J-s#(+|F?gLF`0xE*pDqYwB4dHqMvSkX27S8g< zx6g&rmphAY@99pv`VX)i000910iPx^Nq+(-Qp|6Byy#KJmz;q|n**<5#{yyysH9Rh zzU4_r0Hh*U@#CKDtEHz8Y6m@J>V5@}qvqLrk`Zdt)ptcxOxTX>tTP#F<;RfSU-@)- z5RCkFXNab%^N4={itBgB0vAZ)AkzPt?FXru>AZuSejfuwM^o?vkGmmg{Jf&=XAx0Z z98;WWDb27&Sd9#^(8Jm{W9paxJ5OF_ve*hVK8z;wqcIAgy3pAJ?IVw*ggig;6OKtT zh0Uk5+8X(-4#i#+ou@ktdo>qj%B}Pxq)tAMwbe>=+^n?vJqHP@!`NdVNUcmyX$D$J zUh8PsHymf#QUbv(Q?y5wJU})LCy5omg;wU)K5z_^cYu;AcO^TPL&YXRi9%wR2oHY- z3r)mBz2Yyv%>nqZp#g-2VPYUmtfA!fxsK{dNN1OzSdkndCQ1MbhW`Js9$)9hGR(i) zi$T{v6Z>AWN^N=O0pMYki6KYDQ?y{YR9sU8U)3d}Y~{tlBsuuM`fQO9Hmi)HJj2zh zS{lW~XAqr`OJbfEZoRpo$Rl1;}do5SSbSe>2bYeMr zV4=3)SOEmL=Q>0L87TA`0t3(`2l(ihBvS7_U1uqdYvT{k6QBylhv#6gjEO!tu|i z_1~~3$>)2MGcf9zsiP1837-yqyLJ(Zbn?B~yAT1}gBM~@b{+6~E>Kz9W|W*HE2Nz2 z^>{~99qHh;|4QY(_kvb_bfT6gLKfLWy8Jr)BIjxwDL3#fY=u>klMzyq=PC6$4t!L) zGI7aiAG#;bXM5@BPEyMrVy;uTmjrRK+w&o^(fxN4PVm)&?J?!?A%DGLgGO3UCt@n{ z04N4%1l=JT)lHHRhhUA~z@tsdih_d6ON}lh2Dj*uNr7{|VXu|KKpVCQy)xYSMY>yU z*M2|nbNA|O9{}O2>SblkjN|W)0+?u*le;FlsRg9~ymUjF!o-klnBnXJke?V4Ou!LM z2y#Sd0T`fOYafY1z+Ux%8i6xmf}z+hqE!k?ODu>p33UJk3ZZc;iNZ^y1N#1NlZQ3B zGANOpKsY?zkl^-$A5qy+DDOE{K-P4KzGbq`9f4Az@dc-wi_5ytE0DsJ5E;=RnyS|9|hA9i%;aN7SUuRLN@^ffc+pFWDey6cqV|$8|o-l z?~NBfKTF(w1iJepm<<_11Q;n{wIGzz^c+7!{DTjI|H zp=uF#vjS^{aPd@cy`eoF54f5FA=lEhCBR@`Xk7mUhFXj)pT<6Jm6I^5X+%)SCIp6{ zY}ij9*H{FylmiRrVubR_6~0fv zo+V}C0%BeHiW$>jZ3eBh*K;F<(7ot%1l+4%54jLr6h!`k`6Z3eudGGzVbv}&PH=Uw zqjL@R2oTpADZRl2x+h(bw!Cp)r#e@()`kUK+Td$;iO-;ZqoTO>igI8_>07G9iEO)& z;4D@6*Gmax#*xo(Ksr{v0Sx&0h@uqKI*ie72`Y(S(Naymn^xVSJy^?t6=M-jOX-6P zJDT^+AT*@pqoq8L=t))W&bWJTX>}mnu`7ksezxh%-cKIg`R}T5D-^3wy#b*c-UL6+ zM;e>q{)K{+5oJrkjP^|gl0er|vi3!jHeXrMJk4y! z+uWLyF>r-ljK#oed0Mdj$$(T(ib$O+v>Q88%oxWG5aWQ5B>_2<^jM%0qp+bKPnvGW z`R;j0b_cF4k^k9RuOvH9%|)V>T@=QKH3wpcOZ2^%_E#0@!E<0e(72aYJ|D4Aq+nV7 zgV3EW6nskBN|hSK?x0}z`dO|@JfO;LNItp~j2w%>!OxLm3c{Ffwx72%bD`}xPT42K zgUmY**&>;%?Rq-c=Dhp#X;Ad2lzdtQ&Q|nsie|In7Vp-^wiU77M{ox*5D?ap==JOe zJ}B|g{k1>ZRV=@*9)O-cfBe7z+A|Vkyt#H4mBDJ{KDnIkhPwF-JXrIK7bxbK3xcE4 z50;wuDCKQgtlj=vf>o-%b6(-=X5dwRGa(2bMxt9lK|n2+8H1(ILKAQU`%6}VSDUUP z-QG0#Y`R9qpAIh(uuFGWmtkR3X2l?`W9m{K%00mhvIM{O4sFxQv;n6Gbs+|GPO-F34Bilul718RjMcup`vXON1XRXW``T?Xklp5Un5{{M>Kl?yy=443Lj2PAM5? z9^1EHhIGeHi+55^S?e6TT=~QrLGZU6QxYsA_*WNj@f4;3J54-P-;QZba|Sm%dHX5R z4yqvAHs$V?Xu&XK*>ws2obNg5)?c4?NY>eRk;4zC22|(hnu0OCS$gq@=_~lWKZXSn z!l~k4b*O)h6|)+;nqg?ZADrVol0_RZ)C^$Hp7NZ_dsdCz)-tD?QbpU}Rh5Upq+~)Q zG;muu@Ri4_ws~uqzyd)+X9kLO*M@fF68rtiv_fm;(W*wcgi?Orm97M*f zKN%bwt65dL`7FE8`J;eIlV&nAS_9!eS9aTlsw<9A;#Q_0 zS1qiz@08E|i#z=|a=;Y$3DCYq#dH$%lD0&job~w)I4J6yK0U&qtB?vdDZ)gd(?T13 zk$YyTOW!4?Bmsj=jw}7Lt%YAbyJvpou+>Ed@O(Q+Tn^W|60elfPn%jg!7Jg$9#d&e znoMqZsR9bGco(ua+|hkkbtFalu|rE=T?>+?J!qTTHF&0g*7guoJ!lck@6G^@njK2n+0W$hKOsyvlTSr`x_3@jwrcJN~&jcrDW6E{1 z?#}FG4P1|~3eRLpI7-gD76w1JZrF0&0^8tI=@et@fYIq^zS_NpJ=eu<^7 zB4jCGC1~wf-iu;mIks>OSHfVy>yt;>4~;c+M!cc~n6PFlozUz0jnwAd%mf4l^xds1Zu32oswnl9(F%9I0{e_ z%TwV0x9(y{1|X{D2HD9#G&DsE z;h-T2j&n1!V&wIo;0J^5Ab0yX{6@xx;x8$Drx~f-dDYx<1Px)cbul2whTYn~@}3RK zWrVOPuw=?r$-J`Wt_+RCx(o^=$^ab@o-UcZ$R(UyxXBLjJR0}w@4bqfukl# zDCDB0;3zcH^_0JhWPm4@AWI=wt*;VXnn(ic`%}olOazwc2fIZ(JSyKqMwdw~0FbH@ zqWJdAMJhO3IfmA1AT(OVe$DlkDR8n|&leid(V~YTA$2*gXcPirkG_)$!~A8#2*w)8 zC&c)*RNZCNq`lVo>&Xb518XoDJ-SockcdcZdiTq5+LMc$fRV=( z$$;5)(9~tYuM@%K|K3&*Q*mJZSTeT(O89TyqI{mRVCU_6OHi$myVE*xuqr2VY^IXX zto-z)HVS1B?T9$C=*A2UBG1Tz*D_;Tbim$ubHf9}u^gl_tBs>g(i_*WOA=)c6)7K7 zj%H@-TijZwMA+PSy&5)|g5!bXowLH6oWb1auEojB-vC=ob$EChWw=!U2b&RTiVG$} zs%k>iK!Y|D18Sw=?H^9`VgAJXg{$SHv3QEYl`?yAc|WUh77Zq}L!<@NBiGnL7WiuE z#AeNwO9o(bRRcla-92PUoOi(2A*bvP@v3|r1GNX|eLdVZn6nMoXj*)@ne3KCnMXmZ zWo_z)sOAc^ciJs;YokaGCH^2c@q`$UapTfF>B;7kWXJO@(?K_8;OL|!`KFOuD=$sd_Jmm(4kwh~5Zz8x0Cdv?PiZj)>N7zF;KJ7WL&4KXmT zf@TO0z#{59AT#TAKID%sMLw)IWo+1Ff-%Jsex&DLm#>J@DpXlgZg`_C^Yn#_*kmPH z6RN_Qlrpk#;5zaDN3L$Bbb~GmD)6w_!YOHrL54^cp~v5j z|2~6U6%>CLmG&o8E0`FCi-5c*`+mdVEHEA(0UIe&^nhpKZM{J^6#V5M)V)`B3G zG0}Bo7=M7HW+2P}S>$Kvap-r3X|bQdAsW>sk(y^17{Cim*4S0lEJgHM?67WI{N*Xc zWIzn&z;ns%_8B2MX`wgXY$l2BnVF~o3Y~4heY~R{EM@U1;|flZRtHgfLEOzSO3SVp zY(`2VQruj~lD$I#jI~0Gj+C}%TMd2l6@jD&xSO;Wi# z(UC&(z)_^0{{=S_g3%j9;6MoM1MLwRfVn;p0f@0Vq=I7@NuAe^>`pZpi-o49 zNTMJqh)@ZQ;v3}xxD}HiR8XnDLge%N3QCT?GjFf|1x|m|Sq#`5000C1A)iN*N)wm= z0to8|B%qdgDBwQ5Cq0`7wmz$cfLtOfU5(fiaO=u#M~F-qhno~`3HNx|8n?;95$i{6 zput4RTq?dbt?jTTD2d^_urB5M`9nJNK)E49QUzTA=tH<~2JkQ|;J+b3+Q&#i`aVjA z=3u9DKz88_!%K>P*Z)fC7K#c9P5%VxZd$5GX&0?k-dZu|ypDXzEj{T|Cie z(LH$$Q3s|Xg5a=xyO?Z4f^}kCT@Fhk_+UPUQcwA7e>sAxV#$ltc$X5WofEyI7n~vc z)U-(f0#J9i9}v~o2;fEodntM2BjRa@fw*RYq~bY>d2 zB$z31Ne<|od<28ZF;a9mq}WGEOg0PDz$IH`I-r&BRR|a$9bYcSBp8d8r+#;v_Z2>P z*1T9&r*@3mVdCtYuvP7|R9_LDU&&b$KW%GPLVrU6S1l5DTm-_genm>R_!GCu_;kWU!!H>r^2V<7LgaTqhtOWMo48ye7Xpjoh z)pl3dyk2xh);?|+?s}kQx=rWSDFBtUZx8HVM{t4VPkO#6?ePbv4=OQ*Y0X|S0du6OqM$efw(G1#C^4NJvJdR98S6g;PJP@e0X7vwAcGhXJI-}PEFOu22n9A^yBF2)`IjQ zMec!|h2W9_rmEH_TR;RLjmspqL$}upfUwhyjYUPp0ib3Jv`%?yP1C}T(#{hgMWBEv z1p`YHQE{n2-ihMGJzym)@_@u5G_5=ytBq7BE$|r`*_^VSOonEFljRY<>JX=awiH}U zL`exEBIxLKG)gRED5Z<%8UIZ?#?7=}H00h(d+i`+Xh=ChG*>LF zz+oq_qXP$4p7AiFS)>JC1Hsof$!ucP#7=;#E3uh=B_{Pqs0Lo|yPa%8nV$3@e#{QZ z3F)MlY3qp?*!$%;q53cd8p?ER48^L+L6f({eg;moxtU%+XA%33vbZF)D9HC0Wy1)k zFRov>1%2|Bsq7;t=a1?vtsa=}(})~(U9oIcwG2?pnKB!`q-FBZzL7v9;4l0>D3B!r z#mSIWUoAxBlADaWoQZcXKRU(rIC#OUd8qi>FNMhCw!)79kwD9VtX#ZE`>ovKrGJ}^sxR@zSmmc&?|wU*Vd2}B^pBzQ?PDS(cT9r=Yy|}&8r3C{kc%1tvb012Vg=oo zCV+yv7uRW+DOZ9w5q->Qpa9H|wbR#Ty870O%`!`ZIpPjPEBo_VoGPt|r4W5D#X0^F zO*FIR()8ZYyF!JKT!2aeDn>X$LZ(}S2Nfl7WFuIx0ni(03dOt$K)FS$293%E$Jm)k zWM?5pfH$FF3|O+$g5`PZ`geYF`dsJg1`Gkf0007% z0iS3xNq+(f-dBf2L>%fuPR%vNQce2HpDe%=^r@`Wgn71chP;G(e%ls+F+%ix$9|C! zK=u;j9Kz#NRwBgXOky7}BZFO&lzgcVBgb$$G1L;B7aJ2(5)dzLoe#kLF%A*(FzApw zH9$;7n7~T(Bl=AXDxzqb9DG@DHo14>hrblB0%v@GgEu+k`3gsZik4KB6%(P5_PKfD z>UFKsyNLB6>k!U95SC77?`(vP{ZYopftb@gTF)FBF4E09XWDk~vc} zJVDhadx8HP4~w!Hi6j16uwX~`OeFBy362vBU;srZBsPuln5|AFh`bbJSux?be$K_8 zE#MXC9AoJ?))=m1yB_|l3@=J6R}8Qu4Z6Tj=K*(EiF)CQG7f|@yJYu!=mgnpz|I%& zA{+qr(c0V$8;a-e#9%^w<`X;y5(BHcG0z(#V$?3)3M0!^DxV=kPs4OLT|;J4 z9sgNcTAndN;EvHJJP=#_%|;To>VnC6HAo7aG%6pZeJ(F`_TUy-_)`i>eX%x^ei@jS z7DieMD*{5xtU#Ablu;#_Kst8$9H~03rdRD24$mS<8O_zP14H$0;gIs2zusQB`% zV}@`)JY3HfnRR7iwnn}}wto|TQx)?OMT2?92?p_B=Ku;w000h-L7Qr&)FD+w%3v#( z{{R3%D1{ckU{3$2c$@etP}04~XU%|{CCIF<5QCAgm8&)dj@ktyTW_1%%}pOi`Atx# zr5Sac`%iRpmM|UPK%-v_-r#F$FtHWkLEt*pvT~u;o)E+BcnR+S^~jfaICPEKc);Od zNF6dCwt!kBlCo#0dn}`DOj1Z*Q96!2z3r(YQN&Y@u!!9_DZq64;3sWeIBQHNQr}4( z9sFV_(T;OYumZK;3k$Yol<2kj-CeOzrF2g7ie6R4XGasDSqEde9PwD;kVTx|O%P$> zv(LC`&Bdlt0-N3d`62Ei0kUoOaiK{P7yC&kR612)Z+t(_8;SpxSp)~w4YB8Ia`6^ z55q0xw8Bb-sPJ__#fxW$%8VMgJQd=h_Zs-$MRRck+zd|YEb0?IQ8$=Ej+3)Hob*s% zZ?O<}GuHoZ-S+PawTo%%kSU(nU|&<(bn18lId zjyTq`PuW#g<-Cq8Ofs`i*KyR zxi-7TxsRLMIuHuJ2bdWtptWkM+FxQh-&jPvrPYW{B&E+U`v+=j;OjHcBtpObA%Jj?DV|K z8W0)>s{-IdYw#rdQ1W?d%4?~RszZVTeaC`0^;H?OytFMwRqOWZS40{VOc3;#t?)~# z2pN`cFI04P&Qe50p{|9Ya95!iQu;Qh8v?%gUNJ`z_*RUGZ`#_po~pg(Ev__R=mU;F z+o*UlQkf+4~OP2-oHgbOci)M4h)~<*l~)OvgK`BObNUMZ2cchzQpccd8B3s z<>)GGT<1AzknboIoh*h^*deh<;fWgbKq2PP2Cs`=jR$09heVe;mVCz+q#ua=SE!Is9 z@@e-aP&IlW?G2zxtR3U8z3g>GuIk5Mx-WBV%)Q|h0~}ZCOpQYBIabae4>ES*ZdJuI zXsHD0caLi>aU}G-$#J}j-;>{lnVd9YEe?s+4Et=>p|9!dN#Xh1YuL`nt3#2Crp zQA6g>!^ma^sKHtC4V8&hH6UtgEJh=g&z7=D@dCjxHW`9@7zS4aM&0h#Ni7(-IHd zjoUgyrRznnqBn6#;x8|JSQtmj(xe}(Po#d14TS`h6VUA?QU`FwD-*#0WK80O&?*YB&ut#1fUrB zuCGjjVx1TCI$kO;EPrPWtRSLAFYb&JG|j*Ajch+r^Terxa2#KZRfEO2!3E61*0wV7 zWVK+`B*cQ>tu|K2G#@wSYJ{?=>w4S=3ZLc(P1U&QsC|P8< zZwS~s$?ts&wv()YH^z3H@eWd3(56vtEqZmDbY8@9lo}f07U~Z~=+5;GPqVzS%8?hn znSxa2L~Y#sED>~U>%kn#-_dE}GAApIO%b3J00rT^laq9vZe)G@VW z5f#W{Ah=;p`y0B(3`iHP@~YZ3%TkKdgw{F7_j1u+!rszIh$K5;VgWQdO^-F_iy}eC zgFfJKTX!^1Sx8RfDszNlG&vuElpz?Rs%Rg#=1vU@h{qb<I=pauPFehG>GEB&$D&$Fd)7vq#dLSB!F2A|S|;!X zNq<}gX24jCE%o>jC`U~%` zGMtxV!|KmTestCZS{TQ#buzHDo)N`9Fmn5T1=;`~+?{S8D`n>|;|G&FwPhb=jbHXbvFFC%Mpp>#_8t*L$jGSgKPnpK9{-9t}<;_p}N zrXxh`?+`0O6a4ijDX^6{=0j z9w_hYgI94x=OjQH}^PcVen-a6Af6HI!dN=k4NpEI=H5rQAB#{8@X!Z>}7ffogokG>(K1J;@agy3ntEu$&ufOGct}+79 z6l&1o^j3_T;O>31H+Z?tJSaU*x9Y;UEX0^+6chZwZ1u7PXJ$Ao=HUNOeWOYye=E&1 zL;5fLh?o&UxKt(@QJJuF=@1y-_uXLmQRY`jjf2QQD>o3L2SRV)7cY+daeK|gb(PR` z=!RHZ^%Q?HzDyb|veMqWlw6&;yhT`OPO%6I(9Uvs6LK&CmEx^vjYo`13*wLX+8#sa z9Z#<)i|<*!wLA4_&S}KG~$!62E3KIYs2t+p=?l6`00PhOL&h#HtWBB1m{6Qnkq|B}*(~2&2dFK{cs5b?^EVevt zS68|p7VtJqc&gC_+9B)2!J6Ne_>cvp@akpF=BZLv`g$T25*7LbfXDtz?pH(# z=}q=btThh%{S^N<7Tx~_q;NB~NOwpMoKmMvk-rxU1p2VP^UW%^nA@VZ|B)JlIjw@S zu!c-lzbG-`3{5n8YrJYtSb+o=D&xs8()9&R z!C&SxDp0*HJp%AJ_ygXJs-&Ki_5pDKEd08^pP!Aj#(dfU!g2YZrNrMs0f%!?nk|LX z2$s5b(CgFW2Mn#EQMrJF1c>RO3?2vX*}nYvS~kvgmiQ7e8jDUbYF;vR#7{uP#q0Sf zlJn@WZGZLB!Ql8{vvJf_An}jUq_=bMYt?kL)h2bVKo{S5C2>|#%P;$ZDK|Ut z{eBhOlvGJbGFR3lZ+gWAsLkLd%R%Ap;={x>z9IeHazkwZw*B6WsA{(sKD`c=LCv){ zZZOW*ZE8QvM@|eWyqiu0j1|P{-ziYC(JXZkqSF`+wM=iht<0q`vmJ`l7csm*ez~e= zGbYlMm(mC39>t;5!+IP|K(wS4p!NsCN-G)H%kh)JZ(~rKOU)UUBZs zWsjsaN z!*0!VAsAxS5l0clTh!Q|nwf?*ZN_9m38t{&Ue*@Ak_a-2)@r7fyF}80LLp4as|$-k zsJ61LfLSx<0E}TUOpwW3UnLS!gwMx7xGC0gZssiv)>uD8fCsT)gehP2qx>a}g*pN9@g zoR_594{tDxL-&bVO%a*Y>l0m6fU4mIEg%v`0iY)U^#laa6bq{>0I)|9U)BaP0wKOc zcZFz{I%9WHLh3lbsh0f#S<%b-T{1r~003|R00fUApNXZ$2%=pa|1{xEsl6TH+WIr=U7?E}DD_NiQ|RxSNp>dSQ*QKeHm2$6Mqi1m z+pS=DihVGkwE8w@puaj==cTi~!gw$KSXOTeOe=qM z`jWq0d0Ph1hHZJxYzE-w4Rv7Adq3$5QN9YzklECF@Rj#$MPH2)i9{@Pq9ajym=b^F z!!E4SV8V9ea9_A^sf&D9-CCUk?@BUpKrNA5s&GSvQKy^|KV;FafgGr=8)7x8&|1 zUbDWfwdssIX-?dQ+trV#asgtsJAVT8TJmA?;jW}zA~?DqxU=xnxw3>8Es8;W-W#l9 z37d>Jrvae$zmzR`Oz~aY8USavuCA6d&7%G7lEI~RDt{JsK$iwn<2ypoMLG{-UjS9r z{##8Ya+J{eV^kT|K#5PHN9(juxiMpR^VMJ(tqpfvK1!0L1W5;KmIJx!sYI024CmLb zZK;M_g{tFt_|z8o(J8}l#_pb_$f+G|j!$=5ax=>-={pr3tl(g;3U`N@ zT6i;;f`DZ)Q+1{M)PW_@chhRM`S!A9SFqHPDt5xlP+!K=dZpfk4tg)Tvw}p3HI*Kz zD|&F3ub@b@BB@M%bPS%p3WrKgCr{3tVB7xqfa9Rl6w1al>xi%CPvQlS5u=`>q04u8 zrHM~%@|KZ60ZIIzY@@@>Mk+HQZ6nlRIl zcTwvD|CI4=iFMeUx2tdgXl4&$+wR(3kR`VgL2!9g4Qarmr=v+eQG}aw#Fk#l8Z>uX zz2M(GDw;K`1oz264eH9(=rvmkf6DC) z2?4+nZ=T8%4JFxXCprX#CfOVq=OByF)Z>6Aa#t`c+Z3K-7*z$q)50UbO6cF;Oh*+T zf(#e(6?T?uKe#<9YkID{YgC~H^#35@{ISt!$w)q-Aiz=h?+!-rcgtZ z$ULs>%;kTh(8f|!#5gP3%B>!z(;248POu=$2z4M~Ljxg07Rr%n6JlsMXG}Q29-xppQ#WV(1P>?=*j8c##CpkA- zU%E7Y^=(Z}btahn@NiNfb+!daWZH_nNEWh&3Gck`R3FA#nJC$hO9@C01WaP_f7^2O zfo@PLS}gU}29jj1R-lp@(ovx&VmV*N$(;JHOxO z1+Ljy%IuNMJ?TZ%e>5FM^#S27JZgc>{{iDCNrZP7K% zI6j5?y(sYyB#0ZFe6c&}B|b8&A(yQ0=WoAa(U4DIeGnJmLbIi@Com6dcF2Sp5Q6h0 z#}2oaNGZf2zp@iVlE7867?l=wh&9mroQ4n9W1WVA)6&CPjZB>S68w0u6f?kXLZ>_W z)(gK`k$r|VU8%#$AMte{hbygU#}++iV0(IUL1(l~&I=h6=D;sSSin7)^H86SSfo(P z!5J%^aIxX>|8|CF2vN^t!idp~BQ11}b24dawK25ctOdgtijh*qzAx?~@&OpCm)1OD zT|G=m3a(KlOTfIC-^(;^pw*jzzx>g$6(OZQmEma2!pZGcMSSv+v(0qZB(HS`S#+swv|B^4UEgPnu4s+fK>Et(+}mPT1TmPO#fV^}^3FSC|W?_I|L9 z%v0}mA0OaA-o?f01O5HlVmYPrkDW~Q9Y>83YzGdi8B6TsbqC>mf{f?xg9fKG%0(( zp~NZ|n#Uqt$79HtQY~y;)o@rs3owi#b`&5ztEu>7g zH7G(4sm&E}0hg08Mo>OdKMsN6s7YVMl)oO-#7sa}S}IKg37IdYQ(h^UDWO`BrS$sQ zv8YD+!^~R_XbB1x^Q_36>i%v!TI^!IjEF>phVgDt^i**AWKhK{vd0YbcqkxV^lsb~ z{3*>EG-fR_tbaA4U>81yV$hGVsS=EV5P9ke32 zuoZz}ga~s@MzL8Ul#6v&3jPbT{U^$R34rn{{&75@gM8*pONSZ0;K8F})_paXHkwpO z3Y0OrR=&!9T-nHtC|6l#V2w|gkcJ}AbRUi$W&z{e0u35 zWTXX0Bnj`0k&(*9#=;ZA@Y6-uZQ1~SEnLr%R3_N4*)Vrqxe~#2PIxK*(^U{)sMzrA zw)!N>V;*mDUcFmR4ox&bY>MtWxAd&^sv2D|Orhs{BRB{aXbbeHslz(a;T^pMDQ$su zdwN!^8G~Z{@Ox9D^wjh^#3k5xaClVPdQVM&eetsS6tcTlGIBXPIjG0Gp1^Q0MwhD) z*BenkEg1+;*f{D41pY#Z z)dp(7VZA11+0&!qiQ3-&9>aCYx-(02LY0fab;wyl05+$$Rh4j5Wm%Nx^iV7h(XJ8* zz@hSq36yCS9;6;$#&R#fhX`=HqE22?_fG;J^+SWvts0}%YMECS#u)n}Vou%uwdPmV zmPRa#;p}sF+pWc-uXHQhjTjg^iu=_l*3Yb+x9jLGcRWTsG$-g6+I$H@06$TnUbD%E*t*A~? zD_T0(k}BGSat;DfaS8>f-&!X#r4P^V(kCbosLDf;7%Ak&SQ--COc%Af2L05=iV>R&oT z>;Ub;#tc$Sup$y#|?8y_j& zkUcz1fRCtYC^rogn|4cx_JWtyVx;9B3SJ$_RtzOKr> zrNh14MY?UI5>)1GDf5q0$pRGiPfWKBRa}~p8-oicY6t53&G~;@Ys3fyL~FgN0@_va z`stf(=6(u2+OJGULCNIS3o=3FCn3qVTwP^AWRoHK`ZR7T(9~M7&(fw8N!%6?)(eWh z#h`O&v8Q65i;-ouv(ynr2D&8h8~6i5zyl{^*b8(jc>~S*Lc}W4<$q))Bfz!V4E*By zc9EP5#~!0T-yL<+$q|Pf+meQ0s4O|5$5&fc4fuv94%->~3Sxo*CbYTv3BSdU$MA+f zSjB0W2Zu1rV^E?o;ezSm2tx5(m(r=RFNUe3_H!?GT110QE-%UQt#kI0=EHGFzG>s}-x)(J7ZREDjd>spK!PpqytQ)GR zg&Qx>9sb}D5vA=Lw~e$xcNT999QyHHv9`K|Xn~vA6PPgT>BCUsxy;PrXW7SKs=D7i z!DcC<85wYC(yq?_d^a9HGxv2ZrC_gP#aNW{biZI(;Tli-?r?W}PC7u`5uP}HPc@Ca z>Jf^GFr0w_=KV8une5m9t36Ny)MiJ;TlZ@X_L^Z4Te%4Kl86&OCTvCLeH}T)R6PYr z>TGe4lgCdvQWCG8fhv@|<`?zl6$=HX`5e%qq8(9^s2*N{zq#i7MEQXS;Hjw2@OE~e zs?%V~DTllCd#eRiH;brNaV02Uj`^1s&a8JfuzQyZ!w+(#o$-dV9f1uE(N4A;gnWy3 z!@r&sARd&DL(+YBE7v1Q6?n`WuL-1TO|JO#9CP-tEPLPEvcoRt7?9y z52@cWr?$oi z`JHMzpgtb(q^m?bybjRZP(I26v9xK;)eoS(63cZTdNT0m4I0rH*+JlA&I4g#YcB!b zZrh7IuW7*UvOP|i&(WS*rzj=6l+n+(Q_$9VVWO*|l+fPevA~uvHRK@+Y?T&r)sjMP z!yvjJ4PjE`+aPMbx7Ba3!X%EGgW@TcrCC@;6wbVqbferiCyE%Gm6kpmOMLi?x{d0P zFoV>QHoRDKudq&#uxlc55z5j-8RWPL*05c$I7S? zGbA=Ndg4+CMaxfi2AdZCFaPL%qR^q2VZ{IfTD@cq);{0)silySe;%^Q%%X)PtjYicvl4dKT9ucD4iH49AWORGj0E3bolNM9*cH5%TGvzOeozKx1@Q8Jt44$B`ouDclYT|z_9 zvU-1a9pav8?nqA;P?NpxLDb07wur-!{Muit#p>vrhF+F>?50+=g9*M`F_jn9T?4wT zqiFJOlHD`z&0G}g=Ph4tJ5}i2IEt~H%y#Q)qs1hyR*H@&-e-@E$IxI*%FuxJb5Z<=PsIJ$wKz3p#HR=dwZy7o_>4<@4GN0^uilc=}NA#q`$ROzX_pKvhYZ-EJ>S}sC=+rGM0s&>F#b{~+TLV=K)h&VHeJzThtN%vg8t4{mu zTZfw1yk=90dPVlHFne3^(VNtr$SzZ0qVetcYP5u>I67{$sLvE%%+(Z~ThBaHay|tx zVU38EJ5bmth+q*56Z9V34It#!?Kh$H853!16K8*S*w!FyodMD2fHbl|A5%W6;PULs znD(XGBVIaIw#yjP=Xh7T6M61h#9f_ied=)?UxbgUk?u+!1IX9@Y6f~cn-zG{-tK`I zCZ})6s$Uay_MJMIQCL&A;tK8xxmmhudMtmSExF3%t<7o6Rn_A!$okr^IxB=hvCevS z0(5Mxhm&M~m3}>}X5rW;IeInY5tJ1i-GowX_@lY^V_J)15yRov?XTKCI;`YNViOjZ zv5(-6hb;H7e`*p>7c}2y;6)1E{z>%9Bif}<7Jd*zPtb4P9tE4NKL2uJzodt5>)AA% zBO_l1(a|((WhXphwb&S`JoCHE*zTO5YsqV%vx+n0)3>)CsXe_rhEUTjOTo(dtmS&^ z)UH08y_v>KlYl^tHT;(3Z&ZO^5~-jnb;Gx4gRJW~U7C5%_tnjxwhzQDwf96iwhPYs z^siJ8SQYz;4zoeI{Y4vesFY;!&hqD1>GwRBh!bu0H$Qpr%o2EX+_Bh!E|q$Jj@ zg}l4@7T z_rcl*A&JOa9SZC0PHzo%>F;~lBq*lV4KGlcj{OQxl1v+%GH*qu=SbMC2z2r;MR#tH z&&QUi)^9Uy`tnQ1!lskt&YH`d)A-EZ++G%9?LGoI&4HCQvRIS(Hm9?4Q4{?rJ?FeD z$5$HO)QbzqL2=tVk|Q%pw3!3nq0Da@QTD)ME`f65?Cd$5KUOC{lN*Xn({I*{A|`e5 zDGfr#A#v;j{vMn9!CmSofty~!*c2aHcjH$sr8*E+O=~w(a5@T()`61l1PE#|a2kga z&Hm}t?;(l5=<)?2i^s=?HBo6HY+#}?h|q#)nvr^b?o7JPTM0%c+%m*RiVZ{|?zK?p zg#*T1ff$=^|E^w>GkHmfltys5@=>8**S7BERx?XEYS=JJH-X=G)!gkorQyHlc&v&f z4O{0*oiZvC>D;fz6_O+jB(bKmzR~DkJr0x}<8$7XtPZ(JbQ*_vv=YhM2LT;|KJP(> z$^pNf=Rg_@$4~`SEUrCFg0M93d+|Ti6QVenl=B*V3SOv|9v0Ds>^xHy4s2D?R4i^N zG}6X|-_k9=ViIsf_f;c15W$nJ78MQwY#w>Xm+#EnIM$v*v(VGi_)LaSF5Xu^pa$6-@{FAMWWV=FB8s=_<#xMB%bD% z*UQKx_(-ojEa#B;Ri^CQRkgbu#TQ|G31WbBd;~mCZ>zF zzX=+xslGI^a*lj6`fto<684P)tIb$M29EI>1(k|mOvpsiS4IG1kU}|63xE(Q{r^0g zlw2!xeQF~^FZ^_n$3K&~6az>dRbgx%h3Q$P$BXaG(rdh#e=-+aY{{d*(4RioniiYaiV zH|Kscjz`=|IVFgGaMbE^56)DgM7kT;HFd<#)VKDOX)akdO4$|DyHWqPkTj@$&ebEYUz(!DTYjDzj|`)?Sg#k5_%Hm=(dBYcqEfv zEeJ-acHl=xl`e-+-B{^CXQGAv5pA(IzqO{ger-#q4e@wN5f8ZGpLtI$dzWIo9(3FX z9HVmswc=>x-b9`7phOU?pu8F*Sou{wGG|p_d$C!cDy#!6%Bz%MjCij(Oc}qS!|gyG zl&;DUoPT-Sr>NwdEP$`j3!)tGM?BId^i0X3@wD?iBzWXpqrBK(EEMD|73|gq*YDS+ zXRxWu;Rqp(?5%~$G9=sjEle^!cM3$yV%yP4ugDcaL=S}-z4)7uM6;CkAI6tuUK!s; z{TYA6FQq~ZyN=~_^&S@le5uh%O+#QPvcBr>^h)h|1ebdUJ_u`P4Fu=M zlI5nh(0H{nlhbj0$4;#MK)-fvWozWj(Csb`pM}jC8SZMq35Jw|M>)3_J(DLrnP;5# z5{9~WRftO6>d}D*6r)E|Jk8J)qtUExV7BQBuySbLN-V3TU(4(A>W{k_Oa@{hZ-Gh+ zow2FTmN`#5aw6r8j&{CL#jDH;yGg@KGjr|f08-6ne9_;_+ds{n?1ZJI?rz$7Bk63< z3H6Gw`EaXPl=GQPwj_LGzhc`)#zkZJWCD0x8=S4|tup{6ibK(E5Ye<}0ePJ-=t*d4 z;+c8Mk{8*-!awTw+IzP_c>^+QHa)of`rnZ7mEk1UUEa~qIaYFqu&XEr)MM?EMc zzw5stBArVM(u1rbF$Y(8Dd+5pRfyHH;167K^O^=Tfj4=p!7 zW_{+gg)bHgddm>=kjgE!eW}e}6N$Mp4ddwQo>m<*s+b1R2AP@wiQq*6|Gqc0SlBTY zSbrpH%KSRc89HZ0C-7@0D?)8G-j^?D4N!`E=5W_YXBXcCAPC)2g;}l+GFf65edT3# zmz8QKYvO8QW7EH9pkRTG=ym9p zsDes$(NWJ}>=<>%&}%ZZb`sm_Uq z+0aEwI@2%4ejmG~ianD&EIUsx_PZRnJVjge;btWfJ%-f5>&BOTnkaLOp5Wr587iR~Yu$Jr+8Nec>L#Fs?>g1DI;;ZtL3Buh+nc0c zP;LQ)L&t##tr{C2J{I8N|Re~fOI}EWrcdU zPe{n}9op%Riz2@N^)tAMJa4FyPE&L7ZKjxO`c3m4Ph~-~)MUNM>MJ=?ydtuQb>7@p z%}(d01SKG#^L;hSy|3-oxkCiWS(-A74PyS6i3tgU0{u(8re0txc;+hrvDpWt7$ox! zV@3QE^?TXJEh^-l`NicA*XEwJgf4r%Nvo8d=yyk?WAxD_{m_FhPfc z?5ihj7~>lJ97ktxWzEwCGT{RQId#}l5pDP7Jw#DvdEIe1XINRPY>W_qK2_zyLaMba znl=L6)&k>fYOB!fymBXi$sbyiE}sV?BBpk?DGzLwMmt0v@VPXKp6Q2&ymkXk4IZyi zeN->j>f%>m0}%=Zrz3}@M&3n}DAD9eX$e5t7TAD!n}JkyV$C8;7_<#-XZs$v@hT0x z5pnQ!fLa_g$q)GV3N3;1uKoict9@wI!gIi}E~$%)M5t+Vp!?;|$Dp{Akd<{My-Nj> zM~{vbjGA+VM~Q*)^An%Vt7#;1V0DiQY=_IW!O=PoSRjt>*Q@_*?N{C?z9dx50_})Ae>`5pgg5r5dcE>wLB79SA@{rdPS~ z@YN)3*up~At8@sW6OXm@Po!^VU)S(QGt0SiI90q(cVf#HR7nEqB{RN1M#3@Ih=ZBB zbQ6i+)NCm+bLmB5#BzD?T6!hfAVuh#krXVq&qZXf{L;3SG+8}w?mzTQJs}koGhjN2 zf7LA7gC-hRShbe0y5Eax^R2Z&w+ii|87T=j+%;+oBB=6)90xlNLSKvylb^azw`89s za_m>YLRthAvf$8)Th`wvRVq~B-}HL@Hi~fIxopKEdyye~?UQFew#Av|Qssb7aB%3*@5h@F`I=(amC?)MZ}xLJ9iJ{+zw6I?%u2 zuIbig5m5u9wYC?9V)6rr#C-0FeZW;|i>bLf`2KOYL0-$p=2cw@F7QC)1yeNli_X%- z4nxAVLEwhNjl>kx|Er4vdC4^Q_c*t+U->>_$R=wq>0qHAosI^W`()g4D!%dC`g6F5 z3F|P7BVj~>KqALtS6P8^a$lyt{y=vNicK2-t&r3VxKGD{pmC1nX+fp0(37Rk z(yt;k9Z)jOJbmWY&Hsu;9*-lBubkxa?PJ3OcZtOGwW-59tJw`bz@VsPBcGM1*p~z{ zs6C*R1F}MdlfoB?ILZbKFwCYG6Ve29Vpz{REy~!+_5n*Cn&jN$TOZ%I)MJ5Gs)~>q zq(izTs#2E8ETsZ6ib-dYMW!r7;=ZezR+l!57Kip?Cm(9IXBV>z?jkDKk8sr5Wc71~ zQ0fuW6oA74r#w=!#ENCYbCjggY@p$Y!X_n(Yi6fUC%~b}lQ@6@RI4`{>OM~RBq@5~ zO%XRhBEh<6%lI@G4OU2+jIc6p`i=^!^e)_M4a(q~uS2-m!1J`xgo&y@3wB?6IaQ1C z?Cg2&f>o^4f>Mx9^y5shxs^sPGfjy`eOTmNz;EIBU&`>6pnzi96j1DbAfJ2;u;h%l z8Pk{BhI2vRd|Y-*=rZA{Mw(=B*8gFUa5h3&H~$N+&;Tr_PN?c;$dA&yNu{2y9*jcM z`S-Hx?`HVuA@0Qgt^-esG5jogHxKVTEaFq!y1|6`YMf}E#P4*a?b^58X#A|n083e< zs1g8$P82x?+C~oQ?WxlB4)3qmFmsO&%{`L_Qjw=218d`Gq&2`S%PhHnJBgNB_l06G zlb}3-_lfdP4YCB&ymvuzAspUd7}mZvxOVk0+>UvI3sv5i0pTs2)03ykem~CD;3L)% z5oIjjPhraIy}ik(f;z);H*)MC;!3TAhpt(IaN%FALzP^rE+)^y zrU;qQAuY!b+L8Sl_t&P>jAn&Cy9L&XhwU#GY@0pW5smqNLax_+ zv8?OYwV&PVAA_6(O{T6Jv?Uj&PFM@;CX!ehxEl6O9Aa$)ngSNEBxtF$u*B8KH#>)GBzg?tN9Bqm;t*!bO?XVH zniIQJgI8_B^yH!)QSDJbx*sM^=izENy6n8Bx(_QqI4oO5=F$;R0(YpghD3ogyID)+ z-+k}nK{xGdJWvSWmcNKw z5<4)bX2+~NZUE%U0%g8$@W(|$1hl~e%nTlWi)9h?HQhoOe7=kD>)Yyp|I6HFQ3XW~ z3t!5|jRdgw5)t4WUI2VL++ZjRw@?B(iEkE#gp|*q^PeXBRd3MP-JB6QK{vl$`nhU+ zQGj7NxA3~x*Rx;egER492SZPkU0y1l{kT&fyIzNWW3df>3!k=*{tfiB-&xu-kulJD zPvmstkZgAFtrxCUd-`K^yg|p0EKsk&;o-Ha&M3av95}-pZ(qD7apoAI@|!zlwp1@T z44~B-@}0jTrB0~RV}kWCBDhZ+8()QhuHveeSx^2(UYJ#5Uvm znaWzI{JLX~oS)>(A%n`+17Mh{45h2AkPli85{uXZH8p~Cf1^1*cwg2M@W-WmRq|7K zcyAJOs?o$DS-pbM46g2Fz0m%@J*ALHv66*eUvqQ2MnDh=W$K>^=;5qZc%k+rT1Bl! zWNd5)5F?#+2ZkJ}pA*6iPFst_$~l7tXCG&{tq*A@g*S9+v7%+ZaZh?%XY=@>viaht#FGPISL_| zvYGZeU&0IEk@`?Z^0tW2+W^aB5J}rYRNQKxnTqV?|M&}R%{r9-HL3fb+Klvw*-NX_ z;?FQvbU;?K+V*$ylDsJB%m6DLvTe=Phh8Gn(|v>hC_*a6IR13$fNI}7p=8X6Wzuu; zAS|33p zK-&0)B8ne%E2e6yZ`Q~fWNXz?BCv+TuJ1AojM8~O0qW|CAvyg^RAyT&cBrFXzeslz znzBtYQRMXXieT&w-5}XGyDY$}&^-Kn8FdKNJ}S$QSV6*SX8)@81XI%AuydJe^P&#) zFpjp<=OWm|j~pH@_~mP$?u9CIQ4<)GB(5-<^&w1aH=pkd_AfGMkwTX;c5U5}Now0- zXlbldmAhxOrqNFLXUZw-Iek6f0j%L_cHBf#FNyyRqxGK^m@+SlxMr0*Yo9S4T=k}_ z`z4NpM-OCX6k_d^ykjzbz#Lsw+8DYcIs&}B1by6|9)X zV(mPHAP}X967mqdezRjbH)+prC)aNcmII=Kis54-a7xHxtIvQz)MQTTjwOq8EYcSo z##(s7pzRD7yMxAW(j&dVjHIv@muzvR>&zu%t!)7T?INxuwx}riQ_UiX?{!6>aYQWP zm8WvU6tY&rN(q6=&vk-Xj+2Um_fp41vnvoe1>b{boW*x{d}N|tdggsq^!*DntKX#< zBf1=IZ>kkDk30s4sKG}Vl|%r}=XZ2Pb|<1IH%1%{TP-;Z%H$5q>X?E)4`=QxdRn1W zTJ6f)xK((7)E%k10#6KF8;nxCHSV~zHg;yFvSLk(p5^XPM;PVZb-rk6OyoT4Lmo}2bJnXE2}J{aeOXO| z30f3%-f_MpG}bzcG8`PkVJPbO`YW>gZvY%?gxFwaoFHIx-1CRv=WO>EDff(cRjjh& z5G_xWlU>)E>$~G8)Z`{^sM8F$l1L}o?V4yCWcBCVSnUUP_3oMhDNv$PZy}uWL-@f4 zdjiY2&<8!5n+|hJH=d>B{{;!tHP)vFfsK25 z_~I$O^d`GBxFd=zMVb>V89=bAVL|Pfj)^;utNw^=L8jcU@M|+|aNIjt+$|d#^NlS> z>pSUGqRyF#EvaXWIw*-%aq6{p?^J$y3VRPlxJ%Ueh zz6u7R13}`R>15ff8vt?i*V-#q6-gaYL{HeTnmQ8PQ;CnNbPl*xDxgxK`fI z;Hh9G&OtMBmrI(NIRYMqF=!_h(la$QFz#%$U)8?b$O!C5WPDVGrJ$4!JD#eXAV-{0 zrt^}yzS4h$z?I?I@})ozpkxw2RP@;TjLYa5|G-xus@UCvnKA-FJ{tJ1_1G14TFt4h_Znnb}4scjXoAyG@Y zms=8TgQE)e6RBY<*poquS%N9Y2=;?oGx+Q!0pSD4+ru-9#Wc6t9UgpluqE7oy$RM- zWl*c&Z(EhQ)V!q<_WJ`0{0;t@m7q{Wxp4mjVu04KeiybF3h0j3uw>9)(@K_TWBrV{T3h@h!NfRE!rW?PeCp63}YuDk;912n?&{#W24KV zMq4`&8*=vZ*(m>Rg}Z$+fE`eDFN$_&tQ;lC)Nz%15m}+WL+zncUR|bE4~jpL8RL#~ zZDDumm>YKnC$sfl>1Tap=R+fY%erL{#sZwvXn^Qz1#+*;BPx=mLo}!^iHGm+0PyKD z{Bh)19@FfQMb!?1L_D z*M}Wv>z+%8OhYlLcu*0n9#5M8>X@MngnKZ%NXq+z3F5=h<+uu#2v9E41!ex3Jr|I^ z;d0vc4pO#AVELQU$}PzxwZs}m8p#TVi;nT8&9p*hLg=Fxl|QUBo}Y~HR=7!BkeJsc z`d%=Wo2r<5!6+(3+Vs3oA*2|#)cG8@N|+u%f``K;tTB$i zqQr;7F>plB@^&|SG}qzl*X5e>eI%M94E-8Qqd>UKSPO`hBz-Njl78aes1P^ryIQcb z|2iNV;Qyxc!Q@o;q%AAAgHJ6OWaPtmFEt^J0#kE3>gnY(UoS^^+mEGW7mFg`9^YDE zC2>D}PGANPxl_bty0QiLEeG0y{k-JqS}sH? zG}6&Ze$l&7&nijhgm!b}Pzvl>gbYTB-G6}WNg(}>8=R&FS3*DfyE2+4e!n29@0X4H z(%6m32`XPcVle*|p<%%}nm$>xD0wzTZUVg9nZQy%7%4%S3b3$~H1&kG?hgO}UwLrhX-e-wCM>kV3Ro6t$RTLh*T3&~U z*ziQ0a><_t6Ydrd^SA>F#i@%5kk#y&hng$$6hu~3P9PDC#6}$kLXojzO&JnI_y-Z( zdOczB9t|eK)A>GKX_=HMoj~Wr(E7oODsg+IziVX9y}M?o;nnyHs zaYNAPLWb4BBd*&Rm@f*ew=d0w6ck8CNNL-tbc)0TfwaY#Xv0ShkieiOfPcFX0j?z6 z$us`Z>50Y^KTln%hyMWee|#E<59r_YTZA9bGWEW<+L1b{786H7(v4~ZIOnQ<;3yOY zjy)g#v6!VVQi6W#3^vVhD=Ji2Hrz^v=M`?S#NcB8GjAWQGM%WxZiMJ(1&LVlDQ_{= zHVC*}W=tb(c$(eDKr^&g8%0>b`+ExSqUAFIe+b?m3d{u?Z5xc(s}(@u6#6@hYFvfo z)G_p#Mqo^-{`MV|Scx9=`Y`YQ&E1af>Aw2Vf?Aye$HX$Ck)|Dx6Yx@}qd zHC$JZ0NR=y(8?5%3x6_1mZsIhs}JPADE-AqZl`e@g2I?|#_ZN77ss;I-Jr;31r?hf zy**8|S#+Nm^PlzlUI@KzwtEdNR=u^jo*Y}nYra3g+!k+WtW1opnD1r~>73zpIP!BE zHxlceaHE_Gn}rWU800#t=k5GPGP#OLfSsyBM3a!)&>n*O#3q6V?obO|z{HSBSk09f z9RUCmIj!TdPRQM5LXQGQa@G?rIa!G>l$vyX&{pSzT;ma2V3S(MYgWOKU_%+zR(}P_ zxgj7GGQxiMFa2Y_Hw>kqoBi$OIo|~o73(W%;7dV(D#}+d zI&#ujzTE<%LZ-uJtWVe=HmgP7-aq^@50p#)|M1J~-VYIc&&kJAbchEJ3Zl`4YD`efAOYmpS4yER^dW81%u59UwQHZTGa^OyaX(fY`GDoKDNaq3?RVeIirB>V5q3|;gzDrJ_AW(*PaDfVj>L9D5Fi{6Hi#``0rJOw`Q6Bo4L;?3BZW^ zH+BiX=Jz?8RH2?$l7^Rq()7TBPC~Erh3W4KNTd|&(On4F*YRsK+BdZPT3oe8TFsic zdnORH7S7gyktQTWS=sC_b-*i>>Y<_-^{e+2LD<^W8s@0Ut4HlfQ?goF=J3(0K)0u! z_GliitiZA`7d^eqccQa4tuP|Zo*~Q&or8>r=ym8+>E2X8})BlokR&N&2P_LNv%auZL;OxM1l~? zkYGgy*&6z?k5((y_Q1$Z&?#ABqk`P!Y18jv_d{LQn`6<}Gm$*48LcU8_5t>ut;I14 zY{^$P=w?FV?&kCjoS(ncnlvors}t!=v0a*PQ7yCPFM5uC>(ecvqV+VkS|qllB9#PZ zV7F~BmJqk_g7dMyjT)R5gv=1(GsNF&LAD-N49q%)i0;?A=V`C~bQv+l4+aAun?8-O zVa>R&`9`}HhSdJP&?KCe$V^a|ef!YhA>(Qy{Z!DH_Ua)$9w)9nRrN*{?pya(A*L#SPK47T!kQn@wIIPCHF+Q*6Dsa}Fl-vFDFnMC79x{JM5Fx;Ks2G5fv*y8 zgLPu)8aTd*27ry?in0HO+vk1OLn^q2rVULri}?hrwzWxw5sJc(uhu|_Oj+dnu>c6+&Kr?1BdZQEwg}+9f{R*p zjmv)i=|qK*v3J9!|4Ip;coEjDkb~B&!hLgtX-p9g)SL20F3SY&p2RQ_5%d_@z!E8j zvQez}$(94D5rl=Q=l!|lMLqF1b1%xu6r;C^qecEnPFKC{?Db6Uo7_gE*p~>8>dh*i0mBuU7_e5k5hJ))JFmXU!v%&H{`-+?`Rpl zQU($cAXzYT>E|zW#!Va$I?HSo)5LQykvV<4uP=~69ZheCqbxx#a3I;Pq#?R<{&nu1 zHxhLWReQ#IyKngfR56DMNi`usFy|yD;GVp6Ew#-(@wOSGh-v4kpA_(>aC#AKyl{uI z_<48#217-4>rPy16S(V#w~oFB&GvG*Gx(l951u5=$PZDR$I@OuC2<8e(nK#|q0ILg zya_OI>F*G(&j~nuaqt$u$lg0uICxEZJhuo`Lxt&?KwA`?-iu$Bd#$Yq>f!_RIjFHq z6Cxe^=tTnyzv4bY2rd!5i9zXkpOd_cBMu??;Z2QdjfU$e{|M64b$}Bv3fr{GhX$0c zV$^N*7c`}V!lg-BoHc*!g2GiNpvqs_$2%y*KqJ#jp+JYHZ8=E;!ioP}7Da8bkiLUM zbRR;jsL4<%f=l#BsxT^8qXd^Z8sbMcYJ<+h91beH$KA%d5AVO~mY z7hOQe>CAuqA)2@HemmuI95bu|-d&{_nyWMF22FSh7fh9&=YP`Th#gEf_i7g6>jK~1 zYxIG`RUuQ%KT&g3(D#ulVzhETs-orO60Caw6rk4?c=2y;EdM3nUD&&`x``gf4?#%FN?EK4-LT46NO*jotcT$tOO`C z4!Vefx4mO>42qL@f@KR8(x z6KQHA!@9{?v&69+zdETb7|@IU(din<9w#xTsSQLlo+`M>t9bx;+DGHR9pyK}A~hmO zNPoV?$P#l#U0RD3wq@zQlN283M1FnbwXoTolGrJZ?khEx9ggb9Wn&AVC%tSO@$Eh7 zvEnboAtrZ1bYW6`xLo{m*rf&6;2i+6x=ZB%DVFM{{xV`jDWOcK+b9of7#9<+lZ&F6 zJL+)IYJexs$OA5#I;iM=BWqK$c5b1)D#Le_4~h_HDdWR#JipH3rQqx@P* z9|Rn4s#7%=Cu;ngcvrZkUk=55^TF=7tTa)Cy0#dcj{BHv1?1%mUdZ0QGUvQ{psp;% zg~T04^ZLoW5BAq0q)mw+dKoH0uB_nLyB1wU@k{b9C_E5&TghL&ouq`Xn=0}TDGH^_-cxs4tp$FW>Wf#lb@j3PP{{7?Kf|G5J`EkD9 z!2Je_knS!Oj2z;ex`&e)0LKt#X zYwqGY9~Gq6n!TlluBFeP*EUZflXKg4_&4fZv&g^&`GWgWH;FB=M|A|cQ9hc#hMuON zwhnZe&HJv-Jc~Szjn3uR7u&Cl3{azOXk=3Yq^c=&E>Te}Ri@5ma?Ir;a+#5+tMytS zM$F`oTIhp(70Efc*l5)-R*Ez2+R4~W9LO3_*1>22dPkJ0LR5_DT_2^z=2Af_v6jM- z$_(MQAbXx+#`AOEmHAY*00dm+Nbj!>IY`QIS}Y`3pFCLj@abES)zV2Pos!KRFGgd> z88w#}PL3p1MsSbSSy*IL&Mo-fwb{T=PQjRPX|2>if;RsU*OfjqC_@m2yHYTyB@!3Q ziJ1gQr0*Qrm;t{^rB@3%w{g&&HowzU6s5Sh>UbdMg( zQeJ)Mqx&L+#oDbnq$!+wW`o*A3nI2BCdUpQ`BvC!6I?>^=C9)g{Pc{+d1XEGMB4#^ z`uyvhKKvd&KfXT8R>+AG_$SG6THomj?088h2Ae3#nK5lFIk!o#+8v$W^?Rr&8_5dA zMkj`b<)?cc260&KBN{$ScnIX3qGWleq5h00dKBVLZv3mSggZh%fn`(T%*3c%H0Uui zD77t7H}tTu4Eq``RcaV(+@JTLNWI++##VTi(*v2#jqvLA!l)58&@4Z{ftanJn0j{( zroo0nUM?J=5$U3)?W^jZiH_2fzaVVBAh%NagQby;(5k!M09!Ot!@}8sT`&8al7>pe zpE+%MBUtSH3DU8i>hTs}2<(5lVWOSos3y-tkJuxPI|xQo0wWCv;eNqg{J?Mh+|6c* z1k2uQ5s~S;xVnOe3BWO>g8>p~?jx{A$Q-sFnHAMy`yOW3{6odfca_mG{oJ`f!=RpY zW=*rjw}IMmWIT(I_f4o$j?lV6;E0YvSvH`1DN6ySr9X*7DuKe{hchgBb ze~b#OyU5=jA_kwH4(9pVjKeXQqg&vdetk)~xPV z!J3h2k_ZG8BiV()7j(Up`JoVC{i9$sp>)VA(u&~Vah9(mn8fIL%0+r>!@QA3WAD>g zen`or*|{D!n@%Hu1O86pApR@(bEb%yqQ8n;#h9y?{M_thhgM>fcC1#A?Jr=ixNF&D zFK7gWH-=z74@Q#F@AF2jXL%H?2Qg|CO+lX#ibV28qS8eG&pgGu%P1Xf-hkI3h(RGbs0b9ruA=UYE}9#j9^x2 zHF^6d3AtKzUvcy6^!6Ws+hfA@L6yff%>CPrEQU2%lyQ7dN%~*z8qtxZF2qRVFWM*K_{j?Fs>)=RP@YzL~=vDjkTkFQ6aGI!#_(C z$b*8t_tk+XeG2n~$*`;`a!PC&;mUqN&Le^yrd~oRt_h6q?Qw_+4D~$7+lv(g6ow~v z!l<@3P?_WgSw5!!{XjoVV9>+faPx10$xxaIYqhEt|9d$r|DG~nk7BOY7@fb_eO6V9N~mqD?qQ(v zZ>DHs{LwthMd`C@SoU92Zo}RXuM8a5XxkA`&Fymp3%?)rcg3HN%eoX6}2y zzaI}GG1;M50D}_1QKtREGMd-ui226*ag%oBZQn)0n^aGFkuS@-$W6=icZ+LU7vo=9 z=(SvVIOa~PMQO*n;3&=s*0bfG+7>SIq@9nVLjS6!*Rc@W5%qHnToxDs#F8yZlK=^Z zG3dOM0VoyS7f8`kN*GHi(dp85gLVTn9x`1h%HxmO$H5>KTm>>fL<$x+5|~0-NgN)j z*m*8=ricrTI0)+tsF#YO2Wu-TidUF8;}ukz*b@Dql%q8DNu$bK&6u;@+Q+xZ=sOUN za^R>JRS(iM2|Diy^QAF~4P$_?mZ0bXDcr_&Tp)3yq&i-*2a)R2OO#VdAqY+eoB=h8 zU23&NDH?pb^UBWA?tNfM^&~O`6oB9?Z-a8Se|whTskWDp%ga7+{~O98yL|@W2Y>?r z07WIpmHU6;o@uNQTdXa;Tj!+>QI9l#s}Fds7{J9kfC~qk2*QOVq}=%zmWkQa@QAA{ zkKQNaD6ygXds9e*j>i0{$o-6p;j3Ash010MPqvrGVd4-|Oe-G|a5(5^pBhl;_Y+dl zdlpRq085reqS|Kj+9j&x_(S@}n%u4tk?JHU%o1@86mr8q>c+A`n4ReuBPaS;8TZ7+2kO+x9{_{x(8 zomm|UYhl{~X-AF3DVPQ@|H%mvN3~-kg6U9NR#m%8qFIhTq;}Lg!KI*?_r4xa%{l+{ zC~*)BFFJ!{HEYVvx4$$BCRt&A`{R!IZZ)w5zDtWVUyQ(2w@f2PRUA-N5t%HJZdQSJ z;DN^7-Al4KuJY#h`7oEZlUs;`Nj?*|{nw!wrBl-p=UQwwctAq$?*aP#yoRdUuz#up zk~!UU*~^_u=yk9x>6GZJO{ViO(5U<0ooncFEs^w~amjpXL)5!~g~{wV@+?Zn)#GXI z*Xf*4(;Sq7VCRtN+g6)ffx_Lh-y2VIVm$#^hAK$HIp1|mO_+@z-A_+lDZT}C0#K-6 z%_BRkWsBBx)+5`Ijd`q+)rQka9VozaB6sqtFqUBoq0{^SKy(BP*PovB58ztc`D>2&5+;IXO@ zm};H@FZdu?&3|v%v+fR6wMQ60-v-g;9wSXHR?k;X$`zH|S!}CJ{6;8p_sXOcs?X>D z`Xln>h3(w|A6BXeXXu(ICryz~qsdtDbF9jC+(>+eD(o+xXeGaV`fx%!?b-!}FbB~_B5A1La=b^I z88csn1r(7>yix5Natu$@oXkX08=sJTs;C;-FMz&rlv~4Q!QXl-j0KT(f({b=Ny7`@ zyuR2L<4IC2| zB+sDt9o4DZ^F@|40{+xx=6A!CkEbWn>fpGzjLSVdavL^XU+=43bjIGG@shl!IfvoJUbkxRF+%Woh%c)Z zYgFz7DC#Y0DmsPN=k{>)E;oLnzq-#M_2ftn8XNEu`FPTo2H2|3DOZ6@-qNJYVCSNO z+&E`WPRJnAu-qZhoK8M^4=ygF;nUoNcjn07@+-XwX>IAliC@D}XIV71u#`&bq2#D( zN{m>uHQo(Mr!e3V&A#dWCZebtAud$46G+k5K7Fss9Us9;Q*8>E9~8!`^jhahd*EPv5Iu_(rKb1)i-?2Zswqfh?oBne?Ft7Cl| zvy}R!NFLssAv$FtJRv3bfsTP(U`NtJ7XEOgjv3JRCAZ-}-r2>&Tmcm_2m$@0Q!FH@ zY#=SeP9FMHLV>3u_!LA5Fy}&d3`#`WK>!OnDo2wq1;W)^E->&-8AMhR*@DeWx&C$60?`on>8_z56RVxaL<0WrfC8Wy zV6NT&P|g9yRmLJas@R!#sM8KQ78l=z$W~kxC)wBMvjOt;@1aHAQWZ(}J=K!NLg(lM zK69OOS2f65k;QR2kHbZnwOm`PfC^1lZP!R?ZC7+-_Is%srF$?Ci$k!tNnT+sjU}|_ zQ|J5?cVI#RiwI>5j`QK!QbS#9)x@k#N2rbw3>x`;Gjshv(X}ucu0q6*AXr(b04sg2 zS|hGzsd1#iYV@x}8;qNpb9uf{=^R5b$NqySNw8|$4M;6!Dsi7Zi~7a7d2_pyq^UkJ zlHg_aIpyHYWM8@z7VNe0khqYOI@`+; zRWqQs?Bi?v(kijwd7g}E~{C=#;tq{3Z4Glrw73nHlZcXvy<$NpDH%I4CAC z(T^`|VyRtu>7oJe2*3Fxh5-ZhMEo9%untEzkZd;<46X(@8W3i+-NX@!Wm_{wxF8D^WKgjsI1l+sjH>*FbJu6NsC+6?&i`jOq(8|VvsO1Ksj%X6vZHOLQO&GfAO zTWdnIt`Q3)xMnEt>ZBU0$q0zKK;xDWOPvS&(KZ0b=5`SD46I8gZ1d51!4ER9$tmV) zK({V!68J>h7ZX`>xN?B@HLX(I>*~FH_c`+j%GGsW_0i@jhCPg|ny?Cu5Ds#X!%6joGPQfxGGwYCVNH-JJ#hbXi%BNcq#xo$D`jFdEz^8$!{07@xIFWV) z*X+eWeCuvg;hmf!sS+z=Ek6bSRLD}GY$l+x?E-NMpkUXgkgINJr~+QHm<*0Pb4%AR-R4o7@JO_|+v>-&5Gf#aUmJ zhr0qbXFkODf^fN9yyRMk(pK4&jT^{~n0{tpmT`)Z_lAagoC5l=Tx}>A@L^+>ku7`r zBK0%#&A0DB-NX)kiq$5K1ahyHdU^(rlE~2;rvZk$B8D~%v_a+^k9gic#C0=XvuC`0 zbx41}sZc22!1Go@1M_D|pXA6g_t_T3o+FbSt zb-#_q9n^zMF-%fSW_nYNmYpa;UJu2iML|Ts9wnT5*tdAdCC$ysN46G&h?Ya?@$o%a z{GFHL_+(Li3&&_A<#cpiLqG-;bWOqIq;5x9d&&+Mgj^z({(R!H(0X`C0FYY&Gn0Z* zen7^h<9UST4a-9{RhaRNLCzPYzZ$TmIOR8@>u|gHsj#e#UKhG3x(u{RL@6sIqNW~m zl(|<1y5&CZ(N$v(iqGG5ot}6YGF0Tdh!i0osoJ9KEd?Gx7c2W9R{UB#0%ivGgEac& zx{0v%l#u?J`<51jgw-oz|7Dk}0<5wTFsK3j|9LM600Nng|2NU(-z(Ax%6+&lc+j7D zx#VX-!elxfR2)E2Boc^SvvhZt_uzBO@8owm^Lsi$6Y*(hD)+wq-Klkku*dCU z5>LjrB*1h>Lu`f?b6)*JF;>|`U+mCrsC{1H;~}=Fg>6hXldMpu%(cD6V=+{=VFsu_1tRv+g zwdSpUsU?sf`qP(23@<*&e~BTDD3bks|3#6igwhQ^n>W!g>&5bO6|jHoCxotx(3hN5 zzfrL@-AwBZ6&Op`B)96P^P&R-RYa83_Ti7owj&a8&hmG8=sJB?4Tf$r^a^z&4b8#$ zohVh~F+1*o3Q!SHphU6~5J&W_duSeLncx= zC;e_f6K=I$S)PRgG8(Pg#G@%*4R6P9`?YqfNdz#hf~UT&Z z#E;r@9ktD2TR^>p`~hBvVKUfrmGNI~bKkC#Ze^}&?AH0p$Ubu*nQk<5Qf7b22~mbc z?vd>Gh^d+F7#hedvVTw znka6zWPrQfmS?1=OtsG_c&Xls?b~=)&%3YpgL;a5ksr#o6CBo7Ds#87^ogM5F2P_! z0pO(l9CIDlzSyOv1mcSdTOR&Ug~#KFLcO1wsYmT7ag)^%&zqrz6P~M?4R`|gal7D( zBohO}vQk_JPd4vuUNx!i%jW!pRl{}@16`Q2hJLFgesTBvy&U4tDDOs!L=&6koeLCg z2gVV))zuYf1=d>XR6$(ZRN>GAxg0Z&s8ok0%RtR$=vEBAuFvDH)U`hB_m4_Z8z^4B zwC9%MU7p)yHDwxQ)jH_KE@2wF?lU<+1m&S?fB9^cYCbHi^4S=z_hm&qo8UUSKB1ea zKFaK!BK$1OT(C&Ye6jMqB!9h{|Nd>iRYzoBP&>Yz1ggJfcQ%?ZdiK-E@aVvMANteP z<&ubs$VVlT?sgo9mzfs_M{Kzl7V7t$_4TaXia(rFp%Q%tz$4t0keNlKQy!A`C;+IK ztTrI4;A_j3eeBG+F@%;~>E=w|c5Y$GdHVFX`X>xNR;J0r?O5!eVI?-VSi ze&9EKQ9o5UhvpAK7poh*M*~QR$G0JqVLEtv;v zhzMoEJMhjPKNhBiICG0XtwwI?4Qz&jufFryifNzhY=4DTFoQA^pNQ_+ZDAymF|Ykx z5F1-A5sR!{n@oq@4{ApbheHVW(6v9=5d+#r1~qB?J4^q{#`+cYCp)aGSG2mhJ&k0Y zY<+JiS1u>F~@;{U|J^=$wdl3z}{5@A$f zOsh(d=&LH)#G=d76#15Z(VjEB9PLIWt{2`JM%rAcKf>!Yx~@d&y%6BU)By0eIAjvo zgdv@iO>a5czkh1-TSj>>OJZ{RqKxi6poBi~0qcId2+9UEV9ZD2V0i5g#jxn;LNT1# zr8|XX6cWyBu(fGGT6gS zr(+P#JznvP48ERe3d6B|P!E$uNRRbkELe&RDz9uu&Se;)lBH7%RSk}y={h3F^Dc-@ z)(dA;w{CE;lwLDw`1Ad<;IYZ^Y48}KyVxmT_w*#qn(16bO15~bJ8kYV@?|mMqQ_F% zNH`Ki8>6vIxp(}vvh&ho%`}9`=!Og|4jbU>@FRzPs&7DH*aL0^x{5LpOJ!4xeC~mZ z#S4&bWQftb$}nBXZr3I>zh|s!;_E*JS=>E@-GZtPVt8OR8+Em!_C9xFT_Wg(y7Plo zkwdGmXmd=+hpcIxUznhHA?#V9bu^uQzU&E z$M+4~?~fuh9VA$rzcQjxW3d3Hp^hbW%p?9Ie4Si=Y1FME0(L`(lkGWV=$<{wO=4Vj zofRXq@Xtc2+Pbp*p+w|c8G6=l9^m^-ce``Ihef6}bVPF)& z3?Czp>9rf=FFfr&WSzO89onU=m0DU)7x~xZRQ?g}uCBQx^G0#CN&26GrJ_#h#NycU zLwCxzLFU620AZnS`x1@VMX|#6HE1)!UAu6CdjGIK-zQVpOWANSqA}M|nQ%bTq3qFX z+Nxs`QyM=E)0`cW9%0KWl(RsEcgT;#$LOYh3ZofZ)N??&+f1lc^4S$2?t#e&muK{A z3%8cUq(!Ne4wjo+6!i#{qI-a!h*YKA2$bZf-LHh0k6W0N; z%%ZVB-&OY8n{Gek4~3!)!UMcz99p2vQqE(zx1jgMT!t>0b1! z$4#QWwQW~#kA+frmTdOjJgAg~s2jsF8{ZZaf&3heg|F&(nksa60f&Samq!g@@uaTe z$F;P(P4S#sxsSo%UmlJ`?jgqL2m2JR>2b^5eg|$`*Q5=X?)|?E)v&`z-2s z41|FBMZ3YoS%FI=#cnV=$Y+$iR{fES1+n)4^7{8RXN8TbR!(&*`u!Jxn|#40^+S5b`~TmhG(aD; z{fWFZV$gNP0V-H56-C!@!yJJy1*Vj)eU-OprkDg7Gh3-N zvb;Gt^L94?h8$W^2yADn7ju#DO;h~>V@nyIO#^p!mPR2*$kg6Icus! z8e?D2k>hD&y$25D=)lt{cOZWn)}Tu%tww3=HEJ-8vg|664WtuYJr}|_aJQvP7O<+} zRsaTq`sJW9*oy0|pLFk|yCj+R2D!3DGv(Ge#Z_T%>aX*nhCSyH^S=M{FOSLk3Oum+ z{MtK;MOOW?gmNvelBV7Oe3QVF4-F|QOO~;cX3h`#9Oi_3-lg2yIsA^j`FnV{#_X*sk2Zv{ITzMIQ4|&?H;^AF=<`v9QI3wP|JDZ6 z`->?)<)ZYjDO;lscFiJwQ3(YRsorKCB_(3oIA@9Ssl%jqd2Q)|*Or+Sab1XKTcjaD zTI=p-xqsnkYCgg!UYk;EKyO@7Z{`RIgzO82(Xv(|R{~gWZzj#J8@C2z`l*tMLwNT5 zA-TmDs-z~1O`)`D7ODK=S+`AF6@&L^?l?h$0v*ic#rZWYPqdR<&$YDcG<*Znul>3I zhlPcmmxBwg*z@=<8J-MhN+61fpGfzHB?E5~D2NQ{(RfvYk2~=GuF@<_*aV-SIVVN- zj=%{E4h$N_!oX>!U*Bq+@~2OE#4>Gv?A;RhR?H;_F1aq>-Y3!9Wug%#0cgvbzruu= z*x8CTjbkiLU_|4iv^G(8-t#vC$$Qpu1zhw`Ek^5gphh8o)fnjtT~H=rp(-9^4~X5= z^uWj$t3~4$tKp6%Nq&h%yj)a9c`ZtMaYd*x*V%D^Q4slyl-DA~+Tl0aX)`D)jagVt zCUZ41#tPAC*0>}d0GJ5Y0sqiz1$|Y0pb{VVt|M47KJ@Puhr&#S%6cpB)56x9VoF^7 zN*)Z6SUgWV_Fe6dOkDG71MN_@p&CqhUSDL9J8|VxR`a8$DBJ_Sl=!J7QclfdLcot7 z*KGoM24;}@YYidh0~Z&^tr>-Nk;7TDg{se%ZqHG#ei=p@f0WWjX2xwIY+^P+J3c@7 z(jZodWdxtfY+yk$`X<1CmN!X4z8MBUf05*Tzc8$BtyJPa%iGd!FHivc_Ot4=ZoykY z8e4vs0!$dhzGVU;Mpw)|o*fhpE$5>6CLF3pRoM@`t@xQ$B~B-J((?^TSHJK)t{g+4 zsa8h|2@)zP$5>gE1f2$;W<|F|6*+(G(v>;D;D{wlo7`q7yzIj zqS*!A@kSya{l(W-ZbsW3R)YzZbZ@tSgxr~flzTJ^t{uL+e!>aZtU!i6UkC3O;rg@> zGdiMC5y@Fi(D<`hK15QF=PEL?29U~AVp6}p!WkSPz_3EiqVOe1fiRHn73K&^nqC;8 zf;@W9=h&~hS9z*K@{poVTt{FkzHJWx9{~8D=?(Hukel%TV^qPM#%2V#^?4~M{!w$5 zFWi{=6j|y`1gZYm!TQOG2gZ`g~2s5U+Wpj zEi`@n{xR6$5Eo1Vc||#a?#{Lh$vNFkzY{H>Y0_vmth0R*~Q}K4%k(b zz%0@Eh=EFoXK;7FLrZ9r5ru6=< z2)!Y+m`DdMzxVyMX8zo1@M{j_UrwzXbL8jS!*^8e;>DLCZ8 zP+48-z{uwfNxE`aUGy`VArSPJ2E!_Ldr4*WH8;%+X3h=^?X z8pfX7!xVzicz9#g8B3IyCm6B&H!q;9nPI;l*{+B(B>dLL;#(1yoqkRO?Mu2ow**xH zBN2eekRgknvp3fC#l_!HDDF9)9rS|5=vsK7J{&krpq_0FrTd0{6imV#K0FN+ep&O_ zQ^@cHQVa&*$PPibVFK6sue3fw7g5NC)M|3S#wHgdv4a=S|I=>MH3DHV06yNTC2}%D z13lfJ@;OW246JS_pR{-A39h=Oe@Up-pM_D8>%jAg0$BsZTpnpi>=Z<4cV{H-6oQTU zn@OQ`?Bm5sFN9k!t*)oT)wZozmR0^vk%5EX0KTYhwM*16IVQ%iH<*2pOn82X;2fVq ziKw3lqnY&@{O$F?UUY!??#D!AjJH_dmR{T=V*k|0Puoqf!az}9E=XpvyMLn{c+IUH zF)wXgpqR!Pb7cp&FAEv4NIA<5sY0{L1cCKNg)NQk{2(*z%>K&UsRCp^OrLLzWuHKL zG8h)NK&>YVQd;3>Vb$le>Z-z3M@@lV3iLKrcm2>&9MS&~$? z`Z8LY0fNMKCCWTwOCpr)3bz{zqd9@pdIjtBKr;`0uU0TA6_W)}LWbq%CXz0OVb(z{ zGzH&gY$vEb&?04@jf6FVGu2S=XVk+KTdP?1#7V>XxABsMwMKvocJqN@z8lve$)z{qRqUu}p zq|UXg+ECLXgb(L<>#5{3P?>+Zoh!|BYf0zX1YYaaLNWyS2MUo9(;jPW5cC#MzFdbX zxK67N&Qv%(&ExT6TJ%tEF=gfZ3=qBaPCSvye`j}^JsmIcGK@p49P^jy>W!n-+0Rrb zRj)9%UNiO6q$!GT#EU!nJVXDb_XRLFEX;l zMmhqQHiQv>TCE;2$${PORxzn4-RZ^Pmc;JSSL2P?v(f$Vk8p>r87%-f?tkhHYUaOC z{X!v0z%(#_k5s#*c1vr>9mi3m?z-+xD7#8U`WE&Ryjw;Za;h!Qob-Ns9@|&8Y7=%r zGZ=b!fyj_>Ga4Pv2AzbMdg!y1Doz?=7bFldknJTrKOzR;zdMnD*GeJDg>HX?gn(9n z-Tf=N2#P#pl8(0SpOT9Gunb|;X!5fff_xY#|qM?dJ$O5hsK=e+Xq@2xm0p^rs7}v&B zm?8|xdKxNl!ZTE_ep*SP!6}G&bzqW;FB<@v%5n<;fYB~xo1~>*b-oz+L{+w+bMeyD zN`}EV;;R02=U~x)0Z|H!|7NBD3juQ*{)eC*X&oPjl>5iTA!SS^D^S*`x+J5r$(F#= z*gkn$;{Ll&%>`iDgS>lf;Wr?0){oAL6rEArGp_Fet1bs+a_Q^_u#=ElIA2aTP>>io zq%Z@S0^L((r<4Y5u-yoBSU2*dj?vc0&Q!G|+lM-rh127v=P{r^4Tx}qS8Wy?R^uI(@=aP6o86dtHjPqV>KDY zXRoZXfte0R(9^t=8U1>}6Wrgc{<1P-kqknA7aL5+nQ5z65QsVc!o#6?y->YxTzcfQJn)b|io{xXgP zTg4-6QsOY5&D5<&ETf}02*NK&Y3P{ICSKyCLWR}XqCXKM8S_2R?xsA(r5g95YaK5MlW2gC|~wB z1eJ}tH0i;`Tvtg|5fI^6{Lp2UaHV3r8RrV>yBQIO02T)rHja!{O>gdp#aQn{6F-0OG#`$fO3jmIU8p-hAyh}1YnEFzgMjLOxupf z8*s?{PZ~vXNd$T6RB75Qnn+*?lB<#t?vKiihAsV`m?-wpu6c-5uh`vEJfxv^SW5`3C)8ptc!JuP6SwG{MQ;+9)0YQ`eF1!ioxu~^MC*|#oeVj!9`OQKr!-|#p1H2tt9$#4t4`FA(zL`JyQ%t3MElmG!+6t8P;C_4 zCtf7$>PEKJ5cYW&yZB~74)Ep-shDb$+@SR|zyOsAgyJSWbJXC2!?r}eG4_4@zH=R@ z+7<-_psfNi=)!EOoKGHlTS#U4?)U5t|L=-+GBUUEUD&&`)o2oUoPZP-DB>b~43_SS zI|A`Ed_#kI%1Gy>$r|wzx+w<3r*eYLjg) zHJ2A$PTc~TPJ!fW`*>Un0r;u4uTmsLf^>Dly98!KQl#U89X?dh?q1tv!>L$(F?ixQTn1& zNow290}8gocvr%wh*X+l2?~s_h0APLV%7zAd5WD@``?ZR6WDeZ9_ zv$D$}19Ql^@lQ9UGRtl+Iwwh0&taRb5FqH?ahrN;6GTTL^9dC>cBsAr9V|b%1=2mQ zgAni0V)cYmf<=1!IfaD`Z)CYY4fY-#<;1sJsbCs!s<^_8*!kX`>DrIf=;3+2;_S`^*Ba8Tf)~NCw(mFMZ-# zD%m3B(pD6|*iJRk1^PQ{AF2T*rY_}r94z@74^h}lEf9+o)z~}R`Sd!Kx>)+5E#M0I zM~y!;6h_ocbz6`bEZ3P{^RL@lRltblvxd0V$zJq@Kcq1{{`YAKGewvUK!^a+00R}W z?rE{Cou=R73G=CEKf-7bHGIacW+=s@reQ|-AQ#h(p8>TAQ6lX%;oLpiHrsDSx!lv_ z_Py3vu?m;y;@pKxR+Dmr38EG#jGBGpFJC$fln>H+2y&w0fUM40E=mrSN!SEESy(xR zB^liCN*Ujyth|^Wo>Va8S#c$~EyBdVTxcbWEZl%xWNqb7udmEM%mGC92pLLAVsgl; zLHuBsPAq(XA=|{qdGUy7!!mt=DOjDElPxOdXPyIk7fMr4Kdr6T7+HzJkqiXefKr~_ zK&7gmNw|dHp?HiC6HrVF07n6en$-w&a!2zJpaVh4$_{4=csGLu=>N~4h1(X$Y$jPE zP!XQgr%L+;01&WX3g;vnn1k}}J+rRUi@hW7XN=70l18`ESk7CR!pGn>-3!7oCg;Vo zgpStt($f69&75FmNnU#Z$7lTqrdtnJjzNK4oVT9Hbb(ioj9qt;TIqN)%4l)E$O)96 zV>IMjnLlZQ>*a^oh(dClm$B?ms5#mq0&t&HI@(F1Z}MP2NL{YhQO6U|dW2cb0{#0` zAiu}46n%D<^CU1xCc*DCW2@Xa#E9C4R9>-hpO7b0Y!+T7%w~8Wz0zR{?2`B8H!YL{ z)QZ=&?8q+X;RfylvVP|^Wo){F+9Mo0b1Bo#fzvge6mE3N+lJ8L14JteqPPIF3h|lE%kc;eCVA z^PIcvIN&XqgNW3Lu;ST4aW4%hKliye4a$3Km#Vsv6NNkr|zM-FZj zCLRq5LnyKLQO8#sr3%;jMIH7rX;SFWu7D|ePOoiY`ab0~QNbhO(2~*TVW@B06p$u$ z$mf;PD^~0=u_htL;8_u>NW{HBbX1?M`tpDeI6_`XK~z;62AX@4)a7qv@uP=fg$O_$ zzb>UJhkhGnpDg|#cEs;T4x4N4vP__x9W=RPR_HnxWHryr?*pDO+2^mfE+^aO#nbH|y&-Wc8isF(=K>vTVqOdL0z3V@WG@b{Z=8+VX=TA68M= zau12I*H>JQ+at8+1=$NYGaaI|y};`+35AH$G=qVR?6AGibxK~|$O83=|Ax}IW69ic zIT-Q2bnawCCD`y0U>mk>U4%zfxOsUl-|)jD^5hW^X7pqJeOqhEbT+*zq3gl^J;(9x z2W{E|_hI90`!&L6$RmQe{iBdj44qV2uV@l_b1E0*seCeaoC-a*k=^*Olu#l2mXi@ABGo!ey9&)u(L*na2^Xf<#zJ)Zc%#?Kv=4#cVyaAyl7U-FDa$0b3uwY!4UZoJtV~q$ zVo_}x136MEpD-xnKmi;)(nK~7N(2J}v+dCME+Etz^XQfs-LV{5k?@ac06wJP5`eF! zTQdkjp(53C0{G45RZsjGt?u6|-&i|-HD*=ZX7*Ykc;QcWxWD`96}F;Am>~AVQEuXB zt18IpLa<^?ot-@U<_;NpTtO3r*m~1`mq}3O@#@g@M6(t1)8+=GPXz`}rUB0yoPk0G zP6+q2E>5<1Vd#B%1vchC{MrkT41_Wfr3KSgy>%?CJ0Jk3Vdz)mj-ZI(%Y%W%AQBf7 z6Fw(Js#CZf?#`a!i>Eza7NsmL+x~m*auAT=zyZW6hJc@jlqPu3o{Z>6FDm*`4_O@X zv%9A?LHq0)?p%37V~+D(DhwFQynM7;&ra()g5Y=(2kj3y|^^CBN!M zlEB7qB}ZdIVAxjv%X(Xh8mlpxWcHJrYvJoDWse5VaBjy%aqD%fYO6H@!V+=c0^!flUp%NR=c2|Xu$w_xp07gp(2zV*5P#^q1=YKP@JH%9VwbPHNSzYIygV4_NSL%x4oni8f$KO8%acltWy=t$=634o9 z&iDGGwbd|Fhv|hhWQ6wK^VzE5YbH0# zb09HY|1ygSJt$9YfexD@9M4y0;N>}bvB#SbzZGP!XZO6b_ZHa9ml+!bvgax0q<3Q0 z={Xi}stiG?ylp+k-c}|a+1nquk6||81sn6f2)CJajmU^Z;N?NApJ!2HLplzB;HFwe z`18{-Ci!XX^PuCj}k7fn+rraL_o<$7oA10Kp$(#q85|C?L*v-wG zDI=F~-AwVY9yhSDS(oWa#?uXbp7btV3Y4>9Rf1ll0YWY9 zhCY8gaI7YTK4iB)_|Crb5^oI(Bfsk+n%*vs(ZoB`bd?>q>@+DA{oSoOQJCEQSv?x2 zXJsTn0zJu+FxXVRiTz^F(!{7P9Rz%d%6f!Q&$o6jW)*Ke5*ziOwDwmG`cOG#GGvWL z@gTI;0`V!`b(+;=<6X=|2FqMEvu;dFCigDry%eD9co!kA$x&7nZD`)lYW#o<()jT2 z(wyO(0IJ64o?1P2GdIZODk!5?cdEai?MzJO+1-s?9j<+3b+7=sO8cjS5pOqMYnl&! zIcw!D04$Z?UKVc#pddo2n5G}7k10%6NB?sEqNn#`JaIqeEXEim6G6lm-H|yXt4fm2 zRTraUocaEb+Ha89-K#e^)63PcJj9N^n9_SR&ob;{^5O(pr$l&-h4-v?UU!2} zQNCtpP2VS~8F=Mk1xIx5ZB6o`y;s1q9FqUjpoBMbm9ueAH7(c39t?g}U>>I7W|e!{ zPhImqrCy+NQ!~A!z=Hyhn7SgL7Ka zPic+Sm$8LCQP-E3Fl(N<-@h}ZnOvO-6OBF$e{m1QY#^4QVK~Iq=e@`qR#u>7?=9FH zpqvri0WX)5{oHr8Sx*-vb8wU27>4DZ3s!o6ye&;O2FJ*R5Vw-$iQC)_xWC|je^RoN ze!86_=ndxa#)d1#1ShRn1m;TCK9=u%-3eI`#ZA)7 z%hWeOV5wnq2jM`Le3boPr$Uv^ppDDEJtvGvd5v_LR}!tWto(^kTx_-)gqPCzDNkRW z$|4j&++eRu$wjCK3jQIC^lYeK+~-m$xrTzszO5&6o?&tx@&++RFb+}LU)Rm?S&9$C zd|mZ({T+|%pl-kgZpx&LhC%XuuxlFc;f?gv(!*)wgaRuHVSYPRPO;2GCzKF zoO{^`G$v(HnbL*LyZmBn9~FKhs?N1z)*W9?n$L@t3<|sECL@kSmI&CT<=ljwfx?7K za?=n5LgdaadM&Ad;wYIUI}#VIwejjln5Bg;P~1^2lOGoDh8CLbVgw_B7ra$-Ymb;z zz8ZEgXY{4;W_aOd_h9(S>o<9;-?_TH8@`1D#)KeD0Ou(2!aS`u%H_vG z7n$V=4j#vbu)Kf=j)s#uDj=o@orzH%3g9}otA<}Tn`b>mBX|V*1ZS2&RS%yAoE}Q} z@Ybk9u4c1hiv_&;i?{D#jS`ci9#rVm}A3M*-o=*vN5?)$yy7!^ne}BfDqM4 zY2HxMLp4>AWpg1a)g6u$gkhmZK@}5GxB>)PajjZhh$BBg{F8%WgUKc}j+-#a)CJ%= zLRT3`PAJD2(~M@`rWx#~4FCgX_n*JBR}9g?O6nVYJ+7Zjru?)xNuVtvz9BLqq)L}; zuvcIh@|UuTiy&?bKo$-=O7XI+;8AE%U?Bpaz2=y+kQSq+vBuz9%VkASsJ8+-;_Y%Q z7-97HPkn>MT9k}?lLVNla+d7u&SjpkF)EItaVsIP0idbhbFj*L4Fqt3PK=0fk0YF7 z-tMjEIcVTc;_#>=bQA@EOzr{$4Puva$(SVy2v#X_AV4!gQ2?ARX8&9$P)0;5*eq9pvad1jTW?|pzY3&tOve;iZacReM43Z;D*ZfEum?&!&Zoq><;@cg7 zEwDNYqx1*LS)W4{NPdY^uS#$3!eT zfy2}n)?;dGr=6-PkEo|{9tUXCi*yUomn@`vI@9645EyQ8Z0 zWVX)(?#=e>>?a@s%{iatxK$6~B%(+pO0V4na0saA= z^EQcp0o5wud{*fIdXQu9U#f~GY43%E@~;BpP4;<;rmb*dGCk-rWXD9p;C#1?0|1{Q5XhpQV?E^&VQNv~phn}KsU^a~`a{n*c~y5K(A0lK zVaGSVrV3Sy8!+=^Ssit>Wn0Sq%WlEc!-6T5eGs(7y(W8&F1DyS7gbe9{Pv6#Zrw(0 z3t@M^X@-xVAr`M>(4@Vwl=w!J1}2}ijXpkTPF7(5fah=`Nna=)3+3hWkVS}S6rgl2 zZRcr=!9jX4VNx=(ah}Djpws_7lXk#0R2D`sWOnl_K`L^XmpC8bAx`O2QDi-VqKJC~ zXnnLkm(8uy**{`OPPjGwhUkz)H=If-2HV4!?h1^QLNis1>XwgVbjU;x>4te`4*89XdW#l{2WE#h5eWbXz`Nb+R_ z7itYmdPtb4bD=iR)PbYWxZ>SOTFz^Jvz39c!JlwXOfv4&S6Zc#m2bQ=N<}cWQB`{6 z51g{PQoFxUV88(YFg##D1OtEo01*U1n)RjBAyq`mU@MpZ002Rh*!VdaeSENhVhdMD zy*EYqz7dh%)eh+Tp%kmb#bFp`pqLrc_r-_2gG;q{{<_}yquT$FAvJV_qH(0leDMP$ z5ydRKIMyqTlTgoin!w#(mh2^L8IDE8%%k~oFH!%>t)^jERp=5tVJaJSTYOB~U$8n9 zXTR{-BE{LqX5xS)BO(Q$C?{R`PAJg|Sa_^@1mY5Sm@h2K95nL5tU5EAWNdOE`7cvS zLZ~Bz);ZKq7zO&I$PS{RFxT?EeCK;2U*E{n@A$RXXNDk@ZSh*o(A~J+*f5@ zRM|%TQggC4#QRQbt0b}@m;bX9Na_b*(^PWGN?RuRr_Y#^{SZ+_G;vP)>xQ-w;s>wjPJ2oQp2?IA%)oUFl-2Kxkpp@~?7sl?N3!sx^lSSf7+IbPG-7e@vq-rg z?E$S&C(m^@4O@XsH~#i8>fN6}?vv73XrRoTS>!_8f80Q~`14rQP5;+P0Y#OC9Vx?U z6&_N*qOWf zkG9Z7vF`V?LIk_eG}e~*2!mZmv;_d4M+b$=%pApz*BIu0(*(Eyk7+)=h?M}TMLWq* zW55UM11i3o@5&j|Y2-}cigt|j@Rm_i|1Be#pzLqF^7N&3)Ntq;Ka-aw(+^B_NJ|EThrFR%x6A-&D za#&>JYQ*$m)pz(@0XNaK#rP=;zm^oBhhl!$h(I-Q3}?29zgJpMU$%}MOsIyO=M}O@ z(;zYvs(8OvGcG648kVj^u~NOJ1tAgP)CfQV_x9my^blXu9kiq{tz4TOc=)p zuPHwTp$mdbQGu>5lqgw_?Up*vv_m4f_Yt-C9Rdh~DVreS9XEJayifH61lgUm3-u@K zB&m7PBFH=0nXh5~yph{UmuEcI=6c_4ZBNB$3cm>>wgS+u^Ueu@&{=-k$w>ZV8a^vG z>-^qA#lUBh8^KY~<&>W0IB4hfz9hl>Y@zhAKhgBj@)SgOGDTpBXQ6(pzXQiUje>fF zlvz)-J)!tT^bZYee4hgq+JoOd$dL}{&szj`F}zTfMf;1?y-bHB!aSd#AV!s6RdbrW zIKa|z?EsEVt;KBzSg{STZpW$Pjt$Y7PNFB5CSM6_60Op+0qVQ@ZuO4v*q;7nT@13a zd4Z?zW&AL{8!@MLjQL4JnrkqyjQ%!5;uRC0Z_xpQ<|lBNL!{7c(WNxU!5vvpo?lOf z36c|Toq<|oq##FnF`VmmCq#=l+9oNB2vqP)sy@2mUSagt95?1@5@u>a7_xvOBfcbZ zDMPkzL0#VVVdjsIv4;Cx$zOQjONQbj6!S22Xg3;e|3P;S=s|TKqupei*ZthEc;zu44-3STW79V&p z%bd%w%O67XVR3zp-BN4_tJY9R2CF6kXL~`iYz%G}`aZ&Q?$Vvfc7x)^=7|x8OrJQb zR)3WuGSc{km=QjRjn!ld6?>#>Z$FW$tI)o-8hykx6?-Gt+l!)?t5Ea`#)5dQpIEh% zlBJ7j@;uf-DLm9@GO?rDm*3${(+BLk;J46#o2vDGH=Tz!59)vgT7DGXR`XwKD0tIy z{Xf$3@ls6)j-f?}5>ghSu%&WJcTtG0(mclg`9V1wZUhCnbaj-ZdcX(AaBj)8Iq{cQ z(qjg~9-paGe>vh*|9Z5@{w_gj()#JMmhxBysYNbJU@)8&8!yqUtj-R!ArgH_=Jy#b z7@u`2ot)dV>&}YfV6CKRh_HB2XHd`E{FJH?wq_jcz0M7yW`r3TK*%8@pZ`0;Kzz@| z;^^9bMp-K`!}j2P7&kP-!{DoKkhePYf90HcfN)1rq3cdPB1O zA?kA>MDBQKnM6(h7Y!*C|C#&g64xQl;7G~f6c1I_gL3z!NEBtaovy608Djz#gzK=b zY_pnHWgcGT43$Faq0jRyfRu<|<0WcBep~b17<=zs47;cQ6vAh94mog2Zd3O)?p_9P z?o#OOuVcS;Q*(*gXy8ckMA`?ZwgmT>lPJ-c>@vjJGAE$>x%|(1&1N=Gy0lWVISc!q)`mm)DTkq+_uM=*Pz1UGgu*y@bjQt)VAbb=s zX(XDPFuP)yCogF#_k3Xffe5{i@0ssl&K=LKCKN!HrC4l@#m%fM!-1 zS7j{KiM0W&n%S&`!CaGA!~H1bnEcR-+}dt3o!w#6aG#ie6?gjPImSafa^KQ3N8`yy zp7_tFje>F~>W%V~eW(XI3IVxM{s*R7w(l3buFOs>XJ~UX%$NU`Ya5m4BJk$(jfEJ! z%|e05Z2{+pjcl9`)OYRLH{a z5eT!&zsKf(7rG^IIYC-|G@p-e2y}~|e}ZJFeAVkMFfY2R1U)&m5mU8wvsddq68Xj+ zHD2l@fv*n9Z_xsN6;y&79K-o`o>P2duK`FVXQ=~eCR#sWYHYDwT)*^ z+?s7_rwo?j!^q3P9P@Cj^aBmt z5iPY!d?@0x*JKdtL$)Qs?b;4~JCRyV&3(PG?^dU%tk%7|&grKIpfw{bfR^OUwYy>P z8c^G4ohap|V}w*r;5hZ2G6Mwg)|ecAM*I$#odatcNImS7HOh z@hI#X>;^`5CqK!OqY&pCu#s&p+A#MA%VT^)We*d0@Ye{b7~=&5;(!Zl*2p4W`1!57 zcr>_Rv;Wa`!>V_1G+zanEO|GqUk3Qw@eIn6!0=K~2JTPB{r*U`JZLTifL{(qSn3Ub zSJLQ39qCq#dIGJ!SeKW;|D;D=f!Bzl%Z9Su#&1vzG%3a&rP6)unlVI2@DiC>(6SDf zt$#`MIvn2oiLC^{MP&F?XP2tJFWNZnEz(hto_V+boyx4R$`=Zz1HJ}+64q9K^oP!C zBbJ65RoFVpR$?dm7N45JZW5Y`Zih0gdrgWlXyBlX(K_oe<7i_r^f1=ZX<~K3!DHX@ zx_*^KQi#rov)kQr&lqZUsMLT2Ng`LD^_>3W;``g&q6zRGMu;7nC8xM4(ub~CjpuGK zkP{>6lCkKa3dB#HAoUds)(wr%mWi35FH zbeB%(*m*GIdQ;h$ zIT`)BuI$ZDlD2j*pC|Q;kMjZyXHl|%-!%vxsS9QA+0lYckjB0PH~~H#vSJ$M3a-Js z`2AR(dA``i9U5uVK+6u!o#esM1(3-C{R1{0WtY9iU@-z47wUOoJ4^DT5%gfOZeaEo*6wjYM;8T8o->E%j-;`-=!#Fwq>e& z2gSja!;^R3Oq^o!{L|RPy>jcF5F=dQO#FR%sj~%CAUUpNd)cz}he?R19!E z@Xqldzz-gN{UZTRyH1WjF500mQni{wJZWR22g-(lM8yFHg6eZ+>jm2)%DBu9h8cD|5nziEH2hQzQ78XEB@ovzRm0jS9{Y280u!6G{$oTAMZeiA0K#w$eaR zcyip-I`T=rjLr|e)+8`pQ971DBZnV`ZAEPdu&Ye~T`zxc@%OCZQ$hySXnv-)@UOa? zXe~V{K-@uzo#VxCfA>0CR;o=sK_hFzEl7^@8zA0jy9R(=nzhweOO&S|xF;PAeZyHo z?Goy?uJZs6)+-Aw01JuFH4Ke(h-t*Z*@fjYf+fcsQGi$uR!ODo4+0Z5K^(v=M-CHk z3K=z6usjp61DW_a1$x)4|1FPHgW;g@ItR3H#&{V%^XQWuGk=>udn^=%DHqzb4`*n4 z*bJ(v3R5>2Jqw-`_f*;tKmY(D$-V853dp8A1Rmquz$$<|52r25!?uC@IQOG{1G=~v z!i&X&XQ~EH>+j(qdeudlkcB(|5p1XyEQxn=;U-uuk1u)TwvE-!?zi#^WEUKzQP(0mzifoyLgYkYe1|2z+&qi9*3jdk(kxbyfo0Fv zADEgE8B-?|K%^osaG(ITdBR)#U@W!MM4=#IP@Gi9Ro$ktG_1sd0XUsbq8q@p!il=4 zQsbp1U+9AX0000u000I|A)gg8N)wm=0pU@toipsvez?rFT6qP1|5;1qoi8Oe63zfe zDlJ5d52bhGEmqhRc9J7sG2A)0AV}T*9&Sk4nSZ=hnlm5j!<*yYWiA^Emfz!I4zjtj zwGRVjk~6r1Iy$>f%G#M7Gvi?)!|u3v>M6XDN0yQs0d)qUkdn91H~q>U3PQ(Qqd66U zSq9gfuUQ1viwxbF)XEKLk0{v;cO?7q1Wez7`EGqmi8Ajl;=fnB;%|vRnSMZyO#tfd z+mTetX!}BTymkaB(f*Sk(Y@l)(8u((^JH^>3j)8bTXtq&6_fLCX(-vxE;6%f=9I9h z5I9%v&WA0^?BY&diuC_EM&+JcIXnMUD%atih^K|guGqR4B2b~& zfWjhI^qEQIr2_j`E4MT3kewj!45Q^OCAf=eQ^{Rr@?`zqP4o}@%N_Ij_}ihCwDepv zQpA}uu~Jr*r$bYlzk1Wes-%k1Y0B2e&s2rTCt1&xD@49oiUK398_|3@KZ*5+nr|@d zef!XYHp7mi=st{NemrTo5%3zFmc>{_ysoUyV@;bf7uM~kL~%oed4C)hq($ty(YMOF z2(Tq7Q25gi!;i4*`pdH&)ro{%Z#Trnp{Hj?xHXuX+ZTkfLDQ>cp>~_NZA(;vwiS5M z#lp#!JaVR|c10wX!o*$b;q`~fMfv*k*mHl17VE>lrv2SIGdOb{Y?M2l#SZuI}XtY920D7%IO!^h%7YgYOVlp z0udODBq!fU_Ulfkjp#kbqJbPYHQ;X(E2|VHzC^B^jXpdq6DI%t_l>O(zCI3Qi0ghM z@azgFcsWb|uB+0r0TzRun~lu)MujumdFgUpetZ~VVZ*Q0iQCj|t55vCFPs67=b0pW z8D@vipc}@VR)bUqkC?Q!z03fjBd@c9TlG)&B-kDmhb)p-ASp21kRTIAjnwQB7V&%Y8qWq zVMP=JsaKQ8fJpKLT`r~ZU5F_prhe36Xj-b$1TxGD&&FwO84fpQ;N3Tt;B{T}dyqlm zRTPegi{O#}9EFH+t<_z>-j0Ge4v^>?akdOXEmcB4zn57pfdqRqD?9F6dj$(!x&}Tz zuOz_BHFrzfVn0*}z4!hXNptadMui%{t>6yg)Wg1kAVpGfs-NeNG$B8w&_<3E*va&yV#N5SomlRizUkNQH4Iqi$rv>N36 z>WGxO(3WU=G`^m>F9#=Jp)~6^;A1oDF~Lk!l~arJKe`b zYF-g;aU?)_hxXQZt1t{U|Ei;QqLo8vd)s|m$fKpFSY<)TCz}PK!V-j z1NtYog5W*ZIGeFx!Sfe((W6!@p_gt^{j`LfM_4L#m*PP{>FkC?`;pvwz$aZ&w8pwS zhGggxA85*=;dV!yk%=8+JU=z#O^!m1H1P2m9@0qi<|Z@N$F%S2{8jd7M{ba|S4|mS z#iZxZ8!Ey#zW93!uCdAZD0y@=2?E(SLr~YE-XC)>Et4+gpZbEP7dC7<)snijY$6l- zP|?RdApz)WT!((!Gj;@gAsW>!k&=lTfHGWS3lL2$rOouU0dgt zE}Iu-#=NR$|92R+NZHV(n1u#3Ky$L|o{)h~ue- zVv;QbcWdb)Dzf&dl~7uBnma|sONfP5nIaJdmyJcs)F*K5I8BlpFbae(MXXMOy%v-z zAl;-Op_R49=bS)buvowWzyJUOHvykCwuyfM)hgk9R_O3Y@ZWy=Knc3a*jA-Ke*-k3 zWhHV@8^7MqbS#brrZ3C$wYX^Y$cnlKawlnk`EJ9lzf|j?7iO%(XZ-sQ;CS z&1vWuYRhy9fBJ1q5HKr|XINou1ya4fQ?SLxvBeVk*euoSiJ23te*HKnQT%Dd^xhEA zjaKxz>%>dN&eXS?n)V#@Z}RrL)C3&T;7I-y(JbVV{ZpHxdWZ*480Yw#6cfcKTM4x|Z%kN^7_bvHLE%0t&NuVs zvHA0-c_yTG!8Q`V3ZdE>f|QQ|=AjN!)?gO25R&q>3a{cKF3uN`C)3tHV{uVDx><_w zkGkiaSDYvGRjAZN1P{a7ixsNXdPBz(>xvMxz134g;@;E6P!kD|D%`vAlt`dt&s2i+V;Ke2x_SpL$74SCJp@U3629x*uV z*T~EG(OA?=EXJH`4UR|$R{*te?@kVt>h_F3c$dD~j6AzMVals)_(E}=!FHhXBtYGJ z=1fIkqqU}PP-`rbfB?pUAsdxlA(l7+i8Ugn^JoMMTTyp%Nn9nD5Qr^u zvQF!0ABU|hObgqD~_a6-uOmueFNrunHPH0+&9p>zPMeeh=Qf26Pd4d24ZQ_@(- zVXzDr37k3BECr&{^NZ9YOKlD0k_jGu$=-f761U?000wfL7O(E)FD+w z%3v#({{R3$mGv#B!AO*dKx6m&D|D_d=h`Wstb*jH;F+Dq`b505mHenQqT?tLzy^A? zpu3_9GDv=c+ePsdiZBv5l@nJ6-k_loD_nh|ae!vKOI_fwA@A}Z72BIQj1XNt1KUA( zDi>%;@LcBoIJ7k1MiHESpH@VL+ABMwKdN6n2miHB%IebTK4KaW6>yPKOzv~H#l|#_ z-pNd>2C!P76c=LbhA!QbVQuQCwe~t{bH>;N>!HY_$;V|Oc@zzPPtHlThHK3&>h5>$ z&>m=WZN*15SZXY^3TuOMj9U#g6?lC2r+B8XLtwJV$3LHA+Shw=Wi=+%W;odnt~p6* zii`i1YdPxq=0q-1|E_|jTELz62NbHMjtjLH{r?pb{&IBIA!{Y(`B9a3OuMKETzsWj zs4mdrf}0`lCwB#)Ow%Jfa?0*XB8@;8sG6yTlq@=DYeBrt)McD?>r}vBa5V2vI!r|2qdIWh^cHfAl*>zc0g{_iB|m2q zs%0?AnG$f3C59&ogG1(>Ix@8+YuQP3%oqN|PqN+rG-EgTx;9zwkKU;&ms>oynWJ9= z#WL{m(=OM-tkr0=a|VJCDDezN6Ka(gf6_N0Lp=d#8*nRUj?j;>sK;38=dtC@3qpU* zgG0G!io6_z()n@xuzilBl|!t#CoLNpij){SU4CXQRzh_w+lShyeNKFlpEd{D-tW-_ z0|~CPSJ)A#0QHxYUu=_WP|tPj;?|{GTGt|Gq9CG-Q-Fwc{}J z5_AEsATagKb1{R3+K=)8x=hFr1Op0P&2Q%t4j2FEH;*10a^GSsACTe2?oryjUmi4oI2p^A=>f3+!`0g|JO3t77 zwP0f;92C#9d-Z3bzAjSnvg5Ld%iVkbtE{1rB*IIdD!3f1R8D#rJcI|&`TDNf;CnFe z2h}fPD`w2&%t66dY$6k0S7J^sAX~#%%~ML{aV{ zdS_eqeYGzSy2d{%%sS_mPi1G2B!EvizOeg~)Ua{4;d7n#kY&0z690rYm#UCO?c4r* z!QV!l)U`l^K5c>83j=!gl`GeB0ezr<8EA#89jHK3+069$PouPu zF+d{z^GlU<;Oj;D743k^>+P{zO|kq|T*onlgk*bHR6&=gjhshAlfTjJGm+338f1?O zKTDvqtZLdlV8)9f;fMg1X6_ZVk|ed0K0eI5 zvo=2B+<9E-U0I_z>0&7bwsn?jV6RMB-`a9x5PF6?+ieQIN5j@g3huT-n5IN2383mu z&fiLfQMRQS3R)tBc?&fLinS(5&XIb%7fDqB^)0*6IsM^)nF2bs_rtKQJkC17Rm!S< zaBp=uYVelJY>dJINX9Bm!C^GILSWR^*E~#mZT^ZqqG2JENkg7W>2Jsc8{c?gF4vMF3m9ak!ZrNzR zS({DB)p+QgXyzv)Btj>LS)5ARWL7e0X?#ct!sC$^lKOR}+=hTEf_%#*S!KJj>?EFb zMG!VIkkY~hEL})gQ^=E-j-`~Zz;I~?@!8qKzYqapXhS`}K)UUcSJ;kX=iHo2+CNYx z&i(w7jstO*L2CVwpCMWtop`RB7nqxKs6imyUjYd-g{XQO^3l5g*nL^Oiyq6U;`hD4 zfq#%$_e zta*HeZam+kQ-3#3x;mzR6nq*zSHl-jRpbS^1|4!)R5Nj~c!<8-%2Hev-SeZwjQr zTXL0ygEg1_eVY(EQm^k=U{BB}BYZ$5ZJ5 zsMLNUp_pMf&L)r;0_s_{AcW;|+|>VKyS($sKpAFv5D?q;EOQp*F2Z1}&v>)Z5H)y8 zHghE?h7*3Dh=kd0D^DGx18u%`%^edo8{=>qGKM$Yn%3U9!`R{?rr~Y{SPdb83`6UI zb*`EBm7cZmL@^ORV88U;s7SJ?OLBYRN9acH4&HV5Xb;STgJnR>vI5JIi2*}0(1b`U z%5?n$3l;gceW3G-4W(}@*fVpC*`yk1mtkYJrP|)b6G$K=cxa@NgqWt&yXL`$yT;u# z!YDNijonT1UY@U!p3SK~y4IQ?TEzy}!T$(gZ+SChjR8zk~x+<5i9#2{ib5KH-{ zv`SfBkzJndmwgvHhh&~zrvv)|x$44yY^z~f9==m-1(uYJqk1XMk2<`Dwmm<6R@}#t zdcF&@DrX*w}&a z->UZI3|)5etM53v;!t!ME=;~?;-!gSqwP&E7-6~Q{%rO5c+&Ic!Kef|J5n-Hjqag% zT6Vt>(nwgP^cfWZGspvBw@Ch%NM?bMRzM1~ieM^hLG??j1YM^NaexHY&jRPb8aXVl zZ=Si+t(q%|Fo5tYmhr99Zo|91BIXMS+1Uqk3b3A{#;=P;%Q%twx$N9q*lNBgD zjzI;#!pdmH;Fd9O36eG~lM@R8+P9P5rEGNo`Ed?Fy6)}~^%}5`2{YR;B(8>bCoZVNV{Bs;|>MNT}C z22^y4KPX21Rs8^7!%rHrTQ_OS353q^($3^bzxeJ-QVB&i&KUotBk7$hy-=1CuTeXa zb&&E~ZwwV@1S+tA;AG9yHHP?ZSzZmKMb2nbQv}lgk?$=hO0vP~qTbM^4kBq#(GiM$ zGCG`7HHGd;f0}W_a}~`{hQc6b@(dJP?iw!oTFO)4tIXAD*JV~__|kLvI^3A1HJbW3 zSg=0sj!Zk1z%lqo?B9HV5NBSda#$0#+75vU_A{=ol3PZp;~a-SH;Y4KPxL^~_u=LZ z%(_)5XJP%im}`ZCuaacs!sX=hbPK72<)Av&^l}wOM%RAc2)5}D+h-0sKFVPmzD8g%K_(iLCmm zYr57{fG6fF2`{*ovQAl z7hR4roUBM^N#XnGmISL-orH|)*3Q)4kjioc5;PPJmH}Y^&F(oVxgLi2y^Ks!GM^?F zJ!Z*XPq!U=Gy#r?ZL72!3&SFNB$?P!FCI@vnT>U;0WAEVU6V>s=n`&5xb?(%2=Ewh z_oPXwHfwiHpD5foa8deM{%L1cj;&v%90Yg77vtkneLx!0XTzqs?0C2uq>w7&%NC%g zun30>JV>(L1IO6^8ECXk4sLx;^XD)o+NFq9po}y6jTf(;9(TiEs7P@?92jG3up$Hu zBg8i?Em;`Agay1FkdW;)tZ1k7OUA^311@Uo#>JPp$rohxG`(^r%+PgJjbZcIE}}Op z^A(&j7z6akB&vUJ5dx9Y)X`oO-vGOSEzudw$=PYm+hM)QzE>9O%Z@>XX6LERrTSp3 z!9tOWW(%U{!hh_QuZU=9zYI14%nAbX2)S8eaObKqP07rKTAvP5NLL1O)iWN~QVhgX zfZq}oiI`-W;(zz(sn(j6Z2$E$`?#7OGtPWtftG*q$OyY40XJM`$-yV+`<$bjDpKP$ zbWuVx$k}Z83p?B!U<)KAVX?WR)?~%{Zh!Qvw0+P(c60IW{}c)8g`%#|3Qi^ZBilrE zdZFDl2Fdp{^nk)ICamz$n$FMVfEG>fL<+bQ%3+qI;jmo$G;0Wc`jEEdS|)&QkSEKH z3gw{Eb+z7Y1uHWx5-~RN(+Xm|p5{3jqgO*x3b6cJmQ-2zKxOK6tdmVPw;-%{AHBI! zyaT^-$t!&6#uy>JG=KzWFQUrF`n~EKjrvVtbYq6+$uyw+D9PY0q^6oL^%={`Snu0+T2HsjFcOF?5$ahDRftH3ql-{Pfsyq9!Kd^1AxIXUP=zqB-h2iQGY#Sk)Tee(E*G!zPVE<;uYE4G# z8=YGRRq;1l9}Wbk7N7@M9p>(Oh=^I8mU3*c1?Dy0v z1mWRIA?~Aw+@xH=8+-v$#vQoGs)Hz+#_<4-GZdwj1zY<#T(zd_p>5`SE&re0KePI1 zI$B>BuZB%&@8AldZ@QQ;c21w6Qp5q5v?x-e8ymPN7pOOTLB@uG$EPSquxa#V!=y^A zxMS4|ycGnU+FjA1`Z_OJFPuTf<$nFkxbir6!16ES52U(}2{a3+XDYc2H?+>K0#tNn1Y}wSk!9C zxz31MhrUuJGjM8Ga00Rq7Zct;d)IANtd%m4i!Er6X@I8KsV4;b^O{88FV_iMIjXSy zeMToxy&wPmkHbk6P{n37$v%DMWin)25 zNS@@Blb)3gbblb-Sy7de0;_- zpMR}g;6^MN9!~U<-2h<` z?v`bB{{f!XDsryD82@M#i5R6r>ijE3-;s5XJXL3W#I^bF^Cuy(MpDnZ(H?TqQEf^C<43K zn}`t`MvFEYiXo#`>{JYuNi3g*ec+fO85euk)|S$$BrSxDB6B@E3i6MlKE zl~vra3)j^ut$BMX-#X;!qa7Al-jraK37HC(60kJS+^{N4B9R+FP!dx;V7&z-QbnyQ zgo_qZ$c5GZX&naQS*d3fLkvJ^sQ6t~O4W*>0`Ah+A*HsZoU!ARmO_~&DEMM+vaYqh z{>Kvhpc2?*B-$@1EEOD@E$2c)1(Hk^R8y#`v6_=ZOq7()m4}|9cyoH5i0q=8+qT{K zQf>)~?+is1Do>^|#RBtT1<+U}5RnyEM&bcz6|9r7w&6nxq9_z}hy}~mLM16i@U1Hp z!qf=YO865wE!2tke0@m300RKHzzzTa2xS4ERx(L{0pkF?Vs%f#OO5xYf*{>0DWgo+ zvpYdshd-U(}v3N2FQDq1+Z zoPUT;JWBvhK(W8QYdl1fxL#mpl<6l$Cz_*0-Ght3!4Ld&J10gEd+L6iN02v`$ zvD;dGHu&qd*M4rmoC7|@w#Q7<3I!Sn!5~51_tt8$!bjsV>wox8YOJ`z; ztrX}V=)-lP0mG~=p_M1g?~tMO;Q%qL21_WC|Fjd+Ph8SlX+H~z9>UYnjaPT0q+0Fn z4`Vg4Q?u)F1mIK$5%Vc>6@IE^3por0DFq$0Z4!f0mtGyEDQS6FDW5%bzN=z)+$!^g zPw#y&tgE#927$Pdonh>CMLezEH3J>N>0Gu)A4JV#b!I_ltSCR(XG7Rgid@jMJ)OQ~zXNl3acQGEVL4(T)l!yiGA82dSuVzDs+~!;%T!A?x<_w3zZ(qL~G@ zUP;O`8tL+{utU1mmQ266I{6>Ed7a&s<`gMuuUqM-aQR_J{$if_2Qw(`p&n>&lY#6tM z)}7RznbxmM*+<# z%PvRN=Jkw&W&OyV(`Te-b>ELaw`XL{k662@J~K~1(-tr3x9@|~yIC$yesj2?WP$43(~vbR*stsuhYC^ikEOjm%g+g% z%%X}Gfro6!Ixl#mrmA4|5_wSB38!(LULk+*iAcj{7*55gsHp&{lz?B#1g+!p_U_K{ zPyt9}ys4&zc*LU|GHs|-ycN5hEAR7bt zf+>KXw<#T{=Ain3-I7zmBu{8+{!<=cVbh{aeY)VbDx+~?M|oeGlIZD^p39ETK2tn? zL#N`!P_d#o?Ih@?f{Y<5R=o3*HduMc#grlS)K%XuJcH{jeO!(jPrz=-%9BYongDhJ z%AnTgej{${t#62&Hs3gc#o;L>D}lMZ%$&2^3I$>FewEGCfXgiN14bK_BKc#pMbX4G zp~^IvL=E97kt>rcdA;GJP4Pz{irF-r*fB*e4Jei+2m}CJO#^})NI?a4cbe>Z2`C@s z&3_s0vk8ItTg0inQw@wc#n_8IyIzD%?h1YX?a%Eau2T{(Ap<7eI3&lJM+0AAHZAsC z7iY^jUmfrd=*K4Nif3}a7fLYWbQ6|!+_jOy^%c`^_PNqUiN`W@TG7i6HtR`SO?7Qn zApvr!YYhT4z4K^QkG8P=sQ(n(ZTSrcT>LL&cKDJ1Ryr&`l_D4iqf0n{W<=C-&XW64Kghob}_k&Rm1n*gY>y|9-X? zazd3=SYs!ZTW)f6R{BwUjN@=FazGX2Xmc{+r)`vrF1$9}q2ch|L?s~qdF8Dvx5SJ_ zVZXOUBU1A2`>G}yBS9TODw6goh8uYN%9ycAc2at3t&XVw#ir0DP7I;R;usEX z=kv@H4~z~%X4>GaU(#fNQff441C+^=o%uoQWsGtlDkAaj4ALF%Nrxe_o+}jcp8;(a z$|me#xHZr4Wtj~{?A3PpXJr^$s1;Xg2^iBi?J;H&`xEa^Zt?N01*Lg0S|3LRYp%x{RAxIMjaLp@$DlLRssG)S<4a3XIltKlQ?MZ zr`Q41TzT+6Z7w{fW^#t(Cb_zJfIZ;Ld*SCUt5wyezV4)bv0XfAAq%IwscFMgtA+W0 zS5LPtZ$FBKYG-ltg&POitXa1O!7iqR0|Qvryo1^ikdhMb_`_u{G?qVkidWIRM_S0| z!kfrz4~ucX_j`8{i~<3F4`k7T=+2y*MtekO=Ck`fu^MT$6m27*!g^ANGPFfmX``A# z2CXAY8@FI$*io8S-T`l?H*@KNhjs;|&G^AE$ z$K$DitX7lcTOhwm z%8ePhn9;istwtGSGUjk-QA4Gxk1)D&q1zFV2w7CPEwt>2>S&QF|2!$K(&Y>zKE?<$ zfdx}Z^UHwf|AuLjO2C+%4(vTVm@qTfuY(DQcSsj6ul1|g<4nebs(SQEX3_0f*ff(~ zmlkRa8%Bd(w(S^#iKf3CEj&N~d@CTS!#Ph$1-}A|DR+wvsjnH6H}1uZ90Ga6q!@Z% z9F|FynnZzAg33Yp5!UDrPQYw!-H>&8i4BWUiHS5aJ{_p{a%I9Yj@4#h{L5;`X zAL!CYNHBb_U7&HB}?;~!(pYcvL3aVTq;CIk1g9&UK|^f2pBEp6Zdf|t|+g4&A{IC=xFB{pD)}v zg$jd(*2>tU&Rd>*a!2UY^O>GT92QtepV9*G_1^gNZ^!kp`#;@{HQ(Q6vZSS8d{( zs`uQKKe`oXKN$X9&m0%5V;H&!)x2A`8c#M|Ht@st>kZu#?cbpeg#zfcZ!m2HOH|Lp zfjy)FU>Xa^CS|#5Cn!WNJW{WRa`t`0@kXORBfJ<5`#wNpgAhOcMR`@{QHo<5X9q!? z%1N6Ouk?1F3q}>rmC*KjX$H=-B9DFI&(#N=xB+FleWz>0a+^JaQAicwND|cwG_D)b7=jCH9fbtPLN7gHao~bxWL=k6%lLz z7`GP>i#nl#pBZ}eo4bSV&Kn0hE%)96XYXJIek4TS?GrO)X_7R3uQIIikd4Q>m zLWFM0=fR#DVeHn+7S`UL^RpZsbXDE{{$ZXDVWS5rl1|}MQ@KvPYHYaOa5j_v~wF%nG`mP zeZUF@-J7&QrT%P6pNkCU$P!wRa^PA)?)OhLa`CEAYX%sm9?&zsfh6P)SZJ~D$YTEo zjqw$F+~-hR7DAE9kk#x7E>-Cf!1j}f>zJLfCKZZVsa%$juN@MD-K|DQig0BbQ(&_0%)I}6os3E}P zV?HG+6ndWTLfsXQzzRT}=Q=lmFP*5XrkxF>{fm&f8v}I2ZH2@nGevec&v{vUw1?EA z1CeTT>?kXqm5<$|bd_&E-;!vX2YC6+Vu69?( zM+tDX$Ejb&BIMTu_)*|!K)=1oLfo`(5DBxErM=k_tyhSVXC*(}I~6 z;l&`g{y`ix`91_<>bfXKRmCj6GaBa=^@Jr1X!k7}RxzyzQApa2HQH=@ZsrKwC1!f4 z`|b=W;5U@v42j<_Dn@_Tt~YtwKH;Qsycdh}0wwmq54xl}R00JHLROU<48Cd;0qFAFA71h<=2kANXLIylmgM9NC z1TpctM?1K`?K)QGbN;E-5mJw0Cjz#wFAwU$hL1@qt7J@y~s1P&P3qZVS@ zLeyW3Jmuo)udWW6BCrpf&Ps1a^*9-2%!;>$PTx;NYX}Lm<+u-Ro)19`FN?15MH;?9 zQ~lOUW=&QbX|U>BaJpMm+W~^=z1N}u|A71{dD!!@7BS(kkA^G)HsEjmxqc~Tc7=dD zgEzVBy&=9_+jLs^Fb~4QzGuOh3RkGKE0pg!q_{WZNIkRFYPpf$q_be4BQdM{kRSmN zM&N;GA^H~C`+rrRlm09gFmktaHj(KYCh3R1X#@OI96=qFs@71QYn3?>D3H}4QHTCc z#?+)LrGah*WH4VvJ*V$p_+vmU>rs4OhM?^)1BG6%?%-7#WVUG3WSoQ*ZC4pS+|HwC zHf=5A?Uoy9#vIj#FXh?}FS!-A+3jk>u$Q{OdN2U{S;lE1Abj(bU?=>!UtxpFHjTcf z7fxuS>h%EvSd^@Rmwm@L7x&Qd#0uuqG>lmIya>8yY<&rt1~ivEyKjvh&J8BCZL|Ox zgA2M%voBVMLDlO{P@Aa(0m=dx$EZTbkVl0RF;U6Cs|sa=7B%!JAFJ%%X)5*!eqqg4 z`l4h#fQEMQLV_B+GX3w#RBtLB5q!CSo|=Ee=WY6kWWx2Uase^9j z4=`me!W9Nux=CFJc$HwgmOJ^+8D>zc`dachd1XK-93h6oJ~ zH~m~JNTI3~kBJMAN3xipq|(*M#jB<#v&tW9wnHt@W(5J|2^SFO+jKC`rR)vBbXb#| z5)VhfacR%cD%{x%1ScV^KtAh^rR#NoDDqP*2;KdGzP&1~Ukthunsm5sU=FP*EkO(y zD-AzBoy~(9{InsozuYMHT`;E3L>Bo2`}=o;BGX^jE$zVXPyAkDoEr z*&wBZ?>%%F6wPp$DiR6I`JJ({-DqYh$bVyV2*+sweT~6^C?<367w`$<)B7Bh-lsz{*n;xse&Iux-~$Z^bI1pCj0JaP`hL1&{*w`)1$ zq%d4vCzYqi%dm)7ujpel)s%O$QO=TVn09DuS%MreaWla7Ns_`q9_)sq9f-UHw${^r zw2UY`Fy1O`_NylO!Z7Vy_y!nJg+wx38=m_z&&{e2R<@?;Qz3j&wpdJvNUtF# z>+`VVeg!4|zC?0XmxDXesIE0euaq(sOQ_}UiM!&5|ROYfRV~zw51xWR4f+$j&kE{(aQn7raW>;NC0pD~! z`s}Q1dcr%+$mKb%u36SGG$)ss#Meq9zTHLzC270T=yeRs!pZNA04EKInSRiQmz z+Z@;_yQSF{)#0&UTx?qMJ@Wp9kbV6s@_rrPLPV#hE}^6RFmJi>x6Cfa1v{?mlkK?El9M6Ag3$q90b@ zGdA5QH^$cOQaug7)3TR8D&!;;y$9m*r;mqWtMAj5X3z54 z^xYU0{%b@4UwQoL8&#CUJcj?`IYemS*z2Q|<^b-7~VpI?Ru}9 zYM<48PpH7_6=wQ7y#|}RosJ^dA82*a%vxNtj6xt@B}+6IYKQu^+Dj+czRMn>pQUvc z7FuH|n6FQbz819}y$!EAEEw@3J!{i}IIn6ex&B6GkB7I15DUC{ICA zGlc`yrUmUCr-%0Bgfu-~YcITuxiLo~)uKSY0gy=FI|q3=6yKwiObkKG=BPi?OBu@N z?Q?;dj%R4d|u$v$n5dZ)J zRRN!OGD&{{QPmldeIepR z@>=oXaKRSbdV7Qbg(T0YHSFL-i%uzettNR=yvrt8*{}t&81a7O4C%nVPHAMEMD^Q= zu>($kEE&Iky)K8KNQ08yRn+I~5x7iY2cQ!P0ho&*^#5_) zb-xBVveWV6HBy#EpJ9=JK6f?^rs?CbYG2$Re{eh%wsm`8Jf$*yk3X5le?co}A1IS? zSonK%(v3NF3&u9c^cvZ(SV$TErI6!A$H!AOy<({-V*qy|jCF-!TNdK7psSbT?t*RyP)zezxM5^FyJcQkKsERSL`8uS;JV0U zM(Oxt%BitshlbI(9-!M7pA=A^=jNVq{Ok9de2Ez8K*Jk;!lu=ovun{|k9-6a@5Rio z&z2u_>jXVg{ds+Kdg-dCk56$By(^!U8^dF7<0+HrI+1K3=rfEoV$6q3LmyN)-nq@R zwE})m4SSr#p0MwyL`oR}8-)t@KWwX#O|z&#EGtBLE&|A7(yByD4z7^7kq5OaL116= zz%b}$dD-+hU8?^ux$2UL3A_vXHI!vw8Sx<+)jg65#v_eDX0wS_%ByHtOS?=iu6N3MzUUAWbUZ;h|_Ra52haIIMln#Nl3}$&}b~3UGEJrMoAUl zMUx;=2=6W@GzmyT*BT~>EKpHm$@CLYy2zPql)w}dz6gX6E*Anuu(#(=3uKMY93mK5*Ozw1R6zeHOat)of%BD0ZAyR7DiSRp?qLg(3JoSt2x~Pa->Wk z7Fsa6TXcjGC>5*xa6XJ!0Khl^02ymRn|PiO>ZqAa0YWnW0056?i#-+?$hb58K}j$? zYZck9LkrP>bw~h?9OHFS<=yy#r#X(`5E!^h0Q^V(z{lrly*Z!#kTuNBwVFHQ9M9k) z%g(l*%wI?3g-gf20@&TawPXdKy`{|_YZmD)7w`ZX%kgO9B&kibIMlBll*dy(e2&Fm zeIe-|Dg2$UPv4!&F^V>tk^y;I&;gpCsFf?fYpP@S~5Ia&x|VaQ^bf-KK};XkI* zF#>Wlc=Y4~KLjxl=U-fMeY}uNd9-sfEhcvA8WKFeU+R+Uu+$;~HQ$0p2Si{#>wQWH zF_Fm>N<(TTB+E*lN5o;Veo~Y%&t=&aLhr^-*n-^xqVdjgq{*Tg5Wi6OXOA6pws>|Y ziEX^>hBQBxxL`C`C%&NarF6v3f{6ivnz_EL&x|vNDtjHyWG!B#seYkOBN<-R7yO90 z5Q*^%qYwdPh7WQosc4Hj{oBafM%;9Jv=o}2(Ei#q<^7EAfxQRnsHfQMv>RiZgW@+_ z2W#pGd3cAvyd$3*lVxC&@L=)+DjGLkcJNl}F=!i(pmACi0UMIjR7)dVRCl7vuNeK5 zTaPZARsL7Us=F~@ctotyv6IS?B?gOhlLo;|*2-0$H%qnBzaeO+DM1LeVd8(*f;k89 zpnti$5VA(ZkytO$U@qqUZC;hP&l7CRMb`8;8YYlNIy`^0!21Dy8tQjsUebNOKHuTG zp#9QhcQ?FS+!&*gTQrU$X0&Iaf*Yex3Q^x9$S* zJoX1loI%RblkdSbi#-Ph@2L&oOb_##|22>wtiG+09w7!zfmOzb_G8dh&s&3(74>tD zTk3|_-`kYaZ%H@F2c)`c|5IxR@9kg*UKmsr;{@4?+vyIpfI zp55A)ASMK3%!xTkR8&6gjFd?jJNT1^4{gH7r~_xE(=KJj=B zH~0b35vRS>PwMr9(ejI3zzUMM^_u7F=C=x!^h&BYH~cY>2##ul^@+Uu(ZhiwUelbO zGneGe_N5T6IO*;Edgx>&WB;xsp&OMf3F+=qd|{gKUn<2Va<;FL#=;+ zHm3v`z`F;b;Yw+Y-ndK_|Fg_{yvlY%nQnC@yk#4eoB6RGHo)sM;ITk9zAlPeR%|zn z4w$yp`@8?wy%VkDx~Ild2_HQSBiUVYp@pzM&VxwUa91~RZ0KV?a;YGW`KG{Tt`_hS zp!yrxb?`|QlFV~fM^A%?rm^rvID&yT53JZ$f}0L|J8W);7kQdu$Oz>>eFALfh<`PM zRO*>v?F-)sDg_w163Rsvk}H#-UTRIdkL9Ytmh6?EpLmn4h*7L{R2P4qZ)}2zU`MN% z>u0F&#_e?92X{O|Z-{NJ>?SHEUFdrgW6s6g&Tm5Y)+#lp zf^IS##<8s>$3dTo&ub1qHuT@&I!tGQ@a3#2Yv=)Dhm;ZzP+Xq!bskA%Xs?%4(>yB-w9FQc2b z0S?j$m1z*-xfBMiOp!8>BZ5nOqYc*P$!hC2@9I(TfR@}^2a0_{`3S^D9(Cdu?bYl+ zYa&7`6lyifg->57V@4locAL^epqUk7ElkaT5MN);VVWgo%o4ck(oWhxPL`bX_;O#8 z<^z$V0_zx@N!7ltKrExZl2@pc&%bq{QpSmXR*{kWPKSWjHvq_^LMfo&p&$cx#S`%3 zptjx|p>K_omjg3ua_mN6skw(bHt(~|oO>8B54>d)g6e(-WglVnx4RV&kfnQKW`{XF zP{<))DTae-lEyRmcw=#-aqYH4YQd<2n9Zi7b_Y~cH^c6{X@sDOATSHfP-|DH(EA{)Vbi?(-P1=c05Du)zGskb?2JP{%z1G*wrWIJQ zA^+ykq^7x-4-(ht5<7xaL-)M@Il+j^JqsWvxq6Q`IS6bf(A94z@LS4FZ<9Kq@w~3_ z>l7^%&AM*uYJUUQ^`ErL<*w7$EV;O69QF;Of4(P->yjw*r_j z>PdOScomfmLUuwkYB5U_B1$qN_{>(C=aqK*NINlj-@&S4$dqjd(_hGtjw!Ss$P-cR zS;Pkk2S}A85D~-qAtKIMp7CXu6hY4>MzJ33nGm$IzP$(V!yD7IIj=xrmZW}s>5>Pp z%Rv*7RC6Chu=c$xV@%fU9kZ6-#^+2$pJ-epURIkD92@9k-5I$qf4d0XkRtC>kl*S$Usm->~w2jE|-xnmn2urK3s&IFaHrG8DqM z476R6h2Xu!`l_kdlDl3QCW7-u3wFmt1wakUUi+*gq=$D2JR$%XMMR{jvmz!v#3!t@i=i>keJ&;jB}UvdO<9Ss+g6 zwVZ%UDlQG8+Iung8o^Fab0G!V`v{TA9m4VS?DNs_-Q=;{=WMdWy*Qwsc@o>D{Y1BT z!9NSTW9(8&NZa%La9$Gt`lN8cdXC#CeqZ3XG^XT_#P-Y6H>_qYXDP(XDe_cvp=!Tevcs{gL=%r`nVH!~3P z5tTY3|NLnniXo)!-$BS$|CsK%)+ERHm&%j89NldU_1))9u8Y2N3zAx=t!n?|4nz9t z!61X^ZGVbn!EE<4w==seU$L&#uqfrW?{zkD>ugA8G(C&kF2cO)e-~ZPjfw zzbJzSg-ENe{UNX!g16gL*dqOh73rO%9Xl}M3Kt3q#6`*Btx-PKj^1IQ=*@J=OY%`$ z5I7V3Q$6{?dsK7aHcaU|(i6J$nETI{ykF{bHl>%N?#)lc_XRHmYLCR8CJkl{ID0ng zOJYjXa1S5MCD21^BW;!G$$m?NZrmC68+=o#x^i?#F2`?k}v%LNlS6k!O8)jr||6*pYZ{-166J2h;* zeI$TGaV$z=lYxA6k>M^??d4V!iVW443Bl|?7E5kill%-^nfii>&wwTl3pId2EobsJl~CmW8Kk`Hg&V_S`3i%kF9HX~nvADtNOb zfK=A@Wit0XNiq+9PIbK?v4xaZGoThT27o?d$kq+`xvMHTJ-%}hl`LZzERDkMwm%K8 z1hOgqo>;)X6E{%oFI*p%O^6xyOt#|zX`yCH%cSd=&8R3f&>Y$ zEhJS~VNi@#$0e70z1l=7N&@NqkEDt@DRAL<9uEhyGAsFMxRxEXu-kHeDe#{$q$beEI{8XjA$F(-l$+{#OWu4hl&xZ_KY zloX6rhu!hH#^!HP@(jVEm1;a9rJdR;{v;w<*mmD1`YHfbxiKjU4u93E@PL9K6CMe> zv9V;$zMQdQ*oPj`fCrn9GCt^x1M9ZPL$e?Op>5lgS@~%w!pJIVG6$*3Wwl#`V5jZ+ zjbPPfyj__6t#^!@?UT~mHn(%4+e4NqcDkey_eCH%dK&=?f?!^JT*%j?4(@ThGW}iv zJ4{=+okp)#sivw1B6iyC`jNi}*HSY#Boe(NLMl%qm!%>{vl@*))V)-!Y#nUcNkI4c znL$WUKn1Fp%PWrs1LGE31luZy^B-UYpo!rdA90rv9qQ^V&*x-+i~rwM)kmqiAnT;G z7{NuS^iabL(u-rq+c4Kd1FH!+1?JM9 zX|Iii_TIcc8)XUhSk}>>2r;#bZyk+}*ho&IgNhtkC&pEqd z7VDyrFvIrM+V>pmwTR&S9;IfdV#w}uL#=&wYmWEbqbjGS#<~L+MM-o%BbhPOpBwgp z9c9NTUU6;%SsE1jiM3?IRV2vR>@75*$BME$Io>s_ifW))+y)vx-7z1I_GmLr*rJUI z2|5b9OPdgIF%BUe!$&QY63E~@df1^WbbAPiV>MjdI_xgWV|pJEMrjsO4|obiO0IUu z5S}7N`D~YOHX-suw!-`-Z2bp-%(u-(iOJ^M$is(e#c}u_$qku4TLSTBo=Pnyjn(5h zgzjRK>!g^a?xBV2>g6n*ek4tA%KkD|G@a(jxRW;2S2M9A;iu^j<-M=21W- zV~FDOq{p4i9K`pUWw*ahmWi=xT<(vVC@gSwR)_g(PXYz7eFzl7oZQx)KOMF*p#1`2okl6_vu8Y0bRe2H89(=9pmLuCM8j}fUT)v`VT5X zX!b+T@FG8lsA%C^7-=PQfkEQ7&@YZNkuI(T2Kq{X7lp+GN_)~6^diR(wAo|dRQycX zuh$7^nssRW>*IseXYx{H<#6acB0Hj+>#JmQUS^{x*gc1PNLG5#>u^Jbhh5xST8)4JNJGq$if$lK6S- zUd7YmwJRPqnjrDF6T%Co>Fv;U0qZGPxGIE(?G&9TyH7lGh@Bb6!J#XUjRqWFNWc1w|cxQ-Id3PnLE z1x)Bk)76H@SL{_vIU&1%=mU|=+sYw0WvK&Uz?(qTpNOyaF7Ac++`zwH4<+kL+%dSc zq99ig13{-wtjK%L8 zXEoTEjk4J;@y3~aQ~n61M{SM~N8nMZ9d;3Fjp2iE3e{LNjU%HZGYPc_AC@`@em1W4 z2U6=5QW$RNvpV&XZWU~2q5RA_p?Mt+*fn2Pcv^8(kW}o#2tJ2dZ9~cOT_*LhK?#9J zeom{DAFcDx;d7(xcZ+*+qS_R#C?O2O=~vJcrww_t4-+{5n)azV%+ISWc^>6nS5cp^ z(eir3o_UqX3W}3iHBY6!C%fXwoO9P1lBq54USGK_UAX{BTaT_xa2y>@vpTSQlFg!R zu<*C<0D}*k)~>6dz=kSBwUrAx;kJ}cy~_#jM0SfdI#Cp| zu_s-BJpoV>!#H`+XUjAfEj3t5xB||HME1f%E+(qec-O6}5{A~lJzuGKU~yR%lbaAu z)I$nQqB+tXT9N=;G&U{%mlPBsAS+Tog})SYaG`1xr$OfAw(C=lkQe%O>%PH;eoi+9 zQC_(9u(XilgD;#kr6r{$2>=F&<^cvQsYzGAejeJbV3p!3YD|}BRk^0N0jm{O;&0&RR1>o)H=H?evSms{FFuYBfcTvu(iLVdk~5niw?&2(BX%ij@wGlYZ?iCrO(q_pWS9~95E+Np zX6-KKDIn8PDB21irz+_V$nZICFsbk@UJNR=E5H!ikln67CSZGa8c;)u@i+LT+vJqJ z;$XrOChs{8p@M^3@x~jqY+84jG_YYRwfYSk$THNkl%k8Y55kU_&=%=|`2~rThSuS@ zSvJ;HD0#4V>0J%uPTk^|Rfb~@;jFu-j}fs+A*^+`8zQJ9ivNrGzCO=q2ojy!qUN~- zjYNj6l;{c_#A-f5gfq}n%{z3`K-+a~y@-F*8+N%3Xh)VV1>jyVH;u28((}RfLmN`= zuwtB;=ya?3Q;!htbZXzcGmc;Gvv7gg$qn`LYPsyG7L>0A#PUhHd-A#VxZs48`jD4dtb572Hgp z^jaz$XF-|^{Jy++H30O4%oqXgy$Fvf+F5WQcA(X}Yt5>im2~Ba9VqL(#s~cHEqcA1 zMeq~n)Xr-M#Or8SwWB9p;U&(ulh=(Z4O@FTKG$OnC~bSN_ROXn$=Uynp)Q;$OvVCR zzu@`>s!3NL@v|NfpWG<6NeG-PyGM~o>dFUTh!thIh2sMN%WSmX9Jm!dhdM`$ibhcU zyiK;<`2kd2Vo$Ec$L|5rk1}r22U0%2lk6jtCAER`?>05ZDj3d$_t;p3{7OF9s87w- zKY*@$z84jb6={5z(ALr}%s1AETeKeF2l~9cc_)@XMMNM@mD{Z=hg&SBmS!eXAb63= zk@n;@_8(cs<8M2ZUOr9{hIImYVeRCzEmWWMSp>6vv;;EvmOKNOOpw5Za1fE!^ZSo! zzlapPfoiq*V#%@t2w_5l9`w5L_9vLG<(+QhhB;I-`dK?P503lG{!&VEwB!C;{cS6$ zH8y{E#JmB9ZM*uFn?p*Guor4_zzR{otcgqb)(>~3ot^;V;2=?PpBM5>o(rqI=hkY; zkBE)==q0Z&zD=q~ow_%sr3AUy;%66O>ut^|^`BI};%q)g7UfMj3!C03a^cZkHDj8s*+E z$(eD*W-YotQF1CmifBEwW}9l=K`Em|mg>G~@h~`YQx{mO<(e)o$96eX;_ze?D|-}* zX4O(0U|Qu09oLY|2u`V8de|-?G6ipHGK5NzO<5>J6qE`#ipqh8DuRT_ML}gXB^)#a zPW7q1SO`I+y<0@N0uTy1Up)KVo{H0%HzqtvNjl>nbLa|3{jJ0kNt5`Olk{D4p{R=S zAWM4;7PU&nx(WY;YeKurDn*>E#0gzgvvwC)H&gUD^t%X}0F8#~T>`hV8390~BoYHl zz43<`D5xY3a*|t)aT@f6(Il8TpI`zY05|{u41NKhm@-L!0wuwhgd;fTw&%9r<-`ZK z3_^1S(xTp~)LvX}UHc$W-6N&7`KWJ>|J3{I4a;puA=L352SewV5WQe?mD_`jF$6Bno5&b~ki9PagY*syG%5_%IJM5bEym*d3KzGFOk$Nc> ziGfYcjm05W4{xy2(Fe9C-NFsDKO~6fW$gJ3Z6DpbG0EO>POM1@k-a{SB*k86hluIl z!#Az=$-dF-r&1TCQVb4_xgxi+mrQ(AgOJ6~Uh6J~td_Et@RBnJiA#ADg_;v@0INuP zTVkUV-%x=+uPFkU)&GO8Q%O7xaY;JAd4#gfL!HnlO$YhB@R;TwAP8#h0hY5_GrO5^ zMuu>y2wwlIF^uUM=7LhaHy#;jb6ymCS2PDMw*)i73A;C*@7xRe&mN*%$VA84+`(d= zIZLJCr;-rd``Zw~A^LoWh1sOJU*F)*h9KOcz}_MRc9rHHv8f_ULg_%W&a0`0TIgZd zp`*#~>pHyqH_t3HAt=Mo?gAl(>Q@`9-gM_QwFp)HT=QaOt7KhEkL+BQtVZ}z!6%8i^ z$FM6&%06k^37b=(S_p3YB;H%O)?6xCz6g%YqX9v(2R1(Kh4X%&I9ozAQJOE|{91b7mg64h zpf(cDMBwJn4Ej?-#Mh;cbGYg++7n3-BC3&!3oX%hyJAuXh=3j$tx)N^eX*9x!)5D$ z>91Rq>N|R!B%!O2}s9UGG&yEyLWh zdgnKOy)EKacfQ1(-~1o|r6?x2fnCpA+rwSTs3`zCUY3p}fUjedR-!nL%=C#vpuFU? zum86fV(XR%ScZYj`WHBuozoy?^JosB6~*e?wZ6014St^6?`>!qc#7!nU*t+i7~u51 z=WC5(p!i0#iwDzJGlw3mxmN9cE=KEoO$fuBSA3|Ug@=4x$(+Mg%$96*WkDMei*l1p zgv6ky&h!e0Bo^?zT^95p_aM@mAPRtS{NBY_#QO-G^NRA-<^K-Oq+%O79{&<`U|bW= zFCs8|+AtYuowx~18BLZ3{1rzye-|RR)c*5ps0#C~T2kMbSxckuB}$zrT}3LbFwE%l z+~UH62yRsHS8Q6HQn&f1c6N9x^T{jhWjqQKcviPEvwA_+oNlJ<-ZqXYg2U@w4@1hu$MBMdI0jAzBdYkzFI~5oWbVQBPmiDUP=W?1Ns}oupK0$# zx({MRGaUK}u+s<#eAp_`CEmG2K}yH?G;3|{4l8(6DTw*}Xw?&~3QT|v-*mhq9DO7P=2$w-PIx1oty;(|l_QM z3V_Go=Q`iAiy>kJ#bKBF@`OPJYl2g(=47;Q6%;qL&`iF zSE=zwrmouWDUK?GuNDnq4o?Hf8*DoTer2di{O9bo#up!JsOr#|v|TZ<_ub@l=p>H` zM%y48<=}T$B<}N`10l=h&o#f;{l&>v)M4*R?)h`?JmeC6QmYrjOxnD$QCR}dNPCXe z-0&pa^gAKLQX6zaR4-da7apj_fQhF6*OXpRa_5)FK+C?{Wqm((?Q6i`W&Ki#MigW) zjHwepvlPYx0L*fOJ-N-rU+Si`tGzv1M6{5Wyz8PKNA6ON8J$fJ{Zrvw_i36S;QGVGU{1&X=kbiZh+w(PR2$azGW*`g z=EX~{QK`+K5zw1XfmJd7sx^eId^^tWJAVAso(GEoMgLVP~sbX+T|qc~)B zN$$&N-dfAIIgiLOLCgb0!O?TDA`o+_xtQ>AqpL_&1#$0LGZ%?}LwE4{=u#gMR2q>$ z7st=)*nv>cLzk`528A49hBA$4VDOtMPUP!@G-GcAaC1-GMmWYJpxZx&mL7H+V*9_o zc5S0f^nPkL8CDBer5N*uM}R}J4ue}|bp1};+aAcC8eWxr`xq!2p$MYiZrfse>M2&I z{z0FlO!j+!2g~neyL~RCDaH*Wl^xz+EPa~0PHJcRB=bMa?=I92DM&Fq5g-3`(b!}M zBuBJZ5z&|s5jC+tUYN}t@F`1@ct~EOCNS;jX|Fl~GCh!WSlCam7p7LFfZQ_9LH=p= zm|c#iF1r$X4j=0QNH4fA)#0Rh^KZ_^+`$-g3Pa^Eg9^Ru96Ns!7J0kg$^pB4Q;i&p`9U5 zRmL!tV1To_CVm)G0~@eYS*v_ z|4qkAcH*Z3f0MUKXEk(zcB}4AHp_RbDt*OQ8v_;o-D5^8;n?TnSA=D-i|YnjJ5u*h ziz9C;C={01+=CW|>r7S1{xbtzGsBJxCi;5L$@aPaTt(qx*qIyxn1dOL8yLPe66y?S znf3Q=q}!D#2ss@m261%tz*V+2@lL*7F`?n|Qc+&DxLpr#DP4{QJyidS`psYMFY~z; zQ;-D1E9;Jy$({)3pg6as2aoDVmr}FhQ0_ERf^)heIh&T@L3}QZ%I1$f{S|? z(NEhrOJABYIDEi!HA}3kn%G8%GXiEBe!oO#h`v4XShk6lo$6DnZ}p zp9Q!IEWcaKhUD30<2f4m*p=bC)RSIE#%Ig^a5LydRppu3cae;+c*9Vt*=IlGZ1pRw zW-A4vBl`MQsDT1ZnP6T0%jb|Sm)Jy)!(SD+MSyGKgR0cwnO+*Y(X&q zBL~MEaX^txR;`ss^KZYUG9jg!?)KxX&L7Ouq*}~Y0t|tQ)N->AZj>QR4hmnfwWGcn zM8~2{lfq+e~E^*U( zh}>52JlG@MHJmU7pccwzq`Vv>o-&+xUr9 z-dW{L=e9$Lrs|4FbG>qINttQ8jJc_a&0P^bNbEM*#FL~#D+pc%YC$AIw^%St6cCMq zRf?dX#E@u^2$EO57h${x3Ag|Nm7{?nNoQpdMxX^a6-cm73yZlgQh*!VfBv%|@y?Q@ z7@8DT)f)U7ohsnbG7+uLZ)xPN42MyrfKBIT-ZZN;Y{*K>!J5%x2V*+xUXR@+l~}5? zS^`jrfiW)2fLsU_y+Eh0$ap{yEY(D(I?nJ&e4tlC2#-vL4tO6% zEjKTQ1AqVk9qmDznVt~(qGd1zA1?p^#NQqORav3jvcBK(K5{IQV8)u4Lza#OwfUZ@ z6j2VbFJG4J@m-x`1XjTh=jxyBj zd2pjK7kWmR_f7ULSz<8?ovCC)9M@&V_OIKW&H_uxR0T7N;ixeO-QuJp_DutxDW20^ zqs0m$1XBfHjT1X>fvj-F^3ZK}F?!YGdzJWtP}W57GL0F<4Uf*dK!9Mu{s6*x5VuGs zU_!d1tO!KS@$NWKQeY2lRGT$Th+By}zpxa1P&>Zl+4~P&7vkQ;q@obCgKWW$>2Kbq zJvH70`Bg}{OE)BX3QO?fTN1j>j6K9H@*prpR>zRH<7t21LL0W(iv2jlB{W znc8yajehbE=8gqZv%s&x4EsxNwbp@11*SL zdD;YOXFJ1z&BWP>pSMM<{3yEqW z!rBHM$|OvAN5Ac{RJgb<}^C!z$z%JG3lYF%yq&?^p82eKQ){cQ$mf>%__ z;?T=flicE=aAt~u_h+OSV;vCCJ!W@pteiOU&Q&oc*F~TQLRXcdN`q{ccBI9YlP=k4 z_S-96PAKUDebOar$Bzd!!!)rfoL`e^-@vWA|KdYwRlxRR&FslXK3eL9AOSVBa*zBt z4D{EQ)#Ozr+l|Jvba8@{1fUlgK8hHErlL zb2Q&Q_7HkVySj#P_n%T^(J>MDT$*0jjZb7(0|LK+s&z{?zCLe|pRv0`Z6F{^7SgEv zZ>Iw_K>^THYhw@qPnBl)v-BnwFKYBcN`-~$L$H|cy-wS*CA zveGmlu4gbRkWwV6bE67LjDDc!5*z;sM)D61pn!zoRsYKxhOVx1$>2?>q$zFpbz(?5 z>1%A<^&7J{v4$l;Sl`Tlb@^7?mg;VrQ;kKx`aRi3%H$632NS{8tdWh^V5N!0if02A z9D)+_=>qGM>*s8V&O|JV#ZOz@36fkRPS~DzSlR3*n^L2J6?B63X@!}4*Cu?wPmdf_ zCPT(EG$#;8k$+y|ngiGDo;t$f0~Mtq4Qg*cJTsyQ-wtq7J5MRDS6l??GIoaTds4AxPdnK72M_xsp)h5gM6ZDuL8KJOX$qwZ+5AO6(izf}9~ z{mPa}h_wA^czq2-;!^5T>-UpS_iODdNJf%S;uwFrxY1pRjH%FTo+NuCKi$)2?+zyF z_E2g6Q7x?dz8Yr0I*pFnm%;7=@EgxqE7LU2T!H1Z8YHqS`!{*ja)zLrOBWeUTGK=0 z?aTE@i4J(=#ZE?sJ0guL&fXBvm^M0EX~rzFr3c+j9hdM0kL?xt$!b zeCV7$E?CLN65ThGQ$s}vP17Z8SHmGO4gpI*|Ai!n>*k%f)0C(C?Hb9ZceMTRPaVdt zQSD`>5sQ>&njSLTEw=w%1$%;A8l$DD6^_Xv3+q=;dszDM_)8BEH?%Q_LSAu0(Vz!) zbtDTRekO&W;_HG-h)$Gkvj=|RBfH+&(_%S@{U7FhCo(!dqeF3ssTr1Gh?@|E5bE`t zv+vG+M?Gdvb6}DOhr5jQ=Ohdm`7g_6cCDGgFWaLN6ixxky^*V)APbfD{23wC9c*f| zd{_eOjD~crAN!^{686v{`eS>Z%Z%@S<7RJj;;II%- zn>Rz!C=|reN*rf-vrAup`WI$LZR8@OusP$*iSPTB{c-#3ETWO3!gJ=+E7^V6WT-Uk zwu07fuUl7+ezku;4jnU(gQn=w$F$&4GEY^gR9j00_)MH(2s*0H9s#sL>esr8VCMgr z{oAN4z0r>Ca1}iKy+6mPNd$>gr9NW7y$mg?KVh(_J^Rc^{J&i3R~(f&5QPaX5Ih&M z2(An=6q%17t{5)CHQrZjH_K`1aO;ibtX6;vcqKEHBHpSxotB>Q;FczXXq>;RpxbzMY83DDO7Q+`3lyS_2o zz1MOaWsOaYJ&dMw+_95dBb^JB5%br{GG`?UAi5;BeiWk2&rK(> z^edCa`d}#Ky8sFxK)>uytJC|!CbbGP%Nd4$`cVUi?>@JiYa>*{#evog6Nuu9>s1Mf zX<{`5LlB|7;B!|@k>{MRC1amQh9A*zk0L*v=!~FD>#D>HVw+_C2i?+X$VRn>QTC0W?9g>Uhp=l zSmiMD8ja&4!Ds{d&Y8*fY^Y=4EIQILp&yS?kJ^jZ{;Gf$s&Xu_%+9)u;mlQ0=X$~8 zic3uyPdBFS+EvQ-LRMUbESGF0SK3F%Apz?bvNX_cQt+71^6x{{1|KdvpkvdA3&$$Ks3Ieh`Gj z<~k7OhG>kN5`&Nm&(t$ur~i}gvgEdaJA<))BL>%N<_~eXS7k#-M`kfnL>`&2^&V_h z*#S92Jd~0#+Y2@~kfryCXQAa>GGx%XzaV<+;1<3+f3{M4I}{pcWm!ij_qg_v?)ZR1 zCHv(N@LP4*`$b%&<+B3>?hDErOrrN7OVhk~e=2*d_5j@ign25z&!WS`E*h%X$&(-sB_^kIF1n=ZDT< zmXf?P;fPmzR5VV%N!3h+Nxtl;(3}W8-sD17e71XDEH-Ha#*|$X!42Uy`OhG_O>s?g zm{yXhy8hL~0(`1dV^~ND+rT(;jaw2V|D?(pX(^^9Q(A1A9LZJic`o_%FshIki}mbx zQx+>A3qb@fGAhW{KH+qa+rY?9Kr6swLdc_uI7rzXuf#m}9GWfWEzl6Pb)N zaJm&6%K_r#8gmhemZjTMZygSLdLR1@xyt6TVb^6=PAuW`$i;{siENB{=)W6jpV<3Ek^s`8q8tvG7ys>WM3+ zF3I3s5yvDN>qnJkT*;VVhhRPH&u|r+j{@+Q4Ul$&fwwA^^ zpu2F+8$GG*_u3Mm`dF+-zV785RQ$bO+3Du9|Xi%|7mP^DA6r=a=sFdiBOXVB+#N1!W!1& z?4@v+Y|y10H1@uYM!jG($fUrI=7wvBZq{LiSjD%rPOgUZphI$t+Bfp!+^KxR94s#_ z)%+tD<`B~ydYd0Q1(nN&AIqCF%gOPeAP!sILZTEM{wHOT)_*Q0lY`WyOwg8g=!wJ5 zJE_W0JPZ&EIws^;vxBWGIlswzSZ*hDg0d4ikRuZyI^z^Z9r8U=C`-*(`|bL&Pd z4bu(J?MGeYKUo7~*9fOJnrJd`()76W1 zET+QcWPSTRyZ;Z~=H27Qj=C=hy4QeeDY}i0jcRQX?XeA(SL=Q?Uqv{ARalTDmUC0@ z5r$i@9QDZdAOe1f3XUI=F9UwH%c-}A$BBqGwML^j5l-vZq3bFBZ74~}%M>tJ0YAJ5 zxHC%&K$pLnL9#PIoU)EN(63?$ffRtH*0|a4L4-d&*?rbR z$!L~veRJ$@5@BHIna-k@sfk9UQ@1rg0iFB_$3R>D4xo|qC3^Q_Q1N*))1^|mU&i-- zQ*dsGU7#fYK2%YBWhlr;%)2<8JjlOwgn+h;&>F2iZJDV6gz99e=glXZU+Qjs*CT&L zHJ5MbTEa;p0up0G|36E|W#o0-nh#ws;Dfs>heyWi?#K(?X3|>?uv|slZSsltkJsIN z90wciVx9RUZCniUSWyep!xn}-1E!gj-ls0?hu-=1RD6~-c6;6#GB*|h1@Bq`^B!_6 zcne~}2YQBl#Y(=tKU$pF?0^ZH$$E1c_>!FpDG{@;KBtkL5u~Y(@oMjXN&%}Z5K5#% zQGRYiwQR&+$bzIAdSHe2GLTm$9*(Wtqd&~$rBdsY)~CaQ$(|9#GuAlq;|^QL6y-9@ zC+{UpRaNQ)+Y$OftUto{h3b-1-a^}oE3P+ImTB)=3!D02u$ScDRy+ksDG4}S&A$AD#LzpBZ8JN5W@TUgUyP=C>dXrl=VG&wi%W|l`+&0)C{LQ6-LW) z_>9Vxm&?8|+{XTy=QP;y2Z$T`q%_*VGs>!&*J=2{K8Q&1YsLKn%{_oZ;J-T2Z!j%q zR$2$K&e9@OkWN>o-pN;s(WChEc$-1jcj?MkDpLjd7J}m2|O5=bdhI=wJoUV zA=7JcB}mblvdQLk>GHO_Z~nfa+s0-_fYVmzoAk3K&nRR~i@LmH{*tX4OmXo$Pf&(3fkau+Wg?+eQ+Lkcwaf9+K^3m5 zBFTixYH=0##Pgxb)benEq664sRPYzB$cjOsX^voezs_bBOXny~O3dNviofBPOFPnY zm4esPg{1|^+Cn(#%|D&Sb=0Z#!J~h-kB+?BlwYJ)nCAyI@wUNW53rQvV4I*J{I{=y zt#iB5JVj=A`6{pvvdFg)W4Ae#UZjd9(++wC&`g&pG6#YW?f6RXG>Q*W(zfmu9N)Bm zF52|~MQNzUhli1(5M4Q-sB1TvYbH%XZb^C%(fHzYg{PO@L+uQNq>Jp%pSs?QTG4qf zZjmJYqG)~Tu{eS+?!sa$eS6>tdBAfW|$4~45+GjY`~zTZ0bP8lqNXp zdjSTqGfFiNUBR-+qvp4WW6_P6I$s_QrN>cSggchA4UfFX@^HF<^>f9DPNp-VgF*ms z|JG&JwgdK}Qj2aqj>zj*e!SbSRNG^_;FMq`;Bkd=)$gvc!_ITz2prBCTKety&r3<| zTfK=%rgU1OqKp6{L`^05amipg&D2nO_pv^Sknc2(o%CW z0p5=h&oM$CF>vy*%$rn)o`fU)uW|EDJFJ$$AT@oDxMM-3cpMLB3x z8Bh!q^{pmo&iIenU;-lg9QC|v9+h^jsmw^FITH7@IxAs_(4--&s`?}YFx@YAhcvj7 zAudeun>k<<;ic)oH|hDul7aN6&5dIy_7&W@A|-K2B&aEjwTlC+A0R63Eq8Sdh>g{K z^I@drNgO-`SiA#@@S>bC3v?vWhU^POno*Gh_OG~bX3C1ri06ZA^4X!Z=MarfqysZ0 z3wnsBgCd76xDp}6v6ag>*vCrNVq4!glOy7>MB}mU!ec|j#S9J|lNJJC?P*T-hH-pj zA>vgQ=E%kf;e4&pHR6po_?R^S9I7NX)4}Z-O zGrz$19d*+42>{SdD1rQ>D{Q~ZQ{H>-9+ISvjSVE>O>^7I8N zdO8wySUJG2E8(vttXsZmTBrjZ^xlLfR!rcaXW&19YuHq< zd9VZ}rojT1d93~)lEkV&?{}wk$?-`ATAgo}p@=ek4P>20$lz;1_AujY?Zu%5kfqlx zoF<9+fKWdJ)c`IG?nzpEusY4Uh;%%?@7rPrFo!_!7uA`2+MPM0?`XWOZOn!d%wv7O zL|vWU$x_F`)-0nEO44*`%^*RV^)^CeTLR!Y#e9%CF1?9^t5)xL3L!WUk7qo57?&iG{YgP-tfeAy`zjyxLx14=^n3Xd-p@70i=k(UOBQMV<2r?Wzo! z@F&;dRNgR?1r%@yN=`Bwz8n%v)lpHc(rg5}(5pk9;)zhlB zjXUz)x_y!u)d7Ls2ED&rg-PmPR}|~={Z%4p3^9DIA~wMj-9I~`60UTAP&%bn17#Pl zIKZwzM%NOXD4%}#0Grj!nG}WmweAs%9m`1B*ZIQP6_O1LTD2PCF|as}HSupH&F=~7 zkxt6lTj5c8rcj-9M72yLj}#3i{ug-OD(sYG)K<#Tgw$XT`^)2NS+SI3k@%hS5c`V1 z3=u*qvDm^zUSx9Egyu$#&3@+_`Y^D5sc?0qjJBmK@AMS95Gm=I)&q`-Jl_xP=W|x} zJ+i4HcP?`O%^tfw>IIAD&3C<5q%XV;K5j}p=vf`WHC3ku3WyNQ5%nNR^Rxj&%?Y4DaI7(*s_bjzSGIm4NhX=O}n znwh3&n>nq7uw|B*4U~Xqh*`tFs>4y5eW$dFFBmuskXR1jSM<7jCMn_Uryy$pCy*kQ z%4m5<%}*N#Zvm8Pym$sx|1g{GWtVGaz(c?x8r3z5kjWeixZHx&&H+|5meW@u050VT z&<1F|Us1TeEm-<(tFuK0SO7?qPFB}q%mx?u2$(HON+_=vLHcgDY};wJwo<7e`{XkQ zu!mfxY6QxqvPlwv5k*+3AO#nK$*gH6op-+?Epp_P0vC?9zt+@pOG66?m@ld3Fol(j z?cto~=6q-~IZ(aJl_$zuY8;R|iNDoW!bFlO%+F2@U=m2^SrkMG38JE^&v76tkwRe4 zKmw(t&2{+5LAOXQ|AK7fB*x4000wZ0iU@tNq+&==Z{w~ruUsU^4q!`C~(S| zR|lU45Y+PND8D{>bc|ttkZ@-1;~G5l(cIMxBAMlb7->pY(O*37(F^?T4YbVwG4g6( zwOG?b7etG-d%g(u!$LqE{S8wb0nUGCf#|$5o`&108b+nt^mNxk5&>U016Jp&J}(Mav!C1RgKu_ox%}T{$7=GSGdZGGMV`+__SNQaOEF3=STFWjZqgk*^Z3yOT zNR~g&)S>iX12$G38R?oQ7llGCG68W>?$w;FeuW-1QOw1}Id`R$|I->!IoY7#YWb9z z(*h6&^-iwW)o||e;p(ARdXNP8O-g_%O`ui&L-~9J>qGH}So!XqhSeIv6vFY7N%)C%{|76ks0K|}+txI;6H&g9xtzRA z`05D{-INx2y!7RbW32RH#JY>GR#y|TwSp*sUy48_IDdKglDh(Y8Q8DHn6c_+5nGJg%M;}B{u48M1$1R}9YEwrmxW$rIulX z{$6%uHBl4@Ys7-bAMhdmiGN2E;VhKSr6*Sl^!-dAy@{Ia@$yjNs(JdvU2}QAgfqy% z5nt84^d>MTb`F@bY)Grov6}15$=+obk8>AXyJTpJMN!tjn&qH(e@l0vFK5Q;V)E;p zExC#~jQ1MtANx+B=s5$LqP^fv)qycd(=;LMrrU$AWp#ROf;f**56fgMx(D0FahlmI z6gY115h9P1r@baTzfcohkTRWq_7j-R#QxPR>?d)*$`rsY zV@>WYK4Y?Bcsk?2GwZ3{jU&}hwm}Rw1V2iUA{5gxXSTiWH|Q~;`4pBLXOOV&PJZ^> z%ntscXTft0>{L@5`SaXrA=Gi`wB_g&LB|LpYRcnbgVp9&&caEtC#yO7hH1C2p0rQ& z2^m43-fLmSWFlqM>WC8?)pToKUfL_YgXbNz@_R za+?Ml(g93Pi z+*%AT@~v@Ta3hE%4MnNgU*Z}p%8tWduGJ3ir{5CBLx(@sLZh8uVnJCQJ5%k%792o3 z*4~~ET;*`F{KX}e@iVALwnIsXLd+I;)>xbDwp)F3`hQtE@M z33^Pg2xEe&{-#5qL3pf}yV|h{gsYene{1^wYjCOwcJ(rd2sXM5fD4Hz2eADCTFY4F z?O6(1bz|f`bJt>$EIiq?jFKuQW|*h~$7P%vKaDGiM=@z?T$<5M-3RQJW}#HsBR#Yu zATmcIYfSdOJLY(h#%Zj+L3}!lDkj}|6L8rd_9!VKIYRA_^o8{MU%K6AE6musL=i9a zzKqV}*BnpB0Ht5JR-_QV>*H0Ah>nx{!V6j&)ScMRs^n*$q{;zd8B5z=094%s%AL~d zBJ8k-tyB=VJN&#E75^880g+2o_MjIW@|xeVo7R z`U6|9_|>2#NC<*qR_ww#kSpP#xRr7-u(d6;fs!>Wxb=F>sOq1%LlQEYJFcxYy^h;kp3Lx=F8E@NdAd}{MX2Ldd!#GI zBWj`}Mmq}<)o{h5xy;b+V;&;Tyi_D}4P&9VC4i=TM4K8*rCA*kzO#lDLb#2(m&2Te zRnV#9mbv$&aeALl=!(?nN5j84yhIa6LmDDC+iz112_#Vxp&4bv-2CQ{7s3ccBdxj0 zOH5!Sxc|;#xH6^&WWQiCQu-GUD8UAeM*8cyq$VDCW? za#hx|YyhbZpil_Ak(xg{7d(_Wwt96=>$M8YRn^`9Ge!wNE+2J-Cnxw3bN2I|88@Ny z@Zn~b|FQIUW#WzZ#OE2sv{F^{t!6l>=!UwhZ0J5Pj7fbvC!W#W^r_SuX)I53n2VWJ zCO&Ttfws370c-h3+SXx@wz*XJJMG}dRaXqTDT%>x+ysEvTi2C)Ow9OJLtR@RIivew znlIu)S6s@`1g^MgfAuvbqkeVuDO$;KA@h6VlFPm(WkgfzphN+A{fVf=XlNf9tNw`T zq~S%N?^ZwpNl`#V{uDr5Q#ZjNi;;5*&f#K`8^)hRx|aD2h_f!mDl;3IfdFbL^nmau z$!`*L`05-Hh@lmEC(94E5}o1hll`HP355Re^h9@wrrkb~0bdUOQQkw~T z2&c8wMDK}&CLaBEd?$BxV!`nEhq8A*YRK5SOz?J4zotiL8q6%m)`rvrqpHng$rn-t z23~dC3ZscbNUFA?<-NmR9mkNR@mmHfaautOS*nIk-4UUvn9Hn_fu{3=_ z=)EQO>*2l+4c(y+tet-?S*olFTmV$-NWF{)GvVGe55i@H=`iwDabX|?qQi!mjWx}o zZkO@*BL7u3r+}Qt~?Zlc5+(j zR*ibr?BdNe)#pX&4~9Cxn=y-Jefc(dTQ5A7f*V0dub{pU!2*m`@S~Z9Euh&mFjq*Z z2WM`R0GlEd8&a0)wx}Xj*_Ecm-bcx~H#R`0V6vGv`@^B;iaiuLZwLpG?OZZg2$U>y z7OeUeW@nTeyv1^eclLy?j3vUJQeNp*3CDd~{$AXbtG z=xN74zH^^Oc?9>a)}yScFkoF$Rj+;_VHGTa?X!3&j2t{p=9iXzI&}&j7D%sbpQ;fx zCvi|dJ#~CKtr0&Vo{%q8dPE*jxmb}Wr)v;~1MRHd`O9K6ob<4u@&|q$Y2N$I2>G(< z9vT3dfX16MN_?lYNVzB-xJDoWT8+AJq!LT6B?Q2@;}yv}&DX}ufqvpBF(HVh2BU$j z_K3=J)F^ohFJ-{|uVV96ptWUuC%x|I*U@f^M7)sc%8NZnTEwz+IU0M-WP0ELfr-UD zKET)Gk!oy;C>L?GP2EM$OzYh7u4v4}lu_%P52VCnIR8aUN3*Msv>R9J* z{V9VNtkM<4cJzam9A1&6dXgcOm&Agj-v<8mBLDc`{o(D12#F%yQ3z9x&pZhHu@*hF zO0$KM`jc=CGor0HMATmxzV%`zrK{d{PDg#H5isKe%m`~b00GsQwjpoJi$WMhhw2rd z0#LE)X{~`_M{#C`+i(7C-O2}B2Xf%KYn0)Nlr3s@4-zI`1cL!(CQ0<`C`0YqhY%!r z?_eQ=8*BBq0~DKZ3401;a4CueW9HCXvj>o=IhFD1tuMGf%3!df_eJieVK`v8W1}jM z60)=<;e(^LHT>s+33WlHRMBm6Se{IyG`f3ALdB$B*g@eVou;;StVV%GfiXSUUH7Ow z<3u(a?1~1&grGY&H=zVf6e%$U};JE!|>|gg$GFw8nl}qg98W| zH}mYzt^_B1m_+JIUTHe4F0I&@y=rUd*ZvkAD#s;cONMVT$8^@Se2+VGL&Z_$H6Gw< zl2-3UF{D;RJ2kCV7YelEj7D5OM0l4p=dgeZ$;^ofOrQ516q=$Bz8l&6$ZG&bRMNa- z!@v=m<(&)0FE7&z@6a~`Tuyg8%{jqBtd4r7=Z#2d=b9(1WKfrJE`tTM7KPV<-af6T z^`o3TpC2!#m=YtkT8==knCj=?QNTQeM}a@YUKYwTOeG#dwwj@BTjtG<`6vk0peb4M zH0z(HWs{fZEGNGC&PUcl3^3|M6)8@l-*rfK?RqL=P{27Nd8;$u4L9K9 z8xjOv>QQiwP4n-Qxa)Bs)_2Fd{pJ*c4~^lM2P8E;j(D8)(x7bz7m_ z(w|PNY#pT5Uv|6bnkoD&`O{D-&dfDTn$j!6l)&r&JCCldynLNyBX6`1Q734;NFy=U zbpCj5dcl0<@&GEF4;)#J+mZf)(ckBCKcDU+=Te)oVUi1t?`AvYo6?9^Pq9E8gLBM_ z0)XKnhe!C{je*zw=+W&5Lxw>c6)m8mnr;~Bjf=qHSz?qg*$&PBr#8u!Z~w*F1!0xA zUBd@8w74e1UI*B?8c?xjb3!xKjM~Xx)0GKoC~MT4tNL*IU;3k+%~ioYB+UlsAl(B; zuR5;CKAi$OpAA^4%J^`Pbc%KHFeuOF4pAYAr{^jS1u#IBwSNdWKVaHZ`x9)f7!q#1 z$G91jSFTH6A?y9;mgp=j7Un4ObA`le_eAVi zdJFy-@D8Tmy#-QI)hA*|jDZLwnx{11W zK_Poe@;mk9lu5b*7-(WpmJDwsXtxMeI@9*f^FSE3u<}eS66tMq zMT#m=hhG~?eNi)PDh>glvvPq=%;!Lxw(JRZRd(D$c*8Bwp`Q^C3AW!)ajq7#v}^k6 z`@RPJnQ|?=uVXe;)GVQGhw8ZxlLf1XWE!fT)^pxneN^Dg1M#$xJkiwPH&NSK<0wl$ z=A5xi2Z^At61^0q(H!E*=4GbI4}teo-Mkxd1|Z{}^3Gd<4)1(i_zFOo?xzF7nb#`K zFF#s`X+13iJe~aEF#KKe3>58Nn9e9k9$UEPC_ibmIqgilY;>z4`n2P3{lanSW($BH z;UOE9MG_c=8vw#2xLhirSQgcl1M}LPEQ;t1V>&HM`h4-@4EwN^+Z1UewyzO{dRIVD!Vx;Gv6(T^gbEg# zVuj|4vxXSdqZGSYCL7ngEhLd+j09CoL3pv+j8KJCl{$C|svJa$G69DP7r>wh5Y?{Q zimffQEpv$Ig;Uh}F}^rCZ9M^V@Ra!t9pnR|qfpZ}6VclXCjuu61%R-)nZ!easMe`I zc(H|^=6t@M+1PMsKfbK#)6TN9VTKw`TrOOqvRqnbK(%fQvn?{@V7Myjzt!!O>?W*W zt@OgTV1s%KO7fg3b*N})1!XcfD|d;OmPmwT-U+20)Kwxv69o^Bz_(lGW0H6vUVFNHBcWR^=8Zy>xow zknmI!tqfY5x`2C!mAhwAYNZcCr5CpKY~_#V&B%ej=KKUkaqG>UCoL9RAcWxRW6o^F z=`nhPxgpAt^-Qf}q+zI`dLd zVBKv|$?bKatb$iy@}F8+jzt~|GE2F;O5n&zlajSiLJ%%D+DfW+B5fKc;GMgd)@#Tk1~AH2u^K6pv3Ka zeHl$k+n1gG9UWk*I5f$tqE!&j)yp#=z{cSPV_iL-OFmg6zl3gYc_OitkkQCrV$&1I z74?9@XBVSc63efOcxJn2 zhC2c>VV#P99_IJkgSrFw9@%06(JbPEyr=WM9f#=37-RG_Qptuj$6&VqB|_r-R;q0$ zpriRa<0cEdIW3@Jsnt+UQsk(_atXE`rw3nJs*RwQ;lhg=TlYfLh?=D)_PjPd6XN^3kj)}HGdS8IHbw>CSe-#FW0J%@F5!2HIbY-SO#1yLJL}5 z+fb8K04O*$bqGaI;>0$@#GX!|oJm-d7(o*kQ#VI4JSeb%Dg#ytVxoGdR7@U7OfvYl zRE^P$(MY*iBAB#b5y^Hj3*5S}NE{>jPV)r<4mxbGxpq_zQ>+sgT(ZG*?Igs)*Po_n ze1s{ijN!-*1*uRh65487?iYXpLGql?*GMRiMS}F2=Fu&{CoIh~(3ZjAl_h4kD;c!b zBk%O@!AWxI9&ysLM`envCqWy~cdTa_<^zT56)sT-6ODn~$!@8F>e+dTx`-(8Vh$ei z;{-}561;{Xa3qD$-!kptI${)!Y8c;d=_TJ2R#f_^7_~Kq0000S001%tWr&0TC;$H7 zU;y>s0-J_bU|&A1lX`M}loLYXFw_Y`!2f(LGl?BY+7i2sdi~?C}Fg9%%KTyiswiOpK?Cg;mJc@(s zfH+hdGGA)HZd536WGvia^dIA6}w=Sv`tW8WgjX_7ph3$nv@5O zE_wUf%~+|n)%|21M)=RPU4o>!R3Y<1GTHZ9mav#`1-!+l zSe`S20ny17ipY=##hblNBg9*{N@Gjd3%NBw6<|5KR6yFdgdK_rpi#$J7+SBt=an8g za@G*)r0F3(_!d=Qnb}wXfsW;AGCVK(&Lz@Mj8s>xV$d?z)FMW9Awbh+xGz$j-QkH8 zG)^9C4kEMQSxQDC)!x-}JZUs*07pQ$za4>Kv>ID4@05YBC)F~ILSUe6wj2I70QNk} znBOt*{P9haWMfMu=JHM&W9*zeK1YG*wPrl3Xy&J2EmJodA^ki&Ta8=$(=(hUx(~cH zzaM^<`80Su(|6<+M&En=6*1R)lzp-_T(B>}!L#KTW5j4a|9Y!A)<=qFA(Fk!{{8l1 zypb6yk-)%@PXjJg0W5!LGl%|r6TBD=$Whf$F}v_VI>Wo_@l=YkFNlDj;*Czkbl1Fa zb3zaE`G0;!ftJ|vOZq3{)v?SQM9I9CPs@$=BaC%~#gEez_6QuebNbokKv(LAG#Zs? zN*~ofjSq=BkreO_KHGcap0`zE0iBh1<-j*U+=r)gUE z8SBbpAYxZb5x&V2wpsD9@_eGyKQM@iNf6hR(8_u5nh4`_?Tbf=F5KB{ zQ76_FoNt#e1$LKm+x&1@t~N=&;G`~-9&Ar5mXoDEc2UNRSmeGWw$bhj7t8j%ng-~< z&y{-W{VO10{|{4UpPy@wBoAOpY?I+|X@(l$n;%0h7sd9@{zp>c<|^@YO+KfoMZyt+ z8*3<@%(xEYP4}_kG)sdMT%fIp41|=JPN*v+a?l_JbizI>cUsOCw|sAPest=vFNVFp zuAmeySr_Cj9;v%NV)`490*IBNH8@c0d#96LuGp!;%P}cR{92kkU8x?lbU`uNFmrpq46;<0McbP42ynoZ$+4Zxb1WC0G|w@#dfe36;w(VG}s$@-YmKf##y~zfW`@`mM!w=;X@mK z3Y2^3YhN*bsRi}-koa{4T%(Q%=bu&S!*IhYnCOOJ>FJT#J4jHnNjI+h-c120xDo!W z?nb&tc%g=-P}TlTHnqyTjr(4A`!fW=44&47Ua;h!Ei(I%B?rfIZ7w%7s1hDal->Y< z(uQ>GVS>}6pjfQOEv`GqQiaa+!bw%eU*CUoro~~oe~A@N6UUiCh2Ltq7AglcnAj{k zpW~vrcB2$Ac}(Cba3sPWwV9KJ0Cw(4~Bx09YhaURF z+j|1I%cw4GK*yuj=KDij?F)dZN@+gHmsH&dDtrO`Iv$N(CI4>TsY%>taLfEv~o-@|RScwqQn5dJHVRm<=d5lnem? zQPoev`e36S#7(-fgV@t&5~(d1?En0Cnh86?qkq__MuUb0jTw!-g`FDt(z)glc)Iy>svDP3XPDKlydG9uiFvg|B_*>t?~8< zpy{`+uR08$KJjpoOe6jSv2^tJR|>qmLnxMTs3k1!B&E#$8YY6!f1-WUEIn$umk+Q;?B1xa*N1S(6Bw0e0*0*tDNe(F+j| z%0KI)A=^;h9HSFM+8>m$A|#tr^sly-;h6b>udA~x6~0+EgtPi!YvaTj6qu5eE};hXDU_ zyEGw8SxHhY;kLvrZ^Mr4(r`XW`qQB$9T~L5zdww!(L4&#)yYg2hOv<_C0t=2n-YNj>)kee${(Zi0hKNXM+E$0=+7ZKK#GE3H5 za~_y)uWMuUIVP?t^i7!Xh*DBnbfF)+H;WB})R9k*fEKK7>Br5|aEZRQA_;w%6`1b( zAU=G>l$yDiYdT}rrGu{JCW80C^z&yNgw%j(<526Wp!hfw%F{$X%+b2rhe&cf-5w?HI5K!--=bCS|^d^EggpJRHFD{2p9-NSbR`dXhbFi}-NzX}{ z4*aUH9~Vs&Kg5gJ@V3hcW+_q&>kbKpOJ=sI=yM(6<{5)p@-bTNLg++3pFB}UY)3~- z2>s}SKrN~e|4dG7Qu7g82hSJH>Bef%j_CrCIT|ShvM^_!RRtoPjKU)rru@o z(IH_&eKL0m{Q;cUkfK1{Tg&57&mE2wUez*71#bvg6PzA0lLl8-?{%V%vkUVrg{}K# zdP!T5#kYYyEf!>05_YbwT6nkKH*|drBkU2=;Z3^P&2lJycYrgCY8hSbvUNI~S%-&^ zPBY1C*8TDy>(`x*oDhx@iR<7`zi#wfS7GBYlk4jX&(FS9OWkyT=W4-bmLVDb<9+Ej ze3;P5JuL!_N;@Qz3G{#fw}Rb*n1-r|JPFglr=PllD-jhrVEc0JmgxvrZ5QA&mrY6j_Qdz_EVK zyym>T<_SB6y?w5QOSItHU;&$SDT!>8+I3~Y%$JDyRmwsw$->4t*bJUnhC45anJrou z%8}Q0w~3z4BrvZ*6F&{}68j4yN#y|f?vKcBs}MN?7OM)m$kY*=yiSFzgYC{ikgwG; zry>P?s8QPeNLqEU3XUs#rzJ$;_BXm(Fl+ZS4&afX`JhaZUStuhP;M3O1UUk}^n`8PZC$;K97 zFLf=7vRP9k+!nKSoECooh(Lidc##=UG6g(fOZ!*s_iu#^Kznap4=!p*8E z{O{z45)^*;3a4s*f-cw;?j>R{yb_smP=M2^Um@*82Cr3jOa!6fQ**Mq6 zm-&XL5gZuFQ(59ZAYgVLs--M=%Al+AI9uT!3_=`WKGllCt%sZUIEwc2NNPn!l*# zU~Nl*%FDa>yJIGDFKRAIHixw)WpG13+5gUjx`@>r8*qAOOGx20#900Odp|SD#}Khp zxry*4bugpQq~)XX2dA7&z@u_PcZYcQ3jQ_8aT2<#er(4|uT>Ss`B9%DI)x_ohCKna z>>At(IvIz%&ACVdm^gcjD=Hk$vo*PD+t`q(P4A?-X%(zcF)x!G?h9X>!O%rWSO5^) zOY&d8Q-><3QoFPzc9XuKdtG>$n3eLgXWOJzwcFd)XI0eBQ_c8Fyxp7(Fv)9P@4ncn z$-B158!4bve!jBlN9GF{T&j+!(%SrdO8?-2Tv-AoYtI}fN#EaF|IGGJhJn%5Mfl8= z4fTJ#yPg9`>A~h(Dd3%>x6?rFd(RP?dEz3Sz_(hYuwzt%;W~`U9?6i#_@-URny7ZZ zUDh$=2oGfI2j?Nh^KH$6!sef1azo7ZFc3f_NZrr$LtqLMWu}gEU)C4M#OzG42HLdZ zfhRY?{41+L-6^e@86~bzVaE<^Qz8~bD<&v3`SI*SXrQee9}#*ahkAA1gv6o^uq# z9DdLt*s><6ib0s(3TlQ^0zbXx`G`iKZ-PwtZkR)Ie?p7*9xh`877U26x+!}!2HKM( z`x4s7UDR74ig^ft?}-AGh*A_3+5Vn|V1$@~=1Lz+QEH_~t%jUxphLLjuz)TmYA?%} zlJYbc@c>>+g{{U$?C23K_=Zk@7kvC+Yqp6b+qL~%Z3JGqgGJ22Sc$=VA-F~{StRRU zscVVMt>sAAmAux_jCcxVJM?p!^fkDnkKt%{$Rn`7s>fKcH9QYkM5K9#Nanlq5bXyb zidxi|t?^O?(@-O1!Dcl6vAII?10{*Ej#bcQ=8$LH=k?z?oP5`@$@ozmLSJwut4v@@ zl*h^+DlNuUeO&jk!U6uA>|C80(3vV0Celg{QbDH^6^7_FYZxJdPuGuoB`M)tHa)SD z0LItDy?pOtdTIU#VQ4Z#C3gDtl-QN6_0}s7WbQq>-kjJ*J?^=a4ku0`Vtk&F597Fd z%dAR8FNKOqSPq6II?0DuvG?;!zw(a&bP9B18v+?JEOt2F8icy|JnJ%9_HBeASIP*t zn>}7Zr5r@LVZyRmKCjY=C$>O3EMqeRK_S4_Z6CyN3l_JLI^{$V%!>(2d}hv6o|N-Y ze}hA=Fb1pelOe#l#!XF=UVjH%HP^mnf&LnNasK2n^=Ff3z+Y)I{G97Hn3Y_K$ElBd zb~=+g!g{A0AGFJyzcq3e>yfU?QqnIl_Mt0DfNcUl^D8A=1CE0kRo)u(LAPa7AckO9 zEo1SB8p4o=J*b4#+bf34b3EBleA5Zy%oYC~;sYiW43Dl26Qh`b5RM7Gjn$P#mD>aK z#n&O!1;aHgU^B5upZga+8A9wlcw72@-Fg$!^g+uwp2@SO{;y$K z{0{&^2rLAf;<5Tl^&x(rL_Koqd8$eb&DZWD;$y%X=K&*C`|n5-tpF)_>4)XwjluSg z9&cZ{7Vhy?gyLY;sz826*d7$?j;?F_(jxK1w()|NA0{I6c@AF0{l4$VEI5|xnMC_n zF|o3}$UQiAKy6A>t!QJ!u?-z@xmOo!#kIum_D^gX|I-AvB+*_Sp= z`*v`L*DROyPqWaKT|lYUXei4OQLXz%HDwo!0sB`k`Eb4Lp(|O${|*7JpO?aKn~|xx z8}jT>5Gh<$A2|R2X;$9z?&NsYp5l51fQ9*^sOoV(bMSokUS&5tr0_^dUp1y2df@IN z4OXGNTJZ9%_BU|9jmYt5BP3HZr1yZ!Rb@>_zxf!7iWAUgB}CiV$iZW5YzL8-Y8LAI z2*F@swUK1ZEByb98Q^p3avrD;nXwF&UNV8C0eKDdP5b%n7=Wd!(#B*ZqqDPaq!kZG6~&-zEOKNU`jB#mgtCXw;s zjX&ul2NT1MTyITM(dZl1obn9^F;2T=inEHKx5R%!zQ@V|co>V^ zMGPxr4s+qT<%_3==SDs;(w1u65tG6=oKP6+thlhpsvJozP0S^qk630$yz4|2n8z{%CTx$s*i*H^5)hN+o;1%ii5wIk=S z<)`oCZJzKg?gp7>Dv25*(o`7y7mafwr_2iw@!6`+J|FGyGVF?rOX_s)+pVGE8<`L^ zb03diwtUy*%nbXW-2v?A?!^~~YtTgRNpkqJ<}K#`X}S3^?e}%tPyRk_DjSE-QdSwP zQC@ZsZ_driD?3iG9;LBa#J+THA(GhSDM6GWPkK9UdW1c{Kp{1p(z8`nRVT053vLgG z^IK%$TNl^X^PoMqgB(0~+l04S)eqVF(OxGt!cyLL?ID_7;1kL82rWdlN-VZGtmF<) z75Rm=SJ;ci426P?G`a(x!->O(AMvrThaN3N0)OTO4^C_ng_TD6hlTf4NfUkdkq3DGO3lHfztoTj!wJjz0GHgri^q^>G-_eg;)jMm+YE*B4n=;2t zE;gBFv%mbE3nJ-aC^W%*HYO?p{?}JUxd2@d@l;J zF9M&B;zqiPq3)6Z^$$g;T2d8=XV^mlG3epB1e(>h+46VB@TPG4z}(IH9+f~^6)p&! z+pDHx@%w_Z?=|A0{JV18Z>PE zwds!m6S2giV+P)1;bcCx#a4GW%d*E z;B!Ue0Xn8=cVrCqaNIv(rIDaF;9&|y4J&6rO}o-;bJwxKb3QS_*i5uETLOEDf|lJ& zJB8M%yntt*&WD>D@} zZcHcAH^A>xg|yW}HJ(0b-MPbM-$1J0Rljfzxc|ii?_U|cl!_FIYnjJjR)fOR!GSZ+ zilVtD2?FXH2hi?~&QYuLA-i5u7jr&E_ONmn8rKvvb2!wl`I_M~=|zt^ zgcy#w7XvFR>m`T&%q|cG`EX+2bk&M#jjZ@-(fX34#;+_~Q>PsubrCxW+|!86`~`Cz ziBPAN2XHFOE=b7f5E-6c`*032llWPCh(4V>qS4oLo$WanMNZ%MyxbFzki`6Y?$o8! zuVMaN651B($tb*!!ka%Y5k;$jRFbQM-8=Oaap9Zk-UlmR$DoI_{ma;QZ%u^=A_HVjT^AGHDVmr4rkj9XOcT_EWM!MNxN&EmaDgk_5LV@stKYS>sJt(3Pwocob1ClL zb~nxZ;A(~kGl();a-c8GcQ^A=4P_XK@^mIn1=!VtWROqCM?p2Nloe(%JUflWG`9Ax zX1vZq%EWl=-1-o088LHA?6l@hyG7p&Se*i)UFN0S{h<2VsH8v?sfrP78Zn{&I4hd1 zK)+;sBMK0GABUf(xASTEosFvYXc7lx;9=g-ZaV+`Ls;7LEDsA}=_3X+nRhD=Q+8N+ z<@3`hD#dz0(~RN8Ex_&>VAMsU+Xy9G9~odgD)W;&_U$qjN*JX(-Gmg72!l4ake?LJ z&IiF2&HtU35U>!ap9TS^9>xt>;y+x1@h~VDUabHT#r}c7msU|+Qm~4ByuMu7)3OA$ z9$x#+LVS8el^Vw`C1iSvzvI>7G-K9Rv{O63n5w zO3Q_l@<(GNk=bH53r*Ql09uGRxl3UEyQ>VD!r@$tie(4G-p!@E(is?A!?y;0Vw`?+ zvoJ)~^#Cc+R}8RDf%Nq29RGWwBge)B&RfkZK%1Z3xJUXcl)S^O2~v-iI?u4hWOZk` zk9P8Q0PeRrOLV5koSxoJgy1_+eGqr(^%i=XOAa_SeCI~2TkR47FUR<)Ey$paV18ph z!9A3%M;W-^#+pTao>CWFZoHlw#T*NO4u>}#`Xcr0F#Nnm_5cU~|FrL}s^0_1FmhVN zaKR<+=_^mxqK6?=^_L>N8+l&dEft@g71Sz>tpYhZFF3@^HsN31ANFrpI7Yaq_5NDJ zr6ke!vz7yy^LA}4KRISGzq$AoTsiGUHxg0~yeZ0Ij+p`F3yT$mkk$cfljJE0m)qBj zT`0g^DTfBV#Nz~!9uvJOj!t})=3_5T#y&9@MBMUCkN6cQmHFd3ejmZZiJf_D3mT0& zhOfrZMh!NBYgj#T9z@XHZem{=+&?881h_T-?vVH2=l|57RNwn4B|k0dBB9xtG1 zrM;8wZA9be=Qdq?kz$@Jp%|ndwKxOY!T*CaGgX7%0NPwugn5pRbbi-}67l=5i(2!i zq+OwB%crRb&kXP6C6QlM!gxH_X0lCaCA>+woj0sP_#x;0+THq|f}Cz>u8FC^ch0z< zw`S8nLXfO%OAHz536xs#Jky%#@?)-1l?hIc%Y-YwmON&uG39f!(Wh7ZStF+ z(O&+X*Bo%fPHh}IFhB+I4`}}%vtaCTnfNezCx{ToVWh8K$t-QJmz8O4D+;hrvF0PA z%nAlA6L}Bhy{N*636!YdSsuWJv?>txx!JfRqi2?|EOjnwvwNOymX&d=KFT@&{ut%=bSM>O_kf62im6}kWI%b5;WlSSEhQc#^$2*r)G0>#zz{f_K>l4vH#T3BX@ z{4#g3DF?5&_>$;lsWLrL-KOyf%%vLualx`?+ERS-qgNL9_3nAe`Od)aN&$wGY7%Ow z)xknM2{T=+8;C&vQrbyyPdsWqnPG_d*CD)P?Xox#gV=M_4Wm6# z`hM`foJ5r@N!M)jCvXw`tHQ$_fo1aQnmJQh);Gr*|$}}=;&PpJP;QVqgu^LYhv#I5Bo*T4R6m*SjB-#f8$g9|S zmkcBERRIn^UvmH{%Lk#A2QnNzW*Sn-^3E{HdDOmM9@kNqTn zBKwkApnjzFBn!_X+V#Mwp0)rSU@U@Ki|)Olrq(f%jIs9wVqd0;XB|OcVZT!yE{!;k zD%>L_ziT9yJETisL)N;nnIavXH*OR_?=&hlv-oajK;G85n*L;A_kvy4Lm%N)I{=qU zP|zJvegI&yMNl+BuNoThO2no0X&lW|#24kDeR!C>8a;o;3o%`J6KDGGMDaceGu+@s z_x61Mai})1U1Y#kX_Q3ZWlT@4B7K>QxtGP!y{Rp({mgQg?#L#PP1y#G*Z}`Vw3YwtwXJ%U{*p)U9Jhx1JU_AFsAK0r} zjJEv;W%k=}`%Nn`WLpt`(#k34klLc}iKYPC@BLihQx1!ku3}?@s(XWy8S?Zi`Em@n zFW9l_ih?fQC8cLgAPv)D*MO9(PNF5tMx=THO?olZT7xHddj+4kAV2Ej7bO95uJMpzkd;Nh=ud=5OOwE z3n~Ww6@c_wPB-OFRFb{FcG;^GmwaBtQZzNlfM)P);G5>QCk_b-m0j_3t4edP1;xj} z2;i~Rl6zUejsp939u(>kmHWI4O0;jO+Yl&Wcn45q5Lg{bVu8 z=TKH0{d3qRwFH75gCoN&wcU{*8Jp5gh-lmI{R7iONjaDD`VL)4;BkACuXjpcc+f4? z5)bd;LtKF9kNDuez8h-T4pE`i_9gFvzWv;mq-H_hc9KGKCjNBEnTzK7btHf1^47bo zAVHxoNw7Ly$vi0qJl8pFgo`D05Ht0BE%=Ab*9s)vLB)p=&g^FZ=T+>8;W5GPUxQ1S zUz@qG2LZbl8kvE$LbK&ht!G!e&he`yb1*JVCJr+u>zM@``*pj88D!HY5$>Ffpgw5E zR?99%sUh~4@+X-Otm>JI*5Hx3yS3eoNcfp5HQZ-p@`b+_tlv?FV0J@zTpmmTbg!nP z)=$t|MKxy&a51Q{z9WP;z`1KL@^)aIiQ`KFJSv1w`pcEC9o#SFsU(E_>X?&zAH^%I z5aWW8jq5x;?{AH?rU6d%P>1Mn1C#R-jwZ87Jgjg(T&)ij-R$DHGU@1x~3at`9Vn%fA!38NlPI{P9402D#ClbVn+dwNLs^OV&n;uNCgeD=t; zQgEq-lKJg-sa0=&vw%uJonjY|r;qfGSPFfL`1K*v%qw#U$p-+4`n?o@gGjIOe37)J zVbr`#^;$gBFM~Pb7gpio5vT|tKQ=-)YG^DiYN1=yYO6(TdEoLjHxs}j_m7us(uXqn zu`ItZT*Iq|iV@iQDUN7Pa`(i0#joY=6B190En(UKgM>TK+MthCMjocWSd1ym4#qi0 z`JFUqTD~2tB>x-x>z)!3pJe8~@HEp_Nr{)$$R>vrWD~{uT%z`;`7m_%?o=iN%xF{0 zXBkiv4dJg+kSRFDZN*<)uT0&rRnK<0jbNPnA4w|S#bKOp;x3)pl8jH;CG(&Ma^QgHS;J`U8|s033C%%BRZUKg zj7^+Q-+fCA!I#xm&m)YnK?iIHIbK600hK7Q>eI|sT?yF+`J9C(C4fx56m#lVg~0Kd z273f3{Akvqb=*BrFd{+ao8PlsR{6EJG9S@XSpQ*oxvi~&E`j8VA6TCZD?|2OHtI}{ zC7-aQ9K5uMUL=p{luayP*Y!T@f$Imx-ssS-1W#UwOiah6@Bm_K7J*S|cD4jO31-_A zi~jJ?bg;+UoSq8DjV*`}T8E3#4^!Jei#ZXVa7V2{?cQxFgcdg^zd%DQWV{k+XlquB zXmjoPGFm+EI!f($JG(cU8Tq*IK(!-*Z64_Y4Aw&IK^j6ZkQjcw!rxu`Ue1ZdIVRcE z`aWQqyM!ztLX7fsM=6_u4?_KowY(;&r?7_Uxw&bkjS;+&Wfw7$WdpahPt~;4Z zrE9l1yUIlE+VB%G$m8YF$C5edg;#7t$bma$Jlb2JXN^MWi%@DNeU)<36@v9EX<@nX zKSjUq*Wa|x_eC$+juxyBh?I`rPGW!K-+tAxG$3R+WC*ZsPZbA_gtkO9eFJ_S=%k=M zYdcFJEKjcM1v;8AgIoXB6m)90Y}U&z%BxnxCGWHI`p4o2U~~myF0~d%nCiKNF|G4+ zNR2u3eFuW>^friZoVB-)y2QBVIgGl*^x$`(2mwGxt6%h_lk56(Z94>o@|R_X>Nry8 z^s&9RKv`_{om)N#{|?3Bk?qg4>Ok-`J=1x_BVV+-n9}X98s`$JZ`*P&sh*QtC8Z%70Y!~`8~YEiMdPf$_j|E8-P|K0o9sIOqCOqlocH)U5J#qgC;EktAcLm?;7QFh*S^4<>i%yj`O&~8;ymo4ph zTO4wRh(=GF*}obWHnXT3Pk{i(gRa5^d>9%GnX}|$Kg_w`kJ+y3HjV&e=HR-?_de~0g9sG!c8Z=U>{c+ zUMW6iVuWV{#203|Hx1jynPpUf9upWAI#ltT$EI@5J!w8!`Ymc(3d%g)P~~9y>q+uq zBR78*kYeR3|3}VN;QDeSq;egJ=dUn_%Oo<7c^`TlRZ=>90vM@Yf^y{&8XDIc{xtA- zLrOE55g_U_%ot2O5;4c+Y1@P6u-i(IUz1Wy)BVBgC~CeHrQy@T5=DMAX|owzkWWv( zR>HE{c0{TYR&cg^?YpP7C#rtAbFIqpi8Vtibt5Ij{=-LfTn`PGz#X2yAu2~Kf+!lg z)0m0QR|NT2lINx-RILVY9_U8yQjlsNj=vH7`RgzdthIvT@aMaR|Krco;jpZw{-8bY z__O6~-A%KYxl{Rnkz9nDV-WA1UDlzI3GkMGV>1<@8+gc?>R|38asYt#Xl(gs0;@Ig zLCJ=Mbo7*4$th1*Kwldg_7;k6=yr8F8hZ;|0(h2yv1@|Zincc4GFBWeQ?iaxCX@Dy znn6us=77=OOBb4Zf~0(IU@UL|UKFGmD>6PR6rSQFw-3kbK3{*FGXv^=mN+pR6(gfC z&XB~3x(HHI9G)c7n&DE+ZKTIMT=D{V+~>e-Uu5wFa6}t z4O+6MnZKcg0Tw)(S)%hkpQXlON5Jpi`9Qt%=0>A|E931%4o$Q;V07W;2d@Btq~yY7 z6K^acMBE1EaqML1Q9tqA$diNID;?ZUeUBgGNX@j%ZRer1X$dKO%R2ogaR)pXlYf7T z_RQaGOP)~GjOTEl!{@CPs;BwPlcx@dl(?gA$qMDnudLetnoTK~x-8DQ#}@$woU@ua z18nuCQi}Q3X;|rs10N;-2HE%m!~z()Df?Z0rLHKV#uM$hnT#)MoB)nFli?3RN7uD< z$lllOjIvA$RP<0>vOL)ruUL>aE8?HEI0c)#ft4lXS=X1x3lU9}MjP64Z|%Bn4A3W0 zkqdb)3hDbZ!=W5Sda5GT`wE?pSJRad{g8MGOYoF1rqF8LbZwJKU(@}%b9_&cy4{fN zpCJx7at2_eCSQ;_oD&;qtAKh>sj3EI}pP6dhqxlt^qHAdFsHglh~T> zpC2#)00RI3A>aT22~0tnA+{y|006(=9smH-eNvTeu=_1#U8ItDz^1^xT^p0J`Y!yx zO-;-ybwz46NiM)GZK2|gaEOwV!Jpw~%J;h2sW5l230y;%qqQwV4T=F)6qggKDui)9 zo4LBwW!^B5IX0fB*le0y0&%bOn28TtMsym8MsGk*xL(j4QhX5VXqL?BF@M^HfP|)_ zZ#V4+OO|5qDyYfz=Et955y2mr@bhTKjcMA~fh2Ed z;_nmsi!Bp|Ct$T4B-u*Y&4*-`(>cDh2<_hL+h_kAl6OJ&?Ky5amR-l%+aYAIz5V$c zhh_dfswXxC^zBy9c2>RQD$9+v1IrkYlthK7Q5fTsl5a2MWaR{BKlr0!Am@}nMG3ya zCqJ5DC|S|BZQLI^!+AQPr%FSdXl;6qZ3%^(sT?PV1?P9ShF{S38z@z4I*JW|r@h>@ zKVfU<5K$9I=IFNwH>8lsA!r{%;lJj)9ZuTUsv3_&hb7^7NQf)o1Y>!!JST(T2S^p4 zf%yy_7iR?bL6Z47q3mhM)NcSE$9u^Ssq>q2cE+hjRDjott{Oi=s6o;iG_Ih{sO9HV z?SDOux4n?F-@h>RsO|!5ENvyi{H`O#8TlW0ujjpvCet);fn13W(Pbn_#|IDZ&L*>3$}Z0j2j1SV*cOyinC#cb%wesX-6jhD_jdelZ}wasa?24 zH5O(yt9Ezl;Ue950@AAI`s6A1=1VNc?tv5n=`VJbbN~~#Lkz-o6g+8DJW~62zX1wt z8Y<&4*;DN5$Cf80CER47p-#0T7IM;&CYfW6Hd+ zJ0^3t~;lw-f({y z0?pZwhAYxinJ&sF=LQGDo+?~3lZjK;sA_lxqnJk-S#D@N?NEJo?5}3wb;HKLQTE2% zIuAv&8wckMvL{&z#)<=i@#eBI)vbhTHLYGJG#6X{N&gAy7n}p&?>J?Z8lOjJq=m(l zAVLu%oOCGqjH(3&E(g(jempnbnZ;ByD;PL$p;CHvIPnC=Pt57Z_wahMrpTy+@kr#{ zRq|6`Ra4nk__GGk+mMQNqYqfH+aA1FdGe*YJtRUu>3ANR6+GKJ=35X3(~yZdbJb70 z!@nmKf0Z)3`{-TjLOFEJ;vdSzP53|`1E+HR4QI*X+DF=HthZYf07DapJ{7(_kKxf| z&;`{_DS_Yi`^woIwb;j-P#RSQz6Be?Dnr*Ljm;w*O0ituF8s&ZOwzCA_V&^Op!WY7>Ja^?WIA zDF+2aZEiX<&dU56aXykwhKpgMXoZEPi~SV(DS7~~AxYdk;`>y2S!mKI0SgPQMH}n; zvuuCqHKXM=&7Za)=7bk23CKcBx%r$=&RO3)U)7(}VQ^8yfCl*`n2P#2N-$TsVlo@E zx0@@iS)t`?Wg|l_bMu#*zRV(f5R1;|F)2WHXp8$UU7@zSomPNS&aQ-P&iRzlYDP6z zTukfN?A}iIB=z0LM6Ue0^%K6h#3{*GD0l?ULix-K zE^Mnj8u>m?cydb-KWe~=$TJkpS%fph@J zYW5ZI($!Jtiljak&{6e?hE(h%TjhA1fKzzz!w#^Mn?h=(7+evIv_BF)EllIyo-6^M zE9a15eC$T;HgAn2cb)lk!jd~W1#9FNplA3GHj+5qzJtQB8#u7!ReMjuT>K1#K$byO zDe?org%!uDfOUGuK&lioyI}nfxJE`sDC<_t0_KZvZG#q2>Y|zueka~i%F4}OLsLGB zja8)lsr=Vh58-&scPI=uqRx~JH1dHyh~_sgm@_k0I6jPXV+*#|jKO)VEHLU1XDd-= zeeEgE+@*4L*T9X|Mv`ntzeHE#A$(bWE|<>q-KJw~2q0oKFP$ENk;~-S{vfn4ikF;v zA*ZGb&%}*O|E&I{3Bt3lz^r5x88%BMWziWIE?b*q==N7@Lz$m|I;B*Yt%H8l2{$5r z4DgEt!xDJA38Xa7kd91rxswkU5SqU1?&G^owuWi785(Qbq=Fq#rxq{7cTSaeRbkr# zSVC6IWoFH?l(=^Cp}g}I{&{KY0ielMk~=@`z}Ue&1mwi4UhS*>_AC9@aVzd*YY$fvqdEotVvwiS4pwe z*;)ijR`jR0!pVt7g()%WtspCQi4m!?jPpm>R_7VmQgvK~X4l4-y|fh#~2 zj-Vznp<}GcQYe{Ob1VXkQENn=F?B^Ci=iPq(Y}ACJ1t1vlC-v1N-Sgp0IfJHD(r{} zc3zhvTH9JqJdQ^hjLm91AltjTHhc&p&~8~V93ZF{nva-vWE;nVDO&Lf9;Hc9cV8>! zLvjLucQwlPh{Tn2(59!L=1N<6#|NU zV7Mn0h$$4xg?C~lDo325uXY^M-W8!8)!o%qN0DDO!W#tgB>iHt>&Dt3Faf{-003zr zog&wQqE6=UmA`T3~nW2%~{Z}k5}352C(ln5Jf zAsW?;B@RX!qmC;?wBD8kMcUUdg5m>_^9d{Nre>KB1hULC`LwGk@S6oPjkp)!Rl5C#6&YjpWg3AUuTA7vEh9rLn65DZXu!@#Ot#+CwxVE`Ne z001@to?yBq{{gqZ9$LQ~6y1!=^Xg52gD%mREJIe=cdIFe^+XrKn9WFWc!1Kqckc^9 zKUd$ zmhu_ix2WIeN>6nyQleUF)jF|por+e>;cW{f*E+#ba3V(xS*P|jcGK>8!IgeGysS|6ln^8i_qweT$ckstog>1 zvzZd(IL{+eI3It>yLc*TMFp76YOgn^JT^;oHD}=2+8o4e4oy&t#Ve}YvMz8@F{LUO zMS?aYUJOZQpG|3tK|v8|+yIm-5S`*sGvO=%JHp~WGGtPK7!5g6?phmkgb*H>OP45s z#)CnCH~;`2S3#O$FHnX|rYo2K003uikHFBIl_hX1bBvof28aI|VZP!i#?3bd_NLd$ zSk7-4G$!tv88??*%6_ghD0hH}UB539;=dz1tb(>6izP|$Y-^tyX~t~0nAWv-3{DUd zuij|$Pl4%qBs0*qZC8<*&Fz@3E>5|)rfKex^+)grc6r^#@6gKA&L5s^X$R6N2!f(O zt)#53&byJOQhH5UqaIIvyVSd+P|z}s@yWvmu%xRd(K6{#|L2i2fqL~+8$cqIJb#DY z@*x&%4fFVETtKzmhSw%->QERn(@>ScKe~Yq!gVIW|&at zE|Ry<@~JRhuX&V=S13fJugH)4000930Pk@ixf&siQ2Vv> z4hh7t3!sD+j&;1G{Mk->5dEJ_LB?ule*=(_(-{^;rKw^3#V}E(-M(HL1O?+%wt#T}iyGW*GnVU@!4=HBCOyFWoE%i`jh|qeBN?KXfP}V*X{wfm>BVjg3IE| zorD}Y?-00>Aq%^ixcJ%UkmJf3i8dOLQ_e|P6hbd*nE@@s#rS9)`bW}m`1 zVu;~ou*`t?MLE1;4LMmdr}h3O2jSq286lUK@#3x2(swm8e*nzWKcBQ$psp7y0C_-$ zztF{Lryu|Yh<7ra_5W151_h* zl*avL_0iOm;(&ysCCx)MvJ~O_)AzwPc|Cn_=OnD?i^k5&nj(Z8Z*q~|3Z^L)tZnuG9HC4LZ2rAZTKs_ayvLKW@?e%l2y3RHp8 zDGqzDylMJ;_xc3L?Q1g_cK>{T)bj^i5Ud=$z%lx82rjV`d~j2ZluZo(DqT{}6zP|d zey%b!2lsjCHZ`^IT*R$KiQ8FK9Uh7WtDQD*QeCR$6_%mD6pkzGA(uMc6gxtvrRzvE z91TKeg*@Egkb?l`m~adUqnaRPx2q+l>8IRuGh_4*lTl7X5$Q*Kh`tEZaTr#@%07UU z@Qj$JL$K1wVLBi~z0)6Dlx+{%OJqxK8J zUPn;XUNDlst5p)Ngb^ORa<4=4Knf);>X@E9A(9dozThrJrUrqxue={+Vi!}(9~=lW z7eX6jg=+KBf04-5rn!$Sxz%&5(@Z-($(~wQlUxy{cgbOiI%e}?PJVE9_9)Yyk4DY& znnd66vI4~`GB8E;L9L?&{fiok@&+Sp);a@vANDAMW9<$XWOudUG0D=!LZFbig5U0^ zf_EwP1CnuUy`v<`_kAX2ez@t)bIfsQa8@<^T@t{LF`ve#dDD~m9N${2m>fH;1tb+z z7En7Ud%v@61pJ17vmxAg$6wcnliG+~y5tvO-$QSGIzm2u4bYZP)s_TI)=0>@4`sKF zE_u>{C*GK?m!_9?*tXOkeWh6|Xpf*p;%{FFQhL~kZ2$M0OPusuRoc7p2w?W8Fo+5s z@SR_xZYpJuB;Bcp)e65fZ&cXVQJnj~?jvY+U5dvTWAOE%pm0gq4Bl+v=MF3^2p__}r}td&(!kz)$5)i$)27z__1dpdDLP{CtX~cc-mf{al&+A{`vx)-WnSK?hm{Th z4hwA5?xLSaHsJ)jHJ4qj(5l393$>!2G5OF=(jm`MPU<526^SwSA0!r%=aGi8Je=Bsx|X@F&3nRbI8MzKGK&q zrCa*ftEv;B%|Kms@!J+90f6-$2nYph%VXF#W4Rd6FI3U1>b@)VemU&B4GM`2t2r-J zv0-o4cbHUGR8+>~>d96;i}HdXQkr02OAVOkAnh}mj+fn#IuAypFUqyl8;!1ag+zE@ zx6n$~ONmDYLL(rM{llG4+we!|N0kOhOSH&(Ryi@Wofdmj67kJSD6hRmvRVAWUcM3z z;`qslzSNY0x_9U?(-@FYvgEknH8I}-Yo-8#C>HQ3^9>VHpNpq*e%J?tb^dZ{I2DOS zKRn68l)x~^G2hHJKPAAq3bLawehIV0_fU0`zgao?B7zKRzQZ-+=k(FSM!t0qFFeuD z-DI;CZ|sJ>l>&Zdrv*t7)(YiX0U`K$TcaJQVNoBqnBcOy>$Gvt7UV7f0(mqhjw}r? z{C8%fA#?in<-m6(GX9HJ)LA;8N#OKivpuQaX_8Y4zck3YGB;>0MYR0WwOP0dFSu6W z%U|O|69F={{)b@Q{!7GgCaq>qWXEil!5mkp%A&YBrNhfHjYG8m#wTZtFQ)#Y5-OO} zi$R>|cxBBXI|x^bC`ABb3W%ZgxDa1t2s~Cu=6X}>RD(e3%U`ZgScA02OVa(5Vlyma zQwna{;)`-t17t{V0g2_vccWQC- zQ*v9Ssq2NuC^OT#@uZONUn0p!u((p%J&xz*??k_wE+^W1crkwI?Iv31s9(|Yc;m5+ zXhD*B>7M2{7wKEC*lHJ26XE9`y96|_DyPdEvpU8O*3xSnLxMLZ;>ILO7ml2=rv;g) zmC=0jT4x%%d89jdMcI0!C|gS8)BYQlp{rC@-jPUCk(0YgG0iH1aEQyhr>6SiLp-CS zR(#<+o$iCq(w|}csR+nM*2;Q88HUrD;mlN4UBYn-H(e)*nl>3<5+RXclbYKVJ`H6$ z*`wWgf1Wy1(BnaynT)58qxCq`Jvu*)=h%AUZN~%ZKfbk8>ME>k;Y6?!2&8t?E=MkK zu0w`s#YUCN**v*mr!nV$#rMhj#6hToOLnI< ztA)h?=F{{39FG3SYli>u!3e!P@Ut6I{-fh$shKtmt`_>+@jzJ@q*!eW?R=mr6{8vG zvsgBw<)dy5-~)Oxwo5GrEMYPS5c55@@#oo>C*7UO?W-W6RC}IO1ZW_|9_BV7l?#*M*u-R&}&hNx&w}^bYDGcg{M>;=uyXsLo@F_^CU@ zl#DSnIbF44=n-zhmnm+i>Nh|KA2Afw;QuxXnZu^&B{3LK^`KIe+{ft@BOmG;b&>{+ z3DZW^&% z>tZ9zlZ_IN3Et-?)g(b^qnoj4#Xa#j)HPCdH7gSi7J(e~$+HUya_O(uF#s6-BGXJD z+~@+QTFmr5=qdh?L2L`Y?x2F&;M{?0Iv;&u0~L@&mu*S8u~6eqNkQP$pkFgq zVZ7h!Z)f~?;5JD#K}4O8h&Yy zCy@Q#!=}8qy?y@1tbpPNchJ8jUUsWQi02DTnW+ypP}Y6L5Ui33_)tQ3h8bP%k$+)p zA-V&leD&A2eu_9FCAjc3FqgVe7jP|o!NKQ8;f~u$F!KJL;hfBvXr+oFX=46cm(e-c zFlA(V{(bE!kv2i|JJv{M-x*_O&Lv|~SA5(@MV`=(faK|>Ml9{l<;mzbv25Te)rPU| zdF=wwViPa1ZH0$?Xd`7FX~-Idl7P|k2nH%w{y3I`DPsW;U*k%ug{NgknFSt*KxwOe zv-5`NBy8Uf&2koaqLM<_^rW|$IVeD!N_5A}%LC)`@w_WV#gJqrl>xU;C05`8C?P0)2` zB%pyO zvJm;kcmkuyzAwoKY59CCN9~B0aa0tvY}4!a8Sj;)EYI7;0jL3zyQZ9hnI(D0>_jNY zF^PNABUmSl=bapTZrQp&f?u8wqa1(fQrgQoZ?R0VQzt-HL=I~(!BCmJ7q+~1k`u2i z>RwxCh;G)J*Z2E;Yjs~KXg_dhDdR9a44lv3vSTB)(wpF9Ycoi!3B&Qtz4(+i$oZ$p2ov?ss+y)kmcq@r^+*$9X0NWUceG? z4kf$1vr$8o-w?Sv^C%OE$C;oRlUlnM&xJc`A>dsMwCQN$q?aT~EX@(mywNpe`?|%> z#hp(f-O;sP$?po}@a)^LgJ?AQ@}p(sQV#cHI9U9ksT;1y9y<)bUVMF_nFnBt>TW)# zZ@0!7(+fb}D5#n$^Qy#Ii%Ga=;xN9Xub)UVY9S9#24^r&n^FCf|7i+M<&|??%em%t zG-_6&RYX+ax2iz{AS{u=Q&Fg~HBLizL2tEVw0g&+a@lX(ti^!VGoYa8Q##O;({i$! z2oZ@df2+l4J0+Spfgs zThB3lx}T+T+)SWUpulB&vYmX@{~y(2dERz6Isj# z2^s5tverW2>D^!xmIZzb>10*y4|8o8B2(2<;-N9jQdnzkKALW{R|zTtUAk?XR$Yk~ zXkHjtFh#GlO`A-c9d_IhEns^%Lt2voGBs zp8bG1xFVp-{m!1~HFORvb*i}V&ETLo*BiiTvTB>>0Hy?%4iJ$##T@k(kDP8Y6d1F_ zE)O~h7j>sXB7`X0-gy3AN~8bYOMdUQfouG$skAU%16ssxcpyQz(sCjgY6Cg=N&th2 zM9=Bs7upOa4Xp6a4qrQMZfVs?*K8NbGOAh`FGOXC0&i`iY3 zGTFj*<6b(-q8_gl4`GF(GuW{1TbqwAq;0`7i0>e(QU-uJ!4w&0!Z`Q%7scE1bSgeg zH#6~JcmPHCxp@ z2BRT4@(`41C$)&R4UyyDCQ+LAhP8Y_PmtrK&$i6Rxbo)k7!8&f*_?jD#{g01L2L?G zhkVpBieA95k!2^vy)LaY5|2R|ZDf|^;p|CPnGK_5_OndTz8Dlq>akh-3uBKeFlTNJ z-Y@FVWlhfDalE3%6?(uE=|kid)381#nda*uiHGSV|E!>7mh*tul6sh)iB=MfG3h(qh1HDpS&~r0;ZvW6Tpxu4wE`5=w!m&$;l-P{qj&6US~Zx628Ux0dAH z+%d`r56tDVuOxpP94`F2upOp~*ogRN|6lP^5aa)&Ot~2dBVXv3|Fm=pmV~PvRT|k<1D)GkG@V$q7R}Q+pGsjk%b$J&S zX?L}2`Jj5}&l$nOsDtg*;XhF>m>Mei?x@On*#-BhE@xl(E5M?~kAngRxWPu} zVgXiNcdb15TZ9aGCPE}Y=1jfpYFv}%xlwOLUx=Tj84mTf(GS!_3S|0~)RPm5jn>9O z3#-FAhEGp|Y=(wketC-T3u&9(aYc3#VwKU$YR1MkNBj3pcO=|w>8k6qbbzh%;Y2|f znbR$|2j!rySeaa+$UCISB&IbTiKh`N-l^#5HLKu>dJ3QR$kk~2M}dq#b|fsGa|Neq zw18amjb8$x%0x+yPGqg>)%EF!0M@nL)?Xb&S9mJyB66;f5GZiv&p;Nwf?wnsxHd6P z5=O$^2kY!bH4XRU93b^^3@=khI!`$B_OLA`bdHTM7Ca_)VFbSI z0s`TQZQQ$o)F;04u$gNo>hM%x6o|+y;C;(5Ss(edCx1pPC@A-x?wdG6La9@7^*)lJ zGEsGgugz2u+iDwb^_xtLf=wUM@qNduI!1w=(JUP9=KT+(duaAcS8YFLT2I z%*UbDCLwqX`B^e8cBkBZ068LVJs@Fpj$|0pYM?p`$AK9C2d$5Uq`V6^iGCgqcC%WI zji__rz9f1fEhK-%HINh^#eL)F8woEK{cbi?I0c)(bm>-(pLk`jcV<5rK7a%$eC?;L z#g5`hf#OGEWn=*;}2 ztcy`Mn{*Bi9b;de6GV@T9^vQCu)K_{8bm*;xYRy`Nc=;Gu}|g`aHCMgEHV)F&LcvM zz;GT?3f1`*+P=uE%@(PtF$C}Mxs}zk0kjr9Dg{48$qk&^ORJx7z|&R{HkBb(p?zkD zRYt{2%sFI-4t|^B`C6l)ZB!uOWCu=nk>iff_ZmM}QC{Wga-cFP6(v7nC~vQ-c2(d0k*qup;cdc!^5~i=C=RFK9B+vb zwR=tr2XR-4FA(%Z*e#aNANFY@4`%RmXCfj86>h zM*Mf%m55xhJksi<#7CjpL9&9bvC%z%K2s*AugmkP5%(RKzLa##`Ivp<`3(uy)pjow z|24PB-MsS;_%I|9!hYa4elT925BN8W8A*(zI1c1H^^cH8@_0i! zde)05kP1(y@u3gkqp|hmL;wl+QkQ^wdbvy^1~i&Tq>1^G<(~n|T|tL8L9+i7Wc|-1 ztKstp_mQ1c^2JvkY6l-0-tbQC!O$s9_}+T1yNz^Z<=LDWNbwe(VU>*_F= zF#f(7mm9_3EUjx#DLih;N+}P(Qy0pS4E>xmU`~1F6(TP-r!1vBJ*u$Tv`?SsH}i|+ zgXsQ{LGg$Bw;#n3%SJjry)ThO9DBZ1U!Cpv(ZIt+;I3ZX?LjFuusw-dOs+|@PV|)~ zrrIAdhaX@?hF67-WYl>>sf)`<1_NidMG*t+z%Wx8XfC_HRfxHleq8w1K&zLg97 z$ZuJzYB`+Ny-YUjlqB%YNtm?~!Ye()9u}$Fw-nfY{=AzeVdTO-2j%DI1Za~Xj@6Ni z5ufZ-B}7O?py#PbE8Dp!_x4TT8nY>BSCtuaJpRV5;;XEh<;b!@U)wThQJMeB|C>KSobM5gGQqpHxx{n&1r^GCG+u8!RLM01Dx*ZXa2v6ytDh~? zQ!(=XmAsi*A)q;)slT-_@H%uX0=fL1kGJ+Td9&!*5wRVh^u72!lit@X-+WCRmvC&I zMym*kZ;^Cm!slPK96CYJw8#X$w}6$pwg3?!?dzi+0fimL8xdY#$RC`pU;AgkGn1gG zmRF%~T(-TK?!fQC!QwChzLT1W$5O;jZam58=chU( z#Z+II?%6wX;7W`b$){6d-l-cBm<+tXnk?j4SMv8DaUGsY`wD-nhOVxL(|Fj z{G8E^Ojq9V&+1pA4hb&MHcc$?YJJv#2r*;#!klzxZW$E>hqaXQmy!EWo8x?-Vw8;l z*}!%-OH$KEhpi*jwGu9Hh73^yx0D_>Ol4$ik4kZ@oM*H~TN_|oY=cAC(28iZ`HKpe z%h%NqY57K*9G78NHuDD|2t9RH%V4(=!1Kt2AC{AZTbJMBOwsn3cpWRmu=<~H#-k|QlzyKsmanvZ~fC|$c> zw+7|BZHKO6DS=(Xxh6mqQprR_PIkl|$XcXz9XLeBi1{NcFD6BsAMa_2-2bso>GimY z7UkYlF{?8cgik%3N{dT4`+Dm3HvB9bp5)B>T*f?k)$cFJN$$F28W_4Gy6O%DDYys= zEqV4XUHb?|wVDm?`HUMe=iR~;U$sK3X|3jXQ0oA;folAt=u<_>#~}?dB_8}~lN-#b zXczoHCZ_YR6`k;xHXwzTVN@Sa@CjUo7f=A>fFT;y4U!7X8vq;%j1>!A+k~20UBLAx z53Z}Bei8Z66?0Y-&(@?6<%}mBc^ymxEeE&1D^iendM--`LpSxvLQn~bWo2H;ZKUqLgR`{RwaGRCo)(jZfjd8jQ9Hiz z@NcWc3qraQsv$_%*)wg8*ATgR%2Aa;G{ic_MdB(%PFDz15p~o}Wv_UXHIs?~KuZ$h z-Z%jjk*gqpn24*cOsU$NG=)(cOgAkWV*n-qH~;_>c0rniB=Ch~%3w?X003X_k30;l z(PU+|ZuR@M^qHbd3>mK*_Z>?$Ws3w&+HtjiVj^B_WgQ~CFuo!;vHoyIVv+3^0poga zMnF%3WsgYQ{uo3frjMgZ1AJWp@+h;ZY+L?=Il2*0&BGsD*~)3gS!U1r+ zN_1kwFTwp5GPMIWGTP`;?>@zMLvZ+W3eT@{%GJ827)w%~Zq5uRrzqyma4ar6h#HvH znRnWBN|X}4)c_J+ub0um;$C-SB#pE8&}?U~;!y3rXN=skbT(fa+@uLIN-Wr3GCXIkPu9D;7ENAMzC(tZni|#)v$vt2rUBDOCQpPEQVYc6eGn~4$`D{ zs+GXoEg0DXK$RRDqgjv1@NAl)_p(?)kqBs0V2^m(-PH>N7Ps+k0-ah>eag+^>IB9wY+sX5UjiD*N_RlG*_yu+xWPql9x&8p7eto ztQT>XvWmM8%xH?Abp}(C_MyJpH$-;m(&p3Z3Fh9MAXal~h#C(4GjLtJG>Gp?LF~Fj zlklVLIO)qfijl6WyGnU}%pDeZCp_EboRG|a!u76oppH0sAXVO{$=MHE1N((<1U<0- zWa~~eugVZzvDAum3S9+Kp19xnIT6l=xkXTP=fxypLoiJ}cm7leedcRG0ny_>rCRt< z!J!v8_IqCI&}Z;>3q&B(;@k$EPV{~j8tS3GKU(U~XP%SQ`);2mj;SKJ}Y8la*TKRRFv99uUWMLDZ5 z4wkPvvhU+`ECWEw3G!mw!S5J?#nBh?TL5vY8}Kkz=lLkaD>W>i-VkFrb5S(|+vZy9- zm^p`Bm06zO#2xB`AlOZcY91dsJlr%}+M@9&lgs_ht64~8=2{^>!Q_6Si+~f@*5h72 z-Sh>RUHiuC4Q&~dg2ZcC$m$(m2u5B5i>9sVYzX1hr(<)>u=nwCei62LfLnMVZu!Bu@!j$Kocd_NBdoFFF*? zc(2RA$ypvt`1*^Wkd}qH8y9(nRlTLouR8XLS%J1AiqnC*(rzRa{0r6mO?}kuu9x)= zO%SzQKMTf@S}JcJ2h5fiBdX+c8844M9Nsej^oaB9h+mU6;p1Ba70b84g7YmG;;)dhAcg|`4c?5SfTP{cbsdzfPr?c7#}KV_K4 z8FNLc$OFw%yKfGv@~H zD$@9ox&CG4bnsSd_AfQ}c$aPUBHufA@O<6MQP+w8@T*TcnGJ+Md)xS3HeC2WP+kR# zE_JlK^&dMVyZtCqDm_0;;z)|UUI(8z*vMY|4uFQ6w+#v$fk70+&Qn(R3uv`ivD0`Y zzc#{C?sxP42l0Xj(Ats`O_sa?_Vg(>Sp*Nc>JLsc18sv#m*pWW6EX4U;dAsf9(O?7 z%|C?_Y+2IAsgy&m@r{CQo^1`w^v|8+;Dhg#em{HwOCT=RF%ow$^5{QnO}-bgh>3`! zMPN*!VbYSoy)bsk8_-3*zUvEgz+&nCJgLq=ghouM>R+OM+qc_>DVb~LGH=KTTlufu zd4|IMdvvUB!URwlwba&Sewh^lYEhcu97Yai_8a&HYT%};hqiJQBS$WX6t>Ht?$$c7h14h2(VSBP6Ot1 zy=-R^6^vWcy?xIKvA)>uoe(9EZMSkL7#E?WKX2(1?>{f;LkVA6j18c;HHVr1kUg)%xI_#ii9OAPp5{6~hL7vFejLw9QF zv_p-#6+H0StV zGWYZeLqK5L-FLLw1aGx3&~xVyEq`Lfik+omT&1zm$5>w|go{5)4D#GLIY!3a*ZiHR zg-~dySDXvUE%1_~6zT@VEWev^7hu)oOSy47uM+@V<@s+hqsLYuafsL05~R-eQmCr$ zZ`HM%N8T$_?4yv_I{fR%`%^I9e5g6(UX@C^quoQp&Oi)_Lv3KEHJjDfND|Wa7T(P* z>!I~(zzd`EuU>nN5?sV!4@&`8X2A%Tjc*)HADABFm&Px;x4V3BsIFs9{*MgmB>Qvh zVju;WdaGoye;AvQ-6>Q5q(7V<(?zt;ch-Wpm6|Bx=C8gVx7s-Z2{*0-G?yrrHX)Cq z=}Nzj6qu4yob+W1)0Ew_`$##+er@*6{7G#%S@k)*7kMt7Dv&jaLckiBT6S?jB)hh@ za}fY(u@#iTGbUg9VbJb@XDIY*@A8N|1@NRh%G+8o>$X?kq24%|rTeA1-`q3p@B3vv zb-PCZqv*Pm+~p|P*@$JkO(5M;DCL|fZWb#IHTsH5kc`Y$+Gp%nrHwpwW3I3P8Fe4WiM!1Tyu=yj*I}ih%{G zCvM^hKSjzlp&*G4(#elRj+xmGs-=Zxuspph@Dy%k&I?05EPy)(R(Zr1xbE<@p!ZP$ znSYwRtGk_@Y`E&^kA}4QjwdX9mvLZm2?L^jTE5drtzPldrl9fXpp}vQSo0Z#k3J-$ z(XoaaUupPB88b{xCC9=_1cn`uQ5}dL+^*Lv6kZsw;#(l3k=zyjmEIQlTL!^eBS~F# z0blRBXRv}?mr1Z^WS0ahw~xK~_!+th_=ysC3~9`NCR;YS!rY68qz;M)&Ru$3)ba96 zd^tdyxl+kpaB_!RPK-;`j6UY+!KrhpS!7|4`yf&b2L>-`4dsWnTUR)gMs z1Yt`URAA^gQ|T6$H1edsu$MrZ53PBHaxX$WfGANHjP zq(D~LTZ)WG(Pv7eqcleMrjUSVr=Zxb5srRXfHxvtk zT~c(rL+Tt5#36&i=5q%(=dan}3t7FF^Ax+}BzW>@EaJ)|eZll?PeMIh=A$D2O|K`< zV?Vq{!8Ndn5Gq~K5L_GDDqM?GWb8d1EVe8Pg-9@%0d|_IodflC7>3r?xe;;xAeY>( zF<7zro~sF&+|9KU=)pQRI&#J^wDRZ?Gp~QHW?wUsDi0Zu38YJ2Yj1g#JGC73?RtD7%&#HcXnrAM$}_x^n>KE~9}14z-FCD2HsA z44jaHOyt0s8|IgucCaqgr?e~JBmXc>erPHP_HCGsV*&9C`TiKkgao4cl6bsQq~BN3 zTyt)l%+swG$e2qilKAaw{=FK0o00e&l2hgCWk)6hR^onI&=aW;e>wNiDnv`Ea=d-d zJ^vSk*JHxln;^-|#Tr4sJi3Uw>nF~I%Mv6{aa(BUPqkjHmH9BYl@QQMpl#M9R4p(y z%vRJ_W+`|<+j&tQm9Q0I?)%^gt))UDQ^~>cBFV`kAg7*n-T3}bmPVW1(8=8H|Gwp% z=@}n1Xmd1Ln9tMp24j_ym*i}SI~-6vt)hg1b|kYuOv6B+?Aw7=Zz)B>selCyt{ng* zmVPcJ^tt5v)%`STJG@6?K3(X`j?$eLMtuHi5WKe|h41z|`|kQU(?bU39I1j@HbNVX zWxmmOodvMRWW4@CRZ{pkWHSDV5{toz+jrnZuPBfR)&Hg5Et^QF5(4h9Y6;;aesNO6 zmTwN{>$M5dP$ardkY=|PPfpYYZ^n&XwKO#FlBe4ZD!X0KxxYHRa0u0xr|y)B_(xIk z`I>3ku2;)0_`n0!hm+Mn+!Jne^lErVY!To^A=^>mbHcNR*Ce9-_HtxN=?S+W&7}E^ zBn=J~jV0mQe_yTY#b9=XN`t(0^q@_?t{k_w4lTHGk|IP3F`!G`vcy15Z3r4r+_ED$ z$ce>_(gGsv^4}UbKE+!mSv0!dk6O4cCdl&IT#>VhuKFU+J6wkE+?A<6-6bKGn@2BE z?C-W^LL;8dd3xat$H3KLTHNHl=<#cqaf^l02$R-_N7Sb~lflXoi$A7Hfw@;gmlQx4^2+eb zFGy5~rc(#=O8sltw}r9m8n0|^@7~r^X8QZwp0TBK%MB1wNaluOfmA?xX~&*bkA#y8 zrYS#vVf~oVPjm>56J;baz|>U6!r6&phSu-pCBH*W_7NEng@C$d-39tg4NdOip_Cs1 z)2rRAe|Q4hQ(&up@ykGRRW%QTBBRf)@htM4r|0BeOMEfx38^?ymW_HtIyVO$T|@_F zXItvFKLJ3w-DLW{u-iOB>j!5K8sFLr|8C@(qw~!wmZElayN13Q@mo%c3D={cE{+5_ z1)Iv~(s6IAzCG^PGw*eHZw`G1lEL5QWl!k%f9HH07J{s{m-&^I49VCKP*_in+$FF(l9Wk(}EEYmn=_Z!iti??Z1E%N})p2330@ z9Q;@I@T#B|&!by0_oW=5HM=v=@XDWa(bw%5*g>`SVF^nanEQ zd3O#t+{O@8EbXMu_^(JTM7yoE_Dq5fkG$}r=T-g}Rw%Ar z@p|fpr2xbrfMrVrCPao(O{^ssTDvIG=M5T796rWyu273Ev(tcP<1H8}SLr6TZ7`K? z1x?S=d(1rYW_U);K)WMUEXb|N0eh86=#c#D^?BknZ#T2oW)O_cc{aEUCBBw@kvN-H zeyTQPaJ%6@y^KcvJOz&8Pa%vsaZkBFZ)6x}jfQ+SRyrbP0=!62F`xQ+!-6!O*iirx zz6VHY=RbTVa9;!axlAJ?8B7Wq1m!ERvd+y!&f}=a|Aj zehvxM63CbE!OyTMoxq5^W5e^hCD}6F8txamu!G@-t0UEeaFoj8UcGi!qPZlg%l=+D z{E=?2JF_UiY;`YJUTN^iE*Jp*QVqm)HU)rb2Etwg5Zetk%mmo{?0?qgQXwrcZ+6&k z3s6;`86@D$`$tRe&<{n#b&FdI;R%bcPwTUNe4^@nt5SyDk6x&`CL=ca_#6tvQ!uM5 zOsdWkd#Ij9S0^SsNCr}Vqn5h|mwh1cql^S(*|0<)BU`oSX!fp<0)-8oMQH5Dm!T1E zG>bNDCJE5;>pZaKc-W`o;)H^y$22X_4Oj@doTsI*rqDYh2O@H8b03Vl4J!h3tTEF0hav!b68PqXs}uD0>KI8)K-P7_p)k{B!7K?sU64- zl?2nONBG#QRfP)P9>}3X$s8#svOW+Xu#Yn^%&4lui)j8G8z$nBN zFc{|Z4=v^#%aXY;a}2r!n6mHVa6FJ9869F+6OI~)3fXj%heQRmMq!8CtJ$z~CjS;X6 zA;h~C6rzi0zJ$BGrk2_gvfy+{_0M_oG8u~*o~g)oH-V-WXqUTgRSi?@;5T^0MT^&} zN*YYM|2AI_G{r)TsM{^m-QF=pI+M6#iCL;zFd;bAC1V^NGi>CU2%}822Zb5}Y8OFC zP*Q@bsw-~`;m_Axt#pX6BWWxyT)P52*K?-5O4#V$3#DDvRT^_q4extzay~G?000aD zzyJUMf+3!xHxmB>D89#-s7K&^%i*2WTn+autZ8ac7h55brMzW@r>wMA>2g+ zU(QcDiBgLXV8SVV6i+t4x)?8M`I7!yJRKyrh8tW=VUkzZw(iuCc+A~{>S3j@y|`u1 z7JGRIrKYS)5Gs^(O}gS=k6r+W!ddyvCkX0W$Tndi8r21o7&!olKmpTW4H`N)Ni>5Q zC_&2Vx{ouDgJD=ru8Oh(WFZaICy>53Fa!kSKwQXPi;#`rxRA%C_iUe=`SWG}DW^s3 zM5fSOgja+VV*=())%N#^6$qyZ1;B-9DHO|+AtD4)uuV#WsgNyYgTUTwZ0PpI^(*y<9AfU2DFo7^HNT&r!)FmmFVP*mW ziBw84S$(PAKq)r-lb7SrZwAvaqThrNM=3AS^zT}XffB_+i-fpr!V=y*!>v1B+&QKQ4+sDN2o?dJ!?H<#0x0T;5^l@scE4X% zm*hT1_0#EeAjg5jH7{C{$eZ(3kTmhG45Z{`yL<;b5S!`!=MvXxeQ$Q%bKgWMJJqrF z*_E3##UoQJ$xnkbnu*gRwtYP{QH%;wrh=HIvcMpC;qKUk9!4ew-X-5dn%IDk;C8J4 z<7BR;>8RC_h&Yn2dYyp7Vi*h-jk0V+X~s$wg;hoy-h=oEa(UtCz&5Oj@P>{cGlx2L z-2mZ@V&qcJ1W)LEa{}%rj~RXC5At}^SJn8et*B6b{fX)l1q>-2uo`VZ^>*+h2Llvl z*1{0Nnz2*RyF02eJfwNfyXy2mk-1Tf>ix1$(0K*1n{~d4OdbmrdEr#3ERYklXRJq>2V{S;oxLc`D4g8qf$UZ ziC^N{cFv)@55f$-HrFZ z9QNn72$dA6?C6)o$Gz0sHI>Fx)i33)cg&(iOnYaF?kFF_MW=|wtbaaHXAL;*7m_AB zZ{p1CTZ@R!oi9uwtw_yOF;x(vqUH?!35T^CKez#-UB$AD-zC9xh$*t(W~**IcCLc8=aYQViAf#x)n z9#Pe~WY`IhRvYS0`UDP3Wkn1<^ojvzDKyGI99LxKugcw!ou8;3>;?@d=nDShe9;2l zm?heCT*uk2j=jGB$J3^`S}XjpQ`AM|FW)Xq0XG&^Y$3FTm?-tOozP)!eXQ%QYDerT zsEx$QPAWyOe-s@%ocKycC9CheWk^`f4u4{_LmNPhZz?aV#0FCFT{|3@&3JTvBhrJt zls|vRDBK8QC@oSpnLk|DvJvWEqx;wkQ9ahPuA!SE%kKSmspyJ~b#BZUNu+qN@T(#D zck^c{rM)-TBv4Q}^=o^I4{#|EqX}wi!p|7$#N@NdSfeK(N}&?D`f3|#=D+g2ZF28%jMa;n7bc>JL3&>e=)hiOyxbZxpPB)l}1Mj_C=*oFi!)sy%{%(T-CSZ!C= zR`VRzH*X6u1HuuXlnHGCQ!n8opo4mFbhH>K#TeIV%{^OtUgBtnV*GBATQLTyVtyk! zq@p@qKy?@W*8r%V8ND=DLKD{#h9+;j7E2;-Wyr0!8A_0QJ6!rAj+9nJ55fsBufjqr zt1aU+c0c2#DlvwS87^v~48dD{ta^xS5kI!k?;v{%wgOVio3|1-vW%K=_uuvd+t5*Q zO8uw2Rq8}_z#p?e+0TF^I;Qq&>D2;*%j)GzdrfkE8M_+g{Hc$|j^+>-&~a1FdVjiG+zEbc zvR`H@%1tceP*&*XhS7tX0TPyFoRyTdU`4z#Kp6xHnrgfLs&!?twGQLU*MF*eV=}Jq zZob}=HX>sa^(3>&FjOCm{wl-9AjrSJ$X_Hq+YPZ3?>$~iwxj<)DPu&b|069R<5MCk z+kEbr5o|psW$dVZIOV>ubU(IA$YkmfB6+h-e1bE z>d%kIEat0YviZ+{{u!10N8r6^@Cm$sA(^g24eUmEG{Grg-N|I(=aV>OwgS%^+`o9b zDL0l@EiZ3)w*+S1PuAMn==_9d-15OE2R7cCx!FLOC&~BubH;x+ctXdJ{4?*NTR(cw zD(Hf^FQgDVqZiQ|=ywV;sJ*2(b3O;bUZTi}274N3?a^A97X$;n8j(RlWn=H8?(5vR zc~pJ1)jDQ9P??Il^~;Ke$^Ci``pn2rTlASAzJ*v zSgHVY0ik+X_IGJ;p23{-uwvSw7mxwrAsW>sk(`7YfNxv~Kv^6o7fu%>0dQ%aKQ-oL zZ}-yWoVi4TqYinqUabr#3rq`$n!yv#T5C>40RWD|jz*NO#cKtxW!SkjR~L{Q6thR792pqhf!iX=NOybTbLG>B0}2!4f=?=YjW!O;Vd=r$xy zZ#4q+xpMU+T(}um0`J;$wc_8Yc@q1;*#W5+$UwS0dbA0&uni(dMfx0t77ER}H;ivj zVI8CcNUW3+QurkRh2m6R09`bey-z*fIQBmI zz}3Ow0{j+lnsJ*cnFufMerve}T-+jLgm+T5`#TSu+6!$*4jnC)2f5RegF#&bHK$-Z zJB+E02tM@UoIZjREaEeCIBEPY9;%w{Me=dHqr3;mTID~OdF8ahHkY`tQ7^B@SS>R? z;J2BVm!WgSfTy;v$-l2U?)j(`c-V*WDH8X0AixgYYfN(qkA{nUy`ik9F_#={^;?+Z zhE>Z5sJ8Rb^G6;s0~Iukw_u9-Q$0n^H-#dvu?ISSwSZPX1mMeR$uMp7P-lQ(Fu4z| zmM6v$bNgIJrO|lF${bhDM>XS^O3Yd$nR4EKeLSK}_nt4Dxg3T?YoF}m=`DKmB#hsXfN)hXd;2YG>svV9uMFto@%$8+l;7HW z?ryTqA!3-!4&9FUS+MHdUkRxdyD7C|qfeUL?*!Z6tX8kH1p8Xf?^p|teMPJU8kPLa7aa5NyzN zDekN{K%Oer$DGmfD`SHFxY>V97vCla0u2^ub;3{vTq9SGe zDa7g_{u@n7)5D_y3nJg51?oKxPX7R8K%2kJmdH?x**=NKM{qCB_)RHVV9bC@N6rbM z3XyLOLKe9^caR4p$k>za<~Ke^d*(G(S(!{-4_MPz%25ua*xFX|B%pGZ#lD{frtk&w z*)}(%@A+!^76~h34&&|^Hp8_F#;sD#=#&Vk3ls4ygmTyjB3ruvFbxT31{5 zOD2WZWNIcsH*%>(>c5%34^8&Dv=w?N>l|*JOyrBHI=;@iSzu+K6jjca=RV#*F2qcC^89=1`ivJp&wrQ0`*j8o>? zxA@UAU<(etN->j-BlG+LGQ$vH4_PU>0V7N1p#M;36lgbF3*Qr&*A092>e)skhZU#2{YU&c9Oq-($wFJe6K z^mrHR#=_iV(exPY@;Tt`Sg!hWeqqngmZ+V-k^D#VAKZ%*+vm1of1nREXVVhlIc}v7 zVQf`6M^gq#M#h^0VdB3QqSnzn*fXl_jK*+HSavQ3I=(9)Y5in04o(Uz23U*hX@p!9 zkltT2_R@kJkbnXNX2G=E5os#?+{K#oIfs}4U8)ZCd~laCyw?taLB_TE`%sj?*DH-d zg_^>jt-QYgEV)i>nnISt88wj``3~6d&{jo;TEDwsEZLFPuxfvAEtu&kTBDRUp+RrP zUv1k^jt!~UO%x93^tq!6^tZ}BjD_INq%vMO;PHtKtCv{}530CYvn!sPDh z0d4)K=F^1@_PADOfR|Pdyktm?=P&}qJFKC(vr8lManUJh)g&`Fy6z6ZU|_s6Am z3|ogE8w-(PNYfWQx&fJzi!zS~(5eLr0IDc1Lf;r1W8Mv8r86nMDAdevx;0PRk&ywr z8mc~1{#ces3^8Z+-&evN)p`Oz-OSQkAv8!WN?t$0uIMhZ2t4zd{Jbx~aGBcYd**b*rDKK=tPd z2TVx3h`q^CaEW0GV=dSRr&oK5Dvx*c?;c%SdA5Z~$n^7YcG6^P7kJ2|xCqp({DzE! z7Z|Y@LK!IfvVzB`pqh#UHmgTFlz33o&kaPgiA*YA{zA;FyCP_8EJQ#WhM~rC|1hB_ zS&ZFrtd6~pO#i;Mrz*);N!Z;3a^~07O%90_v=}Y07$Tv}fSUJoL1p5(dcFB*lnkADS#ruPjubNHid4$xG-qWlEj z1)BRD%EC&XEmPFVx}0XX46)MFF}gKhlpUS44Iy1S?RcXltB%Fy8Adl7PX#hDOgAe) zWDBF1ebmWWa`^FcGLvx!A;huaZ3V4fz{iwp?^m0V!|5tsme^|y`4l3V45n-21~2;z z=#L`)J=uB4+nM<{I31rFw7>+dkL)8>UH-iz$InfN|H@tEq~!q`HnR+h_#mHKErzS| zYjP7S3+P9KSD^EPd|a|3V}6&KLQ1xpBFGs(W)k=XPpAU#9H+6}q;|tnzh{sGbpa|& z#I(|`6U~-tHBUu9KLZ}T=4pmjXFJEQXzYg@Y-+P;+<^P%Bqv*AjmG;x~XNwZLTkZ9=$16!B z(@uQFJ`o&SW-H_r;vWzUoub6k*50;o6rWUx_s4lz{OyDZFzh@Clr%2VI0YRK{!~^L zByVT=;%X{$IJ(Ke>~+N-$dtk;eaiu=SFF=6(tNLxx?Xzz??Hf1O0S5ngGB}OlAQD;|xlAsGLV2 zWFe0GAB->G+->@H=Tc(lmr(4%USW>$6i9#;@gtwlw(UWx6*_p!r3@v94E%8?t$%Qh zRkH{=K`RP1j{SyIU)UBK>NF(quO&h<{0H?dVxX# zrcnzN%zM-Ag|j~jiuNOmcnI*{g;TGd-dSCLmENUAYc6h_1GwrgfF^XwJybRQdAys( zrOo8t6WT=Q0!YP6OW$ONx52_*GuFM*^{_uvi(NNkuqsg~w zh#bspru!-~-^ttVWE;J^H7#|iy{lUydnPp4TLBS*8A8t}tS)Km38FoL_L2>;Iz)8B z0%9g7u=Lx7eLWo%ikDVgc*Q@EAxn4GUgT%Cn3=L&a{Y|Ps&ht0k$t`$oooSAPKJ9r zbx2gjMhu5lHIDOF<>edo_~uc)U`55L49an70hWiL9*>* zX*2VLhH96gQ=0vkgCAqJa67NqKjR%&U@2SD1VvheB=sm~Hs}$fw>0-o`Ae%+v*R?3 z%x>m;&Ec4saMa4v4vRdSQs4Mh!%Lm7^fc&sR(g`=p7j}_Z=SoRAv#4zevDS=3{RH* zD&F#?>6~90zEXLT4z}QLolqAn*z>$Q&3p%mq z(PlTTbA&r)-K-PYR&$UnO7{!$OoJjKMdya zSFAF~s1@J*0;FhuT3tf*B=BDfe3pbB1Du9JJPBVu1e(!g0-Q5saR^h)#7oK2oOYLz z#_uDK6R~}YzsRx{_^SiX`msgo#rQ zqPBt{EvZE<^|Y~7U!-1Hg+qbM50F6VlT%+W^({_6YD-<=vFlQt$|<=%Bfc14N`OkU z;eXcEjjmoX4Bdk|_3}32#v`6tGsaIVXNnkZgE`3LFV$nKL5i%ivkgKzX9G36PB60R zV$Ji(7x?BoyIa98^nH%^3ZUn|v8q!qp$vE*-2-mz|45KJZ45V12w$&&^Ok}M75c{~ z%3%i^(f*k;SCjP2rzn0I5f8FkmJr*``nKC+Z@H9qeq=WcMye@F&?;PBV9bh}62!Rz z_<7251sd8=XW%w)hc%}L2u2I27PTkPDOlSsaU7;rf#Fvs9k|{hr(3Uox6!O8tbXf& zhSS%G8gBEo)vx&!ZpH=oO(}tA7`#9RC$eCt%TTo*t>w2XaCXlOoO2A-u$Z{DZIR&S z=hX4gP%y|Zd+l*iK={%P57ZD>FzEq(+iS;PHr%8f?xzG$X)rYVvS6Dy&9S-11YZALX~PqZpsNh*TNyPPVc z#&EB8)$X*`PRJYF>7MN$ECFmX4;*|mU4oofTUwvgtwvq&yB{JIjGmm&ggi6^&(~qX z^{iU%fy1ARI4XeVQ)cOK+X1s+XWj+SFSG~L8-GI5d3)dIqdR7;6Uu-YSYAG6{VoPQ zn6NWVt3wd;i=*@vRoX3bJ)D(YA(E{ng>nCIy9U-bd_2QUQo~9zOHqSX^Fb@)+B}U= zDousuAq@J;X#FBdph+P>(>m2-0R*XPv|upngAgu_%DQ%Is7?vs=Dn4gau#_ z3OG~QyoSKJkR*ojxx1Nb`2bKxJA*28j*J={k@K*A+Ur|2kFwd|m%NmH+EHfwrB`w+ z{{Uksas;T$45Nqm=J^E_?4HSZKk_^L}qTf(-xB`6sr@ztk}fgu{z9g+~pJAi5I zU;ws->Rh$i1m<@^Bad_1f|z)*pk+1^X*pQsn1m>|^XnLqvZ+=^nGuB>KnQ3R^GpP3 z<#vy`xOZLHTX9|bAqza#n62((A)Yowfi#35Sax8Q%3LPe2?!9f3P>ZTYO4jxNP_f; z70Q66Kr1~!vZ+owz=20(XbnIj5JHvlQcwkw?WEL~F6biYY7EZ0$gFyE9Q1qDaAPJ{3u5xdo(c&1fwzQ@gi!u?6TWMWPf#m@thN01f~E2%!O< zBSC2QN%+Ef8Y#zvf(e( zi2Yxwya_$mq6J%dW|8(~p5x)4=w&(N2NCiIM9rn;fL7NKzAVm{wvaDECtcyBcQdVI zM+RbVM*Z_IZ3Sw^DK^ZH<1+iIC=^)0wxyXpOz!(UYwH$#=~Sgb0Gd=8#NaCmse$wu zVh~27YQe@h0fGJW4B{vB4C+b5@9KeCSh82l*yS=H;lAIy0(0y}I=8DK1T<+x0@^fv|NdC`;N+mXJ3sJZF@TU1{`2%zXsy zhyq1tt_(Gb^QTE$n_lES=FLh4PcNgXGm&oiM$nIvU6^``MZgj>%fS`uOj83cyD26zz$SvPiUxWmCIU9U{p)#I6gu(W1+ zPCE})HY_qqmF6wvCt7QUBn!vrX`#~|ve@&u_5IVY&IUS-Fp>jgi*WU@3I#CoK3W5& zY}ka2zaoqo<96+DZGke|G1e34g7?i*%{MOXhy3o-PeMsT$kXhOhZ;r%yo?WDY9cFv zfF#uVgCe$Jos%vXB!C8-Hy&od;s&G4M@-f|fak_wSU1g&j9qne4K972Ja67Mwe78; zD?V;>vk_pzJbXp^G@M_c0XRaBD(xM5on>x9sF4kZ|c2ER(n4{2bo)n=b3}Y-}>cB zUIj{N$LWDX^0k5#MoQFb6mb`nrx5!RZn0NqKUHtXf}Ax@E|L4NjnxGF&Bp3>(AaFe zO^d~+BWW)MQyP#=xYx<7HIbZXSreq~c_4!B`YJ+A&b8dXQlyahPnXUPTbwft3lSyG zHI?O&eYp$9wkjfmo_o2CK2ZI@f$_adqNp>Um_{RZc!#g7*97b_lr2Et5C;>U8X&A; zLCEdquhJ|0IJ}_y-Cx@E*kkewCV(0Pu7E-76UZ=0*a*0!`D82CmC@%-)8LR==^&;puxG?L{dDs+SC|)$ju6l@QMmO#xNem ztxMaVkUOGsdN{d+U#dvyx%#2!pnf?!)P_lfTO>+W#HQoy#G|DB6y*{@M~dUbk<8#3CUs(sG=uiK$`2hosO>{0%3!teFUY^ zK~`aMuayko3WxTi#7Zzx!&MK_yc|QD%fi5@4DDF3jPf%Yn4|5u2P}-yc)%$!r(PCH zNWm&UXaCwJV9IADWsRz~W?W5RnBr7_IJ7<}N91^wa;aKPF|HM}CsL4=k0c;5C?(}2 zEbQ}GRHW6xDT?Ln-@9Q!`C%KJI&D-^ZT;9Id%%akN-BPgdk;ZSiI71*m@lmQ9^Yxx zg1G>%lr?hxlp(Rz-EZco?1iymH92V9lVi4PlsI;(s65!|2?U+K0{@pswYR&7R`aC>M_~wmPLYSzPH@=TdEGNV3cJ#c7 z5w`y{<)MUct)D8W@N|*ftqZ^TQ$XGy)42D8+0h5e{9*@ef&{Kx%9j$ug-^|Ic`*d{ zLCcl#6mN(IE}neczwogN?T#@n_{&U}W{AQmus0KA&lKutBKvq<_)MAdoU zP7|5a6|VIhBPzGTybcDXOD>)f(Ryf(#;V8>VCReC?Jv(Ip1vu0nNOfa#45jp&^^!| zId1VgJZ(82# zrqN5%TU31r(g^Z9VJa_uvLS8F!DEM&AEZJT?T!0%R>&6bUwmQ#UN`$k7(*GUeYau# z4P?Ia7-A0Bb)rGP#SkKq51-lsVOs7Lr&v&b6?R~c&;N>tU&W#7!`q5Ch3w@K{TL6W$!W{SW z=Wc?I$qhsdfM6zs;-j$wF41&bk>eA2Pp@!Wf4;IO`J}(R12$8gaJJZ#j+q80`;`%w|ncmgdfqfZ$05!72Tc0 zRa8Q5$p@Sg3&V2IYHrJPa2x;}000skL7L{C5U#RiFa;kk001lH-0Ga0W`W9@8N=Oj zxMadf9sCo|t|5E{LXR!OkG$T~{_J3Mb2J#$VLZ6B9n#liaXk2?a>+2Wtoq&yf!zu8gJ@=In>sR ztawU;-&1B498rFf6T$cD`#uU*Yb$2U8%F&Pmj6fW@7>yns_Ej2bzu$R(>V2cPQhd} z^mdxeHU9R0r)oTmGDMwn0XZ+g3x|{B*ik|`LtDl8(r9nJ1S7frO(;{Om(__iTc#XB z3j6(X%QLC`taLkiAT_PZBBLA+XN?Id`QT}M|6$8)Y0ny6h8x^$R&K4~TOAVTm4qLwZhgiW zz?Ep3ZOVqM=u~XFUCPyjOajkOyGyzXTT!aRLPf|IC#6i2<&+E+xreY;oW^N2nf)<8 zSl__tC=0-4D=E{OmzzD3EDc#jSJ$-e1~=r?>BK$Uv_1GqMfr*kXaORB+J06H;A9T% zYmJz2*O_{ZnPPOhAZU*?%JsWsAreoU`>_ATJ;c2g3&L_f3gsvZf*-Kfb4w6UvV)8^ zH<`-F#}d`2RrQHsd&AY%nbga(ou8OGjZ-%U_BV@X z0GCGMptQ^Ri#^lxXJmw4wSJ!!Ic}kbfO|!&UE50pA`@jR=PXSl8LU?noE1I*&TK(B z_!kIppQEE+>T)^6<2xv0IzWdRhI5)O64&y~8pi5SDHFnLV`8MDIB$ePK(JLI^hvlna_Zp zwo)k8bLuros{xAhpA%zNETN9b8ty9mcZ4n#;yT`DbZz{hClgqD<$`N}CV5q!%+?%# z;a6#OgoHf+)OHPC+JC^*jOsphy2F%1KEJ+H`;>J63CGlRpE<1RBE|c~t`&__TiX(h ze?s!>3CF)@KtH$_wh~;FO&5`Om7X^}cy1XgAse2N;BL@ZMzQ|9YJ6_J4EH(m3TiwM zMY+i3od2AK1gD@*DYFzzAzTf|UtIZHiU2}S{~g=!j|!NCg=jXjcmdINiy599m%iW=$!ByBt9 zvxUx4j6FY5biGX0R!ie+{fq&s1A;%F5Au_nr--)F>w(wFT$z2TO%LJ6qxepR?M3j0O=(bOxaA45eDA+sHY z)$X-O?vK^~z>&Nted7hlXZT32Av~!|t2iL83OvgKnNgs_-Yx;5v}HYx+Q6tYyh&$0 zZpOJ?y86EQi*MP1(z5mE*PWElU9Yw4$E?=Nt-yH-q>@@wpt+6OdK0#v&EyTmo0Kh$ z>R@ke95a>3#GOQuPb6+&n;RMgkyt?7!OF21_+JrJ&bli}nmsloYs}F*>)!XY5gA(+ z_DW{cSRsqUS`idCU#7fH1N7fCi+}gy)j#K-8WWLK4rKFHW3SU3J#)S1U~8c=nLR%a z`Bgq_7htvhy^@hiqiSK`tjhLAXbs`Ej2`-vh9*4CW%w}8rXwLjhn=|i36!OgwN=Ds z2-iaF@pANd55<@+85LOIs8jhZXzfvaF9;CPIs#IWY0DR>cvZmADA^#6dP~hH=4Kv&;wFBipGEc`dBcBG@;8tnWUA51B{th8>H;|3)Z)Y8Tzrnp*&w0 zRI%nf#I)KPSgI3)qq{#cYTn!YBmkYaw9Aq{E3L#cH-k% z(}P|msyb-HnoM0YkGdUhhvHvt3vLSsYze=1RZ!c^op=SLwn zUkXgW9@53nhOY3vnr7)+L%WslK+CfV%2b&ezf6BV+I zuPfjwB)Z@*3~qV${ya~>t|K=%YqW|f)ZnIB#a1KGzJR?iQ74O&a!PB%-Ffme5}XEqqi0a4`FP7!Y| z+n8G?=1N?+hy%!8%^(+b+Z}E3x$YdAr?_3I9>K-(-Tb!}ztSeq-C{H4)fa3lm@C>M<1Y2EI(ve&cm|Hv2i zj;iHf4e#s6qECv(|2bV?%PlUGkUFHb-u3i95j=uS`Y}9pK`wZ~Z(!OVXE&w(-nP_6 zTTig;*bp6V6iw9Ikx%zifWl#;u810PH4&;hW(N*$q`===u9P|Ak2@7ik9>mGT6&57 z?x*Do)?D?o{J?(W+EEzAxr{YN!`nxnS%Ir~l^ zbQ&*)(ps%|K|7o-V=smpBu2(^RBBE*w@^eJVUTZ-RwZxow~)^F+v00f99nOUAaK3+ zn?!KhD8S|kIKx6&Nm^+M{PsJ4s$}Wm z(W#B3XBz6kZG22{tvRimQKe8TxtMtsIlMZCLIEFn9X1!3~8WM=ICb--uwJ8c*r<% zg&vDk45g!6bw!@|x7Vl%FQDrf-!z#X5i(8FU3Ej%5?*1O9UbJ1eDP6GltwWzjDp|rJsQ`K+;x&UwPuyDac5FEhcoM33w`y{&~3_e z#`0zWrgTST;tH@(DNJ9nY6C^F@{NcBIWTfWpUqZ`|4$n$b^g^9&41A|W5*!Y-6aH2b z4CK)71buD2Kpar`>!uVhF&tktQpx);J8S7VQHuR!jL1l%_DL39W&~VLzL_jHRcBOI<``ZrV=Vv<;h)%vHCF|R-JB{Cb=SLHQ zja?1J?i@ZWaLd{Zu#tMZnK--ElhVh*(n^xy6w{X4Wq$VFD$Omt0aoEE80Bw-w1zdl zHG?iC@`$GTVH{l8$^%(buyoq&Pp!I_qBRWOUHI_8>`~Oq(O`N3m@GdSege}T?&y=2)VCCEuP3)mnbqmtEO@S!8;Z2eNW=2QDejecnQDz=k z4(xn*rrMY}y}`q6d=679znw1n8h=fT4hZ7+y#?PJkWHI9QhY;g^*Aw8VCA*c03V+f zX_9i-aNrtckC8UQb2!=%AKf9Yz-DdNm{^L)u)>AoL`;$hMK{=h4ta&h7VzKH_=7A2 zlPm17*jO^|qBPJv=p%LXl%7wc`oy6dl>-@X@$a`&VFI;-4e88=Ld)g%rT^D7|E_vT z24B2$7@(5aw~a10Cfv_N%-e`F&}|7q)R*TxM3?)I(($&TmNH7$IX@hX)=ufiB%ODQ zZKEX{2^~mj@DOpo<(Q*T1`q!yaC!gC%wLomUS3Y!P&&8VjU<65kU5 z9ZgvfiGH{j-qAi==>OBSf}yhxoX8?}b9^{oX{>GniM>T~Zl;>zrcy{Z@tqfs z)B<$qRQhWVX)|PGJC(44zbiY`Sdh-2b2DitR$BsIAdN#hQ`L+D>Z=8#JB%Neyg~7C z6{Zk_61`?tF$h_TdjyD^!}c-~Ib`O=9_~n?&DLI7;uT$BBc4)0mbIpn#`pP zE|plOLBSa+iKrG&y4}w?I(#UANYqlfnxv6RWH?x{AsW>+k&vhxfVirR;2LVh=!v6A z0Hd<#^XHE|_CV8L$}291Q5&1KEaOabFf&`7;$;d#avESO9cf1lD;MuIuW~3F^I_w< z16Z=pG}f?pBYFblZ7^cD5*|w3eqfS)Rs!T)hQf}Zof81_9ijw`vcXbp^>CI-5b7<$ zO-;#H060XKB+(=S>}W2v3#7(m+cgwR(H?_*&bM(1?WRa)Mg)@e8>kC=fih^#J?fRo zv(a@nng-epS`tuMYT=d9Koh0bL|ML8_cehuQyNZ9ydDg3(Vu17D7d0ExG6vgN>P=P zXWIZLYYCJLr0;1YH;Cw%Q&6O5Ra0}X(pNu7Ik`TKw?C!)`TO_U>rOxd0B`^R3l$-s z1~N)MUjcHSFVeqakk!M~?spULNp2XwIj%^EYA}01=>m6mP|6lo$M;vsSE1r_*kao| zSU+BgE>n-jG7y0Z`?c0hVlSL?bDbx>)@pssN`K)h2_P)XH-SlNq_uarJ|`UeR?m}D zxg9cAo$LOWzb~J4<)}GYx&0}}&}u4_npd3blV(0lNJ9rS&TgJedCqJ1L;?!+8mEE( zz}T0D=yPjPXq?h&l45Q;?*O>GH7HBWPlO6#YF|dr%M*K>Z*ZwWoNnR+5D|oIIV+9T zBFx6dXMeEk*M`)G02D@5TbV3ydZC!oPleIn^h_g>xZ_4g%DD4Edq&V#7)@mDvc5}s z$alqwsYvnb=`%4DMob{QWSnUL&%TJBAfC-_`s2DLTjSzs36 z6$BY8327HD*|)L`?c)?fT#H#ek}pZ1?s6!$fy3&4CYuI_^W$&o_C^8plGAqyqzrj` z7Rnxapsuhee%@J*QPyIP`@O}Xh(IGwy^gI)ZmnIbK?C)%C|Wd$z3`Qvi;{B1WMs5< zuVEi`g3iN^0kLw#iCt!Vp-9%d{f}htlWz=45Z3W?-|h(^nX{ApbHL%_$VK}+X@0&R-gn5WDgE;fad`FH>@V%_u}kH?`J>Y@ z-lwF0uKU$gosM!yT~;D*jqb+t^(fh@xSBw#nmQ-MAE(*XYJWv1J#JSzj0WQ6$S@mA zFCb0xGWgSIOYYR18-8~6%&_vnZ399n0b$@s<$YK_B@3!o5KZjOnr<(tGzcc+) zve(>mAIwK*k+m^b_kwq^4_ie7rscFCnGd<**0PR$cRiE7u}^d>T+Afy8W_)=^KTDC z|6o7f>=|_%={%vPdNQ#J$5#?&u}?r7%UA${z9h_;QGSj%^JoX>u4L|-qd~;wDk2KA zR8G(JU=4@$cQp+%Bs1bPyEY;azLJl%^?Nfo%_YM-bVwH~7M!=ID>XI_yy7?WQKvt# zVX-66u7lP{=@#fW~G>`$o#fP0w)yZjX&f0S0XD80ig9Q1b3j-5!V@YGeF_f1MP zzR{N<3Y9>?#34J&_q7RjU+$D}7G9_$hrKrtlFf!lbTZ7Z4#O8!e0Qf{G>V5p=07%{ zfGqktFNuPqlZ_(`f-M?^qEOdh)gtuZc@otf-Uc!oecd*JsN4Zs>Z$S#o$u0a)PNP4 zN{%{?4Ak(C+hqL>bj@e!nSN-~^A}0DDQ+ya-M;h*=pjHP>lxdaqR6+QP(m;j*$0b& z&V0SzVkBe`(J~Q~oK0Y3E(Et=z^eaMxeek&EUrNZu|^#&?wHnE0O>o_NFtvy1nmlx zb=34HXMj5YRO9-5?9|0VHD*ybzwmd>U9^6%0HF%$vvAh~gnD{Hy59)KSRPrqI z-;4@p7P{#ou4^-ByhFyCeiUBfoDU`6)oW{b%vg_N7=w!DAb9oy;5pM})ioj| z!*KOR`glABVrAEF}Rf5Q%?~5_7WepcgD$jQ;?)`8Hi%hS*?eSu26wKvCz~ z@-LRXkhz>om_vxV@tXIc<55t2(4F6!q%xmw@8{^i03wWFY^+f*T70`6eJi)~Ms83p z+T%wT1^Qi5SD&4-w;tI7izx`icuD+`;ccBmc#0lbvjF%f`-4c?xSMc^zi^e(<(+=* zSfszH3!Ixgv^X$oCI6o#?hx)zItf3VszaunnkZI0Xyzk@BWZ9eI}(kMM6P@xCdO+u zD(o8K>BJU+hb&K|GX1B!xVO`!q`?Zp6=nFYDnQ+B-v|Kwo$fIFk(BR+xvsw#zfG4M z7cK_$Q~vYmzqhNH72B{xjtO#vLS9_EALj}%9^2;AX`X^_0`Kl@u2XsQA;*gKh;4+t ztVx6uHqPT`#3Tomq`yI5tEGmL(82?bbM7v?EbA8uYw>mwlexwPvE)1rGx4?pgMG() zT6sD)7iaT)yL6*xn(~;(hO@f5g^>&*YQGWIU{D9lx2$AD35MLX=~&+yQ5u(!6nM*R zY*}A8s&1NYYOy41X#xdtP3m(Epcy{^(7ZTZWH^;0M-M6RHX+WROQ!<%$b?joo;YW4 zTDi*;5-JmnEHO8iS9RqTHzckoN-0#qWf? z$kX8%U^H%X!yK+Q+_1;*(yzSc|Q(k&5R`f3Pdn$eZ5v5K7;rVy(G{{Uy}Cl7A}ug ze2!|TNylJxFp5$xi-dibiCdWI5+6&Q59$==e184cmt7&i2aSJxf;(a_j3hTYG50p^Yx5rCGj`8>SJY8OHFE$=%DfOtk>9+EwnNA)hOT-%nP;2(Hu zq)O^s3)UAp=Q`cc-)*X+x*r2j=GwCx$k7tck}!XmtNBO-!I5FHK2@(#!1cA-sFkf~ zAa~lE{t9nxH*!r##`B8#U8fDA*^BM?8aJo^;STEW1g)lKw;h z>*ad&Locphbw0SNavgt1DhK@(a)w8oPKgr=v|I%(6iqG{09tE$b6y$y-w{T>ty@@U zGZMxh@VxR#=>RqxP6m^66>=*^LBjHCHdpf`P<@bjdEyp@-KtoA4)C;?bACIC1j;k( zC+zzLDN{q9CH#P6I=c@}(Y1|9tQeA;CPw*M#u)?R*;fM5-S zaU<14m)w}CuK5hivG%keX!u36EX7@&EMSJW5{H5=85Ry+tq5BuGk1TnMp9axId0?4 zOkbYb&HQno7(R*Nyuj*wA(YFpBN_FFaZJ8D(EIDuxu`D0rLRGdHjRUXQ0ouemVlcYWm347-NQ}JPDu5YpNQeSc?2S&p5?)}9$L^zf*=nL> z-Y&G{O^hJkI4f9H3Gdx9M+p?`=BV*a51N{%FPcz-AlzmLfRa50?}JS1X6Vwv{mXy# zlC7Fn+o1#tSYGgzo^@MmXWxTSW!c zZi6dHXmQS07E_z@9a|$96}Du6^36F1m<4?y8r3C{l!+Pxcc>z+QoMl|t44{W11>1$ zd^S|*>ZqL=njxtge(Y`DwLKK6r%UFq$5d6 zWDYaoWY~h%Iu((PSJh3D!naz#De-dANvK0s?YP06>+XIva(^ zh+HhDAV>mA_lx@hms>KP%(W{1I>ww1MfxzwEfXfwi)ED#Dnyn=>puiF$)=Ko|ICe zj-$i)(S5;g~=#2NcJ|1Jo9c=?`020gr0UZ9koRH25O_YYQ0u0s=CMy z!Big@a+NoQuw`*_wd^PM%8+8gbQ)mYr6`pbVrKiQ0O4}=a`yHJ`*&&X$?Hj@7I3yF z=^AjC|sAzG&}2b&S2*BC6~ZB!jn>ZS@% z`PQaJHb|X8;kG_&uc}1LEW|1hZw|D2bL83j34bOmy2c{fEU+Rc3D{>JiLZ|nfMn4ujga8J#02;2f;1&(5DTtzjv^iR{^jV|)9(s`zBji> z5nH%!WE5j!Md}CiR~h z+G=WpvjNTM0Ght8sXbSghPb9@MFz#{gsOhe)kPYrYj9Rqa++WqV{x%QfV(Q{jI5vd zkv+qB=qhd+bI*jSmP$iJHFkhweLj5uFK#(sVPdQKBH9GLsHYib36pczXe+}t!prSS zL30P*HRE`^%nYf|q(Q6z98-vP9ppEwh3`VLK~I3fFRMYVxIV+FX^cq59QWc&UHw^# z&iaM}wl40E1pQbX4XOuaIe6xekZk*#U;Q;A2d~o4e{J`l1ILq%KM{wW*e^DMlQsiB zhc?{WGTi?PCS4Om(b5(S=WBzWzZf$aF{`f1dOTDq?e(zpG&Cbp~7Ysl(Jx1E^eP0NMphReN}fe;%8v z`XYd&3;vRu$uDCYG=~fDz8RBynhIvWg-vBq3-JSe9MgUjtg!mC2f&O%RGtU#OrhkL z{cljPMh}XMm2&qB21!ltjvtimh}fswbNXC-Vg}eBhj2A>=ywP_Nm$YFRFJ1ChNynZ zS{LCk#7NQsC%8@B(7@NU@pL~Jw<34~3L%-!j>$oSRd{UWb6wVhwG?YK`nBD!U0w-L zV$ae|T0eumZ##wrB1wMu@~(47LJgn{NjRmksU*|v;c9n8JV|zjtpm@M$kx|O_s~_P z^tiaaMDYY@d9ru5bF9i$EW!(3f@H0)G1$(n#%R&c7gth2(o+7JSI>P^Rd9F`A;JNg z!LwDYhy50`Z$kyeJTv7%zl7#Vrz!T!<)a66Cpg{q&KD$kc!bOK-V{(2Lmhf!pW!XH zvwL-neC3WuAnXI?3S=EG%r)(13Ul_)q!eeRh>u(&yf5jGW=B$Hz&b9Wo3wJ#GHV}^ z0CngMOH<9^_10KI5>BRw^V?RYW6$C?3-hNjkcVNDyT%0;%MU5rC)!5PJ!vI^PCNEb z8wRv(_IH>eB$c9pWFpWMU|OZQ3~!62c_-KC;$u&G2$yjO)b;yD=b@oKk5Xq4+A*Fs z2DPRc9`8^nsqARDuOs_h+x$W-Ja6QSFr-}$ra@Jc0mPZ2K69v@3^bCej`|$>YA#w* z=47V01kMSw;s3xs(O*Na@vi9J#^TmPQ~NM9(DWDo$3s1*QU#*ti_ zhkJffLWzo*U#A?> z4SZeJ`Mrc!_-B`AX9Ws6EHSnePgg>l(!TP_a(DaR@gm{sD(-0v?t2`zt`0HF1tLwV zf_AXAb30daO{_H7`92XMes2mwRbqW!E7b%WF_~z5;vml+%%B(cig_&y&`+hsRLo=o zM$!-aqk2MQw|PtHVr@n5>FW=Y(33LGf$mV}3@Q{Yk59(w7y0nuSoFjY99GbKjyp5i zu&zXC`y``LZ&yxbDhyZw(VQ}Tp?v5VTE>gjVeb~5UwUbonZu@F@Qpsc{Mk!C>No0x zavaVV>as=RU+md^Gy31_-jguWI1B~bD`59V#Ax?Ki^D)XBnLkYIau)CEbT?o_sAZO zt1A)SaF3g)eNZu(`Lc@rj;`n>C~nyUnj{ScACO4#ZVHwwsuBNX6f#e|*B`3NC~QPe z^=yR@1d4v5okFDkqf3{BU>diu;0-ZgOpDJ$e9BD*z==n~%syG~+*zd06jk#3d%nQ^l4Ia1=j>uIb; z-!yctBruOk+Eb|URH;s6wi&{eNUC@x77z*4K%x3q3@1gHfhEvDEm?D#kf~$~frt!i zg{755$*2L5Wq}1Ik~CCQQ<%sxhy+B`7Iam>0MV^3;dZc%PDsyV;P_!73QFLiR!AEN zB})q*Ms0yHIVFqQ4mm%PmXDLu;E6*N?Bafin&tr{m4Sk~X-W|=k8D%Dq?U{4BN-$R z8f-yQ&yCQI5qKsLfR&WnG#8*zc&v|L2B7Nz0urbKhrn8q*`z9{$9&z&jj+G~0l)wN z5Y9oHC#BRO)=Z`XxqkovD@mjgt@rq1gNMq73~8oAEkI`u$;xjlo|=xQqH^}i@;_N9 zt4ySq{RYJP@*~Oq}&Y&2;Q+f8vI2`&sVc1e65(4V--WE0Kmk?eTrXh~HE%vU|t z&-=@o*#Ww^3(d3Te+0A1<65Q%U`JqW zV?{j@0KIdSvj~!9)^JP<14grCMhz2-wSc|D=n6v~xXhV)VmZw&?qe%49h=b9i>JC* zAKPGy)pv)@Zk7Vs>&w=VtvJRnD4;B+h6a;`8Z26h@a81TPNL5qd>iQSg*B#_TXqaP zgvTBLildGp-;O2PqIw}G5ZTD{GYaJ|TdnNnJ6xz|qqIoihWP0?N)6fmzI>3Ax~$N( zW~7((APAgaX-bXlkb5&&i2(Cu-y}aCrnJ2#U^&gy-DjtFb56v1@9}&uOA7_122KrK zV-1A1C*)Lx)q7^9(~L3#QBuGwO2z*87)$-;jf?V~jG59C2XhsE()I%JC0 zeXjj;*LG}+uha~DKpQNJ`x{>{T8A3Ag z85r4#&~BsJeX;g7^*VThE{8+qTI%#Yo3{J{2k6VJ$Hmps1oRaHt_@fnETE)?V`M2^ zss5PN<4lg9HGM3&$lR_pq<-d1B8-{M2{xuF`*~koGIh5tyQ&>8K79$FTrHqZBPv1n zG`9Yp6C`-!g~)I8EY4p@J3#enMBnDEdmzIKMDyEo!Dh1*_Ro|f zvw2$>q0G#xX3(zDI{c2RqQ`?>iVo z%-b{J5-%=7Da{=h{<#%hDBRN!Vk$mPq@a(tR zb>4L_9hd2e9*$tqs^(H>BdtM{5o5NU`KRL}pZWhDM|yj+mc)|DvuhctltyW3-K-VF zaVjTsQx|X0(|gd$cMJ;aXEf!~tzo z0RZ7GaD}qNvnuFPY17?$G<5o9Dj@asPv8706|eaI*R|_G#k3u4@*a~MSz2+4q4RC6 z39rg|{AqVR^!?Cz-_DiMHa7tp1LD)gRd2sWhqc)&DP8|R5GfJ;!*@#OpF>Ap*KN~Jm$?sP`|tDTVzjIV}n}hpQN64mp6#CG#tRCiFWe^y#3vJ z?1M5|FSWl&FTI)h$1u{I^cvmMR4%)M`-iD(=JrC*e!}W|4W5oa&Jz5=R1~msZbwYj z&N-+~yq{>qOV9Xj35Zv`n7Ti;U{#Hd(*!tsgqDHajK1fqD=is}Jrxmlwpjq(8jeCH zJk2P-ug9ZoUATop1vLD#jq3_})K`e3)8f5P&SMnN%QlbHj+f-CbW3J{im0`>$8mt; z`uuen+RFKlWZ>BY!+JQZtRG;}Pk>twE^s!_X9FxqEL)MK|6~4_c=7!yb3X3-S<;Rc zBwkW0bl03sL^uMGEI6&G`99eP`Ska5rLFFhzl{}|$K~l(KxjT&fu7a0U6apJK4M}D zeEL51B+aHK+crP-f*1tG>wj}EY8SE-(%3P6YG!A$Go?rVLmIs6eU@305Eu7!ABZ53 z^?<7ehvRwet>;ss-Ziz2RO(Nm(4s_F)kuRe9Cmp6#Iw*Zh;HCuxK-sA;#GK+WX~@JC3`Oqm&DF z?F_?f;0ghoI2VJQGp)2G08-*|fI@GkEgaf|SU*fG&p|ii_E|}^hha^p#bMIkDr^-NDFJvD8CRH+6{Rk@ro5813(KGrS zJzmuEcXEx2>s&?Dm2kLL_orKj#(Meo1HEjyN$ob9T+K+dCb8QGBGmoZdnDs;NVqiT zq$|C}ot?TpZVfzu;F3nXOYB1g%T1?RpPT-?8Uf>srKgy42)hH2cNYrEkKxwj{d zjS@^+r_c18hdvFA&-}&Ekbhsjw;WiHB1aSp`ImffQNk5xb`#6J)|Y5Jc;aKbgI|RP zKl2`!bmq*E8^TuCfr~i_81ys9zMp;7&@k)5xHr_KyBezJU~aGP<3r%wiERr%Y*Oeu-kQVcGbk_T`4us%?KxEwfgtKHOkL+A#Y}7Ljiv9y06PgT59VY||Nv z*+KF70DHR*g$zA3PoIB#%7R>MKMyR4)pM?*d^ zd)l>?kS5F@%(rmyzD8#?J2+s|)YS?4qD z~gw5qk{UNKn6zqc}D~=a`9RN7w|c?CvsHElaCN)8C5IrMWKkv-DmFo z5g_z=Apk=MwSu621L&VILFN^ZLnL}Y{&XrQMtGFRe8JP@1D^v#X_ARC$vQzfr&XQd z3|GEeV0IE>|LZb9|5_N*Qh|ai@d~j6>uMoUDj{}Pi$hxe^9#vkD0GZB`K*lok4#uU zfHswcLwnXT1YxinBh0KSBYc=c{gC$-SxLyeddkByh2ji-)>)N)K_43@tvRt=S|h2Q z1~R0`hv%R4#ZN8y>CbHNSZv7q43FF_{r`wcP%v%JkzvFhw!Bo;5$3j

~Jf^-%NB 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

7k(b2jhO~eF-LCrf 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

TOx3+8>hnL57K76DpI6E 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

ZG8(RLUcKx73t#K;W~v?9gXXN=j+YxX66~SU{)0 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

F64U5f>(0k> zqMgdcvfemsVYSd}E|-Ujl!QwOa~WKc??B*;ecp^oUHVPjMizvb6jWm1(vZEAqW$C=NKi}+aA~l7 zg}5uW#Q^1qg_|QxOcWLC&$M-B5WktWg>J-2*X2I-(LEMMT~}MI|9)Y9|{C#9tj8$U2y+dvB!3F+GFccu(y!EiBMr&AAZ4gE670>3c z??1XOKVR8O>reD4ea>I}abmGnZ|^o^Tocps5qdE8xi~tw4rxKU?uUL_x}ODdnnpm^R}LV>M5(AyU`^GV}Ra!liZ&>7-Rz*6_d7w7T`e8uH8sXyp64r-C!-cB5SZsr|!O|Pq0Yr6y?&)wkY zaEe36pCxWKgxrIdT|`CjJ2Vx4vd{hep=Y9VrWgVSgNT!3ow3SfA~AVrJr;vbkhZJ~ zMK2sFr#ahWp7c0&fF- z=Z-B?k=jrFq(-S3j$wpS@m+IFIm%Vj@gMRBF+p`dapJ~RnvM#u=U zt`{Z!UnJhg_<>^>1zGto&pATu1Y>cp@2$geXX+xGs*_xjE$B04157q3viX81Ci9xF z?cYciv3dkXnU$zkY2w`*)w6a>kz^${f`0AxnB}H+N!q6{m0?y+26@yf{`;EIVmF1c?nL%fbAN2pS#B#-02Dzw? z`|9r`^^>pu5MUz-g%`Nr=;~rrlj;qO9AR5Hs#Ry46F*WC-l-0qcbLYa~x*@PIo$X0%?3F-1DQ>aS|Pq^tuF-VZDI{hkI* zB&jtW(d=-lmUrnh+V75EAwV-$7FG%hhXzdGsWSdN+0#zH;KZCARv>8KoO{$FkQB;a ztRatLsbfC*GC^6=v$ch<=puQ@%mP&zZ>*Uq-cXYnH}6z9Up!1C5!Zbl%eu|%PtsYb z9>LGlNhq6$4H*c7n_6Ha{T^3fPUw)qOed>Ztge7xnz6(XTkTj+^lK}>BCP`C1WJQg z(v|^nWO;%ZkeprTrZq2|@}1*tZQ}Z_0tcE%qFzd~ad_A>I?Hof&f;B(RTKTX3sAa* zw**9kKCS`Cbu;7`%0LTHWc1*!wB}6pB#}n6r@+#l*|R!-b`B%Iu2f#0poYZoDG)J1 z)8nuiLb;-lE0Xjb)}&B9Qq}*N|FQf*(mb~c!k&=WrTa917p}&qs2n|s2!R>(y_c6j zPX~Pk;6~EMffUU7pA)``K$Z|{R|$t9cCCFjr_;OQZ@jGLvAMd$U69UaHiJ%>JV~| zjg}suSLLeOqhoKa-aB|HYGAqGwjyPePj3rNA``;x4f^= z=Qd7WMG5rVb73Bo`qZ9w8`BS? zP^^Y(GJcpBA_Q$i{1?Am5O16LjZy5iH{{SiSvw9V|38csdfJz(t#OV;B?EJSR^X_1 zzAQvLxCLahF4&x%3T>3+QcC&?IXgeM^urr{yoVo#lv${&Bg_z{S~Oy z$tDqFfN$D$GKxjj(_CX&?H%1FKwHrLWq%1Gfu?a`4Za)hFT4j3mZ;@@KNMDvK=OtL zTDlwqs`=s!KC)TktNHJ1O#kDf;^Eh4ApvPocodh=WLWLqAlW2lYKW~fR6d1V`PGkh zm|h6NykM@NSju?Uz3}+@JvaFZFQRb;h6?Ct4!Evd8p#|a!{3I{>iSXldg<)@@yR{c z%z$z<`sW#2m-j$GA2~F#0?O%Oo%j9F{5|X#Gt6YV>?@SG`(*>}7QRQ?u&oD_km*Cu z2!x5O>9s@OJO$A!vG@!M!gpfr0eNZbaL(>nXW$Q$t@E?zR-DC#_bgJ12WSU)^We$m z!I*q<=Qz3iOhS{b9ZqrY?$A9hTN)s5OJC?(5Q3}6v6;Z83f!#lt@FogSWld0w#r^JP?T2s;I9- z$4#H65|-l6q#EzP>Wve3kr`_@nR8iu_Y$g{f!Z&4K zo{<(4JH{p$#co1AMzupbMxB}AeME*gY$QdG=$5jTvXkXSAlW)@@qpP{^@=RTgC2Ad zd0WIted+}J1jGR`dDD-qD8;S>z!~Kf_f^KB~x<;*f|9EL0 z#w14a5uE`Mai!K!BZbLsu}sFqR8XG3{Yj;2>jGGD)B63KbFDUzbx(P?>xn>|)0KrI? z`s<@>6q{P=@pCzUJ(+?Rea8i+oyhd{OuJx5L6+KPqU%EG3nIGS;Tx!<@_ZtM;$p!J zJ79oG9nXu6y2V|4#+Vzh2TJbF*2u}<5k^hR5DAE7fcyj*U=n*T+9U!*R+d+qFn2dX zP(vyl)Q*EnF3EmIjwDcW4IiVpc@$$xIj1{t>*ey_?SA|;`&L^zgc)e_PY|J+__Xg| z(mc!_iD4TM4>F4;H2^_Fdze$tuk4Ys>K8A#?Mk$kID$uby#g6zqhI3N*(%$I;V#M7 zp=S-K4BU3w#HvR&OEJfzIal2C{B4CNZ%u&fOhN6C$u4=HcJ3Q0@OOe#T!;tbx(ZKex`*BukZ z%?$I%9ASi9Comu<|9mEXo0RuGBS*1+5G-e2_upVv9CVRH=497x#4+^M9f@E>_g*MG z+>-vw4=x#8>^p~G1}w!6>Ltkb<>TLWrM&W{O59jyOD)|RaGJVis{%&e-l2j{^N}-X z_f9N}pN2k{PpXPf!d5Ng*}-v4yiD@g<8x0zTjwv*kz$%_!{}(9!Jq5uZ{i!F@l%vT zFbtMYsPpw3yD6N{hU@Nwc0tr<%mXIa%$g9w*Q=-z{AHweBFHUfg(Jl1^rDoXaFzZ3 zZXEs_3443svj9Ub&t{NCkRl}JCg=APaA8mm)FhEsl2H_Q)y&>H&RaH;OiB@)lO6HmVVv0m>L*XeLDN-#`C)nC;WK;C^A@@~RQg?DHE;C$ z6g{dn4K_yLPs4ZGs4Gj$N1iX2*RemPrfNt3->G8&=lClOP^+eD&OC|%{Goa$VNXVdnZ6ju%bR; zgd(;a*)hH>YHhac7WY{!L(9Xt&xz+;G-Pr)sR<`0lqyD6Mg$CnChL0ifvJ0dgM}>o zZd?C7;wp}GNpf%R5I=+)3?U^uL(XCDXBxtwlvo_@k}vCJS1Mup_78xi|IB?~bP3U& zLj&{xzQN=8=DDRw$Nu)=0NUzHgdXh52{e`m5R#S|zA^13JfLnuAj2k-g3Vme?CG$) zH{e;dqeqTZRqp0Fh^{T=RE`jtUQAD!Wg36e#2YDXfMws^+tVI<1t)tD)XF?*EZQb_ z`L_z~f{S*?RktEIhs9o_-c4T?5@yC0xhCn&^|B}fjG184$F53_6zcwM$;9Ss3kMP(U6REeRpK_ZYlc~!%ufKasNQV6!+ zc`=L5WPeGt8J82kgW}c&yK@|dU|)9?UkJ_lCuS z605g#eE0FC3t*`k^4xO6NQ=2oiro~$5KY%4u7|2_ zUkO4AlF!IEVa~+PyEh*j07tE^A1HxDQPYZUnXXW)TJbI zVO_`I^Mh5L^#LTC!}9;2|H4lRq;_pd!iIR&p0z>9y-nHfqPEK%+oPBrsyBOac^9N1 zjW#~BFhM=jl*rK0Q5DSX>cI+6^LZ6t#Xdt%vZ6Ls$4TYAlr9z>G1%CR(u)WXl}+1T zQxvOVtvw)q2#(IHrD7@&)l(x!^<&YdaG~z{_2Qr3cB1XYc?cK`hacRASGlq~1iHCd zL@B5t10TwEWBWC%Xs-bNhYhP1fETWeJkTE5mfn3J4ItHaq!x;3!zb#gcKFh;z;=QM z-d^0^-ZB334CMKOqT@x-dWJ^xZeiBF{UNIT(c~q)V7elyefKuw&DPp*4Pr(nutmF= zVX=Tsz||(2e-n2!@W3XO=AnttN~ZObh5jE=A&(@-x^4|qFKRs z1t~w9yC{0AFHg}-bUWhLFvsOIJ?vZzwR2KMaD|z5*X*a(LUvzoak*6Y+RX5Fg??0b zCf}akshO`Vz3J|L(@HBa0jD`L3m&v-CNA{rjf&c9yNlleNbcp}KdtM?kWmD>64tTH zIj~O&TI$V%*O5)cBFN8#DBGD-#4XE#jghB}D5L7zbTH=<>Bubvv)}mHAwMImd`0!o z#6r%2VvPX#Oi2VQY3AiFrc1`ZVf07H+jaP^wKb?Q+(Q|u@+94Ug6q_HYT zAuU#YLtMd zWz6y463&M*ciO78C~;phe*U|V*Pjd`;y7b0N~dHErM80DM$-_8En>RD)@YQ6R=ixd zz3@kA2;8FlbUEYIloK5jCVf~lCh6e zuteJV4w`KM8h*z-K-Jxu^=A>NvZPv5`nIYR7er4RY}Za`zxoGQ3C&k6FOhv*-|@3Q z3%(cdW19K8d({J4-xlTcW&VNu(lpnz=vJp3(vU_fr!|dsozpc}o|EnqHdv)s*f?Gp z3*kOrxr=hV46lD@V=j%@kV*;@;F^FGU^p*|p0j0~KojKup3SB8w)DvIr%5f%?dB~) z!m=m%0a^l3RQUp}gm+dBv`}O!q8F4Sso`k!8je5c;8bmx@^BfZ%D3)3RLCHFzF0TQAlL^s%dHSdhNVC=l<1;+BFj*|M(FMWQeCbk8WvK=E~w+r7HY=utFYA%KTV zh1aSS^v9T74p;r@QE}< z%k$&tkE1wh=VWAKp<5!Q?<&jparEUCaEC=R3#)q0&o^tJKr%7R03&6h1Onc2qhwDr-9%0jP|XI{Ty97)E7PdI<9Bm#|Hs7%buV~+_n;R4V;E?ilO)#n0__zgpm`!+ zygiElVdI~H1>YBkE`g4uv4j($Tmh0U;&}Z^p1G|t_QZG9?DpM>^aQs*mjK#H{Zo2%7QL(RIGz5*M$@d*u4fE$-xTuJ&2ny#t z7JO4BLX;z%JxUc?{1ya*1u$uaF1-7zL~sIYY7ogiK1dLhF8R~d&f%SPeKYMuq(@Pe zPm@qFXc2HA+8kLf0Wt91FvDNgCLa|&xf?kq4e(o*+}M89U>*p`*L2Y}7?&0HhKc(T zX>e!z^`^@zImNtJfWEWJgi`n|6VxS1fFs@r+Tb;QySm0-D1pU9o^7n%Gf(aQC#UNZ z%7zRVAcL~MA@&kONIL4eTgF}kTi^?P)Wg95m3U!q&}h@k4Yi~o>OSsIKU4Ux|NSP@ zo8HU3qz{BEk=i1-p$yMM(p*Q3iw;GLUR*k1{$ud;HN)-p4~FrYQ!z|*;IZY;>~0fW zZOFStxEdV`%SK*XiIL^i5Zw}H(|ER$xkn2)OTKnt26!?pOF4RET3w|4_TijH4j&xd zb}dC9;JOv;XT3JDJjzZMQNMKaZ@pT9Opi1Zz~d*Htz_t9g#1df@ZkA&+6YmK_tZ9X zAJl$s`@Q$+y2QdLq>p(}Ee_m035^hHEV9Ixs`$M|=GqL2b>Knh^a_N_ zuh$;<@Gd6tNo>tMDbLov&N=iSw6Au^cmJZaP)(ms3<`t!m?~OoS_CB{t1*8@P=u~nsg;?r7 zEW3#gzfp=B zf4X+(*#9V$Y&PENQhN#(ZQK$QE&ZQX%4E_e@#puSG&f?JYWztf*5`>(FQHIrJXZZI zFT68L#(mVKT+@z44w%`iA%;9BYPXlk1L0EVJwB-qY|Xb~eS?CWgGcXn=G-qNvxIco z^)u!eu2HhKIyk`+6mnMWE_v!iexa2zrlow2<^vTL`K1;5Bm}K=5Kb30spnH1q)whGj`KkZcRhLBn-ZJuM)dM9BOk@dCpCj$Dpz!Tg zCcle`zlmV?RlXQ1rv#G#5&*Ur_qYDkO`Kj9EUYswD?|c2!weS|v9DK6fu?3*zXKax+OZ@07w^iaFxkPj-_ms1C6e5akX74}Ho zk`>hawh5Pi>e$UV?Hg%2NH9&bVDZ-i_&l-Tv|{r^(1ZhkgLWtgLRd_n@5pAGog0GkZA-33*X8D zJpDvy7jO^B3UpKVkA<$n>w)>a`7duX%VI0dQzouwnX1F%%@4OILpXHj| zlY{~XnQ}0rerD%9a`!{%TV0O>D@RDDp?NM!;N5e)p zI2G0Sq#Y8F@%nF=3tvx>YYO~!_DId}J9EAa00 zy*~0ahVHIN^bQXvlv>u)7vjJixDy<&%T)QZ)<#9PP%~y9>0(SQ@ozFVDIP@@#-}C# z2{xr1m&niecN6SE#X;amc#sAWWfTU&Wjqo=xc;4!=6^z`cMxGPXvE`sL&z<9XvjTA zmod3FSR|YMiT}CCnKEP&P$OwcE29`X#1zDB%sF?It!@?Z5Og=iZMh@bQQWvM6FXy z0z1`!)ayHo%|aDMHULV;8J8<7Tof*-;#^%)(GeTNw6>&?T~vu>eZCy8ze%0<8jJ6! z_zVC5000aCH~;_zy8)hjvPpjdauupucIqY%*ON{%xu@IndBH}YNiZxk7+3wJ%!3&_ z(kd&=`hJ8i%^YZYG;xdY!z*{0jfLxLEWXoVx{X*lFh7(D3!kCE`Cf7mlYTxO zH*f2mMP0!ZCIR?S0vuz%irxqsBQ|>}B{5K#&y&{>$Jf(2=BhWhs{3=?g6Lnc?<)mF zIzL?qM%a7(sQ>hPJ{bU0rE7no`PE6lQ&4*f)BS#jA35;9jA!KRrq(PTt%r#Ess%2} zh)<*{xM67$C~OsmFNt8U#|VA#qS&1^*kqIReV~Wz6lE>!c#m#`5B(INr(VDzPz)yV zlXu88AvNftwj4^KhW*xne~^>^b(WBS@Z1drWM6?|8bA&aVuOcb`Noh&C7m;X>70&y zJCr8Zsc>np7BG>{PYDK(I-pqQ50eq>;!n^c4ib!5jfY_K?{X|lfHOy*hVjn{I39cw zRN^*?jexfiO*v48sT#H8hN2QsH|zL_w&2C9O1|qk|Um6RA}(|UL%`V|5m8A5ENb%MjKNSb9=Lo6hH2OWF>|->*`^4 zErn2NtoW=S+{){@oo@-Psx*phN7Ffw7>w>(1ey%w)PUsfDZl4bGi%gLcRmo*m)M5Y zr;iBUz<6ZK``RYM|I8Earqi9@wK3{<`S2x^1;lv6&AmK#@;OK&Is`mPCgmOt%pdv} z#<~&YUIvf_+H1d!@t4M5lz5!Qciuxf5l5OkRXn%Tt6rHIN{SxKj+z6>^yXwHUm|** z8x#a_Cnt^$f6j~sU?5%uH!W5 zib__q=LVToTYsbnvn5%X@VOw0V~~CesUEl=t5|>sq*Qe8pY0-P_PIuv#w{M$B zHh+raL$s*fhL_=uaMT5x0xmRNAh|Je;sfMG*?T{W?@iM%4J_~ajxitD+9@+lbP(tB z7?%;4G?6R)#0ua7GSga`a-&w-ZWW2-7;R#=I=o(`5+@yjzuPB-3a3qpC}@0$=n|1* zTB^f0W8$ik2yK1gCZnah{S1EvQIj4m4Y_bv%V;@cg`xwlPtow3*f|N2J$&qf!>oIFRK*|pu2;e7vk?&Zp%XOwt)JU@?W^Z${JBf3Qjls`j$w) z!hyoZwLFHPrtX^*D7bMMT0%zNBjERRi&Vk%ynNpNEOJC@&k_9R5UfKe-W)_;A|8fI zFY|~s@+PJ9%deXIQu#s8?IE}aSUf!$t7)Fafx*cIGoXb(zw;MMz>I>5jI6#AKE{&6 z8lkO~#bh=-2v*99r{n_ck{zfb)*(`;Ld^N`t1>#sZR|qWE9IY2#%YUC7vTgmwg1b%=7tKWyKVicC#5Km;2icD$_%_7Wwx zl=#yu5r(Ey;Z|*5Qv%s3B>QeLVQPa~EIYtSSPs$gIrTSS&>upVk)r_`gAmjn%`y`w zjh!^eJ|?&q8mM9O&TkcT_eEKb9^$CX5I``!wdh{+Y#v<{|K8MRc0dxVkhi_vR{Vx7 z`V$TtZevXpGRtx`8DVIt2lC{JmH=5n000yxL7IN0)FD-qDS)nD004RKj7GaM+lvYU zG-*|CbKtC(t#{xF#rm;e624J2l~ zn4)({qVlz(;dL*?)9*5%z0Byye6L7%RsHU(C3OfB50 z8}89QY8&bjl@DF|8-20XQ;asq7BnlU8g&>(Co^sN97dj&0W;Dbpd+FIU$Y6eR6}Ex z;BXuE6oiopSPxsC=CW?*tL>@ZZQUwa*uTp$3*CD^=V9WIq;PaGzO5&D;fwv$_fQUT zZ1MYK<7@c))*3jfF*tx56<$N!KRGSA+Mr#`2h8F4CTbWc$e6*`mcxGTY}+S54I2K? zrs`E{^a^@CpX_XLYq>9+d}Vk`F1R`Tc_4sj1|XGojGOaO*hF71pd%9qp%?v7Y-{CJ z&EIS0trT>}xE#)Uxrn8$3;=^~=zLj$hTHFqI>05laRY})y*r~G_O``GE@Uu*r4if zP_$r{jQI77b83zw@}nRa7k@G(Er$}+v#BY(C;D|L+)Zy*V(_;#>0Kwid6nE;lS}sr z2b;B<>n0J}XIVt-FpPI_qVcsKA@h7%L;W%sT0+t@*|r(yTL{!SgooLuc~j1tWE*K9 zOtSWtBHh*h#(?R5p;jDSc-i_m?M5k)$RTDGwC|%!`k&;vx3oC>)coPTnAIlWVG0=J zeId}49pFvF&?_LEsa`%o%`sobGhW?v#Kjj7t&pSw3@Tc!v(C+HnJ>?8YC*x)L;80z z_oMraqllqQhcJT>*dRB$mjdKq(0I-x`@aulLBYIj~)2$+taFSVTB{1SLMvs|*EyK8Y0Vb{wl8B3&9 z-8_ISZ1Zv~J*p(7Kwo%p^zV>psiB9b|1j_660%E^3Tt(nqk~& zQ%4j23qc@yR|ypw@oi^G>!J3Z%WjxgdG?Z}e=%Bxk2_8n7Kem?Jc7&s$iDU6kb3tO zj8S0F#GbdjvRe4YN)L`B`T~raCZSY|NL!+Iw@sefV9+Eyu)9k%f3$DOGl zvv>GRP|uSBP-m_(*RWVa&1RpdX@a+8Zw55lq`=lJqcpOP79gN*qL*e|{%|Hhe%PO< zh{lzCXC)epqXN?s!Ve2fbkW&K67oLHK5c{r#A0fBMtMs%A>l&tYzC)-`=}vnaKu7Z zm4T|YE=q{cIFP*-Iw77$Zu!2k)PyJ95GA<}pEDElPYqa*1`8iFz|O&OhuWvxu)Vn@ z;r<9UyW_4z;pmH{L4NpH1|QCrqaZmAGx;=6_Hx)y!y~`bf!&D1;j(unKxpLUo#%D(mKVv2lLOF*}#SbvE+cvl`P)m z6pjlp9A;4RH3QACKvG$qF*&*Mr%EbPF*~P(e=f33HL2Vy2mxO_?U*@LeW0~(%`t%r$jQqP-yOlnt&T&C0cFqF)qF;7 z7zrkVS=gY|w75k^QT#Yil!~FW1iupZ#YP727@1p3APm~* zr_eu8FrR9^QRGTd?AwD^f;1>QfEkjb#7pJU<|?LyuX>`O5%1A$pJQwWH-cRp{J92j5h5n?lNc|gnn`ZM3>P**fcFN};#QBlW13{r z2I*QVicb8O1!8;?5l!3d9=c#l7{YH*%kne0FK8K<|I<|4wY__yS__Rm@^4|dsi?zX zmD-b}HIgwB#C3t_dHbJ9m3XzLy$)bPz?T6y&`$*>_`WUtx^!J5%(%bx}nvg4*X498iuUq0kaqs z;rE$uabjULmOTTVq=K651)6foN~07VsJ|+A68WiR>V(W~X3_v`j%g1%cYXT`(TcO$ zX_i^+SjdaiLSr968u2i}j?$D^$*^SEZzx>*?)#mcOP}oQjj2KU0h7ZwSVKc47U!~! zPDMZ~hA9$d;K&mh?#%nCD1sYEU143T^czS-RhYh*G)?nL3=jDyyYvJd^dzQQ9zMEa z7R^%c^mw7Sl^N1?k#4IQ@70Wc;uQz4uME&@hY%Bfg*?OMpbAxsR$qC!cFD#YnmmC= zX(jV~>_z)IsQ3FkWK>0KOY2FxvKKTtvt1b7th#(J5|!WdlVr|yP&!r=^Ai>C3m1Ka zyzC1o;$qeu+(XJ7X5&L@MgKd4?`DO3E+~wg3ddR6e4}-$Nq~bA%I`+Ho$EXmpv~*asiGPWA?>D($>oqY=u|g?=Mx$onmnEY_rPApHKM zsX3*U`ZbCq1YlgtqLhgu>6dID!&t&Ro~_OtrE?tu_lK0 zLR^;UGkU;C^%Dwun0?F9LE>OgWzYrEFy1m@xm%KB1Cr3CDlg~xgKG=RIYRI9gL&ReTi{<-AN`Fl4kLyFOx@M+*PB6nAp1V3vptS2Fv0EGH zH(MNZ!D~_`-if}rGvETp%zDjvhtu8YFkCHZ(7~jL6+qjB6AiSDP(@%g7F0Pjaz%=A z(e#GLnQd46L{D&jfeZX%=o{Y3EZ@8WRRCXoHb+|8NA^dPW*%lL0{x9QcNp`eTM!5H&ueOT zNWXCsS?4yiJ^kanp}nqyS*^t|CtE3au#W7hAijL^TlSx5748A zjA5jFVn7FsB zH3wzZEaS~+I?P-4Y-JE)K|727X#?;PfGm+@!8&GD`R=l6Qq~j5jE6$UU+)1niB>r3 zrvaS|NRtk5s@$b<4Oi0qB0?Bv{#1;yL(Tjiy7j#HO zO8wZjRQtICu$N#+^$5>V2aE3|A&|CjVaD3rnkCWjn-jM_`z&sxgw0*(p8JNJa+!=c zx!2Oj!cH1R(BkT~eterqC?e6=B&5xuU=XDM5`abGAQ?WBWUFMlFPV3$4O&xKSiA}3 z=Q$>hHqkMmg9q6?jNIitP+udu2m@+|7xJmCE!Ar27JaP&2h1?oyg83=8k3p=rn-)) zZOw>}lWm^kyzbP%k39M{^W7*Q?_=C(hT{FdD>uCre~r;V)*m_BuWbLpjz39T-YiQr zGkT0b+wT1#!3<83__0y3;S??xd7u^D`%goKc;)}+m)>GkNw+;@c>{8aIW`mAuQOqs zg+uWmj*S&;6Xt5P*fIVy2jPtbNm!jGt^z-;tQI+Q_+K+36h!0?W3p5lB4&z(uRp0mYwftw>1|x;^Se@UjdQbWx2s| zwM|(`!}{1*gR)s$76C3LZNb-lgt2w#3I<3+DS-V;h6;UeYF4`^(mr4+I>@3wy5r6Q zT$mN(`6WZ;jaQld=VzJWya~w#H22}BAjq@Mvp{n6udne(yVfTm+R?Egja0P`VK#5P zYSz&Xr(X<+$7DA2E1TjMz~)ZAT-!DFQzoqZmvWDwq{`dNL~4jf-?n90Y?qNbKyBeR zp(-W}sfU8JW3$4bNJw8Pc!=$niTK64P4Y-(HKLpW;pUHVyM}D9Cv|j>TN-o9b#HTB z_sP6TR|jqu;aFo{Mpoi8eeIFP-eMgdl5-mB@;K3$d2B_wL5k)s z@bd#*g|+=Fbvhqc%fSBU;y%hu?9L69H4$kbwjJ{7C0DDAFU7Zs>l-333P2k$nQ&$fNp^sA<0To zdF#8Q_Y`X)w4ni*!IoF)@tZ&hI@0Bti#d*28^5tA0^JA(+ImU_Kr~j)V1-m8Xoo%oh|vP(upe{!%ctD^Rmp zU^e%&;4$$fparEZApCOvFIMPYsEz;sg{e%BgF4`Fxa%+YDx9k2cfyu5R&Wz7an23% zo@A<(+Wcv17@3TZWgAS3z zD>|8pOFb)4gs~P{Vu?ampy7&OtV32HBxsV-3$IwJifG&=JC>U@!jqWS3X?)XQwr2* ziiIU1mP8r>F~Oh!i!`%{iD4D@7k`*!t*|;MTM!RYCW*YBS@>rGU7mmUxIeBpU@l8& z_sc>$%FSVwaJzeFqc7#p{Q$IiZB9z3rj6q)98wOTAk9<~hT>#EBDGj8MzXXMaGH{c zh*%7!7#1cn*j!X>6A`V*Mge``T4_!FQUj~>Y^J~r000008~^|bks+R*GD;Db{{eHc zN_1ZnQn5y@K#cU#Ss!zLAe-3tVvK1wxTN>_1tbF_V=?_Fxe3v{r zkN<;xFtd-(j?9OwBm|GcWb^Hxiy@Tsj0ikGWoT^e_|1)07c%kw=4WG)kNI)&rB zL{LCiC{69v%*GZm^6yBCw8DTDm-GdN8B zBh&_e7C?Bvb+IKZWEyHy1glMkP2!?-MxwWUe;q~@)q96bZ?MX%S=NvmHTw0A*^*tz z$FP&W`tjSuE+i|&Hm)Pp06orN_N;cG^0)?R!m@U^F9l8mDBFiw<4wmGF zOYOFWPv~G8&@1G0cO0YspoQX{r_Ap>zyb`>x zMqDzreC*$7TSC+vXF$k)C3WEhKXGiGF$>{FTpApM-q|Xn3|zvvhUA646S*PS2V-J4(eYl}mJzG;g@*Y;&@xm-kka2uiJ_)ug?SFcmT_8Te zuClha{1w(@ExJUxz*&$lsYa^sYUL>VWg}9v%E1pvyJ+oWldvu1_TBfhM^@P96&0-s z($=>ZmoZNq7==^7AmjMV<4%LMH*=92>&p&KUv!iQ;TE#Zg@UM zOdCY-!yQ3Oo-fPZ(e;~2!*#Y!L7P1<~mk@P3rTl$#aO8wAi>pD9EVI1AWWdK@$@) zjRR6y^w9(k1zVb)UrxApEq{=9xGvi)H@~@!#{{+%>p=j=-1xC^n)4+eV=&y@gb<0w zFVBo#sH=rXz&7B}%``)%oc%g%6*jsph{WS!4g6wCvYMEC7|O0)7n&7@9$ zxA%q4A0@4g4kYw_F>%DZLF{9K*@beKMOkBq!SqJ@Q!FgeIb8rzGsR+C6S0nVhCup4 z@0Z-1X1=c{UikMHhIVxGV6I5ClhXAa1XcOB`9jnQtuXbtCb1?8or{9#0s;aI0v1P0 z-?_7%>{)|^){0JsB9nF+u>gLP6^gI_DK{}6o}inGxr&ELn~0mM>VzQ%U6hYkp7gXg8zV=8x<`+P6}Wf*I(OrVd(H-utQL zU1s~&ZbjeEi^?HeoIvOBnT_Mo_+v-h#C>Z_b5PPX%)W+4pgf)jU!w{TT)_0?=Cwg7 zR+R>TUc!7EgE`)xN}BWt(| zrmDO29ti%C__jHy4PHY5&E0wWxkd;7D*4lsSR@Be{yVYrhbacnU__FxJ-^~}G2*mQ z1)d01KK)^oK9bRf3`jtff@jmEtSQ&%s@aqj=$87d>Y&iPIiD~P%yHIoAZ5UFCq2&{p6Z}}gF9IoS4CeH2j^+NY zU$E5Ucj;c0_7}ePoRO<{aPb<4Qva0vB&YFDCQy}Kj}<%MsT`}sganMZ^wT&7AK!U< zqH8dj78AA`g&2z3Mvz22BdlotlJmISKQh(d3@JyDQ;uinT)QP@Pz}3bvPu!hxZlWk zAL=7CJvV$5tw+?Z_BwHwthPQttvi!Vr;;^_h~3%pS(-7N&B>!uR-_K3ANzB|Nm?IQ z)<^8O)cPHHS2>ybdpolTV2*O24ou?+vD8M^iZ}}hD_B*%0nqCzv(w(~Au)~4l(6G0rLca&LD`@KiYP%yfR z1T*c;1aU&>O;~rA{g++@DWDz0cjMP97TrP#H@b;^dy`FzGd;}=f9BvYAu@7M@Qw%& z^yL^hMn8XG;%KRxy~*CTXv|aVP?yYn54?r(Ka3&e*+3Xq9pS@PYkN9J5i4OR3)i`H z6FdUH+_*S*W_)8Q)XUZ3|DuNDpnbd^yf4ICx0Mv}tbOrj^#G(u&3AS#wy)ZsW;OKg zhlWZ)Dc&GIq&Tr&fi4ua+yGF)a3g~9wWIn$O1F2sU4-K zqh;H}pK2m+F~tCSyT%IJ@BiqGeE_(Y5kC^t`r8>w9Y9_0jjJYKAy?r59B?5T)pQA> zI3{14t`I6ng@jv6ySWPs)bJ$8JWgkLn+aC9t!I{bf`}b>v8>r0Kmw+Kq9t*qX7;pI zx|OGsB9OSrNGd*4#=Vm%qDl~4r3uVtP)T7GkZuCKt_v3`j})FvO~9lk2}3xb=!tni zm=gksuLAX=qC%L%a0S7ZSRk}Z)U>#;i2p7oyVCyZm~pEzd{5CCU{GGX8iKEt3paH@ zj|FZZleAP9Ik8He69hWToL%4dO)uJ)MX_m6B?ic~jE%%FmcTA7FeD3A5RUqVN=}P` ze2`NKY*qjg&p{IAK$6&iCRA1ttU#{aAq7Yl%X8oeMhgI74gdfJ%K@IfwuyfMa0yD# zppbNq`-ECw;7256yh-p0AuCS?c8~WTVGNoFk?uHOSvndF zRW5ZCE$BN#CZgQAEBb@kr|^jYB>uJpi4?no1>0=oJhS_ssDpz?gTFa*dQac+7xS*n z6AUIn8g9;QC7?P7!%R16AXfJS`Y}L6qln0cr4+mo{N74uCyvv+oh>Dnq($+O9Y7nX9ytcuOLre*4rQ}V0K-D2D&vDs?J zc03kw#SGEWunIoneLX5ceGc^-4TugPtP1Y=D%niHYlE*CRi{xuqD&9X`!{dfOUB~K zbSX61yZ}Jhsu$VKoU3^JDjQVQOPwc49X4-uw2Acv3YXg68!smKYsA}?!+xSpBIU1nx@)ZmSjuQrkJ8=y#YC%VpG1Hy@We4%p$>WCiGnEFj!06E1b6`^EAY~2N+>T& zzq{|b7r%7Yfpl@BT3TkYz}qkdKJT$OEsUnB*pn^mYU{U+R<$8QZhfS>%@l>}S4_=f zI3ds<4ejC{Vcu_-r9NAR(4oCkbA0&*6Yr%LX$qGOg&M1c{7kHHI`B|*tx24>WzwZf z!70NCW)Y1mx-8Czib1$Aa@a~IE-yIuAf^XFkGA@L8aU)o_=;BXL(kQRRQ0@qF^#D) zhX^lbC!Zw4&`R5Lfd(y%FG`sj>$2T0CDyl_>E^59c`@d;-+A~7`i$RJ)&aVRWuF&s zqmZdT8wXH zjMa9$ zTz1Ff`%!Y7UpE>z^mAr}>Y(&t5QZ%q-(>5I$D)VVdDaA&^t5GuH}OrLQO!Z;gOWIE zW*7sJ&fk(%6NJ7MwZ1)$`XDr6zYx*zwZbEb2b?O3$xoW`7aH5;JOC8wBT;nmCI>44x(VOM3 zV`6_hK&mgl3%O)a+}*!Uxd{aLVOja&O@3N$VhVEMS+$dJmuRw*)QRh!CC(5IvjCRV z;_aG1t85xC*XVC1=Wap{kXkcC)6&%PP_4#p-=5)~WDh=3-?B#fL#h>$tn3SJV=cqJ z&vQ*9pat^9<8%ZVHO+eEF=!y!5U5<9W*l<|&TFlFwf>kN+?Al44%JQAKTW=x=xk>j z#}k$zU3>JkZjml3FSv5i4kCO3nf`u)+ekCZmz60;CDv2NB^ z^7eQ23yuS2Q$-hy&fYyyRL3w5h&w1=l{MCHmM@yJ>-48*$UkgcfIoTh5Def5Vi7O~ zpSfJx&Yxsxb(Sk)Z zNQ^T9f-ZRCz(f%(q`0{vX>FyA4ZtPu+!g2fSe+VTN>mt$2?eb5tq7}y2oR9Sl&2tu z1|C_^s2~tj5VIn=BgKeg#!t`fD(+brsZj{eq;C>MuUo9Tr7cMVAyU?z%G^X)q7$%C zCy1obR^$sB1XI#bm=YIn5l*&3@Q%2v*&OY9LaL2KE_?tOBLEx#003b?p1%|-L7Jc? z)FD+w%3v#({{R46G1sRZnjD5(&b_nRmFyR}csRE|xil03`l=}3HxAAb^wk`xs8Q`F zASMN0JUrVJf|TiE80ICkADD8G5-$DV;FnaJRXeHKG}ErE5>vadv&*}IV3@aCGhLGn zKG^P`-;Qul*m1`i!`452yuXzf=0EhNkG*T68lGEkI4&PZ07fojP~;hE|jm&f#i*5kQ1LrvO{Gw z=dw*^{?YI@-Nh%$wJ?4WjJ~rq;vuQwcBOYEGpj^pqiX1bOp|pu2z79oJhj*;nL#=qt zT6tVs6quAhh=wG~lgw*%q7Z>-cK@7O(JPH5jX6vku?de+P6KctkD~UT*GZVV#pcT? z`Bc^_sF~qH)uL-gaUfqU0gqvbM$jGRs15;a^2JdvIYcQHc>VEsVN~5Xfq(uvWowQ5 z6|=t%%mXxkHtUo|+BH)ql-{Q?j663H>gDYN^G|!&a-4;K7Fes8_16 zz$qzD#J*F{Fg{S*t?anUuqnJhP(jT8EiI|Rd4xj{jI2XsT5_m8lH)B(OOblqn*Z`7 zWhv)ZCfhwrEWcFpt^HG%!;B=}I5TxO3cFP44cq7~pOm}Z<@0pVK z?0Y=*c2|I#kd;U*?s&ah^mi=il}4LYm0kh4OKIt&TQ;<8tV%IDmn}rW<#HZSl?YmG&&L@o{?awE1q&zqUUvnwfTar zx{Vc&nd`#AT<9_aYf5>Gjh_5ROGEfv`h+0ei*%?bJsAE6zT zlqZ6W-G&i4NHt$H)eItv($*-i32bF=JB+6X4?iR_G#>_Gli-DNHz1t)+FyqI9I5i6 z$Ec~sli?hJ-noRst_m<6+y6x^CO;^X$BW<#srJT&4r&34Cth^N& zMl_xZ5wqVCVdWtT!Im?;8Hq;(*N86?^&DwUq9lAC=XPe`6E_ka@K_5|;ijt8zdYDo zJPxHwxTuN?Ynbut+nC=AI@JN|SoHzOR+qs|?_f({Nl%_w5a9|EgIb@T8_5Z*5b3mp z#}iDYu+o+k0Iuk{6${Vmid;bK+-|;sKEV@oXhXe>*HJW-3_+^GRtPx@|k` zk0dT=6x}eD8x4qOHIp|HC(iv;%$oKJ?P)DaE}oa!gOGFkU~G8xvsF}0sNiLI!B9oi z0q?nJ;rnZE)ik$I@V!W^uD{B&gTJV+a!;W;` zkU6C9Kp3%@=CH0jLFbwPn1Gr$S+^c>V8+<`;b5H4FI+rDmm*{Bcw0>-qO~kOx7K$N zECbh%8R2a|I2KBw_Xb{XCN&ow9bC7J)p_G`})Zz+l1;x-lb3|3kVa(gU z?1opuT_R5OeF-8GnDd-Z?QZOY1ft--tZ)@9jHgOVWr7)#gbi@q4>wW#2;RA{;^I#T zCeawdiS@1<_BG%~F_1BE)nHqg zHgr@PP8(IVrqF9UPmm7k)1AN>0BuTm;jg|>R9U}JH%Iknu=Ex2E}U?FKRQ5QRi6wk z^T5^n^Z@p|f0|1wWT@pxAB}aiYLIEILa#AEvxNOs>LYK-jw;pH z6S)F>9J6hcd(v{|uQw;r%ot(pS2_x78V{}Aw#;Owtn6wAayWn$=^>{t?t=l@jS}8T zpg{dAV#eZ4qs_$&_STE4hcz17^Nox41FT`xvH`rNr!tQ%TtZn%VeW`tVbdU3@n>$|b3vA-N-yRyd=iQ_N@L@0&>g4AL9ciSoua`M z|4$|U#nGHYRfiP|u-unfFTHz#LumRzZw75x?!OiqJam8_{4a9M8ocq-Ty;cLW=G0d ztg6Rf)FZOHI(RV1=Lgjz-5hyCGdXvLaPOy4i)q>*Q(DkKLHJ z1A4slZj8_d63g--3UPpex0glk;840sa^Z)!|LS$@4B0nW?qZyqFx!4iL*GrY9hf_2 zsAf_5908Om%o2@0@Awi&%PW^+oECD)kpN zC+|lq^Wn*Rx3HwbYC*D%>lZWLRq6L3E^zY7@7~I~N*zhLDi3_SZA@JdMVWk1Itecv#D~wcZHb0@_uAo!Rf&CU52BGQ>-S zLBCg*(P_?p;i)qUQOJyC4yS>8sTuGm*G$b!oa972T7Zn=@qDD?c_X?It&`leq@^_* z0B}vR24zMY;v8U|u(!$M)FO|T!iHKsA!DQ z`qH*2YXX=}EjKQ|Tm1-{E4l6d=n$#=M{SF~h%j6+F)2EyQ0rAbtHs$D7$@-QtZG{0 z4dhY%QGXlJ9m`~f4QGM3X4M}E3_hCU1dqQcROHg#NwNL=Q zMjB+b{kA!|^F-+K4`!PW`ojZ_GD_+IKPMSw8Shsf6bc+~BL!NkAoRe1?X*wPQ1NWO z%FB8*`~^8D9~3C9-u^}e_4%dkn+-Bc9}JXsQ3NtI@ZYFmnQSry_|5muBtg1O5hW%N zjZ&{u2Fh28a7iPN-E~I)CLKt1AqlPwOBoUot(Wfz{Z(;I;bL9w1b+#IPu%U8rO_$i zgsKC2e3$hPKqFNOysSgNeCxjNn=nxpC2Ei|k9RUe&&MML zuSTUNtPY9Uy5wfJGvocr>s;w`*2>mXYz9>gc5RCsX9PrfSsA~Vzx~J{?+n{xJo|8O zd*S)>X196}Mb-lvj6dlAHZ`PgVf*FlE(CCIZ&jLkTc{M?UN%KJHTB#{*zPklsxbcg zjn8Aq56hq)u746aixjo_>OvWI&zNsF1Y8n3HOo8E9J~th=QIfo zLZ!YZ|Mufw)F$}W77YYKS6O!9IC&ct`;m5yfKoKnr;aE6g%VneXM@j7ot;MDgv7i z>_`)?>WK8MXhs@uhmqAlsL6FUQ@D%)brZrBCP@Uay`O){w|PEBG_6|$#iDHs%$&Qm`uP&0!of4d|T2#rj7~0S}Y^h(P$K@Cox&O3RF4OSx*ZOo| zb#9eOUSgbKE?cG}AGyXk4~ZCo*`>QijP+ptu}%^nbl~ovPP20b&(cl^g8n+e>1*Ft z#)ij+>#nmaRZWB&qfA6;1+FE0Td+m`&yCjxOK@72Yo+_Rxaig4ndIGc?MV?FO`b!} z>=MzJE*+F6)I`i+JK{VD^EiHAf$MxX&i{(1CfSxxe6iWhtxRBA8?6}AM&KtS>)q4hKTH3kV! z#IQC?WVpJhkq4<>%VRh{>m?Po=8i#3-29W?!(x(N-QQ5mTL6aMT+}y}j$v29S-CF? z{QQ#}#H9rV79K4e0Pbgot874Cbu4Qv4I^y;8jF80iYQhgg(2Zl$l{pxhu98}(a9n| z{z+r;Z#GpWFSev=>MrxSMDNiy5ymE6t}ypX*zG~<|xgmTgz!yEG^Sd4h?8& zVp$m5g}DRoxpm=J!EoBxkNEdXsdvsNX&Kv|O(%6~Q%WYGZuj!#Un|zA;hft|bY492 zAMcVE|HH`Vj)0~ojw@`buR_(mYYWLnRDyx8>#8Lov)5oHc@~bHW6a!pG@#;5O%%Y8 zEZaldnjmQ{mcq0V zT{kKmkKNMH6xf_HJ|i}xRQ^Gia_hq5T5qyln4TvVn` z6s4}4WG!A8K@%Z^((v@U$^C6TLgX6t!o|lPZq!hXO8f(}0^U#Rdbd4LyMtEEg-e|D zjBG|Rqbb!xlI6562j!>tXE2BGicL^ko)44CSFSQ9WX@`MpH|L%zLgef+c&ayPQdLe zz2&XxOW9Mt?`}4j(-lel&M{mLS@)hB^f$7m3^M44in_Q6d39D2~O>Cw3sorkQEX zZiU6Tgjo%FsTL}|s+s?!Nry5yHqr}O|EWD*y5wq2&*R{~D?s_W2^DY9B0MKipfuCn z9W?>xeAbJSjk~>IFAO0Vg~Yp*7z7KL5+H0$0d)kBTW}ZG``o>l%XA z2In5#=xRQ>9Nemyb(j*p#o#zCj+gnxQ<+Lh7Mr(*K}NkJ9DDwv%jUntzx8?)%zWeZu82o7}nk(=KY*j>M$ z$j+{qrO#?8W^@kn0Wq!2B!hS^B|0_EV?(NFHvL?6dr|+`p5N9!AW=#IKAA{1HEFc? ziQ!xQ+T$4NxGj{lZb*d2@Tig#C;-+Y;=$hWNRsrc4P6Lck$6Kg`(7jXrz+pvQ?3gBxoD%HiPik^V`hJP>sDqPx3PbX8G+aqfl zh9tqYUo}jsDJH!+TO5VQLIi}=njo0O0$n5SZSxjKAjL4gb!x^$p;K)syJV*?@FcN{ zO<+(2IG_*;{G&N?&((BQ47@T!nQjL_gVF#Me#S~dn_vqHAK`C#?=CKslA6*m3X1 z3_YZrrg*n%j;A3sb#?3*e}XqPgbm=TGZ)&t0L0BODfvOuttd6FQxAQ?T@D`Wsz@g< zrZf=}+Dg>9M5a-QH#{8BR22ZhI`UR!79Wq4TX0<*MCTW#EAuslVj_dJM6!a(eDPGn?Fi8(B32^Kq{ zc&8}QEdSynw?QAQ+9ZvG-#s24+q!#fggiV(u-p}$w_A!Lg*YafkO9h8B7rcy>7nS8 zm=|hp#jGkK*LIO0foRm~=xcv5tpegB4Z1ppf;vdNC5;rCc%d{X$4u*IO|`|lnPCE% zOtTJH&;eysYW~5HN}%PCw#Xqg9kqb#3@!ige`Bs{_mGS*-?B;*m;V8Cu?vaL-`^Z}v74qrd=KsYb9k@d4A7hJkow8R zpu?Dson&306mn?PA8hBnVs&Ors_V@$mQUnp?_?J8`+_G;RJxv|?DQwcK?t0JpmXl@ zJ{Om4x8Th8KxYrmev(nMs8~mla`~U=N%)s4`dM(K?TA2<@Y*aQ>f;%*5~#F(qYO$O z8jEMz0Z))3qFaeRsJT|#3=v*eR~drS>cN}Yvf(GegV380JC z2a$S)Q2>u!L_wTZm`v}ul6llVA12@1aTU(uqEaFpbeR=gPfegkFEV=1c=-H$fa`1Z z8VDX@3C6`FTGEyuYg$<{4NR?_KvgnG)p|T2=Rfx5b*gsxD zPNg=t@tBanD%{is81{5Q;weXSt@}Bz#(Z7;Upz)Oz*Ye1@6_D=sc3DXnV!pVi6CGG!SZe@am zlOkFoE6AXs=c{aJVKzu9@*a;H2y-Eu@6Yd!R`IXsPHa38D>U7$qjfC}Cs|t!yN`f>F=vYea8PK&9nm_7sTVEdV<7 zFkqcUmqqT1_3VuRgeUPj%V`f-C~$m!C>C3RAv~`IX3M~iLd+>G6FkRDB;bNqNRCWs zODMo(EMTKuE-BMiy>d~hN0!l3eB)t6@7${}BJ$b@M3_~J4BPxRtB55nT@}m3OW|^d z*x1p-f~Y@N-BaXnQhu4iIP0dUqeQX}aNG;aTR#a<5!QKUkd#sIzSb~~VrSKI5GaQc z+3YpP&^?Crv(=_L!NCb`{qtE{(BDS~H-5_e>+abQ{n1s3j)K5tG?_tkiRu30z zAP7YPj@jTh`+64BM&xawuQB6}#ap)2f!Qj@*NNIFJ9k^Ampf;^ zb!KB1a$spXJ*Zu1%mZEC4sO&MI%uw6ikcY!xQzTz#&R-=`28!5Ct_82#=! z23)-gmwRuiCd(0cr>=~D46KIS&fq8~DT1EOkWHgS7yLCq(mkavYd4$ixpY(~tN${a z3jNaW#+CiEd`wC1@$V;Kj}X#%WdS$+S_wxUGO)}d<8iSADtE)H*dD+h(jj#9V`@rT0QbXu>1$q&h_Z`&8NHqH;aefAJkmE z$l4j|SUwUKMaR7nuA zFi7u0rGxJ%AXb=M5Prj?wb!+rO?ZA;`QB=&+t|%pPI5weX-+0ic+2w~YPDZadCWI* zH*Q{F^ML(vXJ{WxaT9V$N8nelu5?7w#&YmbhV!h}nW8>N;c48zOk@d1#ReHn@9in) zkx1WKIwmPj+aev8Y3~3G92v#!kxza~A>mLZ=q{AVidg?9Pm?L7) z^-(a7SpT+a@mGpRDJz)|CvKf5pNW5gPi@<-xwOFc3#vBa3fF~`G`Hyx8k+*9+xXME zEUTR^bsrp)^GrsZ2##mwl#2Jw#_#)^7cLv)@y3f+nK>^zZFgv@2Bat2B0*D5HB7Ie zsbB5RD`e;I7F^tE4Ld6<98;MCx@=evMS5}n&0Bh}sE^MnQz0!BE@j-sa9d$A->@R6 zT!v<|>uKK#^T$ZtAo%d5Pdrsl{+}9UKsH#XrLr_OcC26IuT={QmfX?`CLQWRLwIDA z(^%q?s0qMTp8|%6ePNn`1|X`h$y7jjC@pJ3qYjc!hKC+hCZ0vH`M!a36O;?nC`{sS zG(_<|$7M-MOu#bBHl;;rWyvho&4oIE7>ZY?j)n2;C!SZ-tr9w)sr+L=(-FFNM&p4& zO?(U&jLYxr8yKp|7*$4OPq{L?=nVPBFhP)k&wIZwATn8<1gw_d-RUFPy`%W2Sb0-* zzOG72{=buDZ87p)?tdY9NSq%=6h+D2-S`J-!308>W$TIOgzVq}T8M=>N`fh)>7Nu) zdwR;ms_$szF~6Tz@R%1>R@}>%XxVL3>e|8klSzMc8JgO@Peny~-Q{DfLq`i z5o@YWIbGVQ5mdT9%I3veZGl*d2`Ne-RSuhd;&_$!NqRQ=e&zYA>s{7RCwCcE@dByG zzYViaq~=J3NSpV6PGwXSK$0fX5&VYkfDlXpmQyO)P!*ud6XB05SQe15N16UVx5qg% z(DXs()k3y_7y~_V67=r_!Q_5Cf)-CPS$;Y?61dR3wkV-=g(wCP%OeU$07zn8;@{e%!tRY_}1w zpvhAoL_RPLZ--w0exlrWL&68;o{;%=# zEtHA#8Dua_Q1?Pc$;PxJ2hWmcjBw=;NquZ#9_0K^(FF{g82rrKS`xtaVCB*O9H4p< zE@i2Z<)H|!^X1}!Ee;(06N+zpeT4f3bLUx9Fr*V|1CQ58JVS?FTN&|aC{5}SS5soU@0~At5 zmiO+&BepNA%B@SP4gv!G9Zou?LGws>`hadJQGBl-w=c}C1^^c1G;3%ab|FSUTUT<| zsG+3AyvDjs%-yoam~`m76*gN33Bu4NxVj<}azQ-wKa(Ya#78{NYdk`l)v7qy{{`Ab z_7gjwtRy&=TfdKq)2L|#%^VTBR;@Qaw9b_&!?KZ5!mn)^o>;B2R8s#*$BN}w84*HK ztE~ZtZgJ!%jA!V~<855aYPN}3C|Q42ZoyEglBoxLQSFg42o>x+u#OE&ZMXuLfYe&8 z-rVzySVF9pY(MjCm*}1%qi{V?uDD}O;k3Vc&BjA%pd5s9737Jm1nZ*NZ!1D*Swby} zK+^=*gDCl+(pamof}|vh%MjbCbJNkP;ELZ#O-4fswj43$x*AO5KRWH5)Hlc$a^&AS z+fK;l-m!wdl}6Yz#Gyf~EK7<05LLC0S!uyuT;c^ZYLH90X&rW8hMbU1edObQS5YK;wpTxzyS1|~e{ejAy{w3Bzo$~CD7nWkN2EmbvW!gV z*~QRLmw{sy)FTluXW9Zs@dgK0P9SZl3MXdCG%bKQ)gk&}9g8(+%jBO~T&_44HK!;i z(qQ;wV=X$MoBxAde7KEHmA(eC)8V;i3RkvQm!t*RAE$ZCJpxaLvF}f2WY5V%~q(muz983@WP{Fw+V@AF09XJ18m>_Bn(96x<-l^hK;$90x z4P=11(6-q}>lSY6hNfTg`MuIg`XNhGriDW%V*4yC2vI(}rB=|tuXIfn1wFFkW!wD8 zD7d_j`-9VJCii1UbIdoupm^|Zaw&&fc73Ld9N3)IIb^lVV|EN@qO~1xP7hfQGbmeL zdwfbgLDNA*X1IHP_D;l~z^Ops8VvD&vXc7FGv1M}<47Ox6<<&yl++p%$HUg%y!chbO|Re_}YRjeq5i!O3ukI^6oXs@z(CzvufTyFjxGxu_oBJ8vIvd)Zzpp+5aVLWCxd&7^eCv+)8 znxIKk-zkOdUicI-E0r#{piMk&iLO3ypIn;CKK188r+((q zBk^PmcF)Q<-!74=su%dnOf)43e-KFw;Q$L@Urs!~397hoB6J;6oR*oif?~g8$v-L~9UJRz0 z7E<-zbovd4J5g3_kk=s77@_xNwTj8FRskUUYy{27;jWP{3NbAJafuDJ(SP($56Y?Z z8LRxz5%f&b0>U=TtTU9u6V8iCN90H3e(cou!kcU~rQOLT6X9M!{%!ts-Vg|pXbz7H zmecw4PQ{d(W|wM83BW5jWROqDj-pLp#fEAPPAgeLEWXz*lFP4V<5xY@Z)^bf9n>iTZVz?V@Z~N)V5FHB61kCZ6 zs0`$IXLI=W&;#P4E`WWiyK-T$Acf79E!;Rnc40KTJgXVzBj&Fs295kGZoGW*^CaMM~jt_?eg_IBw|SM(cBlF z8a*Tf{eJE>)L^OrI^ZE1)m$wYaUqVP>L3Umm%vpELW1o7cOyq33anl<*bHZ*4dhBi zJJWW$fUy1?Wh4Off;nP z?h2eHaf4WFSt&Hw3-I>)&K<>i$&Ji>@j+YuYeO(4NngsLv~|VON$dwA2<)@~3~P`P zQ3Ym_1w=C;2DimrAO!;mB#Hx&wG6%w`C{Fj&xL&ATu(b!3Q}!xKc=hdRZQLC)1X2a z-5Z#FJzGE`W8XW+U()DnDmq_*Ih#lyw?9;spB`0&0Zsxe^oO?Y%ap4%DZTo|*pb=w zdNLIt3`~Xf$FmSi7fXA0IjROiUeT!8~$z%M76 zGQA_Be5$C&_8k@qDmVaHG*I}Y({1Pl`9Hy?)4C_zd0SA2rphGI?bk?0@a9;Vx|3@j zv?q_LxWrFS;(gH!#}*fqS0(Os$vS~QhONQ@a@tjYKhbA*v*scl=njI7o7B?`C}w32 zXDgr%P!@I!OxlR}UCEwaPANHDRCj!k=IR>3vGm^WTBZ9H-2F1tsOd(J>oAs7k66@FUW8LFRdPYx)UrQX4r;fdBqB4TRug`T zuPQ-wX$+UA15}HR$z%OY!6N}4<6f<-(ZX@)r-F;oaJ~MiA=Sgy)O`l?J7h3;f{c7JTvfA( z>(0C7e-VJ(Kd@RTGTY$ks692m-ZcdJdUi?Bd}ubz7!CJ*^F^OXOZ830v5tqRy>>SG zyCx#*5u4<5;b&62c_LfjRwC`yT(YKa_6l>IBcm~?^DsmmHy`c6V$#Avk;gB7->$cP zI6l5g6M@ckOqc%fkwjj-D6)tb=JuKvM5s)vvelM^Gn+R^5)aZyq zs`sqb!MhnsEF_&rSGgGE+1999y39-O{SjoaDBkuRu_NI0qe=%Db}3i^MOC zWHquupt&@J@4rOwppB1KL{@Ku6a*6!Y@xgB?^VZ;^v6%ylFb;0E2eLlQi@}1_O(p< zfGEUdSv$muNda39V7ty%>yd9jRi@xj((}6gINjew$t!(pg!oR__B#erEKX5#Z#&ki z{6Anb%T9-M0@AtlOp+g5bM5eJQg#TYph+4qN7hYn+UmpK{odwqu~-jOgR4;^m~m{23*gZ;uu} zfRjqIfik`%>ZRDriDm@&p+<;finL-Py6*>JZ<)!K6{#Zve3^q&1=9% z$=|o5$ZX8gfZRHFja4pXC#lX<>fMKYSBGRUu%}}sn`{SDRv*0bqT8Y>9nqNbZ<|7N zIx1*ny>bI_!%r4e+gP?VH%?Q$vq_89E~i1KPCX?}A<*i4taQcGjSk6{O5Bw&AHGkm z1hZQ^9G03Xe>zh6U`zT(MWT=jlDZK->P|x8%wRZU57qHlYQ99nVl?2w6dPT)&DccW zjurhC>)dUMB0U9x0K4FQXJfX0aj|8j+s1a9PJUnX8UauA;j$Fs8$yl$D-g2bja`y| z0WH&sQ*!}_y~S(ZWSTK9j$E_>?gvSQCcRKZ<+~?cuy!oKMAveXd9ed-tGA8C6i%!- z*su)Co+=CxT->NA*BH5kg#!w?$8;#SKq;1!wrHWbHr_7)NA=urW#Tez;Wyt;q;>tv z{t>cGvj)=~An!g45#w^Fc2U_R^PN>ZdDg0ijkU4`8}0;pRQ$l%k9V~Ps-%cK)4-jL z{`fA$6uUq90kWeY=N(>y&p?KL<;;f+xH9RCowV*9$t9QR@rv z3{JjhL&X8M{7+Lwlcs6y5waeV)`Yv2rZTw&MguCKlC%xUba&Q*+Yq;*_c>N`_F99@ zKwhtpAw(veK)pHV+BZ%*u8}}u1f%SyVhkGgeba1z#mivDA@Nz z0hU6Ec=lM$c|w$p_LbXd)Qm77Re-`9eh0r8oTi44e$FU3Gmw2T7bSFxd4MESO`~YC zLaGr6fN%=s&|fWu-8^!(g(Qx6sIDP)5VF$nz5V8^ZgNSF8{EoxgU4&w9d1+QMcxJ z`)I)H>-V)%5Wr%gd}ZI^x;*XO>{D;f_XtGSL{A|41)FjLVb+PRLCZApma@HvTF3;h zepu~BLV?a>Y}UrR)N4cgxXBm>frYxd3?lWkrWSO9>TiEjTjUdA^22kzMYTI(9?Qh_ ziI-?^jiPtIKTuP7JZ+S&c$TQ5NIDd`>IV@8=}&bZtGb^4C<`b(V7uG9YM$2oK=#Dl zxT4^BOk>7M(HxoK5EfH8MBa<`{gwazrW6R>;laZ_ti=5mPlLP$p*7e7k4KOD~rEULB7p_qg0|e?t|T)&5YcGPt5l-G zV5L7}V;B7RVgAm=G0SlKkRpt{H*Wc!EWeG9Y%g(ZjiXY6f#A3M9RIRJau;jK0X7P& z>TAFjK~~7pW8m3>Qa^3@bVX3qI%`HmA-JqtGKcggTxwRwr{m4hty+8m1^-)zFD=42 zS??GQi#ATHrdCa2t65b~lHV^1h^r985_M(s&Q?UxF=%;xr(%BEx?|^-Ns{*>1UC%j zWj0#$;ret+Md1lG+}DaQu9dKCVZH4lc6&pm53!nkBYG*XDGs+fOd6`_!%n?D($9pm zmdCRjBx4i^NrkZaWHpo~4)pJnDb*vp9)OF2pHe&wen8nv+rcyZG0x$#GE=bH+>{&O z<2Mr95*F=E(9slEj&tyHCyr3>(@mVBH#kM-ySGJPB4y6XV$Cj{h{GTSBqXRQYL)EH zAs&c-8-|u4y~XO7d9a@Ak)u90h_bWCzh~h?hX^*K^sdS?M!b`&S;D%rDc#+Oic(!CYp+3G{2 zKF~NugxR-I*0AI@U3zTCpR;ZyGAdVV6!6ZZ z_Q#3}N+p*X=-#a}?lvD&WNlzh?SwEQ@x5yo@INTlcA9(jIHrHfmKu8%L`@@U;!G346GN9Uv8Ag~;Y7e4jX)y&t`Z@nb?TAgo#|rKdApCZP#p((=)+0kzA( zk%I`w<>#i-{OeYX;#tIPJbQ@Nk2|+oiu6PB12BD*(%-#0RYmOM3UZLc5wG`gU0X(w z&u8%^XG36^OdZ|_Au@vb3=74jHFIax-k}2LDT;JOT83(J24(;f-y~zBX6szrl+p;h zK35dS*?d8eaYUdPL<(w&=5GS%nF$!nG1S;Eeq#VWwY@D}xQZz#dDCYl&e(U{e?wjQ zdU-Y;7VUe*(|0+Ay#T?riszZ?ysO%xyP86CEoYbPvI8yq`f%cGDxGyTOYv9)hS}FgYxJa5Ga7MAd29b+9Z|MFM|Vs zecSCurL&YH5qSv(x$t-D2mILp4WIZfb`yI$y`c+*s4B^Vx0UWNM>;=}bc>xA-e>RS zV7Ad&$9fa#7;IyL#-0=L>T{W>`~i<-ixB3gGi^Z1tO1u~{?<*q)_MneH!?ptLm-v} zQaV<@z{@(R|540jfa!Ul_HnwHsX{=tpXN%4mcZ_tn@v7lmnhwh4$%(9zM(*J%fc=X zmwF`R`QOp!1jv@I4uWxK?^-bO!}x}=O^8w+X&MQ~!Qs5R-|2Ejyp4oBbmY;f6o$=B zb;Cb~0CD#=SpM?$@Q}MteR?lpnI#r3h#NOggd~{%RUYO**3uWrd$Lu!v-EP@KeNB1 zhrOI~BT$L8$E$p9Qdq!kp!w>hIt3jiP3Y02D_uEYJTNeGO!!NTkF>N>j;=Eou?c%> z+fhUiEE*AZvY4#^p?q8%kjO^d^>Vu37cC=xyh)$hZi86CEVtc&|5rz&PNhzVk6M7Q z)f(=1;hL_V(OEt0+fJ`x0g#JWX#QUO?aS(RC9xoS)|4It^ghYbi2;c(DOJZ;Lrkry zid-HiJ^^Q8ejFnAbVo0#5gl6#;!YAyKU`H_hl&7F=SNfgu>;?^LkTk`wNUc2$tM@p}VREpSktM3rl4%}uXR_J`dn`co;k#`~}^A{mX zFH5eBBSGCjxJlhI>#0L-;FxFv&8)FnPfRNaZTZvKZipgKH|3F~Rj7Jk%v4sgT z;52vJBkRZP<=HA5eGtjZI3C2XA(Jwn+*HYMZPdqz4$oTnq#8g2nhZr7L`!BmRNc@c zj=DUeJ>Q9*je5*F*$dP!-PMn~@GV1%No=5A!mOyA5FjffeiM+CL4cW3K)Nr8XRdXo zh(XJyl4ljjYy4*y%)<#4`iytW<_uwlMcZ&2c>-}pGT~-14fvUb*Qd#}^RFqj`TfYsW?40Ou)-k$x`nwD!-0Fx5LgiMKRPto66kY2w< z0o5iZB1cJx<3X<;L(myxe5A3xYtADUWpC`gl7#HN)HjH{Lz>_U0Q8YZ;A%zH6Z z>P}AQU4xnFe;)OS%Cb@y+~oUO*B_4jr^h}V(hCGB)@2+ zGug?)K5+NAt^L8GCNIXFcRgAug)YmC;-!CuKY=u1c${^`#P{4pd6bh&sNxTqx*D!d z`z0j~eu^-M8bXpO1h&}_^Yp6GrvK7ZL-br;e3H$dy>KsUR!&;peC?Es7X9lUA}zU= z>J8rGDH3x1H9_2HD1Ps|;eF281HXsij97U3u#zC#0(DC+w9M&CkzO^bcxfF9DFG^L zyLYGb&Jkf(y3O`M6sky09@Oc|i-nJ`(m5*p9U|qkiUzzAb5%zlC6{;-+X|a8&m&B& z6b=9q;~OTls3PEqL?6No;>kGke?Ck1IYVu@1H6^2% zimKF)2AfS{Exk^Joff7Q6vd zSfhT0eu54t13K2LLjllSJ$)PsW=ItmY^mBo+uE;iVp=7i9mbl<7 zl!YMHm5F>9mv~Lx>s4Ap=NX7QVl}!%$<;PLvlT&qx$GDos|D(UilZ&l%zg8K9bH!* zU_)~2A$gd#H`iH&yeV(3u&V1mieN(f;Wp0Qn>@c{;P{<@%5e~ToUx4nmt%#tjtfXf zJ_%qEup<{i<6Se94$jvfppI})s0bn_Ggq|AF$}=a+*Ff#XFNgzx*z0LN#;%`ha-Ru zo-I%kKOq+KMYmR&H25G{Oez~>YGrw0Qo+iRRJ>B8bR|Ozh^J78!B_*TRpqGGF%P?2 zngWvZ@XJOdq`Psnd_ngE@iAJdVpV59YgeGLAl#^y}$Nd_iQad4Y+(@@&<;@_j>s?w0OA``2BSKc@t zojw+l2sy8)Tr|6Of|i5>;2@v48-gHRR{1wT17qwY8kMmcLBPWgxFFKR|& z)I6iu+;q*gjdsSm-~q_e&6%F|YTU#|w^}9t@5)4F%DtIc+BD8HWtbdQa?ujnnxWLj z$55rTiO$XMs4WVwO(6C`000W`A)f&%Dr-($ZZQYE5(2ixYV~2AKkAG|i*BrWp88V8=_v48# zNv+I4#TP4vAhhN`N97ceWcWBa=er7$_8NTxfO*C{O78H7bNQUzKp*M=Wfq9U?qTEub6}zpf%H9;D8+eK0HOQ7%|;V8p%eZlz|OIU zh&5ePn%UK3@_pD}?tj`IW3nR6VpC#}$0HW^i-=1fj+prRt!Z=WNToa1n+w0`X}inA zyIFXk^>ynYdh4|`DZN4ILXH=F)B-=-s86)*kj={~pUCxQlrG}>il@d~Cm+QlM!wEDHuXk|)Lexzn+k3E_J$>fyeUMt`HM&LGMq(YsvGC~sLT(KJ;P&XfL zzTXpf+8cLaAWap~L4QQIIVDm0yDV|CvBbFJzJM06)i&Pw9l%Pf(GL4W;@LO6ur>o8c)kfwZDh@9{d=1P$-LRi2t|h*{&&(%ppjaq z_SeRYf$j<@pWDnl)e~<9V5C>L7})e1E8Zf4HbA?l%88E*=TKhrJ0`lg;tkQHZ_ule zz~HkR;OqC5f|YZ}Qh9tuFtU$If80E3XcYja>-TWT+~{<|$OF^@7GHtZu9VhlDtSrw zMJ%s-wordLvF-#OV}?->IN}+pw)sfl%8`+aFYd033|-&Ovc+FirsZABal#wSUXxU< z4mEbyx^Nt(zAXYm6Z>R_>s@M%_h=J{9CIRPC?6w~^_^Zd(YM40I)IJHs8cI_=`flr z8tX+;u`Z@)>>5>bm-;1ddmw5$H|ydAOZt6_Mz!%pUDVj6!LDHcCK|1&Dl2z}x8{^i zH_YeVb%C0i#HH)^V6MLjbCAM(SydjV#5m`HBUb$#lr z>O7;r{-GJP@^`$7Y(zt~Nf{eY`Sg@F+jd%l!u1?YcS-%7NEk>Yx<}Xq$Uzg}bE8D% z(>qDc__BvsmCZB-k29k>CtaNUxA{!HK(pXQdu+|>7?=rsZIqSP$pgX4Ec%if zrNHeY&FAz%z!N2bPDy=2R;a~d{`C&ZrjB0BGSD)sQ@o;sz_)`tXblFaDKsF^wz=yi z&?%GnonD7vvVfda5Ip!E&l)beI2^4;OT7hQ47L$D1|=-*=k@C2@op`O)fq1hx#tmW zBBad#r%9h_*;X~bz+$n4A}keLf8<(y)j#-$q*=$EhA8~^PkM<|S$c;Pd~FOWM|LVq zg_Ybk?%}6xInwO9TEEVJ;#c~7hDxWkcqTN^keo~?WFFkxX=mJ6X|MTroLP>$LFamm>ivx07Bp6GF< z*UIcYPDxZ|bK^0HJda3Zew*?Uu3o#a_Y^P1RbUe!gq-L)y#v?t9r!vHx@#^fiK-WA?kC}U8+aP%K@ll?E+atWXQ;z&l%dJ$9?x9t)MBGH~SH?ub zN?7tv6bp^Y>=To-!JJ@;UyNj&=oErs4bd^YdjK@FDSo9ef?^>MLFyrE)jxAbd+3NV zI!b{tUS$AHIRMaLMbf<{zo}eDq2sTk!H8YHpXA4b(3(3_TK`wCA}2$hVK$ljcFN9d zh*6e)?az_{wCnJRVX#H%9pj4QlfHW0^E-^47chAd&}mqMqBE|)eWUf?*0 z+JTWVa5!Zr%@a~cCCdp=f4C@HmNZJ!CDKL;lG zX7im|4!jR%53S76E}(VUfe36cq2fy~WC9o555-6tbo(Q`zEiP%@NJIipg<#9@D{@C!2~2c01X6~cfSy}76gH#eeJ zCKhY1n18ylm{lqkm5b%-A-vO55Z^Qf$Twg4Yo!p_hJRwOgy?!kB(#U9w zyF$mLj6u`Kfqi-NjWkRqOl3>+vodpLs+niSwt_VyA9UqRBjpI!1JS+}f56e4WCDEq zwQ*EYK`ck?SN$O6LRziB$*kd@h~nOZ7~noDScZZ%{S;?FQL{)#!jUyeAw{DJonF|g ze2(!433D=4fr5nzk(8+_n4bmIiy2~#(1u`pi9^LJHPBgi_BS~p74ilgfk&$R={L}r zHTfGqT0gkOPSqIOG|yyus8(Y?kT9dF``z1ew~Y&YWT|plJ)>3vFrCuZOQw_~q9LK0 z#JuGBX|i?n@VyYQ?ku|9Yk&no-&22g91j)s*k+&!udMSu>8oQr4F{pO)?bJ>GawU( z{s2+}WG0lLu(oXO$!&{wn5nY*?;%cAlx$yoe{9xhlKwH|4P#YrFs{Z9m`;!6;kIRo zlEgTlxcuU@tdj+by56Yu3zu*LaN?_laEGDCQh2VzLSDX$T3_Rj7Vg?9G-OC1m zn=DAc+pl1uJ2PhAh#2Qf^ zf*>^~b80rwPWYRElsJbR?-Yr19O=<5DP!TbuC4oMm)Y>LwHkB+x4Y)Nw0%jip#1Q4(Mrlr~B7IwP02*sriGBvDnfR$b>)=C$O?F$eJE`*vRs z3}a8g#Et*CPT`UmnZbQfgHbh2!Jqyi{KC9r2Keg56Xux)Bf3 zrouibu?%`xa^I)DRN}Mg@YR4(5T3&qj=u=K(2UGo(g)_sG>>t@3)(y8$G}H zM-*N6|Bu_mV%ppPq&yJEpalRY000T>0iPhYiGKloUI~HL4JDJdcDbkp2^ZpK-ZCPH zc{|AY?RDpeQ4>SCqk)}jBXhlR{(-q(T3R6n87qi5FYN3lhLo$Zj?^rY?JR?OzX)bmay&_%wzYgkykw2Yu4F5+UHa(=adrJ=~E0 z6M@%ymy(#!)?t(v{9$*@CpUL1BVZXR^JPW)<$@iAT#rD#H_3N6iYoZ@#64TtU5Kkm zN~4P+`=RtNevxxFbHc?sLI{$`Ty|1&B1p1Qj`{_1ZEhIA zfG{*_TQMY!jE}pNH}pUVlfka)THYxUASw01OPY~mIkr(JRYkeE2X{~c3xo{Yc5Yt+ z&u?UB1>bicI272P0AxLCAJ-u*G6*9bSt+D*!4^jb>EGm1md+BFS=8$A|8AxpUXFAxkq!vjIXX8EK&33IdhjnSPPl0ha^HngPenl249E^hv9; z-%wQH+pVDnTgybIB`dKC@rEsz#3`8`NcFeDB)sK9GF_=32+(mN&2Y%-x}|W4b=!SK zdeVNjX=&c7ul!;vKnVv+nzWGx(^luWjGN8Kf39;<%NLqqVe>k@M;>nf>tl)uD-j@G zz-D7!j=h2U92^Ch>CPTX%1bxFJ^t(QnwJe|M#w4b5BQ4^w0qoX)qUEm8$n3J6-;!~ zTGOtbB+Bl>dECZ-c;6T3*doo>vWR_-xB5>qoGID0FmOl9S=q)iLNO;W+KqpE$e)Cs z5ST&S%$_;SYi+sRjokLwLUk`V9c1Y?hmbxy1=ztbOD0O@o%E9Dm0nUI?H8#crNXg$ zl$|soIdwY&r@%)xGax?8`3Dk?8wgCvLs>6uYGHOLhd0#z&zX9a)r?NqMF%)1~^*6CWbTv_6M6By&F>h(;EHOtxf{IcY2uuQo%u-7yTQssM0LtL9MLq@I&?vv;_@oic?Fzl*^>NCgP#kQ*9ZKfgUFdU zHO=A)ga3Ql7o=Y(T1V*SnNx*2el0*390W#Ts+b8vzO!<;GJ{CyDr;zIuneKT4$qK& z)=Y-KvBpN-i=Rf)kOO(qe1)3^0GKq#__Ef+VIINhOKOR=?W4c1{gpN|sEx2jBpuX> zKNGD9N%r?90&C}59^vXCW@0>hC6!*UVB_5<4Urv{z%&J8(ptIMLBOjPw=9T1Nrg0e zDvoi;rr+2j>zQxzqp56DrNk_W1NcSMfO79hkxpJ0a0WzR*)X$)YwB$s=^yw(AkklE zb5eNbjF=sWr!~HsB}T`^Y(O4FS6o8de>Zbc-7 z#+OUI<58$O+$h()YFA z`-vxw<*cHxameH{IQ8&em5gj1fHs9?a;CLpg%KI7E2$Nq3)kx3W$;b7ovK+~54)V( zGtbmso5@T0nGwbcKvS0~kdSJVhH-#)uypKQe4cx<*Om880 z7bXxpp#MnP3uKN_%&kREYHm=h%{~H?FuOMSTOv!<5U89-FKdkwmObd50iAQQ--)2b z7$|Ise8|rCKkxGM5h0NvFyId6!<~e0(QFVFb1+^?^s>{*Z;a=`U49Y>K?+dGfdwPN zxWT}xc5}Qe(HNxX$PgrP!6z-1v7B0-x9EWND=3kOVZ-S^d4Q>H_VR~llH$lW^z6=x zG@e_iclEhMl4jqQQ_GuKPSO5eCN%SY6v@x6!Cj4Q3vrvJg6YF$CWzjUmu2cC{NZ}m zPx6({Uj_pG^AMxN4*!haPE7yoo81M1pLT5kXfxK^h#{L_mmQXw0jAW@Q7SMc?Jb$A zLspCJ8&mzN!hGLeFv=6VWT5e~jQ%c-N_As>;pfW`1z~eGxub8C@GgY8cpe^1KRasR zwF4qWQe=kuWz zX5elrJ**M2z+wig*SSR)fk^CmNxb#5(bV|VUu*GvWqr|gn|jGWkN@7A8?_gIW1@@Z zMYo65OY-kYtM}$Dr<6sbrRhh`HEtuUFRWuGtr=h0>>*%0>PzR>$4?q`-RIs80+rkO zb_*38$WQ&yIf*-`2vEURZFo$R80v-VL=Nq;XGU2|wBv^7>Jza(dck^|9Gwp1FeXQZ z%VXYoW$vgI)m$tjavJdh6^PiyMn)oH5<$xNcrZhqf4w^yXeIQ)@1fl75GF0F0=o)= zE84M_@?k;9!K>{}IQZ#CVA2ji>v>uiSCSVl;7_a4?ARR{>V?|mXDfkl%%Opt@B-@w zM8&S84tLS)ykg66V>dRbb!;x!Uv_Pg5diRD_EXZPrvSmHWROYDJn(yRhAq`~Wglwo zL=E1a)T~ko@x8%^I%iz_>#an`5gZa9^9%tZ9o~Y|CakA3L_vr_FU>lR%K+fN@6kHL z8@MBN*a)3_l}>HxxlAsW?PosNea0AAX*SO8e1w`84y+q8!ttU55LiN+Nq3rdfw zOy+B3-NNT{s=daK4u!MPsYlT_O-GQkh+8L0FeWUSf5bA|xavH<3mlEjsI- zZ7?dRA{IbQnQ*)%64VkEjq-`n69_>F00@Ao0MQwvkOxBrKtL2pbd(>8>~uM?cSZ#x z_s|{`vi0_tT$)}kT5HB-s$nv$sgk;r5Nm1gliqT~#k+kihYhckuIt*+qPZXxk4v~f zmj%S6fbB#J*jTxp8kPhnBE@Qj+Y1TJ38hj*a;XW1I+Y3-5G15o30Nd=5z~RmCD&9{ zC3gS6{mQ>mp*YL`;Sa!IXa)cP0|fve-~a#;r9qn`CDb8RM9N?*m;V3&J}^j7R34tp zsk2Dx)9*p6F4b98;On&BP1QX76|6J-dCgM2g)oQhAZ}u1db0k1?*|C%7{!?BF=ooT zA%zH_ZopBo48$U|5k#zz(ireFWeQ7=0v~n(^pe;*R-Z zHwKa}yaOHhsmR9-WYfg2AHSS@7E8{!D*ifeOZ;ul9=i5j=J_!b*!%f{mH=1uV?Jv$ zeG0>rF+hIThxufAKK_#9kMs)o28;HFtwE#Sk%_y)P~lJ=-qCx2$dbK>V0H*(YX7tI zc$L~GD_1+(XLa9*);RPjp|=}S%5+<)@*;IS)!eW7hQms~Y3rDH3?a1(@gRTui!@Lo z3m=s#L*coaI2I@fse;+U3mgoX7!!Bkzp$t~3fGPpCS&86#JSe~fNL^h%W051H_;Gp zV{LZNYSF5iVF8>1L5=#>=$HC~AFPf>Id@JaCzX6UVp{qtpdz@ITTe~hDw)GGCE^pL zcpctjiDW4LMzeY-&pAT0Vqi;nZ-BOPF#LM!eeewCD$Hq&?KEHH2OZ*yoN@!JUP_6|jjɹty5;?mdKBa7DQs>8=eC-+t~R3fUzH22tH zw9Bs@ipD0z6QLB43aJ03D}ZS{2N`KZ2JSaM;RB@8)b1|=X5uQT4bI4ABJ^J z`T)c*cDV~%6(HkQ-A@m8r$TLf6@@s`w2OtU#y|;}B%qz!8TCU!=gp4*#2@?<^xstjtOjM9dCkRxaq4}c%-eRe{{vV2LM`?_{p>v zhs7K>3G|OYc(<+}#rX~a-jE*&Phqn+avm2;pDS~cA|PWdb(D&#;- z$}#M7xtL=>-rUsOkBeDD&BtB3=Qx-!7p{7c!?yG5iNfq2U`Ez4R30tLnxt{2>=(+9 zSx>}G<`g^*T#(?B1C7muS@u;H*fReV0JS4_Dj@keN(|&|+ZyE}riR*XDis_ki`X;} zOs2K6|Dyhv?m=|onaEh+jska1k$4bTCiiuQ-j+ZXiA^JIw!oTtN2WtbZB!NQKaN5N z_DoHkHf}4W!|J1)vlCKMwb+tRy-m#CY z$~|7pwFQ7KD(_ZL2>*EmO z6T|^}yynQA5^vy{xiA_8mgko z^wdCki0hZsVjb^}Iolbabj7I9q2Jk~{^p!OS|Wc}Wp&1SdZHBRovpj?KNGl7pT zj7ZXQh}OaC6o8}%n>Z?U5!QJV!e>pB(K22u1`?TuA+BV-@# z?W*(Wj=B)XcjtWyUfzrV3TPID3PkBuOCVfNh2aJh7nRWF3;q8UUmv+lIy@-gKE}(R zO_qER=qj7?zukMhp3o{^SWEEp8rCB!2V~L$QZx|Hd((hUGwBKv2>ybflH6ub4#^u>*qtGd;EzqOd`1THKXR$coA=hss^eI+giMWH ztqb>rTGTNskr6b~j|?^jhpa$>WQJxEtRa!;Z7A+s^}@rG4D85b{YKrUSm<){oSvyn zUH=1A%e93e!YU=cHuo(Z+(g-4C1Vmn_g^a8rwtQW%Sjsvc9_}_0&UB0o3Y3k_rjpQ zu7-0DS!@naKUhgp7lbq;h|o*qyGRGnMHlo(>|cL=XUz`~SgQFMyk6TX85DD~U~2nP z4ldR-%t!Rj`t;Vj?_C~;$(2;QbaToPLqsJCOQ&zIK||#`Vzt=xz)^@zrMyki_2EVi z!3s&ImiJo_N)DKoW-ecPr++;V(HED%ig&5!utybDiQGunA%X!}ki5&6)hhs(<ZTpN7YsNt zc>HJC4AnFDVsjIT=<&ZuOby!}I4pr^gTG?G;_T)!EgHE-bR>!o&{i#I%9s{7z%W$w ztu{wA#D#dpBlf5M(Gg6MfR7NPIVnQ?#0hSAenWLoeW}IYxg_%fU za^J0F*&mXC1+Ot~)93|gFc z6(v3s{mQq`z>)hu&LW1TC#G(#B)1fGsh)v=!sMri2bJ$DwpUA8nL34(aujLxt%j5#F zL$Fxd7+7TH68J4L9-LF$mR%o+LiMoh$H(DQ++0_uAAXKD$!A|bZpwVSNEr=aDkUnWmWQT&0CXI`vP_)v5549Ofb^Q;Dlddh?Q&V4Rr98GtDVdYWf$T=lJ$aP4UY#{ zqAB-Zx=qHH#Qg}N2Z?{XN?gzkt@4_JmL3 zY>W5_e!MZXrxSob%g20_${mo0RD26q0_sCT62WjlMIuK0ocePfQTmo9MdEVHlluC- zEk$Sk(Am2$c7a&njs2;@JdW7@Iz&!V8|n}Pf4U?k;-^KX6p=0Uc^@+JoIG}Tu4+T6 zz<#svWea?R1iKXBuB7Xo_tF?xo`fJlls&5zF1};P<*gwFz70i(YqB!kJ=XUZV-!6FDs254qvr9JLQ<}t`6d5N{h7o<8X18y^OH7INz)@02<*meI*1{` zB*ADFu7RlyTc50qW+J9TY(*mtI_}7vs%;fI#`&4&K@+72A&gi}W9d0Rp6%v2XpS}E zefIKe3vU*Ur|spI^X|9z;?Y+iHgCINJFkF?Nag0mXXFBX|6_$A=u?Wk3Z9sAPOCQt zu3T5i8U=K@vH{da`Ch^R9pZ{@)+U6D;a8T)oq^K2fJPH)1$R<0)pi8%+AZ-SZO*8z>YbTFM_fHzx@T1I2L zi}jHh1^pFrD__&8XKIi#rCktM4TC?ky{^I?4Sj7i%981%QQMl%IY>04_5PC|x4}r! zP!bmv%Q2CcOGVm&QV}r{n@^K4-a61=r!YXhTFsQKzWR`j>NMlliK_Ds%PvAOw6tPC zMgtb&ZQVL3YE0>dcApa2FXMH{aitZiRd&*}GKhh`P}T@co-9Xy!E~E~kvfJB6F66s z#eCakB5+KrG3AIosrxY`Yj$nHS|xeZes5Z^-dIMiBIT*x1V58FA44 zav$Qbk0Muk{E~5CsS%_U8!Hq~X=gQ4PDDNqJ;?g_g;1X?tI#juD~fAJ-MmFWqO7Ej zd-AOXo}N?eS{oNrwbUWg9*&6^(*CV1MfVm?G%b_-I=|p~7ac<8d8l$Lm;!P=xtQE| zNl<>6n*j$3w)N>;N#VlIzT2#!UD{`5LWQwM!~-t0LN!Y_71`X-n?RjzwIi-v211+K z%yQ%Faq&7d!z^$FU|q|OLV_E+K`Ia6W}U0f7M^yO$ndEd4m-E;4+^TiIGnes) zhb49%yFU{Z?A755(~BRnH#kpQYiAs|E_)Tu+8mmd_zSY@v^ngzVmGp?Q1ghPK69_s z9)RN0zihN$Lqjy4PpE)$c>XD{aTw2};OcCT`v2ud9T~WCb@HJd*3Mdf-QxJ^Cmd%- zrWjYYxa2QCY~u7`B@O0fpOw^X@|jSxW9Uw1gFt6kHjX=Nv7@@v`WT1pIgP`g$Pd-} zDXXPXc-GZo8bY(SRV&(Ap{Cl(UncKeVqAd$KazT;j4M7bGu7$oa=-mqJhbF?no1s96lH%1*TQ!Y!?8om*x`mBRP8TQ`7OQ+ zTd_eTT?RR16py`T>*2U4DmFPGptMHv+nXp2e>;Y7Yu7)O0mL%adT<@bi1>F1a^U+g z27U-1MQ8AkEqs_y7dxvLF#1<@y{lWM;$}d{Xfi&_K7O9)w6m)Vw=s5z_Nz?7OJQe) zx6z-xk=2!Ngxa7WY#r?+pXknpj{J~RB}`kUI_`h!cZ@!C_&LSJAvtI_49E^9z>R9{U_*EM1`M)_}>l5n}a!2!|sjXKQKH>BjWz%g^;H;?xR zozBv_=^w5spGv(pADIp#BFT<-?`xM@T|9h(lX1e`4q>L7;V)i;GZq#cpuf`h#I4q5 z0*@6Yu2d*;G18Lg{pg^$CQ4lx2D^RBmu(-VC0Nif8S{Zn@f=U_$0PzxAOihuKu;I+ zP5;_B%?JPilmV&^?(waRSF*N%Yj7~NXp+0Cddb%oZ_NSJcUo#ySB(+Xo2NkLipS60 z1vgR_+I4eCslHV#Q=4^4GL5D!>HuHXRATAI$GPAJ1FK4Tetge;S||c#n=!rzTq*umlpP zGSI_;glby-ffX(ym^g<%7puKo;DW99!3r>oY_{SA*O_RCS4zZ=QM(AZF&1lxYM_$| z6Ol0`NsldJfEb7w+Lui$0YpOnatM}!B_{#0kqUuMK}eBQ-Up@_|I|u3LRZ&NzyJUM z2mt}W000TjA)i9BN)wm=0pg%q%G`Y#XTHnC69L zs+}BMsWv5r56>j1#L)W~#uG=^xzvENx$#9Tog?2d$)lF~lNt{IsRcq8spv>xL-T!b zY2H>*IhrOmtV7u&2tV+(*uMmetDm8{UyR6L4)Y1N$!E!F?AA%rNp)4|sCaT$PSlvh zdQQU$Di=IxlBZqJYmD&6QMja(uWQV5Bq4Y+_!omK+B5E;Vi5-2@wWkDk3FS%+o*Xe z8+9*s)ovbYh1~x6=B`c3Z$Q1cB?CgP-pKE(xC{;gUt=I^p&0*$z`*VH!ar*JVJ;{2 zxkb8Ok8Kp4!<>pcmys_RK+9|(;x3dB@e9VGAEGjNjh>(q_H1^5L%v{E3_D*;<3NkaaZK0Aa-DYk*qplw=! z__Uq~6}n=WuT0!H=U{&p%Qem$S^|6kC5u{=_VbLND3jy7q146R<8_z^g6nVl?-x<4 zgddvy;e`RG2IkhUzT zLbbgpPiofU$q5z#o*cWU(>c&?Y6u^-3!(EM=NpaA+x->t7uDS?i+Gws%8p35K%^2I|d}AWTEf(<#NR# zMdzEO0wn%%!y03VP$gCoV6jn(q&xSwmp#E`F)(&j;NaF)P zr5!s*A}uX+wftUp(HLv$Do;3#Mj=Q!s)s5{AfnG-x8j3(W2K@2tLK8n!4g#T=>ij( zaw9!GO@^WvMl~+Rh0;ST6TQry(qOACUc}`%S*T`rrgi%2>fGc2$0*HXJh)swCBDJ(GRNze=SqP$NEFJnDR6f*SyYAhW0yhB~ zkgjYF=c*c+UqzRk6V>la~NlP=gS_hllMC=Dm6z^4G@1L zn@upl5TE}&1@w-)k?iugWuKFTLV6yKj4k$4=vzWd4xw3|T@g-4q~hCT zFT?!Tqd|0+ro!tM>n5i$y|sG~CcVibTD=St4VR>io&<=^lchYnaC`XT6g}Nf8$VAX zYpT^`q=vCgm?mLUg#*K83)8Ljyzz9nL{%RTMnzrr0-S+r@a}Uu*{xG6CO=p;MUSy9 zQ{yIJ1X(AU=<4oLOZjQghl+xr(6;bJE9C^iOPF|5{uDEe?nE|0UE2wI{^FG5Fnbv< z?DRy#zrPw;o2`=0ft_9UTI;Qlf#>BTWg*$R7Qd)ok>h#i(qkvV5X6D37qC^nB+@pr zK8dfYPcmH49-*#BaoobL;5O8y^ZvV%&(JfTe$>&gUk2(`S+1_jDbPZ~Bc ztbbk(qAdDK`DuUh_ZTB28Z+vxoj^G=!-wbqnJwhV%P?o?aXZ!qiV0Ec-^rjqT6_=> zPNA4zDSgl$#OFxtI>Z!jH9zaYtri)~@^US6(iGj;WHw3`N}(TVc1#R`BbniVy`%uLiDw3|TF$Jy;+7705h?D#ADJlG&WshH8{{d{LEsP~<`Bdk8Si90s? z9R|zMh_6*cPt_C`FAxGNmGe)RP5PRywzW9{|Ifb9>(86zaI6YoLf}g7u^Y6ve}+DW zZbyF`)L%_Vj^$upS*Nm}Z(=Ze%PzIJe%T!35E#~j^T<_cRZRt(c1WUDbtm5ILe^pS z?necWcvzMzx4yBL0m7EUC5E#wG~Y@f}F#EoqTJ~f4^ zzuicmtq@8SCeeRQb7tCZmZTnQsSZ&Eoj#vSDQb3ndd(+_xC8ems%zwzEi#By26~ zH&xh>!mdV0)9$2iNaNGqMLX;|9lYHP(9X?3Stq<|!`iPt0^uYC7a$(3Qyowr_Dom4 zWs38p~OF|FKZ{OStOcmBGyv23B__OV2JoK(ANix777xW_p8> zN3om7N=tbPY>s=~&85}2)bxY9_d&99tm!BdAt{zG-asF$hC)SAMhF?-VO@F@ME(La zDEE&8kdm?6iJyY3L2T0tSy=}NnvyeaxbYsQEMZv zNQA0lj_(CaYyjVRq!OCdgfW#dqb4kn3M5Pj9Rd&pHIg&f1wAE>gd2cHbx_KMsdYrE z%euLFbPjpm5`0Z3T3L3;0ERR(sxyI|<(16XsVxc%T_A@-1Z9m(6}Lsu$fS5mn7qBI z#F>Gb;_w9J=~RL$loFVr1&OJ{IxDFVRwA~Z1=s!w(4lzmrVDeuW5dI&R4~l~B3447 zNP__=4cbBqBQ3bwbN{3LmnST)6^eKYkNUrl8;yS$2%EN# z8rJw26?^_L&ImKU0)~6LDbrGt6WM?@9n3%Dt(D9OEmw*1cpDbgCwvt2T+=zg-4(dG z%)5Iw2orG{VoRo?YGmHL>J}DJz@kg!1?W9I^G?@-QyOZqgwv5_jGm-E z#<7{3r04xL@k$uEVM3#AV#Tf?&$e>&BJrp`upQ_yrC3}xWg>DWolCL2>rX@M$G7%p z$G9R42kmIuVg0EBeLkqvXfrrMOTiWAI2Q~>n=!VI?mBi?p@Eul1ZS?0njdv}JRlsH z_ssoykMO@afP@RDB^F9avtYGf!SuOsx&-IthD#|d@;Iu`dkfA(KAu>*eH*SyS-ub@_+$^oi z-TsYR+1}#34=j>N|2Ix>*^phXm3NJve$~&MbkdKX2;F8s<(chqT3PY1hSk2CXFWB^ zNb34)_-m6?-?FpM{$ebi3^C~8h3gPbLcJ&dNp-tF%u~u-{|F)^!}5U9#%xcb>mNhu zFdRMy0Byfs+7$zi=T^wUu?18nU4Qg>6C+HZahW8ZRb?*hJ*iK#jv~@Tc4y`*$mki) z{N7hmDQTxOgN+wJ#f5m+@nAyGAaE?I;kfDoqZDTd8It}X6Dj@Y4hu%J{A1|xlXoqR zKi>GB>r0clOxPGg6KT(rk`PPvLFz}VD+wybXbhNJ}o5_kIHdG zdpr9$q3r9ZFBfBD+xCeZ=`okB-Ds-%?f13;Vobuo2EVKO5K!Y7ThGMt5wSFtceBUF zowNWZ{TbK=ozq#eF`V6JCUF)<`W9p{9zJkkqq{V|k58tI|LXR(P_1t&%lL03JvV#KQjyT{+ZMjegEs zPD`3*1B>M?Nhr5VLlek#aN&k-WUnmTnDTvcKrqqm;?=RCZWWFZl_Kwu@n4hU_1Cup+!4@Sr#ZE~c!CVC!uFr}rtQ6jZ zH_}J>g0BG$!M8S647DVn(B`@Pz&eMSySwwRz@ODb*3X+D0%4cM`Cq|xdUu}M=dxYe zrtO`K77sGM!xd=}%rt|7fmcj|ISmX^Md4kkTCuD~k-qkpfp|#RZ|Ke5S7;9pj1A}0 z=_RtS@*Lpw6EJTqQmAj;Z=Vc+ZQe&IcaRUAUR2I~&i6@^DQx@CxiY2A(;~FV@1+E| zkxf(Eh74|Ng5^=RQp~=~myq*@GYwt#F8}*JShQcP?c=&?==K^IfMEdiI#^SMy2q@R z8pwMG0;wFhWcTgAwYVfgQ{;f2R|#JO2#-l&^n8NV3Bn^#9|v_vthjx=s9OUX!csKV z@EED_2k+UEMSeJ&g#M0L_FkgWh9G>Onekr!ERHed-}3womhl8lN4dXdZ4Hi?1U{hb zrHiNF>(>QriBIYU^RrhkQ++qS#R)mA#mDU6{wfNV8|=P?+c=)kI>R(+y~+cQe_^6K zl*B(`^<}nbtwYl4XAjhWhcg$-{ue6JLTz3xYs8N=SO|f+VA#BVqjI(V*=cZ+YJl@L6nQep6X$cpJD-)c=QOkoHO( zX!vv0Nu<`u$mxRdK6So%;iULda#ScDr9QRV*krc*J8&dRH(|zQD z*4Uz?Rh@M=x_r(2St6Plc{JXv=v6|plr2UXJ*TlKRqs3(jEe!pCSRg70J+mEI+~Vp zWRT>NqU@-RFJiagf7K7jJr8|pJk9bLbKGmL4|H+rt|HWqbx2N7IkC{oT_M(V&3f=vX_76 z6&%7KuAwV;6`&H+FL<+7P|A6&9P*m5U2P_eE(v}(x7B4LFr2BCZ>UC?dEoxkh-J)x zDfLiP2G!tVzh{Q%&2*51eK*xXnmntNuLvT-&PbLaD>7PMpq*N~ls$1KCt_BX;y1=(OXPBX|qC9WYPhw&1 zk3yfFOGNU{>ou;eOE!OR4y!oSDi8yE8PIssf@c{A4l-bn`V4=)MEj&mbe6XnK0}NX z-z&6>#i%X^{L~_|pQe@lWgbgd!I0}L7yhJox7|>>S2Te@t6T}&x1@p12o|@(lrEVK>%Lma2YL4n}U30 zO2iVfbcAA1kR|pV9y3E7lE*0j+jeA0%dTkTrFld(W4%qZZL7`%U{OH9I3xlBqKeBM zfVEogl~n+ME*CKZ7upD*1`ps{lk1S(U&r4+4aX(CdO1Yy(d8rgc_ zl@$F-St3*X%4r9nta}U2G8CdyExal(B=kJrR6N>%idc#~D<;?KVc0U#9e(naYVU`Z z84%PNF@YeQ0)hvGLgt+z^&4$fC;$Ks000t4j@-7WX8+Bk{Bgzpar!vCzw;4AIAf8;sKzKvai=baKS z#){B->2n#UGQ{VO!wog>>C)`Js>L(x)i8c7>wX=AKxmhuIsGJgs?TYe3-rTbZ6WhL zsDj$J;RA}ov1Th4WR+SKj5Na8`vjuX!I=CGp?+tDa&RD4pP8?9<%PW?9u{_BN=$}* zM>(>U^mWJFAig4oh{MeeDqVF3mqL)@udTIXgKjn*yGAqDE*^q{y{!J%gIu&@OBk{B zXDXLx<`n-IY}+Ok*uX7+|gIrbXJ*g${12yQ;bPeiqCWv@$Y3qWa9{|R0s62`pU5hoK z(k+pMpzGwF)DePN=XUMx;THL13YI~wiPwPZMI6|NVDZ8Lt=n^yZspVfr+c0w_%0(;)#p-Zg;_tj0DSuXGA!uS+TVX!!{4U z_5S_64LkYSJ*A-LhCzu{@;1fhwULwwD0kC?VNPR&ZgvVgPsFXhs`OkzBF-4mlIa{- za5H;ZJ>!6?3I$z`xBwuju@|fQTXq-)AHQG276$W$WucyV{ zE>>Dl0KP9t682!AbGUX8+05bWa&MTvt5GGgrJLdU{gI*TA+&$g_prmNVFhluON2a) z44I}($RAzxI7wcOmd2e1$#+jE`?PiH00x$a1Hr<5pqd&WE{W=(*_puxY^+|Ow&xijsfSHhmkKVWZZrBYlj6F?e;7PWS*SNcZio73md9%BG<$GIgV=($PehgXgV<_haKdx*sO$xI&2w4HiZ)M$JV zc+zjT+DMUr3X}G-8HyrLUAjWk?DgZ>z2f`Oba1itWk?-B`h=eIGX2(ea$o*w(aec!$?y@-FkjZNJf5a9 zhL>p~Ff7d$zGY9N8P3m4eQ_;W`5%r#T6aYJ}6>oAQ=rCvy{5=*!*9%GfW+_)Ypnumhm8W{J=n zzg7D`Y2A_>6S4s;O--$20cY%P;Kbv{#+^}f{CrMif|rNOVf>k>O)%e;@y0qr9hh-G zvIG7snkr`!<1Wf_F7fbnjc2Ya#C6X1yzrZ`o=QPI*n`vX#ASN@4V|6goULtV0H2TE z=klKZU!N7pNK!){{S!9PYGsnR9PYn3(8p3j@&f1z>nelL<~3n+-0sl+s5wI`ISP;^ z`9pyj*8mPI^aI~8+1Ye@iM1^qfd$OjzS4KT%l-*AI8yj-aLM}=u!u0jlQM*B775gZ zEC2Zqb0Y&(dB-XoZcRKYJCkgYvdy}Gasi^opS^&?lCpjJ4=tH=PQ1eum}1;^d-EJNr}V?{sOWKw95BaG=q_HV!8R&H+69R_Asj&z z-Yc^sFfbEN$H3#@e9ikepHLL?{CrR18kGG-OM#E(_zkU#6Wj~C);kV|SqD|(4*3P5 zTF~;CyN86dpRZZ}^!0KPf!w{NIuS920aN{^pcmv8HhF_t7b6OwN(b5snr&jf4z|$8 zyU^0}c%CadQL4Vh6XKG;(-3@J{!m*frkplL<7`6t*)>-(=~C|^3Sh^oD&daQSulq55L zdH`G}-*2CCJD%e9*+M$0%-q)g8oNw!)6(^@tns28pwPUcQ3Q!qx=bht;Z6Fahl>^lsgUN^b0-g zvEvU}#VeoeXB3yc+99iEf`!~{P+kc}dv#0{9qpW)gh7o)u_oK%{;};F*!Ln9+^Ep( zY%Ui-Boz5;fVZ1Ag1t+0n)W40mHPUhIWJQ!oLUvRKd0&pUVades`Ubs`x&#xYVqnJ zm;Szb$L;YQM?22New|XhK))8w9ALPb_3tNhrLOMqs&oTuU0j*afSDn}~33$mMN{j)0DBuXLm zVMOp`1bpdq6U`xD^1Lh&R9tqZ@xz>_K2P)T&vonO$HF8{yd?rl$27#gaxJ^>P#izy zA#bC2zTAvRQzww!ooM?Zs|Sg-_G)plruL2uL$_Qd)?Mp1dV?YHx?}Tnu;SOC*ez$w zgPlFkt;oiliF0+tP#CxQZHmxibw9&lgS^ZnG9qTnYyicz!=~Ixy$FSHgGL*->jD-V zsEu_WNsiK(jePHzl!8g$o1LM(VWXLN_}y7Vb_antY$~5xBTZ4JKRy{L+1%bCR2NRx{ja{axi8x zfD?H4?CQEt-dwZiLAE`RHzF@Q2n;(Z)|peES+>o71;fWgoW_LE8Ep_YvPQf<0q>o1 zuuHKtrE9hM0#Q>BRu-!qlylvUBXE7r#g^0VEh}IB1jfjimy^wgHTOYgGOB)vg>O;) z6)H=7ixF=$KPK=isY|yh9@zMbXy%JJ8!yBcaTVAu1(Ut<)imW~u{;6|Ul5VSV>#Q| zV4vsHt$;&z;^+kD%t_AGZxR9Y|KlJRZ{@Hia3r6or*YlJq=%YRjShaMalcI~d*piK zL83IFotP$ko-fR<{+Kz~8kFbLE#K>zEX9ve9P~L<{UVc z``EtZb7o`!3Lqz?2dGv0ZgqOL6g?T@rd)p$YF{gFWze1sOH1akbk6KVhkjbzER#Y- zq1%uCIZ$_ztm%diKyWNScwd{0p^u2|&iPe>wbqVuF?S*L4b`%=w-2NAI?QmDcIgP+!3Fb&%pXmW_h0f8Mr- zg;eF+_6HtG-o-=Kb1WPB()z^UsN?jf9yLQYAea992%cyOPr%jN7(GkCW;)37Am7Y!j9>K-vVyYS_8$%nX zZi~X=DHD<Ulnb~t=_Ne0gZZ=Uo6L2i;@)WY-2xy0Ec#wo-fjm)O`92hb&d*Z13=PiTFciOQg49sbUG|DwrMK@@&k3xJ-y(c$ zBaKhl)re^<6nRFH%Jrq?b4%AgkAG`?yIy5kUo%&nO)Ig<94td?g-jzpQc3NPvvVfw zRjx$+!{VBhtX3IzIZT6Ybmyz2Gr}^6Dy_scT9-Z|Pyc|s{BHa(>Z;|))nA7=y`cN+ zYGqx!N2hx9?^+*RHQ!H=b3%nLEt3|#I$=hQQvG4KPjhc+p9n6yX?YhjM4P4(DQ;7S z+!NakPP2)kp!&0#s|+CFvnx>@Vx2%`jxsw3Vezq$Ll1$$>FF0Ecs`pFPkl$u8&9dV zz;IIGWUF@G5Txcvo`SJ$+0Z89exoEI+JXrByaXQ)DmIa*-)o~GmR zbUF>Ex~l%$1J?2XGyx?(ZXZSwl4|p(lwXUa9A!vRT%xU>xmHriuQu<&c>;*0;DaXf zawR01reR&}#-r{oE9^;}9 zNg=Jf&$b*X{<3IYnXv|~TqzmsW$yh3^BYentUfp(f^|B6=E0O2vC;8B5#_>@QuiWC z9;4^K1o(TgC!UyLPEa=tVGCxszD32;(U5$*=Jh}neEnOx!nTvP6L2>?PTS` z|JSiaMEk;|I+VW+VPQ?=^c8oWWa01@?yEX$kLWE?5ShLM8iYorH@me8poXyu9^V@3 z2o!S!29X>!R~B(L9mZdrK3QFgS+$+V-we0XLAl&G+h5vGz`LlDrm7<`kIPl|HZonj=Oq7o9uKjA~-hY{HH0^r`7H$8lw5 zI=6}Isc#zaSi>>~W$1+o>)PjBpLkdY=`#ceHur5LUh0V5sZz%HybYkit6f^|e5w;5a5rUO1zMCi_gay}};O zau%L)e10ygGT2}=HwvOFo)jR8>!z2gBnhJnDCDe?tKP$e5 zf6zE0mTG%ru&Q9~I>!b$mt8Xm@gjX~2t1p!+x<^{>d?z!7n?yyuAvyIo@_fIE||G|gDdOGp938UMI zkSJJ|;C7X|)2#?698Rz6kC|Qm(N2p@PcxXNde4O2naT9!RbFIamprbA;dv#=%!q8I zNlGzlNI!3KR?}HU?jPgxq;^DmVd)lf^u)wqv=n3y>L{7fsZRnNR}adzf=pR zLS{d}!yQ0O2owhlOOs>h^y-FDDAyOYj3C!sKG476QJeW{3)@gI&2?m6!s2P?Y7nxaH&$D9B zKD_%W_)s+$;(VY|D@2&IJZ@(q#L;8cxHj9aUDz5=4h_8O4P-o8tH|gP0{wupQf*qf zAO8at5IoDd1ge;;w)j7}gV}&ac#Id*u`Y`yyBORsUE5R2vdgJtUvIQ?`lDM&Lh@`8 z=CNjMzQD{>oSRf{UVVejMigr@U{wT%c)|11YA*jPU>c{tZ?__Ny(~q-a_Jd6z4pxJ zkJyL1PxdME2ajSiDm6->5uKKxlCt{g5aF_W(}Uv%s@J)b7=%`S=S-W7pT(5@`)C2m z3ncBz`38O3RUjfb5_mRbV ztsPW66E}OfMF`b}Xoaw>u@UYI)d+_S;0r}h>h^HlL<2rOD|Hrv(u1zdj6~31J7Y)) z%nMrEM5+rwCjx1}1w|2;zJaEpsFYdJBG^W-o8ZwcU@})6MBsv80y? zQd;XUdDOPxjT-1Y+0z%`31zhBcfBiQYanht_Q>)VYGn?)L%HkOG3sVY{IYUHg){#}*#xZ0V_h=Qr7R@s_}rjoKrGI0+{P8K zs6ISZ1V+%`3@ZgdG{ z&29EsOsY>-FR4830yJor-feAaCELCwGu>e%Rkun`c_kXYvBs&Ji3d3XF~AjSn26UD z4oyo+X&a=kq?l+T#xgEy1PA$WWXT)rV^%zyLpzAj#36*`tbf8QWJZYW;lx*O>A zK&LDr+NjlxFB@cdMde9J-TNJ&`p5-U!Gu;7>*p9 zj)GilCV;UcAg=f8%w}t$hRRd(%LUrv6{O&2S>=at_j!uB&9U%5jhx^a?@6}vG0hrsNPH;+pPD?(y}`3|CXNqbe-WTt$|{dwU= zbT2$S8k3XfL)#va*>?BlPO3k1^|847vbUV(-qozCmTQ$CMcB*P!{`F9!+guEADHOT zKbuPYp}VJN9R1A$@%_Osg(s#si#qXo#pzO_Xglbsjr3 zvMRjny!tcG3@^YDQ)Y?VdMvintjg4hp%elMOb!<3=9Nza_==45yEkwMPKS^ChEX#7 zhdkQpa^d8`-w4c?FPU-D)1DecO9c9uN6Y%6U@DIi|7m*vMyHZ*hPH3XjEi1p8!Iv2 z*w^2>Y=#^$jP6VCrIxzX^DZgOCq{@@52s_d%k6>PMgR%yMtaC>NLVGoXj=NoXG@zb z-)NLs-UtdT5v8t|=kiN_f7_MPU;cZqJ2=EcJ5BH`3I`&vJM$cXJ4$s5ssiVBT(I}p zDrfW!ES570{f?>dDprHCiuYd=G&i=-jtE+&Jz7U7%@{Udj+N}O&1)id0(X*#=sw(h%{-a;vR*{Mke&3&A=bb%Ez}kOTEQt1RReHmk%t&-Z{Xno z%P=dP&FIZj)57CF6UHAO+T4{m9khUs7Y@$HBK2N`QPQ&%S-jeJ38ov{1txYGf3wy+p3;o?z#ZYE%14Q%|`)c2#t8*Jh#Jy%}Dp-|9}3J^(N5Fzc-NeNAB z^@$dNAjqNmDr+j<%q_shu+u>K<|Cw!@E+sjis_K6_b+=ae@Zsj-EIEN8oOV0dTC)- z-I8~qZw@GE=s32+qhrit{Zen&M(*j})x;3n(#w3l(;d1^t&9IS)FK9vM+H3zf&v;O zYW%Ag99^6-^3ls*ne0BwTs`o-EeA5a)E4;&f0p z&#M3u5C=lbB;@Xd4aiId<&1Nxz)|ZK(uMufw~4+gc(VVHPYhy{cICz#N|`9(K*b}H*_7K9lS9l-&SMFVwt(i= z>@_?#=>GGaNUH3wu{>NZ9Fhg?wbTQVAsYB6oXz2uX8QY+H%Dh>GD4C|+*l7S%zehc z{I~OwL3hv6@i-kJIRnu&SL+m#YYE;d2VUKicA^(QM=$1f4rI_7ts~+8##?=v1kjul zhly21_q^Cgnp~KmILq`4=g9}p2!}iq!CKQ4jr3Z=pwuuzNn{h~3xHY`NFhU@moy{4 z?XL4~)7c1^04K2Q=Oj6gI{Lg`oF*5@Y>|?5h<_;V{TjCNq83z<+j`W}pR@@wi&iNS z2NJLup%TiZCWfLzA-q{U&t_i%r%Za+gtKGqdUG!A2@ zB{Ri)-`P~I@`=amh>5TUtan$LNnL*Iy+xe5d`5+@ps}Y-7_1quj4TlsBoR|KW#02_ zk2GSO?8qZn63e~K#YyR{R)9{W2XB}GtSwnYexBPL`e1$6tgAAg{MZ5&a;FMsi);y@ zL+ugV{Ho>@g3w)_Klh!&{9A;bbX;M!x?VUaXF<Pq zMaJOHuzkU(_3+Pv^ht7QIC6kpHMXVz0PpOavPGHYWY#;~ zBs3R>Ozs$k-zY73j{yTR?RlVv-1Tvq<`jrQ;0c?JA{v}omOyG9Z&ZaU2%^jd*Euk~ z49)sk(L^&Q4QcM7rL!=hWg)2L61w0jtYt8|c}&7pAUGJ=|1&g&9n}hy;iEO2J|y!~hpn%N zutHTkgJo+}48`**tr%l^$dDVxKQJd|_uVbtprBnLTE3py_z2?PUL~*n(!orbO-P#> z&C;1}u2o6@%;yF(GQkdMzapWs?e1rA^K8i&`QVP8jx#6$z2R9<1gFVw=Y^6W{lUiq zxuK?6?WySk_-ABU#^dn`aZ`${|v zP||St>GM@|Tee}aY0Hrx1B-fo*t}JZD5)sWe}ZKO4O5&I?M!7Xive&! zohm(7sF|g64j;?I%Kh@>uqTlNUn4D^_hRAA^0XlESQZgsRsW(6;eaz4@NZ9eZc;7L4dE}1SNW4GS|#vU@}Nl9X>dT1G+%g$_zs zkPtM5T=Iuqn~?ztY0fo9W$rqRM#(PNm`F;DDd{fa9ox;&UkCYmPcNT*v8$@$p6Pz6 zm^|bwAZO}jdj*DW;YUKAjL9x|N7NtCjSd>B-PnTz7@u>UoEe00U^_E?Tu-o<5Pin7 z|J~v9=T`LF7vy&9D|tC+VfgCpr>7kq&owg%a0MOf0YZx86jcEws!vW-rT4Yf-Z`>ukwQMw>E>XEX5CBeS>>!7f(7txsK;;Cz+U0ixwu|cd_Rk9QcGl#Wmqm2nVre1C>z4;b;_U46V z5ubce6!RXiqSJsNYjoH&_4M%=Ed|EU$Vx;ViBa)r9ZsTHLUG>^?cweB$wk@v33*sS zJQC@fi>y?ruN<8+MtNV^G|`3c<(xxYARY!}hnlhqP8U|OzvpOcq6NGC zgx+428EuZH(f9zdvEm(v92}vv(O%@3p8xXwKSo}P>E0V<0XeGo^|R@W*_~BC`{5w4 zb}%B&S4ey(QJN5$h*8XTMU?-%!gQ}7kAhfK*cE{D2jv@}yL@r^mvJ7+=Z)c}T9Y7Xan?f3{$L5z|4Ng&q*9swPta zP@KO20L0%P_f`aLut}~4jYwN){vF5v$s|Tb0XhEAu<9D8k}nV*ZC~9zEx@}y@HlGN z`^kXlfd-~|h=^r4(I^|{qInAMV8prQ4Z5Xi1bK$my7ci7E<>qrgIDeVRwYrFq{g%k z6Y#8jRs@OzE0|Dd0-G4OU`A!q=>2krAN(n#6*uwRTC}0&NQi;Wo3k2eb;7FN6=KJx z+s|Hh9i7hN#I<+`RIl80jo4JO@LkV|Oy2|^4Sz~Tr6mx~RYD?YPuHGiro^=cf zM67?5r|GAwJ6yd4A`-kptm~DU;bwe;VBk-5t^~@3MiH(6)WlDtlbRcSz{-Gek{!>d zd(;!m_!n&>_6fNcDruPrHm=%dW%H1mF;o9;n#;KMgiJ03SefAW3E`+qu7RlnKq!hV ziNMt&?r=Hnuq*esbcz2h<;NP}K66&4{z+?P&k`>_9kEd6yh^;`WS07FaAOE-6a!*z zHE;nz?Qpi4*wc0fBYS%raB<2Yom)>GL-vc-x^=aO1%kA={zS9!(`q7_F=-i%M zYLk0DW`m-E4ONb;8J|%nc%^*=_>-oRzj?WPgRnUsQ6Mkc&puMVm=<5_;UkoS89lGj zYh!&^hkmCe1)r|?+n|UXJpa-i`U{JW(tBU-Bl-Zn*k%7Lf;xnNKLby4CK8;X(`Gi& zrM;llRkfTZTCppPzON*!cvt>D2ty`R5bk%Y7eTts^h_u^e(~l#0TTCcI%Wm{{j?N7 zB#0hVBKD2SH)dM2dRNG7+?`X0+*#OlL3lI}dh=(%6#CSV*d{pNR>8N)4PsP)D-x@?hSs(Bt2#UBLEpn(eK5xQzF(C1G`Y zrBZai9$MX{prR9y$^H;0f}c=!*POtICDlG{B5(%gt@^u-(THf{5-FSlEk}7lEb||xmbHI=DDM}8;$*P z!|V&STuEd3ukF94<$b&Tia*lG_Ty<7yysG+W#SFdaM?ImWV(|%;f6S!s-^JJdI` z!ylY55DFpnBrq98HnBtJy8C+61ME>$QzAj<{50qfkGhZPy$qg*Up|wfAe-GZZaX4pRKk41`*A}VDGmF;P69s&8eh@S) z3h?Qpj2sDbv=xzpFJ5eRGzBB>4&$qBw>G#SUNaSrmhV%HO+s?NH|_)ZyJUX)`MTlw zM@NnfU*EqXGQjx-lk2omRf|&S@)Hhor+L)*IDUMGC5qHZ#c*q+TxKIw%XPlB-DhNZ z<2(RFzp>kLPAJ4+qRlY;=TFHR2J+%v^sfPJHLbZgBYM)qmFrJa6*(9ksjSysw#!%H zgam#9!PEY0bZ$QnJ1`F+P*1m|oq$5c{Ih<_QUr%ss~J%5gj5sKJmbjeW4TxLzEU3R zF>_S?y{f;bH32xe${lP@PT13p=Y0zRGXEo>_;7V`lCkylQp?ng&S@Mr8^3zQNeWM;6W8hpax*bH&3V^37B%wcynnY%OVf}yb z%eAh}at|x)K)@zo`H@yRyrww7!!VSl)yG>q@J+bV3hxRgwMOT%AuL^ddCCW-T}p67 z6OV+?sv(&WJSU?|a0QYa?{ddkq0#bJ)K;VWu6eF>L z-$az9Td*sNgR~RD$Ij7&@r=Y1DdeOIPCSGInTwBKp*#IWfM=wUD#wYXFJA?iysNwi zC4hQTqwBN#tpgakrL?8U*bUGR)pI_$=SdhEnixk)eyt`D*`ul%%+H%X{GXIwSxo`B z`%PoUOqqt8=OxGEAYGq>2Kb{kvxCd%G@ysivY0woOU512I8`#-o|QL-N1C7&EF0Dy zrW2%b8bb}8$1MYHgsFJHMTw_ZvOy=tn5vszcY+G1DVu~xlxlflhy=~~Z=%d6B7-2Ra zFKyzW`bVdO01X#+8j8jhh@E?%XkIsjp%?In?~NcX?&3*qus}Q>nfbi6#0`RJL#^+p zp#%t{Ul1O6O8dQU%^m4Y1|Tym!pyNwc4u`GTjHdF-?s!DvKP?ijCdRp)iU&3L)T>5 zHHF|Ik`Y*X3qzZ=OiulL6iJ;U2S5!$pNDX9Ek8i>5HttIjn#Qt0wbACgE;E7Q_e+~&uK6Wj{E^I zY6(rBvG{1Clkr1OG5OO&dZUvH{{{`b6$@Kq0CUuAPoa!D7YhbY@q_XiS18SVy zZN~3FaN_l(*Q}3)hj#YgN0*a z8?im!LY-01ZSaD9%GW@1`A3@?ae2Jlej%J5#qEg7bv^7(Tg}lz2>^BU9oGn)zM6<{ zkb@0|19301LkJ@~eoOio(khyQMN5ujhgnYp_OXeJ??|;1tD&-1&8krLzGP|cEp_6Tt5>=v>2>)$hDWi?oeg{r`stm z{-=iidQ_Lnr~vwgD>ufTrSmE!&U`(+=_q#J{+r;ha&2L>y%Y&(f2R$V8d0)Xq<58o?KVln3fASpZoIW1ot9*o6i>?DW8&5h_ELZ^GW4ft7@<8yJCU>7 z#-P71SSwu>`yM*Tcku}=O@v3d-NiYKK7VFI z@oF5FlsFRi00F;)RGcNWaOqKmIBptPgRD#my>0X0~y!Z2sOMqN$ppdnvZNUoN$T~7MD z&ed=xz182}BtfC$;*PpfEajp@b~^4SptG&{$;g`Og?Hxd@k_U(la$m;(?;IX`@1SL zfT;$8lwbKh*Nb$0%l0Ufk zGVd|y{9YR4yDDq8Dp|1hu5O(RB+m(J1*8k#`O|ki~cD|lgk=f zpSvKsCW(qXw_qgJk#7w!s?CgNiitE_m-mys6nkCCcBud?0&fn3lUv)MLlc%W_EN1> z`Gt3-4{5S|)WL<#jzH~nfaNN|;Fni#W^EDn<=j)a(yp2@(`phK`}m4E@h(jUINp5hHm9)08hSpIYTjfc3JvSx&9>gdZR=BC@)vyrecdkw(-y+y-Hl(s z!%9!e9dI@fPBUqA>(zPJo)lSLW$tmg*8xGKC)}1z#j@l2M8O3)85Z&Z_C?Y!xhWUs z#sUF)b>cSM2;3er8M`8Pt1U?xUtCH+MMBmnWg!~XT^$;x7?*I+$grV!1d6=kP3nWc zH&?t{H2wsPYjz^d7qaW9-1=c_BKZ9c;7ae;A4hF~don3k5Dl?*2ROE5*2}C|nWkD{ zJtA-?Sop;bBQ`rw2PHhr)-+z=F)_V2M#$O6Mahicj4Z9-k0nOH?`jAtZUsOl0;Y(? zL@^A5AULX~d@@@ZV7j1}7T;758<$3Bu+0=ul|49~d(P|^+z^jI#xREVU_+Vb(BdE+ zh>+kXGeZGy*w#xump8kK++VS2%$*4W$xN(s0eY|EM|~kV%Da`f8`yh=Q!vu|h||aH zq{&?y+4c(sMhFQBi_obn1K<-6TKW0_f&d%<01JKrpQMsWe*!1jvAZr&EW_Le zoY&*a?zykVHb8fKK%3jNf-Aq^DNs@W|L)v^D7F?1{hh3iHA4p~b0~p$*jM`Zs$7Q9 z2;SjsEGp-0z`?!_wKoDV={da~x=$MO4N?C}WI#h`%M%pBV*LRPZ3eS zS$B4u!ziQ5y*AYwTQyHNAE*;rF<$3>@X0`Q>u|;r@eJc(M_CI!^-VXv2s~i#F+e{= zEK09_pd0I8%&@AHRDy|bk&h#eRuay9%32$Zp zeXinbwT{C0S`;masOO{4J_orY%gh908Po-kg$Mk2s&f8gu>uBhlA;g5aB7MUDbO1 z=1n~$lAXoi$`N(MLvY6k04yHOXB7qxjT=x%D=(B|6?)vexeg7(i;~>3Q5nynI5$1R zV4|&u$r1@f0gdF<$bRtqJX7S3bpH~Rk6KfN_5d&SXq81;7Cuj-Izx38KW+;A(V8?p zeDT&tv9_~kNq8gpPefa)pykHh`--iZSafh!t5<;xzy4y{?d15lYYA{vn~EIvqL6mS z!-#j+k}8WZ>?^Tw_)54j#B={$LTlXXs0C69oluL728z(GyOUhE&u2d6EV=h(7DHV+ zT??rXTYLazF{T_f2Ni!S#sVCwGjX;x)~K!vKVq*ULI4Jk>zJjF7xxH+&_9Hl%bdsu z>|PH~QNewC-|yN9dr^>4uJ+Ja4cX}qpVv_4=zukXqhLlYi91l`EOQlypyf&ZM~Y!? zhP!)wH>M`(vTzl198J0-z0-ADW2gGLE=1OAH-Iu#_cCqG?G9CgP<34|Ts@yChi#a; zwYZ}q#Ey9twL_hTgMkp|6phzOay>gC8eoj`g8&4F$`peQu9D?=nkG5MqvfzzVMdu3 z1@BR2qESp5sT0u%^@a#^^-oLleHI6Fn3c0lS!W>v2$YUbAC9F8jYj67o=ePULuXGk z5^1rU?#cNBBCdditBj3!6kmYPoCH-HL#WJx$Ar!3?mzgxd_}OoaK2ElTi5KipPFPI z_%Iso;fJPiLR}ORUEELkRacGK=9*d8Y0V{iapN_Gu$?#~VwHH6Gr$9!ra45I;7+K3 zoHG1u_e|Q63gll6)WTFgS~UJl@FSiTx-dbE=9JU$X|ZPJC5Koqh9TOiUM1HV3QN*1 zB6~Jy4C1euc6%nRXo~oUOQI}AzN#qi>@hN3!P?6S^W}?slC8NB^^vn9o!$<`52;et zXm%F*1aO=!*gAY4;YLRiBjD5p^$sFMw0iA}E?XFz;mG##a0L&!C^FYmH9ZAjlmJdW zx+TZ;w#zX&$Q`OtkKk^bAkb~!P-L+cZJ&TIvrY0Wd%LppT5~8yQWE)6>C79?C_a?6 z$_xy#N!3*GmXSc403fX!MwL@V`mv5a9+AIjEV=;X0X%v`5d)obXQgSMlhYQVVbvYt zjHy)ZRJJ1)@k+fcLXi16<=n7aR9wUZ`IiKlISDf z`c$aZJ6pJX%J0PkDHMd1iYlfrZ_cd^jptOZsDD=4VAr`339fpi_E5zw}BA@AbaOH$F3Tc@Aw=N}|kLU>sjRg8S1F}WH3ZT=#VZR=~#*3L|nX-<81Yc?v z;rU9k?PY`Bye;2m! zd_^{nZm-ts*7Vd)vl;AS6gxxXGUJ=s>%Cpx;}8p-WmWXplPKu!!@U{1?G*uRRtn)A%#h z;z<4~L1CpoN&E>5s(86y68|M#Z!N%DKhmJ5=C_{|rw;Z0hOhFtvXC@AS4Y?p3E&ON z-spjh;3 zIkZ9@y_8wJEVO&t)5q!3JTiE^oj_}#-mbI5b?#{`v4tB3SK)XiNq+z(xR!RWVmfwF zeDP(rwq3FD;4}5LqoYnc-X)FeJ)O@M7(QBQy)T$V%Wg&S9%?#P70imfr%qx=Yac$- zuJCr2^vhFE0lOB)Nq2W|N|K)W<3hBlwk%~*Dx^Z9f(~ZrSa-fX_i5$>WB+9tFn>wX z6U?FIb$^vkcoNIcDfKhIbiPjd4u_Wz41`fhU}XUeB(-Wd$t%bjLJj^reB>HB!7IUt zhFx%=jbK2;=w_uA^RUm@-l|xy!CB+B5?Ahb>`6rzG><~5TxRNv#OGjE850 zO_(XGGQLf!$qC-b=rgsxk@}D5BHcZlr5}5R!|Vzc%7P5BcaoO*r3({as!3YU;CMms!dOV`g&rd)lWY$#f{iQY z`(o1CVXRKLEYpnH=+kMXcq9jzw5c*Y_M;`he zM2%YjTRG5}^W3N96IKj2fRI`WE`Re+!8q}wRbWJ06f&iFqdaVk2 zv?^FnKS8-kKuTi798XyT^o^>?y?=RqZYF8bIjoRaJ-+uMEtMS!vO`VY8C`_Y65`{q zf!pM=@A4LlN_jl&M#`6($<4opR!JKl+-WB})k#u5=^QL}&l<6V6Ykv3laGXC8(TJy znG9-ifvlX;7@jdE8}k0_1JWTH)pa0>!6O~VKe>GCHJTW$>N8LTl3d;BMFYzm8VXr& z?3qLfwN8}t)$KYw^U&^>0c$k(HjQjUP6bU!Pnvh@TN-uLtre(MW6rt2=R{oGQByQa z%A`>)mXVYb-$zx};hRP_S7#E!do$0$w}+_XrfA(L+zQkc*8nF3i|znZQ5nW@kPDU( zm;kd8a$J?h1aN-0n14@N*v6uasE=)Uf7nDRuCOUv+A?|OLq(!o5R8asINi^Vz1~Lf zLr!OVu`=wq+uS+>indhELdJ2u2LUFd68@lfbnj@-W5-U%BKwG6|J;yWlbRR$gGG3l zW26EYmm(C?myVuj>ldE=Bi4k^$P0wMvZc8OcplsPt%d$`(nVbx?#2(?uq0eRE|+e~U^2QVgSLtR|l2+w$SizS;n0ZzWr z>X0YVlBS0p8wqX6(~+!UISE%obs(2UvGEJ1l5bk}Lq`!Lq`NRAh6ZmB!XL-uvx1_tC ztr`a|2ilJ3ExObOMCX;;q8j6T6y%jgriL#^wr^ES998>6JP^zP3ET9FALxx}Kmhe^ zH$b`QDo!sVy{p5%tv!%t=@>Z*sUAQ*?rX0XI5>bX+1~DGHX6ymtrk=xHSY}F(01*Z zzP^&B-PQ*z7&D8>Js~@WAr@=i!Y`lYAF>P;UW3uX8@!az_Z>j}tZYC=v1pePyO0`q zBl_mVXMdcU-n^bLtQymv*CwqP5w8Cb5~QPNxj?WNh6=#67O`>F;{sr>|JXW(YKZdU z$%d{d{-+bvk1Yg)bLPLGb!^blS-EqmuMSxdA*gip(?^=*K02XINRq}W3j@QgUy1eG zFQv%2tg_KB7I8IHwER6jbw2$-NU?<`wq*%@*PF4sX}S7ha%?ofgu*%L6Jk=~I3D#b zQbn9v7u77^u_UCh>UZKIsWu(xBU4%kyZe_H+VQ<03`q2}7!xlL zSDgS#+4p012*}X%#q0a6zfy!WmE8L=zBB75Th5Xl&>@D=&9H_Fm1#ZF~ zjl`gu*Z)>xG&T6o+Z&-GSVA}Z6gJ+vX%rQ51NAa0;a@8 zqNR!pGW@a)m=(>6l8fB?Ocz9Q7c#5dDp`5boZEl$raq^@B4EmePDlg4w%AR%W@_Yy zd1%-VK2x0G3%4;;y}yK;JcmM4z_~BJu($EaFo1ukC>R$i-qwXwQX$OOQlcXC5nN7% z{YiD95TW0Tt+8Z#YxcXuVA7WAr6ly={^x5&VIk%TJ;c^EuH- z8JC`1sGxky^D(?{2wR9!>~ba$&?g6YJB(EZWc6$Dc?G}FAfSHEwO|~WmR>cYUf1jq zC^L6O1|6)$|9=KpHIlt4ul;%5b@?*u1ZuNACfP(;#@RgyUX*)%=j z{4&}v*vrGflZzDAWMfmv;tOQxS;EsyXF>P;~cZtO2TF=$ky*FY+T)=sxxcX+{H zYNZWe9X(d*zS*dQ$QU(Jh%Sf8)xmYvj@ATy`ltzDt}e zBTItQsb}`(NOo2#CH0b3p#F|1#k5V-=1bVJ)snG3)2?zyLJd#rXjp0z%cnBj$-^XwY zk`(^xyWs5dw!}+kYAWuYIeRW&n|G58oYGt3F4*nV3L-1gdgCue_S$bg zsGk^wxDqJov59LfGPl31^IK=go=1iqH6Mof(bkD@O_>l(HcaEAG4~D6O6y zmkH0LI&EA9@EyP=L6eCQ0SDFI7~ehVUMj+Xx>pl8bkII31tab8&~Pn>kL2qAp%=U7 zpYQ^uR-8e1>25kHVt8+Y2Q2uktLQC*y9>W^Yf7l+tfAgPUMT94&^gx1S(9PGyZ_5? zUm#;R8ocxL?H4~_+gy9HM>|ojiK=q*(axVJlE&N&l`pN_ND(8bSuyV;)P&cQprX2b zQwE7`lDh8E1jGF^iPM&s^LbBt2#ha5JyP zchV8%H2U8##&&1?Q?&hJrxGN^-DRTtNre8*2}N=UtmO|bOyd+iotBV5nIs&CS*_e5 zpr`@?(i&+qUu$#bxJnFFt6ocQ))qB`^D{bw;51^d;r#;iyYZ&pp=DH zTJvb{T`YSax!YnY?MOP~o{Mhb`;zvefr(;b?3Tij`E51l+iogH9qa6nG%0aRNC7mPGq^}?*pot!q_OI%?-m`^) zFI&>@X1ZX3(!_;ZQx5#?^>}Kx*~TXQ!$kBeci z1btLQ&|NVBWt-`>!ni>zQ?-MJn*~tr+Yt1%xv%$If_97aFq0U5KH)o&uf9|7AEU+_ zt8gz>@l9z>JpPf!;>s25ytV9Sz$M-RJksYjWj08Ch>ULA5 zRiG)u{`3R9V>mTh|!={ES9tOL}b5VI@87)pnS3|y#9F1}f!hRT9sn zR|5rq3|Rvz9hWMr{bvwVVvw+fW8K@RU=@4J4q?sBy@;DT6FEd#gTK^t2fgRq$}be9 zvyVkqT6L1$(|p|DwIbr(Ryh}AVb0)Kci5%BE>N1bxv8a0!WgSfwfhIu1NAwakQVXr zmXGG^$rtNgSdGye_$hy*Jd%6Iq{wiGLG!jimE56=?({%4mV$M}+-@|@dq;a6N69CQ zb0#EO^7BX!nq1L7iCv=$UgM4I{~>XvzlCWFV?u2jBSVSgB3clmpPv}LjXV;8pjNC1 zFeA2@7#zdJU(iEKJ4tJf?^wsU06j3-bV)bAHXU%Wm+QJI^oUx{68d*dVf_)^11jsI z8EDBBiqc_Xvv;pE=Q2?=p25Y=tMF^TE7vi0&*=!5}2MWF+FM5zG0hLsrGx5sunq|o)p zykt%oL033DO~X+1im@gR`TSg5$;1zjbplzT`c9iaR659R2O)Lx!)=3Nvsl=(F`XPJ z?Lfqt+vQl3a)~@&JRQ72OV>Fn)?0zZ=kM>3T?PLE95PSBAh? z^9ryh{*~XHF8tZd2vKCe*n=QIDf*k|tud&))fRly{6j)m954g^j0L$_){|~6HG(Jh zRyY@Yb?WX+ITIlc{0WH`2k@ON8Nm*I3%sO zdcD)rP-gkn4)7^JtsfnW zu_Mz*a$0Ct%h2UY?j6(?Z;r2$uf7qmUT+86R2p?_%#_aZlSBxUr%@87d$?4TeEItT^hDN?rYZoQ0K zJN<2?*HYKadJdJchW>eF8y@>K}BR-K@CQVoBK+JWwoIS?d+|KGu@|W z_1Q!+WC?|-&Y05U=$&hDuHUA2JRPJqI>oF=PdaOJ3zK^a{3{3Pon@=p7&p^GJLM|O zw~}i+qYyu2o%$v{B-LJ^)sGlA0x9#WsHrF<_t|A$ON&>l`K^@Q%R?H-%>{2!az)f7 z&l)K>4&-rLT*x`75ZCp4gT-bmYg`SCQ7ddph^AWNi51UPG!08p_TWN&&?A`4 zKtNP$t=@-QR_q~l6ykpH>S8tjZJlWMpmvH_i-Tym3C-1tzorg+U0$LR{hil*%YGUI zU4eXwd4CW<7VP>iG&uvMUk7Wz1iUqlCKo4`X;|VH`+VC*l2p$3KQpbqI`3sQ?=s<7 z{UG=`U@UFark0!}ed+eC}C4U(lCgb!?)@_`F(hhf7sJRetXQFzS{ z1z$+1|4wwfo|vTjKQpo_X?z|siv^6+Xsb79+?(fP%R!`iqbdXd0G1`FNp}M3#(LMX zNx0!3wOh!7!|&>?L12-tGw=f5FFAulAoEDM9D18GW^VA}IkfJQOMj1!W={#nysJxS zl>t8Ht)^@77C0BODKf zSsVLh>)%bn8kr(67y(>ewd?xmPtr~^_oPnvCZc&f;>TgTvr{N9r+iErR{Qsaw`b?f z@P@f5l3JUXUFncvJF1%s=Ala_8eG^Rsn63*9RjVFmJ@&%R3lyBRb#=M2%DN$1L|)x zm2xE`(gKZ$4E`6VkO$w&^XNsV2mn;3&Es9jB@~fYLs6#AD|-w)UT9?FrcRDa_UBk9 z%B*(ltl~ND{$~WqS1hU%iwuoH^lO5%(wl+4*Nj|4+3vWCdTOXc`_MkdQ|V0kPOH{2 z`NqIWRushnsFiDv#$F|#>EC?VRw_2NN0w9{J);ELRBrEv zMo7a%ZCdb%?4+Kbyo~YX!-0aZgmKZwgMDn^&$d6E0QU-YEN4;vC&GLo5A_d^s&NTI)k4EOrxOMr zhX~L|(c4cuaH&b)1ws4zB@;{!zsreg`HfX_%Y%_Z%-*>?@~s~ItyW=qHl$craLd<5 z<3Y+0^CM9HD8xxomE<)Ve%hF(4V8FAZ^txwDvo%YKM#BW6M!VmIr(g482KQl1{CAL zTt`ZJNP&!z78VTC(VR z>%?CY^fm*B(h(R-{!nBUpg%Movizd~1qNd4gpDdXNDA}K6#jjxDHRB6bJ0I)_@67t zc4Lq}f2nmr^kM{ukz1KF|Juup`&8j+&=3)W1VP5w?oMeCR8l9JPOnnk=)6?TBpOAQ z${A)MVMM@=8?~DE_m-+;M`IVDJAuQ|eaJO`okQM#op`()Lvo8nZss$6$^t@M-Ru*X z3mh#Wxm~Eywv%IgYKD$Cb_ZPzC>Co?LP3V&=+ou6>-y>9t)-3SQ`hDNzuZ|_XAu%3 z2Mo{h0~*)p4q!#`I84gIk~AV3aqb7`-{}vr1lO*+@O%NBxL34UO*M7)J-kX86)Pm= zDdHRr{i7TPjY|kXq0|X5%)Y?eGc^|OQYdcq9q?*yBi1z4OJ!{e_cDhE*CBf2I^*Ak zQje*51A64}WDqhGa)%d2PxRibk>4{g-W=>1Qx7)o8a&1TBJh*R4fTn)+A!AgA|@`> z);w~zNXCr{cBd7R(dk-H0WgbBvu@4sM(5#z|Dv7f*4)_Qc&-Um?rW^@exb z!1N(O#E+@vUK~jWY7AqG^u8Ie+2FM;67^oVrdFf~CpUSLo2CUnFhpDa^wK2!8ULq$Ln@xQgXBSyF zN?Jx`0v3<$WMiSa(^u6KX zfU|lT?kg~ml774RTUe9@fWU?~ zcgh?B7QwMN;}WQ$ds2%mfOjn1!kiNn2uSq|3gl>DhGv%uh?Z(+sl=oxaxgaoxU?j- zTf+^@2%4m5f&|8;gq7Z2E~W1Q80&53yZ>k@mTlJ>O#s)B#BQs zs_ENGfC&5@qTt^HJBH8o2<|vv9Dwtj3UruTpwmkXLQ`X4I2ZaY6tP=1-v8h(7`S#Ka?DWS6=+dULE$uHcpNb4I^ z3|(6WCV}qD05aO3Sr7TMPHaB@Rzl#^`WZe@W z9;6b~g4qZ3GUFHRJVJ`@05aPDc726VNqW!rvAsNNUnNJ^aCV>3D%+HyU!O&^RI>zE z^8TqBYAKNVJnpdi^mY(GK?zRc%vsw1ow4_~@QSH`R<%FLReY63z^c#Hv}VrqG;ubO z>aq3U&nT`5l)#O+WMqr4`2y8?Y)cX|C4tmY17Vo2o!lP^(=iRwAuYa4PVYi@{tF>u zPJ@D4%<*(r2;!-Wi6e_u@-b1F@*k1N6D*`|xM35-q8eTT~-wv2m%#wq?_7A8rH+_Z~WP%2EhI zJPiY3(bcSN62*YWt>0IrKo*YFi@Haez(O-j+e*TsKORDn!<_0}$B{_KNP8nGrit(2 z+WcrT0QCXZ={^jbfP*QO0cru(wPE6hWsjlwjIzzmaOeo-Y%u>%b!)<<;$Ue9Y5y4B zdU|zYSwURwwV9Pv#U0txH$Py31>^Ape^l(el?*xl;UHoNNHNA+Z-an-kyd3H#+dKc zyJGg2iA~F61YlVIm-8SW;mQ&C=I`oR`C)*1`Mb4?_yaY9VodHUDKwkqkRxPZLMQJA zIea7VB0Ja19jY&W?MWbn86vnAG+BSOnJJU%rapf^^5d0Cg8g*9>f+S@T2> zYrfn4b0utzsp!f>a>wm9IV_Cj%=y_`K&Yk}M;E^03h7HWeF$Qj{B#Zmw=6q@f&3SV zRm??Tv4Cl{$9M#m@u~1gElA<10`U(KDL1_jDsQ0Qj3Mzjo+lc<)uPT&pa&~U78;x|PR7r@d2s&CcEjH+iFnBli;%AdNYCRgRNFPBKBWk>FBiuOk9>91i5gyV(|?r6 z+XhAS&5u!ZWDfOuR3Lv$ki2;6WWK@WMN108ORBgKmmuZ=K2O#z_cHg~YC*xcX;({~ z&z4$wuVN7r5(ggd=pi<}pTUw*uJZtJS#4x^9<6oI;p4!IU6~B)VurQ}!4z$5j{)W4 z!=vU@Yj5cVBQnsR3Z`Rq{+P-i2EaH(!+=Wb_AyOeuabz4SL5s05<3vt8kip*)xEBZy~V zMTe_{IgiE9ODr(T&k*h}#Jg?EqU8k6W!L(w%fDhc-hiHUbb||&jMp)eP|w!1DIpqz zJ%l@HnH$)B&d^0_?RL}k+JhG#Mk@ZmddKYzk2tGlOWtT>&kw3sZ2#ouO5IEan4~~1 zWV76^>DHbDu=Pu;t51VO2re{~{a3*a-8f)_+?a(w`&D8XlPRp58FfTUn|QmF^)3gR z6+`2PzC?bi-}f$=f;}MZZXCD`5Cnn+??OHeRm3nN68`5o=P6zSK7-0(pPGtZ7u@;4 zqK(zmyxp3K>*cm0-SZax*!wU}bOx%fqVn?9#WQmoc!9#SG{kfVYmq+_Lg{Oa5VGaG zEFN+7*IFo*Qb}HID~z^Hp;#(|In90#{hBh?)90fXgUgL#<)!)(BXXtYm8_Y}XwLeRgSX?lG|q8y%}Wm)Riw5qv4OTS-TdGxMHB4LkTs zOm0;qogfH9dnY_VYjM;|%)$84f07S-Q>i0)Blt?UIp=nVg*9Y_wqblYMC|Jo`w#Bh zLORuU7$E&L)_aapwYTrf^wR5sgQ$+j>SMvv-WA+7nR%qrX;*>LjLlda?<2c_XMN_B zDF`(;fMjd8uhQ4|jpLw2)cOng37}I|>>Y%ZOoiWUzpZ3E{E$?3N;D>p0=C-F=x7cM zL23La$71FnQ7QR1w{3`$W#2xormB zn7(kR(SB)poMxrq^wrbpEuLZz9>O7@t!wKmAEXQh*oSiF>rzrih&#s+%+3pSSsY)O z51i6ooQ2t%7za=jaZ1;>ys3-sL9Wd2Y|C6K{VxC>;E1htn|JzADTKxe6f;Sp3eH^!7ch+s& zQfUQ)(_J0w%E`L`PbAg#IJ|dob0jv+q1W6gYbh)PUh#$Qz)AQEfxA*))QSnh*d zJT!2;?;1NhexAAJXbhnOm%(;IRhodjjo}w%>Ew-dRr?znoj%{v^nOr$*llSv5)Q(2 zjS7an$&i=+EF0dt&qiv>0`|pac;M$8MdfmjSfvew4-6Ik95^5 zuh_ziaD^?QldU7J>UR7JI+}0*L}m?cs+#kmwb3SC@JuwuRzuNffeTd(IRt6Be_h&5Ve$get9XnT785-$$Wm7c=LGhbPUKL!)#SSK98hZJm00gvZn&5O+W9SkW&5B(gpV`_EBB7w^4PQDGqZe0u++H zNj;T#kT6aFkIrFKT)pleXDTb&<%7u>`6fH5=eIC#uIO57Xf!ShTjut0v(f}oQ$4tk z{f9=fioWfXf#!8PrZLLn+9w(~%FG%83g-jvh@N-ROVo0jil4ji1d8FYu^G_=Q?qJr zq?j2_CynbPQ>C^Qup0SLVEs@n9B9JiY!k_fgPLNs2`OEu92c$)Hv@qG>U46!XFP#g z%MGIl10l5Zp@eY3o61=K5)ihqEm!|x0O3A^J3c{ykmQXGW2f^3$d$m#JKN+p6p?al zmI0RZLPoxT=HL^|)_uZ?JIX20K?grM@38{mizJEkcYH#IBWn2~$zA*lZ zED{*#!K?ei;m}-|q${OgE>19x=YuMhxi4`Lk3mP z3Y4%C{>3M^WqLK-7{x8do4q-W0Wej$T{9J;2dB{+hZMyyz(%bK0pK}-;oUX>Hd z+5}UcXY`b0^Vsu@md^+!CC-va7d%ocLR^L1bKPSHaisiN=xh?A4Ak7fscMR>ax0D+ z+dBOr@Q%C>-C_@i7T#J``k>XcON7)Lb8XBi0?A}o&yWFgH0&B0m=QHGdlaGtcCfeN zT)FCMeT}&s_b4lC?T)NcDK#CYMQn|vIStNu;i5~?B~8x0cZo`*!tZhWb4PgpAFFgp zdje|&#Rn~w4cP@ntHwYmVu^w5$xkti_ny`n(r5;g$hr_8f{PzfFcN{R#eJfW+?-2L zO3KRvpRY8S5B%fDA?3y*i&O4-vl3)C4sWhd6X8Ay3&Z6B4Ht1z%{CBe{b!FZ&*hKV z?%4wnT^&~ydN|+ohBz+6HO@iOD<%zpia(eJDl&U%jI=HQ`%x8QBXx6^Kmy7%;_7BD z*r{0HlgCAf|En+!Mg|$#d^O4Ck_b4dv%G!7pSv`ytxcD}Rq&Q{MGE6g#CAZ9RQ8qQ z@iX;*t3P9M?t-&g1Af`$IUpm)QmQH%0z%AeNlizL4e+XXgB~)@lUE=Pu4bo@4i#>Va zS+aMZtr1z|)_p7*IoFbhb?FLt4*Z!K%o9||3QD7L87sB>n$P%LX+dEh?KrWGmrBV9 z_;V4BUXVI^OOB2~qM^V-SwK!7Nlk5GB>9S$sw<%;N@EmSoN#j*E+bOV|;%qeS zwhf?T=-(;8%HqyfblBB?d^}fbD&yZ)9}9Ac1NY^J(GAC66g;Ljdssv(8_$F3ZQSD9 z3KV33zDMH+*0h;C1FTJ{mk`!K^pThQk>E53V*}6~7)}u^U-G@4T&_9#y<8IgoXAvq zm_2ZSQE@5?sh)rxzj3{m%vgSUUf}Oadm{W8mT5Z>?pA6IyJ+g-*X8YHiseE1=C)j& zR8{m@53{^(1qYtzU@^84X%$MG^daO$E-}doMfz0aFOj?HIIy06Y+(*Q3cwm+Z98(k zH~s;DU+(t}R=)v`uV>_NNcaqFacm)Wp;Hg`<#}-$*N={&)!9m9VV!6(AID>+OMXM# zTp;Fuo#j_8Qyym!0C_pukM4OHotF5088$?qI4xj;$9t8)2VhF-ER?DEC00nU`Tx&V z;hAh=#h~?~p~Ydfd#gX?*=u)tKM6)bpDF$jqNT9&9Xg?|cTksune(!%D-6Uksv{in z)1SW4nWA*ha@l6v+YHLg!lX)6lxY^r6I$bq#qBPlK|(=ebPNaHTE4$72=yap^!fP) zy(j+>;8qIm8Yq0$cY?nuRw}Nph`CSO=o4~H)G~j$*i(&a@#&2#?&~vtMJy*w+1`H# zl+v=N_GKX_>>aYSn!Qv;SBh1D#C|RwB$Xq|F%o>)@@a`qdH}PM-Yi~%*o11{nSR2( zPV-NC5S=^3T`jRnNfBXN=7E#PJEyja)yVs6^inH9y%gHez848qEh6T+()4|RXsoyx zr|)kKV;;{DTspaRT)3qg7j%VM14hiIrF`|jATqe-PzIV%6(R{NVJdx6-T@mRudiyt zh7ov*LwiBr^Xttlj} z_V3tFaxqlav>d8uQJ3!h*z{twI~qtK%|#vgW%(4Uwg=qoss%BjvX#f*c7d7p&$&76Qx?OSYxHf-_ai#GEQ7xl9nIYB!I^&)wx ztn>nhWuHJhH`?tj*8seA+Alx;N>KRhu);l{k#O1iJ>jmO2(--+2gy7? ztkvrQ;MmQ;e+yrTUq&$uVX8zfd;h-uyQl1DR61j|Mc%dGG^W#NJ#NX$$;PjXo9_6@WD3a#61#t6{FOu;jxSX`B8wP$-mQq)yN5CQw^2|?+6D|!=JM{ z#n`wHg1TH)mwx!#*)V1`j+B!H?E_+wBhC}h++MW=W0KL_;I zCLCu{n^!vPo;W+h2V{TYdlLHc9y8QyI%8dR{7ld|1w>BYvMG9Lp&_mY{KrmpH|A8N;j)P$7r9W80nwi09zEEpy?zgySZ0;?bt11e%&am5ot&`#; zXBA`-(pr!u$)|mExKBYj2c(MDw61H6Lj)CziE< zsY0ge#bsmEf&2TR#T@+$dkr~7tpK|1+8`iZ?xpQ}!MRHqnwi+(zr$=KeZETt!w*ZY z?Q5l(Cw5#4R;x*=d{eSF5R7-|PoFz>nN9F@}%(IBSb`Lwg#W=Q1I-YPS zKtT=+yUa?jFn7u=yQ;t*3AO0{5X}SXq~{85eL|xmkheWq!Etv1Vv)7D42eVGrdbn2 z&+2j-rgK)!1W+n=!_=!Ie(f|Ua1$sJF;P2gsH~Cu3Wl&?Hz7q;0p$Fd$FbP{+hBPb&N5RRY65u6nytUKWP5 zJZJee>v2RNE+t*?)DgR^J{?1yr@Ue=C|qx4N6<_OgCAz4%p(h1s4tl5$_|G9O4zWo z%k9l_-7!ra2mHi;g6)`5K*T%4k;rgJGNzqRL!(hpN-)@672ads*{3Xk++)ktE=;vq@dAz)v_1!V&>;s@b!S$9Yi->d)u#{OzSQUU7ELV z$|)tD(n@k#5goX#fR4DqNbUFH}1g+mQ-x5W3h zf12xpU(QX6Ji)8;LGi7&r|NSETglF`HB+o=rQ}!j+(0Sgh`Oe^!|UqqzxSX-20QUg zSK=7xCbm&da%^Tl<9O7-(Z;Zef#xX#P;^BxNID~W64}JCarsi3Ptp!9>fTjK4S%98 zK~BX-`3+L?eA%?xc}oO~Jr^@7qab*~**DVLd;QIeY87h&e((q2M&QUZv!FEF`K39?gq2g;Z~x&SGQ0*kuy89&yGMV5VVVFeCs{yx%)R;t>L5 z#(Uf%mB{@Q*7z4uh58N>>$0h`8mc4<-HwRYP}hN5CeAuy-HNVjN2Rb863`x3M2cwx zUY{Cx+eq&^SpvRPNx^nIebsx%pwUb{pfxE^<8_;8J|L?``Njk`UX5Sr`Gkq%}ReFZpydu~xqE{g}Ig1PnL;Mgp4yD4w+)m;N z9RadISe#T`^At4=w^xFG1+u0rH@?Zr_WuGz*lJlx4-rw^M2`3{@eO_|&169j4ew=d zMf!_%jK*?;FZY^*yfD6IVb-Km>;0_E=1c~&ojH|PKys8!oZ3AG_Y;p)acOx^%^gHN z0M9<}UXzQ-AUI$ky3A~K255;f-fcEP-)QZCs{%$2JQq!Jcre@ke(T0F4MC%|7I~IJ zXv`%#|7|v>?!PRxugA3Sh;seot#7*H_pd~E@!j-ep1#rPaJ!Pq>RD+@1W}eP0Crh;3RSRprd5L$;%f zUkDqg0b8J-s$94Ix$iy#EcJEcbHa&0BjJ+ScwQZplkI1$vdppANCWJXpJL+*lUs*y zA`r_Q@0FC1({pH59`WQpR!j5!M;Y)eEy6>@LkJQ*(y5b^_Q#ktt~{mXIjhb^)k3{x z+zICUJl)l<+j(n?;u7!2hBBQ<#oU3vI7cEFIbHd7qFWh$4ySXhyV%{O!w{_6}P7#-9OwywWCgFO|_X$?1186T$G zVoc&0VVxN&FGIYO>=Am-A&Q-9PwT1P&8=v%G2@L0WFZ2}Q`0x`1vio$Ju*-g14*U$?r48dB@2a&rZ$ za!TITP^Gwm93#~Ov_T(8$J!aTg_Z# zEJFt9)tGI40*;p?K2|L3^EJp1C)~3-t|9_regvzwu*b2kmB$z$zpySDM2B;WO4la% zVzQu2+#xBXba4j}DhsAkn8bmn$J0~G8}T0?$Oh$dRh~ZmsxOIjVsg%d{deRznncld zi!wLn_@;((4lH{hGJ?`k@HUOA&PX-|I{C!H+fi^8Sv|_n$;_vVfAF|2C`*_Mtt2Ie zPD^{)lcrmtwNs|0&0Wmll;j{s)%ovLS(_M-inH{?aimYo0BN!_Be(i}@*VG3+X zi|rJi4&%Q`K{gL8dahH_U0mfmPGdGdyXV+fN?;H9FAE0P@Aoj3ycH(s&`rl>v$+VY z9nkcN14-+{dA$bIEMggs_8?5Jwd74jtKOgd#qi}0> z{ZZMOOG|Ocjsun6tENLRX$3Qc+1a8-7Th(u=2kzOs(@|LqRpvp&kPREAYa)p|2keJQTL5kThG$dH0Y}3z)S)N9SY+C=E`?y z3G5DC$ZmsHzM83BZsYDjG_D|;42rS!)G#rn5WCNwSA!Q&tR4|c@YT%o84ho@{>OW6 zBR98im}TTB{YqdD!5CHf)U`c!6`H|3Rz?^F-#elq(7^j+P+5!f6HR!oSy28u>NVR? zw0x{cGXopR?!)9xKVzt!bJ$Pt)2@|O3|TByN2|X2OJiKnsK35}?s9#kPz~-+%d@=g zWmy)O1O>yn*=&9`nnU#xB+%K%P?kyhjs{>Jp7xhcp9PAP&JDz=?>GPp(LCMeFJE^i zxoK(mD^(jj>ZtIqB!N>zSd+E#2gY`>8)+$$x111MV{SR+DLae5@?*aopMU++#d7ZK z*!WT9HYl+l=ZSG+fo#8?op^D!j6d>`)3gN!v;Y3W3=mg_z;z!7!iFF@YL_2OF=3dQ zP!VpunC9Su2$3y8D`6_!yB9n&XSS3aNA1YbNy@IS0p+#CUMn zf)xouW_3TBFj2PDc`hpk{YY9h+03Y`{O5<=^4Zv>sN(tC8Gpp()nCNC0tQ9Ky6mI# z!B6D=7kcM{jY2ivUkRu)l@} z_rZM)C511oq`n4L#2_rIHMXUa!Tf*BC{Q&hL8mDvEAyw#2FBdb_<48EkpjaTtv-AHCf zKrPOrG2C5#;l9IhOXOmJ%kAND%Of~u47lH}BXuBWgZhTfmKxg=UQgLj5j-j3a196C zGt@&Cyo61j+;vIrx+vc3s?=F}gxZ5-3%*d-WXD5nVI!XSn?J^tJuKC`t;9btO&s-` zZs<8lZCmg0YHwhGsS(cDQ9Yk|&895r`^()>8CED9rhR$WXh5iUcx~G$LkW#F{Ux@9 zPWc;=G>4i?Kmg+SU%wG?sXo{$-kvctC!xCJcTif7`YhpzAtZSw#uR&}d!Gq;!#J+y zXx$2tM0xg%RY}RHD8!*>xhF)bne9gY%>1jr6B%)aH)Cf=36`M15vkupk$PoIfgp+q zx1Yk?JzUKE5aJQH4N7}f-|p)ogw2A`@q%D9PQcZ`H@hPW9zNEf%ReXka%^59)4eW! zSY?keBt`IruQN5dfrJzNrM&RKl4SPFG1y_|wD_RQwjlZpV5GQxw^Fj@1?SY) zO^Amq`+;K*x#s#(4eYeK{JM zb+Og0X48&w(HE1>e@#=hzX{+x6{{=KWV<`Y7`JDdaMs(HM3w8Ob$Wd_{*eXg&CCoa zp&I112lhsi5BD@!pwlXZc~EMzqb0Mk&KXf=@m5G zFS*F+3Fj58JAmg^V3H`T4tXG+jfoV8N01jxtM-1&!SDy%RbL#KmgzhIcFWG+)0ifi z(cp)^qrRi4s@WtbJ*2dSEY9-p7*g;Ws~wq-#Q%%@H9Hss&0}SU=9eN|h9KgQ1`q8u zgq25G@gE%z&VGf(ty%)OXmEx|(OJ?GWCS8>Jsl?LtU z=dfD>Owfz=MkcxqkW6{_1Hu0XdhiVX2anMhIV39Pr_s2*ARLp}K`TacQTuC$rTC5O za8@~a$JK)qT)V~r0g62=1BJWvM5`uosJkfEiSY%@9@VW%HMmyy+tOpl&v1iz|=!Dq3gv8}d<;S@@ z3#OOIB#u0+1*7CAI%X)^o?au!Fp9^+*}s?D(S$}Hi3Lkvu3OM72r3bE8-QDTz2%ou zIT?mtfX0L<+W0|K;{1NjpN^l$!5iDtE*TJLAC>#WNHSx-haN0i7>QIM6Dlw$2T_(1 zdKgEzi``Goc}r;P{ZlsJTqh7AXDT9f@gar@(aW$-z`KrA2RC2t3c=($H%Y)-;qp@G z6*jQa9#e57mtF(Mq%l*S1suaJzuQRRjpXC=)6vPMI@Uajuq& zSolB2|$NqP} zt;*I{)Bu7`q}qFV&S86U6?7?c3DOWC12X?rqnp9wdgDe7i0~#pqi4r z3eiIbS?d-wEhXp!70G6--i&Z*Q=88WocnX9K8w`UlyZuN_sAr|DPTZb35aFUHt7ng za@@Ax(Zm=7uYhm>02Na~njy9&{{R7cUVsKs#q?<$Pf4Gs7*njOD@qxazUkllDC2Na ziH)aJufohgpy+wGjB{3~9$W51#fjImPN*@wWPUj8DDNm0y%IXOm9%TK5S&PjbP;$n z3ddT{Q&NxtYCZBG(XtZOUhw{r+me>4&rV61dDqM1sjusZZPL!9_UNKq6(=s6$057e z+_R*Ar3agCuK$7396|ul1~rl@xlv<9$xE=hLWpyJAWnA`Ix9Fohy-7x%|f@)E3dB5&Ly(DzZ6$qM%ac+QU0w0nDg$H{-EXicFg zk;FDbpk1%j#+$am_A@p8fn3Y7@H{7O&98B?FU?Ru>lSMcg`NBXkV0AqXcv5ZDFHE^ zm#_QG(CQQJ$~0Xw3~2sri;5u2Mb)igt^Zl)3+^6}dhkOnUv{pR+TQo}Iq%uhbAEyK zTUBP86#Dv_{`6&^Hi%lJWNy;)BHFQgXDT63)Mk+f9++bg*wy_+)?J4le*`pfXFdw{ zDy@NcfK6e`alDyZ2jItW%>YGEalEu{tEH_~eLo={D6WrB%oa*~y$0$YE)G*VoX@## z{M-nyh^JV5BY||K$`r@BG+`FwOx!fAQ)|A&b7JhZe}ghZeX8l>6pXbIBJc+6N~qh? zyHoP5)BwGBvwwo#yq`lEBk4nGZ;VONmVd0@yxpy;e0t}F#!IXSR(^!Mm^9)APl@~p zdZlLr)Ie7#3D)a#W8{luo#C=3=YvVhwRx~P1X&C(I0^$C?AR?o4s{S0`E3(*7pm$e zABK@4%z#Af0;{{z_EYd~h%zS=r}|Obnc@o1MM->iAHA4E?(;d!RQn%`p%FLL;v72Y zbu;PJZfQ%NGgfvXcqh z^|SWbZ&$f=X~ZI3(cU}sS=037x-M4&FfQ-IMMw;f=|xj4GGeO}qav8rj7ma(Fvr6f zlEYFJ7E5p?ItEapA##^*0RkoS9M6r%(m8khvS6Z16eqtwQPDnzKSZ7;l|oT4X>Wz; z=)w7PsgzsD6q1c}eT&$+{5C`6k6L3cP^hKGB!gLlV<3j<-hq%vY)Z*02FyrGYfZ_( zT%PfBu1%F|ZzfJY%q@f-x2P6yV(=>e%K3BFM3e&!RVR)q;Yx7h_YK0j8fNs0>@{UC~PAsQ2^VWw7XjSo_vo{LkXuB|%>PpNrei*)P| zL)lOwD~hq5l6^%(ejWbCYge_YIriKo$mXWBor zXTd+Pbn?vnB~c7fyC|{^o})6ey`{RYuP&1aY`d`=K~)4km;*UR;(E7IN>Fs+s=QZHpmW9hEE&YVvfg;h_R* zrcOX()ywc869b1dfGiDj*yl-B;LS#TNl_xvDvV%LE}SnMH{%C--(X(fxF${=(!F&l zl}piU%!OWw!A?{ES4<2)4=dA-=tGScm0SqM0Gso+1acM|e_tmYFP7C-=xJikj0HPo zE($1&h21keq&ihewwV$_d#ws0|0GO-Rg!l8cG^Kn*ijoon=@c0vIA z47L^G5fR0fG?h3N?9G%dfF#X>6ym6d=LR@`@s(+!&q=*Xi58qhywuCYmMQ24`6*yp z=p#|zy7dG)P(aS|p6gEF07*5myf#lpf5vVfkL5H-o+^+PfR)U8?kLLi*3AgeZI4kh z3w^`b7!ry(Q$5LvN)*KaY^D;yGo%p%c+mUM^P3=Y1Nm=Wo)#a1HN zQSoop3gDeSNnPutSLaFo^Z$AqK;!kYU-smul#E%Mfl9pvVVa{ZCxMJTjJTKr=>BtYM`B_*n*%XPi|oLy=)7> z?s~!H1p9t_Sp)HdMqV2RVJ&@OA=YL_ANqjYoYrq!#%4DD4c8604du+Zx1=r0;9E!Y zht8}-?gBxO(qz8V@tp}oV5TxEA_4qQCM|8a;bR-)DpC=yeVv)!VrrtH+BwKjx`yZ` zv|LxTI5ERn+mhC#E&T0_6?hKZEDiY}dNS>P8z9qI#)HV%3!Bs8A1t5&x`Mz+XZp8V zuSZpOrbSV(g^4QzoQguNRlC-nS0Eop%UioYHj`bD)?;Ls6m1zA8O~E2KG$sg2@UA$ zIdj-r52N;WPm{K=p*gy!LAtA$gj6UbKoiCOx(a#bxVdJVn7H@4d#Q2~NCz=`{!r_Z zBw-llWZ=&dCotOwC}@(}BTccLfnar3g?FREVVV5Zw}~vBv)HrP>kJD#v<$Mav@w8aFhg z8rjud)tTSPo%ErSV3z=2gs~LN?-E7r|6I`!wXu-w_H^AqgiCCvg*-|{a+TVba^k{>!UwCNS0A&)wqI zLKvUK#D5{rUBG{&@a+#!+D7fZto|7?d$5B4&WP8t-4g(mTRr*s^1_16?Vh(#o%>2* zeU@?9GFWsY_1agYV|(^e%IXYu4wU|k(!++^9iL6H7K>omZmEipi0mkE?>P{Ak4M|$ zitgA93-~2`KR$+_tE(#vm9xxNl9=!=ByhsTBP8;Q<&Y^vt{&nEBx;%Km}pMMGllDv zkUpR2Ej~nxyp^c8p>~ku-&-{sny(G-hl3s0BSRB94xbAsP3@5hE4b6Ge}ctFD!p^IA8JHt?!tsdL2^4qL5TH9Nkb*3bO`#qJR4VluW^>f6UN3S*mK=Y@ zgdBN*mk6`Q7n5=2UUtWgv0%37g263OhTPWf~KxO*z+GuaUdmLU&ZrU zsr)r9NbTPY?f}@NixY%Xk@{Pw8&h-rZh|mYTf|g>H*(y#8W1J%S4>1=hBngyu7R7u zG3q2z+S8y~^Ge5=DObJ-EHjW^MfM86R@&Ks3+*9x;4m?=+0|! zQMY{wX%6sFO@CXs7Hk8>yMX1fm74XjOk0Fc16FJj zAz3&J^p!4^xOpe3wOI~L`q#$Mbj|T&K{dCR0S5W1B7;Qq3r27$%y!L5tQ1+>?Fo*4FV@Z#$uMkU1W)v6JhqGIK&d{1YvFH?*wspT6ZED8(Ch zsd;MvooaG5E-{b;R$WB7`2Y#$0i+Sj4A42}ea0pBDUz76k-ZlKmB3*m{eT0J+HIFk=FH&W8mG-9)!#vfa_wT%a*PnSF za)Qz-Z7mhv=3*W5)HT+5EWNc~2$a34Y(e+vfyLVahE19s2HT*Ce7*zNz+2 zD8eL}xw|+`lEw=6FrUh)746J(+=l)Z#FT?6`0lXPRS7Q~#xQ;@kA^6j+Nr$XY?4nG zVt;c6WZEkzb7pBL^M>{_j?E9CiCho!a8PKO$T#2+$^L|2WK)Q6Daro6?^mT2->W@R4ISH*Q#AXA}^EUq|%))W$di@r+|Hu{Y?p8XuF#-cvTvwg86OIG$ zUT~uZ)K|Z>SARqNh7%u%vfYKuof-7ay`<*%kA@rJW6Sj28B=#tt~FKTby5Pu~VJUqy7kbv~6 zS~;s&#LC$M6^>GynDElu#4=KUU!%`HH9YDV@bGai25eorJa z>IpE*XPH*kXa>FF@hf#5wi3+c*I83wa&O!O%y~^^_MsOwqRCkFb{B%a=};ZLMCn3W zrV;KB$2-*;C62a#k*2;B&;rtd-qgc+$pLg|vpPSm6&u~knlt z{XS4V9IDLMbEt08aYDwTq+VDRwxX{rSfZs-H;P*El+eOCY)jN9SyOf3(uHABCthkv^D@=jMl0`k_k;3 z0>GC26@F+Ff_vfNs?kllXP`TYCK-XuESP}+094XgsI!n>iz2B|3LI>>OS4uHgWU5S zCdloiI@u=;R3HV|FoG9KH(wK1PZ(A^>j5fQkDDK2hEtTC@PTTv^4D7vvtX8;R&5DX zB^%vjG#Vh3sOWL3RS%KA2VNSYB*4Rnoq4m!A7$7CYis(~{8yE3V9foOW%gydU}<;Ls;t6Y}mj1@GsM=$_~j z6vj#J!lYbu#S`apLbj<8g0b21Yqj6be8CQ@ngC&3d9m5Hw8{ylUE z9>(c(=&A9eC;?HF-LyG!o)i?;Pr8|784I4OkEK5orRcEoc6_Y05`~r;iL|wK=UPQ! z_rnFjCo2N{$}JZ=L{$T&P1Z`IFz&7hiQri<`5#_9BB)F@)FDV8;|42VIR>L6wEH+c zXfOQ#fl^rOwu3Q)bK+#ym_XaUTGqs))h8U|e-B)r9e)U(IAZ-T=Ubg%yC~o3}Av zvUc&qZ$vQA(=Vl6G|}huM|}SjXUir++*vRuwG}JD7dofg>)1-ejPH+tVws0ggokNq6(Ae9@*wpJRJ==W#e;~ zqlOdJg2EzMZ8<$Y3cV5uGYXb=pzocrJ$e%-CCk2=jmbzifh(z$%r4ZU|c zj|u=d%fl@9hV5yVftVrDjKHp@reOM261-oK`STJDaG#=v`h@UGtgf}&+-Ce_yhPla z01(|zHrHARR|>i+8KYS$l!}{FsJpr?O|Y3Vg=k*{FgdXb0wMs@j5(Cj9tfhYBC6)4 zDZki+(`#(nqlnVGAg<3r*1uTJVw-jps669WZC@EI zqzTIvBQw!jf^82`M$C5Cy|6i;2f9A7VX~NV0 zbex6cXQBXH7Lan*Dxqe@?EXA+yNRt;V@{)#3&R^m9iRFJ@jAP6UV}&+i}+3lbQYX4yrB)DCHd+ zyx)2wl02i1(viP4jqS{XVT!vea)$d*Y;hnLJ@LR~Ldkv28K)?l|G4Xsnxj`>t#HsL z%&Y%qLi56@Ji;&4bX$GeKwu$3oCcD^yn|1tg3PG%8)Re(0+&WQV#=QYX-6q)d4985 z70h1jqsKlPh;c2v%n(QAr67Ued2y&WR&c()F4Z!!NOdykw`jA)ux}E7$y8cp^qD`M zdX$w7d6p1TcfT0+ti`rmG+5lHB7u5d>AI!t5tWK9^1Wf$C(e&qwd^#-${yoboFrD4t4`7}BnXxGLctLk5y-d_?h~efYEA{(3 ze=jz}g58aRgi6>fYpsq4L?Nz<+k^G-AH>v-2#W66G_OBkCpNt`sZS9I2G5`y7i~3@ALNs74 z6k4~nhkX-a5lCKp2Pxq0X0Vmi4HsyB4-45xC>h{q1sAt1ZR(TuMId=y$FaapczT7TqoQG z09Db^$6;|xy$rgzs-OXK+G_AbFPK4awuzKPyM#hv=v(lM@}C=}8Stx%p&X209pFSr zj;7o8IVn1APEpPH8A?z|4GO?c0Z4&?C)<`ZK`wZgxLhX!0$`P^aA6dscxXaZ7f>Yy zM`S*sz6sqj@dSy0u-*l}P%EJYOxKOe{eXmE05Ac-0001O0iIyGCI118>FN&r*(or0 z{6f!5#rP~fl&rHwvx z^V9Jitzn$jH<&@D8)?}XY-4a>2O4}eL$R<*RSa?b2Sgxci6biM>1AzAKBwn_YpXqD zWU^2Z2Pg}Ztn3iuf>o9}0IPzskj6ofbgfL{T&;qr7gV*$cJJbXx3YE^`WdLvc$*Qj zY!D!7Pgp|BOJ$#T5W=rvq`_ddx-T+wr8oJxqhhkUAJr0r*lSE#Az6w*bB+M%S8a&% z!XBK|Axoh}#etgdSXS$oo}I&WE7V>@X-WW0AuE<#1PiDEt4MuT>$N}t000Ak000#T zL7HN(P=-vVE0_NO0oD00YfJ>hqzv3xhod6jZg*_Z&QQicUCGFH49K`5pbajxOM|>Mr#L$h z*K{iCe4<}PdBP~T=hmdlYSZ$dZ6Csz1dpn@Lr;L*SSvgeK+huC)oh>y1N&^yt3o{k zjPb3=DZGL#120b0q(D`jSj3k~ku$CNA~BV$>T&V2CQj0Ya8o7WVN`aYV-5DcJNB6V zP^Bzll`>A_G%QcOsXAcbLZT3-))Xx21`Qn&S4h_+6FWDww>l@3c=a>}e7tBOh)5J0 z=Z>T!i_A(q)Dy05H}Hiwi!LOd7*2)w82&3Cw6Keiaj!IIMC$a#J3}1hz<#0U4z zDcIT63jx11u-bJ#FJhE?yMV~}DQwb1D!&>`j+8;@V6ha0a_`(&Qlwj6_$mIj9__w2pc zpnSKCC2sEnbvME(p*IO4)&!KIC8AzZVT1HwC3Qm_4&&1j(Ag=>ufvKz=6rbLcp+Re z`Tg0~UT6q#QO5p9yNAg@+IB$t140ZbFD-EH?|zh#`x%VGcVJY%u{Gpq1dQqM@ngrdn3LqN`kC4t68@ zWPIMX($=+x^*hDkF|i|pRdg1*=zyibm!+9WW5t}8qIUkIqtWMr*<ZhGQDtv@)V`(@@2IdBO;nQ~*~SRCrR1ZP3e_*yR6F!7_{71jwMWjQ`l;;nV7X+BtY0UtH)?OWE|ys_L2C&PssqS3qzQtO1?OQT1lt2k zmYBsA?Q-*srTk{H@hsa0X0GK8UZo9bRSmA?pW)4(lvBy|BGlQhP_--#Q1Yj^H-T?R zV*~L{6cDKAqrwq294D{>8DamGz^U+;_o=qH0t!y=a(&ANkZcB6lklc{rwx?vC;6gFZm&rOVUFt!l#XIy~^p>Uhy-CNPa zHLT0A|DMXeb>oh8q^s7dGExE~u3#^^Qua(3%pl=9zj_B!*Ch$Zt_+k9E;Q6!y;-G& z2_94tWT4u&eNly{(`F1U>2h^4 zewtvDEv9@R5uam4YQlnHvcRK!W^rHM)2{HUG14#bb}Rv^S>pV^VO?z9xWR_9^2$Kb4O!sm=l4I_VKzwH37F=^Xj38`#3XL zh7*Xi*X+`7MXz?_^ywxf*X-m;{4Ibn& zI|^his87k!@3mIFS5o)Oqe}1e0}SoOzDu!M%uR32I;lq*4BANnL%h{1E*Qh5i%W<) z7TP>GXYow1vj;3EM!Jt%rKG4V^h!`+Du`i-r>D4_{Abx^OQ5y)V(379EB4+yU&L9^ zB{8Owc0SoF_@GK{zGfjN{@@6qkr!7yXAPSn>2^W!Y`y9fwV`Z&6yrLLW7Cg8IWV82y$ADEjl_mg)5gaCADynpN8Ws9j9V5L`0FY|D?zF}11CIwieNQH&7}dA~*3}(r zpI*Svp)9`t=X}US7!tt{$TL}fYp6LzQ&!0fe_Y%# zqcQWVb6<;P77Q> zV}}*uy3O2JpY#UcfGPRycha-%+%6ajLDS0}AD3yW`s%=x(1&0oe9w80WYLNhHw47H zk(^Z)zZMIbr~##|ZcaFYbLS5`rU+jl2FFUY*hFU{ML!E&;Ba3tRmOZt(FIgzB#v`a zyCY}CwNtH{WK0TPK7wB~8M~P=fP=Osx!=2bz`fd}W9?DD36s#m5n_1zfPE`lkUG;Q z%UrC9G%TEB7N^6DH<|_M(vR$Gjt|itWMS}|j*gm04zvz4qQXqEqhQ5xahfo~^6>=`P-uL3F*-5G>HGq`ua~=r*#X_`+$` z1E7rsU207aS$h&Z>y6PS%<5TS=NZuqi7krmUnD^Y)tZwX^Ly;FL|xZn}~xL6Duwz@YkSO z{Ba{e5kh6Cl~*zt4=!L=l)R)pecgBXPLxxGL{MY+-wC8Hp!K$%}hfi@gt@qhAFpD zvE{~2#QbZjIK#RW(YvogxSAICasRK@L|YP8vSz-UpT0>WHO`?GSBk=z2LxEUrBKgN zZjF{3dMU^b?v&5BKQHZmx(lZ$*`VJFYkOflg>Vqu|mc|ycc{DmDkU0)k%HDGBS1ZZA9Y(YM|<6rVvUm z?7rUHFG$#TM6~sSkdHeU7BZHZe&&Pd&YPjb=c>X7);zybByadV`DGr7cc`u4HIVWZ zA{(aG)Ge9#%fU;VN0SY+bXZ7w0_z06<7Jxl^6#e2bOK52G>BvjA~q7@yJ|0>Mjx3; zk2<+9@d;>uU(#lFPEXU@VC??ih;~aqqkbH7JC{q8LLAWUmJdmt;m?GfoESL%aC+NsO}b|h&i8srW{-rj<3;BA(qEm@1Wqaf3~P$< zW19V`p&RyKP**9@)QOv^7N-fHUmI1v?YJO5>**n;h_%n=_Dx>3MJVN^dBe+2K7|Vq z{vbweO}X4cAbKWJe=0F5$y+oN{#d(_K&&Eo7IbjP4%|t)_{-J4*-KLY7pc#BY)$jv z0<-j#(e3nef6XSJ3^paXFBXB?X6xqIkMDQ~^htL{wH~ctZNIfScU6el!^(Yvjv46b zhF=fi^v9QTvv2&p;^GrL;?t8}yn=~fCAz=~%0s&Xowus;|G7EZA|s9LbLUZ>C<)R3 z?A6K{qE69}7O|)UylCsh#9*nv^g+pkt%tC9UbQ{ZYv3KVuseoemYYf69o#!vfrXhn zT}y2SOO=XFY$8dvW1@tK6;-Si2Ccu1*3oF}D|v12`F?gfNZ!nYRg>h*HEn0nFQgOn87(~TOtHe3D3 zt|GFBV%h<}{BdjT1sj9E$;c$e|1uyJV67(GzVzRl_4B6mAv zetsYCCxNR&0VC}#Pa+FGkQYpipQ~Mtz81DkG6-!_!mRUS@}908^r1DMyGS0Y#A5h{ zarnn?Rdj@-@a%IO*s5GAQ(%;UPIFC0esmWA>Sm7RL~X{eF3Vg277gud3zXIZLD1%< z_>+Y;udRxWq(&hY7MX1zlM2y@v#D^%hgT^c74>aH3B%r7iBAG3!=LHc0h~$>PR|g9 zmqbeV95;WqkOUk>7ybjbDme)xtI@UM$ecl%bCC*XqPCLDmH=}u3o#5Fssj>O>V*>- z3RR)>_Lz~kJnCUVela`#S)=0;>ut0e%Oyg&%FvV_x{=j)m^G(Crfp-m7buEbHAbTS zNT!_C;H9P*=e{MI5^M_H+EmA*Mtu43jxhsM)%(NnET$%RQYJ9@mbrV45$II4(LSVC zB?&~tSPA0&yHA_Jqfa`VLPAp%saZr1ZPQ~=j%Dc<$!sN@MlYQ+C6mo)qK;!^n{e)u2^RYQ+V zPrcpdU^JMtW`Y3Ag=(Gt8ePT$F$Jh5$fE^pYh{Et?+{dN&&E4uCpLWKUnNs}?)24M z#s$hX>PP0b+A`ePsZ^uftXc=t)aCpQWo6(mI~@UyRD$wuzZgarJkqfjc&rV9i*bcP zTdMyowc$xX+AubjPWdis@1XPj;8jEbiIII8FtmzKvW6%{nR*i2V=Vi;X_j^QPYiESyU0f8RxJQL}lL6!1A9LW@tuQRH z4v3reN8PH$le3i7vP#DcKa`yPTUPO4f<36(#G-ZFCsC^)4D(_Z3%Th#O z06KHDnL>HtF3QZA`rqF^EGk@0uxG!UNGHJFLu6^AmhA7~cWfMas2sPRh0s`;8hMel ze;jyV!w<+~pZKuI*WT#M?mnmrubug~G=O>FfJeJDf2@9AxKEm`BcG?`m5#}6U@XX2 zB1Q9Yywd_~rYgybNhde#elGBJ+SHWEuX!`8|>?L&&b4p8Js6h0JyC`Ex zO+X5NAXk#*b^Pqe~fBcqz7?&7*65*sujG9xr{k{I+V3Xe68x~$y|CFz=Y3L zK%z>;=4}atmqD8}I-+y|UX-yN1BLK)HB5Z=$o)WvXPI&Iv-LIIBF0=$NHXg&Cbsbk zz9HcdPk|bnQZ_a9qA|JV?JR_5t3;0*XoAG@KM5{{o%qj~Q|ve6k&7*EMQqMv_jrT^ zx(1(CMdVmX#zo8j@_wDT%yJKpr_%X9K9N6+SOZQIM)y3d z8Mx2fSAo!7Y$0Hr-PhT+=Q@!KL2!;MiaXv zQX+?=ZT4as}g0H$He7|ldEVpDOZ+0=rcI7$mDs?y^So?D{mww zL-4@Cy<;bR5Z@!V=TXfQQr0n7JLrFinFbzWI3xgB2N)B4QyR2~RaUe}3@`uyH~;_%UICth6(#=#G7Fvl4tf+uiFz%= zy16^xE3(Oww1P9`7d_IZf~zR|9h|X(az(681{h%WBwovjJy1qlRSyE4NbieUc>zwG zroANyXNDB{^gdD1nHt|q7F5-;F{`X3Cn|e(tMXy46dS0L|7nlfR3juK3j0@efkn3~ zQBjEbH-3^#xEdG?+(yx5@p&?d7DyAhj%**y2f?YR8>XVJV0HD=i0a*PzhuJ(dI6SeUjj zwm=wSfI~TGE?Ityf4s$}rFOucL;bgmULzA->{Swatt|7#GAWn+&}Ba0hxu^*0j;c{ zS8G#F3>Uu>j(Vj|)MD`+QBlwZWh4bLkZAjtQVbfb@6hr~ZqB`U`G^dtgbSa;rO1Bk z(kB*4-pR}k8f-G#sb}}9im`73vD(XxN4VRKLWXVvof6K*F_Tk!uwznnX)D9#sP{9@ zS6?G@?B~DurJ*-0w_sFkD3A`bMMf;@I|$(td7Fhnsjm%Mh2|+qva(PMKyR#!SOb1X zJ!=8`KivFKBpwxY5dq49qaBhe&EUfKNN7S zv=iKxOUyj?gQk#!FX0NUjG@j^K-iKoVr?*eORHt2aYD&0w(izF@)fL+og|v1)?;TW zog)cW&ipZfLX&d-WY@VGqSrrd#CIZ zq7#R-XE4#R+sQ&$dN@90(AC2S7oXjN?W36f=$XWc>y*CuMD>82qT76*&Uia~vw9q6 zu_>tnR`44kc1U-pCY9~)y*L}JCZiy&>|HQ2EOkA zl3gg^*RI?4KuR`aAaL#qoEb&Pe#Zx?Tec0lgcc6+E*E%hG6TJP?HIRvNP8_2Eb4+;~*; zn#L1%*pMK3T~Y(O_+iU<#B|MoY+WyQO)+f{XU33OdlV{um2DU6!N$qH$z;1*$)hG{ z94nNN+kMwzh^+Bgv{@9SKxwf{>Ke7ScpuRTO8;9QqiVN}UKuhiCJ##97^AIp#DckN zw^>|uU={)7Nasb8G6OU(rdIn5+&w)|$c|160kz;W+=`|*6QT1-mXhW~a;o?S_AzC% zEm#7EiW+DOt;^FQ8vf;DOm~>}Q~)CT>fd;fSVk9>UluMCYU`9YKDkky(9Me4#ng|< z!F)_p2P`&zPO=hj?7~_RJhL9;hsutxaul`^vNewwvavNvi@^0(pm4ozf1O&|6n=Rm zwjkz{UaBj6ly_7&p^iR>bqTepYUtavOxhY+i;hwpB6!-wqn)zl33Z~c_T`n3inH!w z_ez+Po{F2RPq^j6q$rD0zY`?9D?UMZg2MvK0waxA*p)$Sa^iaj7-yp~v9~XrIX)#w zW-cqT_dVF7R)r9>7=vJR2PDNnBQfRIC5+M!4r5!KAM-OpX#*wf=NU-?Fn#@-6DDQn zBcBjj3;X_>KTMh%{->3WpTN=86nx`{YB3MybmUt;2Wl2Hh=TkjY**mmengAFbB+U^ z((DSXIX-n>1iK?%5EFyAmi6+xyBH?=^tE8~fbE5n=;j+(Buj7Wr;a!&7;2%liRZcE z)_V{Qli`SQDD{#qWW}8OV<=-Qv7u;39ww&sA~cGHL><(+z;3|8CECzlpNw0KbCh9{UEbAEg2YgO)qP#LdPpNbj%Vj1NTOA2>Q2Y!Pn1g1KLlDU|N7B{K-$k|dc}{OHw%WO(@IXU`DCv_lH{xJn_dzH^x8llSB5j=FJH84|e=4rsUfC2<}^+zO!rrJM6sQ5GkMuT;8JXA zK`KP&>C=6>RP85_i>sw(Xkg)zjg)04pgX-Z(|bscq7pv@zIT%-0-V1jCDu_h;cHO8l_4j zpV3~mVp|CpUkRsO~NTH+4fy~=$~l`97XbrNS`yNbpK5c2lVq*~A=7W% zjyy0vPH&CL{G&D?8Gk_BzCDc8f=18(^~_*{ClT$pkH#Y+3_5SM?VXb%nJ_0?Vuv!w zK``@YI~2nejyY}QCJ=gKqN0(jIz$elV-Um^RYKvPjB|; zLW}6zgl9moosA7iG*cx|)w#nKsq*XQIL`wY!{N8w?r4Tg8D3TX+GQ_@UDqgVaZV{w zbJp>=H6USRYV?u1K=a0$wSqQLf=R&0+CWQP^O9>9cy&Cz0G5}t{hcup3^KP?pLt3L zwa#rP$xvDy?a%~Fy?jr^r%FIqis}?e1N+}IhID}8DIX*h#=5lrLE9`?mZCX9vBymS z&3|k!&b?xmR8J8RawE#y))1%Vx2o^e{H`3nliQ82h98PxB%S zEz=?1D~lJspd)v7nTrC+2=U?Ck;&Id*7C4$By@YA&WLUJOlM7o$G2dd0`V1l<*0ba zhZNU4Q?e^eJQ0bl;pliwD)+~I$sc4;zflyK-Qhwp0&l4>rQ+fpl-FW?ya8j@@gW@_ zi~KJ`HfR&$*Sby(@J1K|NeT)Ot~0%xRy^BiODj8jlFCJ?L6JOOnuLMspE>p0EA$3;-oH)H)k4O)Q=+jYo-@mg zAWe-}BgGQTNEvHcFPWsdSZpHP8Ffaq2F9z{%~txB$SHoR50<5Fa`Grtr$^yledpAU zt+`SzJMsINz{vu~t)LA+n>xgARfk^+={aU3&V$-e$`Yvk10Ih3QgnsPejQe#`o2*8 z5l54-pM=J)in{*&2%b{rx!L*6#$49-8gZ) zF66E9ER#;jJysg8%Qj5F|Cy{i2lPfg88DXPL#S$C{38#@s9cVm{z)Fjp>rOq5*?IX zh66q{=Z1$OJ=nsjIKcNhporUkHdpXbczK^B7ZzzKY;eln#=EjYEO(K4b)DXsYu#tj z&6v5w#NM{qOVCHG2UH!SN+T{fy>_I19X?@!`VaHNH8_DP_iwZF(1E-lx~ zzJaP>Ghv-j+yof3K2^4qB~6e~w1i=h>#Y9AN;>)`iRC{;p$S4%J@|uZhb0w!;n*{` z%J|;b#H?~MUCPviDW}0sO_4}_;$;>|(8yx15b!-ftnyczV%t}|CGit*8Q^8m``o6D zb`I#l9@j(kzvLbD9ejNEO!$@6Xa(_Me{GhOJ6{v?l&*RPdwrk~nJnl@yMrS&6Kp-alFB_POtoK~Rr`K2=Gv<9ia5zNO;mDpK?@oq}JMGP3-l^AJ{h6MZ zZX7Sz*r1_5vnB7=1%b?TGdLxZf1)qf>40-jXtRHzpd-OQLI4}Gn`j01dlwD!>QjTT zNr0pJ{H!bej6X_@7J695Q_j5rO2WB8%XxvRN5E{4D)NpnXP(u60EG+M8u4t_7rps( z^doK17mJB=zl*CVFn|%u+e-KN>WcVZY#BP*S&N6JkE~dv-=#6Y{xAgZ7Z`eh&7Mdb z4UqA%hDAK>Eo@rbDu0EUyz5aN-aO$0dAfM2QLBJ7-2Dx?d9lppC&QwwNE|7dnVwv1 zxjnkkz8w0#mGf3~p`;1?`9*=3bt3S4}*0O=VNyEFvcJKn;66}=2rF_Wg=ko-LOe|R?c-L*2M`+JK_@&<>c z10EjA+>G`&daM|_5KtVGln=L1tX~RS0xkQ-XNKd4f2tLy3^QRDPnR>% zb8nz&7^u8sN>~PsY)-{)l#;>HV<_hSt=iwiRIcV9*4_5GQz<bs*^NVPx8&Frh{55UDgDAm%x;jfG zX>i#WI#hv%f@ykLx=Au7w}%}m69d$T zuozcFHK9BlTcPjHaf9Q~IW2zpCTzvX+%Y4ud)yzvJ(;j7SD#sEton`^D(YfISJRH- znlM5`qPgd9J{%+Ji#Wm47QMJT4w*LQ%D?C8+pz7kvV!qIqDCPGTAu+Ka_-h)!d6l& z&cRazvKcqw`;{nouaSMWcfBm01qF1FFBy@$FgPm!9&cD1Bfa_6B}=1ZuMf-MSj>X7 zsgk8rg!FSE;VWqr@r=uNPyCwVYouA?HSVBq21o^*|0)_gq5gQ(wo~?}eT`90$2aUv zoC4L8*dUBpBZT-`!WAYuv~xq=Nko_35Ds*fRe4vdUiJqRv%J4@m# zLc>Ikf>o!!U1F9ceH`p72>_5(7~_|bqnz`bd|PBB>x1Zjj*hXTneU?jQWBlKDCoyR zacrRcr`!rQ#Ycwx`n*(Ez$|gh7c{w7a%>=zycf=reXac8QQ_ z%SGparpRC7ca90+~3YQA?83OJU6GeKYurmW}m`6b zD+QuGPjQ{6Pu!s$X4Y3)^N3Y58k5_^Cn!?H>0v_aBP1o*`K?)`dYpJNCr;dm^3O_w z4QkrSF{c-uAZ503xIm3WmCY;AC%uLA%dvlZn_o?N&ETW$2iHlp-31nv2JXK#DpB2p z&rn^wpx;`-0i@%foShKHQig|MUxqVH5rC;VG0Ft(G<4fuPU-M2l*{#&bu@M@JF|X# z{dE9v^W>fpx$Z~Rr=hQ6O4!##EaBNI(^r7}(a3Snu7kiHQ>X2O?dZ*XVo1KgKTV(!c;m ziz{2_6g600zX4Wi#3+RY8H^_IGomlRlsGasvH(sdltDPO!NH!U{{TXdA*I1Ml=}-T zSH@jeOL3vEap+NNUA>|eiY9LJWqO0~X4{CF9lD=wmZ4a8x&S1KC`Viz)aJw}RU>}R ztT<|{@e?*%We3Aa6|v4KWPE;x#&mT9Mi?&T?LT!oA=6@>5)M)lh$qBdWKpnMW`s#7 z(jhnfXCBcBFdtFr=g(DN8Zy<{G9)=Nd(_eTH)Ugf8s=LK?1BaFT`)~bI@{Nfs~+#^ z@Q=SA(c0gC_X`s zgh>MLpgE1K?rP5@b>wMw0UZrewfqGdgT3=yMleXm3i3hnK{1T%tGI6{K}oP%e)dQB zCI53&dK(UzeM>gjfs$#1uiea|Sel1Q%z=g+k{BPdF3?6Db4($btqqNmt?RsrA~TMGcanBO+!1KK#^chzXCA#}x;+^L(|9NUMnzp^D~h!3!0ZY*)#4MaGXi;| zLp+)Td-#Gq)l0)I-Wm{E&z}&dMSvu^Dpe@5mn=D@fR`h;MFdPe`vd|DO$Q2Vtr3>WG%har3_JA{6S3`fFo89=25j)_402Qrsaa}54 zkCc7yfF?lXw7yzD!yRlC^tm4o1}tmZe~ z@F1U63diPZafTw-FcGkplP;uTIL)Z;hrMMbMYZATDejnEX44=h{<ESl`08~&=I}TcU+SPI#Q^m?h#}xL@oy{mCccPp zji^~X*aS)w*2Qs2hw1wU>G4^@u5w&sp$SjMY}LfBxtVuzeN!7rbWQ`SA{k3uP zly~tH&2`{@o@NOnHP58T*U@2O-R%N?oEqb8Yp{`I8(MDaVkf6WVBs_|uCQAB2F1_- z-h091`xj~l0k%u@$OOzlRu+eZdnWf-3;#*0Xom;>eO1vOixU*gHqSPk$P+=bp1^Ay z4mWo5Imeo#d_S9}(t!v`PN;35t(zpUoCMIdw_0-F*b{&XmGIUmHh5PLcY`MM9H-^r zH1|s{InfhJHgB+cI3>pvgd>DMv;o{kT$3^|E%rTSL?zYh0}DedBEHaZM8nO*2Ccq0 zw>}$is*0T_dtqd*`aVD%g96*mx>(NmDPbP9fwnTXc|1SwmqRJ_&l(C%Sc>-H-z^pD zFB};Hvb}ui?$f_4eB#zqwf%mnZEB4B|GAA4NCDaR_XTlqYNe7WLey^o@>=KEa91KK zW`7){a!7rRgN#{~>q|w#nzbPd2dL!54=Y){J>d%^~*<(t2KmfV#3Mg6TK zfq*=uz&(i8{MN!8qsP*T5R38ZKxSU`dU&kY3^!!>+X&{63V{p)LZ|B@mCi~s_)LYg zlAmx5*xd@|!*&2pozi}Ox3vgO-3Uz;R?0?dfeUNJPflQCC_lRlGMN<=Y1OEz3oV=; zpxYCFLw%nYvF69NuebyDGa5*l2NR$*&7<81==Z*S`N)? z>PZ2+OSAO_Cwa*fMhYy$YYxpO^ll z_u$-SLXz+kO?2t8AEsoVT!lPPr^4_fOv^9x!uPGu{7)*dRqBimcU*+Hl2}_SkCdt% zT|O1q57Q@ALCaC^2j2LqdI#DAP``XWJ?VD{`@DY^qo*dr=?{0I$RnSyUri<;#{=QFDAou|${Sw^5c}OO}@(MT!0OlV`lU4Hp+^ z>34n;38g1*U6h>c>Y%^VeGLPd?unQ#vNnnRsXH*wq+|s>BIeZ?atyt38~R4zKd&7V zgBCM()P`TF59if3h86GD19q`tJH02iu2$>HVK2{cVF!o|H)l1P*~7hMyth5MEuZ2G zqQuG|`E=tt+b7nRiTdvOhqR_uRCOa+;$E1PRK<$MbxjY$yOo#BiqQ5XQ|^{=B9ADO z8gKH>J!Z=c&FOO;u8Q6+nft}4cjiWd8QJE*dmqV`hrF#@Z(nZ2XJ-d|-_+EZzgYJC z#o6xnB)}B%+Vc{iMKSO}39@U=d6wa#*4E11?d3{vxbLZ~odwmqHp5Etpf8gbP9;|! z_NVVjfC~z08a1@8^a>q?9N~!r1pogMukbOILVwd^8rhOwRDY}i&kSDSPX0*P<^B6& z-ITuWEI&;-bgL8_R7j>a_Statu1*UxE5ybM0lLOvNKeoZJ~-1N;E9>zP_&zgyX%-$ zloA5UXZ(jf>7s`b1t@IWq%B69GEOPwxAtK`<(D?wg?N}m#CjMB;S-3AKH~399Z3PG zk=e{SFcQD1?#CU($Tjc}?C;m_RVw)Owi*oM|LyQVR*b{EjJbv%PZ*X(UNV5}poEaV z!@HXNFkqwePhFM%a$K7TCBQdfi}Ljod@(}|w&2tUQHau4RIckkZ8-g7wVpPc1@M|O z^fkPVI;tQse^rsKWBe_#e?EM(@GTU!&&X05unTa^N9tX|z{=x=UDqbHbXtP<$1<%* z^f4jdE|kk70XA?1?HV{7K9W2Nat*uc1&x(1tC6)3d2AhKN*JVbA)9rxw*jEaN=>|1 zM%*`_AM%Shug5Zx^DA0~|F>qy`)hVsdF_IZuINJt5%utG490SIdAP?0zLMQne%JTv zYNPu4S7GL4mP8_ku%(k-i`nFkDu2Rj@Jz7?{AXZMk**rD(A|cY8Fmd5; zi5D$_SN$@;%A(n@?xm%}D$v)ywM z8D$DTj#Z0CD&t17xE3)jW6X3`xC(>9l#+yXWnQbclFK@geLX7CBemUTMJREWwLZ|S zYy|Lt^_(?4U|aT}SzEbaR2CwP!q<~>Tn;5(0@N)?9&nX+0e{`OkL@I2LbYc)ohuPI5b>ODH^$BX23^B{KQHP7z z&)9!kt>A{WR#=1BnHUPDP?$minpt7Zc_X-ylD^+MDyndjnvEqn8;-^cnnQnlE3(r? z?dX(?hgj;ybCPHJLOs2xe#$EXMcm6y7Qk?>MNolKQSEv8{-xiu10M`dm$-UxC;1xh^DiBW8KV02_dvwi)k1a%; z;zEQz+wizY~ndAzINNJ8J^GdJ#TQJ_#8W*4NAUbIq<-e_cj-CJ=N=#v}T=Tu3EC0IE6#J6_uOl{*4>_8s4w`3aeA#rV-7N8-H94&N8q*n{l&^J;^kQBDj=MH>MsWHYPTO1k2gz3dP6| zcEZG>0!K>RV6aN|0xsA<3R@%Fbxi&_P95NXbMS`Dymg+_s(wf_)_S*eHczE ztF%JEZ~y=eQvsf%HzofCTt9YAU(-RB_L1Btd9de4zF>*|=kY5$f{bftW;0Qh3CaHC zn{b+&F^i&RP3+RMU1bC=*bB>8=37c!Vl}$mXwv%ONnAXJobNFWeC4!4s6X+CDp4IT`4mXv|NB#U1fd zyLS$|Wae}tPZuBo`P11B;eJs&fN!5-XjtVs<`d4IDf>WtKlx*o{g5P2;;oDPqNf^X zu8P8Xo-1mB4ZoRqy2Mjo68xGb%5gpLPj@nf!BH_QHSLmu&gszH6!vphU(!Ut}>*Vi6m}bM3(GFF*~5f z84)EAtT-t^MnmWrmx%Sqo#DCETNyg%q7IG61R@{%EzSQKUV0H|_Ye(i-4bQGBPrZf zE;xKimL#omuc|&v_NUfLI@$)G`eOesL_GU8X@)Sd1{|m3gQtk~wmsntct2p?8CvigR z3-~)z)9WHFAx&UYb=i7sC-g|9h_BY*Cq!zEshNq<(mk)c6e5Myt3_8@A;=lO&nnd% z>4}a|*3s{lw@0S%8$>ZATH}`)OjL`tnb79v?YsXpYGdnT3Gq6DpaL^N&*PjVo#MX% zRyok=uv%j%;9wZK$RjA}urjY+a>U^9*_`Z6dmR^*e%kfy?^|d2y~Ad@_zSSRlt&b# z)g=NRc6bsFYM_3b011@Y??!=Ooq2W9?q)W!Rxp>ilDSp(fZOt>gQ0i%pum{gpJgCO zu4jUYVbJ<$BwoTsjWVQ9$kP;Y1vPR+HXcd3w@Hvvmb7lK%Nq>TC3#Ph`v4oEqx z1N;w%K|2;@NMR?joLp?GCh7QF6Q))!6bTt`R-*{1eEviz3$SaaenT;GT=qRiOcf{p z$P?3RtCD)-KyQ*w#|9kiWz|Vdw(zsG0VB+x4gSV6*QZ%cch6YlKMnF`Rq5YDA{z5i z+d7IMf!P0Yb4?%bW!^EzmP}Fd0f$$-+WJ<};hCN5Pp5g4e6^I?!E=OY)gpnA5AJIB zm~Q+meO<4`!G`qpX%SwF^5Ok~1<_iJ1&95KT~%D~yb-l}<02-;V>dOq{CMd5=Z?gf zx^x$<)52ykwR|Q>S+C>QgngMnfq4o1qM(TsygEm8;vflQLg8~j{>^P#167`h+>YDB z{w(4Ii*(@8Lg4YT%bJ*WD0c))nyJx1Gjk@KaPdaWjI&5<>A;%EkyTHJKZWRTaIZ); z)4?M9n1x7KFE0QIi@WTEh_i*Y{!!ct3g+_;Z+QIMH{pX@2g5tp&E9_AkG;{PmbfEY z4WbH08;M3n+f`Rk>e&*qNGfE&<8(%md4>_vW&a4Si2L}+X-m$;egiQ_u|zBE4fIBK z80C;!D6@MXWCE`N@VLIB%$Maxsc=q(X4U-MGSE;NokjldHm;!b2IaS5%zu7oqcQ9F zM*$re8?#Ws^&?Pow-}!xRAWP9|1-|B-m@s&f|_CX=gG)+@%VdXf`oCaOEe!}PE_WXR;p9$XKKBFc>CHU@g{r;O7pnr9H9zW7lsutB|$WEWs5-D zJDF*NMAi6Lu~%K6PCd~hWQQK=x#8RAS49u>&Riz|pNynM!y$2k?^n?yZ4?(bU42nI zv!@|1sXocNXbR$K3fR~OVj!VNCno0KicRGdkR+^VtT@!xJ1A2%uXO91`hkBGbcKgG z<|Is8#xQrF!j4q)?n>2EAa+jG&JCd$msrtcn6rC8VYf|MI&qpUUG*--dckg%qZh8B z00>vv?jBd#T${6mn>{I#WdeAEqvx!TbIxHy+jc>S6~ozaP^i7GJtGBF?DGY8z1c+~ z>2(M5Yuz|}MiMld@44n=%~Ua5BZf}wfyPMYf?!&MlgXpB3~#upbH2D^|3Ri{*T8Wk zMDR^Xd;~R^vhGuZ;;)F%glClf8k=aI^}c%*2zi*jinxh}$K&f_S{5}NLG&ynWpxZ2 zoZeC~SsN<}<58rgzCa6QlDiY%Di_lXjlz7B%^Je3z+AlTraK|%N&FG&&pFPKCso(# z9XcVR@&9%X-<0?fLwlv0;A0bYU#sJG1aV1VoC;k%Sd%QffIr{GwJXIPoCE=jgfTRs zktMjO_?sw<&jSq^)eI3vF$v?(vR5II@WM0N6E1l`67_X??<**BF?D&yU&-rG9%si^ znnLTyLzc)NIJ|p5mnQ!RMNgz*oK$9E0t}eq>!SmX?-OZ#(Cxm@v=*8Hc)pM9z&d7F zyXdQ`J9Px(F1nUBuw}BXn5fXXhexe%eFb94%fF&zE^QuMqb-nRsbTe}6o5@Q%pUUP zbTqTn2{05g4=vK+?BKWa`F}c8)m9N}gh@HJ-T0pJb>mubxBJGp#yl(nX?QL`>3qq4 z6WNQ?B)FJ&(fiiSO6Li3fMd+iY3C0^)Kss@i84~sR$RSRp&+Rsr#?Jus5Q8i6{q=T z*&4WuP46G~*DN*HF~U|-KKhLif!u1=(ASYLoSHt$SZaOT7Iyn_7y=U905F6kLp8d( z(L?d=ue-x;8oKotsEK1^mX62mkc2XDYmJ-qEvT)$UcLNERwwJdYrE5t70AS7Ss9ls zAbeLrYLu?4m*aot;U&SwNJ3*~=gBp4efH(7A@YopM42Vy8&UtrIVwko;AYmuu`KOu zl(S136tXQ}b3gL88_((lZ<9H|e*t_D-7jeula21tFf2PRq1;n()y4by>s0 zj05xl5;8zwv0)`Taq=(Jh8iB<`Ah?6Rrk3C#66u=7UGWRW2iZRF4`%0%L5yi#_o>P zL~Dpa0xeeKw}BUxXe@!Kqp8`)#0H#Zk-;lrBAdF{k}tH?!p`B-;6}o8E!D8IF$jLK zDzMQwNy~cb_4pfy=#+IWeA)okoIKlqoZ^45ITPxH$&DTDAG?@~+1g#QKVXYpz2=TF zRh!;MMOv%yey2zaDE$3F?EM({Mm`Jf|6gl6z0v&VjI1s#kY=d+T0SZ`u)0_!YzY9J zjiot`k{+7AzW_JlG|`HYIIIrvL&PNo)t6G4R1ozmNoZWlS4q)oEbdt4)r|tIIQ%tq zysFEl=uhM0NjS+A81y>CGwdD2gE7Jiq$>Z8`6+PA?y+`0fIZ{TWoHut(d+1Qkt_&D zC^n;^#K$$SzE5)o zWTUSo=!Wkj#Q`jVFo@1`n?v?_fB@(|EzRnJC3l*fX1u}xy?8q4PEY-~F<>7A+yFeO z8c2mWn|tly?^s!bUX(PD93OS>o>j(I&LtGQ>}|5_?x-%b#T)i88%M zgh}z8Sfq`dl4R*R{5*abnOI)Kp-MTpE{9aj$88Sxwd~Nmr zKa}0LX=w((qrhTqNsue;j5M?9C(pN?fJ>yzlT@!EKDfON+Y#cBNy18QmHf7nPG}p} zh=1BV3HIMkM7+vB4IScoX86vUtR--1E9=Vq)6SQ^negrm8$r`+Ugzz}Klh|ACG5ZI zj@udQtgR*=u?_4oVaxS|PRbvT;%>H5)lE?Tr(E?g^9J?F}U zLob0?RuS=J4n??`Ojr;EKV}B>{C}MRB`m}kJvl&cYxIB%o<}6=tg5|6u_9S&Ugr|c zpM`wj5`GW0k)47Xdx)hu3WRprg<+ue?9Vz(#U^&Z)QPPAz5tVeAsW>!jg+i805lCe zSOg1jtJU1F&QTUTM@ZN553?oTW;?EGbtz`knN;fFe*MvhbFT{5zEg2yvhyK!AcoFs zg>k^7tl3_LVn9!3;fDK2s2mn5R3J2O#QU|cLkWG>6Z2oqB0a7xORR1AXa1?3VV zB*kno8gedb>rFDlChP(d(}^#Ab{!02>?x|uFyacq^Um+IfX9FoOuMNerSj3c*)I>R z3l=taxlFAU_?asUt6!Fmybce8aXNHkAAJEB0N?-s7;HhBq^0nO zSu&UezW@Q(E0hC!DxhI@gn{{NM%)MF#Gb*pIgKc@7GitH*<~@55@-kF77B z{%i}yxNpy65$!l`ChyIdX}0zcd{KMo;xBj8CQs}%w?F^Dmc~d-Fe!b?b~UE&)g9Og zH&FKAplG5Rl$lvT$x{RMf00^HYF1-ovq3x_+e48vsCh*C8{vCElI?@iaXfMa$+jTOjDxEsHJ^%KDd?W~XDJI=c zoap_+_EbDrXm|pB{0ql&t>10jK!4V!Ok9t9k@~<)f|RP#fIwjYJ-{!{2eap;s+bSC zv(S<*j&q;v5x>)3N92uHrJ>GLg$H<~5M}(v^HgJb1n6OzCL_PG=pP!w3FULF(HtNu*JqQ$6#uQO3M)xMBzb7$lK^wY-~`%u zvK>2y9*o#FdX$&@#luv-PS6-TnqgttkK(hF^|aZeB7hq0Pmi%r=J_^9)Tu}uvJyM8 zS~6Y^6I^U;&emukQrM?2L7n_3EhA=8Sk)xvEH{0Fd*_XD$0B24-W|f%*szr5w;ifuY84DI4Ep(O1;g5b1J-&^i z!t?b$a~5q-d_7TR6$Nj@LP(s|Kj6Uz6=_fmi}F2|XcJ;JQULk)I`3?Q)7iXhSe(K% zim!@w2_%AcySRtiVqK;Ik8)8O<>=3I4KC46Uq@wV57rJD8j~Y%o2YN#1_RXMz|aFc z&q%2&`#AtaecH>RlKjQJlNjnKVNTrWSTdkM4O!vzwdZ#kG!!tZWe=TR_s{ZT?({ir zxE=+SNz;F;PDr*IdTMgst5kpu7B!Wq%vr*>2HNFVD+xJxC`oIt`enl$+xYuIq-l%1 zmwqhF28rsV%YIZ9Vg>cfNSV{b@Rq};3>yjzo?ub8!fkx8GLCF%Z8vvh!wnQnMubiZ zLu196VHqM-eDvaJAlU}_P)#k-n$Gd_(i>eU7%oNmc7>dxNsqz?=S1%>%8cT`u(!YL9u{)sbO!!ziv((zHKw)#KhLbpbl@=N zp@TiMyph1<0ImxT`PuoZt6U0F2Es4$hyq7EhJDtal@V~fJD>!Q%g6oAJIj);h1#VC@UH^bWNj2^c|%7@ADX_Xc_FQ@$r%lY%RoEYKIWyWnXRv8J^Ms zkZU22P)U(jr5RFYywf-W8ZcgUg6sN5ipTc9!~DNZNX98#Eiu_!2THJV-RTGJf>u^w zj6ndS6Ph*wGY-~=-o4Uw<}r^gc>RKn7w}cOMw+36xV@@EFrM|RTx53pgz27n42w|69J+TNQY=R zFQRxW6z?G2H7)Cvt$H^I7>8$O=?XufON|d{;%l+{;ctalc`)|&%9E3T>`L`=4eSsK zK|_9B8KRY7LLYhUhjT?qvNfZsMozDb202>fJ^R?@)}|j)2s-#lF|!W-&j&}(=Ars3 zCi%xC>8Gq?HyDn=b3^K&f2)JWt2n#v21KqjL8qbD!gYL8<~_C;-uf0&riF&W&FF?t zY`1*??zf)Mj)=r$;|b7`C1wyRFrV;=FpQrLre^*i$kRLGD-X}r*W|sws9LYhJ2TY> zNGp*%z@XeKyRX%bF%3|7sX3@?eZb)yRHbp*)mgonD!^TL%7wT$N;C4>WEk(2fASEu z;9-Um1xVPQWjbdi+$& zAD?*H_t+R`%I8|8w$O;fD?n&LsS&%ua7XrYC^IJ$f1<@IeR)WYw3u(Rw~P_bbGzuR zWm5}ihwEXdWawhah0T;mCOwm^(EK*^yhws1fZaTYF*&!a@54pllMB9gE8o`(o;xfs z!%pfo=?8E)_hCUFF`lfdL4Y`I+x*M3-9p{C;+LQR8ztclPhh{s|rv z9AB1dLN(JykL6=T7|x}%bbQ5=ay+556y?SMY&?L7gItQSwqU2BdyfX(`cjEvza{-N zlH>UFz%tb)Igj<#fNa1O>|>~Zdx72s9%KI~o}?hBesZfA2x$&wv=I#cAj`T()w)K) zSOji_AX9PU%(0hsSd6$sA2NVg@j7@FJ``-|lxMBy^P#j~PuomVbrSqLRn*9l1P$wk z!hDiJy$_7jgg&o&-yi=pip1Ff4N;`BPF%5*FSz_y*FeUZQoK-LyWTPK#vUCdIqT0_ z5)PrRz~)@8$X>MvgT`(^4QwnWJ&^{G<5uidXaB%nr$58se0%69xr>NCV|t>K5#-XX zYQ=vJQnPWG0mgPX8}sE5or@*^ve&;^Rr9EE&j{Uh#p!p}1qw_?pX2$)@Vl=8@VSF9 zmD6i(b=K^DkwBZ&dQiZ0o?|^*>4C=n@t%iaEjO4I!8K=*Wp>VPBF<|X=z;ik`!;@! z5sGx#Y)^Xep};O=6`Pdt(jQ_-(G&flT+*5txu$>~N1b|9k}9=nU2~6fy2yuw0`out z3T{v!SmF0PgCgFem<5|sM+_%`zGgBs>AvvQ#Q?fkhK7vi44hrnMS~_rvFjztvnyg% z)E_Sl!e=8kPn#0b0BzS;PBI%_q$Jkgh?yCcYW z%>d$7drp2A4U>rD`ZqQFe6{zGeD7E6y4I$&c^Id&i*MuhQbOK?)I7x)r% z6Iq?gb)kj2FP$Fd{hlbD=IP0oUvmNLArGswZD&3Z)B4_+Wo(UkK7R`8wV~hTz!*l^ zurLhwb&OwKyH)0|N39J7c`BI_r60b8?%x=X}WC$-Xc*#3}FO45xqeNXuRnGZ_{E}bg69L!=OGwbeu zcMhvV>Buk^&w z4ayWZ@`fY&xe{Htood$DnGhECFks8qQA$I(+?)j)TalRnMbXTd49OaRoZ6#y7L z>0HKV{u+b?-55#*oz^87@WJ*b?ch(Z9PVZV-Z)KR?=&5Xp2}vJH&3hM3VdBuT*4(B ziN>in=RWTgou+rQk(7fY=xLMJnv%1_TK-@JFlcY!doD1OaWYYXQcT6bXek>|J|`0W zwFU5uN1?X^14;7l_DV;L$+?BM&Q2jwiF;7_QYUD7m54OeAs!ejg$^vLfR<8;BTZjTP3q3^!K!N zd~|kX;nPQk!_;)v={Vm-H?3!Kt{k)mNxxgz!tAT4ZUk@|JKfwxV(wxL(63GCO$UjsD&f!EB%a!S5Sas7YVz65pM z5MSyI#f`K2ro)=E?9nMi~I0XcCr|qDT zj&Rg41QENKhmU5BE?*lR?Og^;9wcsPa0R65(z@wTf$(b$_DN1fT~xg}RPiLd2vOPv z!OU%pbK*F!-IABO%0bAV3%o!~TAr4_H7)x=lPx11>4eKC{vdKc!zW%Nw%t$jOXcVz zl8tO6xf{^OLgj1YI$%a;F?#(oRyFx9i{h#q*@rF*e~_05yYuOn8Vd?LS|eJ-O~+J7+?C(5OBNj2~$Uu z56JkIg3(ugzxYU`=knW->Eu+TN$RGlQ?{)ShH2E{7Z38|i9A!wcv?Ni5vGI4D6lZ} z#&U4DV(aXEK2AXtFq*r)}9R%6{&jolN^mi`d$fVg2$ayT}W!}U? z)YsP<=h`v5E^8*wlWyqH8J4wz{XQp`Qd_!UnobTs&brZT8&17wYB6E z&s@e|#k&bQI##5g^H?~q-Ibk(-#u*ySNF>pN}}1je5-^1NO*8E-17#U)eBz~`?HAp zd0D{f7tQofe!^W5qP(lhQAVnGwL16p48+UU_W1tjSDG~zk^fDocLC}89wn0_*n9er zfophsC(UbDC&VmqS?)Ac>;Q8>jK8#aMtG9EFSHm9)2)ZhSa7Ji2M&ayW zkN92Le}9^)c<@<13d=YHA@4=QbtEWV%TEJ-Kr>#h+#2#q`?t5u^y{lv}TwfkGsxNI*phH=tc>s?cW@fvn%Isso`slRZOO#ImJ z-%zN5jtCnDP5#2hL7*~6HqL<;NvMmg6kAMtmPHHG8!-RA$BnOWrOp0r1;kj;KOSoP zH{b9p7lvayR>TbO@!b^R_h#8geL=j&yQo*p;B}HUBbxq(M#iKY^?GK*@ato#(-7i0 zvU8Y{_lj?E4w18EW8OtCJ=B{cEI=Xi40nlS)LCMDRAFBYlP6I6`Wii2gKpA_Ar(+& z(9svBg#7Zgy%gQExXWyB>%Mp)Mzr3~AwY~ItSghT9=(f1kuKLRPUq6k!*Os;o%GbOO$UTLxU_+Psl;Tiwa>Fdkg!#YFKl z@+}4`i~M^^cVSBT>kt_C^&0_~`i&c$W8-Y`9}LW23}f4~ISg!pfnx>+56H9xR_jAx zuN-kgy|bh~;$VcvRLKZ8DT%47`n>K=J04`lR}Rs1ZW6Zu!%w5f}c6^4hs2_W1*q4EL(Wd!iAY9ea-Q}7fTh? zf#_H1Q$%E)KX`8P6b7P}y#6kXvU)PEkSd!1m zhRgq^<@|bmB{PI0ZEkY6>Bv1Qb&J`#TQ=~-Wd51gO84{M5!K;GeLJa*1Z0R);3q=X z902XtjWb(lg~#st)k$cfNIVH;e+L@&r^jp$CG*gLUqPMr%`i@a7#{575^*hCBg!f5 zNpl4=XPhfX6}1x4kYoI|8$5Ib?|#Oa?g(eaFNVzSKCHWBd8%SDzwW(r*Sk$+=Ke>c zneHeNWd$uL?^neq@#fDb(=MTpUxDZX zrs1TSFBJLa_Tcax4t_UaYZWH24tb|VW&pdx?@P1RTzV3v_}$3#$0bAh)1ZtsB_-0# zmrhXWx+V*It?4C>`kp9{5G`icQ7srGGh@X${@Zc2nH)9=%cs8|bray)Y6g76q~*qs zbWi9cN;;?o^QR03j^Q&8A2<2wtl%gHza>oYq#E>n#g zMP-Vnfc2d3y%s1$T*B0RCdheqCY}fn8{TIGvtNp3BF1)61xD@6odNRePDV&@s|&6^ z*tXzSL$7;REwTbv3TJ*d#HWjc`30{i9e|PFH1ypP{&f6C|6y22i1$=eyU6&66^pO2 zLaJ!@-r7l{yj9N4q`Jf_GuPrxEswcohGN>S;L{48 z8!p7FT#Mst@^EjtaVMs?uQ8E*T!-KQvN-2AKqU`7VP>oD54ICIml&<7HPSks1{P9N4eoGfCsbn>1UBXGr1cYe2{2{)n zf3?)oPg~t*J+_w%R}yQGIIvx2z}jPSOVh^lXANf!^))VVU&EX z<**se(;-nsxY2-#7d7#UKJ0;lW{v72l^Mkr*t_m50S#+qXj3Rh0M0QDQ+ji;(04h(4S{*_hFKC73`+BP z)6Yn)()5d?j>CW<8r4N5kf<3B2!){JFqdpDI8G#*2-NsoPe+oe^X7tY5>XsQYc?WO zh54bqR%`au93bqG7AcBy%+*vFOfQup9br*7a2#Y^2C$686&FmsHFUO8V@FKECtf&!C zofS|~f}tA~Re22{5=?*tRt9KQ{mp4-&mECnnXz<)x+F^VNq}llLKh^E86voV4Z1=K zl;x>!!4QkUG%y?h01Y4kp2RXqe+5<-E9Az)STdTl$ud=i!grd>e|ow)&7XF2nJu?Q zAAr`9c1k`9ldzZn5C;4vwj6@7c82ZIr<1a&)@dQ2*H!sGBa~Q1ZdnsHR%uLuoq52& zD50Lo$}fsh-+>0Ru3EvKU`;) zo0WYWc?#A^a3rRJW2O=Q%5cXYP0f7#Jf@XfotCcLD&((sOu~GJ9g-lJk+jXd-J#C= z-Qg_*kp)@44PsVV@oS3d!X5+-QsNV&Y?pU`!y*Sq{P`w{Xx>V~t1$K#JA!XHg|)z5 zV`VJrkVEU8^?vr&;YDuk<4mY3nJ_v%eqd0J0nsFYZ=cB`xH{fwfFma_ta(>S@av%Q z=|n{&sQXzAx=K219eii`HAFDALix$IM#^y#dd7}f-)VJ);!DXLGAV^#6clbs$XELL z3h}&AB7Ds+s9^C4x9)LFX@^`u$5wI0TJppRJi?A4K2);%g(-p;Y}n&z#^~(8{yiJC z&tN`oU3G){L)3y>olqEiDnCmABCwNi7#!NV*Uu}DLYBdxPpC%R28`0LNCGW@xjI=S zVYFO=Ufa_7esut^1Wd_i7UfEAJ!um~0p_Jv0nDcN);FLB-u2QsRw&0g?tf8u4o>2` znNouN>6Q_U8-Y}mwAW+gvTH^_dlybHHcpLbzFE$+8^X8Ins}Wg;bw0?)a%)cAH1&D ze}SY2t|m0ftM2_4zR_znsCcz-qt=<>?>jH4leilCz8KxG7;$g&kYyJ+wGeG8h7Zy; z&u?1U-&Tpbp5J(>A9$r;PF+`il*D6Sn@|^iUWwfsE6cMB9!pYr;j0Pf^sk(-;xh(o z5f%&HNQivSXO1rbi@slA0V7mdgeg{q?0KZPbS;9n-y8Kgb3Y57aMB(dVyleq)KOZ4 z+q8cvWdmLHv$bQyH!Yv9c(19FqoSI{?c96-Xf~PSj zzhq|xCV>dsnqb*cDC>nm!7xKwTIXtq{UFPv_mPr$FdUHURKS06kIjbN)}eh+x6n1K zeKO0X@nJLa9PAm!ZZvt~hwB~I(Tt!tUF9-SL;=QYnxMGgNTjtfGj4lJO{c7cg;#%f zQsYGo&?U9VN)e)Sq##Bma}|~4bt@|f3Tl1C34N!S)eg}IeNTHx2rCugF5lbkmrc89 z;r}~ggXZ{>0WglB1l5E~0azM$VKp5r&8QWnRAl+;MIbR6!IwzoP;AxK-%To*`A%!m0UwYBY&>%=^cfLUQ=ZNCXNcJj{(B#R*F9&+4zZ2S2 zj&Y&er;*$)ur%ib9W)?FIM-Qcr^ijq(1Fo8WhRk5mUcvxUy{ssro(cZv;Bo6`>-7G zr!D;p@A+}TUE4l>BIGh!xMSzJMF2DYuvxLUP63j<0y4{$i9q3LcfNd>alS)Z%!yM| z&WgXt9FzN*{9l-Kigal7#SUl1GHTAa8idrHX9{AG4f$v-qdG2+P2yMN;btv@MJZIe^H0Xo8iaHpbY#EDKvl=T6`Gul> z+lbdbDda`GBQd8b_Y}T3ApuqF(A>g@gFUd_$L|Zb$jYAv;5}icZyCQQpkyFT06~jL zNzlj9ZM`L;-i={5h^n+#e&R0pN#10$YBi#8t=wT!NrW{BCWNDLCrzyzvPI15+nOUp z7{zzv4fYr&fkZZ49L89a)%7SJxom1P%m!6{SEC18MAxAbr1xyFS_q0iAa&Ute!i=JhoEra+(_r@cfeA;VZ*xO76XC5IQED|+%v z$IL!*k;@8mv?|u`m6aXx3Sd$uH$I^M=ZleuW8L*0DVHma@@GF;kNGqimauue7k;(l z5hcg^y4ib&vg$q(%o8qJ;|NS_2_@yX&;9oR5iU0Pt$VFi@uug@@h1<_f}S06+$81M zT#^Mk%slEKXF}$qLYn(ff?t=KOJ#&FogfJGZa+B#(gFX^ZIkw(s{XSaJ%nN$$|gON zl?uJ^Lac3+OA>=7->mmo$bo3|hu2#!D@LH(X7{dUA-NWza#X&JK|YwtINo1$)Maq^ zTf~o29gAN$q7ocW#yvYkI?NQtK6&a>il1FQ7EaCUe9M3}&P~jmWu~1^jlZdwfzUQ< zH0OP?whBnWf$Y^M&}{f9bXl|VE0%XXaWCjjP|B$x7KMORr2*=D1HBr+caS@_g`EiZ?m7(GDE1tcEP5_r~PtcDIjxkSFm%A@PaQBj2=8{mzKgwDERNOQDH8@c$xGha2y67qy|E=%>0u z7H8B7HJLRrq4N_a4deR$oMtg*kxH~VH&4~;#KOMTKUuCO&Vv|YaD-+8cuh@@+zjhg zwi!q0oSm+%J)H_(q)r^tr+dfPXu}6o@rTxuxUa?{am{^#z1R?5r0GyCb->$ArR|Dq zo>MA26UddT4$Q^e7s3bJ11;ns!AL?<^KI!#uhTj>s)spuNFoM<5+QbG^70x zcB=+d3~obVsL)gkh_V-6XRZ`7o*h%4Vbf$}jZ7Ph&3?re>kwvm-^~(FNCCyb>v-y; zZZ+rNfAHUuLG7o_zxPv~bPaw?R(km?9Qp=^xi{J%{SS@4>)Ku=S=>b5pidVRgY_qA z05d)ImZu_OgJlte=?2M~hVk*t7>wX-w3 z^gke4!?^Xa+lVjbE|ia&b0!>SirC{O3yDOelFON^$V7s_g;=lpox5HiS!+W86K${9 zr0=MsojH$&t9|mToWj+voV}Z6IF$sMmZ$i`j)S3FR-T-cnA47r;jpAJa?AD2Uy?bo zOS!?iD7h*cO(-GEXM5xijo*Cm3sU8BfR{v6X72Bkpf|JL-o2iXSNX|~izkunwZi^6 z$)hXk61?b&!Q#r)cne#4@Hn_vsEfl?><*puyBP~0gdvsAfV6q}_0Dcs)x4o#O6BrNr}&r#L_OHZXvFkL4E0fi@?k`> zOOwHud2^h?Ph*H61qKPU7N5?SnSB~WU4iZ_-8EL&AAnre=}TiXZtcQM%N%g7EmEn4 zwWUny0aFj7VEpb-hRgNdnG<%zvZujO#*#6ErD zXX|+Pcp@h~T9z0MTMO3_h_hkrX9oX*h`^SWZWOECCsSgBRC{g!;1`+NoiuC&cI&PcPh1%pbJ80S9fj!pXT}R8E(ERfHf&O*ntwcsG39}Fxmvw zS4pbfMV-1dg9NziL&vw7`!Y8hJ9B=?NgGD2ij-Mp7Hp8DloP#zjakI75r@M_s^DHF zt9x8*PAG`Zt%Y)uj>H$W7Z(XLn_w%c5KV${Ewe~fQa03FTm}N>cmsd{02Hi2n#CRv z`pJ~Q6l}i$0oS?;!{{TfKuMAnd&2u>Pka|wAOcYMt9z$g=~jspLa9E5_=UwtpUP{* zo*PU+;?&W;5=_)Tk!a}Q*+iH!SEj11tAY<}$7b!RiNk*}?&SEUV9A%?o8~G25{Fpb zIpx<76=ydsCbi*i23}?B*coqX1D}R`aOOa^q)?dwdB(%ESk;>ky2U-by;dwihUZ9$ za6lc@*zvU}BuRWtSSP?ml6#qF@kc`^_EKhy7A{#Ei*AaJW+=1Bv?`2`v(kNq|5v#p zwMAyppA(ylt@URW5XL`ZwN1K-PIqep(PO;+NBTK=MfXsx7IWQlYM=SxrH>LjY#nrC zW7%{9Uyj`F&6!W=sHtlkJNP_<_ERbbG2q>M{Md{)ZRu5XoMAkVYM3^h{WUH52^Tm7 z+lpKIbN&+RYgc(>sltMMrhLE3qx|*-GtS#H2E1%4A9ayV;0um6lv$G2#`27Y_~phL zOYhohJ%q{yA#kTFT84lLQORTriIiNFS9>ha#nHV0*?D1HZQWBD^=0-#aFTnMm`$_eD+#|M}ybA14i|J<-TRB zGlwqnc9whX6oB5m+k$=xY`>mDomdL7y2i1Kpp)t2HZsWG=0mlpnU;MAdUHhg>ih6` zxo(pBf8nqimT&Y{I+!+)TBW{&B-)SJEDPvioslZw+x#V?GQqkgx>UhQvstT`YRM0U zrnfEV>*;$nhe(IJ=$Q?@#3VY4^g)k%gfD|-?PN9JDOXE#uI#Y5UqKib(=>V{%80@prIhutCZx62 zrv@m!xV%Owm1h!e`{aNy%J8G2dH@Rh$B>aArl<+!vver$1`zWvh>OvP5C1lwBFfCFsRRV=pEq=lZL^PcU4B z;zDyKyph622mdNI8i#xaDO=;UYZV?b!E*`V@CmQ!-RPAFKwVVaN*(BYFz9TiqPUuoV`A!mc%S6~#dtTPfUTiBmw(AJY40^d?5GA;Dd$hAdWZ$U#Gt~gRM}VW9 zDS1mTHUJ$T@!u?0pDh$26<8_Ky{#ngN@^WL&aI!MLR9eESo()HIF_fSO)_5TUWcQT zc%G=vS;5%Yicfy+MH-5{u_$bbE2ZvD1cF4+0G#se#Q^u7)YofWmq!g=U;%DZWw$Dg zDtW-=Zh1M7q~>%?l!3+>t_gCS5X74nit561Pj4#D+18Tc^iT4+OjfQHp<&CL8FD#{ ze#*wUHHTZgx|YsTFv&u6*(2Tn;MKM0>aJTfTJTOal|0yZg{i!#SP|_#|3P11xbQ+Q zQNi@6!bsG-I!AW~juDM##BOasUtr81Xm+vjD9JJwN&Hn*hX*Q7RXhr)1=aRP&l6QP z_U{_IJ`=2bwc>OX68>zg4|-lt#S_td;uUaE%lGJZ3bXy(^T42zI!E~KY8$ImM%QIS zrSbg(>Kz6gN_ES*WZ7aa59!|!RtUxx@zZTE=QA6R{ZXm0d=@3yxCutlPL0cj}xoVYF4Ug%OW%(&;AIEeHuDLdm_$=`fp02E@)58Ri}IXO@OK7v3&==yWw;F+S( ziTi^b{T6~G2~l3VN7gC8JA7ZwaRB;XlzQO5OmPai$HGR)^kE|fi?nsL$zSau`ssKy z)P;j=;>uhjO!iRUtHmwy;2cWg?o?1=q7LjF)s4j_Ijl<^$|MFfViaTW-$2pv_ISc4 z(ZiI?b_k~Knk_)%X)7up0`V$AaxL)YqtU>RMCAU z^YdkT)>8&-^D}aOtkpS5?o5K9I`~&BmHQ~=)*uM!Lci;ITeS#WtKF=~!i%ybxivru|3GVw3&_S#dbc-U^=z1|-5Ok{P(M&tjs( zvW97x?^L^9%gBAO%6t_?8(CL|*10?N8;<+2de&hbie}F!*Eo=r{*Dq=3qXstH>#Yr z%&I^%)p3*1Bv|76K5ZYo#(I9xKDU#E?g+l20rr&b42|jEaKmZihu^hc};f}yJg0;D1Cdicm zyIHf2>#qkqnDYpk$yda}AhIqOEY>07(J*_k z|DV#>ol@wT7Z&N33~DLrndi7rRnbL}3z2OBj>B3W&0BgpaMs|0jty2u;^+B*=iSa| z==S`^y1Btv4+-ICJXjG=^X#-F_-v#p$%(+tVm;5Q7tuxL^7g_2%BZ1BerC0l!Q?XL z=znj%K2=NkO88!!BNo2q61Gs^AB({LxNZRKqIjy^pW^AdjkUCWplSBq^(x*HC%nIL znUod(JZ#%^@9t>Oopb3ECsGBQz1j4>gg+>Pc+EBE=nZal9F*S-^a?Qn7sd`{W10NF z%mMW1Dd@WTlMZm&mHWQZYFCH4bi+FX6w>Q99Ale?DzH%W2sC_iu zWFL#{C|Ph+B`F^}Mqf-U+?$;v+FlWsD@OJ!E8fjxoSjb30}67VqRx{9!;rEM$4~qQ zT4)(D#u86FY1Lc^5@#~PD6?gueu}$D)BiCw`7Uy%plqFxcosnKLYLYoo;|C5n{>A3 zjHSCuT@(`W7pgHQuB#rzI5n7Ke^3E&FwdqY2rgtUX2zp!DThg3*LPP1^eN(DX65qs zeRlSLv!rSslJL;yZ{QXxk96%wde1?aYwk<{Ck&J3)J=h^Wl-(QgawDG)ntc`QCeFl z1;K2+|>EqAHJxvCo1MqShd+<=(1yb%RjSFDu2vH;y6jk5)7i7U=N zZ>7h1EMX(+)gF0>gdzduXy~sGQ6#PK{qnz=$i^#Q%$}zoLPn5H@jU$NRpk1-Zc;X; zM`E1WlSP$+yLqz$>=A<=ZRyudXONfa1+6x&{uY^^9$?~RB0JcJz&UqZJw%K_sY!FD zvfNjzuEdCu9_S8uQOUdH_rTwj(gIoVqZxUJVdN^~BGk8C!RlMq3Wf9F;|M~61EIhB zC&N~;(S>^y!WFx$p9Qky2t~0XeY9B^An38!ypv!KsbhVY^s(sJax`Kj(^B185VzF) z%6o_YM3mMG#SDOYXMG-a|CfFFd)iX2HC`6TwaDu!aaxSo9OE&4DClTN{{=TlOF*eq zxTrn2zvc_{h2Oh$Zg^`XkVnj>Au_t~`3CR)R%m>&(?h6+KzKO#eOuHW?J~@EuJuMx z^rZ9-MWzV$QcBgOgO8-@W@nKq@<3S@!<`Vb$nv*n?;ExvcDLKx!bwtNG9d{+;jbs8 zXf8Ke8Z^fw8R)7sHM>ItmA3kVSj>Y&xWxp@7>rjt$_F&sY2+_hb=f7TJEP z(1+_H+So3h}rr61hOt~QB|$gQP9&tGF^oV)z}DM8R032%^0G3h!XX|W@^esz+7+a=!G~`>Ks`j?3Jc4e$=v-J)RD!3*2b&=r2i4xlp8b}Z zZnim?Lh`1MU@!%?pCe4j1z-xB#Pkdv40ALH$`eU9s3g4 z6}(iF!Gwm?fevCV>NXj|Pn7*ib^Dty#y;VlfzO0b#wUL00qQhnDSsjNpX8^bZZMQ& ze=OoSe9h|LlSo&g&*eBHh)0@Py^hOBY_j+$eD~<3vTsTsn$QOd{ zpRWk-K0W50QG;FM{k-8IM0#d^{A^j>2(bgWc^&X>w5H(YiYjOAYfk?uYj2>BhOCN@ zRWz<2QO%9NQdv~ylJ80~N}}x2>dJ4MiL~8JPeBx>YbV<*X`bWUQ0+t;gQxQEJF0^P z+0dG5U{50(4?PLd1cGVRtR@5bk_Sftro>dYfh&KszCe~l`*W(8sw;R=5MwgnYupa^ zkkOWPIj0v_?q*>4^*mSqcR+=rv4QeaVpm2elv6{^6Z`xMF)-#X0+Uv|V}#juaf_He z#o2vt`ECGTAN|i$noYikK2M3#EASldd-3*4yA@C5dM?P~m(^JFP35W^I!AU0)vfvP_ua(|AB5lkx|ICx>Mj z@LpcA{Q0nll|SRke;%`LR8{Y)hjq}&89_-Sc-!P2nfPLDK&mZDv2JiVC4MZhv@R0Bs zb6gD+3_%Pkk3Ne}>Zp30H^>1^L|5J`$A6$?YC*ot)PgI8`JZ%k~x4LkTo4_Z8}hIwt;g=F(4c z?@-H}q1*#>U{7gLsW2+meM6~OPu-Qz#{Sp6WE4N3eZQPRmy5JqD9Jf2)6!XUU-QZ_ ze)8&vlN%cTl8DBQ79W#&iD?-D-O46+JrmTE??Sj+VKdk~Y;{n|gZ4v(AClzoMIM-`Z% zNJ=RcOmhzQu(VMpa%j~8D8OD&3*RsSBp@lQ77Hr^>8X&EDH5Pe3<802MY4z$nOQ`G zF;PY_c^q73obhaefR{wI+?ul59jxhlgQW-j?8^ScKnG01SR;^ze-F!-~k!%6H~;`7c0rouo)G?t zl)w~hzW@Q(Xq#H1mXhFt02Zv9dAnORBiX7n=FX#Jj18s0+MXA_Ee>^eJ_9WyE6Iey zEat$qBU!ys>_l!b&n{;#{2P8>X#|{IOu5wKw{d-vxq||ay>1N`d!!ox#zs&g#Tco_ zl_;Oq@<4a-1x0#^nbt%zw%XBJGf{!~|*HQcy@riaS#y?TLGv z(l}@qnEASBD%ebs3Id>?6=%m#fgB!9%p5|6BoLw{GFHjc_zR_$jP<$ru_{x0v$@LUJGy5Fk?#!dl*Frht* z&q!C`$_#gjPKW||P(6H|5pYd$!GaP)P?-oKe;$DZ=(imqZ~ai!%SPI(z1PcO@S1y! zg3+GqTGlx9HA9Bt0Htc6Y^#h_oeuvQl^>p<3@f}$3b!?%iIgMgi> zPc?58V|^J90fQ@V;no|SD2vbQY&xLjia_s0qqvJ%L}M ziVCINq4J4t0yoYvh76QBZm+vAhxnDbZ&*YVU3a8YXO;?M=R(k7@fX+6>5O6i4ajl6aj7?f^ z6YXQmC?!ljx{y;sMcU6zAVQ_$a4?$@Y-^Pxk(xDm*FNd4{gbB(Tfu#NU_6Ie+ZtU6 zB4L@gGf`S|1F1%;N7`Ii(b#6KZfRwFVg*lFlSD^W=Jw`e`}~8kLq-Yna2HIKD`}xA z4>AhA1}CLxcN|g3?@uqG%0QEXlA!V)4^4m6P-8QJU5fw~Aw$0HKDa@?4-v}21J1=Q zF`emFUyc58tQ%s^=!}=<+|WdDP2-_8+iJTHp4U0#Hzf<*6seXgvw@X^5J5NGP*Fye znZs}I+8}=F>ZJX?Z()&Pf_=|{J4D|r(p%zPOF(ZUb@uqMV~4w0>miEpJtX9nykUb7 z365e4ee7uuzF`y*NkfLx*&3|=$Y&#A1=bs5*E|za_60BA5g6G)i<{YldfLuCEY|r{ z`_sNo-Yaz?Z}o!Ay7wF3NpEfSo)rou8H=0we$AX5znfnW&b4<4w;(lecwflft8H;Z z^EPR5%eS=jD3LcD$xcLZUq~>OST3*??t(h{_CF5Ty1}-^gvmp)R1YmOL_%^HXv8O= z)etonf@|@Q;^6_j{2iuLIqlibUe-$2dENZ0j8t7C^Fj_foXRO+5Na}ikn{{#l$$Or z+QGWtn-=-K##e!rvrS%Gfa^nNOn}vmOOd|nx!g6@z}!eEQNE+H-*#gA3Z`ll84FBA zI)?v59B@1c#V=M2#{N zu>>}{OK%%|O}apN3PwSS&&pkXSRJ$Xm``7z}c`umU!=OTx5JhYDx1c`se z15(A=FB(qfRFZCmT*1|D{p|DzTZ{F(q0_Y=Rn$qIV z1kXjc`DBdC{oRsBg`J6+0=Q%ZlW-e+;PUg)F9eBvS?MZ$tL+5u~#Wd@$J5~mP37tIB}t| z-FmbDko|lqB{ySVL~9=Y_JJoObO=S=yQ|MLdRJ@ZIM|Hc3jD$_#hC?6e)>Q!VX=ss zhugGmvo~MHBVt~Zaa2bUL)@2$|CUNFuFzN>2QdC8Af2wK7U!LzulwAnG9|*>R05r{ zb6XrNx}nGyd#<%xUn$tyHf@q#pGqWJxlVrv`779t6e(*E_<=egQA{T};-*HqTmMNE zJ#N#M74|!tx{CxjgTknuZ$|qKuigyWsgAP7{c8*XXFBe(6|63`5j=@9?iQ}Xv6ov@ z<`iQ=&YQnX43$`<8k-xOde-r>k59L*H#6qTR}tf1VyspdcOv!(5U8ZQtMcxkPI-k! zl70A9b)i#ELPZty70a^ z&o=QE?jOceUwR8PeUc5zbF)gEuX#%}oEplG-;BJL$jdN_$l-G+Joq_ib=)odlDJ(g9-71>T^iFXKxYjt)mJ`F#bg*w51~i7GY^sLrI)ejw3MpR_ z4j_@Fs|M5X$@`of#35Jye$s~H<`h5nXKFZ}7W)p9`!E<11KnBD0HYaMf}c~eLp4~T z8?Src-v~w!$qEviuo~z<+@IgTC1C8ndDpH5Rgq<=?kHoVBM}D zwe`#cuSWK!IUX(2|Jk~uGdmwK2No%UNt@Zy!d50VCnNL%ouTE;FZbz4 zbOi%QBD2-Ry=2KMINfsJ8!;GKh^-tCkmLI@iy$^fji)XtfPhzLU@Lsblf5tS;t$o> zGr|^@Dxg+N6%Y667G=Pyuc3<)HYgbn9Jn}C+29}DmvCli@UZ$0sZ9Wp*U{e@LEz$S zfCh-dmWSg0NG8$Yp`_R@O<<2bo>b41Vu|Nb@5Uw@w0w89J0;|}3Pe}ewOsYS7dQTG zmdY=+y_t0{z#Yv(eL2RZdD%jR*8{6D>Bo{N7%O}`mkWxt5Jr)z{j&K8d zeXlR}H4XL=*?qQnK^l@3;R5z%zvp`d?5VrkghmXXOHFZLNvKnetowZBtlwEA65x(i zSj%=Ct700-z~YBu7kNV!HN%i}{w|3pJapflK$V^UT`%oXrKgO_mVkivkrdY|3+7Gx;O zDW*+=+o_3yLr88*HBG3nP`32pOp9i4XTvi%icRn-V|)=Dc4*_ zp206(pz>xRqzq2OHo}qDNOR*t0=0Bb3;ktJazk0fGP!$y+l;d1wSSDLF<>VFle#_k z0S%4v)q{}<)#x2`jJnL;=a3FfJ_mIq;HZ(X4{ijFReQ>25UTC#Z&}oq+TkCPaXi%X zr`poSVxdLWJgxSCT+C-l{hEp=k~**}|Gy1CAOJ{^m60c*3=#bNkK=OsU>Gg3#(iwr zegQ{7%dn#UB0@4tniYTPPtf{rJ!|w2BXpO>=V{6KRbgsHMS*AIHJTDovE!?&BMK1Q@_k zKHl6XBMCTN7-L5;OF%h@s(CL3I1?uM|%~VpvAiU%MUA#a3 zv47Mmw_Lk9$UP9Ak7*0Y?NJswDA$dri( z3U>g-GC8~4Od8wq!6V_ZnsxRqxBS{ojQ6}+cvHF240lsU^uW;NW+VWr<{=S2T5(vC zE<@cH-2@tuI(Unkx#NUzmNZSFx(8h=O=S2%J|E34sepJX-zJt;S?D+Rc|@->sX0|I z`I^H?77dp;S^$0HzZD;dg%4y#_jP#~oXu|%ed|XDVnQ#6lmJaYvcG3mWPu+Ptx|xd z&X4m13$jKl*%Eq>_z!b5F{L%E)jJ2)&M%PRIU1qrMo#Sb=St0|Avro~H$e|H&cg!b z#Ta1|mUGrUPvUToBphHvFhv)jIL#9or?WZwJv_mO)X==bnXoRBt-Wm`*T$3C^B#yPRx-B#i&Onvf~%|dD^0b zidsxRcAV#JMI>-2D78^t$Y_kH)0uyk#A}9f4|++`EB0JAmrCe&$x_MUsS(L4orOP=)%zUsd+&o4-7c}*p6erdcXj^o6_iu6BQKx)H|qgOI_C2; z05Rl>`u-`o)n!xf>=d|-1DPsaTi}O~inRey*Px{9+hl;n%0*W3x7zwx)td}IjctBa zg481+{^CJ?)R*A8)iRdBH)@%drjEz&2Z~Mb<G7R&j@+UiE?Ekkv|siwU^kSu8U99{g_@@!18+}=FGkI`ge*SB=@~ID215vkZe;S^YaOC!O8VuUf_) zdXstctjCJGPU?nid)G>MH&dkhKvU_7QVKG#*$K4-H&tvTV>Hh7R^TqJV2NUJy$s01 z1ux_wncV4LSHbPv?lXf4_BY4-f@a-dt19j8X)=2hlW~ht=eJJ3OZ+Vj{L}yJ0_kz; z4XByv^_#SRUKfLK)ZEC&CnavO=n*Gkt;a2)rbV@@W&^2C%SprV%+BJLy+<6Xe5_!v zQ)2$gs25STWhPmL>4VIAq<9;kEdQ|+hoRKj($)*J?Y4Mn0dHt}6#}`k z4Kk?&lYI6s;XgiU1CFcz9!r(bUVQv!vPX*lQL)obFpuofTm?^%LcFHGO*LU5QGYUU zBS6Ro5lg7Y`J?opvz>xdjVOn4&WcUYb@Ge%Y!vO^KI9-m$H<{kT#a;UbAQb1sAI!T z&JS4r>ZU3}c*tFQ4gK~M^w?3O9`WJjqY;QITsP9anOdxy6UjQppdG!(YX5rIYuhe? zDnvBK$B$$8uB^%5Uy_NwwuBTTnF{$l79Mk2r)Z|>b8TFR@>l#NbS4H+OZ;RG1<_+P zgdbB{+cgpXI*qyAm8q%6Z$Ip@G2>Pk;pFVm`l(d@1ZDK+NcToKM88pKFO4aI z3z!4g6Zl-hGwRUbSM+}w8~qbqFt5zA|N9AeL(Ep(fqFh}pkR61p5T){1w3X9mDq#n zdV`^CMpEA33YbbhxW~!DC8j0DGGQz68HA@ZVa{N8>``l{?U-PaQbu*QDFErR(b?DG z#O@v-Vttg)RGmjX)(^5HV-wy^Hxa#L^t7J(|1D{3aZzXT?PyaalRggf z39gim|4Kw)jAl%013)pBMQW=c8c`rogm>{urG(`wd)v7&=;g*(j0MND$#KHuYYr^{DZA{0>>D=Ih|eSNTu)?n0LA|^1rmUZ zBz3mczf>%eJWoGO9N#2Unq;vY;A(>By2zVBtj9iGN!qEDk8^B=m3O$L)~$m~e0cRz zf+{@|o5PoNUtXrAcvZN@!Cw__x{)Q~vw&xf~95@zRuerLMg(nbYqLHVxe`R!aUP#m6vfCIM>U z1{3a^wO*7Di|P9Lv---g#v_~$6MERz4I|X|G{(N>y5==`S>fvzj@8D5b-?mXv3pj* z9u^hHxr(r~2Yk8cqhcZ|LOJw2)b;7BHKG#z9nofh$B8+9%6nsypJCFSDl@m;e9$Q( z!AO@j9+<{8oBU`Ex&Q*r&VKF(QzaaUT?KA33!s7afwnM7*Y!WOg~RHf^@Q30JY+y1s52e6+s zNV573(N6^^x7I3Je*zEGS%*6>Yj6bm4~nI#Ad)JX<9L*fL(1-Jtl>^9EF4P{{1i3f z_WX5094`peJf_4DU#(eAq}usyqF#QXNT0fR>%r0{?uI#w*bnQzQh&;ai3x!N!0fGU zIKtPIs6no-O2Ahk{@$@s#UKGSOls>1x9QVkzRH!~ zT$E|U`$?D|V>MsWK36;H07qCh@wy;=lTpd|fk^%zv~>|ye1%vsKV zr52oVA#gx}je{jUKbn(&PGX)^!h0eCrA@x3$}e)3+||e<54x`JNMZsfP10OpzQD0X zD313TGJ8`**0UBfY%xOIwlB8|4lhXO&$p0!rA6DFwJ@fUQ3%SXFS8~ZJTVwvmR1}j zh-&gS`A|h5u%`F?M{`Vq(Uw#C=>OK&()lBKPJDK&LJC z0b3@){se;!7tKllS{|Z2L@8BUpg^T-MU<{MgjjX#JPUCH6ADlXPiy*cM`2!*{bT)XdIgD`L?P7N z;Subgl#bOrwGM%|SE_eT|Bb|oGkU^xGL{ZQapXfeR7PzpmJB*`zb*nX2;&Zf$m^AQ zfF$URmGnPaRdKdAbE+RyRQx>FspDFyRA1n<(lX_NbEsyj2vG3h{HjY1&DN70RSunB zs;)B;8`0QqwWguVe0C{MDpAIm_5km+{FBK(lBU&Y5!lw|5l^DC$U?$PCiwBjZ8^A` zdqIga@a9voQ5v6YAh4h>oGk#3C~542yqX2tp0%yhk)`wbD}Sm8EhgILL9XVKRj#aT z3(%+)u#5EEW#Q>|Q`LXwg<|-Xc!9jCK+C{oxBJ-7sir4^<~)k*ZSO&`!yE3u^_ z_Mz&b8E{5Z=*cH7o}v^Fq6pr5GwTg#`6~|>#038Sp(QcdUzKU4Q~PfU9ij6Kt*k}< z69ud`N)>cY^bqlOU~Ym-c50V=-#-=iwIcQdnm{*HjE}k=1^ri6*_SeeJ*l|VhA4Eq z2&1z3OeUWO9^&d`%=TN~ZUvNxETH+5f?=A!90`oJdwuIc5&Ux1eNL$$0%wq(Dafpg z&C)5f7{LX47*~l!ti*U%WcKh&9?SK&G-`4PxOF>)1U33# zT+!o1cbtzd#7|J4?YC!~*s@v?QJ!NHrzQ1)Tv4LeujaLbA}0r{V5`EccKxz^>|xVDZN`f^l9R1gTD9L;!K1=^#Z@_#KM^V>XBru3|*+Z{z zjn)QpIQ&j`Xlps2RwL26ZnkfQUqF|~Qg^=r?>5dq#DI-4CNP3qLmRK&fYzA1sqz$b z6*V~GQe|!qLD!hS()VIoaC`so^QQs1zVOCw59Dob|NWs3qYJ5rvIRJ8JXlJQ$32yi z7^i?>Swpf&Bg-2ddI5P|01}u0>lO(MBu#2?H!z${I!YZ~cdZ-{+9?dWRSbuck7`|< zOnCfhxY_kv(W~9!<5!_b9)w{uy_KIx7#^1}l)P5W^ z!ees71FFPtINB1=wJVbT)LI(0tofL+Tm$fL0cr%TJs+3{PB#vOCg7ks-1HnCn1VZy z$Sj2>EV)N|#9{n!DpWxY<8Pu8?#|neayNX($aga1x zikG<3Wlr7XgO+BFW3)UEAl-6E<*kl!p+Bl}NsJjBk)wR7tTq4s=@`w?yY`Ej9f*E* z%pL>jYC<7Z)OjT$VPfEJ4a(wYDgUKh;KmZ^*Rf4XOf-a#7hu_pcPykh7$_m+-asB# zN$LwTb|pPIm%4%MxGMMYwVbuks~4a-rtb}zla4g=72}cX)Wrk1PCO}Bvv{^FhEAV3 zb%-D0Lk$K9s9vj~FSu+QWFkqecj}_)3Z^|MPe3gQ1b)YLJVm)cr(<+^`b z6zmdYt%dNO=ztr*?ZOr=ko9n#{zFYHiucx`ne#)OO|Ft^ozEc|bhpXeuvL2b=aXFJ z4$9{(81l+*III{v3;K$mmP!!;Kfy<0Y7yoP#dlmDKsCCmBj_gm+V02jW5AQu=T569 zY)4poG@i{aXhp}YV{vEq-yUmeeCT}bAsW>!iVnp_96&7 z7O`CjC@W>>Ya%NFN`c*AC`w@0ux;HEQjxZqHL8?CV#LOU0(1>)+yWp4Es7AzQVhWr zE)v7AqS0l}Ca$=!0d|9U{PntEy!3=6Uv%6>6;Tg0MQ|gT=#dx?dC@LIgp71oEsklE zsj6afSt^6RG&CT9R#~oCy7jCJ6CUj~v#2711#Pe)EWlHVQn8xc3IMW2FKq>4IoJWt zVF=14034uUK(V|FOtHVJOpc$Rn>Y#p00sa9fB*m#GC`XMo)G^gQvgwN{{R8ka_rm$ zqDT#wHo;CwfHoo8;n}jk+;s*LkFhJnW#mLMqe=1G?;=Pr6lph>PgIreybc+>L&CXT z0_NwWq*Jv+1ZH{R$n?6n7brVlc1BSbQo0jMeRCvTAV|}GRBIG=+T8!)HZFx z7IMYC8osf!?@$knt4mE++uFOh{4-9vKiFptM^CsTrb?6_u|?9GDCRuax*K#0T#Pz5x2aYZxJR~1vMuP-Iriv;-?r9q;| zYu&|X7?Pe`XON-fO5RnE$QsdN0GD+TUrxdzl9I$pY)Xc{R-uq2Op9A8AC@e0EY}>3 zel(hB%{TC%!bhyokB;{!Y^BfN&=9d;UcrFCo}=U=g(F@hrS0;^Jp1ACE%7qs3C_e1 zA53&#oCWkYxYd0P>NzciydPHB*-PbSLNjDtmvK~0ldaLm7RK3A6AAp}mBlGKR~%Pa zLt_)7+tQqWG?-B=5Wbb2Hq31Q;+0OsYtWB|KPfDtE_%DMx!Ukk;@yY~9*GP}tiq)5 z+&~o+iVnU6y2@Gn4XhRC3%kD-9ArIWbIq-4TB+Th_gEZSKwU%>0s+XM{YoMafGtsN z6;94fPzFN(LX6Zj5ZLp4CZrM?n<(T#Xw)Io2{+xwv* zYybgOuqR5Itu(P7F=qzC4>a|U-D|LFVLVhfW}3o9v8@;4t*9jEz5fx!sX3=vi%JQ$ zZzj4m-SF)>)XFgdYbn~QwnTyzsVi<64>7i$tT#2=MDACe$-W&>mWJasbcY6{8b zgGua*-pf=9T*b9mOD;wf;k^garprKjbg2Wg&#pPYH{eRs#8PRztpG&}@ln%F6v%rruzkbTj$j>(VO$MF9qg$x+YT-UBO1!*a)Zsbnfr~FcMeevZ| zF664syM(#zH=y8$x#4`KV6|kMFVB@MUh-})wJ(sn%hW@Q6;M`65x?OdfSj+fEWDOt zJ69&&vv*V96tT;d?Z4x&&j3i_x%bPKg)-hdt^)tGX7d5n-BBs4M6=_ndpa|ezwkL{ z42h6EhS28W3DjWP&VIs80ftIe5T30sJFD)M1?^^au1(^w!*;Y^FdSLaq$D^uctsql zV0&+JXX=Ui=@e4=rt8j;rABGS*v zj2U1kbnbH>=&LJ)*240pP#jcOShv-ZvOP$LG;d8vWa`b_dyGT5By0QR)r7#RnxTK^b$UxZ1K0P0RF zqt8k%d1oG4ZZvZk>`EA*{is`)i#`GpF$-hjQE$6|Mr4x@iNt z2f0O!N&$Baop0vt3+-SD$$xp|^;x2_+S&iEmjIFtnMVd88Sw6v&^Ut{-bxonsK`K; zbJU@qxg)GwDR9O5iCbp1<+mdPLTI!Zb3clQ5;&#tN<#)XXYN1vT6kE4q4*&yBR&j; zxT9~zFb6z}oS9iBO1%Pr2g~oOVjW)q!#^-NPYeANx2Sios-><#qmN#U5t(ceJw=NQ z>DGJQ$7Iykr-uOiYD``7Rx54n`~mY4a8vk0f8Vst@6XRl5F~hKuw1*De_@4?v@U5HVnF@?%3A%|2#xb_RA37lq^171dhbHfl!c7PAbqJu33|b5U-Yo~D+X$@P>MV=fn6KTleE z`AuwhB&Se($m&uL>Vc?Bz8cP9kh4 znUju>*S46dqUdt+8a+M-cDd-fw%FMSd7cuaxzgm1$$Dmwp|61XSVYLc0EX6QDKK0Q zuqCHg`!-j{U4GN;g5k)P{x|&zzcwXNfTj*tLdo`P3&x;<@-xyF z;C1gpkF|J1QL~afC7kd9n}k9TlP{`WX|hNN^m>T1*{B2D(6de(oK5rjqP&-C9|$=l z`4~A}4H#6`Aj8ja22-?+7?cl95qWn*4u{!iQW!Z}m)#)`XtmEOa2%QyeTS@MO5{S( z*Wk9`F)?)rA|*o%zxqxE>9PxpN{6NzMhOO|)4YtLY#SqpRK4EVXELt`X=MwWbYJ?c z(9SO$LB>;_Y;VjXLGG=5=xFH^D45d?vGVJOGR&aY#oLDZv`kK)++zlOSbW{GTqWLx zrYW_YELZKMgmRVMm}@HijlscYF_bT~a~IbnEdiwYcbAw(vWh3gH`e4@X~9+41zU%M z@6rn|?kFSy4lfQCuo2FdUuivb;{)j#(8!&@NvDST4`uno`cjKUnt(UUgqbxeHoN>~ zQXu2GMu^S$j%czwY~KXubt#l3BLZNR!`cdx!q;{E#1h$gX#DLn=we&Qs%=>f| zLkvYT7U=xsF6;hwi3P{Sjt=S%d}UD&7i~ozaGYO>9IdmfQLNr=1QHbhhU6N9sC+n# zw#>`DFijc*Nf^bc(9284Gr@M9UT=WVn<%TG_`*eMKXfMEx$7h^g1$TAE#`+RXr(@* zCW4*1%7C*Hk?D!68@ZUOy%?vL5W$$6h6Y_YiUC@(4`3=66c4GA*h9=?CBaY*nGGx2 z4BJ=eJFlzz^gQR%D_9lr=p*tKx5LyE%QdoHs0im=5qPkptsP2x zRc#do%_+ok`l!jW%wKp5X30TMkh)SP;(N2V;=}1_SR+ z7KU-^jlq!T3rbNgOUBNY6Iq6K%kZ7H5oo zt<5VGa3Z;@p4ayU=(5EVL_CVH*GNYiIBh_n0*AK_vxI+gE{AMm79$!N)gj#tmx2?J9pYxPc!xWb39Ymiejn` z?3~}G6S%DCSvRghlOTPiUpf=EV3_ccv@6M}$B>!|R6sD(XR+a|`KT72<0isc0tN;O zAEM4?bhsbh{7BuyA8GC~$mK&1nb#ENE0bpdRRR97oVa&YA{hN_SlTN|J)x#7tul1s zuTfiY<2~W|Vwh+V94U{XTYPL?hOfhkurlWovr4^hoqWKj6&SC5x4~&rc%1SSa!p2o zf3a9Ic$qRqJ1R5o_qtZiRP9RKy?!b3K2x8JH*dD5JrfO!fW}kB^MlMYzb8b&Sv=&^ zYe_bwXuP+Z5qx)F9H2<57*ba6`zU&HQxfR4$IVC@GCJx0r&!)tFxjHNt5R7REuF<% zNa^T8yn{^fgm0-8D&vdPsbyhBF{LquBT$*lfX#LG(;|wAyeiv?9iPG(BOo;6Y<%UQ zmZAR!;o^SsrV%6U$KeRf@r$nt@^{c9SOgDq&{J!t<`TE-wM{~{u#nuere_~@;O$GA z0LjCq0a}h<(F3uE=uLrojC=xTs;2o*hl^V&&r-qTkD+&{(Y;}&-s7#Dt5LW}cy^?S ztkb|x(PES7?Z?hu_WeiR&2-SC)-{8=5ia{dV5%EWNRF9WE5ZfgQFpR?awmd#rexd; z)mi~`@h3!k@@LHP`Ae}3U9>2YNv>7aX8+dz44Ay5|JMZkRc?@Y}^L(ELrRwuS|^>34PDsuz+?>%+Y zCsH6{zqQi-N7Y8-EYd`-uh8CBR$2~(*!@pEOw3!LqPJM;}9v_SDI<<4GSQ20h2*f1b}U_fFMvqD#Q`e;+LOOhlgQWVVjmW^q*g4 z#Hv9RlW5>U^N=@oov;lsKtXZn=CNHjg|2N9K(^j0@z_ZM$5&V5OT(!)8{~%K($x2* zKPHNX%LUfAIHbmgX<)zkDEmK8y5u^|ayzTuTd)V8&KEML!l5rpv&ih5HCyu#dkGE* z+=ma2%C+*l?=qLlZpqI~Fi(Ky(~O+&MPqjw=2|x=L4iUf02D_Y%Gh1H`e(!IH{Wsx z>Nm5C#9D&SDrz5c)6Yvm9|{cFR1W4h*a50u)B{(EJD8+D4USJ^KkI?}D zTDGt*We0T$x%mDM-6&muI@MPod13H1A`=DDH!@p*HHM8RVHVml>~F>D66DWHaLx-IfW@ zHDjPG^)KZYtmp|_R*Ary0X(2=kwtVcHw=l{s@U8WlOjRoO=Xcy7x-Dxl5zKzV-jFo z$O@8Mm#gZyByIc#%8D&NK=7o>?nVXeHA&}Mj`2VV8-$Ul6_<3Si2Qw1yEfRct@a_g zWoW(2L)@&L=X*}hR#99KY&v%-g#&D6e=FB4OeF>9@`pvklrbka8Vg@g0LtL(e`>~R z_=-ZWRw0M;PHho3CXs29JkJl>ggbSf2mR(*@Tp5SgA$}&+=OR)Mfni^xCY6bxBt`u z;eJl#Ix+xaPR;aDWVCUqBDOibEzL}IL6H*R8HH6g)Xs<_nLW;CNPX2y6`Q?b|l z)EvfC?P@h*`GXZ9e!O<%@kUPrk!DK7k;wx7dYXjBS||4^8R8jRa0AC(5(Vivj1cEC zOwnZMNn&uaue+^J&^TLQ5V3RY4_8O!M$iGbKY)F;iMwkr>MKLKZG(-yHb>ENuo3mw zY#AE|_Xw*rzZ{OK_1r{u-nD%>8OuprEDk=Ho5bG+`C~=^ zn8O^jg>kJdyR6sm00F1YC9=N5*<1}5CH-3ljq;#@rFF$>4_aR4)W z3WCEM^V0xATg?x-x@3JOnfyHvnW z4hcVi+O)*rh0+`3hxmUv)j9mZ5|8V&sK#4v%cPD8tTR z1Nd$|mm;tsGAn~;KDrffEfS#Xj5iK)iE@)hWa3b`bIiW@A_{WaEJ9Xd%h(cx#PSsW znAMtj$YgoQ9DW_5RWMH$}PQ!P2gp*5tv*k?lmj&$*^g=NM^FNHj zrQ4II2ZijQ@%29f%D9Imu8xZ(6>i zKjnoh7iUUlL6Z7Sw%n;55JeU`5)yu6V#qz_Xv5gA#w%V&HdM{=7M6}*A#?XY(>tx6iS1$YE@UTq%UAC(i68i?siDN*UF^&3^L+6wH8$|N_E zb?A5O*hXyX^?J})fI;YXHdRi%Du~=Y3?p}einDT?YiUyee5jUF_zMqLVdE92{xv47 zSz7nC7LZ8ydjr^P-#V`(D;iM~5-^k-0@%*yk$ZsGG3}{B{e*R)7QW~h;d_qaz7f>U z7n^~dkHYS5l&tEy=wXFfJA(-+Y=F7R)?0Zdf_g+aN_y7uR?4mC&T>rQ5*CcFobPxQ z9sRo2Hig%xIeUzWo2^%56Qm8|(~g)KV^wH?--^?itX*W!>V@vYvgV2XsmyP!9lk&H z#wmPAH{{gL+M)bI?}U9lxsR!WZ=@%vHH{g%-)-RL?ZXM6W@%{inA%M{ zLnhVUyl22c7EWsPCotxzjI$t;&BBv^*+cDKsQYi zK^NL&2gf9g-_BnnPBHFlp*4cXbf;6S5`wTu!XMO>TyGO0k8#;T8_|DqjGz(>Ww&O~ z&>C7qj9Fry(qj>Gn12d*i&XrmA=1t&N#%nbd7T-;FX_Tl{&RG#0@=STDrl3#Z)@O6 z10rl(0nilXo-^Vdt@Jt;;HNSKN{uXD0CG8eVNEYZ>9p`=C0h)V%KQnH<5JMH-?)J2pB>&jc`5YC9k=LW`} z1|3`?ouTFs{@chEq-lNS@Ae$77Eh%c_O*j#&d?6ePHn9Cet3_H-JmWLWRd3TO{iK; z0|sdAoljQF-S|Lg<*3P=fL@*1|9U8`E8vDW*1krs=3>4b$^Q*kT2^MsoC|%p1E45N zHE-Cs=xCDV(%+c_0AdKUZM}?m2BnUF(f|MCMhx|_>=o6$I)@0au5K3dT8T=-Qa3ap zZ$69v7#ikPNazNZ8OZP!1hc(&qktu`vrm)yoEDC+k#CLexdMz?{!X`yKu^Fc?D6&sjpr9B%$&h{00C7?k zx6?weuZ60=_XLy&Kwd*ZxVF}KY0+QNOq!YAkrM?S;)e9^Y>Es_CYGWXZVtYBScEv? zV1{V|D{WJe4qMYcA#ws_?)&jbLP^BYQ`&JtTwLvcqBBtStTT9^31!b8*ho?TjCUNk znT)C5!`b?V&30VhYs;Zr(7sye%`x@o-^@8ke6D3KJ^wI@vS~&v z`sZ<&e>2>HX&+=0b02iholh?ExEO=(*^B_15yTI0z#BuX8b6B}3Mp2Y?tW|xqG#U{ zLbH|~%`A=gz#s5OX>1zhdjigle=$)Mv6ojX$q%yvHnWDh)vrAoo?V!!j+cYAxc^-p znDi+DbO>hHCQ@G`$_-6zL2-yj1Fo91P!C*OJ2*UA%Vc7b@F6_S9L+r6E>y)7^bog{8({gbTZ2N8j{rAeAJ4TpHA!*`~*&SOYlpcpV+D zAUXCiUbtE$F?p_@BOSV@z|aCDb!mf^F1*k=$b7rU{6l$o@he+KoxD-b-e|TMk^yU= zq?8Sl!p;S7Ky95xW$Xd^p`;RYoF>#S!$d?6pcifG^}3#0z$+>S zYMkv!zL~JaF9n*_?6hh{mpr|s$=5gzw9ZG%4}G`O)2n-Xz$U{tAsW?mIao17d76k2 zzzI$2=C0+nz$^6rd~`27f{r7=Bhk!6kg~H<00#h#0I43J?QzdK@AXUSycxw5jbm$= za+$=v*UmzdYT`mc?3rtV!m&Vw3L!OSN@yBU3>Co!;?;=WC}^xfI#eksFv$?GLk;9A z6$IxMhKVLkh!mDaapWSb)FPdM1Y0_}tJb6lITEBr#`UyRFXNs`MYP%f;c}{K|KO$R zW%2OP81FlQR#(8-yH?0$=rYY{!)JGR_!~v*5|=LJ2~Z<&z=4Nk)p6AV0FCtmQFjtV zkWPpa>vJ@a5e1QkgJoecS^{^8D@1I72pcJ)Ht7f|L2#F!075Vg0|0OU009pHpGG!` ze+4^z<|IiT*_EVt&=A4q9zn2FoG=GooqukSu;$0`HLQe5h4E!kt3yIu13Kz?9A@Jl zI@;xrvD)2jtD=@;k&#a0hUK$aSb5%;BIeKLSX{i=xx|2u9#o8mM?Qic;obwkt7O=^ojgM|BH(s6`j)u za4aoJa!4<=lnd!o3aU4Q>wulfh{Oh+6(rn8Wa{1umX;=3^;5kPMS51_ys8bHe6zj8 zxfdmR_O8dZB@D=%W}Iq(qD?lSn*gYIrMfWAaW)K{=1b+#M6PuZt#pMa%qrwE#encc zmP#CKp)VmC)isfvIReofC1zlv)!Y&_kq;-tVR3sf$T0Ny~Xq_E@?E-o@ED{{b4C_=3I19%qsK(2%pA61m$aQZL@&Wr~D z00l(>pGPuDe+3u(UuWyIDaE+4#Y3hA=z#|sgYgD)HUY$#N2aQS6U^fd>`AkRo+~Q1 z!Vaxn!AG-mRtjLiFO*j`Kl3-pATBW5yHfu=h zBQ`~$16B4@R_|Fc6KE|1k%t&`O~oJ9-8rsx8yG&an=ypb`HeD#Fi9T*)k=gl4Q!@6 zWKXBttv@u9!(hTvtRf=kCucNZIt6p83-q~nETTnzA*ST*sgRRbJD@_gw=spCD@TCH88=3-{l-5}!%Yc!t*<%cji`en&yuyCne_wNzhBcOU54 zBY?lI-m@F~xu%R*!|O>U(|>ROlTFTmkW^ich}%T}c36R>=SHIR6W}QkE}^o_D_dW{eUPzXv>U-H;YTa$<~ za-s^Jg#|@VpVxWmWQ2K_HvjWWd2W9{=w|{(X$}znD1ZykHRAmG-m7-ba8%fAkEh7Z4(LkaWZp+-|BFA3+Rr7V%V-mAmbRw? zPIq4z2?-02HkzE;?6;1g;zlU++6u$3%@?1UGZ{6q{g}Bx`})HhcU7Q*1)YJxD=^Vf3F0%*jbw!U-3*s_ z^*a%8w3<Mp2&CPcK-2{cq@z-Eq3lsyScB>_ zw~n|JK{759FOWlXKAC$clkH(`JBi(Ya1FU*)Vtp(PmAqKS09cir`VrSkH&j(bwpOv zAsW>+m7aG2E?OhB1{Y+fS0=T327YVJ>ap^8E0t}_#5L-#?XC1lNmJ*pyQ^kNvV3(c zEpjj|?m+YyfllU_uj{loeW9H-p*SR2LTZGFH-u4O2wgEa0^;QG1j5a57Zx)_BV`wG zf^i`P>@E|+ihw6_;2D(ErYaz41aK{eQ~_dL)7o9$fePU~%Y@cxa*1;ryQq{&D+VpF z8|gd6EM@lPUkCyl8QFd8n18R}O`A%dv6dZN?Hi(*c@autTER3{OvYJ4$f{a$SRo`w zU>XOiq6=6>7?IcmNTmUMp(l7E2VhljxXy+ z(GCCr6}v&3Nu|^w`7)Ra<^KQy%xJ4>X#h+8i9li-C^#psKQaK`QFg9umY!F-MU)=W z+4-So;F_>&+{?*7m|b{PL;%{y_s= zPfDd8CMq!hC+aPY``Wb~5AB<+Grl+k=TVE`M*^omyL63nHt*Yg>gb0sqeA+}W5&Z8 z!2ehOJjJe;xF-3^|NQC#o_MX933PZ+pZ(c&_?%nutWov7oC%82#|RO6lg-WT?wq;0 zpV>7iZ$G-5ozLA|7|LJRI)JKS8(b6xbZelN3i^@kJMJm5pTO0#?AD-|vv>jlP}S%t zS-H<+xfhGrL_sYQgv@R+&)gf^J_r-)Usvy~!I2s&g}>_V?!b~~{aaj(A6)il09C6R zAgxYT8%W=@kNK}q3XNb)CPCvoo%mJ! zU9ye=Aat%_?tHS)Sl)tL1bf%!@h6ZH{5cr16|5Nm2~tY>btB2?7q4x_Ly(f5ub0xv zAAXh+j{`3%7h*+GSN+f|;PU@##pf(kXu#=EF(h>ovM#<6**YZOA6NUf9Zy;AhBHoe zku+B$FOLC9U3I2D;0Tdd8aJuo9A=&6$}9Gijt`z%ss=!ip}EE+nTIOG>fuhfumhE` zQ;Yvq*v!vYv0O9rO9qg1m1o#Ky=T&aTm+i{92p-q3*mb}jS!3Q`hBG82k z6a&E4#ycSddKnU`<8bEdNEcG=txz|>7$v`#GjYa2y>bs_t&f#CBj^}M2ym>sadebJ zO9QqV!vaWrPmHpXHg{>RM})SyX*J*&YAdL<>`^V@vuV;n8~l*@W|AK8FGfiA?)Io4 z{?Qz?P8Bd(lI~EBk7_1qOADfzhEVV}haRX{Vmm@3zIxh@1UjQTqh|V@bd?El3lZ9= z^5;%sg)ZvyRCX$F_&eVfXRxYhCn+Bn{}F|VjHo5(ano)JP0D~6ir3>YV0xwic-lK6Yo)2Wu{ ze6Lp{4t%J<|FCmgtvmB?lqVXDRPTJ5Rmu@R`5}H^`aY_!T`QLP$QOzDP+IIKjuog^ zvdE9dI9LXaP^TW)VIV0fr|`XYR2$=xxhc`kA$plFlX|HEd`AW5Vec&1Rp;~i*untk z;v4EWp+**?hDkbupE5K4LOZGOI>3Fk$4CkCVVnXc@t`4d;VNx(k8d_A^Zpqo6u4c3 z43nKmyy29Kj7GM{qwA?++}p{C@CnkXWf#8n9XGmZTy~6^Krmt5)xN5_NBEL_ z^oALaZbO=i`oF#L8ZOqQ2qTZ4<)@(~2xhMq1?<^5=Hge^dgl?9Zpp~4L?8BtVOht5P4*ix>DgkPFdU1zQ3lU z4wd90;^|W1vg7QGc<4FBB8%;Sz6b@Wwl48r6(tYg81Nq-;J3SVlY)%+UqGP0HeBRI#Q0WWg72;^D6|P}nJ6q{b<-331U}yf zJw#Z0(a*{D8bn;)GSNO!ft1e+Z>LB?FM5X+_N(fHx&8~#S2M8?Ql&a4U$`RfjL@`>GlN@*l4_|FxsQez8oD;bY(a8tI zZE5Nm7uCQY&!qh2ZRS0FZ>{0=0Gbo%Wue-UqVe#Ps9$2Z1(Yh)=y2<8?**!$6RO}N zISf*%sG%>|#1gZMSkbf0q55MbA$I6S|$jsC?q_}%xLP`fs zr?VQ{-i6omQx7oLM1sHT<6`_9>Mlt<@<2=+~wUiP?SCke)L zM;zyD7^b80EnVKzt80dFHRu4PV>tQxT9;}>YZLTPL$n7P^;ixp5nR1Xn5aNs2gkHK=g*1)e(!=7$@gld zd8-&m?9=UQ{Edf&^qx=Ce%<3W-9JD37sB=X;v*{&ScMH0NZazH6c((3l}wnzb2?c< zus6Ox4eSDrE;;uI!R$l=lvC{o1~5-8B_Vf|y+HwKs+5ML2tOuRow$7)=MpoC>Q-b> z>LlcxD5J0EmV6ikfGvgM0U^z*)Yf`xK_OW8KV!(7lp!#~zjO12Q95-vAM#qagbohByzFv9R8B*F%LL4qCil$x}@b=3_$7)b43azaL z{8(*oH_ypLksEdg;+_iI3_S%HrNPm zl{0klELZa5X41x36lWbGyX?0kf6t=;whyWm_!U~KWjnKNh=TyT2L@P^Wnd`0T(J`o zs)-z+0W3r?e_3OO-K<}Nl^LVCGs4f8t5QIK0$u2TB2 zzFSai`biM7G^OoiP&se1Tgw?7h?DH-mxoLMA?iSu)nyFmBc0?7VvNjdN(Evt8>RKvg@#s+djY= z=0_Ii6~(!N^$gP2BM=#~av9JTOiqi^G7P1PTOPP9u7j^^vLjv99IfK7^aP2q++M@= z!s*dtjf*;Qzq;VMuu+Wqx0l^~JDiK#2@x=WkU~L9w7d~3a_5wZWR^u|&XFf-z1nEd zoeXC5J9)&dQH`&P0zi2HqLeTXVXbqDya>oP2b@9?JBsNI7q=a>bcAbtLEgPa@bdIe zvI0UgVnjIRtRMsH`a$$+7j8R8lDY9079Z+Hsl7GE8knBdot$z^eW5vUjZ^{L)RpO& ztFoQ-=BdIAmTY?y^(>TsCZN$iZrKQLDA56jOH=GP5CPCccJSzMH-*GT{ERzh5{Rlu`*f8yzWs_ZZmwbxQ7=}Y1iT=+NS01&3{wL-*aq$5KA)3{u1_O{c+AE@Veb>yDD2o7 z$-uhty)SfB92CGB&A}>&TDNC8rLnPix_xOmr;>bGqv7AcO8wx2K0doociq)r&Yv}c z1X7*G+^r9TxMH|vo)_49&9T9l)T$~q@^1xC(VIn47lrcv@qxayQMxoz65O_42t9LT z>_IkJN#h&R({Oq>k&9sO8TMY|-VJQ|EyY_1panllt=erqR<~Yvh#^Gi^eEnci3VtkBxufh_cYtsv?ghZIv&yS{nBXo{^(Nig3$rA&LZ>2lVS z_>?0aGv|u*4>JU&OwUb4$EHFv~)XA9=Ji{4Th3`i7jU#K;a)Zoo54HlU1z=yBu#F0tHoVvd(#_(*7>0CE0Ae zq0($@D=+Y>b>q9O5OKulfY-p%9}@Ex-e}Iiv(n;e0niVa+ULuUDef=Qlq5AMsdp9q z9q|@zXm!$hQf)MbgFs_>ZerpdoGrc!yu&Yx(Em)gW8r_?JV_cz1dycgwqmo-;w?qY zIm4{q!ZGYsRi(g!k7CeSQu5RqUJ?LP!yhD665$QOtQliFAmDlD@#Rg)opgit!7Og4 zPAQ1=tfAIeW@71=F84W&faEvBKoD&LDgrDmAMa7X5rD1_iYrm&#POorXAe?Bfjh9jBLY@10ZvQ#OhPNpOT(vdjEU5WQ?sQ*$X$>WWVh*#UVqPWjyGBz zP_O~xUJS`%mwxA3yj*TbGb*UBAKg8yzOjA}x)=2IvJ%%0}WwAS#WlE_uWm3l9t zVEA$gp?HR7bn`2OUO*4YAdtZqXrk|awN}m)>!0?c7!W2jws(fc`f497iOQW&Apz>Z zB3a1`07zdgYpg-8psxlLKbM^7jVISi30A&TB;=aW+aBa$KbG(fHkS?5*V>-@TB`#) zzS4#pEp7LFZTRjx74Yfpq{=6WE^{CLjWcrrd^zLIeQ&TixG5DnWmankI# zb^_3vN`v4ots{LI7F`B$M&b9)DPj)G`T>0v5aj_gUQMbt3DUuOHo;(7_du=qc!R$IK36o_|S>uRYi3Qj>+u7w#gvHWGMgpJet35 z_qw`%o?E~`#UcjVCcAUNGdU;CaX;Cgqv~_^&}r9 zp2X-~YeI&D`)_!()uP%?bPfuFih_|?C_LtErabi*bf8-K_AD^GwVrY5I4k~-L8N(7 z2<~4{j`O&+mM`~aQ|fqHJ|9g9JYT>?Mf-DOLhqpj@CSsJb6$Py0A z1szHfG^J9SQr6W;_A2=lON&$oD@)rC^uu>xpl&WgHUg~aSh*4LSqSbzAMKQFn#GjD zOh30#Gqoi$R|n+ZsFO%;l3QYIkbYpnR)B6F=XI9Kjw9Z5b7O7n-bdlo1b9zeC=)`FPWDtJ4P=#YTKnSH ze?f~jL~A}4G=rCuh!)Tk#3l0!{o4f9FG!({<#49k;J+Un+Cb;e+=Ufinf%T6 zVG;k6F_c63m@*M`(tS8@=L2fp5vID&-vLgMR%fwyWg5t3G*_x!u@HS% z$1l{Sp|?(gA2EKpQ%g5^JIm@YKA%il5Gg45cb{_dD$wlu#|HJ`p0&%HWpI&TE3xAT zdysAjc+^&T)ZD`MPa|YO;6oEA^buLsyjL%$_LOkOv>o6b+AaZLQK~1(gCqk=EO}PL z{s~y<*g~2lLia8Yf8*395bXn_sX?l&hmvn_L}ofG6#H$k!0b}h-3TZ3c39Q5WDb{m zAW~30sJi4(#9apDDZ;G;$O~o^mEh_itEW8jD zWM-1xUve%(_|Gevpy(H9?_k26h)l)Mtx8y z#hyxSPf@l8#fUBng&(t0y7qLVjGG7QTxE@?I2<5{dODO8w6dzfR>*u(f2rj7uU?kabE&?#UCn2m znr-Qp{CUTV@_`{5)h&^bL}DP$fEhR{;H7Sv=C0{$oK0Qy3Vd`OIU>Zm=`AU&r7ry} zk{b*mUN-@?jvEXvJ8|wWt^^uDU+cwRS_HlGVBorh}ak6;w*wC@_|0! z2np4Ql`N>L3nmi4a={P^>jA`e;7vrNjHg+J=`8Hyvp@+_OekWUDQT;_yS@MdhHoQx zRF_rpv=rFM6J`84TDIKrzKZzM4#TQjZ#peVdQLB(rn;Agj3^}wXiiRvv4U`Sp*l$@ zma3;+35lj#mQ2ttXACL^aUzc6j}V+d*^zCaPN8LyY!?Io8deF=AW4ig15Qvx-U*;I z#=44+rUkgrbc?v9mB9c3zyJUY0U@7gl1esT14QtrcPufZWyA5zxsz-ZaPLW;QP|it zJND*bBkFMqHJBk#xLGI@;0_c&OHtnTcnfB@+vBk-dTY?f2S&QWS6?i-xK!r>EulAf zbIMMB?=|US$~jRm4ur{2-Nef?=V3u$6l9!*FbXG&z39U;lj9IwyhTa5xOIIzv2;S+ z$wncI$%%AHTG$J-n%3s)!eAcz_s&%c8^jeyL#|2|HISARf3Q&HUH+?n%0Kq<>J|St zBj3xD(oEOr&Kanw<&%I~WwsfgND0K<+7uTV6z@tQKPUzttYL0MUfeXDi@ILROOuV# ziMM=-HS3prr(%rSQO0V}P(90IGYSP6$|rPlo+&2?&059p=t)(h&10RD_2yWDsQQtd z+0bi+SL0bKGa;W*$@?Q};0KJ|zyoH}#xRC2BGA)b)pcRU1HOSggMZssSHzFchqK~p z4dE;ctKIhKCL9R=wv_rmt03RuZA(%dRF=7h^>;4r`xW5PPvcR%SwIzemh!{-C|*Zh z7mKCzLBvCk?aSJ8HmC;F(sL4^8+MAT)R~S%p|195=G!`v&z)7S-Vtt8-IdMPH9}>R zC@9m@3&k^IGDwT$Wrz4?(1hRi#dwj?DS&~45NV5hcsFcMjKdxE}RzaVH ztumiL>Za@lfZJY1u@UgDQU!agwqf>I`BItfE(b1=4>-gHW6!Wfe-c;#K2VW z@Zn_wMCfQW-pKd=7@O^ptz+jc!abgBAnY5wxA$})6C`V5QoJoxaIV@P(;dzE7 zcbb@zWf=4W3>MD}nxswk;w|old-1wL{24+A35F<@o)i2Ak7xbjcGTYxu>DoBEVhvJ zZCMdhPDXWIOs6p`X*KNcGjbk+2*JHO)J*39e?7y})!hvue1){k@b9RZAoC0h=IuXW zckaA;KN!QE7{2)MA4DAm_r(r-f-ILqcGxWrLH(SuNpNNwkV8Y4dvfU(CUXa!ed^FL z=Ls!zFq+5ITND|ET_kn-!_o|%E9FouDUm0dbj!h*RlquxHGtmx3UbBqIAFm^yt}R< z6(>4xT5HnyU3WEa-Rga;gPb6F=eeD%q$1mrcTwnvksugr2#uAPcn$?JEz%S*Z|F8+{Q%p8L} z)Mq(~dANfsA*M-xxSAv|++8_yj=$^hu7g~ees2Gi`k3<{3Ridv815IkpCl;Je%D7* zOOpm^6@a^MRK>cTKI?>=Lw;|&I#?v})K0hGiIy~#K=f&r$gX@AGCFDx3TD5>9YH4o zf+F60tfMVhY0m6)IYE<46a3n)0(^W2GKVhI^=-sATv#k*brtrWBHV-J#XgHdx(fH$ zBJ0(>lre1q9pE@jGh6Dw-`}ptwE+x-1(Z2W==Dh(Im@s{p;cwI+|hh-k01H+LmHb+ z2Bu!y;ep5|K@I>r5kbr^wKAJ`J!#fWza;ZVdRc&v#t}D&3Xo}?8J4jV_p;_W{vs67 zz#ClV1Ra)0nnfFCr&a4Oyv`IwUqTRIyh-0rH@BTHq;J zS(i_$-7{F!Qqb?S8azeN28{0;<}0tYkFn3ApK14=CcrMRhBtS`Q+R~g<`L*{2&_PVh@!p#eNAD#jS8Tq(!yf_JsmED%R?apZ}klzrO*5<8VNILQtdAW1EOxeasZ59HvsyTjo1vcjj(3B3p8VF32dR z(}&7JbAWM}(MCbg73;8Te6gO~!nJ{UV?S-QSh-qXHe~Uj=>oBm zN}l}`iXyF+B@jzqV5y)uc*wPMqm5xz;S9T(JrH;~5ehg6&*0)f2{^9g2pbrhcim7_ zzG5(@MocE|e;LeztJF?GiS58S8t#R*;zhh{u1!o8{2kMPEXmo=Svd4G!^vHss#{Jx zM*IG)cM^#o+aO)Y!;U6oxsi1sK8X|{TRfQ^7AdA~P41)>svKh4RR9-+Gg zX-%To049WV(5C_ zu~N2W&@2>2Kz7!K;-vjeVWPl&GZ;8|*_+1NnYc(Jui#S7Bx;6yo3q5u{v6}d zbNh6JGtmsQO(4-q6v=meV034Lc)~35&P+OT8_+abB8}P*Dint8c_z4y27Tw00C+Yy zZetn*s|G$*6-u4hN**DV zGMF=i4}L=Q3?mKi;}FX8Oh)qzvu-FI%#76Enl=3E+qZ5+hPuy*Xgj*7Ve}Jcu{Ggu z(m)4$*c&!+UlzwUl%_W0oxUx*DLB*;;hLbWK~@VYzom!c!hhRtO;b=jEZA-1h|!2+ zpl7i038exRpz*KeK==e{-rx^+0;CGa76dUvxx|_7JP0CN6>H&QJM{?pi}cWBR@&|CoimaPta*oJQA!B=uI0mMVzDxk->|Zdv_gUly|=a!bwL+kHt*TgZ(u zE=-1x``w4oh<6iIR%*HAcvcCX@Us@)Tw4T)j*>9BS;sd)Q7E|j2{5EBd^8)n3|<7P z&XkeLsehqt;d`|kI*;EuKQn4!J&zLS?yp3y`d^;ir-`{O#m4vLkY2`Y`aLB8ffut~ z!!Qih?v?{fICOC3s2OdjLr4+JV5(p8q%_M1)=;Y)qsN3PSWpInQ2-{Q7bp`7v~5+P797B|iW@6HYyb;64TxTe zHFH;T!JgHz!Q1sPFL@U%wpWq)tIlr_c~M_ycU;e9FNM?1ATnvCgxG_z9RZU27zB{F z4^`(U9E+y8wGmj6p-Us`mSL1NDFH|Z`hx$y1BgT@U24r?RBQ#Q?@OTtVAKM#pj4=Ykj%Xrs{3z{SC{4u@!Vu1i%3~v(GYX^ zOhgH@LLK}r+>o1i%2I!+D<~Q*y*kmAMPMndYzyBVO}_YJc9qvAeRhmlLNBlN4U)R5 z|3>eeYl<36!A+v|NJ*zRZT9tNVAR@Pz#0zdP>(32P3XG||1wAz3(mp>wl6&Un=5Du z*d<@BH% zYAt)+!AwMn*De&}KZi|B0KKH;aee+bRUtnl+95B&#KTj#*@X5AcU`QF70aV%#97Eo zJrxSxh)R3*>Ijb=`owM!SYlZvE4^w-usqflbD3b{rrfUtIIn7f)kRW(_V%S2K>Jz- zeBJ@MAD)ULVVkVwicxvdg-fc;b4Dr%Sb3X1al5{dc*`udQBR@K$Sdr`fHLV&85E(T zi7_Lr6)U5wu*P(dK_J9_Dre}di?7i2tDw$p2P)N4D!(RoJ!WA7k*<-GF+cQRS?XKK zHz{1$#*#TazW;!(%*SRY^kq)|qjT=gww%hyFl-_*qU(Z&Kk{s1)JF}$(WFdqE-Xhd z-84n&qyMFGNa=uM7it!vNsCK}fM}bQC2)y+70&RiwnunJEPO40pvFTWa2vcmF??&$ zsz6tZm4$ICPa4!d+)8zHbj}K@90n@ArM|AynpA1IJ}{^O97xIidPiUrl~GU2TvwD+ zy09vys$U{CMSURcGq0y$=!Al&(Yn5gG0~N*z%FTinXqEO8`ry;zsO@4WBb&XH zK<_He)AlVAu*KzF<_j)hQ%M4sG2Ok#k?;eja^~ze9jvj%u7~0~89LU8b%;7ewuMv!$^YG&Oh(9P4oGPGFAuJ~L z^_!O3!Me`bbu{dux7kzBK4wsZKLi{!Z9l4+{RKc}`28n`zzzcOU|R@h3oof!1#TZI z)M%#!$o&8JkT{oFTf=h10#b!r^CTa1>@~9Xv!50+JJt;AV6_48kXZx0Up2PzJ&PUWue6NP#xEBhLV7QCKOdK#Wb``XxjrsHqiS zqh~Ykfe|o1{lB4x02}}S1up@gi84ul1Zi|YyVbFO2pMGTd2vk)SG_a1ugz4g+U-E% z;MkWm;hQ#5j4(w>hzNyT6U-`|_-W~8Tys`|^M3m4)ZX>i6KiK~UO>v?p$x|=?6@Qa z?7>CTY~e)5L9>=#LFwY0ws@k^DY~i8`w=3r(Np{mA;Yh z`xUELv9%j;#R)`BGkkhL;$1;SQ*~i z6&F*HN>*Zpm+N=_!aM_I`$fxSd2ZRlwYpqwxlJ^PpVq~CUiq9F#ypfw!)hD1AK%@m zaS_shO;UM!RN=;C8#jAux3{tb7Cq+S^9deHSV8=M@fNnu`Ex5rerJ972)Cq)di1wOt*T7H_+&gR?4`ZoCceX$E1xww7Lc%JkM+;YN=RX+ z4gk#iCLba8uN0$e8z9|`EvVUD!esFekPu54+*lJ{BAE|3H(6Qa@6slm(7f2$N$5yF-%33!xPpuX zA~8)jNAE{(^*6y1Q9qvPtN2|v}6aCgCz?1R1A>F6dp)}9hW@8beofp57oJt%A zsltai%5eQduIC*pwy6+iI-hc|s1^!KzrH(q7}Qp^d|@*OTvL=PME5L3c4*{^;~4)R zrWtC>Fw91gS9+>6bp?LK&IemnEUhKwA;)J*!RR>h2d~uhcFkE~S zg&g$?NfW(&3&Zc)K!ZdFHb?4ZIk7LV3vxx>v?}M2r`_CW-@oYfn2>C6d`6wm#V0F{ zuH7LzzQ-H4U#+_UnA$uT?jsEdh!c+Go&TNZPQW>k0Leo%*aC+n1s$T%n!ama@!O#H z#@1(X$Ral&*0lo+chNPP9_YzjWm2BkFAs&pw1ssP}r~fm)J4l-UlGOoKXnjPUfvrlzyvU$Q zOsTw*A~U^p{Oq#zE2+V5X!G*BjM4NFEI_}v)rVGC_hlpuY00@U+@(^T?^@?AQ%|zr z#GZb*kHy%WS4%lHjOVWYuOAK6v5S}?s+^iSvKHpcT4{`swP(P>)}KzalENX(&A}}u z!$hcyStF~KEah~mBV^6ZtOQcs#vzy@FUQ`^sBYUrcO2Ne&scXbIT}|>PCwUn;7Q0V zV2QeH^A_~KOSrA_F}1QkJGq?%LU5Ybf5m{=T$yWF@=RWGA5E^U)|lBxk9C{fVl$_*;m<>(J% zG(SXzaNJC!bK0wsBFr<9d=KQ<4P$oxFl*`LTThQ9G^Pp~*!U?9UEbA|dzgN`nKo|krbuQn+O>^;6?~#(nhpDB2DVhp! z6d0j*2C<$Z!ckmlQV0IMO3Ra^}I~br(*^!e0~oj%P|}ojM3e2fs2{ z7rJcPkF{wVguAL~%f1;RH&Wt?CL* zWw2NvcO}Vt;BbKB`Vy*J<% zigxG!7`ziilL{^f(tMiyNvNDFAr*yWWQ(tHxQ?v{x&;KHUcADn9Jm~eyG95Iufe=1 zU?L=GfA;JB0l^4wX*g#J9ApOUFKYdh8X&-?Q=o={ot%$a7r&OX(!D0sV4x%)K{poX z@M#H5kAzp5H^2*{gCkwM=CznOIzU0_;mR}uP}pmFhzl=n2}Ri%6Aj%s`R)VvE7^=N z>zd?3Nakx%k~&V4w;dNpZ3nlSrsPf2-JxqEi3)4 zoJCUl@>o{i!4XA#dAFQoJ}Go@;?<0N7pQnKU2v!x9vmaZF2u7{x5n04N~a8VJ=uR# z=4myjlYnbLsO6<7N>m=0FCBl}9Bdjy5wRai&l2n{TU?<;2q5 zRm~a+LwC8X)+Ag68~3bc1yk>O7BeSdT~FN_7S6~SFoiSyC(TDLNL5yc6W=15`c9jg@)4cqXe@mScD2FQy|G=jI4 zKGEHOtd^}vmFX?L$Ultr8Igoifsy>NN#7>9QwEM}D{B;Xs!eo~0)lUf&VCluo^Y^y zGXe9_`t5SULqpl!>1o(smH)lj<&<~*_lyj=zybYXf97&6vM@km~f6}UlH+$j9EbzlS| z0;x6ECT|Vo=Ajp}Z$cS(ab6}Q?R zieOw^U{gVV(A`Slhpt#p!Tri7ypi4$x;Pn<^DRF@Sgi15Bu)C4&;!x%pP}=|)OCO( zSN!G7`TOUIQ2bE5ANdsn4!Bp-&9|TN+qyMv6+P-i;T;lzHIBjflfUKObJQ+B1mo~;IPJV0eL0`-~D7RoY+uYyZ)MYf2y z&r_y~7?5g^v49szR$mc()t|6SwuSD8;)#x;J6h-~*>qhsz`C;@!MW9f#y7j{2<^D2 zuI(~&abbdWrv7%URtgVZTsniPlOT%!+)%parPgNA%U!ku|? zI^EfI^`jA><~=CLY<|>eIL@DR2hlTav)oZmUCv$CGC_16B7vfFTwFhH`PVlot|8)i z?WuqK7~{gVIS2Yn)H8UTSZ9Y@_x{r$?Hh~^Dhj%G^W}2n91LWX$u!PJJfK!px#!8> z4VMs$&K8G^0%hiVGUnzGb zqW}wO2eu(($W(;`(2C$>FX1t1S!1UwwYbRG58tPr}|dG~1Os?;}(^-4#-EO7$Qjze>vJBb|RcE33sT-Z~3nlW5Fz+J>-?qY7)|e-+UQjSP(=uk=O~j`*J}V*6U`B5Re`CSsUxj86^5KDKLw&Y8(OHR3MR+ON_OO1#{4)=SD%ro;; z<#XOO*5otJZzx#xC#-)BA>Q$}iEGU=fP&Ss!cVKO4Gx#4&l_Q6W@7JvVh3Po*;S_( zM#Hu`RSAUrg#1V{2)--VPD!}y=HoB=>I&2wGY}!nH1XL@DH8^Bx09b#1Ga72hb~yU zu5R<=sx;fB(jxqrE>gygMBJk7fi*^tg^Z(WB*f&A8TgOe?zsiupTe80A-7zGHE+K9 ztbY3&ig#&0ty~vsZHLFn+Yq5ZE;cBJ%Q{_CpwZ}A@RRr3UdP&(0LGh8v=b%^(}ou2 zZA7)8Wpd9`uSTfxP;$|jCC1ZoU>EuTD$cDlh2~W^xnrxK>j8(*(AF-7&>b2a`O}S} zB6)didmR&@APOf}o0G5Z?pujS@NG;?$~TSnHn_9&0JW!ixVq}~l35*L1r44!8Cn=z z@D3w74N(8nwH8~?Ix0Vl`^>ttF!3PEKe?$1?NC zW*~F^y1cVn?zBL=+S;Z0^xO?Bo_?mY-!EAEajFFipD_X!tvw~r^A!;Olq1% z0s^;Y#W`j0zsD1Cl{+}(2#@k;y-u-x`eR@0VB3}My8)lUc9yYD;*iqZppSR~US#uK zsp*s;Cg}VJ zXdCvMu?|x(|4wNvn@?S#iAVXZ#mXM!^w_~zN-OLbSBg%!RJTuX2}TPuKeEFI{HD&D z;_+Hy{?vGn(U|mk3j(EAT@gBlJdh!e;}9=(n$V|$B|BSVQUJ!!o;Mo3r# zu4sUEW^^Dpf&|DYy7V-hbz3z%<(_rP@47xl$ zc#vDIdl(g4+m8{2s@6{J;qHC0I8uPr(c0vF_@u}sSc>(XsJrlOnp=ZRoOyJcpU=YA zvLHE3;F+OPmtvU;0@}}}(7p8%FQc&ynusx|Y;z#s-zDGxsf7S_$EY9kX`-wGOwg~X z|43T{xiKxkcJJE>7CAFUkZSi=H-M%+HhV)3tpB8OMXDce2dQ(1FaPA=YY-uQ-rnec z9?UkO1;k($GSNwuz?eFNrJRb6VVsPVVxv)OZ`epSH`GNF~* zrFz^-5UuuY$}}74@R#NKE~EaiklhbK%}H-epJX=W`at(2uinQt{m!y_8ZoyzPZoSPe}w#7nww&L zN>dpwqR9u@RFYxDhQXqnfh(%=t~JP3vg9}9jwGE0zYaGHKZA=fv-w(lXr@PV7Bo8u8mWVt(rs zQ}nLC5nv8A9^soT%45AiK#+P}6=v-#DL)Jte$d#PxdBHhvI+>Mr=;Y&Z8)7`6%EK6 zCmr65$4xrjpcDbHrq5xoe-?LYj%lofFMtX0r(FGXXM%H|2zukh+!)eqLH-%W44sV!NReU}jZy z*Qc+fQa!DGIjHi_n?5%n%vINAU7u%~S&{JB8}}BdLJ0W=<2Qb+KNK(Snb6$?U8wY} zBWoE(@$#a{|J!TT>A0}O6mtq{#8uN;H>>f`k~roZ&L%OV+B|F}Ti3@=N~b>RU7nZk55w&mm< zj6}X2?L$6XlIQ+u3g{P~Y|TS&Vtr543&ejve z^jHOLv8gLz{>b&peM1&%yk<9qsF@#G>$V&E_3QAYmn)sH%P+8qYkTe`McIO403S2_x-A44It1<`Z0O1d|869Rc&(A z(0_H=E6k<&p-nrg3Ok=HI$<^kgJd=-wOpeSsveM7E#bY?=@7p9Lx}zv6N?=<6I_jM zyDy-fr&7egQ1Bp69=Vgb&QR>g(kD*69~%H)gEe02YfW~IdhD7XY}@hots+)*ZMaa?)Gg$07Xq-UDMlSrmeooArW+9lslv@_Q?FP5tZ4U?Skk+~ zgxv;U2BB&qhZih+Og4Ccr%un!QFxahImErZFP%a@CTg+~)>|h;#jVJ0Y zKyu=a?-MR6;-EF4Q@5h(pMlb(q8})#;PejgZmeg6ny~XAH|+V?2_YWm8GHCEwR!zz z@u-9$DNZBnS~x7X+2o()nL*bl7PTlSuSflP3AP9ok@y!2y3`ifBK5+Cw;cTD&crE~ z#a2C$vx*m!Dp})+iO;z|5Sd-iHi)wHs-Fux!JX=aW88rcTPKXK{Eybslw`Q9(2Uda zUiGl;+K~1C8J3T)nc$C%VgC(kax^<3&MnfqDG>$Avh@2?H$sZ3tRE;zXC+y6$A+)$ zEUEru{(4MTGsNz*AtJX#4VLmU1{5J;BSK}HkgHC#vuLC0Xl%05i6PtICQvVYZfp{5(U;d0j;$qUC=AI+|77p$5 zu7kBd_p9IBD~Qk3l8nelL&h&L`^5i zpT0vBFt7)?l}M9z>8PFKzKYWCwPyR1|D`IOpyj>x%|Z!C)4L7Gner$}b@B$lhrHO= z^SMgTgE8K#!Pdp_iZ2K~?&g_TRvLN`9JHb9YBy?lsdqm1nYT*tWk#=rb{T*%|KhfA z74Q4d>8J}XVo_{S2)=bjlgb?FYOVF9%93PFA@%h&ZzT&4hJl`uZM_7iotAz>N>+o2 zOb=$as-heYp(<}8rBlQYj1sp!Y4O+6X()4qnCAFykmr+$?t6T2!^Bt(<6<^0VDHCE zmaY5Nj|Ih0q*F}91=KISY$%Wt$RW6!=tgP64%znpHvSZlAsW>+rIvRrs8yP)qZ9`e zO>0uzUla;}Sfby(^YGDq#Up|$ai5OfFT240X@oBD3BRg)ln^d z15+hZj`#PK?@^egA_`EKHuq`coDH~?P=TaWwdM+L_LGS)n4xYWr5U0C(u(0RF=Il( z!pea_W;vzg0ggS9&9GNOoycB|KmPo(x95bx!eL#)2Erc3@AdMg%S_1N#frFLf_5G8%PYkZ2H#B&yJvQDj=Owy01 z65o?5xN%&V4_{w%e)H}f$$AF>azKs0+d-=NUAwP3l8<4wEp7LZN_>+=9*qv;6fd!0 z0Tu>+vIt_yZ64D*A0yLw-TtObN!X{CqyTbT>3Q(p!B`BDQIi<0FxDT0-!!njBOr)E zN+Ms3;@7lS``6YSOY?AM0L(Aq;h4$<+pPEmFHC--9Pa!9NU5Mqpcx>0Y%v~wi0K1o zL>r8jB9xc^g&h)tZMeA~6;bn%C_FKmezP)57*GM0p4a&5uttsAQt*&}d;+LJYA^VYxUQz$l9YA;s>I9Awp zb&<=zGH9rKZ5Wp|AG21xrfj$KZVr3LbSDm&wK@CAqM4A`%0`1VKQ5+Ah66{s@;fkE zuJG{KPCD7)#{^iWU?p!-I7zrv+c+o)O8Im+*{-s0IN))@A-iu8H99HrSzQ2V=EhfM z?c+U^QMZG@!?QzH(F|*zPCfxsr`~kN{23E}IQn*{qzh8R9{gv=LQ zvktie%GSv>t@zLl=JQKhcUd!;>K?uBgX03fQmOeJgaCOFBK6mO$!RyI zU$|si?x)OJu5Vw4Tht9VHxRC*!b+Bp4KBe7=Xk<255-`y_WDcc+UKp*?DH$M2s_Cll; z`v6}tqOx%SpH$Yuh8DPsgtD^>Ng_MM=#PYBJAsR*JhmwLLAYo{FdDRW?$!)Ydd|jq zu^oOB{&!1bk&leMGU;V9={Irx+*wf*=tRfY^BONVK<{Ge=1B010bsS}2vPa&TvIyyG~8T;<_)Ehs{au3dv&(-ooN#@1B;$`#6@ml)KV7HDW z%Vuc&d#!qWzSbYPzvM(czf%mZa0-Jndhz2nJ~ho;l`X^6EiTV^L3@qE>O+{%@#4TX za4L>_69pAmuRE8G_LWSKq<{xCl(O*!?u6wVPb;omLqk^X9xHV4vOo|U(HPk{2WTyE zjJtTB03icsVT%@=E9R+O+`P|u`=OQeL9=DsY1cR=V-Z(g z1g?stZa4j(I7f;^Bg&4smx-tmX1dd{an{Fn8aVHKo2iYKJkP9%uMBONbt3vk#mRLL zXAGox`rk%qBzv){!8$fCk1j)8TXyP<3NlltX|vyX%hi_Zuy(vk{_}4m_ESw9b4g3B zC+0*;BxaVeUkLve{{zM#1CS9jH_dw?mX^S=WdW8S5GR+i2uaME0i2ywl0%e{`t8ND)vACOCPCHKAyMj(01q{_ zd)>^f@SQu<06&KGJ1&o*pO&TRdz@N&j@VnNJ+Ap6Tx&al#5NDVN7t6~5xkJOPYD^i zoDb*@n5y9Hca)-7lM#Rr1+w)0e7dj@RuFptn}iBwi;qxej|_1TvMVGKx9fu-m-3X} z_+AJ~Bh?U9j_0|yJLR!@s|+;e*FM(eZnG}4M>7adKfU+VwZ^Na@!O!pa0NJ|2xBJW zQx4j1T`CY22-c(o3P3z(Nek2(ztj0|_me~~Q$&BV-Q)?t|3`*w7D2Nhq0XRki^cRp zn=Z4m&4wpZ=`{Q?DxjJkvL5W1gN!TP$Jy)zMpNEqAry=kaVN;F@GFLS*dH+WF=9PP zmoxjost3RCl@T|iBPEJF_$aOABm=ztwy8=i4Pt;SSmU~y5pk1Og?({QzBD{M1RQK9 zis4mR3_`?5%3dtP#yrmse3bKM_RZET_`mc-e-5T9uME(g;0^}Mp#2{&&A{4o2QrZ| z*px@6uQE3?5tWsLi8Q`XCMkMyed{zq++!sa0Jr)uHL#F3aN)gi436X*2A{ z_#<^6SJhUfvA634;BBB*#^B0K?A)ov!WG{=Tpa{`pO*>MV*j!B4il`+FhmwLqRB0m zCZxYk-fOg`dQ3-h^344#EN5-MfJ;nUg$rZY%cQxo zL+c-qb+UiUY<%q&9`#7>P*0sbit_;x1`mmz*W_}x7<3F@#CCyJ zJeT_u)w^P3>ihr5SPRXAfw)u(DBr-NTgo+0T+b$3^d$7F1=>s@jM zN@gB*D?+2UkGd(5qrBAN`#L#i{G*Jrr8Ye+wXOsUug(}y4R0D%j; zF<1W{C#+e#)&-i~5{=6??%^A3C>yNRiW7;Wscd{{1On zIB_|=Eq(`^ygd(KEsQyZY_;0O%K2AXrE2k?`a2c<(HL7)($l2sf^)pJ6A(B9#Zu;)BFZYcK@#8J&kUFmLN_iAtv{f9j{&ikk1;pcb z`wQG-$yY4htDL%@cb5$rnW^Uv9{ycRzc~G5K)w_FD=-U9z-)<ZLEp&~Vfk4C5>ur}m;f9Doe= zvm>>#j>O$?z^`ko_v5$&rr@R`2CX!WtkW?icY)_^brVQ*wKUqpT^f`uaFrNeajwxG6@04yF0{6;dFe3ZMuko*C={`@q)H4idJLy3DJfO~|c%Fii7(6!I*m zV<8mp?d=SNpDdcNA8Db3c51>ulBm9RV`NfkJrI0bEJkAYXfyi|!5JP4@Lz++AFd(B z(sGsI?G>`4sJWc9qYNZD4i35jNXh{!5=??KC7<)ZBAq zS|Gv#h(JkT8r3Z8mt7IC;Ll~YrfF>=PMtik+PihPE``ycCSsq@7gt~h7h6uOG?)dV z9z?SGX!0sZzORzqJC3$SK_J_FXau&-5)VGoMgNVu-Lo{*@gdineP^hKUkuniO6J_w z8h&i}=lEN>vHjE``vNF#q$iyflDgC8qJJp?Ci6fm9{Xc z6LM8xQ3F;T-?;4>%AZIE`*jkF*b2XOB9Se>(ZCW<$jL5#5!O8Ysc2BygXemVtsCJ} zN3*%4h{w}Go2e5uyecHvh8!NpLu&z*BE~`l)bneto~;;`$`Jm(ccKhQkV=~(`TL#% z2R=py=8R69yXLed?BxuKAc$UXVpZp{iU8Nz@a;lF`=T z|GIlyoyQgQp+A6?;NhxjX_}bhH11iU?w5k#yu&jH(vTwYY$%@%fde3lC1Mas9Z?_! z?n0FSAr%mm(Et+Hq$;Si!a2YJfB*r&000NK0iVh?iGKvnnNaRT@f_xM0&g6PG8S=- zpAcz#lBQ6nP(#2TP#|4S(J=XjY`9hRbDx^-{3N@as_mX`w1?<7m4g6n2pCZtj2%2W zJ$BJ;=z4k|!?I=ISaBjuwxgII5O0MXCT4}-%*CiJ>x~0g1!@9TvgJS1x|fuz4Q}X` zIWh=bxiND620Q%#aw!G%42E2Fsi%aU?+SH+-cF-)@3zgEkK~fyX7ujUrVbhpGN@88)kaU zv-Y5H?Y%BHe9W6ty*4u8!Am!oe4&e@#QX4&;lj$-v37rfXjX+6!?!XT#vn*x`F-+; zhjh~Pd3f-yQzUUCNPXp5H_KlUQYKZ#ow;I_+R%_q@HwxVc@Nw%p9caIfr3S-q6V~p zZ$WO_+VHdi-8VFis&K>K0j{p7z@eR-$0w*HR;qZH?jN^q1v@6=dwlkUnKR9k$4ggl z6;MttJi8X3O+XIJvAm8?Z#Fn4Ks5=~`5NQY)*@qTGUM0<`}?s3zc_uEmr{%5h@oBw zvps@#17_^Az*R`-Gt+<-kB#C+Z7{2f2*x7gcxu}E*%7yNuMNfBhV^W4DM8zqfVniA z9{lA-+BVoWBdO?kk;HOIaYQ382I?r||vuV6hUifG#@F?Ifv>%B%ye)sAtlHc22_l(Ptfz`F*kin6Vy{Z%_|I3Y$}vWM*WyMZx&8CS{wCkAa(5j zw2y5ZuoUxmJV)m9@$%2ICbD9l#@N+eT`21|y8~5&c*K7~AmaJ;{E;X)NVJb)CytuC zzoX)Bl!&jB93R@1*?FOXC5$$EZ=p3MjtD@?&yX8WaW%2U3%O!USBA?wVCFNQu3SNj ziuNu9c>o9@mU=9e3cNhtzc^|);axsktZO*X4*ih~4DJyM{yRJgAF6P>X zr3@W1e|Kn9`l&OBSLx~=+lScXV~9F%*Sq1Zf4m!%6ns|UR`%zAi0~HZW$$f#$)jeF z*2W}$8U@qsK)E3%6q5&m>v(YJo-BJdAaQecAhQ3K?3VM`8Z1*%g?o)mhV{Zq2(r0m z7e9@uD;%(vdg^`XxatL2%jaiSKEgeY;BL4&7I$X`h95`9RSFtNFPsl%W;PYeKv zJik-7FTsHtp9<%3;+n}u$NH;LRTumIk!x}+$zE>NA3lCDrq`Oi zni=UtS+(Z~`z97TLJW;wPa?}+pp)L0j>-(BdwI@VAJ`2F_}(Wl&KEWND`=dcEeCPD zop^DrU|lq_z*C1Rj2|{7yiS_L3-R{ZGl<7Bz{QxXU%EcnT=*~6SU}?`FlHl;l1(v@ zdOe}?;mZKdVcu`h=B&yXnH|Kwf6ZJ9e7AUmKod}|8?g+(~*$Ne=Hl)VegXF>OaSzc}>VDPLeC@jw0UV zTboAF7nC${kUCC#6Ox9IN*O*gTtv{}%=u*?nJ@b_JE|~J(3`!SU(m`P>6{o7XCkEi zgpIC@%e2YCFstlm5hpRU*7PO{c84KC{{|PDZel+{3*YRY#w<1wG3K&V>jWttm`a>Dr1e&{Rw|l%oPE;f2D!p}Zty2OIyc8oFkk(~RF-7WI zRE^Dai&JTJ1Z$D27S76pYCf_He3kY&Q{9r2=8jNxG(LTC*P!9@?+XN2jZ2T7`ATi0B{n7(WNxgFjzE zFIAH~8YK`FBLkb7#+d^c2FXPMA#6Ekaz|Vy0|CM#kdP@Fsst1W(OeS}V+*Mp4ShUx(jwIMaP3N(cCkT)UHP1s*6u!Mig%cCC8Syx#dx0G}gpn2n(x@5` z5h!P{4Do;n0A4U4Cs_)G(7qr}-~idADyYFhg8T*GlVAbB000Ji0iVk+pE+9J zvN44ss0WxzkMUFPtT-1dZR4)>6kxHx(oyoyI=A%ToFNch1#OO}0M8<*YU**q<+EQE zoX7Nt6801NghzH}x1neagaA6@${E__p#Fsd+ybfBol`;WJjn2NM$zKQ3nCY5=l07NP@MpR_?xm=NhH5r=U^P_?hdnU1m~5v1toq0$wG z)0`Z*c{Yi2V94Aa#e;9+NIkx}@XQNgP+b_*N1;&)so9&2)_A_?p-lrI)*K9}V|T z{Qh1?2KEG}Y7!6ZSkAH+Yy4xD5eH_iLRDI9zOr`;%3)bf=Qb1p108A(${0aKb3adC zez02#K=ME$GKQ`2u}aR-N8Wd{Ao(9LKIM;X@$WE8&=h$G|U5i3TAF#*oB5#KU| z(2)j_CL%e!zWAd_q(@QJWeDIFTcCDns_Ylfk~XQ1F)}l*=QjPcH|~__-G7V)Xg#Ld zv(OpOyW6W2??YX()DI}`7<&8vD&Daa_(InhQF|QwV<%Qy-Or?#xJP=<#SJw z>0UktAyEzR(idTyKp5zF3qeOJK z^_x}}Xb4#aem}xs{F86}xUzL3)pW-)^%)>P`C`W=@y^oYXFiT;-RYo}Kl8w>{@t7m zE9^U+g8C&{l%{HIEYm8>fs$@nwA;kMVqz`8%*5wOD>nY}R=KL=0a_e`YbK-knP(ZE zed;`9+HQn_Ri6~|WlIO**HmGVRF-EH(wmeJ7*<9uzP*LjM%!ic(j-i0*rH1?8CI!= zj9>dtYB|}4GBl=TI8w@G-Km#SuIpI>$dIe9vUb-$>qH2&X6{?1Aw&J%oyU2tP1JDR z65z2}w)f0k=kd9aOP=4xGTbCbv;P>@8Q!_mik5+Hl%`$zhne6B>GN0jw;_z%XQ$Rn z?XKN9ofCTWlE^JEAqx&I{Ihho;wxN$PVv#$ER)eoP-G%x^r6B~I*+bOz#J0}-j5fY zZ}6$!*I$#NY;0QFq(GAOtR*QSet34wYe*5f7ixPvtPKo1Wa^oXfZFVfW2f%Z%>wN5 zeJRHvbu`Md4g6hHW~!CLqFo4$dB$c5 z+@c;0qQK`QjL^DWZmwO^V>Vm~@+SV^<`Iwjsu1Ke!eD8Ps0pcGsS*Lx)UD|+@KC}b zmNUdgWbiQ+Ry5Tz5~JoSyK3>?M4=il_Qihd&iO}gG3`E(zPAkiMQ!Fpz4fsn8r3C@o_PVLpw)Psi^9^Y zsjHkz)u3hOgvxjKFl`;5)%J?j)c5&B^<^bKV|NJ;+0y5`5}fVy`r#SgYWUTk_e+}H zOeBV;(la{fG*qA}ZQL;gAObj)odQO{JCZ>JbkYQwZfgciU?^Wg;5vb5B_^Fo!~_+k zH{&@$X(+6aW?Gow0UR?t^SGc3Q>Pi$wBmt7{-64UYIhDb!Zem<;+`H91}2ct;RQAI z2I{Ct;QZZ9VGI{JW+6m~LKLX5sU3`HvQDp685@m2}pXJCfRtmA#2=hhSWw=BdDaxcI+~#5}b<8X_ zr9cDt+KifzI-9XXUO(oodYTNJZ01?(IhZ!B8VYpO)peTTMjdDSCk72*RO)^2Umm}j zf(a1Y`lAJ{nsFn3+j}l+oqC%!>sFdImlAo7=Qfcvlcifr?kXt=DeyZ%w6MFJ{oy?Z z-5JbfI(1GgrdjHBstAyhnqgsYTt1KgOpqQ|DWw*Or(q+B-6e{e$^|Mq*LY!CZ|cHi zKFLKR8C)m3tw_XXWqLe(t*BS~bD5QSpFo-~tyZg^AIYl{g07^n2Q>DuaHTepe+tQ+Du&VU;X_g8%60e~7+m zJn@Vm;1L|J>)P;NF>{cN8=!95r{Dtq=k0Fp}j433Did0j*Hj|@d zmb@*zyXbP6wtMHxG3USHo;9?;nB0W)qxgR^=yOh#8?y$d;p zn>`KKAYyN$AN;(b25*E)aJ-BV9)|$=5ha zix}ZczpKEM`W76qD2~hv*~Ju8wWU>M&QP214&c5_I6_KdzhBQ;MqM5_U^Q9$U38PO zhyBI^6l;o}yXOh*xCzZ?Zj98{=!A1iJgp}~#Sm>A3u;V_t(g{Ak_92l=h=6{XpbJ( zs2CtT_i^EY_vCG;+Y$Z(gTERyjClyI9E7-kTWu@GW?|n7z>W}Mv`VfQwjSQv3lK+z zG}AH=w9mW+JhLznBFkd^vJa-F>=ov`KFcp|J!z8HJkD_NJoSY5f!r?eiBU8i<)hVA z&4zxVSLP)%kP?fYH%)qH3F{41|khhl&nC92sYr zNWL`U)0Oqs8@rJmfV6!i5Gd@V9*J$(;;&v;rNM^L0Mslcyj{b4U`@1~Qa21X=v(3m zafqrV?h>p4HmDw#DUDv&T1y0y$7u(IH<}hx!Mh-10xCsb@4H7ayF{M@9kTv|Jwz#b zLkLHT<-6l*Q3;~VZGJskVcmt;w#afPXy%TC1U>|B!pfcQq_+jy`G5@|1n4_>l7oGn z({ew!0M2<1Ju!MAYHYjbeSb^EcotDBum03LRzeKtY*)Y;b?mb?&8mE{z8664rG2Tb zW<#*i?!-{Mo3Uu&_?_}$s}|eSDYjPm^)PnD0;wq}4+RD2fj%M_qyBi^m(>c&DSvq8 zS)Z`ukF0w!&a}iSASL3C3KkOixJ}j&wXk7&n6ef|tt)c78Zh|kF2y}jE6WT@sE^Q- z3<(?w{%8?-&~Pn1x;R~Kc$cbE!tOmluDjUcn4_S+q^_n#+wD#ugleL3D1NoxktPCU z^6OG@Q~LDJK`xB-sLZ`2r`S6^J*5^)h4wX3i8es(rUAyc>2nu6{+wZO(Nqnj^|TKr?NS9RUGDPG58 z4>Y8-Z{YJW1rk(hq8MBZQ0H&&c00I>_80-taO4e+Yd{lC`0 z@aEqc4YmxuE5B9LdH(jD{UGCpzRJSsZn6*sC@$e7GYeAB5EqgGS>oq4Amk08nPCa& zB8jsKu9-^w&p#l+K7V>6&hfRW8<}bW|I%8eRq~q?%`rpe+TpvZ&H*FpiJ?3TYU3gQ zht2@$)NE=JFpyc*d#Tp@;@&kPU2Y}SF$K&?U-kaNYh#V=!r@37#OR}r=nP%z>nO;N zfMt(0{&USg?UxdoA;<>$)(qa^0<($OJ3HuWbOxc&OtQlSpA}L6Mt;jsvr6i*@akyD zd@w&irPbS7L$tVLVw{hVXLiFHOV z$S@h1AsT{9PiT^T?qq9|YHCc*>|3%jOsK!w@G-6HihpSIlYDwt_ zCO2uH0)@I-#U5S3zHHD8ajEO(@9h}yLK`FU|IR?&0m*F(!U^}mUs`WQG~fe$fp=!g8pDniad_7X{|E@X z;ZxH~%LBsUpcHgK2Re4^BkFnr^JWOvZe+l)OIIrgzPlSzx_6r{2}DiO!eU*88~uLW zf2OAZR$K81%fXRs-uDW*LpEqA3dP59O+@~4EDVrNckF?^j=QG{z#bM~2qR}HaXDgN z!*D3zU`1~!BL__XZSv~NUKMAnvMq`L-t*Rt14hzNAqYSLfM!T_KDGgSPvQ69>#$wc z&pesg_7;3s8R^7Do=YORD;d$NZ@YZ|u!quK|J;`xYEo_T0R+@WX8NLfoylpwPHjkD zah4F>+FMR*f+LyK6MM$(@hhFxcm=KT^c^cJzp0k^0u<-v>!rXuIkbdKVZ-I_@f4>K z7qrBdS^sN4ek>T0>P8)&05oZT6_?z%1b$6*M`0k=+4*_bdmH^LML>v{xE$YGO$zsu z!I~)gfm(NNdt^U#EQ)3eMCxZaUa*G{@62bvQ-yWVj`dE{;1Q|^HYs~Fr+OIPflwRzui%*H--=(+CA16b zm!g0M-NG4zF*!A;o~S$k4Sty24Cs+bMC81^D9$<}-0qE`Kgtwxuj!n8mG8y8NUktW zGjq_nCY|lCTL!SAne-Ld18)>lwgOW1{XGkp(?v^N4_>U#&6lO)2@2tY-Su!vhiVta z=CNm{CNNh3Eu_tuBSRVs~a*&8AM>6EMunYiBz#7>S9$FJrb5)#+_J1-(15D?KEJ_}Q@gqJ|TQLO6+=L)DdjKLT$8vTwJytX|tJ ztOR>4y*41j7g6i>(|KGbwC{`MnNJ7_7I4%H-zg(Nm(4w#oIRvMxJnpx`VpolWU56t zp9=zfE9Br93G%$H5Nmc=%LOH~)>ZT@u{Y&4LwqcVsefk?eGfG`$zqWPb+(N8ChxaE zvuF7%l;nwQsj!Z4)Q}B{cEgDw6IBotj5c5SpQI(Bs0og_i4yZLkDFL`)*K>N8yA!p zFL+9hbx9Isg6N143g>l(L`KKO4h+Z^{IZa?{`%k#-`72P=qQE(I4SbxdB)U{O zy3TACo>7H=s;pusuDWHj_4E20Vfi|BDp8b0F)q;4Ln?VP?HFZNPs)syt)W69Ma((f z2^MI5VRKDoxDNQZjkwJ;Q;rviz?3c_i#ah)pWpW%mS0Z8z)`or^WXL<;%S8(hLio` zf5v128X2A;dYt(W-cO0z`W}GPL!XMN>8Q+QSqutk%Sc%xW5~BvzNlMB^ed+xS1O?z zs-6TLO4(yG(8n>cAZJesr7z##&FeagZU=;BNs$u)&nyU&v#@-J>_1rMH9%jf++Jy` zy_1Obhb-R-7Ek*XU(o@B*5_>O8_I>aV!3SNIX{_egFq!J|OC zSX#uo=16vGcL&@7ghq(QbYV9EgiHGGRqn3Y4!s-Ca2e2vm=?cW*FBcKO&E<99FVJ1 zOv}&i>_i=lS<@m2Sc?`R4}8GEtR*Rwp+IhG&B?%+U*>nUjcuj9Nirm!-J&VGt122~ z$&+q~50Z9b1zph~muR;vw#7QHK@*w-`337*5HRTw^Z}5!oYKRas0UOhR|39!sQEBn zRupXCI(3tR#T|I{;19&}l#z~GDfWz-R7=coI(qupf9iW!`737GZozEMRq?0;pmb0b zf<0_$IU7rzX{cI>er79aT6y-@!3eRn9;+v9965_|ixK9kvQBc_+#dHYmW_e4fy`b| z%OhQq*gI4Rz(-Nc`f5@Bmo-Tv0oTJq9-cL3&~^rY3HAZT&e9jK?I=y_Zkn>hdO&~ED|nK>mdVex7GR#g zL|@Ch{*HwGCB5KM&c?6Iu0P-3Fg~BQnDnMWL$dr6sZ(U(K`{#c`F<2&ir)4hw_h^B zB>$75F28^y;l*e+xuiJ5*1YdV7fq8uA%9_eNr-_`3F(-bbUbiKu1f~Peo2hLTI7i0 z*+l1Zz*s}AM~R*8w>{Xc*`A@-GudGJ@{+eHYT(0D4b_)xSsYx#y6;0$O5%g<>>c2` zq|X%NVD0K2C%4BCS093u37Dyg*yFvQ|2^snN$Lok_}JjccaNr$IGoHv_kUM_J0K^d zF$pX@hcoUZ!}Yrk!ZT~VV9If>tH;7_{nBXm9mZ_qSb6C*Z)&SLb}yvbd?4x9D?Hk9C9_#%m0@n@NZZf zoc-6z3g)^LmfwEON#!+M&5nB8b@D^4Gs7BM`e${gP~o=@1s2H$-aH75^6bC~GE3uQ zD%fE0p;aui(@RkXzUKIN3;oD#(l*7F(LxQ^uLvpwMn^EP|GfNE*-zM_#$;^iX9 zq>b{+!#U)9!66#eO_i318Z4ZekBrg0065(^y=zkCzy&-Abyi@xSY2xj87A7IFNgs= z+qy(XOn)16)i_^$dc>4z^s;+Q$8F7Ayz7QbQ;+f`7quMnT|oh)API!5Tyq2@3Vdvs zq$?120F@~lKr3io0JtS_Yp#(I3(Y`CP1zD^sZ%XVF-C`&fZalY#tltRH(fwivgh9p z`V6(BCDz#Y+tuuxZ11YesJ(OHV@(5it}yFN#{ft!5{;`>$UB)9Z)B)*?ZUKHM>)-w zU5*4`&{TpHE)%hGv4F5A2~9wN+!pQ@2}l|Q0R4cfby-dqWQ(OG*|(X74}gXh0X+ZugVFGD3j z@ay(aCa6C@4%VVjA%m}RCc?M&-Az|M-D98)8cXlLwHr7)6FTJwE^c8^c?^jDYTgty ztY3LoLbyC1ZeM5xI|g$>Ee4Ld5&b2Uh8omm>P~93^3}h+@h%}G*@PzEij}>f&irOl z4Jm38zuY`E1|cnZS$>Xx&{_ggWJpc{iDI0t#@Ay+(Ld1Kk(h(j#t$Jn0xd`v%ksi? z*JWDovSVBktvxCQ+Z|+ZZp3fHC)40J3n@Gc?@5}OA0Ok4+t zFbmZ>_pvu*#Z}_=8Z(WuvQ@8a{1nxk2%Zh^KS%cm$CSsOpTH0Y$z*iyMneZZ{#$EgH14QADZIdl07BfX6? zKQ%HE2S$~k4DXq%*`R>vq}2vAts2ePjRlKGla24%}Y27rTha=l*&7sH^O%QRCuaTN}S3Ik^M(aopPLQ%Ko%8M0EOs zC_aubc62vp--!KMe)LHt8Y#qUkL*63AK!^VCIspw5I#d@PH_XbV3e_ z6BjKi->-;g1_n0b+sswK>!XL%mV-12sOJ7bb*DMv0Q8Ojn=FE9hc?GJL!Zt>dX&4v zd^Jb><_#HGCymlMP#1N$enrYn6^+PZF`tT-r};eCh)tiLy|%)qLF~$vF`F=ZppnI zZ7C|va&Hc;nuBa04nQDMkG)WB0#byq;7DUAsLtbQuRqrRaRq~fJ0aCR>AIxZ`o{cJ z^XZSB3|m^QnSPA>G+bL1JgJ+8dV@bkF9xvAW*kzX*>iDjJMM|P4|Jaw!{ z;SU#>D#Ae1tykYbO!Q^HeDC=6G=39=M)6mPM<`Pmb2Wz&&rSr^w%aH)U^-|Gp{#^c z&!iq$u2Ju!-Wx|JfTMEr2ezm`V)5#3DdsrW%g-hD|TWj7cN^ueu~7=zC+)o!ho z5H-7cO%?Hp79cIb1if#4Z{b7C{yMAX$3e4@sJtnI`%*fOdHFKr>Fgn=#JwEvd8dW6 zZF&yyNpp-@%PTm+_0TZN&JeR_+C7KjpE2i*aEO z7s2@47_6bpf&lo>>}8F~KhV$*%W&V$Zz!KJ91clU1^E3C3v(`-$W`5LRT_?;*XWLF zox8LVjK64-L*ot^63D9ZcUJjEj1gF+pl$Mz%t`6^BjOfeia~gnL?J&Bu}*oUt=-jh zMZ5JtJX0Uh>D+giN`pc4gk@;l=J@E?Raz=m|9TntoX@=!#qqi=TXo5)ha9wGR{oq4 z2HBuVFJO`?7rk0MqTE@Z?JA0H=*CeFuxPj}>9WFv+py6HZ_EJ9v zKrWL*hTD$KPJvyigKjUzPJ@~gG7Li6%{pgmRz75O$>|B{?VbM;9oSFB&hOvoQ7gR+ zcZ2Mnh$l4E^U|KKk+yIKRItY1wCpsp1d-VrUASa9fHGD+?@6ptK(YYsCBejx1XOH} zIV@1S)lChTvkC{~cV|!LC(e}iibrB`P8i&XGy_KGl#7Sb`wS3f)UAr$W@uxa@C7FP zMuLiY0llp0jpO4E2u6B;*pp0;Au+9n+&JxO3 zTd+u!eqUAHhE&QI9& z0ezf?u2^O*f-nZ)Cp;*Py`HLM`=qhiHKDrNQl?(_;wDwzCfF+9qz5l@!w}1@)R*En zpi8LtEQW7laVjiC8S)(p)eu&>e~F{0m@nwjd{;R^>abI?f!s&XGwIovZhiGiFqo#E zBh{h%151^%2<8T7aos11t2KeZHVnY9{!BdyMS;o@#} z?b&_v!C}5wUdUjG6SxA znk8{q?HN#do2WNyg0K0-+^}@b6173CDB6*yYgHvv3{sBTEU%kh$HA*DUF9KsiGyRF z!?~Hl#n;JsTH4%Gl-UkhuDROtMmY^EjVHJpHG$!HvaBSECeVNNc?qbscK9(G5a3Kl zV6psU9pt4hfhf7Mpw}1tf}bLPN)LfbIJ;Ghh_K_WYb!pv`dU1o^mLG4Pmb5psuJLB zt#u2tM4J9r4umj7H;Df9nsL3ALJH6VQC;Aes{VEuG)wDg1|6`>Lo^iUbR8VBrk6Nh zdI|sWK(eKMoFLm7O1D66*@g=JE-uHy1MFBO@S?@eSJ*`ADhnyIrZ_kM^L2bejp;zx z!^6%MPoTvvr2JRbGdNF4Clwu89jHGp?t1dUm2wq1RByVh$~9Yda^?Bu@vd*XujlyR zFoWf)!T~xxK6AI?5bZFAl^1c#@owFZaE+K#)w%@8@b+<1Zmw~kZs7Gavw_47o%DX7 z<*yydd4{?NKh#ERzxJ6(U}A>Rcv3F|B1zkF_?t;bc-s&gn_UL>#TK;NrJ?0fL1j_J zo=S+&IiY$>d<}|_f%hq5<|@5DLn4hY9$EYP8@BL!kixyHaOP&d!Et9Ag+SV@8Ptfg zc@dtKff9qM*0FYr@{oi@9&=qUs3Qb=_v5-36M2reX3S-%Z8^#b5q)%Mq$x*)TM#C# z5!CD*?4Km^!YKJ@nh04lDLHH=S_bTq@Q7#i-2rLoMO98^AFz_FodFEs#&AEewp(dP zwK-48U_^P3+4uE#v%6^S{FjVW+V4`Ib-4IBx8Y|(fRoDT`G7b)-dWSC6gPPh|G^H& zkTX~tUZ6yef@|2^&=|FJ)I^a}D;z0FT7zXsfHX3rt?$wh01WPB;;zA3kSAWy43$K7 zi?p#HK^Bms%zZ@tc{N$_H$i-t3sszG0egE$Xv8HxFHqx+qs-GbQ|I;!_XTGdj-t;| z9Dhrhfn6XkN{v+e&|d|J&~$6Ny8b+P_R|W}I&Ol?FkAIpb#0$)AR!vnOdXncCRYNu z)p11>2LN>Ii`1wW@c3H46m#U3u5s$`7YP<*&_VWm9KkNn0Yn!7|X}q zx6^Q6E^lWu-fWhvt+m6y>*3IGh|?ALdF?eUINZPu5dk;=c)$Q|K#{*ED}tiS1%4H) z0Ic9CQe?y^;}wmTkOCsb;|qe0%IRVu#sCor0JPDWKt+~^)}`vhFZ*`dn$zuVM5nXK ziQB|-Rk<@)ZsR@m7wD!>X7IRfnGWG%uH7G!!x_J!D;8w_Phh{wm2pIj4W%H%QMh#G z|Ik4z0fP!wtBy^>L9IzH-JDb@>Cc_Gs&g{DJ9Thc2( z(%rm(3?nxM?dQ#m%TXuT+!*71>m!X*aQ;b9*C%4xKW}9^K3sGkE74 zW~cx=7va@a)5q42dA>2if|kj(U0H^)78S znNHx6jc`I;(wcfP@>h&HnM*#yufOW0-e)U|u4k)YYK&udwTMGU=SVJneGU5o6zZwn zy%-tJSN<1tIm|Epp0y$VUqp5!`iOQ=wVNkAxpTA&CFk-VQZL8c3o~vYSydxrkaz<{ zQuPUc={d9h&eR&Nw!9HAmBfagXBL<4p2Q#POwSUE_>4U;%hYk^jip7@DD~VJ47zF%xQgG24pL~BK>_Hg(J&Dma z2-2)ZNLL{c7~uvCBaSZR!jb&kSO_K#vd?BJgb9?$Zu__XQ|SXbq1B|IM}@1)wf^TC?RUpY5QoZoGo+R~)PN)aW2Ad13CZOF=eWyk2` z+RfS*3oZzG%0}GNgfj{Z8YB3@+2m69)6^Y4M|#i*Yq}v*6_b28V~g*h)*5Wd}}iV=TRF^*B~|< z4H|0w;4P7KM|OMZB0Te5$}sLzj%&_}wT(-st{AiPFA(J+O~$$!>WtmsdK907AFMLE zyoks;2IWa59)4!VPJ6r=)BXSq)~-V>z*6k84@wvJ(dCUW|LK7CiN-c}-&cPxx!n=1 zs#gr~Y4Gdn+gpyX@!|yY=Y{0^G$}N4n<+*x>z)HVr98+YIOflc!}9UF|GgC~oWPAj z`HHS{bnwSwheR>4MDucX$2mRWrv-dT2c7yRhJ-XuzIvA#KCZ6cXatXB{=z3>TWMJ%)yudr@vi|^W@n}}GL#W({NhUu1CSE4ROHv8s$N-H*%AIU@Z zC!>0nrFCPC_scTqL|J;qch68dM*ksnVjpP8=lDxI`-x0?Nw{OeH zx=O0Hmi7|Q*-`hnqr>@M@gr&Dv%+ua79gUdO;rXx2gzPbsY(sn7(O@0W$M&Mo)O4k zXf09n5zIa~G@1Qdj+7iDfBqBPRYBoUk8@jDP!Zsw-ig-_IA$#E{L%`jk}c<3AfC{B zPX6rl_$iHlM@+5e7_}(aY#6HQf|h)9KyO+g^3;S+>d9uHLX_u>hMFAHOzN422(v9k zOqUn_hREqD-HGXU-TSr|W==z+NU+}l^$x$e>LPx8&4o4h6m$yL-BfS{c6*v9G$D!{ z1jO)2un9x+fnz_QN>hrsMjP<7uirp=0@AaO;*RlUzFJ`M)lNU^k%Ow`w@ z0;Lg{y8RRF5lAz}t=UmEgh0vA3OW23)qVSmOW~vjb3RU8GyI4dScYG)$UwHH<*7-( zm}0u2e^>ejWDMd1cnNMep=VMsPw`5R_HRzwpLX22JQS!mH@drdslM>Oeb6VT`dh5p z3+mMkRV}nIN0XFF>lS$d@4G+h^k!9jcx5pU7!5wLZ*vXhtM=gV9>|Uy(9(# zcTp1oQEqk+h1AOBYh>OA2v3ngb^h6o8eVJ)pJRHARvz!pYK`P%p%32BKY|wLE-5JODs)`J2c_6KJ(~y zM024HK8Ehfm5K_^Q_u$+qO`z;k!di0LnoSFGxM6t5IBswLmPEttETw@g^XMC9XkX7 zhA5J|>3xExWa$c+BqZR+&9 zrjONJT(co4+o3C+T^rRnb#z_Bcb)w;<&haKI z#*d|{EqRVDwg2*CI5p?XwY!uPGrne3zK*N+1z>q)^G`Y;v83Mj+}36EHZE^}8c8nZ z-%#3D?bxQhaL<}N4;w1g6ips|> z*{&Ji2!N3%`QrH41MzdtJA2xDY#I*{S3`(d?=X?RX~W&ug%L7oj?$eGr~HL6im6)CG5sd5dEXR zu81Ox!Y1|?8-5^YT-g|VYF?xmeOu^)?o5yhkEl@HNBhOW!LE2p~srEn%sh}8(Pge(l z%C$TQtyu54@dOlz7pSvfC2}jEC1Qc!)Nnxs@BlYe0lB4sN`MeZO)4{hkk}C>fj9;k zDQt|G8YE-_XPqF-WE4W&9DGTwAOv6gf8UZsj&Y4gc${7fRe;PBPIEUYZ5Xv8sIv1K z{LZEmshNFlCzOUaP3{J6j`{mgTlh0O+6qWsAq9y~nN-5lg)UVQlmZX|B)9@lJ|VB1 zW)!WkTm)M}#P)^6q9_2R5V&m85L8&8yf8pvV6ed8000!ML7ESx)FD+w%3v#({{R8X z%UnQx^9)simKlY&=9?gbr;`KYjKV49j0|nN##n4X?Ieyl)#&a~H*!Wi9}+^%2Td`% zr_D=gkNGQkv5Qig3lkgPt=$K#LA{dKo5633Xy4l=jAH8)72B_c0TGWJJzJqvj%pPsO>35mMY7+>J`kU_W z+#arDxenh~8S;o3{3bZl?>-dXTacd3!~BM-3at1@`+KRf3Z7ambf8t39)9b2h4P+N$z2ChpOW z-2fOz2L(1XUQuwyN<*!9ECuNd$=mBm9c#_dH#(-u>0#KbH*zVvoBufcgKRot?hb=}&@ zn%C^u{aJPzJ@q-{Ty{t*P$L^kqUzebRog$x14<*^K$P*o#*gk#Yy6Z4NYU8K3g~|f z4iQ<7hI!5PnWNXufF2WQuG-$<>4dxrZBCD_J1AYZU4)hU4p13>+MO`9{=1IM=tD1e zPM8)<3Z(cOl!1ARkoM zuJduZ9jqeSO0{JPgtnAnX}o0Un%1`NbuciJ5rGqGhVFkqt9U}-h)~G3`9dM`P5GC+ zrgd)yrf{3nDZhZzUS9b(#{;P_$xz3!L}Th>UD^eP3A?+tDC!3UbAB3K9(pYD<+^HA zPj)HUF!4q1-EcZQcVJWDeWLCx8j17H-{(QkTi9ZA0CTzjUq8x6+96E8lT$Zi)iS_%^!Fk9?SSk)P z!5>@g-feaKme9NbF=7~m9A@#!#RL{%Ish=j-TRt`Kw^nNE1}bfE1;C)ozn6a9 z7?Gm;5g8NMF8aO~C9#Bzi$+y0AGrv3wMKg%bPzsE<6EV;I@n0-ud1H&p_Ns+&Fo?E zMHLSl-ib8xz-$Q@m6paPM)yN3Z!SlNuddlEsJjm5X2Ua{k&4{Wj?3z%t+tJ<>?u7G zqd_;geQsR}>K!g=uG(rxx}gYw_`#7c9NyP=3MR_;C;u_aAM<%7#Y8#A5eH*B0Q{aK zszh?HbP&lF#SE(*emp6kBUDjBj+Vh5Kf(QMG0!C9^28LAr2!@DyV$>wdIf?U(v&$u zQ@*l(0YqeUaj4#TZCL=c#R5Piwu!ySzXN3$a`+{T@*FQUn*^7+mguJIaB7aOaC$}1}j4$#DP<79e*my_ASI) zT16%1i4o}5MJgfJf;Gv!_#S}SbF!x@xBU=&b^aVkT7mF=R&EC}Edsp6NPh4f0_YtU#J)3@PW~<2a`@7}dFnz6~{GLcXbJ@xX0| zoEkeDRf1q|7A<72uVX*93O7YSgV^C9C)t*6AdXse`wG*x*T2*zxFEEWCOD97M%BSVHB>mMqoV zW5Ea1(^Dte?N|KGq%48o^$UOn-LPBaob8C`vBPmo8v9VBVN9~IJNt$m_uf9L8o}PS z#N8F-DnJX4mdN8|V<&M}5X=e+XXnRgc%`uF0?iUd;Iz|tiV%v{VxO+iKT^qWM579i z1J7uf+_&G-oKKvp3+2{I*dN8Vu#Mj{Vv-Iw(T*IInt>CC4hPPYY)YcOq_DXSZr4!0 zds}dnaQKzXd#$poIVth&8WjWQKPek3*liezMjm0g?j;8Kf(a2fE8WqlydvVf)3-cy z{hI}+&?)z$lX10VYk&WBE4S!<*cT8da59C!LyJ=8$j0r}+$3n7wTBQZr=4gXF&BvoP3vFTpF`IZ+Xt4(#Qd*@2jsjE5Y&ug7ZYP0fVXB zTH_%V5@szQD~*W?>Do!W>szbhc4gy$1;c< zvU^N;7zqTqEihV8+BwYjtGj9WR6LEcT)lNBaS z+u)rzL6!FSYyu;|X%W!tR+bzU$ecTt2aScup)Y+{M5Vun-usu525$IzM|7y z9ojX+16ktmPHuxznIELHQ{CcYuVrotgD2mS80zsUQjaQZ>F;N_U82#c^$%2K#)a#c zC4*`w=c$>W)M-msLV1b18y1SK_%`5vs*&B7;7{lxQ%v@^E1^!@^cPd z+&KNBQLtW7faE6+?Lpiv5)R>+7y1l_;TQg#u3JaLIW0b;yAj!~Vpq@#mZL#Mn5DGu z@=!~>N|+Gkke0FyJGff~fgp97cuEFuK(V7!!O|#S;MQOLVxuP^jH|tz(OI2SC{4S+ z=fLG=yip)(ZP}WjXb~`ndPcx+{~vZOYCMNBexifXD9{%IeXo zOJXg>4`(%0vd*2+Nf*!kVu}vdaRaAQRV{>Oln+GOVdk``I>W|ad%H4S)GfXNq?J0{ zJbqX>qMMtz9?^=gOgAh50ToWxU%1X!MlMQD(Wjb$3P99^SO_871F7wAdl} z{!~;?^WZut3kaI;*MX8 zqT(fYhuoveE6jWlL$Zd*Iyp5JMHe3y*x@|cmObEb5i}maq7N|84WJz~eNDfjZoe7K zhV0`VTh*8^Y6WiDcBc_G^3*U@BF|i1chGeXd8y;*zTR_C#8@*T(Lz#Bi5Fn@N4s7` zUxE&2H=u*ufhM3(iduFqTTT&&6Qn)f&Yoaqw8NnbNMuxqd#HdA(zJ+@W}bT)E(c84 zJkUJ(`&YwqD62V8BpRA)eH>P{+0fn_k5fJ3arvxy=rUQG(~0WBf+jZ7r;Gl@oJeYu zQrKogm147DPGGkieWDm|sC}XX+i2jk+01s+2l?5yJSDx8q-28Rf52ueXx|y2SkmpQ zf}c{uYK+yu+!`pZ^LquOit0aefG#@nRxx;qja9ht-E1!YMvJBr+Q_dk(1 z$HW%;^{=e$WA2)UH+EYE^`nsfxC$#CNysnZK<+ob<2rYrW?$fRCu;QpPgAYj7>6C1`c3!Wxf@Lp<;?9AA+e}1{`n+BB6Q?p7Pd7Q) zsC8SF{yDM`Vf(ovGG%_*sLn-+k0$n~oRwp}Tn)#JX2JA!IxG%r;#2eX= z!ZAfuiHn-i<{pR7j1>3=Fa{#V+1MMOSVDc<)RcK^%m>L~TN{2qOXf>)1% zc3&;{c?|R8o5yLEHiSrhIaaNgRYk0Y(@Z4tFSL5**)}gQCDU~zudfU z3`Dp2miy2(?X6_zKVsci9EYUZp$(=jx7$QN_zI%2b&(lrDQMsE1lOeqxGvPSjE3do z;}y{opAit!8V-F5F|=gY9}r&|5OU}t4FL0HX3uwVxGO`mr`M^s*f*Kzi>J=l2X8!h zs|ESZ?6u?T#9SnOqZS<0f_H)`O8)QrnFNP#?81G4wy#X?HGz&VVelNb!}FdMCrdCtp+b^ntd$KQoze2FBkeb zhGr+6Cs=DYyR{{WC-)(f33ogQi)e$v4B0|Cx)#_BERN^1ps?4F(7{YhV1_&%76Yj& z2ZC6j*-&I~Zm0BVPaNu@D-F;^J zd3Z;5H#jAZdkN<5CArmBSNF#qa^L^O=Ol6c{GY5~R?CFf6acr3_3LzzIO?*GEeJCc zIVNPoupw&eaDRLB!->#=;Mzd?=Yn(<@2BEV4(M>@j2zJM;jpv)lb;nU5<8q}yt{b* zW2I$tyNHe27(mJ0eVe(!ZZBZyHq`UKamXyKwoRL?1SY6Br2kzyZ()U?G|qS)6-WqE z+loRUc3Z0H93M8U!n#odo9VZ2DQ;z~vq;0CweS>V_Q)ld9u-q#0!ptAEEqE?mF6n+ zBxsWRneRKuV1390uY(<+zS)KA!%_|TBrG*uMHi^T0B)I!=EE8x;3H;4P(yLY*&s3N ziIqJ{j?k0{YG(3>LlpArbjOH9bylawgto(0Lvk(_MVh)-q5Hq??T&!?06 zVWmpc=NphfAsdxFnV5M2i3^Knha~{gX>Vhxdf{!EyYbBV zZAk*v{gSdqg@cxamiBGZPTAMrJp&MVNNyAqHnpN!>L#_%jemEBEzDDHk%X_;M}W_P zthGfQB#LIVL5y9QDyV<}&)?9jfrJVHa7Ho(lbLXU4mj1O8WadX1++IE0*$!4c&X@Y z)7T6(E3B>zy}UR8O*GcJlI7alOLrV`$m#saHN*#+`vGZdI&PdI?53|MT^8m0Tu>C) z)e=8jZ0bJKKM&zFp-lRe*OTx6-Pr8GiKrS-4jBbvlt593k|6=SQ4uK6saZr7l0vf# zCn(Js?DF3`)QkQ(c9sWww4fP(`tAzbPbZw#-~6Upq}gDoB^52L>W@ zoL5=22Ah1fV#KTBFlU^TfQ{r{s*jmEki^4;vqqpp?i0G_3RI*SW*8v6di$@v06acB z8}&X($5I8V$C*!=EohG+Bz37@0C(X$&+88cpc>b9D`$EMZjW;;nYv|3lZ@ccvKKu7 z?R%U9c<7hp3U1`nHT@BV(-5uhikA~S$9~xZ<3IBvRJ;J%+DlS-HPUhTUE8eLTu(-x zN%^M%J`CnNDLF(!3s zf$_TRPsgmDhBYlqmN}UHSw)AaKrh>W_)_I8r&-YN`K=@Ttb~}BOZcH^u|)_TdG9mP z2fg@Zc6(83_B~%ig)$WV7^;*7JLLSFk1_DC95P8wD0})hTku7x$p

03o53kiT4L4*4x6w&!5fDMy{qi@lFXV;~`wH=fa|USxvgn{O?j% z!Q|p1UHKjz=dF@>#*Mds3E=IN=$8=E-4j=p2E~|x5$m8;hS7ZEFR zg6{z z!O&%h^sZ}{QL>^i8VeNgQYkf!x1t?zv7LsOb0T-EurTpc2A$~Aq!Iq0n#Q5Pq46$Y zvZq`o(JGh()lv$awYDG|L9eK4h8V!lYhPIO4r#C4cl9k7Y*x*|+uZsYk0|RSi}FBq z0tajqbOs)Z-a;JKqy^e!!@)jWMkY7AsipDsn_y+);drWR6jizdF%f*OFj@l$2o0;G z5dR#cRn6j(faG4lWV53IBLYeaZe`=dMJsV?GSd4kNh-)7bo|V}w+L7dtg|O4Icq|xnkKCu$@PlF|da(wF8z4RKsUJc=wy4Ce3_oPMHsg zJAqH;Od6IF+(gG8BEpcsW-E32N$^ToY}&O|S-w_84H6)Mw|&cwU%ig3Y2c&jg^s2u zBxSC=zrbS}w`-k(f*Fe|@O6Ha%up&JIj=HxWSz>Ymm7u((tx{9+=iPD^$$4Nd9suB zeA}9@0n-C&;AX98iN*Zp7GUIv#oVACg1`uWfS*5(6~GQp2T22#n?|*!c)e!R((?&j zT{gXSzi1a~mDdKE9qIdnpj!LS#V+2pI6%Mcg$~5O-z=GJsMqeQCWYz9Y(PC>dfgvP?rjIa@89uO z%j4IX<)1UXPnE)xbbGR9=!44NXYy#s4#Dbl6A_d1cw0Rmu?n+wdwc6xZnUwKHGn4$ zxk>0>6ZH9YN5wCSaJMh1K;tpLHr-e0f{dR?g_v1B2NUc{_<+(?Lm{9&7P2gUl zA$u0Nh&aw;)~~*LKNM=r$EyijMP|Dp_}PNSHKnJtu%Z-tpOb$CfxyrMrG~9g9nzak zVUsNPZJP!+4A*ApGh_*0?m-RQdqvK|T zCwv6EeX+(|b3?<6VE7}f@`}Bx`jgdBo+Ws)N=|q7K5m^kQ01$xxti5I0*b7>|Eqe6 z_kXJ#W~h1r5;9oxU=(m|MHkmPjNc>FFSnHNymaaxae6J^r~Dj--Ba=d7R6T;*K0Iz zkZMcPXBTN@8C4w%yer;J{s4O%XNZ$mCL58kss?(o+rbMgc_Kw@OvvaEIjxycvmDu(4 zh+)%pGUye<29;8Mwh24f-u-6A^)g5sx9qZNEK`0nxU6TfymF8GvT4?J)2_xE%?TEu zr;ui3>Mlc#d0Ry4*JDyE0RwW&^adVI5_<6vf~x4`XR~pSPRYf9*a&RzT!?xKm^Fek zieWKLv&Rk%V0-{Ia4r+&>z-DgMW;R}%EArNUC_(-v4O7|ya&M$*wb-hgSP?xfFp+s zMrz?wvBgU8d1F#LtlUt>w4r{<_k?Km0GoN^XMUR=%WtGE%=;PN^OAvt000rXmz?+6 z9fOUS^X8UN`3i8HCw`U>3B)_%0jFxb9m6~v{gm4)tq>x;(y1CHr3%S{hakf9P2jLe z8{%}G^Boa5hB!JHNO0ZedIK1(WK{{2z;o zAY~A@ad;kB*!ik`z65JZ4zl0sM)30c{#S()Itl1IkX+ z)>p)K_-p85=z}yo#`OIMj%eHm*ceH>Xrjb4lt>EJD|j~XR*tV7r1$%5Qy5mdMxG$& z>RDuXVm5)IL{g*7_JE34CRPQxM?oMNs0$=FQQdQSqHx!RwgtuFG^&7*Mncwwl@057 zK9-XqYN7~o8*A^N7K~KVBxz|E&*>p_dbgNk7C+!xbkKuQ9T3szC`tSX&McY3W|{ zZXn#ym5Hr``)AOBByx+5{6Zsu6$$57SG&>jX0lE&Q zQ_5SjeSllfi>=W64*k(@p3G>1?bG+C7z7hUS1yzp`?7PHku84b>+@8?IvEvYX#kY2 z^QuFIO`co9+ZYB=ei@bPeT~>Nh2%n#J)9YTa4O0F_$fwPqTdB&NZ7T*SmpQ74G>64 zNTC#Vc!pE7l7$6)DZAlliH-tGW@Yt|;hKet2~M`Z6u6_f$Rj@C+hq%v7I(%?m8mp^ z8aw-IB^+CDIk|fdn5*qWR;t|53KHk+u@i7QFE_l6?Sk(HIOsZJHYhHk=~_{`JRkcN%BOs8f3P;A8QOM*q*O(mbEy z7ZJvs$%T|y-Q~xlF}f zOe19Uo=NMii9o`hXNs`J^t=D2yZT^PCDM`LU|20dT_k~QWN3Qxv2_j4NdfYCih1SZ zCk;GbpBg~PSlf#2ca^9By1}eEuX4C43vN^}*>}$F%Qw^+r60 z2$Aml)DOQMLi+oZQgIxZOBmFsGHjNwK`@7-n_P|zH#*Dr>2UQsTx_3PAc1N`VVHG} zcrV@mSQ{n&-Am#Pc4l1pW8_#mQ$_CO0Cc1&mB@TAg3IjIHp=qA&ntbiin7_W&y

  • 7$lYIg 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

    3y+RY4R5MekeUuvjK8RVt8rfKC8H*rZga0MeM` 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

    )$ECAFQ;6~ghcts; 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

  • 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

    4S}+G91rrC_XjB(ZE?pX>J>CX)-)4 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≺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Μ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

      K;w1e%IPoOcv7(z^XmaB)iGyPCSm!|{#= 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 u1Ku406z@Fb@)!$Pf!bK1N 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

      Z1T1zsxOR8I{OLra@6mT5h(rGe9bMlk2~}q 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؈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�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

      N&ML!>6DFBzr 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 z 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 E1C7CCnE(I) diff --git a/文档/robocode机器人战斗模拟——需求规约.docx b/文档/robocode机器人战斗模拟——需求规约.docx deleted file mode 100644 index 7bcc57b41d02c3287e418cc307805f58b0f2788d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20282 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

      mZ3v8y*M-5n?2AUJC=C ze+g6fhf-*gv-Hit15->A>0*7m3p(noiUTMA;-d75ig70DWU&eg85l;799Xl!e+^ha zKW{$0M6|CXM9hekdvdm2M4r&)k^Hpuq0AV(K1`g*tIR;uD-+n%cxP}p|6vCv?n{(y zEF2@G^yHNQkP{_RWc|*bRW>m$@yl2oRx_vjvS7+N`=bFkCuiZE5;cqk#W0%QRti>0 zQH_*yE%Q?djvSac))arJaQaEIIiH4V(pyy>k1p9b{1p4AP4p3wUr2YAK&P<$4AwC_ zjCw8@NfeCSY`HK2MACO-X(|`D#E)9ct(e+cOIqNhwPh$@w%SiH3^C2s z2a=ZfBu7?EnBMf|YOzfRIcM8W)4X^fZ6J2lp@742S1G!4oigH;5dWsF;QJGPnLb5tw%N+uKDxI%{1K|#M@Sj)%9 z#IVcres=yYtdhFsD=MW| zPq+prt;8zcEu4~`7iDA5H7sQY@^A~R*C+^+(EFH3X*U|a%f1;G8x3a$*reu= zV>+GJ+>StVx9y(`~=h(zxoC z$;^9ETNl;?u6ur3jK@tfIrR{-12KPkel6H5lmu`^RfN`@TcGX$uL%VpnTG&eQf&Vl zU|=3{{_)F|^UpO`+WsV0LPl{1=NCRg(IiF(K7bCUidYcI2}=A^fEVD6N+C$ah!g|*Cuq#3RF-QfCBBo6fivqTh*UlmaCghmz#kd@R(CvC}=|> z5gJ5pqLvLLj!J0REM zm(XhY;;C<-D*_;pErLKX9;36F6D(I1pS}yaq=P+9hu*)!`36$UF%RWK-wApL04D}m z07wOBabA)B8ZT9neII9qn{OaAQ(JTy@biwZpN5OQ z>d6c6-5EZ>Bans&GKO6{dU8VNjlY3}tReHC6}YN0(y_scU8)c7Ti(aG9J4wXzqMo+ zg+>EZGvN98K5HZydM;WN@hT4`9Pa|g*;BH zWI&UyqrtRmnFP7HF7tpoG$_%q_ya6(w7l1pIG4mJhE%>GiIN`A`e!@BtLZ4$L#B&{ zU5WzvG@Lc;6~se=4HaO8@ly7a&c&(%%SAnK6#}BpEdkYm6lBPtYX=k>xDMDmKyFnC zAZS?yd~A~2=!0H9fbwMRy{lMmOmx+PY-^#tcbtPjmV7H-;L3XC^CJ8k$WefLW8fh78`7CAT|X0&`TSsYs%Q{H~U%DI~zfUH|np1)c-s^OrjUiH?ww7;ITsvC0x$h zlcZkMpPRc74fq!oEInv$H)STXZhE|3BoBFVO3-`&@!fIPU+gNE?aK7Km(1l9MChr4 z>XppXE<^yju=)hS;0J%u{+w+RDWBWkVP-m<{xkzpiqPBS1v}mtK71{|1QyBgx@NMv zyHYD@NgnkAR{t?2NZf!JVN1P{VBgPok?>KONv*r`La+=ow+ziyuZz$#p9-lANay^L z&=s%{3>kT{m8-fdWpw4S4sKIjfsbZ`&BQHc^0>Z%^44}w&WfVM#?Z>rKfiu;NFew5 z!)%>712)BDe0+pNffZKBKMK($D5?g-%eUEaQ%eeKg2d%r?K^v4|{M=T1b@q zb2=3B3TIV7NYiHPCd{@eo%H(aeZ@|Lboc6UaFNumTaKZ#S}7LMrV! zzJZLdsEs<7Pa{$QEgzrSN{RhI*}=8>-MmAPS8t1y?h zGA95Rem{7In51=T`H{_PYt6OzD`+{SnE^o2c7Wf(3SExe!nmy67{sx*+w1U!y zor{$(_r})VZV0ne&>+%(oEYFGY83wZI=(!4cnjAO;pT)6*eD9o&p*`b&gv*szj~e8 zi2BDB03Vd{hpYol%MpM~#nK<^fAh^T1G&djmp_Cq!be^cIve$aMRx7w==U{e@t2MY z^!1UjBqotz+h3-fW1C7X6eEeYec100!KZ*Ld?N};FT4in6r7JJE5Bj{=D#BgoCs|#g|uxBG-Uc8cLnVo%X)tta3F{0@IV5@k6spg&OVkGsJ?XTO!uq8|J^G;4ps^&H90d4}^a|Z7KlU=^ChA zkr!4U$1jlN!~rDHpCE;Qdqw9qi~Nyd^}o~E^;_00OcaMHTnN`ZE#0GPo2rKZop!EY zi)~zvUy?By%N#=Im>nZLUG9k2ewSSdZvE^NN|Y6#Dr4sF149hIe@+2sTKNS5TEhea z|EAn_+uR3}l4Z)WVQ0oBddS*X$E}Fa(cOk^E%4Fjs1Rwjo`x}U?mVS8V&159vo3)T zkXVGBs#X65)&Q6jj~>5wkg>m@cEOsQ4azyyUwu_jEjVeXj@{>6sz%r9sEwQ_$@|8{PV)UQVFBYrp=7OBBdhRk2<+|=CAK&8+zzDqx-2m$6dof}K&mn){%w;|4t4b-O!K zQpO=)&Gsj59IAmRj_H<4J#ZbOO#o1-t4J=Xa&EcQ&wvwK(*`7tWQEo^?Xg#h=?}Py z7YFb*{pE%Yssr83p9?HZDUQN2Bf}elh+iAMg6A1{0y;L|5gmA1VV^_X z)F8T|8(LPDpHed7s@ycCLQl<;M2uvSuO#}KI)2J-Nl%cc=h4g*<;Zcg)Gv3(ty6=q zy?GFYU3IZw=f|r~JY-c$tHnpk?>XRoVH;)|wYkf);m0F%;|iMmP;#6kui8-K3{Y3P zvc(_Rc27L-#{24C{UYT>idm52SVfP(VJHc$@j(-fFudX!jc0st!yCFQEPp# z!sjjYPj&d&cJZ6{I$ra1;1|g6q~JmZ(-5GjQQtrTsc0VpvmF3>**l|(Qa|&XK#B6$ zyAPc3iH$}+ttHhjSLiWkFSBhDHeV`e9!i#Xz(TKq#xjZLW5%O9JJ`qh$Zpdi3wYVJ zEVSCTPH?YXZNl2i7*Eh~WL+?|ot@;oXW!qWl2gkt(Ej=;oXw;3R@JifB&g7AQtT!y zb4tf@AmKD<#HuWdHDKP+<+vR|^FZfm;{oGYUVO4|_Lr%Jm>43ttXFQJ#wTk>si<#P zW!+q8qWCC8cf2N1;{D~C{FR0aP6(}+2&*xjTY_1X6TVmc;;WZE-c&u8dZ zFk?fiyunZ=*$v#MBgZlp?fg|WjWImv4_B0NU=z>X&4&7v?igz9wOnMMWfd_KQ5@pV znI}&wa=8kNPKV3ms{K_yBNw398aO2eh&UJ+iI)?k#JpBAV%gj2=LT;~bHF$TuAH48 zL7km%Q#E;j**U(lcN#H*Si^^kJpNhzhD9wwQZF)fGHewB??BFGCuR3qw`sw zW(w;sGKbZsCfSzZ7~5LCsi3ra3Z9Z`(lG6LKgkN8kofxIik4j=KiER)QGR$Vt!o zH%Ns1=!?=2g5ocgM;wSS8APRGV!1HueL`(}*nIlkkU+yD+uKY=P3BB>Yc*^$J09~5 zw5e;!XoK~y1vYnV8bKPzv8~I`2f!2b*LGpBNbC2eMn1!yqMVjNr$!dvE z>9sjfZ+-?~3*JB~@HG&$Nt-81By~m6b!9;^C8#`Ke)Imq?cl7w;i98*ul=9=!3Iq- zp@xekGgT-ax#*z`#od<*Y%(;SpuOjlIvSg<4iz_v$%ciavK)`fLpncUKjshi<{in1 z-L3?4tju=@m%aaBWb~KC=pYf|yX=%;qLyftqSy&WCzBUH1Z9z5)sDA-(ne!vRIzjWQ<8aYV zcID_!`9@(;GE4UeKPd}qSuTvR@>W0Ma-j=#5_1!L>=H7Qt@+ouYdRM`zzO$7|Jn_~ z2%6qI)D%AXPACPveXwy=ZOOO;V)hUt1++ijt>(lTysP$b3RL&uNR8XG&;4mP+oudm zUb;|EfjiL4`KKdAR(q6(J77K2ERT#G3AmC^Ul(A9YpSooRE=i6}O(ULxa* zwyKCjwwX%oN1f*J4Q$^o#jp2!LnESXBRGo7A0)kTcnCJFy-Ciu9@J>brO30Q-jb`X z(lkIL5Lb{FU{7xJtGTg~Z>&EUtCw{#>9R|oYs11-erCs1~f_d~0k3W-oyU({=8dd1oySeenNzbZo#BiIMyYR%}=#*);(M=xuAok|u z;~$=tOGu8XMDPyqF1HFHuZ7$YFVzlXYUF|<9OFnI^czghY@>XlvsMks2n5xT zwCbQiEM_LPHkIR@{pRpRMyakCeUmcoqA2mhzHtu-`is7J(10=Ku0<+R&4|X zd^y1^8|wBfGx*9U(KH4oYSH+;A?)-y@(DdNnbBUwV%3$&T0A>Tjq&(jxC)0q;J&z7 zK#IO@r@hmM-2?Q#au)+g=}8^{^%A83jzxtHPnylI(90xpwN)EMxN#bF;ySF7@Lety z?oKfzR_-_KG>pFB4m!CQ=SIM^RfixUoV9OU83 zoh|-ne9M-v->0IQF%ZfO7TNb?#arFqoCU{C~AtIV#q1XI}@>xLQW@)xgGtTr*G%6>Qv69Wl3eNHCAVS*nmmEo~ z<@w6K706pl19iRi;e4T>Po!v%Z_LTANhmt|`Clwi&B#nu$#`uGJ^^h2f_b$rmBYS4 z+Oz$lY&RcFVcxCr?}BXEJBWPsAk7bOZ%_m&04OWrR;xxaR!+@6YfGWw@x|tz0?k@XH0y31I5%Qi*z^x&4j!1OrsOiaC&)JVl!Odlz+D5m zlK9tVSqY1>a%`7;)fGf$#!nZSE7Vqlzv{m;CWVrFa+?%*=(NO4^)<_J?&e!|Cfxb5 z$*z%$KR_Q0!+)|R8L`*{CRhZ>!b;V~a&NTF*fnYK2avXf`5m@|39*!kvloeIR2s~C zns#8>LFiGrGtKoV*14q5&ymW~*Kr8$zgN8}e(XA|PMxuVN7P?L$a7yvbnFc{oSoT(o_XN=H z5diCt*y>en0NXJ-cz2T_seJ#DpT#4xx{6`4Kxa*UOZ?IddjT_O$>I);j;hMbQrU=m z)GVzbHSMk>y21qZ%EWOCd+6&E`7YTT5hB*9UgTw%Fk7P|Css%%t~aIw+Ke^NVVk*Q6=!Cg zt)9lXBz94TS!R?yh?FOiNkt2-`3AamP%2M3IdcN|=9ntnizIi?)m0Ae$SpRIEBUL$ z&|Xi|&g;QFrR`j>bv`RP9qylyuLvFQo+31NZm00WLJSZ9JwyT}{}1JNwc8PGOJS(| zp*f8X9gNmOqZJ@~rN08%g<(}+0Hf9!lCynf>S#tg=Xq_D3>BTyFTuH;Tbv-dM}E5A z#x+BhBr-MnHE)nmFjG_luCoQYcdSnH%`j-aS@|fQVp-8<&{>|tC8D>d{95ttw)8FG z@VKHpe(~MMKrUMZca$*?5(R?Bx4OBEMpX5cp$n4F9QPC^2i%P^M#*m6jB422Op7Y=XxG=I#UZ}aEBej%y5Z47Xpf4qMY zWUIW_qxt$uZ_Ozm{AFOcXo7VSBykp4iU>@ zX`C+40T;9!{wy|g;Q`P#R`?hQnS1}G`klb>n%ltkHxP~O%*UF;Sdzw1{d>yo^S3u= zVL=>9)k(oS+5u#?p|!4m0~LN&%=otm;N@#?077uG*f-G)qh{0I@|e{K6L1c<(TWLX(k=J8XWtzp8C~l4n^vO08j0|QSvLnZ>_9NS1Fm}JDMstau;Q7OG@yaTM zC5g;QKQW71@gaQ2q_p0l`!y$@Xo$y#e#;iW#U9~s%PJ~-+nPPqY2!W#puw9J`=8u% zutME%eYY9JIh*mKHkD6|7oOC(Qck_WtH^?xY1DJLwe#LO8>^B%s-PTAOT2ahdw!3p zDHdASnT$A+^yv~1Nc;vny#;MDvo~X=-c=1v@68(8f-`5TFPighHd&U6CU_Rj)pm;A zpBVc|w@%e{;X6>c;_1Qo=X6pCw*N-9H8aO7X3CEzk1(UIWwU$0E5sYaHsj=y3N$1texce&LFS@+W`eD^4sPm zJ18U=UFgdcf${n4d3ODSLrDld{~jJ>Ak-gV@ zn^P?`q0`0@_T~M6Zin2v9h5d+!Ozf5);uvuw^oFy)5pgl=vL6U~^q=j{p8)M=$cZ?tU zN=9PvmQfxnq7tSh-Lu6mmVXS0&`iAKXsuQhT|z>e;WOQZ@oFOWA<{woZP zr<|RuWC?aiz9w^Ak+!B8L7s@6&CUCL%ZLvmYcBGBp|jY^{1FjlNga$6{8n^9qE!r5 zPCU?&65Gnk(r2F)S9u;rOVGeP54D*@%eVtWU9+TC9yCBtMC`V%8=$EzM>Jb5Iz>*| zg25Q*+A-=`J>!I#@iK;(H01^N@U+PU#Gu?|5tBaxz9xna#ZXVH!@F~t4GT(~8rcXr zAZX?b!&QA+6{!)vQ)5Y;1edH;*T4GcIOiStd+=L&4Dp0};o;qkCcIR^uKvL^O(S4( z?ppl;2CbAbTyM9!wVUnt^LQq$8l~K{&m*Egfd=c(n=;e|6F+o|S|+~5)DrEd@pbHc z89wsL53!&yJh+q&O$NzTY^jIm8kRfA;=vAAes;s5xB)0BN434x66uq7b`hdr^fJMC zC7`@NL>>dZ{IavVYDEu_P)*j}KGfvblW<#4Qqzy1VBDeKc7q&u5rfY51%V0HZUX?6UiMp~1WhuH2nXp*9Y3 zwC3IJ=QDnIQi!xvkBe5v72-akJvrS$b^3wAkI=};Tc=VsYPHOZ+^3GDPV=kl!%YC_ za}I*~grhIvMhDV)i@7nd-3STw)73jwez2>q@OCoVcP;$ zP`~NDYdGK$EZhI%D8y9&a0Nbt-qC;@)Cw&UkIB=ts}IuTs4{w9vs=pl$yovtSAjgp z;93!6KH(8mDjkZk^8)HGU%XC5L%kN8yT+b2^vn*h5RF2?jQh~)Vdp9%|6g^k8w`{yB2Mn z!3sH|VyokP^MqW>-Jl+NOQY69n5g4B2}^tToL{$muI*dNiZH#~i=zl|%sTuek)%ma zNynSKMzei&MYmThExjDuHEzhCJ$u~8*P(MrdhP@Ld;~BL;r~wj_%G>)e=suH?F+Ry z)lMD{Q-^Ki`VGD1nG>Zja79lc@ikRO_dDLoM{c?=(Cdb?_tHGz*@6>UAQeJrV(!CB z<&$5E3K?zI)|$T9h^UvNnclnmA>8KUJIAgQ5^5oW;Q|s&(+QO`Z4x(=v%;*L*at+P zz#>?A@&YaZ3HaAX#7-zM+epuh;+LbDDkd-2$|jVpWIx8vR28HfDXPFLk1)r5|7wh> zi1Na7nxInkXq`_1{^Yi$<`-Z1wc|zcoE7E6;=}j$NXucKvHU@w=Qb(_eAMF|#xt`g zB}{SOADG3cpmD~yncZr8e?W%KLMC=?XN548Z ze^xuPI)U2jcDFy5s+Go?FCqfO@8)yyPj2E*>X-k=dg$NFyYRA`yN%2~5{I!pkial!8<462RF$Ag0hNnd_f!mpN`vE{2MHOd%fNBE)Kki?JjzfWwiii-v!VU3@CmkA1k}S_0s(H9=nj*a(tzy+}@0zOG@;I@qMD zl;imm=15_DeNz_UH9WC_VNYIypBVMuX8{|BoVJ|uvTCSw#9iMjb?V{QuK-shkHgi9 zEfUdT`XSb~yesI%W|KdpK7UPvP(rL!qMlR_Er(LtKwejd zRo@H(u1ErhKv~zdW5PbJLN*D|Zw|rfP|(QbUR!#nm{D%fKlhhOQ3-mcO3cAk`vzCOK3R#75(TY#1He;$K|{Fxxq-94 zN|a<-c|2{5n7~b88j9;ZL)ETJ&o96U9uP+fmKhqOpc8Nq_!f@f(%jXHGkC?q8=g&k zQu52$bUVxN32=(33#kiA#owMXTrlC93b81?h}t^>PII02>D0^kIyp+qM-KOxql{iF z87jaGK;Df5x;j6d=YMSQKa5WrKHr^wf+pB`X;8&jC+SpBlEZV!x>Uu$bnF48^Vc{! zSW%NP{kpwXGjwJwP^pi%r~dBeaQEl;|D8eJ^i>4V*78{c5L8rvb_-lMAYlk_a9NyH zpv{O)zkxEMe%*KvPvY;u2N-i{%lav62*?$t!PvaPkeobQ z39(c*ibxNk_fQrQN;th5uWO&N=q3km4b1dAZ>ih=dTJp-J>2K6fqmFh=_ zr!0zW{dn-aHo6063i@=U2+A)t{U8k6xcQFoGkeXvJ6j#|{T}(x{uauApIAsO2ZGrS zSrVBQ`M%r)Ne$(33bvt>x))A`-96*SkexRrIznAnOxxTLJI6hyvZ|bR50l?w3@Ad_ zW=`r_zQL8D*sG)4JBiT<09Q4b=R}!*e8q69R_JuBuz(m6^;LU%cFkyK?qxppTzb)r zapmt^^ll#mVD|N*W;Anrd?ng9E1RlZRZ|yR!E3LJvqmjmFq9*Xlls9$lVyWjJ-EHE zJKakA^`4IF$lvDwe}+nMo2jm4*4L0=fGx!PnKWeLje>;eY#4>PC*Z=`YY9F~Db<;m zY{7M%zTZh6lYFfe+}#nTnUg>I{ki_LR~Rwn(RtZQwWw$HjZ~qEqtr^mlqJmFEUa5m z$uPOAbr>6aE)UtC!M)aN!@S;W7X~dy?S;83Ljvscchtx6827-1Lk6>Knp5Q)Y|Fl{ zO3B)-Z4w{8@@AuNYpcxUigU8UNyAcMqf=$RTO+8_4X@_p-oe9k?WA|91J@!NZV| zm;u>i@M8WDQ|2KZJ^~U_qIZ)+Kbu|q@aTzr5W%x(H(kpqkDE~^3t3I|wno}08wJ^i zckDtw8Cy~C;Bj;8`Ny~#zs(p2?}|!GzGMpd;NJ0iK}}bsqn8H_?~J;1elcYiFUMt)ZE zY#;Fy3+9rST=t3rm?IHBfC0q)SRj_9$vbp5JG8=(aiAJbxCa>*ix^}S16j<*upY%u zdkQK(Q>q%$63KIZMpz|78TLF5M}mg=!?;Ig^^? zhw&dnxnADI&eUbGttxI=BSekt9o^Ns-n(eQFCf4>bc{&qN!94e$4EO;E^hKoCVzbE zg8D1nfen?MUt%OhZf#YuT-NKWQ^o;(`RXmyBO#pw-6{H7sLw}_^F7pmn2fMSeM(@k))waQA28 z?zGsU4sSo^Te99tvB>Gu{@Ysc*LVQUt$8ArJIZ`%$rz|K%c5w6%?JmGhFQw50p~bk zpYOp`tUl8zx6-2}Q@@7x2{z2?ozmZL;C}=Gyd^;C8CjjHbD37}K-&_R`HlPiYF)F& z#}U*+ciupz7%Yd<=8s$?-c|J^CwLzP*8DaCxQzk;em}s{_^K{{c~u7po4%z5ED{0) zNdYwocfhL?CjGBoQ}3L&pyDL=A(MiT8_*v+-2j&mU)RxtzUd~T#X75}%fp@|n$RXd zwjIG2vQ72~8YzFvr2<+Af{AZ6Gu|{^$_V_qm3|+we|@zh#xOG9!`jueDSV7CfDnah zfAXYxs(H$MwG`tmbv2uo1;DVFOpgE<7Kt{KXTNTThv{{$iL-KNstA}ZBz-I(6~zf0 z2|Crhq=D0b5$m@g18z8lo|(ghy70-`0K?Vf*TYr6J-7$nzapT&!UPTdd1I|>X3n&# zX6DCHI5+*8P-&;e`8l6M{Rp7`xPE8n7rDzH_qiifEmn4fs|0_%eBav5Ba3%qGdUBi z>wrR+gV<|ogB7vok=~~Q&u=$jjYqV(^0z?i#~X!i-r^R~T$1z!NZb1OSf8D|`4 zz}Z4vH?!K5*->zBE}T8t`7v^v*5AhZe{SDfSq0o)vW>riUdaGG>F%7PO4JGR1f$m6 z(Ki|3FC%nE7i90a(0DBw+CAuZetUtp7yA)AQxxi~H_?X!ENJ;6H{H zCgwRHS=M=Lf3;EW!7h~|t{bs7*N)OJpkSNoc0JdsEdOa1q5#1&S2Ct_&jVlvF16mhYH_$l>|Y-Z=B*!XA``@F_AZG=CdI?c?O?FSbv z95(iG_v-U`EnbD`vG1C|T0t>2iZ8KG2CkNX#(|eBwTd_foPKt6IRidP6 zPcc)kie&hb+*H(lRTI)IkJxlA4y=$>t+=`ooExS^k^+pA;i_$A*u>X9t_!E$-G^L5 zob#bAwvhGr<~c={kC5g*4VMctjZ>JW^oD0P1Tas++O$>CfKXCIl-+3@99&WvW2+w7 z@oLU|GICHd#uy-{BNNtKloF{FGDx)&DP5s0i(@7>mVLeX4_M*$+)j|Hml zXL9?BrUN{GBtYXU2fXNGfLF1o1}0Gy6~JGyM4 zsNX<3OIBB?eYc8)fOyEr>d30wXWbRc(3Qxw9=Rr<*0am=n4$0g=ImLeRtDO{(v7a3 z&2Ou<+qAo{n`h@Sjf1OYP2nJ6WLOvsuawfxA{e5s~x`D&U7!kKp)fn*wcwE?GH-21h0j1WL=Hc;$ z@82Kke{Q8-Gc2zb!q|BP$3|#4OcT&kwSs08;5(2DO8GP)p%zv^@0?78+eMXG7P;3q z`w3}1!Dg?C=d_UbmvQ2M#fv{WVukke!z{sWWdAb^>4)_Cr}nSBDZk>IY>O&o^|tZ2 zEDgUa@u4Z~8W$N6ER!hl&pwtmzKU)29~-0v}yN1fcl=7zJ76`lsY(*T* z>6S*gxvmq;ypU)4QvB6B0iEGhx-`{yF^-it3u*p(o`@lRZ0T)<;`-ZG)sHyaULS0P1M!-rfE+eIBw31VnGhTF*eH;QL zj#*NN6gF(aU1BLSLL>+7vD0N-$gBYB)@_wPQpgTD1IdHS_LPKJ}b_OX>f-&BQtC)BbswvPO+nhTlD=sku$6U>t`-OFhMq zM6x@(infH0wci6$l-KO}o7|1G!}eDdjiGZrO0k`xmxl2o5&2}jUb6|v1X4$=tL(wv z_&KJoCnwo0kBf`@PV=&FC=^DDh*!bgOuE*^)|d(u*5d74liB@~s`S#u>#h)=tn%t% zOR9$QNH^K(gy~$0QrZbrx@vmQJt_>;(R!jUC-^+s0C2f9_Xr*kQJ>acf&lD*lAyRH zHu5^D6`99!pW;v;eGgSk+>l$gTWcku>kq z^Pb#8G{CrUi|cySZ01^jrlOvCIloyLXBASEW=dJ=;<&2e2Tx7##=OcfJ)Hj|`n!7W zZjI^rmW>rHF{>OMbukA=OG8=Xmn3YS2f5Sllu2u7#rBL|eTrW`vGS=E%!N;T6nAIS zDRO{jDx*wF>4!yx*${cA>Mg(*_#ne*YpgSCAQezjPcW&5YQ3TrO9!PqLqQlpZ9%mumZytioZ`LCLWhM`Ek^Z?2{4xbv-oBgYOVHl z-bl)KMcmSqRA-6bKm`fGjlu~2=R&96;~Y)Q6RqJ8GxboxA!1AiVxSrXlvvRl+=P4_ zrXOLNySC?N0sRJF*npyn3D3&$=P#P1^A@jB^!Ieh0KpQW_g&>B9-N|+m#V( z$Z(dpj4na<1ewqMWyO+yppf0-1|up-|KW;CTkXLloHoLR-<;1Bi;`SKmOBqQE~-R{q{0bsPKLexV3qn8vDyjC-GU;#-_>)+8{(-o!)J%wCa z7Bi{O9df(uaPS_c(}O%};Hwx&gvYYS493O{LV!(;s=y6qMM=Ti*7dr*@^Afx|B*gO zARc5Rk&dp{g)gU+r{=rIgyO!-I7|V1+)UD6v4te}WW(JBocR{v3(3=%#VC{hlNe3} z0au{n@oRkIAHg|n%D&EZ5Ri52I6*F-QxWq50}`Q??7AwUY3mH!MGcmT4hxy#1`;X6WzV~I$!%^y;QE2>6!W+4QUL^ z6V9sl*a)_GnHF{<(Jvx4G|K-OJpRYel%)bV-U33`D}Lf)<~bsc(?{Lu23~vWC%#J_ zPqyTOo|voMAq;soH}^D$N6La_ZPY0hb?O&2#@mtz8^1(`Y{8c=Em&{yy`kgVu>%ZP zJ!B+`xOXbHklWOw$76N%nKHbHwEz{4E(P1jX93G8N|Z*we^#&*qQg|f8DsHk7;U?$ zXQov`^rbnU&o1Q5$8r5m7z!n|z?KGROb$HY#b&RHJ87_?^-+D6gWoH{-(UazijCjV zB_qMm;w5K?;>Ui0{j%~5R&ea;y91TI`g7%5Nin+%?ot(H52TqAq~n!?oVqpT?xTij zVhRzg{~GW8cMQ5SAIR*v+GTQG z`g*d;X=T2??wWDWl~%Jv6J9?zMxufJ3AViQ!E65yIu$YLPL%A0H8mC*Pc}>5L>#KU z%;D30=iC3R1xT@N16wK&EF)YmUDf+2i#@DQH~rWNTf56J4WwF9`^xh>H=7hG$`6u5 za!qLzMlzE()RnyPlxLS?T+~^~^BBGC-o3i2R;bYv^%e%Gasb|DX{s*;9gl$`G9sV~ zv|PyI&z9%!wYQ@lMqAvUxsQ%LFmNFD`SddE3tEld)>YvI#%%LY7)x!a)7OR6Sx?8e z7@@c}3TVxNJ)`xqsp}KSR(a;G;Nb0qalZVFw}D@SJzF0d5PO8Ej&RaCXsA?s8N8Hz zyVGe6GmBODfcV}*=|eaD>?fd_A9t@hk0m)|+2{|WoQ1r@;_Y9nYo)u_vP8&B+}ZOt zY6pVcB?RLjU^k==vn*K`@t{PR85?0D@Xt!-z@GRG|j zX)Oc0+R%imER|`nj$uRKwys@u`cXm5R5gtc2lB^d4cE zAp4iUsLk9?F(Y$V-Yw@?_;T0gV`1T%lBs6Mf4+Ic?BS$cH1ZKTZax+0-f zq-}LU@2C$=Ed$6;=jJ(ogR8&CGv8m){{P}y^2GE_E#E-*89*WVcAcLY#y?gt>B|m2+L=3R#d+ZDtrQPe+fc0v-ch)a zV}4}R)Q?TpGet|FRb01yb#9b=geQfKfOWxaCk2xX++9zcg!HfM<5jjQ`FHb zs^cMvuIBt(2aSCBw{s6Q&S^qNu0(VJ_UaQa{aAY~If+qq{GO3R);i09z*K?0}|{Yk?f++J2#r z8!^S%n;$hq>&PS{wvUG~a6MHM6Vc>3h1!B#j1KM|b-3{(#VhVgk0C;i<&GL9AN zFl^>Sp0O;!f02R<%jR z?NgJA(d_=K?fX=^3u8p@l~n^(%BI%Ug)%1Kz3HkgC*%M*@&GpI(ciGU-FWWo+|DtZ z_DOQs%AqK|KVwoVMr%U%)nJseURvy()P+fEbJyBvve~tK&7({a9pX|GW zD2s2G>}Zpp;%TJ&)pdsm5lbHda5FNwPQ6Y&kr19)aiugn=!jiebLyROT8jsIwYZMD zQ6EY7M05A^Z81Gh4<*_PI?4^Ey9XxPS`Q$2&ixUji%FXgG>ZZZP+4r~IFs!15#SOE zp6@>=oP#$L&RwXm{MiWukUaTG!hv6KR0DaTLHr0Qy10sv4PxoGpeE)nMm9PLw5dn{ zZ7Nt==7QfrbFn!YKVO0Xd2g-q?C5U$hI`{|(;cP1mZ)of==qb}==rZBW&RfP{9REI zF*+lC%6#A%M&EVeber8L8DW=cemJrG@4V^F{s-RlQnEv^()L;loAa6~i&$r}t8EbP z5hX)TS&s{E1lZrs9%ysPYB;*H_1D4td!TaKfZ3Wxh|@tssZR+tP(22Rt4X<4ZB(-I z9_5sE1Em%^nSOX<#Q*j>|Nm0I2!k%T6TSj^7`q9=7b0mS$Rj^+1kH!Uav~J`G3+So zKQm~ag+*TOT9bS{NhEXz^YqsyXhE|+5Ufnd&zOB>B*J+>IoSSe=EMvoxq8=1Ns2#|4EhB5UoOy-Ys zEHKOp?BZLCX-#$)FB{Nw`Gvu>xc;_I3fKz`!$kqCyP!t)njxgZAe!$P(Xz^9n}%86 zolUGdJ(u7A`9{X)SQbFBzyOMs4=@031fGC41ey%L@1U)yxr2Yure};!cQr7MZof)a zvoZ)E@6=!~Y6gnIZ%%-f?5vL`90O0E12P67E)SZw-a1OgjQfWQF`9b9N^m50eX^oB zU5~tY6}rdqG_!jM<{}?#3>f~B%d9l(OPo|blD@=NhCWbLP{h%HxLvndgm>CEc5jD0 z)vYqk=l(J`>xtS=7LNmTbeS~c)Y_j#yk_4SGdAjM7wbHy82#(L|M$XaIf(j<y|w|2!&82~v;B5m z|Hr|#pmWlhh~N{ii0h=^s>VP|aQRu~K{aLopn2Px4CgJUIZo~0e`|l8kdko;wvH`2 zJEs9h{i0u+M8qR}BVQ}9>gK^qe3f}{r8|9{^DOi_spKUv>puSWwi6woFKdc~?556Q zbn}Nvl!Mf53MMO^RucUriPC7K?;wi!q%mLy0_wBf`!sg&2mZ3x?8A{*SFXX76V-=+ z85Y6x!|$Lk%5n(bL7_}?$X~Ktxq{zHTbt2MuMF`nybLO-6jAkjk<1cpNuEtKzeJ!T zI%+)Pv(4i)I5n#}?Vh+m9obE>L?VI4r^L+NS@kuvoL2m4rVgq0`W_M-pEP7gGyM_k}_dAl4AGlu5=-G{Zm`o-F*m2z$jxC8=qS z7)Z}!`$JqiiCeGx16PNy6ss|6U-KlM>~&L~gk(e1jl-5j!ZQ84KNzfCFSHq*MYP9- zggP#=(s4sgu6<|-9~Xq@FlT;&^z84No@akF^1zCYSIiKUfwD$xat4UPU-*nJmp?pFN|GzAW}lkv9Fo}YzGL>% z`hA3<>D(jQStZmakvqsbK7zK{n}iibnw#oeGj(-QZBr758X^X|n{sTvt8UK;J`yr; z`)EefuCde_EV@7Kc;Q%;IJCJ0E0Hv_fN*qTzs%0;*v9o7NZ99x5etyoPBX6g2qNX1 z#+7Kyb(62;tRHB^nnCK+rmT6QM>~wdn@ZqLVYe;L@kJl25U2|xKP!( zRjIXxWoppG#)h+#LuhGiO-N665Nt&FyBqGg2QGldjmD^?PKQ1=xiY#^FRnk8U`q?A zn*ORLHuq82E1CphK+8f|EEe+}N6H>1S87-ggjlr7mI|eM2is!4 zDD>|_uf@%X4^iZ9qOJ^WQ5h%kjS?JJa1DQy^5%|!NVB*jvnlV9lKgInYvwU4*7PRf zmP7shk-T@-^+fvKgVFaU+^-*blo5T|TM@V0 zBb7PpN({AA70KOH;Z>q!Lm}ow2sK+GcUu0|Li@oCA~c&q93x*sc zYE!k@gOkm;rut@u+d9~Vbn?Z0BGak%3@AMA`$+2L13T$vkOyz-$XRo(?w4`H5W>d} zjAnyrQ{G=P1{q>~Jnj%`g>&qc<+YX{o<)cUxWuQ02_5N;dNnE36yFilue>&Cj0nXv zzxP3XW@hHwhQHpIkH-GW4%nJa6no1MM~#d}c1RF0P29oIm%peYCjsT00jJJOR8h*k zPiM|>Z_0B-S@14X9&Y7(kPz$w4X8gvYaf-t(zo8d z1{N(@Kn-i~I|x+{mSXYF39L^8j_tkCBkh=F*te=!_znu--$_Z;*4`+Vbm|-AA@1jO zSdkrAtz&JO!z%;M=wh2!#)>7ml0KRVQJ8@EQ7;M;v2DROgkB@`Iv%)@4meVhYzotj z&FoIDTC)p0HM4jJVJ+3eV$c5SF^CGJBKdYAcm%Y9bZ%*Tc$OHIs~ zmWxjC5eEJ~{>8ruS`eNojpiM_ad}XwMr=~;JL&|IIoG6KON`ZvYtTFmV&1WKfC;gr zxT*`Ox0~GIcqjGF*g6>$ag^`-kDMC@v+7ck)H!B!s!Q@=^{!fk7`Zf{s|yV{r%&z< zJM$l6nsq=wcL=;}y-#^v16?nZ4j3K&wA;;_N3jZqAz~d~P?_U83kXZBen-Awoa@Iue_m<}(UPlXY zYZwbu%?`DpRx}UR$31afLC@1zOD#BK;vrkB6>nf~2 zPRtC)zgD{Zl=Ftk?2%PQ0J=+LY53O#CD5j%AcCf>znknrumTGUq*f^z50a%Z-BqLT z&h7m-OSc&Si=H8f$T&-FnJgP98+M#wKbZG!X0qs9wnKU4LpxUXw~_O&7;ju7P+d29 z>^cin*T3*UrdGce?QBdr+0GGUs3tN19cmh+M0rnR{1i&6+pswAaxaqrysCLvX~pr{Fc?jnzs>m6~b3p^5Rn&5t5!A z{LLx~XSP@@*@U;9=p-+$)16vu-;HD-$}Mx7wv=sY zl`c&TW#fQk{2#}BGw%O+KWkA+Q!_e)12B>?vR(&3NmuX1hTd)#_--7E~c=`nBCA2LxS z(kG+&Tv7>Ed}EKx`2zt4Bu*qw`}E=XBMakVPHAds#wFEoN%^+xORX;h9!hNOmBQ!G z)Q^761{IH4G^7Xf#+DQTPdiBQx4m$BZ=0lhMYN_?BZbI=(XWWH#Z1vK+wuC}B|jxuS+~*IBV?1Mrrx=Fx7v zy~4BXiT?BiX)6N_E-~lmS1a$E*F3H#7!V z05;c)73ZsPV2Sxdb}ILCYh3UW^czz19| z7Vzq6=z4U%ch$8CT&w^C3h1s}Y+4NcXb1I3^cNk-nfhBu{?SYLCqAG^a}{g@j6E#HIiC-K~>>sJ8O ziUq92ObyFX0{~R!O%60(fG;dkVW3IRHpNyNulIWBr|14eUApJtF6C!mi<>};%{YozCWo>{fYK3 z{!fi8e7IOeY+YCV*#3AiTXJCrQ)%i!a0dTzi+T#>*Bg^QJ~zSzwfF32 zCSnofJQL4t0TS8>6fg!+bf3dA%LLbuS0__?68#AJQ1|vO%kTOXN%`Z4reJg|h+o~0 zdYIoNk&Hn(m_%Ex1`zK8B0=aQ)XUZua*`&+OXX01X0ld=ono8Tk)4ic>Uf{eR zlJ%n#D}qY-54W8)%E3rDDEq0GNXpu;+DU3CFD$H0#o+>=n@?XTCAyNz)ZDVI2%w!Z z$}B4;X8uf@8N$7d;>6Wpp|^M^Kh^Ab$_zGIym6gWHu2gD%j>vJZRqIzQP%N8ny5M0 zsWI#=R`m<&`8RH{R~BNPyg~$=i`&69xt@qtXRo*-L_Ua^%et*(Miqy3Y zbp@;8?dO+Ve58gRkTGI=(DZc0SEmq^-mVVS3#GuRNexodvDx0ic`xLNf#h>x`6l!x zP!M9a7@9Y&6sgNGalx3NmNdRi=VfTmd(F%anY*FqmuR2^A&>S|FusKksltQnv2XL? z$IaP7z2PFHue*u-6LyI}xoCn}p3gozkU-!KpVvKjN6OI8AMG5q8i%0AD!Ys+mZ>>2 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 a!K8`f3QAJis9)P|y}_et!TsMc1^y2mJWH(r diff --git a/模型/robocode机器人战斗模拟——软件模型.vsdx b/模型/robocode机器人战斗模拟——软件模型.vsdx deleted file mode 100644 index e55537bf9855731c97db94b9e5a444ca66e1d7b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152202 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 ZxJ!F~db`RK)6vROznMEH7w<=n?~K3e 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 >;HrwK-tj>V;u1>R<3<> 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

      &5yslCVg$%Mwh>3**sx8(vr29wkXvDd=R=%nZv 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

  • 2P}s(e}7)7mJD8r`>X#0PS@Y%w+s`&Px= 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

    - * If you have not already, you should create a {@link Robot} first. - * - * @see - * robocode.sourceforge.net - * @see - * Building your first robot - * - * @see JuniorRobot - * @see Robot - * @see TeamRobot - * @see RateControlRobot - * @see Droid - * @see BorderSentry - * - * @author Mathew A. Nelson (original) - * @author Flemming N. Larsen (contributor) - * @author Robert D. Maupin (contributor) - * @author Pavel Savara (contributor) - */ -public class AdvancedRobot extends _AdvancedRadiansRobot implements IAdvancedRobot, IAdvancedEvents { - - /** - * Returns the distance remaining in the robot's current move measured in - * pixels. - *