From c663b877095cd719d9a74cf5622ac8071b89611d Mon Sep 17 00:00:00 2001 From: LiuMingYu <734904515@qq.com> Date: Mon, 22 Aug 2016 09:07:01 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=98=BB=E6=96=AD?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workspace_robo4/.metadata/.log | 14 +++ .../.projects/robocode.api/.markers | Bin 597 -> 597 bytes .../.projects/robocode.battle/.markers | Bin 933 -> 933 bytes .../.projects/robocode.core/.markers | Bin 677 -> 677 bytes .../.projects/robocode.host/.markers | Bin 2415 -> 2415 bytes .../.projects/robocode.roborumble/.markers | Bin 293 -> 293 bytes .../.projects/robocode.ui.editor/.markers | Bin 1642 -> 1642 bytes .../.projects/robocode.ui/.markers | Bin 1066 -> 1066 bytes .../.safetable/org.eclipse.core.resources | Bin 1188 -> 1328 bytes .../.settings/org.eclipse.jdt.launching.prefs | 2 +- .../.settings/org.eclipse.rse.core.prefs | 1 + .../org.eclipse.e4.workbench/workbench.xmi | 102 +++++++++++------- .../externalLibsTimeStamps | Bin 972 -> 972 bytes .../org.eclipse.jdt.core/savedIndexNames.txt | 17 +-- .../variablesAndContainers.dat | Bin 19199 -> 19199 bytes .../segments.gen | Bin 20 -> 20 bytes .../segments.gen | Bin 20 -> 20 bytes .../segments.gen | Bin 20 -> 20 bytes .../net/sf/robocode/dotnet/host/Module.java | 2 +- .../sf/robocode/installer/AutoExtract.java | 2 +- .../sf/robocode/installer/AutoExtract.java | 2 +- .../sf/robocode/security/HiddenAccess.java | 2 +- .../battle/events/BattleEventDispatcher.java | 22 ++-- .../net/sf/robocode/core/RobocodeMain.java | 2 +- .../java/net/sf/robocode/host/JavaHost.java | 2 +- .../sf/robocode/host/events/EventManager.java | 2 +- .../host/proxies/HostingRobotProxy.java | 6 +- .../host/security/RobotClassLoader.java | 10 +- .../sf/robocode/installer/AutoExtract.java | 2 +- .../roborumble/netengine/FileTransfer.java | 2 +- .../main/java/tested/robots/AwtAttack.java | 4 +- .../tested/robots/ConstructorAwtAttack.java | 4 +- .../robots/ConstructorThreadAttack.java | 4 +- .../main/java/tested/robots/FileAttack.java | 4 +- .../tested/robots/IncludeNamespaceAttack.java | 2 +- .../main/java/tested/robots/ThreadAttack.java | 4 +- .../java/tested/robots/ThreadGroupAttack.java | 2 +- .../main/java/tested/robots/UndeadThread.java | 2 +- .../net/sf/robocode/test/helpers/Assert.java | 4 +- .../net/sf/robocode/ui/editor/EditWindow.java | 2 +- .../sf/robocode/ui/editor/WindowMenuItem.java | 4 +- .../net/sf/robocode/ui/WindowManager.java | 4 +- .../robocode/ui/battle/AwtBattleAdaptor.java | 2 +- 43 files changed, 137 insertions(+), 97 deletions(-) diff --git a/workspace_robo4/.metadata/.log b/workspace_robo4/.metadata/.log index 73d3f3c..e72a544 100644 --- a/workspace_robo4/.metadata/.log +++ b/workspace_robo4/.metadata/.log @@ -12,3 +12,17 @@ user global configuration and to define the default location to store repositori not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and EGit might behave differently since they see different configuration options. This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. +!SESSION 2016-08-22 08:10:39.779 ----------------------------------------------- +eclipse.buildId=4.3.0.I20130605-2000 +java.version=1.6.0_45 +java.vendor=Sun Microsystems Inc. +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=zh_CN +Framework arguments: -product org.eclipse.epp.package.jee.product -product org.eclipse.epp.package.jee.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.jee.product -data E:\2016Spring\robocodefiles\download\app\workspace_robo4 -product org.eclipse.epp.package.jee.product + +!ENTRY org.eclipse.egit.ui 2 0 2016-08-22 08:10:45.437 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'C:\Users\Terrans Force'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers index 52c87b292c78857e03ca247cbdc608ad271156b0..cf728b1c9fd1074507ba4551cd70d4804fffd6a0 100644 GIT binary patch delta 83 zcmcc0a+PI+Jfl2MX>n?iYf5HGVp2{jBLf3Raeir0a;j$vGXt}iOUPt9#t-TQ)G#nG KhAo)?^(X*Ab{Yc! delta 83 zcmcc0a+PI+Jfl2Eaeir0a;j$vGXt}iO9%r`X>n?iYf5HGVp2{jBg14n#t-TQ)G#nG KhAo)?^(X);b{Yc! diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers index dc957820d786fb2343144398ef5d0d63f7ba3015..b8400f51d9432364cd49f6e5760f2348385de1b0 100644 GIT binary patch delta 120 zcmZ3=zLb4~0;4=nX>n?iYf5HGVp2{jBLf3Raeir0a;j$vGXt}iOUPt<#vg>#Yz|}6 RU{ohy5Ca2a*n;{0Z2*DIBbxvK delta 120 zcmZ3=zLb4~0;4=faeir0a;j$vGXt}iO9%r`X>n?iYf5HGVp2{jBg15S#vg>#Yz|}6 RU{ohy5Ca2a*n;{0Z2(_QBbxvK diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers index 789700460e6e17d2b13b3557b3393d450c939f22..5a5ffb364aadf7e284c9289c6dbcdd895a5ff043 100644 GIT binary patch delta 118 zcmZ3=x|DUoXL+8|;?yG7l+2REq?}Yn1_qAe{L-T2RL>M<24*jpkjX-fX9=qL$Jn4w Pz#Ik!#;^tRe|rD`zGo!Y delta 118 zcmZ3=x|DUoXL*j|{L-T2RL>M<24*jp5C)#o;?yG7l+2REq?}YnhRH&VX9=qL$Jn4w Pz#Ik!#;^tRe|rD`o986g diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers index ca3182ca275e7d69173f8757c535529020e91f71..9af950237546736e4e997007c92f4f515903c7dc 100644 GIT binary patch delta 363 zcmaDa^j>I#HlsXGX>n?iYf5HGVp2{jBLf3Raeir0a;j$vGXt}iOUPs|#+m8_)G#nG zhAo)?``_e3R+GtgOjk9DQvb(@!EbUQyV2x4=F0?Kk-+kbkebbztlWgXGns8GL4(rS Pi7;p)$9Cev<I#HlsX8aeir0a;j$vGXt}iO9%r`X>n?iYf5HGVp2{jBg14b#+m8_)G#nG zhAo)?``_e3R+GtgOjk9DQvb(@!EbUQyV2x4=F0?Kk-+kbkebbztlWgXGns8GL4(rS Pi7;p)$9Cev<M<24*jp5C#Uuum$t~KLY@8 CrVo<< delta 46 zcmZ3=w3KPWKXs1c{L-T2RL>M<24*jp5C)#o;?yG7l+2REq?}Yn1_lPkum$t~KLY?| CCJ&PU diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui.editor/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui.editor/.markers index 07c5f24f8032c79d1de2c2abfa5bb79f53480a5d..e8c6943e2a3c3a05b502d5053a1b026d41c116ea 100644 GIT binary patch delta 327 zcmaFG^NMFe9HY#{c+JTwES2&+rNya5t|^%%iAg!Bj0_AM#rdU0$*G$^MR4DIZK$D37X@^JeQyvZ`L2` JMER9N2mm+sUn2kj delta 327 zcmaFG^NMFe9HaQec+JTd89U@Tit|g0l2biXm>HP8TtXOlN{dsATvIYj5|eUL85t&5 zFfAge#*%p|K{aogn+dAvXPIk4zMjA08FuwP(+02xLQJ+ZotpxFwH1q9W2v;I&g I%6<+Z0Q|FGR{#J2 diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers index 5bc69858e43af837aee021a4d7cd914673871570..f4be5ab1765d8630bddc8ebfd4f2c9c95573b324 100644 GIT binary patch delta 219 zcmZ3*v5I3t1f$TzNX^O8jA8OTrNya5t|^%%iAg!Bj0_AM#rdU0$*GJvC*4+#cAObXnfnj24DnYYznf4M?HP8TtXOlN{dsATvIYj5|eUL85tND u7{eAUVBHO5fPfH4gkfT7vOEEO6Tj~xq-1g~(_VsVJehZ?6R-;E#9siWXg_)Y diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources index f5db0ab78c23bf22c950be1783a892fa8d4e5dec..4683b6c30c08e4b3d5abdcb528870a568ae6ba9b 100644 GIT binary patch delta 126 zcmZ3&xq)kfg0OFXo`Pd(x`L6Bf`NsVp@EgD@nm}@Yeu7q2P7x9^KV|v2I^myvTaKg-m~JWLem1^}D~BDVkl delta 189 zcmdnMwS;qmg0Ndrrh;Q>x`Lslf}w$xk%g6s#pKgWx_l)?rK!AJ`g$crsj0SxlOHll zPF7&%X9fyS{>UOV*_W9U%9fkV!^jO6|H;h90@6BpEu-9IZdSg@3m7dX+pus?e$1!< hSG1Fb7tZ!!f*91wWQ@Zt){J25H!Cm)FhY&m3IK|0I!^!q diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs b/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs index ad157cd..4a0e534 100644 --- a/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs +++ b/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs @@ -1,2 +1,2 @@ eclipse.preferences.version=1 -org.eclipse.jdt.launching.PREF_VM_XML=\r\n\r\n\r\n\r\n\r\n\r\n +org.eclipse.jdt.launching.PREF_VM_XML=\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs b/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs index 42520fc..0a60e67 100644 --- a/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs +++ b/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs @@ -1,3 +1,4 @@ activeuserprofiles=DESKTOP-SHKMAML;Team eclipse.preferences.version=1 org.eclipse.rse.systemtype.local.systemType.defaultUserId=Terrans Force +useridperkey=DESKTOP-SHKMAML.Local\=Terrans Force; diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi index eed8f32..8c2319f 100644 --- a/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi +++ b/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -160,7 +160,7 @@ categoryTag:Java Browsing - + View categoryTag:General @@ -230,52 +230,76 @@ Draggable - - - - - - - - - - - - + + + + + + + + + + + + toolbarSeparator + + Draggable + + + + + Draggable + + + + + + + + + + + + + + + + + Draggable - - - - + + + + Draggable - - - + + + Draggable - - - - + + + + Draggable - - + + Draggable - - + + toolbarSeparator @@ -283,15 +307,15 @@ Draggable - - - - - - - - - + + + + + + + + + toolbarSeparator @@ -303,8 +327,8 @@ Draggable - - + + stretch diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps b/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps index 74059b1df2f73c89d75df802fd4f59c5cb2a45bf..f5666298b590a888c66b2f99be77b3cd4794bc6f 100644 GIT binary patch delta 35 rcmX@ZeujNR81v*w%vMYcMw1m8wFI(?i&OQo5{noZ7(*7%-K+or!(j@& delta 34 qcmX@ZeujNR81v+b%+^c{hLaT;wfM7=Q}wbEix?OfLl#f9>;wR{TM8cl diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt b/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt index 514b305..f84b816 100644 --- a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt +++ b/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt @@ -1,28 +1,29 @@ INDEX VERSION 1.126+E:\2016Spring\robocodefiles\download\app\workspace_robo4\.metadata\.plugins\org.eclipse.jdt.core -4256357263.index +3253539546.index 240634369.index -1270703585.index -3837392347.index 3357244662.index +3837392347.index +1270703585.index 743580145.index 4213330522.index -2097671088.index +2815204631.index 972965919.index 649753860.index -2815204631.index +2097671088.index 2394798482.index 1886545541.index 2420224983.index 9299668.index -2816454019.index 2806151389.index -3228954160.index +2816454019.index 2169288515.index +3228954160.index 2122446671.index 2936589608.index +1812437159.index 2690281349.index 3090911769.index 844486800.index 195189658.index 2555277089.index -3253539546.index +4256357263.index diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat b/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat index e8a0a544802bd740a1b3cd89fd455a24b2abcc9f..0facbcd4b9baf082511caf207f299df748e6ab44 100644 GIT binary patch delta 46 zcmexAmGS>n#tp4ryzIV4@j0swbZ B4*~!H delta 48 zcmexAmGS>n#tp4ra$H`aex4!m9{#?rj0_A6`x)4MjpBn`1N?y;h69r)d1*~P>tzH0 DhEfjn diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen b/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen index 225a55b3c336e69bb83a6d5e7d3339a5c525e7e1..e9fa6008becd133f1cac4c5cec7f4311c6576acc 100644 GIT binary patch literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 literal 20 QcmezW|NlP*2w;NI07=aR00000 diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen b/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen index 225a55b3c336e69bb83a6d5e7d3339a5c525e7e1..e9fa6008becd133f1cac4c5cec7f4311c6576acc 100644 GIT binary patch literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 literal 20 QcmezW|NlP*2w;NI07=aR00000 diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen b/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen index 225a55b3c336e69bb83a6d5e7d3339a5c525e7e1..e9fa6008becd133f1cac4c5cec7f4311c6576acc 100644 GIT binary patch literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 literal 20 QcmezW|NlP*2w;NI07=aR00000 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 index 2867a6f..e538d7a 100644 --- 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 @@ -65,7 +65,7 @@ public class Module extends BaseModule { Container.cache.addComponent("robocode.host.vb", DotNetHost.class); Container.cache.addComponent("robocode.host.dotnet", DotNetHost.class); - } catch (Throwable e) { + } catch (RuntimeException e) { Logger.logError(e); throw new Error("Can't initialize .NET Robocode", e); } 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 index eaba300..852475f 100644 --- 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 @@ -240,7 +240,7 @@ public class AutoExtract implements ActionListener { // Set native look and feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Throwable t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF + } catch (RuntimeException t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF } File suggestedDir; 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 index c7825a0..e993cf8 100644 --- 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 @@ -246,7 +246,7 @@ public class AutoExtract implements ActionListener { // Set native look and feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Throwable t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF + } catch (RuntimeException t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF } File installDir = null; 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 index 2616238..184001c 100644 --- 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 @@ -113,7 +113,7 @@ public class HiddenAccess { System.exit(-1); } catch (MalformedURLException e) { Logger.logError(e); - } catch (Error e) { + } catch (MyException e) { Logger.logError(e); throw e; } 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 index c6a146f..9155e67 100644 --- 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 @@ -46,7 +46,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onBattleStarted(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onBattleStarted " + listener.getClass(), ex); } } @@ -56,7 +56,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onBattleCompleted(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onBattleCompleted " + listener.getClass(), ex); } } @@ -66,7 +66,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onBattleFinished(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onBattleFinished " + listener.getClass(), ex); } } @@ -76,7 +76,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onBattlePaused(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onBattlePaused " + listener.getClass(), ex); } } @@ -86,7 +86,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onBattleResumed(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onBattleResumed " + listener.getClass(), ex); } } @@ -96,7 +96,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onRoundStarted(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onRoundStarted " + listener.getClass(), ex); } } @@ -106,7 +106,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onRoundEnded(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onRoundEnded " + listener.getClass(), ex); } } @@ -116,7 +116,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onTurnStarted(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onTurnStarted " + listener.getClass(), ex); } } @@ -126,7 +126,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onTurnEnded(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onTurnEnded " + listener.getClass(), ex); } } @@ -136,7 +136,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onBattleMessage(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { logError("onBattleMessage " + listener.getClass(), ex); } } @@ -146,7 +146,7 @@ public class BattleEventDispatcher implements IBattleListener { for (IBattleListener listener : listeners) { try { listener.onBattleError(event); - } catch (Throwable ex) { + } catch (RuntimeException ex) { Logger.realErr.println(listener.getClass() + " " + ex.getMessage()); } } 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 index 24c831b..3ba5a93 100644 --- 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 @@ -171,7 +171,7 @@ public final class RobocodeMain extends RobocodeMainBase { System.exit(8); } } - } catch (Throwable e) { + } catch (RuntimeException e) { Logger.logError(e); } } 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 index 3540256..7dde1e9 100644 --- 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 @@ -88,7 +88,7 @@ public class JavaHost implements IHost { } return checkInterfaces(robotClass, robotItem); - } catch (Throwable t) { + } 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")) { 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 index 0024a6b..5621c87 100644 --- 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 @@ -382,7 +382,7 @@ public final class EventManager implements IEventManager { } catch (RuntimeException e) { currentTopEvent = null; throw e; - } catch (Error e) { + } catch (MyException e) { currentTopEvent = null; throw e; } finally { 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 index df5d591..9fdb31e 100644 --- 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 @@ -157,7 +157,7 @@ abstract class HostingRobotProxy implements IHostingRobotProxy, IHostedThread { private void loadClassBattle() { try { robotClassLoader.loadRobotMainClass(true); - } catch (Throwable e) { + } catch (RuntimeException e) { println("SYSTEM: Could not load " + statics.getName() + " : "); println(e); drainEnergy(); @@ -183,7 +183,7 @@ abstract class HostingRobotProxy implements IHostingRobotProxy, IHostedThread { robot = null; logError(e); return false; - } catch (Throwable e) { + } catch (RuntimeException e) { println("SYSTEM: An error occurred during initialization of " + statics.getName()); println("SYSTEM: " + e); println(e); @@ -247,7 +247,7 @@ abstract class HostingRobotProxy implements IHostingRobotProxy, IHostedThread { println(e); logMessage(statics.getName() + " stopped successfully."); throw e; // must be re-thrown in order to stop the thread - } catch (Throwable t) { + } catch (RuntimeException t) { drainEnergy(); println(t); logMessage(statics.getName() + ": Throwable: " + t); // without stack here 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 index 69dad86..0993839 100644 --- 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 @@ -244,7 +244,7 @@ public class RobotClassLoader extends URLClassLoader implements IRobotClassLoade } else { warnIfStaticRobotInstanceFields(); } - } catch (Throwable e) { + } catch (RuntimeException e) { robotClass = null; throw new ClassNotFoundException(e.getMessage(), e); } @@ -289,7 +289,7 @@ public class RobotClassLoader extends URLClassLoader implements IRobotClassLoade } } } - } catch (Throwable t) { + } catch (RuntimeException t) { Logger.logError(t); } } @@ -305,7 +305,7 @@ public class RobotClassLoader extends URLClassLoader implements IRobotClassLoade Class type = null; try { type = loadRobotClassLocaly(className, false); - } catch (Throwable t) { + } catch (RuntimeException t) { continue; } if (type != null) { @@ -366,7 +366,7 @@ public class RobotClassLoader extends URLClassLoader implements IRobotClassLoade modifiersField.setInt(field, modifiers & ~Modifier.FINAL); // Remove the FINAL modifier field.set(null, null); - } catch (Throwable ignore) {} + } catch (RuntimeException ignore) {} } /** @@ -383,7 +383,7 @@ public class RobotClassLoader extends URLClassLoader implements IRobotClassLoade for (Field field: type.getDeclaredFields()) { fields.add(field); } - } catch (Throwable ignore) {// NoClassDefFoundError does occur with some robots, e.g. sgp.Drunken [1.12] + } 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. } 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 index 581a88e..e4c6d0a 100644 --- 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 @@ -337,7 +337,7 @@ public class AutoExtract implements ActionListener { // Set native look and feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Throwable t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF + } catch (RuntimeException t) {// For some reason Ubuntu 7 can cause a NullPointerException when trying to getting the LAF } AutoExtract extractor = new AutoExtract(); 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 index c686e5a..09004c4 100644 --- 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 @@ -204,7 +204,7 @@ public class FileTransfer { if (conn != null) { conn.disconnect(); } - } catch (Throwable ignore) {// we expect this, right ? + } catch (RuntimeException ignore) {// we expect this, right ? } } } 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 index 35c4ff8..5722779 100644 --- 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 @@ -54,7 +54,7 @@ public class AwtAttack extends AdvancedRobot { }; javax.swing.SwingUtilities.invokeLater(doHack); - } catch (Throwable e) { + } catch (RuntimeException e) { // swalow security exception e.printStackTrace(out); } @@ -75,7 +75,7 @@ public class AwtAttack extends AdvancedRobot { e.printStackTrace(out); } catch (IOException e) { e.printStackTrace(out); - } catch (Throwable e) { + } catch (RuntimeException e) { // swalow security exception e.printStackTrace(out); } 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 index 97bc321..47ae244 100644 --- 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 @@ -39,7 +39,7 @@ public class ConstructorAwtAttack extends robocode.AdvancedRobot { }; javax.swing.SwingUtilities.invokeLater(doHack); - } catch (Throwable e) { + } catch (RuntimeException e) { // swallow security exception e.printStackTrace(out); } @@ -60,7 +60,7 @@ public class ConstructorAwtAttack extends robocode.AdvancedRobot { e.printStackTrace(out); } catch (IOException e) { e.printStackTrace(out); - } catch (Throwable e) { + } catch (RuntimeException e) { // swallow security exception e.printStackTrace(out); } 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 index a0c1e4a..0c5a0f8 100644 --- 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 @@ -24,7 +24,7 @@ public class ConstructorThreadAttack extends robocode.AdvancedRobot { Thread t = new Thread(a); t.start(); - } catch (Throwable e) { + } catch (RuntimeException e) { // swallow security exception e.printStackTrace(out); } @@ -39,7 +39,7 @@ public class ConstructorThreadAttack extends robocode.AdvancedRobot { Thread t = new Thread(tg, a); t.start(); - } catch (Throwable e) { + } catch (RuntimeException e) { // swallow security exception e.printStackTrace(out); } 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 index 3a35cec..9f76ccf 100644 --- 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 @@ -52,7 +52,7 @@ public class FileAttack extends AdvancedRobot { e.printStackTrace(out); } catch (IOException e) { e.printStackTrace(out); - } catch (Throwable e) { + } catch (RuntimeException e) { // swalow security exception e.printStackTrace(out); } @@ -72,7 +72,7 @@ public class FileAttack extends AdvancedRobot { e.printStackTrace(out); } catch (IOException e) { e.printStackTrace(out); - } catch (Throwable e) { + } catch (RuntimeException e) { // swalow security exception 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 index d2cb8e1..c5ecdb9 100644 --- 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 @@ -37,7 +37,7 @@ public class IncludeNamespaceAttack extends AdvancedRobot { private void namespaceAttack() { try { HiddenAccess.createRules(10, 10, 10, 10, 1, false, 100); - } catch (Throwable e) { + } catch (RuntimeException e) { // Swallow security exception e.printStackTrace(out); } 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 index 84cd88f..bb21f8c 100644 --- 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 @@ -42,7 +42,7 @@ public class ThreadAttack extends AdvancedRobot { Thread t = new Thread(a); t.start(); - } catch (Throwable e) { + } catch (RuntimeException e) { // swallow security exception e.printStackTrace(out); } @@ -57,7 +57,7 @@ public class ThreadAttack extends AdvancedRobot { Thread t = new Thread(tg, a); t.start(); - } catch (Throwable e) { + } catch (RuntimeException e) { // swallow security exception e.printStackTrace(out); } 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 index dbf59ec..963b549 100644 --- 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 @@ -51,7 +51,7 @@ public class ThreadGroupAttack extends Robot { } } }).start(); - } catch (Throwable t) { + } catch (RuntimeException t) { t.printStackTrace(out); } } 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 index 94b042c..75fcbfa 100644 --- 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 @@ -23,7 +23,7 @@ public class UndeadThread extends AdvancedRobot { while (true) { try { body(); - } catch (Throwable t) { + } catch (RuntimeException t) { // spamming the console out.println("Swalowed it, HA HA HA HA HAAAAA !!!!!"); out.println(t); 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 index 6f5fded..27c29dd 100644 --- 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 @@ -22,7 +22,7 @@ public class Assert extends org.junit.Assert { public static void allAssertNear(double v1, double v2) { try { assertNear(v1, v2); - } catch (Throwable ex) { + } catch (RuntimeException ex) { ex.printStackTrace(System.err); } } @@ -30,7 +30,7 @@ public class Assert extends org.junit.Assert { public static void allAssertThat(T t, org.hamcrest.Matcher tMatcher) { try { org.junit.Assert.assertThat(t, tMatcher); - } catch (Throwable ex) { + } catch (RuntimeException ex) { ex.printStackTrace(System.err); } } 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 index 4986b8b..a0f8e9b 100644 --- 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 @@ -146,7 +146,7 @@ public class EditWindow extends JInternalFrame { setModified(editorPanel.getEditorPane().isModified()); } }); - } catch (Throwable e) { + } catch (RuntimeException e) { Logger.logError(e); } } 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 index 1baec07..bda1627 100644 --- 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 @@ -74,7 +74,7 @@ public class WindowMenuItem extends JCheckBoxMenuItem implements ActionListener if (window.isIcon()) { try { window.setIcon(false); - } catch (Throwable ignored) {} + } catch (RuntimeException ignored) {} } if (window.getDesktopPane() != null) { window.getDesktopPane().setSelectedFrame(window); @@ -83,7 +83,7 @@ public class WindowMenuItem extends JCheckBoxMenuItem implements ActionListener window.grabFocus(); try { window.setSelected(true); - } catch (Throwable ignored) {} + } catch (RuntimeException ignored) {} } /** 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 index 476bc5b..bbdae95 100644 --- 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 @@ -574,14 +574,14 @@ public class WindowManager implements IWindowManagerExt { private void setLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Throwable t) { + } 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 (Throwable t2) { + } 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"); } 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 index bfb479c..11436ae 100644 --- 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 @@ -132,7 +132,7 @@ public final class AwtBattleAdaptor { calculateFPS(); } } - } catch (Throwable t) { + } catch (RuntimeException t) { Logger.logError(t); } } From 72f1b998ac385ed2c1f7e57a409b6616afdaf6e2 Mon Sep 17 00:00:00 2001 From: LiuMingYu <734904515@qq.com> Date: Tue, 23 Aug 2016 22:32:28 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E9=98=BB=E6=96=AD=E5=8F=8A=E4=B8=A5=E9=87=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/robotscs/TestMaxTurnRate.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) 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 index 551fac3..5507bb1 100644 --- 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 @@ -40,33 +40,33 @@ public class TestMaxTurnRate extends RobocodeTestBed { 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("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")); + 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")); } } } From 80d198777c192c3520399a918046bb897537279e Mon Sep 17 00:00:00 2001 From: LiuMingYu <734904515@qq.com> Date: Tue, 23 Aug 2016 22:35:51 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=9A=84=E6=96=87=E6=A1=A3=20=E6=9C=80?= =?UTF-8?q?=E8=BF=91=E5=9C=A8=E6=90=9E=E4=BF=9D=E7=A0=94=E6=9D=90=E6=96=99?= =?UTF-8?q?=20=E6=88=91=E4=BC=9A=E6=8A=93=E7=B4=A7=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=81=9A=E5=AE=8C=E5=89=A9=E4=BD=99=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 软件需求规格说明书.doc | Bin 103424 -> 327680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/软件需求规格说明书.doc b/软件需求规格说明书.doc index c8af5bb6ffb8224b4fa1c8ab57c3a2d3e973f61f..1931f7f5d59d80a840895846c01c0d78aecbd019 100644 GIT binary patch literal 327680 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�@i&Q8jg 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 MR`B{Ar>gk>0NYy$oB#j- From 2bc998a290105e12b71cf44faf37766cc1bdc4b0 Mon Sep 17 00:00:00 2001 From: ALEX11 <438026067@qq.com> Date: Thu, 25 Aug 2016 10:00:27 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.projects/robocode.api/.markers | Bin 597 -> 0 bytes .../.projects/robocode.battle/.markers | Bin 933 -> 0 bytes .../.projects/robocode.core/.markers | Bin 677 -> 0 bytes .../.projects/robocode.host/.markers | Bin 2415 -> 0 bytes .../.projects/robocode.roborumble/.markers | Bin 293 -> 0 bytes .../.projects/robocode.ui.editor/.markers | Bin 1642 -> 0 bytes .../.projects/robocode.ui/.markers | Bin 1066 -> 0 bytes .../.safetable/org.eclipse.core.resources | Bin 1328 -> 0 bytes .../.settings/org.eclipse.jdt.launching.prefs | 2 - .../.settings/org.eclipse.rse.core.prefs | 4 - .../org.eclipse.e4.workbench/workbench.xmi | 2502 ----------------- .../externalLibsTimeStamps | Bin 972 -> 0 bytes .../org.eclipse.jdt.core/savedIndexNames.txt | 29 - .../variablesAndContainers.dat | Bin 19199 -> 0 bytes .../segments.gen | Bin 20 -> 0 bytes .../segments.gen | Bin 20 -> 0 bytes .../segments.gen | Bin 20 -> 0 bytes .../net/sf/robocode/dotnet/host/Module.java | 77 - .../sf/robocode/installer/AutoExtract.java | 382 --- .../test/robotscs/TestMaxTurnRate.java | 72 - .../sf/robocode/installer/AutoExtract.java | 389 --- .../sf/robocode/security/HiddenAccess.java | 290 -- .../battle/events/BattleEventDispatcher.java | 154 - .../net/sf/robocode/core/RobocodeMain.java | 414 --- .../java/net/sf/robocode/host/JavaHost.java | 192 -- .../sf/robocode/host/events/EventManager.java | 572 ---- .../host/proxies/HostingRobotProxy.java | 306 -- .../host/security/RobotClassLoader.java | 424 --- .../sf/robocode/installer/AutoExtract.java | 705 ----- .../roborumble/netengine/FileTransfer.java | 657 ----- .../main/java/tested/robots/AwtAttack.java | 84 - .../tested/robots/ConstructorAwtAttack.java | 68 - .../robots/ConstructorThreadAttack.java | 61 - .../main/java/tested/robots/FileAttack.java | 81 - .../tested/robots/IncludeNamespaceAttack.java | 45 - .../main/java/tested/robots/ThreadAttack.java | 87 - .../java/tested/robots/ThreadGroupAttack.java | 71 - .../main/java/tested/robots/UndeadThread.java | 44 - .../net/sf/robocode/test/helpers/Assert.java | 38 - .../net/sf/robocode/ui/editor/EditWindow.java | 485 ---- .../sf/robocode/ui/editor/WindowMenuItem.java | 291 -- .../net/sf/robocode/ui/WindowManager.java | 632 ----- .../robocode/ui/battle/AwtBattleAdaptor.java | 335 --- .../target/classes/gl4java/GLFont.class | Bin 259 -> 0 bytes .../target/classes/gl4java/GLFunc.class | Bin 259 -> 0 bytes .../classes/net/sf/robocode/api/Module.class | Bin 1817 -> 0 bytes .../sf/robocode/battle/IBattleManagerBase.class | Bin 374 -> 0 bytes .../net/sf/robocode/core/ContainerBase.class | Bin 707 -> 0 bytes .../classes/net/sf/robocode/core/IModule.class | Bin 234 -> 0 bytes .../sf/robocode/gui/IWindowManagerBase.class | Bin 179 -> 0 bytes .../classes/net/sf/robocode/io/FileUtil.class | Bin 6012 -> 0 bytes .../classes/net/sf/robocode/io/Logger.class | Bin 3569 -> 0 bytes .../net/sf/robocode/io/RobocodeProperties.class | Bin 1456 -> 0 bytes .../robocode/manager/IVersionManagerBase.class | Bin 281 -> 0 bytes .../net/sf/robocode/peer/IRobotStatics.class | Bin 234 -> 0 bytes .../repository/CodeSizeCalculator.class | Bin 2049 -> 0 bytes .../repository/IRepositoryManagerBase.class | Bin 337 -> 0 bytes .../sf/robocode/security/HiddenAccess$1.class | Bin 964 -> 0 bytes .../net/sf/robocode/security/HiddenAccess.class | Bin 11107 -> 0 bytes .../robocode/security/IHiddenBulletHelper.class | Bin 205 -> 0 bytes .../robocode/security/IHiddenEventHelper.class | Bin 516 -> 0 bytes .../robocode/security/IHiddenRulesHelper.class | Bin 198 -> 0 bytes .../security/IHiddenSpecificationHelper.class | Bin 648 -> 0 bytes .../robocode/security/IHiddenStatusHelper.class | Bin 211 -> 0 bytes .../robocode/security/IThreadManagerBase.class | Bin 301 -> 0 bytes .../sf/robocode/security/SafeComponent.class | Bin 531 -> 0 bytes .../serialization/ISerializableHelper.class | Bin 453 -> 0 bytes .../robocode/serialization/RbSerializer.class | Bin 16241 -> 0 bytes .../net/sf/robocode/util/StringUtil.class | Bin 1788 -> 0 bytes .../classes/net/sf/robocode/util/UrlUtil.class | Bin 661 -> 0 bytes .../target/classes/robocode/AdvancedRobot.class | Bin 10417 -> 0 bytes .../BattleEndedEvent$SerializableHelper.class | Bin 1957 -> 0 bytes .../classes/robocode/BattleEndedEvent.class | Bin 2413 -> 0 bytes .../BattleResults$SerializableHelper.class | Bin 2462 -> 0 bytes .../target/classes/robocode/BattleResults.class | Bin 3308 -> 0 bytes .../robocode/BattleRules$HiddenHelper.class | Bin 906 -> 0 bytes .../target/classes/robocode/BattleRules.class | Bin 1743 -> 0 bytes .../target/classes/robocode/BorderSentry.class | Bin 114 -> 0 bytes .../robocode/Bullet$HiddenBulletHelper.class | Bin 2776 -> 0 bytes .../target/classes/robocode/Bullet.class | Bin 3323 -> 0 bytes ...ulletHitBulletEvent$SerializableHelper.class | Bin 2027 -> 0 bytes .../classes/robocode/BulletHitBulletEvent.class | Bin 2086 -> 0 bytes .../BulletHitEvent$SerializableHelper.class | Bin 2215 -> 0 bytes .../classes/robocode/BulletHitEvent.class | Bin 2688 -> 0 bytes .../BulletMissedEvent$SerializableHelper.class | Bin 1714 -> 0 bytes .../classes/robocode/BulletMissedEvent.class | Bin 1858 -> 0 bytes .../target/classes/robocode/Condition.class | Bin 1728 -> 0 bytes .../target/classes/robocode/CustomEvent.class | Bin 2246 -> 0 bytes .../DeathEvent$SerializableHelper.class | Bin 1204 -> 0 bytes .../target/classes/robocode/DeathEvent.class | Bin 1666 -> 0 bytes .../target/classes/robocode/Droid.class | Bin 100 -> 0 bytes .../robocode/Event$HiddenEventHelper.class | Bin 1771 -> 0 bytes .../target/classes/robocode/Event.class | Bin 3512 -> 0 bytes .../robocode/GunTurnCompleteCondition.class | Bin 852 -> 0 bytes .../HitByBulletEvent$SerializableHelper.class | Bin 1925 -> 0 bytes .../classes/robocode/HitByBulletEvent.class | Bin 2836 -> 0 bytes .../HitRobotEvent$SerializableHelper.class | Bin 2148 -> 0 bytes .../target/classes/robocode/HitRobotEvent.class | Bin 3158 -> 0 bytes .../HitWallEvent$SerializableHelper.class | Bin 1516 -> 0 bytes .../target/classes/robocode/HitWallEvent.class | Bin 2038 -> 0 bytes .../JuniorRobot$InnerEventHandler.class | Bin 5223 -> 0 bytes .../target/classes/robocode/JuniorRobot.class | Bin 5817 -> 0 bytes .../target/classes/robocode/KeyEvent.class | Bin 546 -> 0 bytes .../KeyPressedEvent$SerializableHelper.class | Bin 2321 -> 0 bytes .../classes/robocode/KeyPressedEvent.class | Bin 1770 -> 0 bytes .../KeyReleasedEvent$SerializableHelper.class | Bin 2327 -> 0 bytes .../classes/robocode/KeyReleasedEvent.class | Bin 1776 -> 0 bytes .../KeyTypedEvent$SerializableHelper.class | Bin 2309 -> 0 bytes .../target/classes/robocode/KeyTypedEvent.class | Bin 1758 -> 0 bytes .../target/classes/robocode/MessageEvent.class | Bin 1810 -> 0 bytes .../MouseClickedEvent$SerializableHelper.class | Bin 2317 -> 0 bytes .../classes/robocode/MouseClickedEvent.class | Bin 1790 -> 0 bytes .../MouseDraggedEvent$SerializableHelper.class | Bin 2317 -> 0 bytes .../classes/robocode/MouseDraggedEvent.class | Bin 1790 -> 0 bytes .../MouseEnteredEvent$SerializableHelper.class | Bin 2317 -> 0 bytes .../classes/robocode/MouseEnteredEvent.class | Bin 1790 -> 0 bytes .../target/classes/robocode/MouseEvent.class | Bin 558 -> 0 bytes .../MouseExitedEvent$SerializableHelper.class | Bin 2311 -> 0 bytes .../classes/robocode/MouseExitedEvent.class | Bin 1784 -> 0 bytes .../MouseMovedEvent$SerializableHelper.class | Bin 2305 -> 0 bytes .../classes/robocode/MouseMovedEvent.class | Bin 1778 -> 0 bytes .../MousePressedEvent$SerializableHelper.class | Bin 2317 -> 0 bytes .../classes/robocode/MousePressedEvent.class | Bin 1790 -> 0 bytes .../MouseReleasedEvent$SerializableHelper.class | Bin 2323 -> 0 bytes .../classes/robocode/MouseReleasedEvent.class | Bin 1796 -> 0 bytes ...ouseWheelMovedEvent$SerializableHelper.class | Bin 2518 -> 0 bytes .../classes/robocode/MouseWheelMovedEvent.class | Bin 1885 -> 0 bytes .../robocode/MoveCompleteCondition.class | Bin 826 -> 0 bytes .../target/classes/robocode/PaintEvent.class | Bin 1417 -> 0 bytes .../robocode/RadarTurnCompleteCondition.class | Bin 842 -> 0 bytes .../classes/robocode/RateControlRobot.class | Bin 2212 -> 0 bytes .../target/classes/robocode/Robocode.class | Bin 461 -> 0 bytes .../robocode/RobocodeFileOutputStream.class | Bin 2271 -> 0 bytes .../classes/robocode/RobocodeFileWriter.class | Bin 958 -> 0 bytes .../target/classes/robocode/Robot.class | Bin 11677 -> 0 bytes .../RobotDeathEvent$SerializableHelper.class | Bin 1685 -> 0 bytes .../classes/robocode/RobotDeathEvent.class | Bin 2007 -> 0 bytes .../RobotStatus$SerializableHelper.class | Bin 3263 -> 0 bytes .../target/classes/robocode/RobotStatus.class | Bin 4731 -> 0 bytes .../RoundEndedEvent$SerializableHelper.class | Bin 1678 -> 0 bytes .../classes/robocode/RoundEndedEvent.class | Bin 2449 -> 0 bytes .../target/classes/robocode/Rules.class | Bin 1810 -> 0 bytes .../ScannedRobotEvent$SerializableHelper.class | Bin 2391 -> 0 bytes .../classes/robocode/ScannedRobotEvent.class | Bin 4955 -> 0 bytes .../SkippedTurnEvent$SerializableHelper.class | Bin 1546 -> 0 bytes .../classes/robocode/SkippedTurnEvent.class | Bin 2041 -> 0 bytes .../target/classes/robocode/StatusEvent.class | Bin 1540 -> 0 bytes .../target/classes/robocode/TeamRobot.class | Bin 1923 -> 0 bytes .../robocode/TurnCompleteCondition.class | Bin 822 -> 0 bytes .../robocode/WinEvent$SerializableHelper.class | Bin 1194 -> 0 bytes .../target/classes/robocode/WinEvent.class | Bin 1654 -> 0 bytes .../robocode/_AdvancedRadiansRobot.class | Bin 3320 -> 0 bytes .../classes/robocode/_AdvancedRobot.class | Bin 3356 -> 0 bytes .../target/classes/robocode/_Robot.class | Bin 2119 -> 0 bytes .../target/classes/robocode/_RobotBase.class | Bin 1636 -> 0 bytes .../robocode/annotation/SafeStatic.class | Bin 392 -> 0 bytes .../robocode/annotation/package-info.class | Bin 125 -> 0 bytes .../robocode/control/BattleSpecification.class | Bin 3929 -> 0 bytes .../control/BattlefieldSpecification.class | Bin 1023 -> 0 bytes .../robocode/control/IRobocodeEngine.class | Bin 715 -> 0 bytes .../robocode/control/RandomFactory.class | Bin 2740 -> 0 bytes .../control/RobocodeEngine$BattleObserver.class | Bin 2338 -> 0 bytes .../robocode/control/RobocodeEngine.class | Bin 7438 -> 0 bytes .../robocode/control/RobocodeListener.class | Bin 485 -> 0 bytes .../classes/robocode/control/RobotResults.class | Bin 3233 -> 0 bytes .../classes/robocode/control/RobotSetup.class | Bin 828 -> 0 bytes .../RobotSpecification$HiddenHelper.class | Bin 1962 -> 0 bytes .../robocode/control/RobotSpecification.class | Bin 3388 -> 0 bytes .../robocode/control/events/BattleAdaptor.class | Bin 2339 -> 0 bytes .../control/events/BattleCompletedEvent.class | Bin 1524 -> 0 bytes .../control/events/BattleErrorEvent.class | Bin 529 -> 0 bytes .../robocode/control/events/BattleEvent.class | Bin 310 -> 0 bytes .../control/events/BattleFinishedEvent.class | Bin 480 -> 0 bytes .../control/events/BattleMessageEvent.class | Bin 539 -> 0 bytes .../control/events/BattlePausedEvent.class | Bin 347 -> 0 bytes .../control/events/BattleResumedEvent.class | Bin 350 -> 0 bytes .../control/events/BattleStartedEvent.class | Bin 819 -> 0 bytes .../control/events/IBattleListener.class | Bin 951 -> 0 bytes .../control/events/RoundEndedEvent.class | Bin 721 -> 0 bytes .../control/events/RoundStartedEvent.class | Bin 745 -> 0 bytes .../control/events/TurnEndedEvent.class | Bin 606 -> 0 bytes .../control/events/TurnStartedEvent.class | Bin 344 -> 0 bytes .../robocode/control/events/package-info.class | Bin 129 -> 0 bytes .../classes/robocode/control/package-info.class | Bin 122 -> 0 bytes .../robocode/control/snapshot/BulletState.class | Bin 2000 -> 0 bytes .../control/snapshot/IBulletSnapshot.class | Bin 492 -> 0 bytes .../control/snapshot/IDebugProperty.class | Bin 194 -> 0 bytes .../control/snapshot/IRobotSnapshot.class | Bin 966 -> 0 bytes .../control/snapshot/IScoreSnapshot.class | Bin 853 -> 0 bytes .../control/snapshot/ITurnSnapshot.class | Bin 440 -> 0 bytes .../robocode/control/snapshot/RobotState.class | Bin 2019 -> 0 bytes .../control/snapshot/package-info.class | Bin 131 -> 0 bytes .../robocode/exception/AbortedException.class | Bin 519 -> 0 bytes .../robocode/exception/DeathException.class | Bin 513 -> 0 bytes .../robocode/exception/DisabledException.class | Bin 516 -> 0 bytes .../exception/EventInterruptedException.class | Bin 560 -> 0 bytes .../robocode/exception/RobotException.class | Bin 507 -> 0 bytes .../robocode/exception/WinException.class | Bin 501 -> 0 bytes .../robocode/exception/package-info.class | Bin 124 -> 0 bytes .../target/classes/robocode/package-info.class | Bin 114 -> 0 bytes .../classes/robocode/robocodeGL/EllipseGL.class | Bin 1490 -> 0 bytes .../classes/robocode/robocodeGL/LabelGL.class | Bin 523 -> 0 bytes .../classes/robocode/robocodeGL/LineGL.class | Bin 1030 -> 0 bytes .../classes/robocode/robocodeGL/PointGL.class | Bin 900 -> 0 bytes .../robocode/robocodeGL/RectangleGL.class | Bin 1497 -> 0 bytes .../robocode/robocodeGL/RenderElement.class | Bin 1077 -> 0 bytes .../robocode/robocodeGL/system/GLRenderer.class | Bin 595 -> 0 bytes .../robotinterfaces/IAdvancedEvents.class | Bin 245 -> 0 bytes .../robotinterfaces/IAdvancedRobot.class | Bin 260 -> 0 bytes .../robocode/robotinterfaces/IBasicEvents.class | Bin 711 -> 0 bytes .../robotinterfaces/IBasicEvents2.class | Bin 234 -> 0 bytes .../robotinterfaces/IBasicEvents3.class | Bin 233 -> 0 bytes .../robocode/robotinterfaces/IBasicRobot.class | Bin 371 -> 0 bytes .../robotinterfaces/IInteractiveEvents.class | Bin 513 -> 0 bytes .../robotinterfaces/IInteractiveRobot.class | Bin 272 -> 0 bytes .../robocode/robotinterfaces/IJuniorRobot.class | Bin 174 -> 0 bytes .../robocode/robotinterfaces/IPaintEvents.class | Bin 175 -> 0 bytes .../robocode/robotinterfaces/IPaintRobot.class | Bin 248 -> 0 bytes .../robocode/robotinterfaces/ITeamEvents.class | Bin 185 -> 0 bytes .../robocode/robotinterfaces/ITeamRobot.class | Bin 247 -> 0 bytes .../robocode/robotinterfaces/package-info.class | Bin 130 -> 0 bytes .../peer/IAdvancedRobotPeer.class | Bin 1784 -> 0 bytes .../robotinterfaces/peer/IBasicRobotPeer.class | Bin 1167 -> 0 bytes .../robotinterfaces/peer/IJuniorRobotPeer.class | Bin 226 -> 0 bytes .../peer/IStandardRobotPeer.class | Bin 377 -> 0 bytes .../robotinterfaces/peer/ITeamRobotPeer.class | Bin 582 -> 0 bytes .../robotinterfaces/peer/package-info.class | Bin 135 -> 0 bytes .../target/classes/robocode/util/Utils.class | Bin 1855 -> 0 bytes .../classes/robocode/util/package-info.class | Bin 119 -> 0 bytes .../robocode.content/target/classes/ReadMe.html | 233 -- .../robocode.content/target/classes/ReadMe.txt | 471 ---- .../target/classes/battles/intro.battle | 8 - .../target/classes/battles/sample.battle | 8 - .../target/classes/desktop/robocode.png | Bin 3918 -> 0 bytes .../classes/desktop/robocodeMeleeRumble.desktop | 9 - .../classes/desktop/robocodeRoboRumble.desktop | 9 - .../classes/desktop/robocodeRobocode.desktop | 9 - .../classes/desktop/robocodeTeamRumble.desktop | 9 - .../classes/desktop/robocodeTwinDuel.desktop | 9 - .../target/classes/desktop/roborumble.png | Bin 3401 -> 0 bytes .../target/classes/license/epl-v10.html | 188 -- .../target/classes/meleerumble.bat | 9 - .../target/classes/meleerumble.command | 13 - .../target/classes/meleerumble.sh | 13 - .../target/classes/robocode.bat | 9 - .../target/classes/robocode.command | 13 - .../target/classes/robocode.ico | Bin 370070 -> 0 bytes .../robocode.content/target/classes/robocode.sh | 13 - .../target/classes/roborumble.bat | 9 - .../target/classes/roborumble.command | 13 - .../target/classes/roborumble.ico | Bin 32038 -> 0 bytes .../target/classes/roborumble.sh | 13 - .../target/classes/roborumble/meleerumble.txt | 244 -- .../classes/roborumble/roborumble.properties | 6 - .../target/classes/roborumble/roborumble.txt | 241 -- .../target/classes/roborumble/teamrumble.txt | 203 -- .../target/classes/roborumble/twinduel.txt | 203 -- .../target/classes/teamrumble.bat | 9 - .../target/classes/teamrumble.command | 13 - .../target/classes/teamrumble.sh | 13 - .../target/classes/templates/newjavafile.tpt | 8 - .../target/classes/templates/newjuniorrobot.tpt | 54 - .../target/classes/templates/newrobot.tpt | 56 - .../editor/Robocode Black Theme.properties | 23 - .../editor/Robocode White Theme.properties | 23 - .../target/classes/twinduel.bat | 9 - .../target/classes/twinduel.command | 13 - .../robocode.content/target/classes/twinduel.sh | 13 - .../sf/robocode/installer/AutoExtract$1.class | Bin 877 -> 0 bytes .../net/sf/robocode/installer/AutoExtract.class | Bin 21469 -> 0 bytes .../target/classes/sample/Corners.class | Bin 2603 -> 0 bytes .../target/classes/sample/Corners.properties | 9 - .../target/classes/sample/Crazy.class | Bin 1729 -> 0 bytes .../target/classes/sample/Crazy.properties | 9 - .../target/classes/sample/Fire.class | Bin 1739 -> 0 bytes .../target/classes/sample/Fire.properties | 9 - .../target/classes/sample/Interactive.class | Bin 3111 -> 0 bytes .../classes/sample/Interactive.properties | 9 - .../sample/Interactive_v2$Direction.class | Bin 1205 -> 0 bytes .../target/classes/sample/Interactive_v2.class | Bin 4106 -> 0 bytes .../classes/sample/Interactive_v2.properties | 8 - .../classes/sample/MyFirstJuniorRobot.class | Bin 871 -> 0 bytes .../sample/MyFirstJuniorRobot.properties | 9 - .../target/classes/sample/MyFirstRobot.class | Bin 923 -> 0 bytes .../classes/sample/MyFirstRobot.properties | 9 - .../target/classes/sample/PaintingRobot.class | Bin 2379 -> 0 bytes .../classes/sample/PaintingRobot.properties | 10 - .../target/classes/sample/RamFire.class | Bin 1544 -> 0 bytes .../target/classes/sample/RamFire.properties | 9 - .../target/classes/sample/SittingDuck.class | Bin 2440 -> 0 bytes .../target/classes/sample/SittingDuck.html | 24 - .../classes/sample/SittingDuck.properties | 9 - .../target/classes/sample/SpinBot.class | Bin 1264 -> 0 bytes .../target/classes/sample/SpinBot.properties | 9 - .../target/classes/sample/Target$1.class | Bin 684 -> 0 bytes .../target/classes/sample/Target.class | Bin 1626 -> 0 bytes .../target/classes/sample/Target.properties | 9 - .../target/classes/sample/TrackFire.class | Bin 1528 -> 0 bytes .../target/classes/sample/TrackFire.properties | 9 - .../target/classes/sample/Tracker.class | Bin 2793 -> 0 bytes .../target/classes/sample/Tracker.properties | 9 - .../target/classes/sample/VelociRobot.class | Bin 1187 -> 0 bytes .../classes/sample/VelociRobot.properties | 9 - .../target/classes/sample/Walls.class | Bin 1596 -> 0 bytes .../target/classes/sample/Walls.properties | 9 - .../target/classes/sample/pandafighter.class | Bin 4510 -> 0 bytes .../target/classes/sample/pandafighter.java | 149 - .../target/classes/sampleex/Alien.class | Bin 3054 -> 0 bytes .../target/classes/sampleex/Alien.properties | 9 - .../AlienComposition$AlienEventHandler.class | Bin 2403 -> 0 bytes .../sampleex/AlienComposition$AlienMain.class | Bin 867 -> 0 bytes .../classes/sampleex/AlienComposition.class | Bin 1466 -> 0 bytes .../target/classes/sampleex/GreyEminence.class | Bin 1111 -> 0 bytes .../classes/sampleex/MasterAndSlave.class | Bin 2086 -> 0 bytes .../classes/sampleex/MasterAndSlave.properties | 9 - .../target/classes/sampleex/MasterBase.class | Bin 2218 -> 0 bytes .../classes/sampleex/ProxyOfGreyEminence.class | Bin 881 -> 0 bytes .../sampleex/ProxyOfGreyEminence.properties | 9 - .../target/classes/sampleex/RegullarMonk.class | Bin 279 -> 0 bytes .../target/classes/sampleex/Slave.class | Bin 817 -> 0 bytes .../samplesentry/BorderGuard$RobotData.class | Bin 1762 -> 0 bytes .../classes/samplesentry/BorderGuard.class | Bin 9295 -> 0 bytes .../classes/samplesentry/BorderGuard.properties | 9 - .../classes/sampleteam/MyFirstDroid.class | Bin 1691 -> 0 bytes .../classes/sampleteam/MyFirstLeader.class | Bin 2363 -> 0 bytes .../target/classes/sampleteam/MyFirstTeam.team | 7 - .../target/classes/sampleteam/Point.class | Bin 612 -> 0 bytes .../target/classes/sampleteam/RobotColors.class | Bin 493 -> 0 bytes ...ngNameIWouldSayTooLongMaybeEventLonger.class | Bin 603 -> 0 bytes .../target/classes/NoPackageShortName.class | Bin 483 -> 0 bytes .../target/classes/robocode/BadNamespace.class | Bin 483 -> 0 bytes .../target/classes/tested/robots/Ahead.class | Bin 382 -> 0 bytes .../classes/tested/robots/AwtAttack$1.class | Bin 790 -> 0 bytes .../classes/tested/robots/AwtAttack.class | Bin 1910 -> 0 bytes .../classes/tested/robots/BadFirePower.class | Bin 1100 -> 0 bytes .../classes/tested/robots/BattleLost.class | Bin 1083 -> 0 bytes .../classes/tested/robots/BattleWin.class | Bin 1693 -> 0 bytes .../classes/tested/robots/BodyTurnRate.class | Bin 1757 -> 0 bytes .../tested/robots/ConstructorAwtAttack$1.class | Bin 856 -> 0 bytes .../tested/robots/ConstructorAwtAttack.class | Bin 1613 -> 0 bytes .../tested/robots/ConstructorHttpAttack.class | Bin 1101 -> 0 bytes .../robots/ConstructorReflectionAttack.class | Bin 1803 -> 0 bytes .../tested/robots/ConstructorSocketAttack.class | Bin 1992 -> 0 bytes .../ConstructorThreadAttack$Attacker.class | Bin 1188 -> 0 bytes .../tested/robots/ConstructorThreadAttack.class | Bin 1577 -> 0 bytes .../classes/tested/robots/CustomEvents$1.class | Bin 688 -> 0 bytes .../classes/tested/robots/CustomEvents$2.class | Bin 688 -> 0 bytes .../classes/tested/robots/CustomEvents$3.class | Bin 766 -> 0 bytes .../classes/tested/robots/CustomEvents.class | Bin 1762 -> 0 bytes .../tested/robots/DecelerationCaveat1.class | Bin 585 -> 0 bytes .../tested/robots/DecelerationCaveat2.class | Bin 586 -> 0 bytes .../tested/robots/DecelerationCaveat3.class | Bin 599 -> 0 bytes .../target/classes/tested/robots/DieFast.class | Bin 386 -> 0 bytes .../classes/tested/robots/EnvAttack.class | Bin 644 -> 0 bytes .../tested/robots/EventPriorityFilter.class | Bin 931 -> 0 bytes .../target/classes/tested/robots/FairPlay.class | Bin 941 -> 0 bytes .../classes/tested/robots/FileAttack.class | Bin 1889 -> 0 bytes .../tested/robots/FileOutputStreamAttack.class | Bin 1214 -> 0 bytes .../classes/tested/robots/FileWriteSize.class | Bin 2098 -> 0 bytes .../target/classes/tested/robots/GunHeat.class | Bin 956 -> 0 bytes .../classes/tested/robots/GunTurnRate.class | Bin 1609 -> 0 bytes .../classes/tested/robots/HttpAttack.class | Bin 1118 -> 0 bytes .../tested/robots/IncludeNamespaceAttack.class | Bin 1111 -> 0 bytes .../tested/robots/InteruptibleEvent.class | Bin 1134 -> 0 bytes .../classes/tested/robots/JuniorEvents.class | Bin 5577 -> 0 bytes .../classes/tested/robots/MaxTurnRate.class | Bin 1381 -> 0 bytes .../classes/tested/robots/MaxVelocity.class | Bin 1356 -> 0 bytes .../tested/robots/PrivateConstructor.class | Bin 309 -> 0 bytes .../robots/RadarTurnRateAndSetAdjust.class | Bin 2151 -> 0 bytes .../target/classes/tested/robots/Random.class | Bin 576 -> 0 bytes .../classes/tested/robots/RateControl.class | Bin 886 -> 0 bytes .../tested/robots/ReflectionAttack.class | Bin 1350 -> 0 bytes .../tested/robots/ReverseDirection.class | Bin 675 -> 0 bytes .../tested/robots/RobotDeathEvents.class | Bin 974 -> 0 bytes .../classes/tested/robots/SkipTurns.class | Bin 1733 -> 0 bytes .../classes/tested/robots/SocketAttack.class | Bin 1613 -> 0 bytes .../target/classes/tested/robots/TestTeam.team | 7 - .../tested/robots/ThreadAttack$Attacker.class | Bin 1589 -> 0 bytes .../classes/tested/robots/ThreadAttack.class | Bin 2124 -> 0 bytes .../tested/robots/ThreadGroupAttack$1.class | Bin 1125 -> 0 bytes .../tested/robots/ThreadGroupAttack.class | Bin 1967 -> 0 bytes .../TooLongNameThisIsReallyTooLongName.class | Bin 559 -> 0 bytes .../classes/tested/robots/UndeadThread.class | Bin 937 -> 0 bytes .../classes/tested/robots/WatchBullets.class | Bin 2194 -> 0 bytes .../TooLongNamespace.class | Bin 567 -> 0 bytes 文档/软件需求规格说明书郭禹良版本0.3.doc | Bin 334848 -> 0 bytes 软件需求规格说明书.doc | Bin 327680 -> 0 bytes 387 files changed, 12049 deletions(-) delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.roborumble/.markers delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui.editor/.markers delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen delete mode 100644 workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen 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.installer/src/main/java/net/sf/robocode/installer/AutoExtract.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/testing/robocode.testing.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java delete mode 100644 workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/HiddenAccess.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/core/RobocodeMain.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/events/EventManager.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/security/RobotClassLoader.java delete mode 100644 workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java delete mode 100644 workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/FileTransfer.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/ConstructorAwtAttack.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/FileAttack.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/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/UndeadThread.java delete mode 100644 workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/Assert.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/WindowMenuItem.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 代码/robocode/robocode.api/target/classes/gl4java/GLFont.class delete mode 100644 代码/robocode/robocode.api/target/classes/gl4java/GLFunc.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/api/Module.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/battle/IBattleManagerBase.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/core/ContainerBase.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/core/IModule.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/gui/IWindowManagerBase.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/io/FileUtil.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/io/Logger.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/io/RobocodeProperties.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/manager/IVersionManagerBase.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/peer/IRobotStatics.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/repository/CodeSizeCalculator.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/repository/IRepositoryManagerBase.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/HiddenAccess$1.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/HiddenAccess.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenBulletHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenEventHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenRulesHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenSpecificationHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenStatusHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IThreadManagerBase.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/security/SafeComponent.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/serialization/ISerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/serialization/RbSerializer.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/util/StringUtil.class delete mode 100644 代码/robocode/robocode.api/target/classes/net/sf/robocode/util/UrlUtil.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/AdvancedRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BattleEndedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BattleEndedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BattleResults$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BattleResults.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BattleRules$HiddenHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BattleRules.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BorderSentry.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Bullet$HiddenBulletHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Bullet.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BulletHitBulletEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BulletHitBulletEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BulletHitEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BulletHitEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BulletMissedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/BulletMissedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Condition.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/CustomEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/DeathEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/DeathEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Droid.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Event$HiddenEventHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Event.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/GunTurnCompleteCondition.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/HitByBulletEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/HitByBulletEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/HitRobotEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/HitRobotEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/HitWallEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/HitWallEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/JuniorRobot$InnerEventHandler.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/JuniorRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/KeyEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/KeyPressedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/KeyPressedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/KeyReleasedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/KeyReleasedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/KeyTypedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/KeyTypedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MessageEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseClickedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseClickedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseDraggedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseDraggedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseEnteredEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseEnteredEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseExitedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseExitedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseMovedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseMovedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MousePressedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MousePressedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseReleasedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseReleasedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseWheelMovedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MouseWheelMovedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/MoveCompleteCondition.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/PaintEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RadarTurnCompleteCondition.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RateControlRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Robocode.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RobocodeFileOutputStream.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RobocodeFileWriter.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Robot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RobotDeathEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RobotDeathEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RobotStatus$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RobotStatus.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RoundEndedEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/RoundEndedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/Rules.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/ScannedRobotEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/ScannedRobotEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/SkippedTurnEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/SkippedTurnEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/StatusEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/TeamRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/TurnCompleteCondition.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/WinEvent$SerializableHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/WinEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/_AdvancedRadiansRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/_AdvancedRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/_Robot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/_RobotBase.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/annotation/SafeStatic.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/annotation/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/BattleSpecification.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/BattlefieldSpecification.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/IRobocodeEngine.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RandomFactory.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RobocodeEngine$BattleObserver.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RobocodeEngine.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RobocodeListener.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RobotResults.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RobotSetup.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RobotSpecification$HiddenHelper.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/RobotSpecification.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleAdaptor.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleCompletedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleErrorEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleFinishedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleMessageEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattlePausedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleResumedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/BattleStartedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/IBattleListener.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/RoundEndedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/RoundStartedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/TurnEndedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/TurnStartedEvent.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/events/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/BulletState.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/IBulletSnapshot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/IDebugProperty.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/IRobotSnapshot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/IScoreSnapshot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/ITurnSnapshot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/RobotState.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/control/snapshot/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/exception/AbortedException.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/exception/DeathException.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/exception/DisabledException.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/exception/EventInterruptedException.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/exception/RobotException.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/exception/WinException.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/exception/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robocodeGL/EllipseGL.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robocodeGL/LabelGL.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robocodeGL/LineGL.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robocodeGL/PointGL.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robocodeGL/RectangleGL.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robocodeGL/RenderElement.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robocodeGL/system/GLRenderer.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IAdvancedEvents.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IAdvancedRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents2.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents3.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IInteractiveEvents.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IInteractiveRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IJuniorRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IPaintEvents.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IPaintRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/ITeamEvents.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/ITeamRobot.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/IAdvancedRobotPeer.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/IBasicRobotPeer.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/IJuniorRobotPeer.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/IStandardRobotPeer.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/ITeamRobotPeer.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/package-info.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/util/Utils.class delete mode 100644 代码/robocode/robocode.api/target/classes/robocode/util/package-info.class delete mode 100644 代码/robocode/robocode.content/target/classes/ReadMe.html delete mode 100644 代码/robocode/robocode.content/target/classes/ReadMe.txt delete mode 100644 代码/robocode/robocode.content/target/classes/battles/intro.battle delete mode 100644 代码/robocode/robocode.content/target/classes/battles/sample.battle delete mode 100644 代码/robocode/robocode.content/target/classes/desktop/robocode.png delete mode 100644 代码/robocode/robocode.content/target/classes/desktop/robocodeMeleeRumble.desktop delete mode 100644 代码/robocode/robocode.content/target/classes/desktop/robocodeRoboRumble.desktop delete mode 100644 代码/robocode/robocode.content/target/classes/desktop/robocodeRobocode.desktop delete mode 100644 代码/robocode/robocode.content/target/classes/desktop/robocodeTeamRumble.desktop delete mode 100644 代码/robocode/robocode.content/target/classes/desktop/robocodeTwinDuel.desktop delete mode 100644 代码/robocode/robocode.content/target/classes/desktop/roborumble.png delete mode 100644 代码/robocode/robocode.content/target/classes/license/epl-v10.html delete mode 100644 代码/robocode/robocode.content/target/classes/meleerumble.bat delete mode 100644 代码/robocode/robocode.content/target/classes/meleerumble.command delete mode 100644 代码/robocode/robocode.content/target/classes/meleerumble.sh delete mode 100644 代码/robocode/robocode.content/target/classes/robocode.bat delete mode 100644 代码/robocode/robocode.content/target/classes/robocode.command delete mode 100644 代码/robocode/robocode.content/target/classes/robocode.ico delete mode 100644 代码/robocode/robocode.content/target/classes/robocode.sh delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble.bat delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble.command delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble.ico delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble.sh delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble/meleerumble.txt delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble/roborumble.properties delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble/roborumble.txt delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble/teamrumble.txt delete mode 100644 代码/robocode/robocode.content/target/classes/roborumble/twinduel.txt delete mode 100644 代码/robocode/robocode.content/target/classes/teamrumble.bat delete mode 100644 代码/robocode/robocode.content/target/classes/teamrumble.command delete mode 100644 代码/robocode/robocode.content/target/classes/teamrumble.sh delete mode 100644 代码/robocode/robocode.content/target/classes/templates/newjavafile.tpt delete mode 100644 代码/robocode/robocode.content/target/classes/templates/newjuniorrobot.tpt delete mode 100644 代码/robocode/robocode.content/target/classes/templates/newrobot.tpt delete mode 100644 代码/robocode/robocode.content/target/classes/theme/editor/Robocode Black Theme.properties delete mode 100644 代码/robocode/robocode.content/target/classes/theme/editor/Robocode White Theme.properties delete mode 100644 代码/robocode/robocode.content/target/classes/twinduel.bat delete mode 100644 代码/robocode/robocode.content/target/classes/twinduel.command delete mode 100644 代码/robocode/robocode.content/target/classes/twinduel.sh delete mode 100644 代码/robocode/robocode.installer/target/classes/net/sf/robocode/installer/AutoExtract$1.class delete mode 100644 代码/robocode/robocode.installer/target/classes/net/sf/robocode/installer/AutoExtract.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Corners.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Corners.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Crazy.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Crazy.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Fire.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Fire.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Interactive.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Interactive.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Interactive_v2$Direction.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Interactive_v2.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Interactive_v2.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/MyFirstJuniorRobot.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/MyFirstJuniorRobot.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/MyFirstRobot.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/MyFirstRobot.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/PaintingRobot.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/PaintingRobot.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/RamFire.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/RamFire.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/SittingDuck.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/SittingDuck.html delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/SittingDuck.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/SpinBot.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/SpinBot.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Target$1.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Target.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Target.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/TrackFire.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/TrackFire.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Tracker.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Tracker.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/VelociRobot.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/VelociRobot.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Walls.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/Walls.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/pandafighter.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sample/pandafighter.java delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/Alien.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/Alien.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/AlienComposition$AlienEventHandler.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/AlienComposition$AlienMain.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/AlienComposition.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/GreyEminence.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/MasterAndSlave.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/MasterAndSlave.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/MasterBase.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/ProxyOfGreyEminence.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/ProxyOfGreyEminence.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/RegullarMonk.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleex/Slave.class delete mode 100644 代码/robocode/robocode.samples/target/classes/samplesentry/BorderGuard$RobotData.class delete mode 100644 代码/robocode/robocode.samples/target/classes/samplesentry/BorderGuard.class delete mode 100644 代码/robocode/robocode.samples/target/classes/samplesentry/BorderGuard.properties delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleteam/MyFirstDroid.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleteam/MyFirstLeader.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleteam/MyFirstTeam.team delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleteam/Point.class delete mode 100644 代码/robocode/robocode.samples/target/classes/sampleteam/RobotColors.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/NoPackageButReallyLongNameIWouldSayTooLongMaybeEventLonger.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/NoPackageShortName.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/robocode/BadNamespace.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/Ahead.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/AwtAttack$1.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/AwtAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/BadFirePower.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/BattleLost.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/BattleWin.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/BodyTurnRate.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorAwtAttack$1.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorAwtAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorHttpAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorReflectionAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorSocketAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorThreadAttack$Attacker.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorThreadAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents$1.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents$2.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents$3.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/DecelerationCaveat1.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/DecelerationCaveat2.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/DecelerationCaveat3.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/DieFast.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/EnvAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/EventPriorityFilter.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/FairPlay.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/FileAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/FileOutputStreamAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/FileWriteSize.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/GunHeat.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/GunTurnRate.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/HttpAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/IncludeNamespaceAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/InteruptibleEvent.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/JuniorEvents.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/MaxTurnRate.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/MaxVelocity.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/PrivateConstructor.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/RadarTurnRateAndSetAdjust.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/Random.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/RateControl.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ReflectionAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ReverseDirection.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/RobotDeathEvents.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/SkipTurns.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/SocketAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/TestTeam.team delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadAttack$Attacker.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadGroupAttack$1.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadGroupAttack.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/TooLongNameThisIsReallyTooLongName.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/UndeadThread.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tested/robots/WatchBullets.class delete mode 100644 代码/robocode/robocode.tests.robots/target/classes/tooLongNamespaceThisIsReallyTooLongNamespace/TooLongNamespace.class delete mode 100644 文档/软件需求规格说明书郭禹良版本0.3.doc delete mode 100644 软件需求规格说明书.doc diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers deleted file mode 100644 index cf728b1c9fd1074507ba4551cd70d4804fffd6a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcma)&!Ac`R5QZz0L$c!0i?`Yrn0W*djG~}fvSA70rKY<~I?i;5s+vfi#N+xb!oJaZ zw?{$5gV@l}#s63H{~rJh;i!^SCzm{zv77TIC&QO^>QlklPljKK}1vQF}6>IKSoiJH8)jRB)m_iYJfiQT2@kT@^|sRoB)mz2OE%y@$vok2s2l@8Nj<_X6>qv2_3d diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers deleted file mode 100644 index b8400f51d9432364cd49f6e5760f2348385de1b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933 zcmbW#v5wO~5C-5$f^-2P?wTv;rUL}BJCG34HFrn>K}as5qgZ<<@m}m*Yj>Qx(7_w< z1n>$x0TK-_K@BBu0L(gYib7*y$@Y%?@5uf<05E{3sdt&nou(vH%q6A4=V_&kP0!Ry zrIt7i^UF}`DR*8QyGW<)>Y1`?K|YCL0O-jXj~jis>HH$0yfk&7tt9haPDJ#!X?|*}9rLpw9sWS30@DBE3;KXXF z4j#buCXheThE-OQeAqC!#^*HB0~kCxo=L}-AKw3*z~oY=8{uDPtLjiVPN(t%`1DV; z3%S1$-4?qa#UA2gbAeo#fWgUKF)oPPRwJwF;`SYsNAd+)TmqBQ-B=Dk?y`K@W;y)c zk>wMN{*R?5@*9#DvfAZ1_?N?OIL5YIqtY5_C1Vrf2*t^ctB9jKp(@Raj_@u{sd6$p wc|rLypqWdAu(gY5Z45J-%e=;pGVE=jZG6;?@y(AN#w%a98Q;F@#`x>eZ&+g;5C8xG diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers deleted file mode 100644 index 5a5ffb364aadf7e284c9289c6dbcdd895a5ff043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmb`Du};G<5QeV_QVL>aU?K}!6+Z*e3R}zpx;&Q%J>c~s5!oW+g@>sAC zx2Tj(8L(v8mVckW?*Jf%fgqPV5eiRA6w;JpCKpna$ih!H5#f>9lv6Kmel|l{ z$|+J7(g4t^XBbfg$Bw2MDr@E*vzg{q`HZE1fHourdS5?`;dDIej?%lc;i!`mPNZT- zoz%~*;WS^Sh0~Qq50TMP3at-l&&fD4yo~B^TClI~CEc(juFvr!99UE0byeg@A#ego z2=q!FuAkws@<=^xSmqXM*tT~SDeUVQ;z4&@SG;|F`7Gdaquit`xn#B|`sb^4rzHU+ wjCkFfZTF*<`>!=&;TG7;HL<&{7u&AMQ#04Et2G_${WIR%E?(~s-g{HLZ{Y2{K>z>% diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers deleted file mode 100644 index 9af950237546736e4e997007c92f4f515903c7dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2415 zcmd6oKW`H;7{;B1khGLCF|eQ)3223?JBg76sWb=zwCP_WHs|~%aeHS+w$qXsHWtLl z0DKn2zz1MrV&*G=5U=y6N-wJ9c7f9+C;RN^eSUtQCycQY+l!5E=|l^Ry4t$fnk3G+ zRPjDP!n88<1))V0Y`Og|^WdC_Dm#J#D4aW&lQOXIDUIwd9~p zzl#odOZVwJP3dh*JD>^-v}KBx6{RQwD|}|vo{`#D?aL~#xuna@w&TXpcuww$ac~#(jD9K6 z#*e6Lr0V!ya1EL}KK~H}#wxQk8qH=CwlG7_8=QuIPjH9ex(LyFZ3hm~Sg92pbx|P= zfD<^bItbE2#sw|aw3-G<%B{T-#;bfi$BW&Z=2cc*wdS%B@UJr&axbXjSsG zPPn4{JdjqMZJwPLIhgLa&JEoZ1`o7SWEbj*NxV$jYi<_UvNzj3*c~^O9%jg-rG}xh z(L+^VdlJ?*#r-^ptJ7^$d>06!$|In;-t z<4xtm&|7C@CW_OPCn!b%OPqm%X_QAkVtLz<<0ztzIQh#UIa7p@T6~))^=g{b;`cyO z=|~d0bebk#obIOrS_mDjg^z==s$t<28~)klhX^g%AzVN?;ULpOwk0X|aTBQNM_$wG zX-!w|1Z%3F-3F9>%GtQ)AGvd%^#8&vqkj~y#rJtqCw=lWkklKtdUjI&Z|D?4muCrG W@XiQ3|LT{#s>byBSHA|T`tTRm(Z%@y diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.roborumble/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.roborumble/.markers deleted file mode 100644 index bd2015536ca5f69e68e22c2cc2c2046a0800b654..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmXYs!A`?442IqIu!1Hbj@rt#>;W`_qn68}P*nD)qA%T4g4GXMZZ>Rjg~ zTm;@~GK1U4BwNuYFloW~0yWG$#fV#~;BvEGuCG)}J{(BB_B5&-K$P@MXw~B3Ns05M z434TJ3pg=7@}nS2+Rwh=bZ{fxr>w*o5SV3PHQFry hzKkCe{b= z#upH8?6dU3Yahi6AHbO=mSjU9abN>s4%y%Lz*&Xc?IS87@<)Ixt8i;bYt50xh(S&VZ*WxGS`qtSsX)u+lke z^o-O-(rMYfvBa*3gq!!o4Y}{N9d^~vzs<7V9Bb#s0d_mU4?`+ezk8iY3Mx zR_8|GUR+_7{jHY!#Sdp^^Kt zUltUyJT2tuFcAlyR1yfS+Om@y|2Kid#ZQDP21*co0-=ki18rg(%n(orM)hk^z`Y3p z=L-s0nHKP9C}3B1lGHr}8B(I-QId~F8wW4m?adkH>dzwc{R!sZ3o_rFW?n8btBb{% zcipOgii8iw32RFW60S}YJ{iU0!b?!xH3)DQgrT`E%6%<3Nv*8Uex%cQPIqh9itNn^ z_Lpd#+>sz%c$fU5_oUtf{%4)0@ZFxR!OXGMxTN>B@0tdIdt^fc4 diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers deleted file mode 100644 index f4be5ab1765d8630bddc8ebfd4f2c9c95573b324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1066 zcmb7@!D`z;5QfK6O`OuE(4>LV%l4LBBzkQRh2k`%hseYx_!JoLj-_p-U9r2e$i01y zkoV}J&{rzt5NPSjae}Zf%3OqYM#J|lzW^YFxF zn)VxbR#`GfLOPt~)B_k;T^UX%B82eEaN;+fUtjlsu4s4tgs(Q%c!|ZavQnk2^cR#< zVOgD#VjT0F1e+UOu#qPxLyD6?rqlO)h-WmK%*8DYv&N z_o9(|&(2nt{;?a_#bO=odmHTHM`y5;hdezdaHmv%Lg#WCE(3TUxh5Y?z1s8)r_*US zxBj0sH+a`}>)&*AyS-z9{Y{u;nJA%IO+M~ELYJ&Y<(Shf!v!&yNz2~)q?KfxBpapV i?&CyQj5A$N{ImJ(oIN=F&`oUj*SgqMTWoKqtJr@^At?O- diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources deleted file mode 100644 index 4683b6c30c08e4b3d5abdcb528870a568ae6ba9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1328 zcmZ?R*xjhShe1S2b=vdAllRFf=Oz}Hq!uZZBqrsg@^UHr=I1FmmZmEh87UZ8SQ#2v znHnoN2Ztya85o-JawX@aCKkD*=9DDH=NF~xr6%WO78IxIrKBd6rt2l=7p2;!CFT?Z z&C%B@DN0SXHNvSSw=$4gIJ;P{G!v!`hxu74B`BujP*#$fn5&muR!ofA^5PP` zvc#Osl*E$E{5%5o7o?=>B^G4rmE`B=6cbPja%)avXZ3-yJTq_DPi@?^Q z1RlsGS;a6P8k(3JnwlG%8(CNw0YeX;MtG=z^jH{~n3)=z85!dY@giVEAx9C8Km;jE u%gjk7B3eMfLWGH^9)u>40};PJgVSN)=bq}_<;NUG(\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs b/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs deleted file mode 100644 index 0a60e67..0000000 --- a/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeuserprofiles=DESKTOP-SHKMAML;Team -eclipse.preferences.version=1 -org.eclipse.rse.systemtype.local.systemType.defaultUserId=Terrans Force -useridperkey=DESKTOP-SHKMAML.Local\=Terrans Force; diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi deleted file mode 100644 index 8c2319f..0000000 --- a/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi +++ /dev/null @@ -1,2502 +0,0 @@ - - - - activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration - - - - - - topLevel - shellMaximized - - - Minimized - MinimizedByZoom - - - persp.actionSet:org.eclipse.mylyn.context.ui.actionSet - persp.actionSet:org.eclipse.mylyn.doc.actionSet - persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation - persp.actionSet:org.eclipse.ui.cheatsheets.actionSet - persp.actionSet:org.eclipse.rse.core.search.searchActionSet - persp.actionSet:org.eclipse.search.searchActionSet - persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation - persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation - persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo - persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet - persp.actionSet:org.eclipse.ui.actionSet.keyBindings - persp.actionSet:org.eclipse.ui.actionSet.openFiles - persp.actionSet:org.eclipse.jst.j2ee.J2eeMainActionSet - persp.actionSet:org.eclipse.jdt.ui.JavaActionSet - persp.actionSet:org.eclipse.debug.ui.launchActionSet - persp.actionSet:org.eclipse.debug.ui.debugActionSet - persp.actionSet:org.eclipse.ui.NavigateActionSet - persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer - persp.viewSC:org.eclipse.wst.server.ui.ServersView - persp.viewSC:org.eclipse.datatools.connectivity.DataSourceExplorerNavigator - persp.viewSC:org.eclipse.ui.views.BookmarkView - persp.viewSC:org.eclipse.ui.views.ContentOutline - persp.viewSC:org.eclipse.ui.views.PropertySheet - persp.viewSC:org.eclipse.ui.views.ResourceNavigator - persp.viewSC:org.eclipse.wst.common.snippets.internal.ui.SnippetsView - persp.viewSC:org.eclipse.ui.views.AllMarkersView - persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks - persp.viewSC:org.eclipse.search.ui.views.SearchView - persp.viewSC:org.eclipse.ui.console.ConsoleView - persp.showIn:org.eclipse.ui.navigator.ProjectExplorer - persp.newWizSC:org.eclipse.jpt.jpa.ui.wizard.newJpaProject - persp.perspSC:org.eclipse.jpt.ui.jpaPerspective - persp.perspSC:org.eclipse.debug.ui.DebugPerspective - persp.perspSC:org.eclipse.jdt.ui.JavaPerspective - persp.perspSC:org.eclipse.ui.resourcePerspective - persp.perspSC:org.eclipse.wst.web.ui.webDevPerspective - persp.newWizSC:org.eclipse.jst.j2ee.ui.project.facet.EarProjectWizard - persp.newWizSC:org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard - persp.newWizSC:org.eclipse.jst.ejb.ui.project.facet.EjbProjectWizard - persp.newWizSC:org.eclipse.jst.j2ee.jca.ui.internal.wizard.ConnectorProjectWizard - persp.newWizSC:org.eclipse.jst.j2ee.ui.project.facet.appclient.AppClientProjectWizard - persp.newWizSC:org.eclipse.wst.web.ui.internal.wizards.SimpleWebProjectWizard - persp.newWizSC:org.eclipse.jpt.ui.wizard.newJpaProject - persp.newWizSC:org.eclipse.jst.servlet.ui.internal.wizard.AddServletWizard - persp.newWizSC:org.eclipse.jst.ejb.ui.internal.wizard.AddSessionBeanWizard - persp.newWizSC:org.eclipse.jst.ejb.ui.internal.wizard.AddMessageDrivenBeanWizard - persp.newWizSC:org.eclipse.jpt.ui.wizard.newEntity - persp.newWizSC:org.eclipse.jst.ws.creation.ui.wizard.serverwizard - persp.newWizSC:org.eclipse.ui.wizards.new.folder - persp.newWizSC:org.eclipse.ui.wizards.new.file - persp.actionSet:org.eclipse.wst.server.ui.internal.webbrowser.actionSet - persp.actionSet:org.eclipse.debug.ui.breakpointActionSet - persp.newWizSC:org.eclipse.m2e.core.wizards.Maven2ProjectWizard - persp.actionSet:org.eclipse.wst.ws.explorer.explorer - - - newtablook - - - - - - - - - - newtablook - - - - - - newtablook - - - - - - - - - - - - - - - - - - Maximized - - - - - - - View - categoryTag:Help - - - - View - categoryTag:General - activeOnClose - - ViewMenu - menuContribution:menu - - - - - View - categoryTag:Help - - - - newtablook - org.eclipse.e4.primaryDataStack - EditorStack - - - - - View - categoryTag:General - - ViewMenu - menuContribution:menu - - - - - View - categoryTag:General - - - View - categoryTag:Java - - - View - categoryTag:Java Browsing - - - - View - categoryTag:General - - ViewMenu - menuContribution:menu - - - - - View - categoryTag:General - - - View - categoryTag:Server - - - View - categoryTag:Data Management - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - - View - categoryTag:General - - ViewMenu - menuContribution:menu - - - - - View - categoryTag:Mylyn - - - - toolbarSeparator - - - - Draggable - - - - - - - - - - - - - - - toolbarSeparator - - - - Draggable - - - - - Draggable - - - - - - - - - - - - - - - - - - - Draggable - - - - - - - Draggable - - - - - - Draggable - - - - - - - Draggable - - - - - Draggable - - - - - toolbarSeparator - - - - Draggable - - - - - - - - - - - - toolbarSeparator - - - - toolbarSeparator - - - - Draggable - - - - - stretch - - - glue - - - - glue - - - Draggable - - - - - stretch - - - - Draggable - - - - - TrimStack - - - - - - - - - - - - - - - - - - - - - - - - - locale:zh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - locale:zh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - locale:zh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - locale:zh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - platform:win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Editor - - - View - categoryTag:Ant - - - View - categoryTag:Data Management - - - View - categoryTag:Data Management - - - View - categoryTag:Data Management - - - View - categoryTag:Debug - - - View - categoryTag:Debug - - - View - categoryTag:Debug - - - View - categoryTag:Debug - - - View - categoryTag:Debug - - - View - categoryTag:Debug - - - View - categoryTag:Debug - - - View - categoryTag:Git - - - View - categoryTag:Git - - - View - categoryTag:Git - - - View - categoryTag:Git - - - View - categoryTag:General - - - View - categoryTag:Help - - - View - categoryTag:Debug - - - View - categoryTag:Java - - - View - categoryTag:Java - - - View - categoryTag:Java - - - View - categoryTag:Java Browsing - - - View - categoryTag:Java Browsing - - - View - categoryTag:Java Browsing - - - View - categoryTag:Java Browsing - - - View - categoryTag:Java - - - View - categoryTag:General - - - View - categoryTag:Java - - - View - categoryTag:Java - - - View - categoryTag:JPA - - - View - categoryTag:JPA - - - View - categoryTag:JavaServer Faces - - - View - categoryTag:JavaServer Faces - - - View - categoryTag:Web Services - - - View - categoryTag:Maven - - - View - categoryTag:Maven - - - View - categoryTag:Mylyn - - - View - categoryTag:Mylyn - - - View - categoryTag:Mylyn - - - View - categoryTag:API Tools - - - View - categoryTag:Plug-in Development - - - View - categoryTag:Plug-in Development - - - View - categoryTag:Plug-in Development - - - View - categoryTag:Plug-in Development - - - View - categoryTag:Plug-in Development - - - View - categoryTag:Remote Systems - - - View - categoryTag:Remote Systems - - - View - categoryTag:Remote Systems - - - View - categoryTag:Remote Systems - - - View - categoryTag:Remote Systems - - - View - categoryTag:Remote Systems - - - View - categoryTag:Remote Systems - - - View - categoryTag:Remote Systems - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:CVS - - - View - categoryTag:CVS - - - View - categoryTag:Team - - - View - categoryTag:Team - - - View - categoryTag:Terminal - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:Help - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:General - - - View - categoryTag:Debug - - - View - categoryTag:JavaScript - - - View - categoryTag:JavaScript - - - View - categoryTag:JavaScript - - - View - categoryTag:JavaScript - - - View - categoryTag:JavaScript - - - View - categoryTag:Server - - - View - categoryTag:XML - - - View - categoryTag:XML - - - View - categoryTag:XML - - - View - categoryTag:XML - - - View - categoryTag:XML - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps b/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps deleted file mode 100644 index f5666298b590a888c66b2f99be77b3cd4794bc6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmb7@y-or_5XZ*{FtM{Gp|ZGL4iMu~Y+Z*@J*@U@S!&<5!3_ zmOg~Of$$IJMIsTJOhuDK&f0lS*wIEs zng%??h?`SRx~`@6kdF_e&XBvzO%lf@%ohZ(P|ZFrmjTnkH8prgNlOkRp+cm8S)RE? zmY*#;lVZ~D{^ARE)3x)vp^EtAEHc-fgw8ljaCh}>*s-{M(hU;rOhpA~_@3wq?t3kl zl~}G;T;)C?4^*9F-;Spn`Vwm$(mmxN#i-Hs;2m=5Q540>=gXxPSWB-QoA5#tniwz| z!V8?F8_IYGP0^NwCQ1TFYI{MK6=o}T&xN>0_NMv`Tl1L=v=jk)A`&rW^zd;6rSufp z6l5@(-t_157&g=E|Mt~3Qgl>eV%X}>GjBU8-L-#Z>f*_H12?@3`&^RVSL^4HpF?WQ JRD1iH`2};=LB{|9 diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt b/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt deleted file mode 100644 index f84b816..0000000 --- a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt +++ /dev/null @@ -1,29 +0,0 @@ -INDEX VERSION 1.126+E:\2016Spring\robocodefiles\download\app\workspace_robo4\.metadata\.plugins\org.eclipse.jdt.core -3253539546.index -240634369.index -3357244662.index -3837392347.index -1270703585.index -743580145.index -4213330522.index -2815204631.index -972965919.index -649753860.index -2097671088.index -2394798482.index -1886545541.index -2420224983.index -9299668.index -2806151389.index -2816454019.index -2169288515.index -3228954160.index -2122446671.index -2936589608.index -1812437159.index -2690281349.index -3090911769.index -844486800.index -195189658.index -2555277089.index -4256357263.index diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat b/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat deleted file mode 100644 index 0facbcd4b9baf082511caf207f299df748e6ab44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19199 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 H#FhRJzcsAQ diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen b/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen deleted file mode 100644 index e9fa6008becd133f1cac4c5cec7f4311c6576acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen b/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen deleted file mode 100644 index e9fa6008becd133f1cac4c5cec7f4311c6576acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 diff --git a/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen b/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen deleted file mode 100644 index e9fa6008becd133f1cac4c5cec7f4311c6576acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 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.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.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/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/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.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/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.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/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/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/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.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.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.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/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/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/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/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/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/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/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.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/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/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/代码/robocode/robocode.api/target/classes/gl4java/GLFont.class b/代码/robocode/robocode.api/target/classes/gl4java/GLFont.class deleted file mode 100644 index 292705151399aa3ec0012ddd9685b5c266e07e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmY*U%?`m}5S*=6Y5g?bzzqjY#ErN}xHKGy``7xy*HoKSc`ql4g9q?XV!v{6nc11m zW@caS#}mK^o(+T0Iwa#*T!p_37Fk-@FbQ61BqBZd>oAs4L8wkus)`w*((CUC<~-X= z2Nl#Cuuvtm1C`3v~tic_%8yf~3M!g0+xQvZ*wwRl&_*q5+?GKZOG7ta& diff --git a/代码/robocode/robocode.api/target/classes/gl4java/GLFunc.class b/代码/robocode/robocode.api/target/classes/gl4java/GLFunc.class deleted file mode 100644 index e59a50857aea98d053d9e38c32eed708e1992391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmY*U%?`m}5S*=6sh>99zzqjY#ErN}xHKGy``7xyC)Fm^dM_u5g9q?XV!v{6nc11m zW@caS#}mK^o(+T0KE&gbxC(z6EQ%zuVG_L3h(&Vn*WpP~tic_%8yf~3M!g0+G#H!ZY%#Z3@w1Eu+z){!G4B8X diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/api/Module.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/api/Module.class deleted file mode 100644 index 6b01fb7b7f85914f7c1e01322927ab08e0f1b7b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1817 zcmah~%XS+@5WQ_XmS2#L6TcEWvE!F4KgQ1_VB>&onS@A5kc_=x)si}LC&P@+JPc;R zjvYI8?AWp6umKL|Bp<*>ai|&%qp`GLp}Fe5-M6Z4jY@z2^Vd57n>fv&OW?Mn1IvG9 zd2Yq6x;1U7hOvrnEwpt8Jp%Hzx=@y_oVxX*@>*Ae40;77+iz7}Pg_r$_XK+PjAMd* zf$r?msX)&m2@jwfgG0!mPvCmNIQn_`RYiLzs$y$_;euOL_Nnp=uj9?0;N18Wtk52< zmE*3!pn4T(ui&bht_j@C7NU&9z}Qy7_`xn`&|fxnM+Korp|;vj>~-j;tJ&Qrg$zan zZY3U-$gH3okf1++F-&AIE|6=_($`dtZN623aUH8vDaUK=4dFKK2=sZnP8n)XU?ff| zGWyU~zQ23GVW$K}lduOW2y9)_erN}N2KUIw78lyKrsm8Dj3=8VH*{)whm6TzXouKY zfr*4|%BAUffvFZ9DLyg5LG&e7SQHrRJQ9;j^ggwbMdSNP_+{!(!XIfBoW~be1#Tq7 znQ`K6i;PLODU&m0+cC9qwNC0sT5l^|XZek3G<5AG^#0S`N#|LvD#y{a68AI~f0(|` z4qRUG;DdBih)!Rn7qaF5Gky8e(>rNh71% zZI!=Bzj@JtvvaNORt$jwYJPLT&`gl+zjAW!>Ifn0;xV$`cJ_aN?-Z--hF(=48=g&r z&8TZUS1<#bYV^5AGqj74<{3TvX=M=#!fUxdFz{PM57DzX+8n`q^nIv#0Po{Et*8pz zAd%td>`fLC4O(~6`rYs?+50C(hbLtp!(G|WFfAW4+?Ue~b8?1ZLEdM`%2|e-oMTv# z^9*Zpfni-PGHl8$!?s*vcp!5OkK{7LhjN8sPp&fT%Qc3NrNwX{*BOrF2E(!3WOyRC z7(SER3}>#N+@*F^Cb2p$#PY##1=!`Uy-soWXfy#sgy=z~vW;(`NYq diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/core/ContainerBase.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/core/ContainerBase.class deleted file mode 100644 index 47d94b0bf58541608171e0398cbc8857e6a2577e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmah{O;6iE6r4>=9E|x2G^HPaK&?b_z@o<{%At`s1$s!trKgQqf+6fi_6CVx#I@xB z5{F(Z^+#15+q5<1z+rdi%|5@G_trmu-G2x00h=yL0^3^IAUO$QGc=(&RzYZD6?BcZ zGSVvkBopPr5m-8tmogYjJqkV#&s1mys*z5t)S(i1*L%K9OQ6z@bYwdM<(}izH(n#6VU)Nkrj8>YK-tYAO z`RtBmlC&BHCU;IFv;AnKrJcr<*lQ0yKF#Sosni|}TAfydyMRyWzp}Fsc;RCP6_4np zk3}r8SDWbzEEkIBmIUgL+q#c-?uV6Kai7$8F+m&jYG8`Wm9_eUc2cC zoGp4O^P$;nYK^E&%rR#S5bzXaXPS5Lz7dq*bFXCN0_KVRJOK;o=Z=&1MP@n6t+DJ1 z<5D38zA#RU)^4!+1FpD+N7TGU{VQ3gps-p{s9_DSc>kI!*G!o=jNWqbH}&@2%>6pU H5;lGVG<%yZ diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/core/IModule.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/core/IModule.class deleted file mode 100644 index 79a981b0c23f2fb27cf2992df6f6b74a2ca19d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmaKn!3u&v7=-7y($o$?*B+oQE!5HI7z9QKq5G=8qKFIY+QW6|0eYxtlTIDF&A{-@ z%=2}B0N5h*;1HHA8_^X)t5jtwXOSt*;&fJd->`=E%d`Qtsqr|CfxC(@Y z=TK;`%a(KN&QTKfMrp%@bah)7gz3e0uHsy`v77&!H@$R3APnLyfa1^)qn?n(Ofdcd DVrnnz diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/io/FileUtil.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/io/FileUtil.class deleted file mode 100644 index be119ff9d92f3d31d5eecf39fd1080756a00a508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6012 zcmaJ_349dg75{(9CVMam$>t(~kmXR51rkI>8xTtZXe1;SVjzI%W-|#Zo1L&bOQ5#3 zQl&R)tJYYpT5HpTwjAve#ezpgYfoE`T6@~N)}HoKD*eBi+07v{w2pfHRQ^aUm6N&1Vn~|s+E`^e-L%Tvv(NJul zsk8TLJ!~rEhll$VircLx&i-Wzp5@_aBo;AOa7TSZw}Pvc3O$%cB^x`}uWjqNcvai_ z)vaBf>w7#XQh*QBQR+s?1S=c%Busr!gCAuI(*|_&vbZs%$IU$o7u4G}EpIlM@knf7 z+0>PWsY`BDC}`RK`cRH44Kq-!P`KQ2yCR4FhHf7SlZIKS<<^95wo3G+&enAJvaJrp zG@wwHHq_R+dUseKG9yMz!(4b2rVr6+bAuTQ@92t$!a7&lBQd=rIoPYmyF$HDuK3%H za46axibv$$SPfM z4C2)IMBm#qG=t8#sjnk6NWt>7H`$dSdAd-;Qm_Ee%$3Qh+KEFyz42isTHR=wScg`9 zX;_8T^g9|#m~F8>eRpR+h3eZH+C=DL4VR!z!JA0-CanF;1s~?J-j8U)j+Ggph6|#4$hARZpX{OO`4D0dMP=c1P- z=z<%w9X5tYK6R6d)i#}O2kHNEyi3Eo@g6#@?@WfG?5_#gviWma!)6cO%i`}bl7Vn2 z7BkF%SO|myVl!aGOd}966MD2?D5c7c_obnAjJ3svlH`!M9vbvvFK&>Qu65)63NzBo zBh}QIG_&^Y!ws_eLmEDek1!}o6I6HomX<#B*>p+oc?% z8a{{5vjrjv?&85_#F=FVWj+0(h6DH#1CB;)@0rZf`i3nN{9%=q<0~2t3fmRQQ5A~o zF)LUhqr)0LgZpLAS2cW1Y!&Lesm>zFqZ-DnCEHOC9^_d-wv=+Pmzo1o#1Bake|=K< zrz^?!CW{2etNH{UapPfPoP*%oje!9@uHjKR{X9`)V0AohuuTWBz=OxxFoD6)oP%Mfk^-}0by3ElgQbVT5!^lBuM{I!!rVF!Qc++^x!!bh~t#4 zD8S|B0H*;toXEooAzfjp7c~4>O1zMLKVWW`rJo4B|5Tx}o;@-JYZj>}S?-Wh=Wb@!%!4fi+m!8UMBP>2DO~O^RZwVteNJordq@X{wajjHM;)U!FF& zDrAOwN!rp_Qfn`3_!&sluMk7qW@DeT#Xg7~H@RlH`d9JI+TxUMOUN{%x*f+qSQSmZ z_JV_y5$lf(Sd#w|$*^_LmY_cy2&^7UY)_-`Uy3v(#uv$gj@L3^wpx;Dw@+z!Ros4q zX-bcvjYIap7tz^sWfa|L9ZBPY9;Im6KBy*a7CWuR;1Ds1XK!~=PuN+XARyXT_eI$H z+1uUJu3M`UHdkdfcWu`Poj?Q<0>XcS(>VqV{yV9XV;-3kNY+l$#~eRK*lT5^3u>K(O?csGM}#* z+$AF-uQ+wW%|F&N?~;7V7XZxi`~2D%iq{@Pc~9^tD#uVW3eVbL3bPMcJIYYWQ!pR% zxVw_NfZ5a%KpAaRaj2e&`TQr(^0+7&Mu?F3Ki_%+xDI3S!AY_UE!jLvf-eo!yM)(b zyv~wc$}2JKVUXt>!Qye-KJEnvSU1kkvhQ&a^zzC1lob0*vUFT9hUJreSUExdA}a$T zzrvB!rPb6yb~V3M&yGtQ&=O~Y{YGk+UZe;rBP58tS_}tc5|j&i+1W1 zl)3j5-{n@h$(&xS%hl9)31!8 zrnz9zNw|4`YqjenJk_ogZm%vlF?CT|pq2o)(*rvp-KgO8AgegWFn6+^6R3g7UBe7$ zHx@I7b8rn>_}#`~v;*(qOT@Jd|2k~puyz%$N0@5^T-(95A+9BHg9XjGR(tKjh!rto z#vQzpp4o;^;!a{yLs0L+r|3&9VZIypu&f2b0KEP;5OCvOH}<-*uei;PPoIL9pWfGy z=k^j^jzZMM;#Id$UNC)xdHn1Mj`8aYJmX4T$%dK*1T9mqexfaWj>W`?2Gpp=2_XVKh9ux{eh zTUb!HvTtw0YL3a92<{fbx|4A3B9!|H;?0EdZrqE*lzEUKoxrG-jsRgINcfHgRt;{4 z^s%Dc42#Q1v9iYFN?N#IGp0IQ5AHC6O;qMe#e=5|If)!YYD^j^a<5IiW0dd z^ZS2!6u)X`P5ySWD^Js*XUK@p@|=2(eEB?Gc_EY4LY`Z{xA>=wIM`X8$L6!I1f61W zs*+543Yw(Hi$7$1TV!Djp`!AhG5pd0Cwd_cWFKHJS;hoUFaDenUF?Wj0f^{dDC)SM zE&Xzq^xtwzOZb1!E&XbiG^aZU(h0Uj`k%R_-^h~w_nS-qC#SUXWJ$l4k)8zE>;C^y zdJ<$Dw`7j6Av>KBZFC?jw$XmQOd*GC&A6<}dkfk89J2GWWDDLxwlIfm)~vzM(@>x7 z_+0ALX_@j;c50s0d0D2XDH(Uj&mP>n2dG&=`nL9?NWq-g7q@tSs(DK8fyTWpPFsa gaVg^!pYkj^_CuYf!aTOF^ewryj7I?RxnSuIW5 zG-;F6HtAOy8*OX9($XevKJXkM;hglG=7*fqKdGmur_a4Ju*il^#HuK5)Kjy+G&Lplc1GtYFL;RU#yb>C^%Wf3wZmf?>N43e4VwlSL_O|7 zTE~~x`9Cs8KW0p9Lz2Q?DXa%WFtHg)DZj(SPPHR^U+&y%LPt`^eHylxL8v_5Kr7lz zv}22gWS{avDt4MM(4e6)Z@c1&(#(YLN397*Xh`S1g5``^zAeAiqJcWJ(d%&94m7mp zH)MmcZVg08YF0tg(4G0hfM&;}Yh5N%sMlZ++#wMJR*_ycXYPWxH#=rf{D6sl$T9vJ z5*H=d8huXRt)0R{5%uvIK?*%GM!zHsBK@$5Bls#MiXuGgd$Yn1=QJFtamd}Kvv)5U z=*1&C`qq=J(!|6uJj!+Pe93Zx(?!?w#efxT6!b*{$1$LzUqgE}5v9;}auNII`D)?> zPHHeiuipynLf#5(R}oT9m4Ru?AK}TuEr{Nleh=cbj#C=8)hHtqUqd%bX;xO2;~E%5 z-o%hx+pN~)%CL#EGW#}9Ii+CQz&VWS7}2n&+WSBhO1>S=N>3v=-(~+z;YC`GKaO@tXlIBG1=#jIw(PD-YGQyZ(r3-8a<&)WH}MKyrDs%?Kk~%p*ZgQ)*Q$AY$+b#25!qT8^j-E8vl`3gg89T z`ARuO-3$1Wi9chWS*yBI8Tc|RRrdoqTL$r06Yr|lRdBq3W8pSz=I4avu>jg5Qm9wc zK_Z@*rP%hkH;#JeczFqf0nZIQIcJR#ujCiR0;K<}{=75YDo#eKTx1UXDk#nDK zEpp29X~@aQ=e=@x^Vz^}6I&?1m0yn{!Czp<0vhk2X#v~spk)QE<4f3e2OS@AD}np@ zyH%OLk0y6fy%S$nJD?d}6JldIK1l^OcP(LeSv9E^Ta}6#31AQQQm`HmAj1{u$wPcb z%6E`0D;vte-3)BcIs;Kq^_=6~v4KOBlm?Pro0hS^+Cqk~WGgHraS&foF7PH0S20ol*dlYTILXc>pohZb@4CSL1W#$#t%Z(_>=nz|P8_&mbs?F=7_cw!!t3+Nah z`sXs9yd?qcpwxv6e5Rk4FZ1Z5_CeZS!L#ElxI~OC?k-}2f?^TVOK?7hn*bN<77@;) zVbw_YXY)vQfA)`$7~?U#i5v9t2HsZBI>pa9G;yt){Om_F4v_8~+8E;=Mw#KII7fhc zaF`dAhiTymr~FamdBHf3K0Jd*@FG`VWjb8PWB3_mZc;*Wyj|gcD@Kdh;2W4DUf<+i z6H*y7@gKD7Xg#Q((DA~*DP50muW>R!JS8X1GTiicmhjy;)LIk`(%`8IikjCbdI>K_ z6k&`8WyZEigJk4;G?{*l@aFJoK$d3?rU zKBdzs+P_}I+Au5YY=xgGWkY5&TWf6NWhSh&(W6qSGyP^|D&4PAX#p)!8f{Z4@zyx2 z=9eGi?F6Lz5vy%H3K$`)qh$3wSsi2TJ%!zz_J{Cvg%dq7SdtfJac82D_0Fjg`|}D7 z%GBQ5^*NI1Uw^oQ+f2XTE5m}B=Xv7Zu4S(mkJ6YH7)AfW(7AAsDh(1_@=rA`F%xpaph-%WV@Ia>` N!c-ig2I(GA`X3QtPig=F diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/io/RobocodeProperties.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/io/RobocodeProperties.class deleted file mode 100644 index bf77d9ee6f427b538ac095eaac6c9f0d2cd8a49f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcma)5ZBr6q6g>}b3+wt4iWX^RX@aJdX2X8bArg1+>n zno*}_`T_l@ru!`0f}%6Q%)Z>`o_o(d=kD)6KYjt2!?pw$!$g&vv3e`C3^#|ru}K+VeB zv?-l1EJac+K3UVys^xfRB-$DBW02UGMuS@3L|DSDi!H5E3T|VV!N)%|h#W(xy<2no zc=Rv;hC2$p@cD6<1}XA}CKXH|APBzGsPAOzzx;_abZhl2FEk9zJjs+wmg;1O(iW{!Qr1)p?|0Oi-MB}q zZwSt1QqMwBl~#ZNa-EwwUN`BSI7JSl`+huOkaEdvZacjtVS!=jvJdMGty1KMjCo9o z%aVd;cus1nwHmJ$8HTA)hcPxPE)dHKRzR!cH}$5q3F_i>)2OHap68)Wed=cUJPK|ii#6j1-oF3 z?u_EzsWUui!F*P5(1Iw<1Vj*}!~mu+O%cIn+&Td~-!SsUDlS?!u_I2q03JGsMH`_I z;u9qIXLvjU>9)u=krNJbhEBY2$!m<-&R$hy?7AW|R~LynMcTNJUFN>vfCG4BdDGP1 zZLtpp=YC@T;0#a0r&v5i{2VXdw4`e)zCwDhT4kE@g|KehnQ$mLVw_{+x;c^#l?!6f dq7fItYR2A(?%-T&1uhS?<5XeTB9IHO{sKmY4UYf- diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/manager/IVersionManagerBase.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/manager/IVersionManagerBase.class deleted file mode 100644 index 2b3eeb5ae91939f29e240f6d29a6d61cc522e400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmZus%W48a5Ue)p#zztlf%plEkO8lrj1X8b3K4SfHm>cuVrF1w^y57E0e+O&>cU>U zba&C!Rn@2S;Rv9Q*9av-&u~zFrJP;Z#4cI=Yok+kD*j{VGi!eC_)B|^P$slCdau=1 zn^a8~8%_eDo^r_9g!fK&Tu^4gWhNaE8U<%Ucq`D*$3`@sI^CG?k@>Oq;df_pz0q2X zczN5;#c5`DF5&NN%Y^oWh@V&MDnSn9NuVr=E2zpqi1Pl7+6~vy5C)+swS<=o7bZwy diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/peer/IRobotStatics.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/peer/IRobotStatics.class deleted file mode 100644 index 5fbbc3de004a312e0e2a80b7a5fbfea8e655ac19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmY*TF%H5o5OYeQ&{hKR1SVLB#1B}II)Nw?TbdpyRY_43`Zxw2z@rc;%EEF!TX(kK zpXUp}25E$VVWG)#bKz}MG_om)--%kD9UZl~6;??TA!L|Uq7%Fp`pWl3Mba|NmC3ZF zR!FNl`h74Ama8*Es?0$sZM`^EW?ObbODesRD03ol^DNGrM=NQkYI3%J;p;wk#NeD= YYan!8h8VepA@Vr(IO)+{#%=~kz6+T-!TrI1a^btH9G{GjTTEc&+uO zqWlFU{syn*rBp~Dp7}$(AjFy7wLOuH5VAabXXe~{&pmf${`mWs-vE4srh$Y&xg!I! zcWCp6kvzcQ!oG7R;O+5?jK7#5Xfvg z9VfUekX%@NCXiB|IV3TbM;aM{i*=_X8>c7x(r;P&t`sQLJ==1hS-zv@@nR}Ca(V)0 z{eO|F2u!qP@X+zeg}nQ;1!foOAy>yUw;fkj7NcoMz19h2Tl$qO##vI=_iWkg4PxXV z@J=2RxGZpv!G|%|;+SEOX5c%WcICgbP?-bA7r1a1N*x&dvE?gz{Tx|L6Bsl4+Ucr2 z0pmDAW$~WCxJ`k3Y|V;tQbrClxNhJYwH~&o>RP>C9yc&c|3lAjSSO4$H=+Vvnb50Z zU``;f%coL&n8yMZ1;$8wM+QgUfxx{H@xIZNj^gPVe0k`yS7sEUlEV_p29^b;hTP9$ z@>qe%bLMnjdM{YRx}GySg%v$#yrd_Mm(;Ob&GY=<63D8~Dvj9e1sxkv&SJvACscdL zDn2y^J{7p8ExWF4Tkd^Z9ipvoZP^VRuVY|CU}=czmsDdBwxtj)%O?fRVN+mc=+N+* zr}j~#k_O^E({hJg8(y&OopufeDE2PWs^6u8){*$wQh@$Bq5#@{|8B6)wvwmys!Pqs zHAEy38*&mKf@y8DUuWE2z6VYqPt=_smKJwIKrr$RZKF0)O5X9Z2I^<{S0#zRuHi=t zNsOL&w2lN#o_(sQMf_Y%XcEY&)UTM? zOBOz8zQO!Ps+ba7NbV(AQo5eJ(((hQ?`4LkM!LbmI`Ebl|Tz*Zh zfY0y%x5MuvtcTwQD&e<u^%4oiY6S8$%hedbSKYhZmbu$~O8=R`!f3^`WukUNv)u!U_h zoJSF#lS7(23G#T%-CAg=Si7NBr}Z?nc4#%oLA5=Kw#$_-xiXFPpLk&4_LhNl{ww_7 Q`3nhyRR}yGB7v{|0R(>cqW}N^ diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/repository/IRepositoryManagerBase.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/repository/IRepositoryManagerBase.class deleted file mode 100644 index 09ec41a124c34c16c14dc69c401392dc664ab51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcma)&u}T9$5QhIrG^bHPZGC}D%rF+%I=8~^ z_SKqTV{him6}wERlso10Oc>UaN5WapxmmOGop&~SiHT6xlc(7(%1O*B!7NJlZ|Rh9 z9>lf{hvLocR#EP6>e)|llhwz5`ftZ^BQNUs&Icx3{0(=xu^$l%M0pZ0EUfz&VZ&VE QVA~HdE*rv8sRJB;1L*r>bN~PV diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/HiddenAccess$1.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/HiddenAccess$1.class deleted file mode 100644 index 2cde5ef5ff83f10cd124fa2368b535d85cf39c05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 964 zcma)4O-~d-5PiKf%dE=)vI2_hHz2zROw=RBM2SX|1rBR4(NphC3ys4JneN5-LyW=S zz{LwD9{d6RCS!avyTl<}ICNK6SJkVkSM~ev&tCu@A@EQUSWJ`+%!eRLduf_wT;0j#clZP^hWwH}&_4ZU~J&Xv<6u&wRUg}sSa$iwel?jYI z(TTQC1)NrUTfki>ejN@*eR!w|OmuXjHv9WMmA#R@SP3*bX(;1undw{~e!6y78-aG` zf~Br8vt-!^R$#8xDOa~P(25SaHq*(@TKiocS1|2i>P&wFtB)C66&ST?C;ghAq%$m0`DIT`R+n8}eYtT)mt2voN0r11HM^Wu`;P3A{+cI5p&9L)qOl@~|YZ za3P+3EMtYJVWy;2>#;PZlgcQc`}^~)KJV+8wle>vkn;EGSW0b{J;~PVB;hFXgv#I! zNElC*J6+-7Vo|%q*JDaSSzY>p`uD=@^R5?eU*OU>M%^DcVH^|GxC5Bvodfjg=~6bA zPte$0Xl+BtjFDPaG!bwi)c~0XyXA^iwuK)`1}Vmm*=Md diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/HiddenAccess.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/HiddenAccess.class deleted file mode 100644 index 18fb3a552d080f60c21e4382940bc2bd7b0370be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11107 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 BC7J*L diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenBulletHelper.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenBulletHelper.class deleted file mode 100644 index 241ce7e201a843eb20bd4cf1fedf32ef96603729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmX^0Z`VEs1_mPrPId++Mh2a{)Dr#TH2tFdr2ORklvMrV)a25l%#uodPmj!$l+-+@ z(wv;s5|7lJg47~*1{OvJfvm)`ME#t^ymWp4q^#8B5=I8L(t?!4l2k?pO${HoK@g4B zE-pR@4Z$TvnR)5fQJP_l3|ztarA5i9ZkahijS^UF(*x;aV`N}tU&L5{sl9r)m$PQ>GR;hi`D)-q8?TgW0%}}Fv`NB|l=$7e}nAk&+gC^>Y z7|Otd2O7%UI2R>F8cOeUdu6C5$`r!N1%obGZQJvGT9sMSGaXsP zoO!obOA+Ma1U9E<}?s$kbH{qw=%Z z#Tjc)=xfKy^M@pi#!|}F<|rrI-{?|#Z@$2S&^y@DX3B!NStX8xMghurgpi0|9 LyKV@p4A6N4GHN#K diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenSpecificationHelper.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenSpecificationHelper.class deleted file mode 100644 index c8ee127e9d66889315ed467cfb90f6f07b8df23a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 648 zcmc(dPfG(q48>n+?P}{k(7V^}#Q{BO?^2;CxZ-^}n=VtfGi5dv{AwP&>xUAjwdl4W z6fa&TLr8w)z2yDl)@ zTuwP8XcCUb`bn!&yF%R!$83afYyxZHl@7vNcd%aCt7S3?))oJpNeAEhjdv1!sqUj8 zvLdBNI4M}JZMiP-vb#}#T9f_dSwwa!mIv08TRmaI)n=p`Xz5@27*TP$AJiX)TCxc3 x%+G@1xm3dG@0V~k-)xIO*orp=G~;1xqZL1d1Urkki}oURuoo)``|)ky;1l&8(;xr< diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenStatusHelper.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/security/IHiddenStatusHelper.class deleted file mode 100644 index 4299256ee0fe40c8872a6f9e12f1a216c4b44e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 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 diff --git a/代码/robocode/robocode.api/target/classes/net/sf/robocode/util/StringUtil.class b/代码/robocode/robocode.api/target/classes/net/sf/robocode/util/StringUtil.class deleted file mode 100644 index f1e55eb17b0ee30bc185c971b95b240cec147bf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1788 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 Omgp%;i>d_6@cjY!nd&|O diff --git a/代码/robocode/robocode.api/target/classes/robocode/BattleEndedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/BattleEndedEvent.class deleted file mode 100644 index 6ac49c5f89b73090b4f3188fd74f44f55f48e00f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2413 zcma)7*>V$C5It9tkt`2bRe^>5fVr_^>V#Z zugcuK>3KD|WLIT%>4~(xC?W#q+SmF_AmK{KGHWI2xK`cXDJ%+z2Lfjo>bC2dwpTK1 zN3xFu>QB&qacOyOr?~yY#%5uCv#`BO`$Cv^Re`8kt~;LOO6+mxNcX7bxdQJN+pNu? zHk&tjfits~ZFzSEE~WS0WR)oiL>8D*9AOL_7{Z7^IGri=gT4)%#W}UQXkZWtfx)6> z%eAA&W$A32<(d>o7V8zJXfjdm{lkcNXfd|YAZw>!46omE=UO?Dky*tLr00iE%5)|O z@1&Nb<)Yj-S%VG7symkVOov?%7~oasELOGLhUrxf1Olbfaj7O0b z7;B@|;tf;=CU8Swm=SA!-8Mzb^`tEwflPM=db`mGHy=e#;Mxh4P21@>rf@5YX||hA zqGs9$x%KixS@8_a;I=@F@hsF#mkPea5IR=+FdxS!_$-P~*$sg!19w1S6BO2Utpi(i z#IjR=EO0)3%uQx*0F(IKz+K$qOw{eJnG(3%C05sk&Vhv%=+gyZ)~6GdBg2tX+EJU+ zD6GohOG|}%>P?ecTdeCR#oEs8%j!RycC**i993r)ojw{9DGqMJ-N!7vvM#1LD>He1NkmT{KIW<&(Z*c?{(T6kKMY#(h#(f+E?Y)7ddNp~MRBtA~ z>TZZTjuUsg#3(<5*_Sw<9es`q*@@>!{m!EhM)^NU3Xm?s-<^KkqN^EP;>ndJ4DaDG zcXXg>gkCA45DDI=Rg)&iue$5Y{(%d>a?y0I;s$25L!)WnI~4c;AM!-S*bPqo7632x z04MMf#(eM%eicbLQ4R90c0t2F?+~t@2D;M&n!q(&_gQ~tg6gLO&~R{VPy_>uKB`H)vN<4n_QyXskd zfjOOD7V}sjD><=A3}q>_C7JLG6N&`u@~A7hP@C!jzVwspl=Mmv z>UKd}C5@qoRUewsT?6$0g|%Jr5*tA|pK1q8BN4+Ewtd)DKUUQ~$2uU>1=&HV2jp1C ZrCSgd>}wV$gl{+r;N%ECCjxtj{|}XE8F&By diff --git a/代码/robocode/robocode.api/target/classes/robocode/BattleResults$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/BattleResults$SerializableHelper.class deleted file mode 100644 index 3c98b06448e813d71456a4c28d87b99562ff4f2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2462 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 B9OnQ4 diff --git a/代码/robocode/robocode.api/target/classes/robocode/Bullet$HiddenBulletHelper.class b/代码/robocode/robocode.api/target/classes/robocode/Bullet$HiddenBulletHelper.class deleted file mode 100644 index dafe0255811b08e637986bb7ba94a66418778756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2776 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 diff --git a/代码/robocode/robocode.api/target/classes/robocode/BulletHitBulletEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/BulletHitBulletEvent$SerializableHelper.class deleted file mode 100644 index 8a28f9c34303c21b985ad1cedc89fc6ac87935b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2027 zcmbu9T~pIQ6o%hzV+$cb4Wd>>Q9%>h8bR@c;s?bKsudhjX7tLmY%xqtoFsJyFTC*g zc%e7I$c)3aKg#iJnwHXL7}Ru{>~3<-dCqxv&#&J$=q+j3leJLOq)RI#% zYbz#!(L7v~{CAeeFjZ>BK4dz1Lh!6le5uMXrr7++h9fz8TLcU%|DcF%IYwc_=Y@K;8ZFa`(BP7S%k3IW z%FvNXVuJQuhky#Q$T9S-@$hUESA+dp6bcv$E`kJ1YmKBk!WVUlmd2F$>Ka2P`l~20 z=rknCK@JSVk-iCOmA6&v)&EyZ?^aI6ZRC@fVHgTj-JhU>Sy7t=)uw3sqK0?H$-T#r z(;m>(=5N_|Eqkr~+=MG{!XnKnC}5sppe?I8dxJrbu399liiZN=5yN=bk;->&zP#u; zRAtfm7>;(mrrr3i*$^3~yBzM{yb;}!0>~hp=wK~7b+^JFS)zxfqq@@-QC&0ShOAJuLtO2 zES}xOtu5SH%+TQeF7z2`2kPrwTH3;cZ>_2fP*#9TJRU`@xAAB#9<9Zrg*-zT#$zmy t?Fjl%q>+>YiTNbt8Kqb}@ZCYxSv92wVx`!dhy`|nfJF*=n z_PD=i51TZE*rYw~VSm#!@mL8dE^8pVwF%PQ1+!~8FpKGzU4ZP^`?M$C~#)Ob^O3^g0^Az z{h;(jV476r~NRFnGDC{ZJZ(H)OXd1UnLV8^pu z&kCN0@#+GFL(A_Pfq5*@8OmId6s1Hg9oNLKQWEX_c??A2vwK z@&oBePoO%Sd%Bqr;n&Bpgd2G*v%Dwx?E^~CaFb2rI*GOwxH`mA;xfcCOM$U48i8wX zYLgz{Zpf%Wo}I0TBQftnFYER+;+6EIl1&vmX6pJ$aYQ_E%2+}3`!9`d)RgDR{a!ea z)=!Mkb@rck*}!b}b%BcMNh6Tk*5RRa23o2ztE^12OZrnCS<&=?x*C9OX?LYp&*PrJ z&A32m?9PqCifG`znn4D%dO~qh;9LJVFJ&fTLPkEj)DDYgwcziBV#y5v|Q|iUx zs-B-R&hk6O(*f_5oypouoU1LqK&7_y0vCUyC__^UmgBd^?;@c~G_j2LDY?>z;R9Ua zi3UP9BHSrQ89Mk7mm@bCS9Ld5`yG{Ex#=5MaRaNN!BSr#GAQUE4SX>PZlr+An8j6^ zQwc6}RZgpHW(X_!rZ8(hb}} zJ&NZ|DznK{zDY@?fV=oSf>y(7vG{+YaUfpeizJQTh6Wf>xquBcBiKCGLD@!_pB;j1 crb0$4ePsY)?pw?)g9q5=TBMf-|8*2!0|k587ytkO diff --git a/代码/robocode/robocode.api/target/classes/robocode/BulletHitEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/BulletHitEvent$SerializableHelper.class deleted file mode 100644 index 9ce95f32d69983a310e50cc1d6a25a15d45f4e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2215 zcmbtVZF3V<6n<{9NlI8tN#rFJ6`??qCM;BZp}}g~fL)EPQivAc*rc~{nXqw^4Kwf$ z)WHvq;EX!{0zc@Nl#v;S&-^II=k9Kkke9+}W^(u5yZ4;uInO!w?Bjp_`WwI;zKkIx zkZm?9jcQ|48cXeZUAil_d-0ZZ+?jRRw5_^*$EwujimZPvn=xntQ#Y(zmQlBynz2^7 zA**f-QGv6LbdA=Q(RJ3^v3Bi-W0=Fv1fmyg$95M4!s$#|KwBn>IKtSgBZdiqeI?tG ztL>W=*}S4i2qa34s#PyrB*t~HskvX-ErDFAi~ZC<3IuQ2cjVfZz+$?zJNL_#9rChS zC=Etm$e1xC1rCitk0XHtIu7EHz=Tz;%2sRUj6gm;j&32-hq3N9ZKqa9`=_p1>!pyl1(Mvv-?%zHN4ELgbeAybn>l0YHWZ4d%D;H<^Q0+V>gVY z+pb({Z*7fEN?GZCQpYKzd%B-xpu6clkV49yMJ|R}mg2xG9eJD<*jtmXUu@>4SH`Bw z)EOPeL9A4u`~X`sLvks+s!p9_Mn|9O6E-LUWtPC}I^MvWy_n_%j_eXsQ9;csD5h-; zp`yBd(Tb-f>%~VNAkA1eWnb2={{O7?*SX(GDEK0lV^|VMdUf?A2^~cxdX%D@j;oS$ zNp*^M)om*BH!Ruk&b2^&Q^$LFUtoV;3^uVjoxh+F(CNWn80Ejn8E65fZBtv-t;j zzJtTprzWod&TZdS!aMREaqrT>_cXrixy|~ffm=Gki+IU{O5$ZQ4$)!~ui%)+{5WO; z&~Is{;z;KSI3 zmd-~WBC(Ou4oC9a`0$SbnSLg*UoeedDZpX_r{OODrD{OY;0Wu280FT3Wm-#;BRsq&)sa6Gzri#Gs%5>&hv7fb8r6s_xC>m%;AeL0s@z<+IFo{ z+mYHrqgs{Dis39BO4A7=BrxP3x_bg~TUv%*ElbNbYUXAkFCZQZTv)7`wxgR)S+6!^ zAKj~upnZO6d4984`f6>x@NB(M+M<0S$g??tkf|R?fkg3Z{ZQAcy1A!qIF@1Vy5SL>Z#v1~`bf!E2 zfh#dwz>u1~8N)@y)$FYpE+HXsv1pibwQ;a5t&+Z7brY{uNQF*9xb`+f&c0y_q&fq) zXl2F&d(vs9FEE_WbXs~AOCABtjTD55DH^+s8qLePB`dlkcNk{9VLHZvEE~4L9Og~4 z=I9PP!xWNjbev%5UHMvdsUKnV9^}VpuufHY5&dNol;CMz?&^)Ivt}7J%W&8xW?2x3 z>=<@kcPje=+v$_KRMQ;8bfmSbSEQ{K7IfRFxDj$iQ#zWxtND$sOKE8Z_i#hiQn7Q* z9QAJ@*RogHbmtW-DdvKyVsXg)oj7p>4TSC?-^R_oHrh4EA%>o?_9UdOuuQ55k^y#Z?i z+Nllc0d#v5(JNH5Jw7WieJVKD^MbSwg*> zt_|N!jzhE=#t45$xjLXX_5U!MeSu_l@))UX`WRQUsn9X5{p!Nr=5Nw9nnDQE7{Cmj zXml})>paVHmkw|PV;t2?1s3j1g$}qg6+Fb>3^Md0RcU0aQty|!$KX-r^dV(hi4kArkAj7W;l;wD?yC*%}O=8N=<)n~QXCbAY z;OYOH%a=Xf%`lhKOFJXG-5&1ZBzM*;ZJMJXN5S~qPaN7iWVS(rUWek;=bQ(9PHUyC zVv@fe99^zv+nIz`1 zK<`SHi^$VYgo0bbGCe)wZUo{VjE4EQ0IZ~( z5-+gY+2kKx2h1oQ!6#VvU^h7m!j!_g7D2{&30()B4* R3E(qqaf}jNR0`d|<3|ZSMTNSIy)qLGBxcf|Z z9A16A$4z%?gWI}h==)mP;7_^np4$>44E?*>o~9a_xvj33cX`E?5M`J*xvM%gHNbP4 z)~;@uYM~R1A-b%ax_h4?oJ^G%BCF(wj4*l?Na$whE9xd+tG_FA`-O0VVX$abG^3=E zW3=`+BkqpwFsQ|V`z*2Kh~Lro`Ff3EC0RV({paPT|J=?M+Xcv_3Jh{HU~V&H{sxa6 zu{z;fJpnR9=^s2bbxX~EaCyF7tDWqANx~Sz_@DKYF^UTc61d3FtyL=Aai-=- z^5iL+=ThxIb227yS;8cxwv9`{68QEbt&rv}6DiD!tMa>9^kkD;YOsDgT{yd^oC|DT*xX938V!-9l)h9R#wevd}M z4Ix~Vge#b?5csC(o?Fz~$w&0G;BC0JZf>`hufOw(6cHJ|BP{PS#5>ZO^Cc5k1j9hP zD5S(fhfRx8CtM|jD1!u~#@Vpyc7;FDMT3uYwC=13nn5X;Cbw4&jqWFE_Q7U99$!wF zB)l-aU39;7Atde)TJ_LMrJ0G{^daQW^bvwWW7ON+#5wv_8V3+VAFb$?!vKxK_#w?< znnT?m#n@u`(zBdw{Piuxi9rl`Xd%QgOlt}Y=Y2GjP74R)+3y%#ip*rjB403mfJ+CM zI`%B)VZJ60-w@VYk7u!A7x2Ubo;XrS6Az(!jA62iVFnpQh&78@pL>UPBXlZpgo&*f zJ&c7j2T%{OxORlmt?VIge+puhJw%Q8D;|HkVH@x#0{(>0KSX*hA%}23Nc?4=b(&`3 dn-Krrafq$ri{ByK_r?b#I3Q|+QAw^q{sqxUrj`Hz diff --git a/代码/robocode/robocode.api/target/classes/robocode/BulletMissedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/BulletMissedEvent.class deleted file mode 100644 index 98af0cb9a417a9be26209e54ef1309588becea9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1858 zcma)6U2hvj6g^`*UB__~*NqJ+g;JWdwnMumw0zis(!@!-$SswVTIv&8uP4pIvTN_!6Trw^G>f@~Ha%Xmyp;B2iv9n6R_Bii!F9(nPD&<#R2eyTZH0{MX(4ei)D7U)kD zqiT*_KbGN_%b%5BQw=yC}n6`+IbM$vFk*w&NucG+qA!r%{!qz zJf>-@-KzJN@E+C;ToPDM(dy4jjw)gUmjx=SKy|+EbH|Nh>B~@{K3VMiG#U}LmQX{( zKwV(tHRp~2MQq}IPFUbij-J4U35g~>8pZkq7Bmlm%P-n6pIKLHDPV9km1LCU{|L*D zJx&y*Fmq*Qh?i<~<#jv~g?LTaJLlVb_AnW~RjPiVFO>TO83z90(;)|yqrAgGc0y^# z@~%4=NdF{C_2eddGCd#TYnfy*t&?yy=y#Xe6OkT7bsdj2X)u8`Eaqp<=HCm z0bd36Kg{8Gz<2kNm zpz6wMB4t(t>`cSN;20pnJP?N*OgbP_!jfzsm_PE!Av)qD-ZDx zDh6K(;3IsT@Oe?nrRh@c&nYF3Pw;61t!wFl#Xrz|B%Wb=TE?zUz|NKOxP>ng*ap{^ YDu3|=!a{D7XoeE(axDpF diff --git a/代码/robocode/robocode.api/target/classes/robocode/Condition.class b/代码/robocode/robocode.api/target/classes/robocode/Condition.class deleted file mode 100644 index 317805f566903b67af7b3168d7bfc812c5e8fd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1728 zcmZ`)U31%15Ixs+EZ0$7*ZC-rKvf{%4;qI;N>eu}ZD=6HP67^@DKk9CvPe~A$;dL9 z&cL7GnMY>&!UHhWoq-u1dEn>p18C2^QtdcyXFOVI@9x<>yGQcB|Nr?nfXmp^kPs*Y ze#^J~wq4!wy|xoNzNaB2kiTz!XI5R)JF4!r?%P%H^30A+fchx1 z83vAbR1-*FcRVND6i60JhYa0ffh>}k(QyXZGY~kdV+v{7y5rfq{Z7jc4$PLT0Da4J z56!@l&#^NV-g9~abM?t~S#G{K*+l73mRZoDAw&C|h#eX7G8Q$wGRC+0pcmR59ZPtX z1pGd!&qw%H#EF1Fso)Z4yWTy%n4|mvKPAC!dn98PtW#N-*MY^kU>%4!bIh-{lKuEtlt#2n*-~@;@&z7YWN-=A_s1ENu`&d?F9DSp>RFQh2lgB5V zq1~fAsPZqFX}PxP^}7Purr!@Nd)twE&JACz71>YfB4wH68BE)lR=9!9XEIJ5CRWkj6IUC^>zMPvS;K ySc_vijIh2Z)(Bp};HZnZA(>BVs?EAjUtKSk4VafA=Z=PdY^a diff --git a/代码/robocode/robocode.api/target/classes/robocode/CustomEvent.class b/代码/robocode/robocode.api/target/classes/robocode/CustomEvent.class deleted file mode 100644 index ef30b3755d00edf81074f6cfbcce56f1a2a44db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2246 zcma)7$#NT26g^La?oGmu;U+CKvl5IPz9`5@KJ>GUN^1w0Kp4)zjudo?zw%h{`~9bUjfYEaRL#6LEGB2 z8dg&;Ep{B&+Fjn$O*es0m#@rplA(asM zuEMOZujXovC-=0r?>};CnM9O?#$+uQ1$x^7*EE?2dJ!j=4Xj)Ea>VCs1}k;PU_J6F;PFzd-^+r*@4l ztw5r}fABb>s>2VPv%TBaY`ty?oDUVL)F|gUU{O@lsDR5OuFHMHUC{;b+|&oK$f-0q zS?WrLjd5GBku|l5j4xTTW!9gzIf9)0g#_vhQ=ec$+}FJL=B(FmBN)Zl=I|K8EdX>nA@sF$(q%%8~TbN7eFS|z-dVU zmpHU?*O4>g=;0~BQv|&{Cy@%yX?!bJ6>V~F^&`Xo=XkQ{8{u=faDahA@h1!w|3Iox z+{cA|yz(P0QDV@}>_8qd6qupNTvHgrG$xfzWx#8=%#-w$NCL0(y&vKQ9U}>d1Xl|e zHm|Pu;9nD3k{=Ji3ll_@42p$)T-`^m%V3Pvfm0E~O)|JegxeUv9oD&^SY*9a0gG{; z1=Evvicpdd>wdwIsK-YrLIu|2sZrun-o*>gG4umpBC2>PD^OQ3Y0trj$xwy~-bg90 z@hSbHnbq%)g+302MuX66)XxijMj)y0@xmMhH|%)?a6Pz(`;5=v0cQO?Q+!GSk?8RpU#T3Pt`R@SIr*#U zM|PWXfD_7o6AF$81U|x=A3Q57B5d*()E*A3AK>HPB#BU4pM^3c{R{$+l-H+!1KTd) AJpcdz diff --git a/代码/robocode/robocode.api/target/classes/robocode/DeathEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/DeathEvent$SerializableHelper.class deleted file mode 100644 index 35d52298e42daa34412437fca7b27e1d014644d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmbu8ZBNrs6vzLkD{JYd!y!JR4h6EIvC+3PMnQ>78c9HBNJvaO?%&%_IT zMWTrxzz=0Sx9!TZ5#qy(-gD2rJ-_=u=broX*S8-4o?^*>Mp%wQFYJZ8!hR*(WdHS{ z2$IDu5lPpV$FAp#H^TocA_F>M=D<#Zg^b!MQ!jnKGcHFlMP&|xIWEj|; zNf@F0Oa?M}PAD~7U4p*G0xXnJsltFss5vqaZwH?|5xr9)2z4jyxqjDWVeIFNda^HL zLenYEzA%Y49~{eLvC${IY&sX~-t>mTMbvi2GjF##1Z$Y7hzO7VhQ~s}w1O(J2{vK6 zAQQU(pfr%7y?T_0)j_|1zI?8F*-Li`bD4y(AVOtVjOcj(|2kTexf-}bm_6tIEX<=q zc=*Sc+v-|i&3r9e;UMaXb*cKMcGeM(RiO#hP7sJ_&3EHiaP!oM*L>FOXfUY6-xNQT zDQK!E*_&q1W=m>y>NBGOGbX@5lXjdlj&{;uj^SyH2RcuRo74BQR z44VTdWQx_7wlCamZVAsY=eZ}X6?K{`+QK)yZKLM7B7|$0`f}ChzO=kt@h#uy2LIq2 z&s<*FrK7PzF1wzsBnkxP0#Sv&i{Y%xd-o4Pk{VLkvn$j zphA5~4Lr|~wp^MXu_U*)gnewKsxv{=Io&DMISN<|^VnSV^^z!8gqw@v5lLAq(uvlY zv&L~u;)xoYDTbkj1!@4IE@X(WI(x1q7Nwf6))ObAN?nGeX;Xvc%iQw>m8t!#Ydio6 zK+_(=RW#ue?V@@YqkSBS+CE9=q%>OS*-91@J z3EP4Zj1rSUTrsfU=!(+#rf^@2u0*V95IL>EQiDv?7hlP)kR!Azt-`6yY3OntG#rE) s!#E}aXja!7xcnWH8|)B|zYtHo{v}PI>KH;!Kd14O);JMN(tif=f2D$YC;$Ke diff --git a/代码/robocode/robocode.api/target/classes/robocode/Droid.class b/代码/robocode/robocode.api/target/classes/robocode/Droid.class deleted file mode 100644 index 94ab802e129cff22a92f1606039bb63dc8af995f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmX^0Z`VEs1_mPrc6J6PMh3p3{G|Nk{FGFEm!ka46m|v{Mh1bb#Ii*FoW#6zegCAa s)Z`LI2Cm@z(xT*4x6GVWAP1~e52T8Xk%5tc8E75|Ffy1@8x%#YSg^3bLd6d(qO^dNG-`x!!HwB&2Ut?J&F&V0zsVbK zka*z_@Yk4VqKQU5Gh5r*7Ujl^?#@hSp7Wk}&e;z?-n|Eqz-kCShNxZ46^&w^Yb%G` za${>|KF=*VUgL!lw?hapbnokjx>nGwUF}(JpBrunZ49c#UCr6istAW0W!rR*wM-L+ zp>4smOm~sNA0OXh2&5@!1b%cV2%(*!D{ET(Y55?>?M*#b;0(RlqM;YIblVj3%3{FX zGaZJJY&Gf`!jlXkhr65R0ipWi4f~Vp<69B*VIYKlhR#1>3I@@`(5@Q>cbwQPLy!x1 z$cRP^1+n;%7lf^oW(v8?cl2_>eQujY;RZurQ*RaOO~e>F zh+IPk;u+y$b6&J8PTf)v$7n5w1OZ5B4Zt#Fx#^@yp-C=F6I&|X7Px5zDl~a_+XT&< zPDyu-JqEiewVFf1RM)gzZtv)1q?SqPj%mCQtI2F*?UXpTwT%38!_`TXlg!Gh(~n&3 ziLICRXeqIr^wPVnUBrhz*Fj{BRS?wZ>r6OU7Y!u73!BO8%L$RKH)dQF3R-+tDK3s%JitKw!bTfw{}|HP$))yb)$zzGr!`k0@- z!2yYz^EOs-zjLL-xP!YDC+^|C%r=a9JRmrudRu6r`C)@*7W$j!ZcxcQu3&_*GIc7M arJCOQk`aIVkdn_dmgy~unA!p>i2MT2RCg%= diff --git a/代码/robocode/robocode.api/target/classes/robocode/Event.class b/代码/robocode/robocode.api/target/classes/robocode/Event.class deleted file mode 100644 index 7b5251bccbfbcc8feb2cd1e4fb8c32a2ee544d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3512 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 diff --git a/代码/robocode/robocode.api/target/classes/robocode/HitByBulletEvent.class b/代码/robocode/robocode.api/target/classes/robocode/HitByBulletEvent.class deleted file mode 100644 index 331690644a3a9dd8776d0f0df81bf6f6b1ae2531..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2836 zcma)8-*XdH6#j0LHfg%hw4{ZCB2|7gff9-!N)Vw9&|oMvEm0JO&E~dU3A>ryEet*} zzWVB;j}DGA&WJPo7<9%*AN-ee9KXA}*~D!GGLziB=brEU_|7?Z^XEUm{tn*`yR#xN<6n90|NA+SrsHf&c>m*89nO>CCx7IT#;7AIG8GDQx4KvsmcnEdN za@~=V9x`RwcBG+uvdJ>nHZ9M*BkQJXGR5h`lWtXFSc}Rz1YQ+GNkOt ze@utLt7uMW>>xT$F~}wT4mr#*iLRX$PZgFn3V2t;NxUPFrs}eNPdZ9i((sKy{UM}V9BPioy3Ks3;9C(S}0HEOtmNS(EooMc7f-4R@Ip_O8# zqpt3TMcHagry*|FcD1|zn848&z)SsZ zk`8w6W&OZgIJ07JI)=Pxs(W!Fp4d?};R0I4VmmLibk|ik&G^=IF$Yr5YcPr37{m~F zDeeZ4=01awXs=;h-OoH5SGP0QEYHTc6WGDsby`Vs9W6XVu5joHb{1xzVCol&2C#>} zcOWY=d;8oNSFE)`BhmS;~Iq1$>k~L;^xdAbKP9{Lg*jP+j0E8 z9(*?(z9k}jz(ttOsW=@E`r`RQiSR-2A^vpS|2KW{eDUr^&<5u^@0dIhFhaBU8!3b5sVP+CI_K_TO`! z9(-nuhor6DhuTfKNDg zL0fiHDa2EG)F+iRKE-DtG*1`mGyEHFTo=#qMZAoUeFKarn}&`?2s^-4k*B6;%OJej h12NEyAf0CIGkDV-2y>UTJAgH;b5;LuZt%N-%)c~NL(~8O diff --git a/代码/robocode/robocode.api/target/classes/robocode/HitRobotEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/HitRobotEvent$SerializableHelper.class deleted file mode 100644 index 264ef7d7d22ed0bf17b3c47b125aa2f9615c013e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2148 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 L84y?29jHG6f;VSY diff --git a/代码/robocode/robocode.api/target/classes/robocode/HitWallEvent.class b/代码/robocode/robocode.api/target/classes/robocode/HitWallEvent.class deleted file mode 100644 index 9270b4c49c9932c10aff39c465ab0d0b0debde58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2038 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 Orjgzp^uJyxRQwm)cHlk$ diff --git a/代码/robocode/robocode.api/target/classes/robocode/JuniorRobot.class b/代码/robocode/robocode.api/target/classes/robocode/JuniorRobot.class deleted file mode 100644 index 009b0b54fe1671e26186de0c7c663e0265428bd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5817 zcmb7Id3YRU8UKB=*=&wUnzTu;OY9{;QAT<3HkK{k`AJPNr$v)IT!s`+oDi z_cfbW{=4^C04L$y6byxyk~iSxyu6(~uk1QrsgIa#08odz2 zcU<2tZLxCpaJDBVLm@d(v~pJ~s2+ueHJ&@{Tdv=470Y&l27nhv1|6To{{8zE5+yrN zRL-ltlI0fU#UnzE+Qp(bBG-hcP_k{80=AQ=8VH4vzj~-#8Y+@$JGP7Nk~hL@cdVVo zYlV_E$`{-DqHc?07xNc6d4Eu$UK8tVr!eS?T7S?k4HL0lyHpq@q8+@rf^1eu4cb=T zaSIewD7)+8M3-%q^qU&K>Ejy;P?spo7|vO)Yv;Qi2|&(PFvF8hw@@V67?P2I3P-

Q&fzwTV z2&dLEsb`pIM~z@-n#cs$*(N#ytjoml0oH9|S%95mVtIhAGqEDT&NGn>uwD}<1lR@> zCkEIBCL2KO=rgerHOx}4_GPBpqS;c-PRp{`r${%!CA+x7+nC>Ml zDG>VA-jnGUA1*O*DK6u|kS&qQPB2bx9=VY1VV5~MouLazud2rt_*e>8DlCsed?bt} zEDTWVR&N_!scP@e^w-gvya^kp(th?j)8JS|=Q=yT_S&31jk=Q_qR1*rU!*#eJh3n%3s_Z+(?1g*` zo48Tr&2qicR;$=&7cJk}X6srOk)JR*9vGLDUoN?nDG3Xjur}{)VE?m$<=!nOJ|%HV z+1J{+vd<7Eg@e{9hZb&eN-SE1+fCex0l_|F;!b>)Wkg#K?2V50%tX!)-yLn4U42dbtuHw!`&GKW|)p1Uy^ zq2bF!NitVEZ2N1xqNgWzdruD=E`_gED$E-3v-)iv9>yawTrQTxK5F8d_?C>|pi1=> z)=PU}W5l&8(=XQ_H}P$`UeD_+7kyjKziZ-qa^Apm7Oqta<uZZ>5v!HhSe! z&OXPH)zK7-(+VkmdZd@(nxZv4Y;%k>AG8~>n6@SOmn1e1Dbx_J<#&>SI@0wq+9cf& zqZ>)jh|x`?n`87$(z9Z83+dJvJ)88L7(JKtycj*7R60ht(Xs`kv;y5jbD_=t{d=0toHRQ6_kgHxpE_w~Q<~8J!*N`h-LoRp?x!yJ8 zawjw-<%D86KQs9JFsWTUSA<<1dvIEZu^X%8v05Hybu{hVjZQ(=$YZTM&Xq@xJkFQL zdU)6QW>1gEhL{#AgX74Rh?=kl8V;&VPR1G*<%|W|bg5_!%PEx0G$#mij z)r(H@Y$B%_ScD7FPfE$A4XrJ(It-r8>v#&AUqZ8h^p0^{p1`B19z#xyNI;C3%_4%j z3@LRvW~wXDs;H^qI+if^Bc(tjx_N&lR{oEd@co7Ex0c`H@kh9-48W~nK=-3wFQhh}v@<`XVaJF!$f$a31HO*tx15_zA&r?vNuXu%F*hR(5xWb!|#SM~o! zO3b`9ipR<1mv~fn%y=5NO-}V=)c<(QEu_?IaecTUgv zw<#GPoSyN6DH*>yEu&FCCF3qU6h`)O&Xp<#r!%OE(**3p!<*B4@bz(g!$9SrO&>fq zaj-xie8)JbBNuW%!kEJfo{PE0JYRJzeV?C|gpe+cdPEBM%O*r^L`9J2L$mN%3D0h@P zWkM_tLaKM!b9g?zqfN&DI9^B|lxw}rj4f1Hz#c(WXt0=JQ;M`sEhv|gddG40kjUZoMQVTtiNmKtxM-FQ<+ zGH^K)8Id_~>n{}}-iVAiFp|HR9LaYX$@gMnr-~$ha!en|UmoJq#rQj&_y;5TJ|p>0 zM)F@VZHJHKZz8?ZM3SFV1^xYWC?gWpNF`EOlBmJbL@nAA!3>{1l7{@7BXoWf(tOl!&j diff --git a/代码/robocode/robocode.api/target/classes/robocode/KeyEvent.class b/代码/robocode/robocode.api/target/classes/robocode/KeyEvent.class deleted file mode 100644 index bb417c4d51c9f77bdda897808f453fd657713d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmZ`$O;5r=6r5KING)IW6G0Pi6cd|x)p$Wk)W(b2`+^&-!8U0N#($-W#>9g^z#nCN zyA*Ehp>OBy?7W%o@89$~iUV2yZ^?WL$tPGP-TeNkL&`4zxig6&5 zG>oIWi!%aU5~}?;N;45Sr0bDI(&j`5;v024x{{u8EZ503j diff --git a/代码/robocode/robocode.api/target/classes/robocode/KeyPressedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/KeyPressedEvent$SerializableHelper.class deleted file mode 100644 index 4099bdd9ccb9a65fb11c13b64a5f514e2e0df9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2321 zcmbtVTUS#@6#gc+gW;%%20^4^QB1f+dyz^Ik%%=hiUq;qwI|604uo@DCqaw9sSoW- zaMiWC`qYR1jQ)_Weltl>+e7Q1mF`m1_A=(o||_IZc!%h z%e_aQtW;!i@r`tnX?`FaCav!y~hfK zKyS`1SmiZ~!1&)-3{^Mnioj&f_x<;gr0Bh3zmrQPf!p!iUxQ!HH_=Nkl{*-IDv=S0 zHp7*kz{J0?M{N5fw;Fd)$1DSJ`$W6;ET z3<;drkku7;*DFX(5rM&Yq7K@6TTMzu8$~0%nTp~9E*cmXIIH72tYYG0j4*k$%2Vl0 zi^(Gw(otN-6$7IJWBL&a9f&)fSW|e$OpIfq<&uokE;GvIlroX*Xd+WL zan0o2p$U}>qE?Jl6j#EcV`P=UxsI2DHy~K?3iQ&kfCAk`*+#$B|4+XL zTiUt@X_CQx16hI7nkIiPoQa&Gh)R;;hf;oMVoBvRqO$B%)zVicmYccExz0uuk3m|m z3XC2mP+`}zt9!{6t0dFz&TH2pYfU`C*Gwi&s&!3Ze^a2Zo#y_!X82Rptey!BHF&33 z-qOfqGnup|PCs5K&6fh_+cXbc8C6+hyLlBvy78x3D%fVaxz{9|K)^0?X{SXi_RzPQ zNrKtD8t+*9BU*b(k(<_dHR>1quB{sG88W>6QJ7LC5->B4BfWIl;%mXy+uQ7qt)~LR zv=-zS=35g+Ky`Hf9phh;vrwyJ`-uKPApnzOL@zGmIAyc0fD<^$KfXCQ#Zeu;%{j<9 z*faPYr}m?(`si?dyK$6?=*4MmE{HRT@dV3>vkh~Pw&c(sf_DQNztvK%*M)Q`&z8_+jw6BceEPwEyl z>bW`!A9dD8oy9zZ4k(Noe~_AYuz)m?AID9~i_EXUU3}Sy={Ke?O8xnX8t%<;cyK+W z$FLqFdNepbn(q35{`C*Iu>Kw^u}EK6%!q}CV&Q$P@8kLRetxIWO}Rur8?qb`+SGFzqK$ zq!gi-5lBh~=OLolKvxg=x7mpIGG~<^#V5O!{&qg8?EnF*aT{gMitK#!2sZi$j!rKP diff --git a/代码/robocode/robocode.api/target/classes/robocode/KeyPressedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/KeyPressedEvent.class deleted file mode 100644 index b8c294e2130acc461729d5d016c66ebbbc7f409c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1770 zcma)6O>+}R5PdDlmXU=Kj&Lw0Byl7n`D?*}5D+LB%Z3d~a2ew&a!HL=V?2r2Rqc+Q za()HZ{09zj3FV|Jl~WG+QB-t*_L6X0{@ZQAka62ldFLrY2oW_(b1E}>N!Br+Mb^0f?igeN1% zy(1#!ZJOO$)0f(bcAP$|u9TtU+QWxhXyrw<0hzm@=KnCr7JKmJ2`IBFcTDCcnzpA%-dBZ+f6tEP&y^kqnJ zD%E3JF&r1wav)Umn8Q3_f{`EEnZ$~lVX(KUV;qZcvRER_zgHa=GRotUQBgkd2dXEG z*ai?T9z#7bMM9PZZ-zxEz0XKlD^KEC63z@tN(`7?I{hXt9>e2k3;7DNcD$dy72R0< zMbk)oS=BGhGw`<#x~y}S?H$6D7fPY!J=JbY|BaU!-Bs@Pu(WztK1OleH}2-9-IJZJ z3~O0@ogBfSt+wH%qY*jOv0`pBbGekbH}8(LFG8-TkacD5esL&h$*6_L>-sFl)sEmt zjb}7@lmsrb?#x@1!a0m!l&!3_#@Nnbyl?0ElpBl*{+?owI!B~<9i5whg~Cf4Gs)ka z-CbnwC49j4RL=`VoMDUodFMmMDBvunW2{A9iOg!mqe6{}*NtQ6k*POlSVa#B^rvH&hO>kb+^Ew%}7X=oU_J9Yx$` zCMzhRVUu0y0rnY}xkt;EKp9`)imj*2#J*&#BG+*ZUm=6*7Mn`E+(0d6Hz;gjxUl>G wQ`i`8;#M45wNn93{DJyodWG9B7&+OQ2NuALAca-?ZD5U8^N`f}e;v7h0i4CUi2wiq diff --git a/代码/robocode/robocode.api/target/classes/robocode/KeyReleasedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/KeyReleasedEvent$SerializableHelper.class deleted file mode 100644 index 9ddeee994880264acddda79554ef577884f5d8bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2327 zcmbtVZC4XV6n-Xei(ys72BApBqL?7Er7uzmA`-DCMrlE?_}Wb}frYT^*#s^ArhaI@ z#GZOiPe1iTe@1^uPoJ42n+T-GwjXxp&di;ApL_2!cmMe7mtO&V3fDkLVAA&rUePN_ z>#p2ikrioIWohZ9bZZw@rSI4k=e1p^$UCy~Liz?G0)5-|OWUg0?xwX|*p|hbftbLw zD{EG@Yz5}3t=l!nbFJ)QV*;@`$8~D+0^ww8T_BPnj5xyRHDRDf;AGx$<^8?gg7hCK z5CZ*quV`1+Z35%Exf!W#IaPtFeBk>%LP^to)p;$K%K|r(`F}>gQfR@KemZ|J{&XrU z5O2jReJ1ta*dq{6=TU`s$hN?-z_P&le?aOwp0&7NlZ$)h^3m|u4GakkbxmI!gBUh( z79#>DHf3$q+w+T3lSE)RnQEZ6U)3zBh@+UK57Tj+!+8Uv0%vq!hgD2`j4@`9R(UJ4 zWixwZLne-kxMW~lVB-BtV`2bF29j(5IuLj!wXX0?n7E9|wo7tOyUZ$=Q_6(Z)kL;o zV%p^Mp$U}>qE?(#Bv;lyH}Qo!it;FXOYO{<__C#Z&nr1)NBY&J@72+)i8ST}3@Sg| zlCH*)Q#j@ojvHNZJG@kfvM>X99IsVR{VM-NAz|6X?^fMK^T9xd-{jDC^{$F5} z=ED4<{NqFsQf-~9V_aFBh1#8XgZNJrLNGbT^yUhVQ#Kn4IDwN~@yCNx9M$EUoWq>M zeZxO+>b$z9uZ}j3n^&obew^0k!uS9Q-e5s-rfKeXMCcgEUHJ`zvyq`l9Usm{FHa6d z>-eaS3k@k%$CZZkNg#a|NLK^tS{>Kh0gY?Gk7)lfkv*l)XE=}N>_OkLQ`oqH0?Av{ zsOK9f0@S$xbq)&*I;1da{9$U|!Xh$6ejL{+FEPIYxA9dorazg!IQ17M>$o$|;ojAV z9;14U>Cxc$^-RxO3~s!|xs9K(nurbbB#cC4BoTdsjW>AmW02n|^inR<&nBfU7Q0&R-b786Z?a4XgRFd9VydTXi>%STi-n1bRTWHThG|vO|z{{7`>@{r5l9vmDaanUpV3i?MRc}@UaQ& z)ons%jVb1k#<@HuFiAMuQoek+_kCN2TcX{SgsE2GF)P8`cpo2T^sb5sbFE|@Zc=hdJIu~D+h*uE_GAxh`p|U9I7Bx`hbwGR9(VYM@2oMyl(%V4>n&euC)#law0cs8j%$riw9v|n>PKYmg`&61M=MQk#yCE}#Vjrm=Kmig zj}P$?lUI>zhzL)seQC2;@?U3hiLfwWVScwOc4y&aiEqxgh zoJ#eCRt(2Q^&AM*JQlD>m}KN9b|$gp<{0d4@)$=AP8Q3A#Z%Q`A)`D#HZqzB{Dkfa zBenyC%O`M8jFFIK$(v~rN~f7Ai{*JdOv21jO^FG!OLx%4+6g?4_mJyh@p#{TC3>;` zr%fmAbyYty&%ob0=&{gQw|5D%UMPi@_f@AO{nuV*cGtPx!`kX!`WVG=U%Q*Tc3*aT zGOTBDo3J#PL87m=<)z~xIW(|pE;N(5nz%Wq2(_<5t}l`eW$ypXaMZF<3?c9OEXcL4 zh$6{jnmSGcS6O@JK}z9$j9`>^S-TtKeGcP;eV(n{V@&e*EPFIKBE{?I!r}`QezP%C z{LR_Z8hbC}9p2COy)ca#-myQQyvrB`yoX|pRpXV|mM*k^;UxtFWT*hwEl9p^jzJ1c zZH`Y2ji1=tytn10L!2l4j0=l@WBw2&!i`KZ^A9GAnT6j`ImA*5hGp7<&)T3{IKy>J z;|?=fMF~xt>{=giz_`pkTCoJm_ypH%J!K~LDPv7@9iQQIWblQ>rV=kVP>NA y?7@E&HinzH6^B;sRDd&oqVbGg;Lfj%ob1da3t&c&!kYayvCgY`Od9;Zf!r&l+q`N3 diff --git a/代码/robocode/robocode.api/target/classes/robocode/KeyTypedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/KeyTypedEvent$SerializableHelper.class deleted file mode 100644 index 3f1b4cc44e0747e982420b0c440d85f6a5ebfc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2309 zcmbtVTUS#@6#gc+gW;%%4MLHMMKJ;7)Lx_#L?mKOjM8$mchJDzK04;vGR%{Z>(&kBT-sWpK}h8W@qquYdmE`if|$CVFvcM7t)qCg1r z=Dng_S+fa@>*i*}-*jpM z;M9inm%ZI;QEGY!3?@?z$o6aBl8Q2lK>9Ep#|2z8Ff4FRM|D`m#D^GR>S&d>GMhG2 zM;>J2xQr_XMg_+Hd0kBOAt^ABYydhCbtbi@@Qj%l$3)vD*`{4)mCH$G!aCMOwqfF$ z$yY-YDi=hp*r@2Otbc0aGj$Z@QTC47nKJQtOZkCUa>|aZ))u~1N7E+Km=Q3j{Ag3U z8b?mym{mA#9g8EU9!jjBt0|B;GF%!Xrv&aG5N>NUC2 z(KkqvEbbe~37pj=`E%J!<52KUh!M^7AW7Vdf2n;n@r#Rl$ z$mX)yjHXRLo+-`e0_Qt44?GxES7W>N5JaZA(i|0RG2J|C(M=%al(@CiCKbEqYt19U zY)&SRsr(TwJ*|jMTYMIc$9>n)jh5_g{|Y8mc?8U?>&j}TV%KVt4Y#+|7u!Dw4AWMa zUzGosC_<`_b9I6%i?dL>WBZ8zKp_N^V@z)@;Us0Vp@363%@zMNIKxq0zRfwzIovb& z9jDH#tNQA2)< zbzEvlsXDGUq>lpWlR&y2NH^-Z*$!w_1Aa{VPl)UpeLlxUykP73h7H2TEfh%GqDDR2 zKoOwM1*mhFW6&XmQR5F&^A6^bA@Y;BNqK?!6}XEpnlb&x^u?(^H&MsESq=}bNAwug zV@!_*$1kV4-l2c}9WJcD#d0Fn*Of35k)cF%AM5*g`hAe!Npw>#)6WK_O%}spG+P+L zHb$_6D{wId4>vf^aIH%CR7XD-L^KyfG}nwM%Fg$Kx!`YJ=cB-g&X65N<|Rt|DU>M1 x=w$?wlEHb1C^pd51Fklk@m}Vv@}v0VwA0_oCv_YmU^Q-|!dX$BjgesEe*iY1Dj@&> diff --git a/代码/robocode/robocode.api/target/classes/robocode/KeyTypedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/KeyTypedEvent.class deleted file mode 100644 index afcf10577cd89869940ae99992c7daee70280223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1758 zcma)6-&0dZ6#h;U2!@D}A{DW=#l$8cxt02(HJXY9^lGdQA~W`-v$w`zX33ZTWKT+<6+PUyr3za zyK-w~t1X+0o6^^5qzK3Rb@rN&i)5%oYgLAk3j9ZIjX-w@M;8J=(!$rPqO~ChIDq*h zwy!NN%|EKI{PAGfy}#_PJZ5`0$+`w%@S5_Kt`bfc>wk((;fQD2ktVz$V*^%7tAx}7 z^UENK<5?WV2;o>=`SQ1ozZx=J5sj84jMf8>SqbLGa(tQ6>nb9gtoP^9%dx@?qF^KR z*ni?c0*w7c>Y7{=8!i1HR6(fp79m+IxrCvnirPYZ>x4$J7skZX%GWYn6P}D5_oj%H zw`^`Jbzf>HT64Ob+ERv&Yn2bR(8`M{Juotri6tXyn9|)6Nkv_fcR9!_{`Z6Rq#nK_A z*y|TnG9Z+)n8plYgpnWGp2YJu$zTV~#xQ2#q){f!d{G`2GRopdGeeoc-XAj}Azks}cJUQOed!ijr{+KDF zT~zg)c?Q0jdfWG#yz*Wsg_gHfvnl-@E7Q13To#DgsJ7Vo{q`ADF>m&mnUwo>=5v1bCCGGUV@cVa-{n#^Q$onPJ`dqSOGJ_6?u_my zfD1ft<^@XN6b3NJQrb#GEN3v>m9wnn(qe?a$JnCE9tl1Nr)ORv_n-9{Yno30G4SsdpHeNKL;)aU16oFf5Z6eB3%+#}UqB3^$m`Jo2d7 zU>7@pUB(5j(VQhvz)!en^C>W~%ZxR~d0fHINZ}WYO?f`9q7t*~C05>>*xgSgHiT=q q9=n!oSAZk`qxzU$;l{s=++Ugd7QnP1fd%`mVUbVsfK>T^37L;2{k5L} diff --git a/代码/robocode/robocode.api/target/classes/robocode/MessageEvent.class b/代码/robocode/robocode.api/target/classes/robocode/MessageEvent.class deleted file mode 100644 index 055e5f1d0a6d18ac3126938adbd4163d7f9508ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1810 zcma)6+fo}x5IrLa1d=d95n$Q5$g<<;0^S&tIJSrrgTPS`F@ z+HOZ!Tf+BwSF9fiN5v6ixDZ|$9Yfj|p5(o@@O2pwwREkfNiKipdp$uW<15mU>K;R-csjz_PNgjG7Ad1-(W-!MPEtcAoV7QpV z6fWq~r4*)-W|(eBM|?Lp+!J0)C)HS8o9gGp0?C0grVgafFy9F28fB7@PIiTA2GwSZ zrPF8`5@Zs15t9FGP8XdayPDYNgPz*xmrcc$wEgN3E&oYb4?NyKAk|W>T52azL^+NU zL*f5}q)@>ELsI%J!4FM%gZgnCHyEyl>Gk0R*3dkOMSPmVO)N2Fi35FMhO!}jB^*6R zMPlvzNXEghCb5jq+Pm1Na2sDR%(za_pdDcgc_cbCC?ha{- z^nzxdc1TlBxZb5P)bVc65!&K2+e9Y4ke~B#gmn5eu2a-{`^PQb59V9*9qyi@#cw_7 z(=O27tj4iUYw~7)*FDemCh&lvbiyO=?&pPmSMrK{^Ny?X{-ED?JtaB`)KJ&ENH59k z8LOKi&a%?071cO`~P7{fS8agrjKAUT0#D5sFoOHOwgz2fxM zwlgF#yhqY5`RF*)L$Fef8Z~`B%(8r^7I~#sb_j0aHVRARxmP6iA~njymVwc3wHd zIgP8h7C0}`S0{<4H=n(gw>IJ$4f3Y(F|G%$PYI=d+Y1ZF_=MpXT(10u#ba0ucVoHO zYb0~A@-c2jpy`Sly5@{WgQ(g<77vlbHdWFznU;sqLdpubgS!S?0adI}Hp+!BagSnU xiO#R^HPL?G#Aa9Mvx>C<+A^8wsuI7Wwwu{_g>U{OX_VB*BgG{`Qa6oN<6o=dp9lZ| diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseClickedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/MouseClickedEvent$SerializableHelper.class deleted file mode 100644 index cb56ef26dae119199caa2e12bc45336adfcbcdc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 zcmbtWT~`xV6y2A641_@`HV7&LRcV6YR9Zg@mR2Il&;YGq5K3$FaRY;4hE66b{-!>( zFW{(>b^J0kP5PFo3(Q9nRCxQ=j?O#oaFbve)$!^1hx&d35@$*!7F+t zX)SoQs?1cJ;!|0geJ0)D^0M@ue8qX0FI425tn5nPKvbZ6JO3;-bBRxTf(e$GI@z`3{AFM&Rs zH*o<20;e`*uWKlSv;>B`}C#149D+8ryM3CO*I=0;T7f zS`c`yri7iq6?|x5L}2vY+hd{^DF#c`b9w{3ozAI*MonB*5xW>sb3WtM+(4a-o4BS< zqC9!56d#$m-c+n9#m6Q-QHmHX?0ZUc)5I;MQI%QnN>164es%VRI{MVaBuF)bN2^=1 z4s2cl`%EQD?!P6`dG$ub3%X?j$z#E=N+gcJg%g<1*paGV6gYoEj|4hPvV~=j{y)na zlxP_fWWpTg4e(t#qnYr})|mKG)iAEAs#-CJ1rv+S+GRa=Gl8%0(7@LMBS+~_tocr` zXD#Q;GUM&+dM;^bVi_we9$hNE=3{s$(A&z}P_GG_Qxj-aV6ed=McP9Pd*0?}U2~}q zYsz+A;9`sIk+-1H%{sS*8W%-1YBlWy#0!4+1lpVuTd{LUA@cCKW{sE^m`I(_=VPYz zl;S%5F z9elF53#A=BK;mZ#Z7{jUwQ?0*l+C&UPT@44_(OvCxT?!{xktE1x`%({)_QeaUmdC+ zH?GnUJvgJ?Mesh7yg^(z+i>>>q6`eIjQ@td$!LFcALk}xSI7Ee`?$D|%XKLoN@Jm9 zh0;VQ-3X=I`?zxmZ4?Q{_>PgDFvmQj7ch(>2TKVzAn`fMu(3%FZfOkD^_)TsD+;1TKlU_P$Z!`4=(`vaH)oVfW)%5a6dDw`smJnT#>>C|x>JE7K1b^=UOF|`j4 G5`P14bu7&Q diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseClickedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/MouseClickedEvent.class deleted file mode 100644 index 09a17465116943a0f46fe5a8734c85fd235cc336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcma)6OLH4V5dK<{Ek{-q;W!58VZca1vg0g>gohOjv1BJpDd2JxSA`2TT8-l&Vpp{@ zG8KLWSN;PBxR5ebQJgsNqbPbt8(FrAV;y$X)7@Wx{hELN{ryh>HQdW0MYtSCohXR9 z(t8jMv~2WL@Kkm;_GM_Y$Pg|b)jI{DsAa4~Z%4*jMd2gANuVzX=NnO|jR?(-=ndoq zhp|6m`{u^x-AAqVH(T5OSKEI3G28oT)^!MzcT}j%8eyT*`c~`f2&DG> zb)i+TZEx$XP#RC~dLw3iDPzxf%7;c673lgQoqMt9@9|Zw$@Q4VHN2U{0%7shAbGrn zx0$@sz9k|8qxPkX;>drU#XE$h5exh02<78m(^y0~kL!4s>%|or)4P7Plr}PyF~O@; zPbtN5KV8p(P|afr%Y*_WKXhG5=I$DUy?jQdu>voPn}p>vW#T|}9`D&%Dn#M<1`sA( z5eU~$p+DA1LY7D0HjGd@OIvwfo+SMwTsll^tjTQB8x?Zp6dotb$jiv{6Fhw&`pFi| z+G4u3RX;G#C~QCL^R)Bmt`p{hSPCQWt8Q0@FRX0)Zga(tkJoVd6BN&XVQx3>zU=j7 zT+iY&!pf)#!c}`bC@2^2Idp26+Ve|>0;++K2oqimI|=yK=MO%0#amZ zSNO)#_>ryc(_6lAfUAU`u(13W77tJ&tY+pjf1@y;S^5o?1Kdc#vP?VhIp?&Fb7(N= z1~b`23BC(|p9Dy?Dbj#&a#%+AaShJkRNB9^SeB!XF#K$V?3A@9@yyJ;& x{ZC?3xPwm<*Q)CZaPAMRJ*MaQ{1-+ZuT0wk*cPNX3HxnwBDMj<%^^-G_aCPq!l(cM diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseDraggedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/MouseDraggedEvent$SerializableHelper.class deleted file mode 100644 index fe60182865e24fe4543d23cba5ed3516c8238e50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 zcmbtW-&Ye?5dJRtu@Dxe*dV9~RHX@mTWS4Ku(T3TmIi1AgHT$#Np8Yo*rl6|ihold z+86NDb9(yRXa5;rdivc>vZR6>+vc3yJ3Dvo%zQK7PV(npzx@ti0^1te1jao#?-tym zG#1@jRnB@=xh#uwPo?8uUXh+{RqPj5z9Q#kWmkF{q5|F9)>F%lyN+QVbtVwMV>`A#Ef7hia{|!}^GG0qP8}NB1x{yeM=sTN^3q#X zNeJ|0-GWugSxk)24Q15dva13{HjMo~Sf&`iYQK=nC4sxC?8)gr$T#zs-cN1;LkjOM@sRDj_Xaux>9_q<1?j*(ZZZnnwvUqDUGVkqFb~}w)CoV&(+cAIwnD?X*^on zl67DU3fLDaQF8wsi7u!&BAyRgCXhT9468)q2wXUU`HUT@dIf>=C-g|5vnX3w_VE9+ ztU-yEF+nEGV?hJol`{bo{@EHGU#l9%RaI3h=CP<_sady#7t1`jlRD=>1D4uzU$ z`+LTURgxKZXV-N|LmewvW%1}z=>tB7hXTE=ybbjMVRLE%tqBY^SfogMXkjjx{A>hV z>chIS-4M9gVteE*XmqpAZK1|RA*7vvc+T&hK$~4;D|QYkL>@j1SR)n$CQ>K#`Iu=v zrMOOi3|4<%@7ZdG_8ysz*Hk+MbklL9m#J9Qs^mQFX^y8n4La9&pj<;2WxZ~IQ#j2h{*d4UuIln#?h)>h?%|)gwO-u_t`60Y z8&_$F9-Il>Mere#yg^(z+i>?9Q3eK9$NxazWVAoJk8_i;t7HAKeO%nf<+_v(rLj;l zLTMtDZiLe9ecU;OHi`se{J=<$nWM$%c?_e#!BWHxNPLMBOq9vNtpLMxJ*N=EYKUQ# zwqFqgGY-&1Xt~6q%n(Nx?jwU)R$E{W_ZkS_&`T%nO{RW-S}ixD!5RzJc(7{0+Rin5 ztK${=)?Z<8{Uw%@T5m_PJsC^JlhMe)0UjRU(JypXFZ)E$wAE()R>^pq^beDQcw;vglC5E%m%y|VSI;8Hm{Snzo!(X_uDMtCZnC@f0D

R;ij|APs&@)PQOj6~?zW7zio$1pgFs&p&aXwGHX=0JqT82a z9LD~L?HlVG_n$ReUv6&sPqzHlbGG->tZNg-@2OCk6~bJl`IXogp7_>y(h?X@av|&0 zZ9-;^dFGJD8+n{ZfpDRzLixD=Ogmtb}*Czlzsr!?Ve^Jp%kxz?G7 zj{0%H7*|fA!4Y<)X~-SX@0!h6MX@q33F%7JCrosd?g92&DG> zRiRa|WpC@vP#RC~ctd7ADPzxf%BMyc73lgQod>b#?eSHu!S$HLHN2h09AW|HM(s-%#gTuJ#e0N>Aq)HG2<78mlbA<2kL$R>_2P<*=v}{>N*fu>!RTZF|kW#T|}9=Gi*6{2u-0|;ZT z2!!jW&>!g}AF1hlN}^g~!P<@-p)L1YbWAy<`if zZ86>2s_&R*6t-UWc-nb%R|zvgEQOH|Ri`7v*H*TDce&!n$7`_s35w^xHn$u1Pt2W4U{W@eeFtVvxZSdIL&*CfkL6ld zXf3%@QzwbweV#!3Hl=VGV;E;C>!b;mbC?{;dDe27QQ+?dwpd}06rbY@i?2}p+4)TI zH|K6^Z2bW)vOF`e!Za?i#P)piCSw%w7G@KyB|eFD>05j{%jJx=dv8FkXkMJ=v_{3pTiH~K}6LyD*-9Db! y=D#F1fqVEgajm+p0Ox+g%5!>!&wpa%(aN+OfNepFld#_gCt@2w+#KSBa{mC3SHhzJ diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseEnteredEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/MouseEnteredEvent$SerializableHelper.class deleted file mode 100644 index 353a7c6e95f0bb1e5c38cc354ff374cd107d2ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 zcmbtW-&Y$|5dJRtu@IIPsiDx80=C73Lf4}GAyl-av@8bDLPJ5cZju{V8g_Aa)0X~C zKIjYd*mFES`|LmCi^uP7k|h?(shV?g@9f;UGxN=SJIU{V{qie-32bX<6Bzg0qFZvy z(pYe7zMORe>B;i!GwB4Em!)T0Rr{q?tjalA-Ibn(xIp)|^~^G=ma}Or6}M$6(2x|k z?#RIKD@NqcZ{7}U*D=ha&IFQoY{w3!1!9?OK_H%E9x24osY64%!0Ej0$i>=DQF<#X z34xxxTe7MJi;3~Mp^OJxwl84hquB3)Ws32A`=wl}2;9x&Pfq_~v6;X0rt)tVU@B`0 zq?&-GCouMJ{4o(XETqDB#J504wnIX?Y@hJJx_Z?9hpeK@b< z0tN(5ZOUNTt$8IG(nMe&ldY$1Jr4}2sM8>m5~ora#IS}Tf&LKNaYi~mz$F5u=b2g% zxK2n3GleVoP{WA8=)1Q^M=vrAmZ|6T26!`DPzjCdxT+#{F=DQ2m!9U_niHs#aUIvx zNt`E-mEt2E*PDtprTAFKCrXi^g?UeDZtA$DG^#QSZrQHb((`9usH0DHOoCL?c(l4D z>%is}u+LPYM~< zL5Y?zK_<*$UIX8iGa(cH*%}>Rsv0I$RaGnIu%KhHS-ZUJY^LxP9%}enVB{zrN;S_8 z_Kan#B6IG}uIrF{I+n4*;?bqjhjfh&1$tX~8|g#B7Sse<6&P%=NRjr?!kjnxSr56? zhc#upE^x8M_Q+e%=w_YULXC@3L^}cTg5N!XHoMGL>>N^vJbWIqM$8LLWKQVwG1GcV zah?7ctp2{VDudatzhw8_T zt29Ip&V=q_cpqurATFG3xcdWf1_oBfe?#A7yg$B=bCZdyWBrMJT-?Xyx|EHiu}Cr^ zX(EztMAGej+&P3ciWFmf$4F0@qs8b&45P%sQpOEPe2xlCY?6apA%^LCP7#Kc2*V0( zzaR!?9HNQQa*;)uA&xFQKo0j1_8Nn0udtNXdOOnX=|no2j>iTL@aO=Kf1i3goWK8$+Dzgk;U!k2KD7e8Ln_wWmBY+hn;C9ojPt~C)B#hPJn4DruM-` F>TkcMEnNTr diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseEnteredEvent.class b/代码/robocode/robocode.api/target/classes/robocode/MouseEnteredEvent.class deleted file mode 100644 index 73f706c2af4b2094c833ed2b14e8e3f10083829f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcma)6OLH4V5dK<{Ek{-q;W!58;ee5XWXD+|5*}7?5?gk%l#;j{#Z}=#jaK7$KaeiTK|Xd??5jCI&iPj`R)^=tn8>zCgE)bJpS6yahVwWA>F zNbgb9*K#v7GM1gq0~wkuGKBMEdaEE5wTzYM?#fuJD17EO2=p1@>_!x7BSNz)x_vpp zVeF6CzOlJ=|5>y3#rBT>WXEqkXL~=*x;A0*jtZ4oBP>*!Uy1|aiEoT2ZJdOX{adf@ z5;7aiGlw+Z$m1*ugmX<5%E$e$+cIv6c2^Q+no+>K1hZo~xy+b-r3sgtW4VmvT4x?Q z>c;_NTsnaUM|dGkL+*)w*KEfsij{duNLQ*pVXC8aPnckz(5@T>vr&z*!S+NTwdb!3 zt%4nUTW^NaczVwpGV4hhd%jaXHNvPs*N^Bth(&LouWAjh$26|sY8DHG#s3G%<88dd zlbH&HUYq0zYis!#Jw;T6Rc6&0e zXK|OXGHk+VVO`Nn$9-~G!+pEg%%(Q7J*V+?uS0GyDO<|E19QjRZrHgY zmfWeC<3wriXH#wOnQt_R^^7)88=`2=f)PhwrV*#3c!6fBUX0<1ca{6L+66q(v3 zzOgjEV{7~LmaiY;GU0nHEdP$hLzD=snfc5gD9mS;en#aG*Hf@8(++&jIj!RiHW+l1 znQWm1-vzrh030$dbB$__K$&y8A+)@C!bNm8WIc%VCbwP$@AjM}&IrbgJq*>x#zN~*#n$)PV2QtohFz3VVN}i0 z3T)*%KNIJv^Tc8_WTwW|=zpToKlp(CmUA}vZRJWG=;)$`J+!#DIb(C(V#N1yRsJ{F i#!jK>awVRX`|q${`Jh3`DKmhR%a}7lAwz6dvD$wSv~pnp diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseExitedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/MouseExitedEvent$SerializableHelper.class deleted file mode 100644 index d4cd81bc2663c65c089c551e82619227fda8d7ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2311 zcmbtWT~`}b6y2A641}RYYA9GKU|UQmFc$5HP|=doGMIuE8VaIylH9=1FoQFb7W$if z&=+vowOl^??4R+)<-U_-hqJ9aQ55X)o>0`VNvNFjz!9U9sN&gX4MF4lI6(pynU z2=wILl2t8OOpMPBWjxrjeSwL56#EUJOf$T1zmiK8fqR+!KWG2A*i2t~)A{50r?aL& zs)<*6Eb71U$3)z)jtbrh-vS+xXMw_h$kef2V|G7~v$aa)^z;iF`UU#WEME$JxTND< z3<#Xtl)NRQ}!>9iOWbCRI^YC+6`;$6~W|dDq!Y;R`(0@TI`WNj8*fo*nEP z%T`6^+?`$5A@y`DV}-S&OQjFl8XXGsw$e7zhkPxl@v|y0*dUSO?2(1JVDhsbQmGGX z%647ga*OSWm!Q$iI<Z43(?sqO8{qa1Q7B#NQCS#Z_It$34b9);;_^x7Mrc;nkt~apNit z(Sr-2yBOX^nm5=?Tx_`e9dQN*R>prt-&DLmet>tT64%H269>3_fU9*W8%bl4WJJ0~+{8#u(1Lp=R~&gx~K4Ey$+0jmtL!yY+==3)T5xPtGH zg^zIrm_dyR229Ei;Z?$Nm=QcPf@e11B?#jyY_NHqy!|z$IKAIt2{#z+BL9s%qm*Q% zF?>r&W4sX-c7r6#l6plJx1$@>mm6ic#$A<7kxm|Urj>N+xQ(4q>n1w^rm2|P2OFus E01o;p{{R30 diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseExitedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/MouseExitedEvent.class deleted file mode 100644 index 280798ddc275a78131a5ca26c04c8c42b2912aad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1784 zcma)6-*Zz%6#h<2K0Zw80~HbGYeTj4ORX@C zDCmS9L(HGRf)hNFx+?cYr=@p76@*GZAtZ|>moU~;QCn#5fY2!RbD5-C`C5ki!jqBX zZiq;EyXLe~^QCs8eWypPEoJDq)_7kFt-Pqxr*kV5?E^k4SGgVIxQGwaSRgF^KS&lI z;bSJRBG(WRo>qs_X0hbIPvaB9QjdlC^B>B?QR7%dA&X1+l>5aU8L(UF)KsLUFGGS; zES=Db;kc-h0il$|5|#;*jC|it#exzpGT6H%GLBU^Xm3aeZhNCVU%@DG#&yw71 zi71jhrm5pJaD~-po}~od#|TDwm$thx-e)l0+h^IzJ;o$|&$7olM}nUV$GE^fDq8{tuIZ|+r+{ntg0ZH#j_ddmDSTzIDbLFqDlxl$Vdde% ycHUCh7;fO}IJ9J^0-Sk?^@sEV-~PeKgPo~c05gIF7h%3tF2oFgcsRrbWnKfs$iUqI diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseMovedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/MouseMovedEvent$SerializableHelper.class deleted file mode 100644 index 0bb44367031a0dd4ff08e03f6f0c4d597c566b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305 zcmbtWTUQ%Z6#fpm41}S@wxOYw0=C73OVgsg2o)_UErS8H&`=PqxtzezFoT&1E&WYC z=nJ^)S}vb`_Rsj@@;fKV5V_P_*2+11_St9e{q6nDPJaF4r=J0gW6MCBz)00CxJ9=l z)AMf4lk@JbEY0jn$G^5Dt9HI(zs?sba#mJ$WYs`epnEI7n@?Br&PIB%uqBJWfvCVO zNBU{6oDRHs&D*~1I%(^;GlA%R+p+yAflxA)69{LRMGPTynlR8Va5if@a-p_ekkw_C zguuD1Tg+E-c_zl^hBEAL+Md8zHi-TANG2KGvtP@_vcQ96_U*|(DKxW})yeEp_>(D1 zAl8H{s{*6{#vc=Lbr}`9W4;AC0?z`u|B$I;yXomYUryJ`<&)FT8R!*AoL0RU61Z&Q zUGxc@*^vH{TdNkOriegaGF4AH|I$xOMVmT}^zmd2{TMVbAkeFkon&OQx%M=nyN<3V&23;vvOJ2*@)qDJTdTvz|e6r6l+!6 z-%Bs$%QE9`@3;<0XkrP=EFE1cy=G%@DA3c&+CZ=Anp3l9MWDaIAw}6k3v15eXH7FH zfmLO@CUB+2_Sien=w+SRLXC=IKso{Oir+nfHoL@DY#$PcEPSasBjyBdCQt412~&Df z@tocms{XD%veoRoaAYdpP^}O!Eyt17OeODml2i0tbJQJ9eGJfBh~Ef*HX>+K!=L7F>RhJ)d4{;B54}Qn3_3E0wI#54u zT%{q-;k6gRR8HhP&SoW?*1>>=z^^!oA^rT$+fCjP^$Mab+LZ>QX9@Mgu7w zNaKNYJCN?}suMxdQ^=jy~oon`P z#~UP8-=Kf>M=ZvTo{o5XJQ9z_!=b(dJUzg(@9C^w_Ho^}7YtZoh;8=BAv70#*uhnN zixfPJ!N(M8Oweaio`zS}<*)*HRshdxz>5&Zmsn@>I(hpmN@04x#}ckH+C}~kc}^+H zNTc|MlEHXGEbKZ-mLl~EEN(|Ps4q3jaGkp`W`^)Nva-q1Fv{0!&jeH31v3 FKLOveD2V_7 diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseMovedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/MouseMovedEvent.class deleted file mode 100644 index b7bdb5863cd41b488456e26e3d7d32b77b660807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1778 zcma)6QFBv86#h<{~WhqASKC_|G)hH(D4)for{En_9xdotE43Lp730)0t1yAg%jh|uhbc2|z^ zCH6<`U)$We_o&`@y0hzlz3Vp~v%jBaTaz$;SB1)~5$4PFZ^WVS#P`ONmOzh?yRur@ zBV;z1We#b)mB(335zf_BD8K4{*OYNXG~1FeU5^6hC72!Wlf#TTP?~V5ems{!rd4L4 zqi!59!sSy)F#a=XYI0w6+h!+LQLM~!Lb_b>2@@@)JHiA9gl2hgmA%ub(8zdS1X6qc zy3i`vwWrm3D2=E0y*{swl(FYK<3l5i3UqZq=YA|Y2Yj?r<7!Oe3f|3Pp0MzGkUZYQ z`%GSG-x3jlQHRpq;>bVA;se5BpN0K%jPhvIBo`tw^(nf|dCV1t_ zDWw>V)72aZl{^-)M3`dahfbBG>#i`^|98kFmf>Y_ov`#qnK)3L#|_&_`6wK8KVi(3 zfN=E`@fw%eZ_BkCR2@LFDcUzTFm`WCCVv zDc#7bADCwpHlBC5*ST@m39~^gg^>?bt0lu%URJ!@T<_85>J5H^;`y)K?X*3R?T(DA zS$sY$!Jw?J;Kh>>IjrHHooMEAV`y?-AL(9&T(3vAl%4;Xk)Z3gUszs03#}z< zG<}i;KH|=^FH#DZFotp7W!-Lq_c=`V_j$H*ficD3bL_Fk5h-5B7nfe5@WRDR^Ec;C zSJ?X|&hvh@=Y<(u;2rz($=i%kz(vd@Sj)T;+tP*R&%C5yfh-kZ)q&)D<^-g`)GqUh zrST(s+XuIF?FjD>e!~3HpIA6Tk+7PX%lw6@xy<6PC?DZk3YKNsfzP_2b)3NlgKjdD zEfnFq%Wm}m`;1FmqZLP>#5vt^`IK-QA2Zer=kWq1?Y+-o9u6 diff --git a/代码/robocode/robocode.api/target/classes/robocode/MousePressedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/MousePressedEvent$SerializableHelper.class deleted file mode 100644 index aa2d5047aa52d2fd6a8af622d6a8258312e861c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 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 BWtji~ diff --git a/代码/robocode/robocode.api/target/classes/robocode/MouseWheelMovedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/MouseWheelMovedEvent.class deleted file mode 100644 index a643d718c56f0872cae30e0e9c544d630fcffdb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1885 zcma)6-&0dZ6#h;UxELY^L|SUmid1f(colzCiM53UZmgvpZd^0%JJ+bCJ-ov8SZBHob#P;&-u>&`|kDM02cAkL5eUHN3|%3 z>eAbYT8aFASIWjlv?uGUdot7xGK8}SU95qSPh_k_V_U|Fio(Z!nLrN-r%O?oXc6jd z(P+s5&Sd_G{mZLs%a1G7A2+xB@3#Ev6ZZGhY^xCl@2ODf`-BT_OHIaAQEN!TSS1RWmtc0h?;K|Iu1W|OD+lk= zcikdWNupL9FwFU5m~fJ(QkUh9Xf^a^tfE-yXN0s{@Cie8l{AG8b_q4Nm(L{DD%3LG z5rIrRe?=rJ*fOWZN+`9L?08*rO(|o~x5h_WXcZ*I9-RlVXzudSVwp=aj451naDg!W z{~$ShhD%IdCB7jd0&0@*_;NUW0uFJywI6%2SY8cb_Jclco<$7^N_StRADk{-3 zlrh0`3&)hAKQ1X|K`7)fhk3#XBR{fT=}2#i!Twt&4i;EQN7-$+EygfBTz7DdFn^-k z+Mp!IQ*(nb8ijqcLb!aiaC;f8dIxMp30ID(#XeaO93CapeZtI1G{WM0+7SogT(3s^ z6vHl!ZdVqL;c>VpJlrhC;O7m|>`c|T>5P2_)Njl)3aihWJUToFD};$4mO{&QRj3iw+p`TDMz$9k30WIUJV7GRo$uST%Wj*F9ml z?OL`izBOfDm&v0duNt)xa(>8SFEvDxNN(BKVLG_Zx;Bqq3ZGyAgS>O>Zix3;40rcA zwsO5O!rwFOai1enybjLIzeN6pjTz%_)}Ai1_YIuo{Y2Xf<2c7V_UDt27$c95G1v#;ZwqMT$+E2=~tK`EM+D$ z|6p`7GxrzVw_t~>DHx(@i$7uGR&WX>#$9DHYnX*^^WAJ?c1gRqiCdO~i`)3pUdhEB z+-0nBj#xqw8QinjG|S6ZT%R_<-ra8Z-)-}VyA9!MeA5Xn*v0^--eCC&y+r9xM&4hX Yss%7zNHKZyeSmdd&0Dq1|30$s0aLu>tpET3 diff --git a/代码/robocode/robocode.api/target/classes/robocode/MoveCompleteCondition.class b/代码/robocode/robocode.api/target/classes/robocode/MoveCompleteCondition.class deleted file mode 100644 index 8be7acb97d4055adb9aa9e29fa384cb2560ca543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmZ{i&u-H|5XQfW9lJHoA3_PxhBkp7+8|nlH~~UJ36(0P99k5q+&0dtY)S0M*+k+= zka&h(kSItTcmN&>F}tx`kkW&9cV=gPGv9cB|M~d~z*B7dC=fQ&WROJ3Q0^ZkbJ?d#!O#E~2xo0}H|@1=^Benr^Wxh`n8PjEY2 zK7fN8A$)`cXJ@y+3PL$V5gwt^Q?YzI8xLgqP7FqpJL)Bo81+S}jGZ}M{XtC$&8u2V zC2?boYx_A|RK6Xejyr^vNve`m=}!bYeSi(z_t7BKm+KF)i7mp~nbci1 z)n+iqax8cv@tH+*38fP)qK`*nk}2?`kreT4LI_ThSsKX$Wz?=O)v8X*s--!5L-d%~*aSTBG6f}(rjTrk_Q0z8fco?CWk&()0Gv@uj>XA9=a%;K3X0C;WsZw`Ug+~sE8 P{Dbl`6yX8q7Vz*doyVB< diff --git a/代码/robocode/robocode.api/target/classes/robocode/PaintEvent.class b/代码/robocode/robocode.api/target/classes/robocode/PaintEvent.class deleted file mode 100644 index fdc78c88894efdb6c848a6d2b7020643075cc84e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1417 zcma)6$!-%t5PfYsaj+c{vXOO$4nUM*iy?n~(Rh zyRWvkGcUF?yZhvy3DQ{;L-Vq9hlAc$)*wBjm5TUOfQdG&2xxVt=G z77QI(r$EU$Q6Ssj45>ruF?45ZTRXAkG zC+p!FN0AJ|E%Ji!tjsF+WMNzHrn9zCmRGcDxhg`qR>mCeD6V9|OJ`s6BX03`%6j7R z${}q{ucuSFC6u~-zM=gxj6sH>T7JDaN4D-CMI3ix7{V~A zLn_o|$x2TNTeu9VWa@&#>k(c$iczG(NHPpxlH9b47sD9F8N!ZjP#AiX{}6_u$yC8G zasiiyOCVHgHmx-&@jo|0S6%Y2LO06a?uT5;HC0A0;L)fFH9lQ>;mtE%@td)Wblx!| zBHt53$KE}zP~%dEuZFQeJ#BKAxm~h0T-R}1u*5KaE+Xy}IfFgcH)lUA`aCv>5ktakL^x(_hn z0|Z(=(MbS0TBipl8zKX>$X@jMksrug|5Oqar|4(+h=K7Rh@T?CuoUVG{Y11cGYOb`dnB!MYdrlJJyl2k$RX{G<<4AnPl qu-PDe<_Ppmm05DpfswD6-|tvFLHavcjm51s6c_PRGOQS{hkpP8UQn9= diff --git a/代码/robocode/robocode.api/target/classes/robocode/RadarTurnCompleteCondition.class b/代码/robocode/robocode.api/target/classes/robocode/RadarTurnCompleteCondition.class deleted file mode 100644 index 4cbb1106ab7f192ac76240ffa704e80f71057441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmZ{i-EPxB5QWd!j@=sPhd{$m14&wt+8|nlxB`TPQYuvnT%=W`_HJXZ%0gmC?xqq? zg4Ac|O(hBv7d!wDg&1!v7X-QRdUtl_n={A$`Rn@+08jD2gGE?RlTi{Tk=!1LNTdg| zH0~vn=~!ynOX5grmBbz#LcK^V;)GHb)P&pp;`ViPD&kN^gY4!7!F{P>rC$+NHx?yr z4hc?=HTbY`Er5rBU~g;=mqDlmD8VIE`zn_2W|NUj55#CJSy4X;#ds)Em7VjTqu;9& z!o#axi|1l>&4r@&=IvJkG;oWsG)+~KD*cH-dn{MW6P}wz9{E_sJr7Mnc;Q%zcs3>Y`^hW~<*v$RZWV-ozS7nQaVpSZ z%WVF>1S|86cMk78Eb+R`r(KR){Pw%w_<3}R@&%tPRC%qK$`)6&Ik$rv#~Sl&Tt}Tx zTxY0k0yA&q%tOw}dR7Z&w|R-1SKvA$fycaVF?gFBJu&e1ysUs%b2y_i*BQ&d7VhM2 zdS(=$*8PI=SKO_9K10blx6hevn*m(T1fCmqVD`0~-8MN?;a~^ZRp!Mr(*SV0^p_95 UnR$oBy!iv=<|x7%*IHQr4aJzBVE_OC diff --git a/代码/robocode/robocode.api/target/classes/robocode/RateControlRobot.class b/代码/robocode/robocode.api/target/classes/robocode/RateControlRobot.class deleted file mode 100644 index 8e26ecd2dfe92af5fdc0d693647323aa50f04be2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2212 zcmZvc&r=jf6vw~4zjqlRY!(7pHJBJ-S7i(slM09e8#NJ(g%p)sw3=nIOk8(T<1B@z z+~dWZ!olLo(XxaEt!SyadCH%XgI-g4ZvvZycS){P zsZ4g>Da-1zbZwpo#+bKe-xJ8sE6(sXCMnlF%UfFZ5E|stganZiI zD0C^P2z|^&o6RanpIh=mzZ> zJ8K}#)p8Wv;Xr3{Se(k5KP*VCCan#tT=%FW1kM}y3ON#;@-4`X=0PTY`V}3q3b}1S7mR$w|mxHZ^ zoURzS%1$3Po!Zu;_};)dZsYEo9#vkDzXtu9x#`s1vUSKOMGjuS+bHWovK zo0I-UxQG0aj@KVacp5(-Pr5DiHE3qiC}@lq_t5>sck88Z!Z%KkGsw+%Kp(O+BYfoO z%fZuBl8YvaBfIEtMQ5luaEm~0`xyrOc_PTb*%^@we}usxmq|VcAUo)POyLoMq#pl6V@WHPv@a90e5zQ+1C~^A2gCdLER3_I;iQxEV?dyWXv+6Sae;6!yx}?AaMmUszAcJ6vDc^BVFEWEV?e-Hq3HLvFN%K zI&~2d4X35cX@%3KOPEERL|lw$EV?dDmNSY)*QF5BMV!+>TDpuWkgzUhNEh)VQsO6# zMc0L|5$p1WV$pRm57Fgk4X35cxWZ}ErGw>n(&d51qU+LRnNTdcE@oJlO%0@_3q3lt z9lp>{=>6bJc%w+2-`~KOJoNmzh3;YwUpMg0HuAn{^HI}uVH>Gp4=r&>p@B<0nhnhH zINZQxdRV?=d87V)9_KpZDapHoKCz2I(ZC6@hf`u7W8xVm#9x>cFEA%w;+lAcAH-{o V`9{#=*C<~c(R`M1=V=nb!v82|W844$ diff --git a/代码/robocode/robocode.api/target/classes/robocode/Robocode.class b/代码/robocode/robocode.api/target/classes/robocode/Robocode.class deleted file mode 100644 index d7ab53d66c6213cab29aad81d12a4b045637e489..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmZutO-lk%6g^i*C#NyL%8c5y2((2HYH0)!M2o2)!%eF<&zC*X8F(`W{j63+i+(^q zD!OBuL~YKwU*~>(e7?N{IK-BV9HD08FjnzEi<`OO!XZ>g@==PhjE3Sm9BGvjipM50 z=?Njjy0hk#7d6)(wfYl2c7i6B!ourXKv&eE%46>g4c_uR_Sw-?O$HJ80_HM%C9I*skxYEV{4IV(bt(3E2CxkWJHHxipviH8|PSJ}XI0chiVLU{pmPE(nbHJc2YOmvc*&ZLTy9ie_z7 zFIK#I97C^c=`~C4{g)AU->M5-S$d(cEIuN|5g2H%TwttSi@Rpss99ClsZo^}!bnQ4 zlhi*oy`|tvu#M)4VqQbtmQ204DsVr~j=B^+sVC3sckPg#ill4Zm z>eO7bl#O8uqXN-#X|?!R;9^@1rx$Zl+qC4Hp~lbAc4vC4k0G-v6!a?41TwbiYW1?# zQm}3sjhf|tr4=^!SwLx7xAi@rIc6Bz+3s&(a-l9Qh zhP-o7b!^k7eXj;d&4pw6K(mEhHgtuie}PoR4S8kWN}l)EwHmA zhE&>=BD+$_<}3+l!DRjr?D*+8UNST|VmT?zyDFmS;i%}Go)9cV61~9zIgBf>qX26bS9kGnhw(Li2D-9&XBSOu5XE0#_B& z=FFu0fRAMWm56OPjhbOf>DZyOY@Lu31i&x3dS)(APIb#PYJik^zzm~ z`WP=i!_=e1E5~^C555Uv-Xwur0nC9G<^Wzp%E!FGJMCoe_~=SH6F$atC)EX3ycmF0 zTCj?zLX&Ey3-(9SiIC!~B%RJY!Av6iE3W;C?8@w4==aLFAo^d7=$L{7Zm{ z0-+$!UzRTir3t&(-|*xDdegsP?g)#Wsu)aF@<^zRWSmc8P#X9}X!kqOY@#{OMO((O zZvxF{6eXjXpO~`Q`yMa-Vc>GKMTK+HMdj3*ER614>*Vq^Yx%~5>$c`PHkfWu&R7@l zL%-i~saR%w;s_5qp}(d3zw@A*or||R7iWhhH0aHT?67ouoL$~#=VZE_u5@j6j2&UO VGuij7rh+|VFZiU1J=g1e1bU{PXQ8wc@Py@~`< zAD|C~n6(WAVT3Q%yEC)j{PWxYAMgJG_>OfO7GX;JHQ)6wWa%i`?5Vmu)hd+QMusqX zBW^`W`K5za7_`D_sHJGcc|y-G<*9IoFtk>At~2+y*G~ve`OcL=sC=(!qmMB1T=D1N zB}2&Ua&sG5!hEWf&bAKvk;|eRJr24sXm&${iPzqp#gT@5MR{_+)u>5*ENXR07_RuP zsGkU}%sB~W!fVwe6f3C`;%T>8>m|=d$i1DFO?*{grvELQu2wiPa35Kf^~U8 zD7?AdQA-$2ICbG&mDp+JT_uEBLnsn@je>pAhz5!L?5rh>r4Y_z5laTKz~4*+f%I4i zo%1)U`Yr8Bqna@O{ukIXJunYqzs-~39or8Jc5>>4!@DwPEPfAseL(-&MjHcdCM)HZj8IvA7stFv=&s#*uMG8+d`&ROCbo@&_Y-et?|9bb>5$yHE7aq`=Dz z-}?YQ7nx%8F1&*ua@5$Bi_MsBV=;wZ<*AP&`dnQ7;zkZJoe5aR3iAo8%(Jle1g9Fh AP5=M^ diff --git a/代码/robocode/robocode.api/target/classes/robocode/Robot.class b/代码/robocode/robocode.api/target/classes/robocode/Robot.class deleted file mode 100644 index c776141c36aa521c383b7fd6ee6b55d21ed8eb99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11677 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 diff --git a/代码/robocode/robocode.api/target/classes/robocode/RobotDeathEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/RobotDeathEvent$SerializableHelper.class deleted file mode 100644 index 39ce28db009905e6527f657c22770cb5dfb5a761..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1685 zcmbtUYfscb6g{(Bc44XPLr}m6DxlkaP(XZ9VTUBtH`@FuZ@=YE8WKZpN8i`gwr*{ytHus*dTFE><}B{1ZcB~O+)lJ- z+Ll^73C57RZ(64JfFW5_8Vu4hsmLISK^bZEGi2+g#aH%r4emS>A{YvFyQ#MuItinB zxF~tsrpr*RN8G>9L?d?BJm9M>hKI%auf?w!9rfJN>c`X9lv)~R8Af~2XHdY1jB_~8 z(62X}+;yjB8D@$-1#3!-W!-a3YfH;u3>VTEXDI!-S{XT9WEd%)#8YYvnT|=^VW|8~ z6{vi+Z@%#4L`BF^`pYohJ41$nh@7GE4;EOatuDRu_|jghb-FJNQM2nZCUJwR7S^D5 zSXgLr6jO!|N|g(eI~K$+xXEMkpZ~x7xZ^=v`Hoj*%s^$x$M^!B49e*l#gU@3Q^1^P zs`(ygL3E#`@A@6qbu)}+nC*R3Pq`&Dg$hq4qVu(G?>SBW#1y?de5@;H1QCN=vn=i` zw{_R$)WwBPt95T3Tp_e1J$-a-^&ufH2bvAgOr?>D)zT3%AL%0jncgXX@iorSw;XK1 z5VAC*>kD~$i{MuTD$$s$d_!SHDpx;Y_zq)ZUtgYQ~ zQF-L|@Bk91Do8x?z;8l`GvkdDIZjhc_Uz8wd*1~i1PU2k#0%41Tr+RZi9%@HPs80E46A1%r*PI_KsA` z3q4-D=KEbOH5KHog;QWBKD;qUz?#~Z{f^!ayl&v>r#8a6K&tJ9J*nM8fxY4hYb&Vd zYZdHESA|afz6?FrlBzU(rJZo!F*Y{eJ*5JtZVz`188@s9n8+Wr^B|DDLvF3qDy7yG zZlIXNqQLyn+dSy;S7lH_nMoskd%rE6h8Jq(t3aSc`7VI59${q)?_oKKn*s|j<&c4c zTTDdPZyI*CmIdBCCD6&fy@Ig`Oc-n}aN{CY*4b17E8WONIbKFoX6qnQlcJ23m?oW} zK8qLeh}2=%F>mho4`nYZ<5?=cWBb$l(N@>)(;iEnO>v)P<_7F-wdu9n%0IR;`MAS; zjMm1W%Oe!0er#@9W>a-~DySs!nZS~fZrt#gKkJdkD%MP!lFP00Q!>WWW+^3IR&+Se z{4SsGT^ZY%>78yraMgxq2Egn{4J@0%!=kDCtj=mjhM{6+b7up<`y4E0bj5KM6S%~; zB;R64@jZ>H;d=%-GktiL;@%9h{C&lYJle*%rpwQeD=+Va*an!vbc`<$n_^$n}3bM(sL{b z+)d0S{>Ic?qWm07F<RHm)260=}fM4=KhL^4PY>w+G%ssR~TiiX~IP2e@s8EZ`14 zBuT^a-(;qJNQ3a?${IQHl7Rgt9mq%GYB;N#Pzoja*AMlfdMkSbZ#>;q%d~ nd}9Gv2-y^>s6}oIT+dD9wPP0svQDBg*3tv6X}YZPyNUGw0e;RB diff --git a/代码/robocode/robocode.api/target/classes/robocode/RobotStatus$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/RobotStatus$SerializableHelper.class deleted file mode 100644 index fc8b594529d64405143bfdcbca58fa2b2cf57e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3263 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 diff --git a/代码/robocode/robocode.api/target/classes/robocode/RoundEndedEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/RoundEndedEvent$SerializableHelper.class deleted file mode 100644 index d4cf1fcc77717a5553ac345b5149f78dcb386ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1678 zcmbu9-A~g{7{;HobsLOMa55Yq!gSM(4GM^;45vUaE?Fc2T;gT7ooUHzP1}*ktuco9 zk*M*%@Ir6EXkxtfk21ce+sXo)pBFt}?fabH`<(Ok`;X6G0nFiM03L?4X_SnzQQ^vl zQP(SLdWBckcDQcGH@T^)HEmZd)%a~*d&JEEB!+=)bw^cds(xQtFKzR(9e|%rt%EIR=V6| z$o!2Sff$aBBD-VS485*0L-8L-b)UO!rgkQ14k`IhjBrn?~I%^IMvz!oef; zH7%|!gPhlOZm!l;%i^?exK%WV{|`)%nwK6Q{eXP%h%%>HFU=I{nOL1XK=30CJdmmN zJBv>cqOsig04LB-Gx`zXB()-VnR+kv-ht42>e@q}I-wJd*UeD+5Mi8hblx3ZpwS`gkQ1~=%+HDK1xD}^alCQ><{N@8 zK*9w`AcaW+pzRzKFU5}|jSM8hnZk4vYL68B^i?dK*@u#I+67{x$%5|-qW8ukQp9(F zOCMYZ!XyE_rm!~z@s{M@IWW0~kP8!YVPZ`fKSr^DE966nqOQ_NqCSLcH1Z9A&TX-Y hm7re0i*w5!deMGv;cyp^tBo57{se)Ij&1+| diff --git a/代码/robocode/robocode.api/target/classes/robocode/RoundEndedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/RoundEndedEvent.class deleted file mode 100644 index bbcec8dedfcf4c7ac813351b53a002f978d0ec0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2449 zcma)7TTdHD6#m9G*w_m=hEOh{S1$IFuw0U+jcL+w3!6GX!MKH1t(NrwOUu!GVc7Q$ zJ=-gDW5=txVT^fgY^9z#0dzGGEN+z%Yj-7{Ai*kgv?70(TX<%*J3 zsqrrIFF%azSJ&1b?iGsPZts{|J7#g8?9C{hxeQ&tj7X!X`EJ0F6rQju#rmRq$#ETV zpP@Tznr5!V5L+RZNklQIA&u({(QK~N1BSOW^dco^BO3bZvoQ_*NHO#m9G7p_&JMX> zv<@qrAye>dx`0L3pmn$z6DJNa7%epJ+m?+yL*keVwW}hV^^K5iFP#-z*k@?H%8#sC zMQr5Aj3C9ldg;VRPWmw+}Y`ki$$II>ST*Ehn!DrQs%SF?o;_}Gt4x~r!C$Ga3k>LE=NQs&oMTuYKga0rv>(9@`W>QJz#Li5qlf+>`ml%r>b!B<)$4e?jdy58 zo>W|>W-@X_&1CE-#e5g*!rB#>y2Zny7Nj;Rj60oFPYjuOrHN*QI!Ncv~wT|Eq zI)X>r!J8exX-qW0w?f*{wA&6XwLqgG>1&vL6X-V`plM8DnxaXWex~e53G|s)$j-b( zmf>D(B=!npnc0!pbId)*hrgh2B=!$x^_N(RK#CV_5$}j(I)(;^h@H}#f2Jbdu6u2W zr{hyRR9V-tj1?uGj#aFYFO3lEctn0Sly8=!Ix_J%qIk`1aZ@djFFHal)!Fm~gy?>$Nblo-#w1bOqVHEo{ttlP`0@Y% diff --git a/代码/robocode/robocode.api/target/classes/robocode/Rules.class b/代码/robocode/robocode.api/target/classes/robocode/Rules.class deleted file mode 100644 index 147e220e592260ac35e739f85a73e9d8bcc2a242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1810 zcmZ8gO>Y}j6ulEC6WbZbP8pJ>l&Vz4a-h_0S}3KV{*GhtN3h3E3kdUUkKCyzGnF$g zuw%myfDHm6*6a}Kf`9~6ERk5lz8jWEY!TwTXM6nOx3J&+IOm>w-<{w7`|)QY+NSrH zX+fdYq1$o0ZqH2CN49yiOp6M|?z4w1X)~vvtaa|2T~8q`lgky#g?h#))v5|9d4(c5 z*E#Z-fXX@=nE>mse zT52}b^k z&#kkb#hfDm68Wus2(R<9MrTRow;LLrAKz|jbdgjjC|izM9UXSep}{(~snDsi+hul( z4J~d@oa&Cy5~cv%)@X+=f!@1kp-QZLa-D7|w9+>{V>EQ?%)^rWHJ&P0UeIWls|>IX zkimzh?RG8iBh-`-6a8VxeM6%R&yOK|z-)WZ^78DE^~D$}8da$VvP1TvLQ9D}xNv2eqat2QhS04ThQ=WcTiyuCatdd3@Dd%oe`w2`o6{k)9mqH z?rQY*xV+^k6h=aEl;&Tm)ukA8_HoA)D0?1mWO>yo_zdsDK{z``n^)+RkG`Om?|VhI0plK%qySQFuY zUh>D`Pe}F_g`oXKx`a+%LiQed;pePQXO8LeBf75BIdOSKrwiip>UW4Q&};ZTMT_`t zg2TrB6MBX|rCTD(Gq7wE)+GKF_?KSzo?f59`S=L!aELZepcJKHh4}iw!zJB-TrMgC zNjhcY$CMxRzlCG0VNCLsL=vH*=sbjOrX<_Q<|IMDOK4*r|BZwX`uI0}{7rPq@ljr0 zrxiEaUp=PsJk2ACChF7d`!qcan~&_YPH)8rrFiu7uPKrMUp(3$bV~`&7m!B#6B_vi zvw4i=_*HPP3mK=WAzD;1c0S7 zw(ts_Rw3}$>FxF`$1W@#c1DQawrtD$f-sQHZ4k6Y#*x4PPU?suPB>k$Y*F2L*%0oU z1VKnu9MfoT7z~Wx{YlMxZgmKSN)Y>faw&5Bj`d2cv

ymHzNo8$JBOEmqzopqN{V z;Vj|&@cz3|8N#LhMJvl_lQP;AVfg51<*xH-9W!C) zvohi}9dqHyYjSd4$7kWmIXQV#$F1<>bvb!k$LHWP)$6kPe*|2YfJ+kaonrylm|Ggo?TT|BD$u0bQ|CC*Z!02jI><6N=ZZ8Xcc6^pW<1wjh9O74vv(+hHD^f;co8{s7#1G7e~lqHrYXZSF|0| z@_6+rt5ai5clVUO^X@ufwqG9~q5ehLv|MCXjGD9Kn&O@%HTm2jwVjf<3HlOWDDGn0 z=yU|@bE+qy2loj+W`6_xALJ`(5D_W+{C0xh3j8EFJN_DppV){%=P@cL=^;+Bt#=n- z2&egtFD9JfQEs-_sm9NA{tu+8+Qj6~_+THItz>pf+xme&be*N-B3i~ERgt0@95~Kdh<1SGrbqANj6T z2&~z_x*k|J0;{->FAs9RDs!V6-?nQ=(mG!P8yKTUEHjUBgEp~1b#CS-DuuZ&kRXNS zAcbWtV3AW`m@1h8=JdWwM&mTfxa%kLm%q0(k>AI?Di2@X)YKSNV_c01HR^KB*YiWa zBDFc0(K7K&A`{K%>7mzH`!S$1U>@6gCPbt7& z3b2=a>`~UeM|jNiORd~QorzCj3QyRIB7-cxWh>4_8^w2QCAdT*c*>TJ2`=X|Y+)z~ kZa2fv_6k2GC$ild2b71~O@5BRRAUo@pYk+tUxNX^1(CHyV*mgE diff --git a/代码/robocode/robocode.api/target/classes/robocode/ScannedRobotEvent.class b/代码/robocode/robocode.api/target/classes/robocode/ScannedRobotEvent.class deleted file mode 100644 index f34f53d60191034f6cf76a1666ae919ce648de6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4955 zcmbVQU2q#$75=Uz+p@e$6vuXzG?0YGjwM%B;x?32P05dvTCJM~+c6|?0a|b{l0t7 zch5cNO8@xZ@Ba*73P0;dkHUVpvDm0JmaNiT&2$`VX_n94`5Ttw^&_dUD;U@B6tYdr zwaxm1hxbGcekP|qo3&NZB-XFA@3S>LdFxq^HY=U2{OICFVs{@SJ4>Wj10`74}X zO>iu&kaWy7OJQi{HS>m9s+-PAY0h(PXQiyrXE~O;a+9;ULjS5|F7Z8kiV{Qs)NGHlGj?;1w!1gAA4Fdz)zh|Pd(S8&Ch`jk>58@PS~b(NmT1B``kscu z0Rs==V+s#XbX!xA&sD+hp0OS4;>Oyd<<6Unb!~j3MmcDdJo_(`-m2Xs=S-kpm%4Ou z|AUswFQk#c5wR#YK-r zuUOvMwssVv(sz3KP1z&#ogO&+{(PmFQ`pm)G)uuvhfWOgT_uoufKTWBoe|3E_QnX* ze+Z!cd^ck+Q>A^g8;)nMSqpa4rc7rXr{S3%1BeTZh6L|y4fPTDMI9l-6Zz1jAVzj` zg5GD}G1?af22Kh#+n&<)TLxzgJSBs{qQ18>_M(BO zw=C+9buYSABEilXI3-x4y{ITA0}BSqTLwf68MtEL49mvie!{zC&F^aR(wS%OsveDQV%pbx}6=qLJGrFc}^D)`<6cc^EcO- z9vCK!=h2#LF)L5oOG}p1o+W#5f_o5+hgKQ#SxVLRbVTw6SH4x2$lwWmVHHYZ}`}$iW&(&V76WdBG%| z;ak8cs9o|&+{eSe;d2i@&i`q)z^AzSNgR|}t+_ZvYk6NG+b6cL-6EU8k!)ddBA3kd zs(5I8c0R*)p$JNTOgb1nv#M ztllx;$td`ZSTHMb4ESgi{8lWOcLN_B_PzKZ-`@$5bbRL}A;yAY)PkRfz#ZS8Avob5 zl221M5&1M*39Yb{T@L*smX6ntz!u)INh13&_G@;+oA}FE@VOn?au1cLYrl=9yYNxz z{uoR5><;Osqt^W`mhQP7(mfxg`)4fO3p=E{7^VAHEZwD#O84(ry3g#8ZZ>M&e`4w8 zcSv_RO84Jby3aCbAAAPdVSEpti-z(0v2<5=Xx&Q@>r^t9j+ge}NOe+MDGJWSf=8If zTXmwuwtXIt-`#p1)k87hJ#yXm!MB;2rC_tb+=qGUz`N)@aCh>rQ14<-;U1o!{0kJD zmACIEggT)s>V8T7>LB{mA%3Sn3`31!uNuc;mDkH1YEk-WSZa0+OI)yzwasE3?!hv- z_+!Kegi765!K!ahk*zqB$fl#N91ppY@VT?FSvOib+$OL53NbqQ9D$wBB_DOA65~n=U&C!5n%4sI8ubUFmS)4SoG{*vJK(Z|A?~o;K%q0Te+s);onb@{y$CbK)nC} diff --git a/代码/robocode/robocode.api/target/classes/robocode/SkippedTurnEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/SkippedTurnEvent$SerializableHelper.class deleted file mode 100644 index 3e724c6c019ba25656ead4994d51564b31144bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1546 zcmbtUT~8B16g{_Fy0Bdf1<@kPhk~}Huz>hQjR_EqkVX>0Ci=E5Q(UOKWOqv<@5TqC ziScjvpf6xFF+TgFjCZ!%7WoS5!_J+VoqNx@XYQS!zrKD4FpXIi5kk&&N>15X6UNG> zwY4SIR%@<(e_Po8$ck_+vuf>_rK)%+s$0TU5hZkOnA@gNHSKj{xwIk5zKR%O$`-!i zRg7jhui@=mj%_R+4n~OGwQS43M^Mt4A|blKG&CrP>rl~7=qy;acvO2)67H%bLFg_x zWwTl|nHaCb&8Yv}@(2@!CiW>($uqoX?TFEZgT8R{g@gI$Gm8YRk*{!B z)W3AvG^Eh4<038*+RbuV zc;3h)VIY0H;`z*yhCvLg7$Rg(uda@BxXfJAbtMjPUy@}KD+P%VdXGHA)x>fV`cEK7 zh_8u#vOf8LSu=;PPD2(s6=Q^+;9CDoM#nfN2Wau&BdtV;*v9%y<2ow?7JDYd8D%TkNU?9UlG-n} V{2jr~V7!IfY-K4BSJ@qCzX6C^b+iBg diff --git a/代码/robocode/robocode.api/target/classes/robocode/SkippedTurnEvent.class b/代码/robocode/robocode.api/target/classes/robocode/SkippedTurnEvent.class deleted file mode 100644 index caeb26aade0984516d06bd8977a5c97b22bc73ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2041 zcma)7U2hvj6g^`*v9aCM4Q^-%w8W%|?YiAIw0zW|;Mz&E!9bL_7UcydyOU;!*|m1p zLFIu5-uVIi2arGlRVfnUiHH8EiaV3_X5$98mh9cR_n!N4?!Duu&z}4ZU>WT+5)8AR zyW?7}EsX7b+3yRxGw__%1K|W|q!^|mwU#jyeBnvn>k7}8u5;gPF|ZAWGfmg=1MUP} z-W!Ms3ZOoW>|3jAjr;A+SDRbr=UZmy0oj{L(%B3-|2QPWMGYIJd*OLV77eu2BCj&s7}Kd!pt^Y(ZqWky3)dOOH=4FKyX_7< zORPzCC!8Nm?wZ;uhP>&}v^IO(_XTx$`uUV;%!od^s*-pe6PTn^nobF1=$u6^I_EL1 zZY0vF>uCyS>9;_qH9{(Uw)z<7s+aym@pp}%q2DR3X(5GGLapI7lFg8Bvc?6>(o?-D zuXJHjyt&Y)K{kwZ6V*RZ{FPo31cNpMHnp4lkwNI@9Nxg2A^0ji6*yV2e;I*(5rZZ} zXaN^r2Kx1>&`WqLjQSJhsQwX3wL{D^{EWFP|6u756^7fX+0?(t&8Dh{xSD{XC#mb1 z(TF{wMxuy)BBY0TxH{6!BX1E+CA@>1x~>v#;ayE)3Gd;3@>L`XKfrCGxvqV)dFspx z7Q@tP^i+f-Qloqv#EMEpp+3Z&5P3{xc@+9X3_7GTgOBiW2(9SW)3E%7#sl^k&EHf8 pu{Qpw9ndTkGBg?YLfB=p`QOg33?XE+uHBi~pl6mK4f=k9?0*RI%u@gW diff --git a/代码/robocode/robocode.api/target/classes/robocode/StatusEvent.class b/代码/robocode/robocode.api/target/classes/robocode/StatusEvent.class deleted file mode 100644 index b410504920647fba070e1952d65ed6dc8714538d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1540 zcma)6TW=Fb7(L?)b{r=$Zfp{u#oQ9x0Tz-#1BP|mNX1?#tIcL6aKmY&nZvgYSok2oiGVr&3$KR3G zrm|HpTzw`zl|f2iJl-*D0)CN8k`Mc$z@D6(6%fCaTY(!HDaw=c?ZXrmMq4YHfkk zGMVR)#7}ulU{WAit+hu$*gVECE-=w@J^4rP>9!2E?Cp*eD7JiuB5X?GJX%btefJ=l zJ`bauWJdO6#7tnSS{qJ?*bG~dyLPXm9t5r*xax(W)D+0>xM9~;&c49*fFLbixt@~2 zuIlt|y4Z)CUJP)Sb)0<}TK!(mKD*ce3>^$cnPXTNi9KOv7f zoTE9u*Z2G2Z4cgozU{O*TVUp^|HIjAXsNumOvoyuC$!;5%p{S$$VHkl)LMpgVqa#z z$0KruJwhqYli%%bRBw~Io=i8nFUipNwqA5uo2=eD8C+%AnrrRY-k!A@1b&bO)yy5p zsQ9}TU9}a()Cxz>SCz2W?fQX|J2@=jhVBVAP^sFNV&FDa;Cg#35rN#M-wPbM=IXX6 z448dEpN>mxBi*e@97P(3ILmOBK$i0yM&o%NMcr%MOLJ`k1-=h+w#L{5$6WnAiuJj7 zD7`WHNBAB$$g@bHh7r^;#kF!j8q>trPtKt7pMhgI9${J>1^3eRw7S zn0!AVf+^r<{K6GY=sZUqmn=B1ISi&Y22zu8>Iqb$)K`qwf41`62b>hRmYPoei_z&+ z{R3tb(7KX_NRf(wWqPzq_G>8No;G^zsAzpaQ7$@H;HHVX^#up;WzGNq diff --git a/代码/robocode/robocode.api/target/classes/robocode/TeamRobot.class b/代码/robocode/robocode.api/target/classes/robocode/TeamRobot.class deleted file mode 100644 index 049126aad28512e147eb3cd4431e087ab3e2c201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1923 zcmaJ>TW=dh7(KIg;>Ovgxj1&>gf`F??A*2m+R{3tmo$M$E}*!IxICcAdN2$2ZnV3O z5Pyi5J`@S51SG^05Bw;^nc4NmDGpj`c4qdQ^PTT}XZG)Ze)|K!yZER8OJFt(jsiDm zE9beAy#p@d0`daoZ2xilMEb63r{Bf}u4mu$B=-DRh2Kb5Mb7>Z$R&Xr{~x$}qWm}# z7~k@IFWwf&)#`@=`5n?JB8SU1CQuZ(()4`wNxyfb!sqg+tH`<;xUzdFLr<^M&3yc= zN3>Ei%bKxi2uvS^fo!`nil3<{k{zNf)|%hR6X|$?(^7=$dOvEoh9*(m{lQhou^0GJ z0cC-?LFE3Y*_R0jEZA5?m86fA3I&|Awl}qv;T&u5I1MO>D5m z=kS_d6gP^f!_l6&b=Es`dMD_1$%)M}y(_T*t(i%tPby#crbfgIl{U^z%4K18iqMm> zqNV0*^{{XoLHFRIBqtl zaD{U_3BWXFxMKG)$EXtLd9LOSjK>{|J4>s-pz;^y^y^P7t)1cx3qN7}S6tKJIRjoM z6A-3Apc0=7L8=^evT_2GCLIxjiLt9-5v6}yt=*I9|Y#L92;x130}&bLlxt!lVo zy=p@cR;CwCn4bJRJ-L|BoX#lT5g5sDgZwtB&@HNSdkB2-Jiiig>D@GoOHR5M)g;SI znuWc%Z{Y=H$h|OS={_ei++~`3Y{Gpk;K5KEs#zPVXkd%@sUY*5eu(Wf;T*9rO^7I0|iDGCl94n1bgBxSX&r4cM=rVkdWjm3GMgDf#b`{~p`dD{fy8FGLc{;i0*CLGWLyMCn(AmCc)yw)zCG z%k4wBxD_ElL~u8^`ime`B9!10sy&s+chm7eX2)VMlB}qg#$wbLnKI`*=;>2+PH0{C znrn%LHE+~&Fzb9bLId{*3zJNxnbMyKbihirJZHF3s;$#<1fdvm!$vz diff --git a/代码/robocode/robocode.api/target/classes/robocode/WinEvent$SerializableHelper.class b/代码/robocode/robocode.api/target/classes/robocode/WinEvent$SerializableHelper.class deleted file mode 100644 index 9156b4acaea6b061593641a772834a55320c05d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1194 zcmbu8ZEMs(5Xb+MOD}2eYTMKLSoLhLaw%faw+r-%u6{)WdwqO5)@tr<39z9JI_ z|DZIKk+bz76_y{vD0Zakn1!+z?y3?Kn*A^o@pj-PiQuMbl^6W0$Z>gFk|&pgr4qlNPsO~VDOuur&%O9idZ44prkmhmcsZRVR5j594@gv+?XFeOf5Ri;;Qt-$W^ zjuL5p#p=N+ZhYeTq}10FQq78PR&+C`FM+FevtVwpRp+UywWsCgRa4sk{;Te+{wiI`+D`$iSX4G%q-|=X2ZN;H5ngC1Ukq6uL7Vc(bx< zzFaj6n-p(`>8!}mG%aoE&oG1svKtJM1xlYl7;PyuqlKY0FKzK+@BNl=3w*027~1oW zMaempKh^ft&_0i@82K8C1clco%rI%R4itJy_$@eF;9>R8pvF~rC%N+1&8JTfxGcLM!L zhBHN_kWx*N{zi2KdXRHzQr5fYyd1cxReB3#7D+zSG1@e*89GV(HSK-*kt%oW!a?(PIS?# z4H;Yv2u1>eaJu-JjzUmyl^+<|yX5MTWO3YtJoGK8FdPUA7X6GSjc-x(zS0wiB@WdHyG diff --git a/代码/robocode/robocode.api/target/classes/robocode/_AdvancedRadiansRobot.class b/代码/robocode/robocode.api/target/classes/robocode/_AdvancedRadiansRobot.class deleted file mode 100644 index 2e4579b2006849e9bd6603407823f3c4b443674e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3320 zcma)-*-s=@6vn>`Ej>UnY)#WFGK)F`C^Vw8ILykh%?QY_MIUr5x(g_TYSL6Q<0LLI zafyjbOk853(FeB&9Vao-@xl1ygMXCqJKaT5g?+1i=&F0`o_l`hJLlZnfB*CQ9{`52 z97mNxPd>Mj%jB|F`sS7FuIXf~?7W$^O=oAG3vL`Sh4wNwvZzpV-ga#FqC$0V-?BpN zDjn6K8np%7Uzi6&(S_&=Gxs18FZ02p5dmm%&y1k=tbh->E5X^`| z^P1&OS^Va#d0`gWW3}L#fflqfifzlvE2Q_miCfopTr0n7W~`mG7^JU_nmcx;sB(_; zk$SYDJ&vTpfFH*H*=QhzMuo$SY&4gB*^91@0d*Sak}M<(j-<&pH|;xCcKmk6+IH=n zqtLM6nwgho%{#w%A@59EtFA9E);re6S{+pwst}i7K#?n&>Tv|e4LpP%g?i7o z#HbL@m-4Eh#uQq;wRwAOeIMNDhC`7A^%>|FZ-->9mbQ}z+4VMjE5l3-vnMwCX;q8fHHp@gZZeT(j)cOX@fIkj9=`5vp zQ3_*inQT7)xJVVQ8+ck$+FHg;p?fdUy6v+Do{{ZsWes^<@VjpBynzMTD;*;36S8B$ z7IKAr#+tC@s^~0xBMoktyC#nDcvbTn16ujxUBh{tqcq=2zV!c!L-#nSLLHy73>-&2 zpGL`m?*`6zaM8%8Y+jC7kQeE`cf*8k-aL)-eqZbME z1w1D`&)r3P)l8QUqQ^sQ(1pa^T|y+}^(T&;ymcSPs_`9aNRqHipd^(60|X7SY-wIJ zL%dOji?Aevr5_I_qlXz1%g3)VRHa1937>0w+^!P0b&nf?Jw@zkYCD5=oJA+j1+ZN{ zwkwQn7wkzNyXIj#O4w$3iPm17)(eDQtWKOVX-K`*dcH(9M0*_|ta>_vCyS)Z%#PA%3Vc9q)JSg>_= z=SBb<-JMVQ*a*4jbaJ=IbtpGSx!aVR4{)R9Uhuhkxms+2*j>uKMY*>r_f7yCE%&02 z)g8u5I<2n|`YI3OYt;KX^}Z2+MjyseAF4TwTIQQ%zQw+Mn_}Og*mncW=)-u`XGYX@ zOsDlda^I)U52*7)*7c(RH@dEqK388?E%sw#KcUo5DfKhf_45EWx~@|dE{1EGi{T3r zzhr{HBK7McO?&rDS3t~Y5Z@5-EfL=n@k2CXt^(qQ2Js^iKN0aW5%;1Ii~K{Z!qUIS C)-uNc diff --git a/代码/robocode/robocode.api/target/classes/robocode/_AdvancedRobot.class b/代码/robocode/robocode.api/target/classes/robocode/_AdvancedRobot.class deleted file mode 100644 index e60236302c1a94faea819a790815e36b4af17c2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3356 zcmb_dOH&+G7(JH(CJap=5C#&I#3uv|lf*|<5)xqYK!HR+qLNoLbAi^O2Zx@BR{1EG z{s7(U!YYlGvdYTCg_TtnvHSx*%DwJ&XL-J!X6E)dG?e9Hy8GVy-SeIAe2=;R_jlg| zID*AE>J+*P`GtHYpVg@=BiU=Vo6*^6?s#$3E9@*E`g;nE#~j!3h81G{2j&#&$9OS; z7@90Jpi!Z9!g2Lfab-alX6=QXR%oBdXYAaZU2tR_Y}R|r&YHrWi86lJ`H({An)YUk z1@}zRozRP3S}zr}=AHWfw0KUW^=d(9Y)@y2GhK8&XGPCBYYv@^xNhFFJtyzdJ~{D* zea%kgYeLX(%DwzG~c+$Gj@GrF+f!b50f)D=+@ z4B!z9kBaKaqAO`}?40wi&YoJ&=v9ecA)eikO{EoDW;{Fd=A^wEWFc8Wn|79#D;jrt z6rL>Xg1IjqpRn+x5ZM{FQ0NG-%nQOiW#N!qXb#Rt^VxS;bQ{*Fuh zSVzIquvXZ$q`kA6a=A<80%2vQh3fMbUcgamR?vafx8o!Ye)<9*^0%oI_;=7R>^?x z7OvP1XeCq|zkyx+iETUI0=L2wakFpWTXft*m%Q$xtM4}UynP4zV)z1$xACwziusO` zjLG+MOFAn>TlO#i^z_ENihR5lwkGu7#>#5^+e*~FaK&H1uCTWm~;BuT? zhS{1YIJ-`AOpO{`ddpmT!(8?Xmje-8h665*1AR9!P!T%e$2dh5&KZ6h%YGUIKkT&# z^vFmDH&cC{kzQn^ml)|~Mtap?5FP2^2rkhjaAY$wIg(jn3AikQJWJp$gG_V@JoBH) zY^uzAB=bJWd_XcElFUcjCi5(gGSju2BgI^odhI5jyTKwhd+lT2MRl(YMZ^{=sbke8 z^$APrQ-gM`k~*#T4J~3&Z3LT($Z_P@*tAoBqT`=AHh$sQ_?2Vh zH=jUhSVxbI3lUsG)%?V?|;LRWQYP_Zr0 bGyg|PC<}4bf;QFadn?V78YPkSN00soz{&|8 diff --git a/代码/robocode/robocode.api/target/classes/robocode/_Robot.class b/代码/robocode/robocode.api/target/classes/robocode/_Robot.class deleted file mode 100644 index 51d365433279c6bee96ad6ae87d38a24669cbb20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2119 zcmb7DU2hXd6g^`*cH?XkOcEDTwFUZtlK`e4X`6-yh?9V;6p&LQm4~8e*(MnYPc<3V!{3yh^<5j#~;>fkM-q}0%o^$S*JI`PI`yYT0@nsGvh3UZG z^Xq=Yl<(KL3UkOP%p`*Ax?>ckBpOx^bkp3@2MnCt{!ag(%Ps9S%R6D{g1#-xLBTJX5v7S81Gw!+0j^`js-IExv!(zN~EG&;;v)jJN}72}FsPn>mi%l*kTHXqhaTUt_> z+zEC4`>%96vM$H^ZFk>@jFN)|!5n97(=$Qy5%am`0j%pVY#BO21FMpI(ZMAw$qC#2 zn&0&r+?LN?E{i1Z1BcVaya{gDB*qm^bWB(khk`D3*@MlL?#T#DTI2d*b&pfPTApES zZe~jhv6G3$O-|)=2RUR}LW04Pxzei@LOAW29|toFtgQ_Usvuu;@R}eOm_NA7m{bhh z2dUU_Fm_lmu*(XuV}K)yCGzq+emAI_EmvlLqIWAV$wkYYB}1C?lSWEtxJpUu_D!LD zJA8PHm^Z;ynQz7S*y3Ms{@@~oDgI||@C>H8c6tdofdapHr7=VJ-ki=wxkbJO?i*xm z_Wa^gy#5S@S-c^ufAFS4^U2>hH}!;BY0Ghvxj>2X7BGh;oWg||-+aXPp3PTtgnj=Q z;=2?seH44dlReh+3P+MIlk^j|^BLP%iIEluNehHrq_Sb%-sS$Qq!$z(v(xnBM5pT{ zt&nt+q+7?6mj5^D8G6a1yLf;zE=&MPie?8LZ8zaJ1l5oEr K33t<;ZuKR)a8@z^ diff --git a/代码/robocode/robocode.api/target/classes/robocode/_RobotBase.class b/代码/robocode/robocode.api/target/classes/robocode/_RobotBase.class deleted file mode 100644 index dacbbd0e15b3048b4287b86c362c186a3e450259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1636 zcmaJ>ZC4XV7`+1_8{;Yx5pA`wwptQUqF8HdC|WF7Yd{auoJK!*CYu3PlO4`xwzU0M z{ZQzs=d|DbQ6BH?VwN}iVQ1&%nfu)Pyv*Bo|NIMJ7Ap=01kOgfrG4F2)t9TBnFZNX z4srr#Uddl&wIjog>XX(hso z%Ndu$0Y5fUDbN=#PM|0-7Kb)4LBhJ-=Ul{>C_9)ukYw^!vhAXRDS=ad97QTL>88MF zxsviu>LJ~&S(s}su49H5HWbq#{nu*|t3kjkS6=M9ksU2|RF}ZKd;_x%ZVFt?Vt2&M z#Vvf5qAx46soN{EOZ03C*Sc}3j8oGqvCSRi{zOoFlJz0$B2_gvh^_sqB4+EQU#;QDc< z2LiLtd#!*60=iuBx`|k?rPg(%yx(;kc~Kl@2SG1krrOs$9ochF(k|{%i6^~8u&0x* zC3$HQ1se>V*Vd{RP8#oZsJA`YVpq*r-it1lY@iE9r+SLGjX8lKlcsb0|C7mvNExT; zDIF2W?kPT_3STV+_8l0`8f(U;B6pePKZpSgfv*yuCzdZqVf%sqA%1LRu7^3R@-OV} z)Gp5a$;kjp9P`QMRh;GAO${)Lb6kzuCZyGQ&T~AukigvH>;ufF8B8(pe~*UukAWJ& zC49zfmd89TE!X_i^j{c1jIc!34-Dyh@rgt!3THvsQA9nHZKboge9A^T6 qpE))N_zNT3!~~ubzKKb$ZFH?5hdV#w5m%=fke~3FBn0XS&hmT2(SL{l diff --git a/代码/robocode/robocode.api/target/classes/robocode/annotation/SafeStatic.class b/代码/robocode/robocode.api/target/classes/robocode/annotation/SafeStatic.class deleted file mode 100644 index f7869f90f6a9afa417b073a390febac3b50b8a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmaiwO-sW-5Qg8W*46sadKB>k4?P<2>Pct{h5A7fy?ENhv25AyO1dfZuX*qX_@l&$ z2jd~&VPvy5BNf^xaN=H_^ zS#+Pzxd;kdgtKP)M|$(?Lg=NwDhnPP%Y=SodRZ$8M@i*^S@4rtn%r`uToO*Et?rpF zXB@5x-IcbLxL&k#vE>E3kgeaihR2h5IwG96!wCmr<==u1|3MzSHN{#$l|0^MliPSm jAZ$o<<)}ah>L+hwN9wWkJ=yI(gBW|*$3fjO`WSozzq@fb diff --git a/代码/robocode/robocode.api/target/classes/robocode/annotation/package-info.class b/代码/robocode/robocode.api/target/classes/robocode/annotation/package-info.class deleted file mode 100644 index 943a46eeb44fa3a7874b03ea753e14610bdc7e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmX^0Z`VEs1_mPrc6J6PMh1nV{G|Nk{FGGv#Js%xlEjkC{5<`F#N_P6^iozX9m^37qKuF_)n@tRX31cFYkZ>h#kU+p600RCB;Ca8}xVB>>dNE7R z_w#+9_s8?TpY!{F|9S(!LA-5Xo5H7aT zu7M$i#AWk}IqR5idG?9r%U01hFs!gc@7msM-m2QBV_!3u9gCN1dReflHOimMJ*uEi zD~!x}Zp}AczhF9bD@;4&qj-N=qh7Ktr*z&f`76AiQ%H7fpR(-oimwoL>y-ts?v`o_ zqvg6g=Xs9pmKRK)xQaldwrduB`-<(aowY0699^+X)(O|Dter6{7RA((wvhg=9rvmw ztD3j3@!qh+!sq#YPtR`&%YvMBMdb+nv0dAz+j+~cuTt=yfr4^@0>clA#4&|)ncP;4 zAoMy2-ADt~c4q0wbU|Tgj=5|FR{eJPp^v{WpZ8)=_#kU}UkT`=$! zQtMW4$T^NxHl0VR<$A?({S#M<)~fW72)@Sp=*eWdXu7WFrNTzWSo%N&#})Q<)obsqqes(S z;t{Z$Otjn0Ep12B_eXG2VOMvj>A7%9;qJi~4(z86w#0jCj8bPG>eO=RKn(LZW8iUx zX|b(Or`}5WIG(_h3X!tqw|XfPm5Y+13vt9TB0A5;aZWBpc`4|ua(+IJQH;oJF^=uQ z?CChh5Rtua#F0Q!X3xek9-NwS+=(5sSBzrbf_u(~#XH z5pz8qn)Wdia`ISDL+6RKbe?oHM} zL2N!0ck(3PlcOMR3$5oOlbIe^HC+wbz?#CIEqT;>x|&`L*YUD}m%3iv{94VoDsg-h zuMpp?R?W4dw@QuK&Qb~9<|Da|>e<}Ve#Zpfugz)61bxeOKVj+r;f!tp2Hqg^2RI=& z6k;_QTNtstSFaYWleYXWm<+PmnzC!dlM9gq?aM zH}yz9>X8i9Be|$YvQv*_q#nsfjw9507k2UQZmyOnGsJN;yK4vT-ht2U-M5aZpK)g! z?&aSYM<7F~X?%gRY;YU*;fq{RPAY`DWR~F_xjia1p#9)e+rn|_hge6P^yE+|HJmcm zk?qAfL|un9&M^#YP5p4h&j3d}*Vb$7Ktiw$?c?4S_H}w8QA}o2hM*@(8FB-6&=fIbX7|)& zn07=`QMHZ(y@nL1`n)z|K}W6A5Q(zHJ1|M&5SSFwGciei`6Q(`wVV*+B=$+27ims> zJOh)|ALzgxJZomx@uiuY82JQ;7stN3jt4$XMK_m6gXPB1`>peb^hT_SiBxPO72Wtz zYyT11-`&18C(EhWyFX|hpOE!rm@NC==GJ4fHEtvhZmQ17Mt0_x_<93R$(V1Tklo$D zh3r%VOWDbA0~fR7Mgz}e$0H3qmrX?*Sk9(m4U{B~A+O&`fsvz@D^CX(cep{2dT z+NQiCq|GJHrx5uM6-3Ez1M_Mqq&Suh`iRlQ&e82-38vM?zulE(M_eFlDSNLXM;Va}& zfV|2Ylx**z*~>Q(Rv*b^<2SfEFO$$rNUwi|Ycmp&fU*<1aR11n{Sy=aXXg1YO!!|l z)I^}J<>VMk`BlHmk PeuI?kLVr`|=B@t%M6z#_ diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/BattlefieldSpecification.class b/代码/robocode/robocode.api/target/classes/robocode/control/BattlefieldSpecification.class deleted file mode 100644 index 78912c6b484358f24f1eae24b29d9be0944e30a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1023 zcma)5T~8B16g|^zX}h*U3;5Nd%cpHYwo!aQ5Tb~&rs_kr>f>}7+QDU)Y^Q4c1wQ&0 zOnme~6A6hX`tFZX@9b`bC?;;QJ9o~^J@?!*v)_Mw{tDnS7Sl*DR0F@`JN}li9p6)d z@7g!HQm)vR!rf}^2}f>Ahb!rOX(Sm&cKCB{yWH#A4>~)-QE3b@jD@K5?Uo26cjYVI zaRqJehtswQ`jr2uaf^Z7Wyo*%USDxfwYfVGDH5X}#*lg;w^WZdH5i6^LUwzKf>r5B zwZ>pns%?hk25B|HFq*?K#we-MXy}FEru4-9!EQ$c52NzMrtfgK%}El;iNU1m$v(q; z^S}FEF=61Gt~QcJnPKYCf`;pgE_ZJP-NCN#)aFY^>}jhqIL|O0c4O@h`pW8vYt~Y| zZmnLoB9wxw^?Kbz36`dwWEihB51CskkY0DC+Rk8_VKy@3FRmDl$+G0iYz{f(b#yU@ zlgN|XEybN@_xN6HK&C6yK@C z8X1bSbdU*{C~6fH7qtc&le9+u(YHXeVAH5mQngQ*c~3zi)G!o+t4CT-{ce5!*yOoClQ)k|UI0u$)+p*H4pv(f0UT) zu1H-Ez2uSPy_tD4^ZE7u0RWe9+JFjyGp!=U)Eon*q|r(Qqe<~{Cu1(L0aXH>1x;xn zsEmVgv_NJEbm@G4LyZv_^2DG-P2j={OW`m@X_8>H&K>$Q0)34yD#i650yQR7f&{ia zM{31rW~dXcq*Zu+_*=@x%A zFJ_#&3HE5Dw7FerZKw9*pfy!1&G4SP_V)km$H2{_PQcE~t`$Jru1gK-;MS&5;5Ia~ ldkc0lY{PDbd$3<%C&MoE3Op#VpW$JlKXPa@9ow@4C*NLV%tQbH diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/RandomFactory.class b/代码/robocode/robocode.api/target/classes/robocode/control/RandomFactory.class deleted file mode 100644 index 5a364570541df515f3fce87caa72b4dde032e724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2740 zcmah~SyL2O7(EvTW@wrv6F1c0h>5}w8P|w_MphMuMF&wxG--y*(AZ3m-90GT_w_B0 z{sCX|5VdNclB!hRQk5T&-;wuJrE+ff4AZEUJkXbW=lkw=&iR)6$3H*+3g8sJkD^AP z-LV(#ti2>tSv&7Jww1bWM` zrE^*4rDM=sAfEPZi=J7zs9&J%zTxD}d~VA2GQ~o{c09S1wsSeTBp?<9T1qaz{Myou%zqfoB(2BxS|m%Gb4gnEY}sC-T9n87vX zi`D|i!g`gH6N+8QAiFZ|NP0ZeyOGXub!!uDsHV)QwBFQ_#v}{Gm445UtJZl-M-;Ib zZVPDF2d74+Co`j?Ed6(Am$&n*Gy~Zv7Aq|uRP~1I$u%8IplFROuNlWKNXOd{=ncaz zSAPih3;Lmaq#*}0ij|##{PxkYio0x1d9P?#oD3BSL$k2IYaxoY9ZeM6J5)5SCF#Uq z3tXLDk%^`7j7tRlp2$^ZXJT0zUeS>W(@o@UFX2`uWnyt7q2^Lzd~UK&(_rDA5|)L% z15JhBTnx;iKV*8=*Lv0^r@5oFTvw{yf2JKPUe61q0&VDc5ATz|Q7G`9|DP~BnD@u< zAqRXShL1T!R0}CUd1Fn+@M(Fj1rQyVou&eQuHy@Q$?o;+;HuCx4No;S2)@?wjZ#6Y z&I)cacG1boG1DLPLFJd9vL1y1hgo^GeE({psrP~ZX{rqUm6M#S+G%K{oz7hfHT(jN zzo2P;6D>~>f6Q$ScJZtEKX!0Eg5CZp=*E|5+nM}%UYFd&o~m2De|W%m(E|hQ#XcJH zAwe6zDsm53hn=}^GUEN;j=A#MJNjj uN>CXc3se{LiuKVy5A(h!Wh`)I#@GUnr`0ih`S9w?f diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/RobocodeEngine$BattleObserver.class b/代码/robocode/robocode.api/target/classes/robocode/control/RobocodeEngine$BattleObserver.class deleted file mode 100644 index aebb7cd82e4763a0f05b81b8a4883215ab1837bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2338 zcmah~Yje|95IyUJC^3p-2oNX)3Iys$h!Y-dsVNZB1VSAiaWFHyW@P1J1VYM4O8!fK zMrWW9KJWwhQ62VPNsb)Jcs#acY4@DnbJlym{r}}FfXjHQAxD_=+_r1Fo1$jAPT;wA zZ9TfN>~t(g%-k`8z!neNzVLR0r(u|IA(bO`gcJC+Fm`d%*a}>aFlt+VARNJ$=NqY< zn5Pj1)d?fP8_S=WC!Fmc9+oA8Z&;2M+$7AD21b`#gyALbatwrV9U4aS7{Y{(F%$_y zB^fZ$;C>%$zi$g~!)V)raJb=`hTSqeOa6{-4$C45^MgqDDaRETT_;p%g)8^ph)qVx zsJ%zbICNPmTraosIF6q*oFG(FiuO;`aT2EpW0t?zcD+C{bI;GD8mDy}z(^iH9p^E_-WsMUd}Y>ZMi0F?^>SLQP>JT2Fs;{?X#|$*)DPk!N*aFQ0q9#r zJT5xQsIZxBHJ{zK${EFEQAxuOD8UGq($)2sl6@R+28Q`=&De@2;!y1ClKXzk7E0cQ zj5>NiyRpk%XBTiq!)3y3s`(#e>bQz)JX;+RG?lgM!r!(7p3sw}^7FmULJ^{e^*nyV zbq&80rc-3nyC4eG@dvo$0xt*t_s4e$^-^ExBx!P|#L3F#KXu&1Ed~zli^U*h4O5nX z3HnSD>F?ZL_i@Y*gyc3SVk6ghw2cmLfZ8A%qsToI|H6ufWkMyTYY%raPsd%{Bjnk_ zF7c64x$)N6F>1EqbZX7Ovz(4n?!Jz{(dZ6-H{ob09WOQ5c71zwS?WYgXDOtE6gB|h0(-JDdFpszZ7 zFfG}J?+gB~6v7#ck2&6kydn9R%<+rYBTy{LLxb;(@EvZ1pC9C3S5*X%uT(!muY5w` zUzK%8MG`<8ILy~N$8!`WafH7KM{z7dco`uaul|Rre=u43fN6f~pK)dv7jlqzLy&j{ zSrI*lMlUc$uN3Yv&ITU|A+EftVwRCFsVth}%Q@5{sz(fVP0fR xX~RgR`UwxSrR7SCqj-$X)#nDD@V7LS*!C83-vL=ifCB&k diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/RobocodeEngine.class b/代码/robocode/robocode.api/target/classes/robocode/control/RobocodeEngine.class deleted file mode 100644 index d8164ba1e0b65d0697e494836cdd23753d479db9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7438 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 diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/RobotSetup.class b/代码/robocode/robocode.api/target/classes/robocode/control/RobotSetup.class deleted file mode 100644 index 6e1c29dc145f677b8de3e6fe8f92bfea8c208513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 828 zcma)3ZEMp|6n;*dHd{$;m(@Bu=gVHCjnjbmMI3(F5S5}}HR#9N?9$y4b4Qwp`l}RH z27d4d_@l&gZzhATh=Jrj=iKL<=R7CBe*gFh;34k1s1VjOJ=U>4lwqvXJkv?|h7&`Uyd zU#HVtq8&?U{{vcWg;hF~zO@pp`xKg5Z4=pqat)WWgtK#EWW^YT2{!qsvi3Ho` zQO}c3ex#;^jp0AG$*!D<%-{3!`h&|um$x4X4JJMR>%1}2MHb6v%51lF@oOHKo#778 zT;;b02R*o0V!X_ot)Kzlm}2Z3OZH?#d^*f&V}-vyM+tKsK0Cn~R)c#pbc5X))`I&p z^uBYxf*btpvI1Dm!6x_L;*Q%`#SS(&8q8Rd#aM%zq!+s9#~?j5EW>-oFqALU7~rO)T{Y1(%)$C*`idEJF||V6(vJNW>ypSu{q5nrGIu}mY{~{m!JtOAtnYK?S^Tml4K+ki>F9^ zB_#&MHxh?$FhZ*m7+@4*w4))630lSD_jH#cnf;E;%i_{Q0%2G<-h$%9?OA4_>6;_B`jPO*fhN%7I)&|La{u8-zQ0xywm<5u4 fj8xK%9=9OIprqnDhDZMT7*9xwW}|;NY$Ej=Qc&`@ diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/RobotSpecification.class b/代码/robocode/robocode.api/target/classes/robocode/control/RobotSpecification.class deleted file mode 100644 index 64f73cacbd5ce337374a3031a098f832a1a24636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3388 zcmc&$-*XdH6#j0SWYe(FQVJMADA1NPF^AORH$NHKuW60C}{-Q2X>rkl9g6hV3Q z)fXRpaC~!o)fv+|GUFo;{2l%qI-YZPlWx=KbbO)HeM~c@rq`pA!FnQ{|SNJWxFCb z*%TNkbXv>{L>+U5^oQTgc&_a%(7U+V@D{7Cfc8Yr*USYvr>*)P2=uk$41A(@OQw5+ z%#vH>Mx`=UG3)g^O8btItXr;K! z;bT{IOo0d-uSjRXTU1$`)^I~${{}&Q=+%Z@DM^=6H+4*dD6g$D)$f)CM!T@4OE^hf zM}g~gTVQV(63{AB*4s{)hh?KH(Ec%EDRRk*7De9mtv>g(RwMq(%!u8zy;ND<{s%aZl_@G0uxZDl4O zZh{~W8){AqT-=_Tt-0eYx7<1NzuXBLnC8_?wc%RQzkK#HpEuvP6Wj{a5z~$%UDZXB z#-$$S431Kkdgv3w4jh1n1j)U0nMRPLnN8E3c2qqD>4NsaO-EMk?M! z+DK_l7)C15MAk_4HZk#w(tMJ>C&+hT6j7WY-_zu6hHe>yEREp^vKYZQNfS7Q95w4n zT7fdfN4Dwr%Nbf(;#h@}INFGkINly5al}z2am@Ua;{xAgh%1TX)|AANCzQmo^Q@rz zB8WIgD_e*ezhdZT5+dXbNCj_RRBq}1fxs=nR}AfNy29YmPVn`vU>ZyT_*;sCR1lx(A)Wa+|_}JPOujO$J$`CD>&T=e%=*4-xWOE z3I4h(*y;*C)(QTmE4b7K-=eH>-u6(=c#5z_w9s6EsqaN!Ak*F5H&JtO;lLw8l?071gilyQyEtN?1 zuH*BKZuk8eZEHxN4lmF!LTjtT4tE+o7=kpg8bC&gncVDg9zn9x%y0I7i^G|j9OQYr}Cxm#R`c9 z55Pkqj>k^zB$`ZFc*Y+8=lgxmjL)CHzkUN~;Y|SR`?t*X8lvkBj2vdcCiV_pAQ&}vL-lIw!>0vg&&)fRbi39Ug z^2l{p49{&YQ{L3sUTPEHrp9+7gkf=Hyl)0xm~2z$8VM82n#MA%Pwngh_k!V-b~aWf zj=CKk3y>)uh`2I>l){LrFMtx$O+X{Oan0CbGnSkD`F${i7S0-GW3~b53)#zm$7>2IkCXEcY za9f9Xr$nqu#2wt#A-0u>dlGRU4|IqfCE}q(Ji=ogqN7ASk%*@VcV}ifKPnN=CE^8M z>Ja-%#F|9B!nzLeRf#A|LdJ+qA3vuHgt%A60s=}EqSb8{{!XF BEg1j+ diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleCompletedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleCompletedEvent.class deleted file mode 100644 index 5633ec327606d5de5c9b0afb558943d6bc912384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1524 zcma)6YflqF6g|^cmX?+B5Jd2SBH9PCfNzT^Ade=ECSYm|pSER!OO`I#-4ZeWC`}}w zM&oCHl<~}Lp#{|VVRvWloO{o`=ib?$zrK72FomLln829tRlKUVF0HCp3w_VEYvt@zAJj+WVj!N}iOws_m9--%~aJ*U}TTbC7vIa5& zeNEaXg4{Xe*_(hRGV#_pnk9;G%fz^XaZGlkAIJ_&V9LNGrEEr3coVmAM}>3Vv1x2D zr~4k~?&R1-QmQZyOgzLRh7LWgl|bf?<^MqvJt~Q+x4lbITLjRFt6@JjGP~P{W0O09 zoj%q3#>CIC|K03=v9>PX9t}VWb9iQ8{;-p}ORKv3U{N4xtFA|hD)fdTz-#>u|0Huq$!48zI*5ZSbR^=Z4#aQA)TXTIC4WD`nh8OO(XP55yePw9s>;; zi(hqiCie;H4_rjS+qChK4roSzMnD#aL0VLf?@1NoH}@4ouNk2G0GIYLQpz9T2A{Ef z{xd9rZ@Bvz_ha~hf?|lbq`$!QmbhPLN=41qA4P1irFm1P@tAxw^i-KdmM2^ZJUz;! z%pz4LgDQ*fBrK^#JRjHl1I*@|wRLKNUQ)C&Wq8%XI@n-MqMNMknq!GkV_5zT+~jHU diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleErrorEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleErrorEvent.class deleted file mode 100644 index 04a18d91e4b8b9ffcaab413114d2fe74ef18a12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529 zcmah_O-}+b5Ph>OEUXLo0eD6(3nXshRpUVeC*lReeOVi*4Ov`uA&gs@(2D!J z`Uv4vt#l^F(#~!F|D&_5)P;t#LHw*kc_C1 diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleEvent.class deleted file mode 100644 index 52ce50445e044c5f428a3ed2d56f96c10c92dae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcma)%F-rt75QX3DihZ>4k+qE>r|31WIOK)CG&y^|E}@1Zv~#mE+MDpC z@A^60Oc+gFaQT8TI6RsW)RmlRFu?j4LyQQM&IP_*zVw_POz)Yn-9>Bs%p_OxZ>jRL zTM!Pqf1sQbn)|p+mTz1+*#5yhDTHbd!XpntoC=3%E$Qqh1HY3qeLd diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleFinishedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleFinishedEvent.class deleted file mode 100644 index 2841173b3265636c46972510e683ec6a0216f6b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmaJ-%SyvQ6g@Xd6C2akXAxY9sC}RTw~C-*SHX>vMR$1&G!iqAO#4-C1VwP+2l!Fq z%`_W9Ixuq|bMCq4-tV8!F97H0J1_|2QpPfosqhn7s8Z&>ScpPZ{!OG*E+$!#RWp&^ z)ky~y;c#_<1`^s?bsfu6iIhN7f_=$E>WW|uro)iUEw^-GV%>uSk6;dlVHdzP#x*LmfALP7Dc*dH3@1KFs zo}xvB1D0j-%2-0JjXi^X2W$McIht^6uyscteD~kcdDWO6zg=B<1PjNEJ;4U&`b#u6 qnXf*sX5~Gx-EKI2w#0v}(HlB1>=>x&Y@PHqjkg3eG=v?E+WiH;HDU(< diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleMessageEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleMessageEvent.class deleted file mode 100644 index ba3234178e4a913e691a892f2c1af3348e753f1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 539 zcmaJ;%TB{E5S&fZhK97|QQC9qr4K|Tt{@H|dMaFsdUt~rjM7+2+1swLaI4lE;lMExBnoK95T+7tt;f*jRk@qssMJ(?u z=D{WOck>G(!CP+X2uITwu@+$>(m0%%Or`N9p?0NGWv&S)gYDztoZ#NFBOev)2k;OO zDudy?4ni|P6*WR@s#5u|S}tVvC>DvdjdUcExyY2wOVBmXDkq#xcf0<7OSb37(v%RP zJs56#WX?>lvPe#p?cLpetaE#9^w@HRUz_b&-yAs{d)VW(&e?=>hj)MU$#eXH##_N@ z@!BjZdvI~e+&&H%>ulIKWIa3lLX}wU80}Is-M>u2z8KLMGS{N*Vr! Hg4Ov0($RND diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/BattlePausedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/BattlePausedEvent.class deleted file mode 100644 index ad965490f913c3134196b4a583638887fb25bedd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmaJ-!AiqG6r7hPO^vB79(q*7i>=T=Jt`hr>M4kz^u9?SxFu#`v&nyX5rzA6~ZT6 zcE|TYLjO*e+T9a+SJMr_U&;OmJsiad&?k&iUGii7ma%Lw}j}~)Hde_-L9Sd`^9{x8ifl;H@O0YsqG{fin`frAeen%@GgdjNH7ux W&fw!5$1=qdlaTOGm~bNKVe||B)Kz5w diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleResumedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/BattleResumedEvent.class deleted file mode 100644 index 82dfb6b977e063616988082230102c8442ef8ba4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmaJ-!D_-l6r2~MX`@x?rMDLGqEZ^DM@tWt_7r+(i}y`@;Fg$$&Bp)oB=pb^@S}<^ zp$9?mGV^8_-kaV1-_I|ANAv@Dgo!nYNzIa@)a1^ZEaDC4u83Zga~XedQLcIUT6qC{ z!ti{)4iZ{VI@j)*&=`#u1b;3ELNsvMK@%-PFV;D~m+OS>mr61wT*oF=*+N-e>3`FA zD_s!oba7!KT8*l0~{O<7F*PaZUpn0W99 z_@j((OCy9ddfAGy(eTy8lJl~wD^D_*Zeh&t9tw)L);v+_=BZCF|aPVq)ZIXoS`j< zX)r{OOxqO448=-tjYhZHVF;g5fCLnzRV1;%pj4`zIWS~YL=cr|Nkt5CiE=9DkYGqR zO`Bg0?+xx=>xRWi-E?}o)zMv3o_#VbZcWOtGwJ{DLs7ES4Hr{c848u^q{7sVuWd~y zr|Bs>t@I{|wlj2l{KAw2=EuhAPuaWEA9ZX}E`@$oK}H59l#y}0ox;){CPfk|t@CuU z5F!Rx(%zBMY9lOasJ*$z_JMHYJ~_$>Lcf>k<6B>OTC z$&Mip$r%)4izxY>>$FQ%M0>;H3xRQ~vGu?!Er%q5Uz(wewE*+-^Njf<&>X{hfH^yB Mz6>;Pcr7-6070Fb82|tP diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/IBattleListener.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/IBattleListener.class deleted file mode 100644 index b8fc7a155d8331831ccfd5b2c1f86d1ce54af5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcma)*OHaZ;6ot;O z6GEFiQH87df1&f*X3`bG-vY_A@z?X?Q$CX~#rb6T<>K_r>}-F}%=hV#t?;H2raw5E2Gvhb_Cm`F@K_yhb= z#l?r&jxtCwG-5FnBQfUfk%(k0!Zx4rNKV=hVj7LR(U_0B zipaoZI9VsY@udv87BZw`Wo2Lq$!^R zO3>=93%_*f6+`xkOU>#abcP}p;qwaqJH~z#(|E-10u`XLH0%7upZPeZ_y+yCfs(q0 zP)XgQD_ug>Bt;H3y&KepND%{6+)p@eb&i5to1^H~=P17upTai1J2VS8CFL1;8`wk> zWweL~+{BMv>`_OP^j@Zs+MLoz?KWuVJ`NU}+f(Z>71e^Bw*HhmLr= diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/RoundStartedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/RoundStartedEvent.class deleted file mode 100644 index b44c58476b8dd6dc283540eeed86597d6c8ff9d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmb7B%Sr=55Ukm3o^H%Tjjsrbpn0GRxkfxF3W4Ckgn-9QGMJThM|LOqDh~<W zt~_NpD*aiZQSLC9=j14b2+|gkSZ0Wn%AF(_vKFFH7R?c;Dqg+v$3o zI!)1Yyp9vN>OL)+a^Qvx)%kZU+824r-g2o|IP*sWrT;7=K?3?Cv;*2mswIX&k6*g# zp@q3WI=*v84)(}ig#Oq-Ub&?#ue{P3p-vJhic566A%wzZDzC6A)iEW-F>=pTGO$81 z50l~n#Y3W%u#7TRsj@qvVGRYkk$@hGRO>9v`z41Fa_xOWc|CPM0QN=Ga|YAU=yNgb=m6AK}A;*I99?8&K^_EO)1 zN!b4ld+uu;i3~_^G-nQ_f0xXZCbR}WvXcDKyG)CGLQe>#(@=)`jBwQab5?6iFfUku zjRMvkSa1l1W@}sqq3WQB62TpWQe4e%Cn6sClSmM@1}gBQu^)%2p9f7n3lqYM;wy*3 z9lO^;e-%OKH2j?v20jvBxqB{9)X3s)a3sZ3}CBmf7pGZ}4rm zpLutlPOAA>G4hcR%}0_a?gf=l&+Ko QyBUqM1mrY?oeWj~0NgE;kpKVy diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/TurnStartedEvent.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/TurnStartedEvent.class deleted file mode 100644 index 93045647276bfc600c627be755d17a3e23d987a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmZ`#!AiqW5S&fY#>Uo);8iJJY7YkN(c(eTQ}B||`%AjeC-FUaed&MoROq1};71iV z#Z#e|nVn(S9rpLI+XHyUb&P;8cDA&YU2s}igxxAFUH3B0QW+ zzbWr)J_ZThnKs(L62kH0oDjXs`UD|*eRR+z3^Q%`tNAI}6{@V6aFf|e)pO-^tN+c& zFZGHr$<7@;t@uJna@)9yKXtqH_B8PHt=0-7NHci>gsE*L7>k-7HPD%Caj_92Kq8n3 X19ymUk4u^Q5|fbdK$vhP7-0AZ-bPfY diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/events/package-info.class b/代码/robocode/robocode.api/target/classes/robocode/control/events/package-info.class deleted file mode 100644 index 6412e7058bdbb2c07e0c2d8341c4622a2805b2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmX^0Z`VEs1_mPrc6J6PMh2Cl{G|Nk{FGGv$c&UdLYGO3=E76%s^W}fRTX} JNHQ_70RYs2AF==d diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/snapshot/BulletState.class b/代码/robocode/robocode.api/target/classes/robocode/control/snapshot/BulletState.class deleted file mode 100644 index 990cdb3a35eb5092576bac6664b001b22418c692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2000 zcma)6+fo}x6zoBlU5N!NO2Fn~V`DHvToi14i-Ou%K9RDyc^97o^fNs|tD`RZ`W_Y|qa0^yzbE|N7^*4*+f>uc1d^vR>P- z6>HB+iDJ!h>$Pg4;n;_b7d1Dr+N@SfuI1WpNrPXY|D}CoC#tqnPNbdYfk0rx+)1ws zOl7(vNeTqBxxBf(DG=T=cfZSrmUn*8BPQ`sB;EPS?1^jFDKt~`9fk6Y8 zafND^+Dk6SGUvHlZoT4^lcqVH4{`CZfdGO!GzqR6&?L|$xNbm~ASA&}10e~*65KKn zmY`RHX#>3y7!u4HFc6ea^9C*f;wBv@#@b0>F`% zK#lBwHL~^9$gWo-8(xjc zA%#Z#euYLAx)um1G^WsvU{IlPg(fsjp-F|NbX}pCLh(p2;;o&DXutCmUkgK4!QaBD zRS2{&W)*@hj9Ue*g-NTRw-B=m5l+omZ!q@@we=vu|3}mh3{d|d^SQ#OA&g=KH~AmO zH7sBZ4{!s^7{>-CSlvnNVhZ0NhUd)nQ^h3N`1xsPzeR8ToHyb#qi0x%U;Pz}=O^|n z=V$5S96uuSieZrZxgPhFxAIB4>m%QNp6+>?;3&8%5Pyrs6LqXiAgCrEC>q0C(54CD zAwJ`bEXau>19pagCIU9qzuXPXFeK9*#(hSTvCLSbqo?$fF~%5YOfq7OnbY@37NVb@ zVfhcP^r`)~__dVGvoNV9gGJ;heg{j~!wQ~a9nW}$zwJ=E<24ahxi1WT*601Gd5x<* zal5R`7MfhzV`~m(bc5=>FL^6)M9`?z@7p6Slc1Az}FW*yTT4( kNZ2JjBJ4rG@*NWn;H2WG#Lozak)NJ^Rty_yRT;Gx81C9Z~<$DjA# zpXUp}21SO1uynSv!rmkk)_7+%>kMzZyY=j_lU1)S&bHF|A;Xw3YxsjR&5dH`s*%DI zQYHOS4ur*Wb^77byV|HNArJh@buS4;X?rK+zSd!x|G!_yXi6ZALOUP{wh2;1YZhl9 IdAwu#1)Bph7ytkO diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/snapshot/IRobotSnapshot.class b/代码/robocode/robocode.api/target/classes/robocode/control/snapshot/IRobotSnapshot.class deleted file mode 100644 index 2d12b02b31eca315af2f29b84d69911d9cddd654..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 966 zcmaKqT~F0O5Qb+FDIC6zfZ_*!fAtu&iMQU#L2P1#P(whk_OzQ)Qg%YvD;GAgCcqutSoN}Zq}SMIAkRf5*S!Iz8k#MwgU9|SExkQ^J!sy@O4Wt&T> zd8EE6dD_`5BJwxKI#XwYZiIulb7?i4T!Cl{1*^(Q?KnA$Wa6YlEg@?8e`j4|trGRk z;jeA2Y~J|0hJxC94peEy>D7g)-slx(|XyXE1$@Bw@%<8GNA zKrY&^{r{PEW_EslzrF$B9&Ris5$H=X5w4gr+ZCabg4d4@)$=+KlBC!Dmq{+6y?c} z2<-H4M+D9@HI_?%nYry$f1{Cd5>LpX2;+!A<_%-cnHtf6dJMnXO!HRWtIs)RbyDY( z27xYVEv>a-7V=I~>)Dr)(!bY*zYsW0WryimPPLu|j%U6!f(dzwrDUNhRF^92{hGQr z9IU&WJ6rlSv%tK69rto?ThC@7n2L6x>qAGx(q+%SIotaBa@?8IB~W&JFQh7#I^v;l z;;UU56qI~Vw!}RS^it`m>T6H0YE3Vm1qWajundO@kC4a63i1SbimW2fpqAv-kqzWI Z`WMJ1vW09TJIJmfl%SW~FX1ZT^&eKf>U01A diff --git a/代码/robocode/robocode.api/target/classes/robocode/control/snapshot/ITurnSnapshot.class b/代码/robocode/robocode.api/target/classes/robocode/control/snapshot/ITurnSnapshot.class deleted file mode 100644 index 0df0e869c19e56fd355ad66975ce6a6f4b4e0881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcma)&%}&EG5QJw7#BKO1g?FGm&`4alaX^ZM1R}X{N}W}q3N~^a#IteW0eC3H+61Y+ z02hycc0P~h8V=_9ALj4DHFqNJ^0pvsO=me_ z7=v`CCaCZt*$Kz8E3ETems~v++B*J6&N#RB(}_@WQ}gR4CM|5|G+#Y7Oqgu6H4jB4 n1PLcy14_!OAl0E`$LeQ)l;gQK(d0v9vNN0A=id9A`<(NfyZP(y-`)bai5(q70?CGV z;MKe*R<`E3e#3LJP1ihXKK1se_cRJr7OhVB)2evQ3$+i;5|&R@U_m8$yBLJs_Zvxx1K8&)0GGpPZ|g! z6oxK?X#=_p!ZMgO5SBqi2J;3Y2+6mr1`Lb{jFoKHde}NVuo`>jfkQ&El26o~h$qFqGVKorAd;Xk#T)UR&&m9|J^N11frQwUayP0?FW6HpizohtfbIUTH2t@7Xw(TpE(GDuuHywv7)Lx{UPNfHId=#G|uVX`C zyi2Tn()6uE1NX4W4a`QvJgIp{Cjyz?(svJ@Sv5ab>~X@sLv#WqR@Ll&Be2?=)^W># zn#*>7W?&230=If$HXXCs%=PU3A8wb2JZ(HY(X!WS)U5lqwA5Jla4yT0Bv`iVuIaZL zoW0WnD6`iFbH;jZV}(Z6_<0CzOiB9#eA4;qNzAYU~|NJ4fsl;wrin2&iaEMKi&miV`Zi915vuPXC>W+8N^IYTyi04u-c@`kXif&bgJAY z*8s zK=K*RaGxI#47}7NtM(pkR{K48!yQ%p>+oW%TwkoI z{#Y+A!ir!GcRPCBruSvL;%B&0eV}FDR@bDNceI(;SigSCnO;NiFIbI$KHg%3+L~uN annzS3M4$#O)TJSW85B!5*503854N%HiL-0;T3rcU^Z-3n zG)IlVZaT0tJHt2MZ_fGrdj9}$hPI6i;YcfA1!^K4`5MUQG*q#3=_{Se$>^tH!y;6k z#EWnu5l@|w)=CqqiPWKpJgF0&dbqhF&@G`nRB@7uIQ2v{mpNvcLxlWA7>DVAknMCm zf;D7n0a-EZH`$q;&2PSMcHci<-vFGUVUb6h@x65Ab08m66-Vw^igYpgDs5PV@`HF1 zZYZL;JJCAUgi0c{5}_}3!aa9aV**_hN~1VRQW2%T2v;)4PG%7yf1x6k4hh*_-zQij z_H>ZNei04|?BJl`d35IP(6Tdq8OPyzjZEsaDZ^ z(D#jN!?@N6_EIK^m~Y(vpaf?cuXG?Um6@mZ^IuL4k1qH{=7s1WhdgJSs|@ydb3Y0k zi+pp=nK6!H9OC+B%r4xUoQZbF?Z2U7R!6DQh z#Ix{Yk<9(EG1?I7sWeK&p)@HUySo|@=$cR+>LkrXl7%8($O6OcLxkdmN>nx=B%BNoG_s z?{`BBZdq`XQ?p%TQ$%nldSN1YscaZ;0V}Px*gIKb_pgJ;@V%9Tw^n^S PupS=oSol7l&f(w-6n|%| diff --git a/代码/robocode/robocode.api/target/classes/robocode/exception/EventInterruptedException.class b/代码/robocode/robocode.api/target/classes/robocode/exception/EventInterruptedException.class deleted file mode 100644 index 0feed93cec7fc6d3a8a10a79b39570d64b8d1826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmb7A%T5A85Ul1Q%0mzYAE=2p*cdnQs_~+jV2B}6xi2u$F}Op9!RXBo@?xSf@!$ve zQO06HZyuaO_w=KxtNZio{R6-rHdBZRcC6`|p6M%J-S^bcX%qU5I~BTS=#;hNp;P_F zPbGzfAb%6w1^yriul$C!#tI4}Wpyy}+MOH- z+teDT<`~wI#2lkk6wNck1){%jzZ@%zjM~h{=nLK(@?Np{ijr5Qd5${Ev_&LnOSDU5 zSVkUYRG6tuaah4BBQiw%ye-x^d&=(93u{U51*Io`Vgw_S1;QpY*=fU!Mo^8qHogIl CdvNyv diff --git a/代码/robocode/robocode.api/target/classes/robocode/exception/RobotException.class b/代码/robocode/robocode.api/target/classes/robocode/exception/RobotException.class deleted file mode 100644 index 368ae2889a1cd0f089dc7383c08856dab4f99619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmah_!A=4(5Pbs+m<0q`LFGog048ptM+_IlM6>ZAy7#g+ShH?TcQO8!ClU{SfFEU? z0>-EZn{=i#ee>RH-#=d8034xRLXOZeda5IRD}DJK$;V9T#J}QJHvTG0a0s<~@g)3M zBr|_(j5dUNDvc6xC{4;UH|M7Wx*$|XI!QB;WTA-XvcO7q5utdZ5|s@J`ED;HI3w0{ zk;i5QF3PMBs6<}QAEwe=i)kzgjX*~%AXtX$b<@f2R7%(n{`EZ|G`qpK?@4AaNuIGXc)~v1RF2=v*iNu3Hz#nCt z0!E_;n{=i#ee>RH-#=d8034xJK!&hy&BRR2tqkPzR6eH4=-@`_(N|G`N7%X-Pa=qg zo&_UojU`kPX_bg0X%n8fK0hVU1))4NI!T32BN5MKj&7qnQ}g=KY!!UQKAighkF-V$RW?Uz*Pntym=Z$jwS9Kb0*HY z-U8*9C1i`E&oH0{4|P=dR9b;h<(?yDa~vJPfRPTH?;R|#{hOi5;yX)*<_fiDU_6?9 Li$c&UdLYGO3=E76%s|sYfRTX}NHQ_70RU~S B9C`o% diff --git a/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/EllipseGL.class b/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/EllipseGL.class deleted file mode 100644 index c62660d759b26b91f7ea15fe46297423726dd3c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 zcma)5TTc@~6#k~PlwJe`MG3_jK91JL@g@xdBU-j;T3SC?J0ELQzdCO(|V@~XWt{+rQU#cmw!hAfdkZ~#Ys0TH3ro&obpHgw2q1cEr$+E%8 zNP*+Jx<%XNW05rdAv&vL1pzR$3XA19mod;($O$y(5jws{8&oZsG@mw{@1#z)0=sJf z+U~A#Q@3j8Ub8A?iMA^?Vi|>Oo9$uXccrwfmrn@8fD1kkE zPk=ll-XYgCPZjQpdurRE^DfJW z%@WOFJ_5YXNHnFez^GTZ$S7?{ZbT%XxaTL4tQeA4MonMgRY|1oCYE{*=yjgX`HBtP zHApJ%RD3Lj5oe-J#v+61J5%U8<7W{$<7G$AmT@O?_KaQP{{lhL5G?U71a?Ru8s)lH zaCZd4RK+!xCO{N$&p;HhdKtvp1c(x6CMxb@ErNJSopOB_jI0}o)t<`{Bk@ToJh&We zV*;3rSl-ayh^M%(<6)#sMm%;tn-k1!pv+c9LF+vZG|+z$gb{5-Y|M(^`TMD7$G OU7_>I*v@T(|M)*X;E`p!4pX+ zqlrwl$%|q+d(v~liC8K6N7|4;JmYQeC)DOD%f%3!ELnxEUVnSqL7My z$}R3cGsmIJZHqq!w#4UD+1i|4vM;f(oW8?(Q_1K7nLXFQ4qn%wVV we~r1|y1~$2MC%uV)(HM$f$(rpC>gLfOD(VUx}fgc5Pjn&bv_C$Ewr?ylt7UJLReJgRK%qvxmX+sYT@W4tJKJ~CD)HVJI}0xa_xyR5c}s@^w|&e{eVnTo0y!r5Lf~BOE8^l_m`uwBHKNmS zn4Phyw&m0#CW<4?9wkwd3f9{Gr{Hto1(%s;j}Fy927;B@1f_;)aA`TC=)lsterFsH zEXNr|N}9N4`U z3-{{N@2GtvaM0kYX>ZZW2F$hMWj7d zu}YNJtr5A*-=3QESfM5|+ue4_K&A%#Q3?aW#DKp_VZaA34DMjPxW!9~Ya4$V>{x?! zK8apCzrLakYaqCb&60$zn(cA-8i_4zlgi%|JO7esT_bTHyH?_Xovn`JnTk(ng9R* diff --git a/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/PointGL.class b/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/PointGL.class deleted file mode 100644 index 4f9bbd156fe00ccb9732a54f192e26b5ae9665e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 zcma)4%}x_h7(L&#WuUEsfECdyRTkA4Co#Cf=z`jACWeS1vYbwD>NUgMWI7e_p-5br zxZnYNDC4=8L7Ju|F7Ee#&i6C(`_Hcn0I#s^!xKEnOy9(2pn@x-7Y6%Ar+F{*Q5LkW z;*$j*RXR}F`$Qe9G#4zq(W%bg3QFx~hl27R`Kl;ksg4R31k0gL)rawMUuB=7exd}c zp^2m9Fv_&`i(onbqDO*eIICqb)2_fDsr*2HCri2Ab^S)pldhn~+`bvSYJuscp;$LS3dOFESy!+{xRvFd7jlX|h@ON&MeY{L%)__TONN}papE!36g zKe70OhKDMpO#|zwQPwXDsBh5|+{QAc1;6I=Y-}3XaKOf8vH)7>3hq$0u!^;U;vM0Y zSri+NV#^K9Wn6Ddv5vcx)@slyQQyM`<&E=f&Y9;vHVNf#i-!fp3+HpK+Bus{9-}#N h4Da7Dn*V`p%|t%JGj7ird&_-J!4o&))4wh`g1P_z diff --git a/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/RectangleGL.class b/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/RectangleGL.class deleted file mode 100644 index b03b095c1cef74a71cfb0b9ff54e92183a1dc8df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1497 zcma)5OK;Oa5T4DWZXVFkLJ6g`X(`2hP)n$sfeiRZX zBo6!leiY)HwbKMQQ5z}V*`1m1F>C+%`|CFmJ*GX4a)MT)up8Q;BaLCuHjOvZj;+A; zW!u!KAZTrv`@bk~Wc1RPr!t5I%{=u2FMcK{uWua*DjWc_OnE9*sYo+|=1eb;uluK6 z8NIc-z7#ZXhPLG&S&_&4^so^3yfZMGlPS-2H3ezF0`*@9}>jG&SasmBRS=}g8i!hYaDR24D1NK*w}fz0Am zVG3H%vtX>QXfq>VQP}c)Upg3%e!{7l59wZ<2&ynVMiP5rfG)`95)G#v?;GY-a3X7< zNL+tk*=d`teqcAbEa&>{C6f_UcF`V3Uf{k{SJN6ldXG&f>_@hQE-=)_E`E<0XpPW? z*M+Ex2p5T`hMj>`U@dO{q}d+`a#Y5X(?p9@!IK+Mfb|+yZoZBuHy>jyac)v`T{Z8c zeALX*9Mw|58;Dp_k>(L4bqk0zMRGGG`GmDPjburYyi#h03a?7Sb+_PAIiTAhE`zFm z?ydt;&WY?;mdBj2HXaKPX6Q`N&>6ms)ETZjb#{lAQfE)l#r`i4tSEv-+y%pq2v{Ru z*Iim3gHTmjjg2V~_h6VIR%rDyi1jHD4fQe!TBrLd#B=E6>$_lNLqRkWmt#hf3T*Uw>?n-n^T?&{ Q1npd*)0o(~tMDKF1Le!N=>Px# diff --git a/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/RenderElement.class b/代码/robocode/robocode.api/target/classes/robocode/robocodeGL/RenderElement.class deleted file mode 100644 index 793dca0d74a5cbc28799e076698d17548587664b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmah|%Wl&^6g}g-+N97Ilv3JK(=HNTmJqCp*dUUP1yYM5%5H2At}DluT&Mh0RjI2= zEcgIE3UOxQh9o3pF*Ck%?m73|JMypJKYjvug@YO_0Xs{*)K3HD+TlhFC(ohd&TC`U=eW4-By@oNKj+;*DehpjHb_mmV^cB4dn?DssC zeU@I#n>9D}W!#lnq~qeU6vp3JV^T<<`c@ZtCs1m(x^ z@gVF_sG)u3j-;0oO2>f;(i1}7v<8I2DHk%3N41V3N`!_JD0w*HXjmf#YMn`jby@;uOcH@=Q}pznxn9wpBY0Y=i-Vk~oHvn960?i7`0c5*Nn z^>3h!8e@G%V7tOm6{~1)MvF~m>#y<(x|^c;#Qt}EC(~;VVGXUh>L_Dz?svPbjNZwL Q(!8CPwz1Ag*vN#PPhbFn2mk;8 diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IAdvancedEvents.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IAdvancedEvents.class deleted file mode 100644 index 95d66c9ccd301a20f6c0adcf640dbdd1afeb2b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmZ9Hy$ZrW5QJyrPc$M}*w|Rd#(=Grh=L$kMC>n@RTAS}NG^Fe3m?FT5|b1X?3S6G z;hXp8`2w)Q$c9C5GaYEDL-y*!M9Oe>6_RuBun9|{B!|0_mC0>%36ofq!b^m@d8Z&| zX$WJj{Ckw99G;6z5$5jkSJ^U}lJ(-!1hz$P^rMjovsR#GG{26oi%jx9N|-SHBU;ul ZeFC9V4FaqRu!lZsP#c3vAq;CB&KJk(MB4xW diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IAdvancedRobot.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IAdvancedRobot.class deleted file mode 100644 index 25e6131ef1762d67e6759343da495a9ccc5ffcc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmX^0Z`VEs1_mPrZgvJHMh5kw{G|Nk{FGFE5ThhBuOzi7EipN@Sl`nzr7SToIW;8+ zB*D(W!pIUWb*CQ4i9km&GB5)%E6}Hm SK!>w4aDZ40oIsL^feQeLRZV;V diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents.class deleted file mode 100644 index ec7ee74d1efeb90f347ccf794f5c711ef39f97ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 711 zcmZva%}N6?6opT!?eyP{Keer`1wqh_18&_F6$M4GVAtt1>XadYPFnEQT=)P!l$g2G zHYvKv3Fm(2k{j;#&*v9_OY}VC7*1zutU@&rL3+`V)MEC^Ly-jc1D-_T%|b|>c-UrW zO!B zC&SSuO|C^tgpPO|Gjuk|)U==(ZWwYY#bnvn9nP)TNL5K`gfeLbRni*jq&sMk`q(Ai X!#?Q&nxuzlk+#t>oy~umGl%Xk&FjYD diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents2.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents2.class deleted file mode 100644 index c1b011943af9d8fa0fd2ec5228523e7dd67ee4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmX^0Z`VEs1_mPrZgvJHMh3N_{G|Nk{FGFE5ThhBuOzi7EipN@Sl`nru{bl?wJbHS zq}Yg^frXJlASQy3ZK zG<@JXktDztT5EOyS* diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents3.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicEvents3.class deleted file mode 100644 index 571c2dc5105870929ded177745ef4c278347b180..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmX^0Z`VEs1_mPrZgvJHMh3N_{G|Nk{FGFE5ThhBuOzi7EipN@Sl`nru{bl?wJbHS zq}Z69frXJlAS+X911FGV HV&DP*>CHj- diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicRobot.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IBasicRobot.class deleted file mode 100644 index c4085310f598072989b9d9155114b00d5f147cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmah_O=|)%6r5PQ+uAQL7JonwyO##MdMi{Y2#SLDZ2FXlO-hpW$Mw)3&>vNNiIjRN zy}b7rW*#&1_5JY)V1&C89f1e$8mHYW$#g_xBl)$`6y(d33PvvyTB0k^->SWmJ7qU= z)@(^fhBg#4VbNNvnjHz;SM~Il_=ArH2F%SLpZ8?r)PzWuyg`MG;2&k6IH#l< zRey`#nQ`hqDaQ3mpkVo|W#7Z<=+QVi_Z)c{J*l_M=`CIBHBC$k(?99pF{LU51kSiV cpv#qFq(E{F>k5E7Pp4L} zR4$(N?#yVs{#ty_0rapNpu%vHsgaUuOxzYaPBmrELQ>8L16vEJoS?Kt9HbFxBirq1E)_>rOM*msnWaP-jKA7*b> z+fwOJO>;U=V)<$t2PQ#ny)L=Iqc--)~iO}`y Z9vdE;9$OyU9y=bp*fP!x+vcob=NsZwhsgi{ diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IInteractiveRobot.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IInteractiveRobot.class deleted file mode 100644 index 837601262870db6bf176e66205ed2abd0798b5a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmZ{fy$ZrW5QJy_i^j&v#@0eDJg~JB6aoQ3pWt$?;X=4T?##nk_y9hXcxNR_id}|X z=40mhx<3GHFpkh6tm-PORCQqygww`xeU*x>NRptXa=PJD_(kXuCWUOID5c58F)LX4 z>wqwCr|hKF>f1&?OV5e}UH_t4~Mh S`sw@Di1yd*h diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IJuniorRobot.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IJuniorRobot.class deleted file mode 100644 index f3e4d181285c495de0a4e748c3a0adfad6f50e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmX^0Z`VEs1_mPrPId++Mh4ZQ{G|Nk{FGFE5ThhBuOzi7EipN@Sl`pDG%qv1C0N!WKh9vfKy^|W-?emBLi1(erZv1s#|7GDkFm+ cve|kdV}S-SGB5)%E6{BWK$;y$GBI!f0QoI3ng9R* diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IPaintEvents.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IPaintEvents.class deleted file mode 100644 index 5b949df4420257ec47374442639dc59f37294fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmYjLI|{-;6r2||t5({10UfASej-oAs#)VOKV5yqkpw@KE9=mCZ1Z`Mmjj zUvB^@1_BXb>TG7UJ+o|x&y8nyQJO2cJ*aT4YBs(S=n_VSs+BC2xypT3u=WIDP3s~| zl3gpSr2fhU5r#+maGKY7$%OHL?YxP^1VSfF0w{dxA#NB%zzF>xhR`lh diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IPaintRobot.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/IPaintRobot.class deleted file mode 100644 index 1942dc44ec778d9df508166b2ca35e70b4131c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmX^0Z`VEs1_mPrZgvJHMh2Cl{G|Nk{FGFE5ThhBuOzi7EipN@Sl=@s5y%SyiLx`W zFfs^aC6*=X=OpH(>-#5Vr6vPK+3@OjN-WMy2J2^J5KT`l0h{MqmYP@MlUZDnnwMI{ z$e^jA=|jK;U>(KQj0{}C`K3k4scxA$sX*5tIZqGdGN4-+8JK~X73e!gpnKUFI6y20 KP9Vv|zy$zTmPrTz diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/ITeamEvents.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/ITeamEvents.class deleted file mode 100644 index 17ba440b43f8533e4cf8319eaf709549f1c1bab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmYk0u?oU47=-Vy+NhJR&JJ}k;OeX(D1wT6n*NrSnm`l#a1K6z4<)7|;&Oa&@ZCLM z_XmIl1_BXbTHDlWo3U)c7shjaQJS6HoLF5~4IA$Sx`a`w8YL@ba=A}S)}Ao7X2;H{ zoDZzIXgDKGlI>6VEkBaw>`WLQ?XA|lE-DVfzlC`#j|qfMI0sM|>>+LmB4mXA8!WXl AumAu6 diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/ITeamRobot.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/ITeamRobot.class deleted file mode 100644 index d244175154a0fb0cc7ee212e772d9df6fb8fca77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmX^0Z`VEs1_mPrZgvJHMh4}g{G|Nk{FGFE5ThhBuOzi7EipN@Sl=@wH8D2`B*@Od z!pI;W#*(ZGVmjurw4Kw&@GG%%s|Wv^c*A5 Rz3dDeAQl5BkYr-u0s!c5NM`^5 diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/package-info.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/package-info.class deleted file mode 100644 index cb041d781e029c5d7a97bcb216dbe21fa6409a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmX^0Z`VEs1_mPrc6J6PMh4ZQ{G|Nk{FGFE5ThhBuOzi7EipN@Sic}KIXf{uRW~y) zEuWo%g^@uZE3qt5KPNFSUEe<`D>b=hTSm^wd_!{vr%5n3m?FT zvh3;1CJUhwFH)Vq=kITNXLtI~-(SB0U=22NaLIvHB@d-91MZnWT11+wZ_MYhcfz^y zDy5*oBA*9Uv$}_=9P~MmKVl8$g)FLjpAL_>uXAv;*u6fo6hIWQ&SQgD>S`dt$3 zNVO${(=UmN9JuTj4jhct9`*E_tE z7kCR5Y>x%OHXg7%Cb$EmiXY>npUDmTA!n)-hUAIyp>czZ9CHiJP7*CbZ&$>+h{swJ z^@!<2Ve|7HhK=^46STOAB_oK%uRtepy3sCWvlrN?GbbX`2a= zZz8_3_E)jkgV6F4U>pI&EOVy6r(LXcW1O=S#=P{J&!Wfax18Qp1|Vjpmv)MTQ3 z-sDYpj?@)%$#H(-bi&^ioX)d2V{>o~%&hIValpnw7^3`j7^XM^d5WVpj@dYFgVu+`hN+pD87aw_Uga}b^PWZ1)}KF diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/IBasicRobotPeer.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/IBasicRobotPeer.class deleted file mode 100644 index 25be59d69b328b718ca540c0d5a90d1f2a6c34d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1167 zcmZXT+foxj5Qcj(5+EFcfOy6uBr2@p>4LiuIam}>359w&*=;sMZFZ>1EE*rp3m?FT zvh1F1qTVUYE8#PCdQB#PG=77iHfivo*~+Bx1stv zYVp<~*<~mNP(4-WDojgN6JV`Djv`n7G zWOA~8O1F(iQO>te!;h)2J#$V*sn%p`%u#IaDE%2;Qe4_Q(U!9!m%ZUs zH1ae>$A7SoZp%AN(u&V+n$%dTw^sac^~Hr=+Ta^1a43H>iOcuobk06@_LgJtx~8acJk!VnlrRKKP!@=pIMp7 z|EHAG9<|t~Gy<4to7_e;FDbX=(lc1&2_FrBnoCa!V3}UURTu?+9c38v9ESx^)+ldgnZ4&!iMBwm zR&Po!m3@)ZMNK-EC6HX_2Km{E$=jLY*;z5l zseYh%Yw8r@U9w~6ht9k|uu9-;!!#AlvEr9H-=hA?x^tJjrg638vHfkYSJ@^T<3I7) i<+T-TzQi8#5<2KMxQ~Md57+slH6CZ=x*p#xocsW!0c0Tn diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/ITeamRobotPeer.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/ITeamRobotPeer.class deleted file mode 100644 index 4dfc1b65f019ee942f7ad6c3d96c5d2f528306ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmah`+fD*85S=Qxa#0b)%O9}8xW-qEi4T~NU@)%nL7%$aaZ|E%Nn42V(|qs){3zoT zaJ@j{Lo?HvGiNU6{p0lw0M6jhgEa=nI*T%q#TYopN@Y<$ae*cnBkG`chkSJFGB@<~ zpunIuyKs+8TLY=P{y X(-wCBMC#C>$R1(Vph@2T%sco5Q=g%u diff --git a/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/package-info.class b/代码/robocode/robocode.api/target/classes/robocode/robotinterfaces/peer/package-info.class deleted file mode 100644 index a0bd3ec9665aaf4e527d7087d5374d96d7603ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmX^0Z`VEs1_mPrc6J6PMh2~-{G|Nk{FGFE5ThhBuOzi7EipN@Sic}OwMf4pF*!Ri zJyka|FD;*)frXJlAS>KK4FAq*@f0%qVPyb?Pi>Ua2@0tBcY1qdNOsUnaq^& zI1&;PNC+q(@sN-J!9JTxEek}%0(IRbJ9bF$53mCvA_p3?YUij@`92dtEONT*EBCOpksH5r*mOe4Cd|ZuQD5-RrvMGDz)LR#snn zfq|(EsU_R$yWDa++#Kjq^_cQkTRl6=kZC{Ps@G}V>Pn~HTBRJRdiduz-+EH{i6If3 zzVPQLM{d?@tyQ(&XxF60-~RaS=C2#Slizv6GTcRmaIw^3h%8Z=GQyZi;s~+~hZ=^Z zHwRl?-D&f#sWTjI*cvxG+%ZJ#Pe$Agqt9@(F#&afcEGZoEpFDjecK$kdd=zyrASdN z5oMJ4MVPwca&7Z6zu{{hpOB>LJxAC3Qg!=n+F)QT-O^3&8rwr@sTvxZtJ1b;zi{#f6^3|EcU#U%iz6;%meTJD3u&cALJ0v8Q$>pq9gF@(>PW zjnK3jCgF!C3M>B-Rt^Zy|DW(9W8qD|;!2?685-xm{Kl*Nq?qsRAWQGUf6`nGm{tNb zaYSd;a46vs6(<^xh=g$|V66DYj|Pkn(l#H&`0UvDo=?0+W+UTKj}+~aC}9`pzCw%! zxBY@n6w=;YG%aQ--dLf5h~`GC=R~B8*X?zCo(>?eh8()oQVn^m<1y%%!!^vKhblIp zViQf6XkiOiVc|8r9>7`)?5B(vosM)Sl}gYNnV-mY@aze${HW5rs8n=#Ki80vxID_l zXmvuYp1LpBJH+)aalJ=e?-SQe;`)H<`jEIjBCd~#>l5Pol(;@4uFoHci+*7KooZ6Q zBD8;*Lb11tr?SXU;nB#g@GY7QUZ)*TIOko!49KjY8hV3WFV@J)<9subua9 aGW|q$QN2TQp}_6D?H+6Z diff --git a/代码/robocode/robocode.content/target/classes/ReadMe.html b/代码/robocode/robocode.content/target/classes/ReadMe.html deleted file mode 100644 index 347ead6..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/ReadMe.txt b/代码/robocode/robocode.content/target/classes/ReadMe.txt deleted file mode 100644 index 1fe94cc..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/battles/intro.battle b/代码/robocode/robocode.content/target/classes/battles/intro.battle deleted file mode 100644 index 8bcded0..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/battles/sample.battle b/代码/robocode/robocode.content/target/classes/battles/sample.battle deleted file mode 100644 index 2be49ab..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/desktop/robocode.png b/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/desktop/robocodeMeleeRumble.desktop b/代码/robocode/robocode.content/target/classes/desktop/robocodeMeleeRumble.desktop deleted file mode 100644 index 2b6a8cf..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/desktop/robocodeRoboRumble.desktop b/代码/robocode/robocode.content/target/classes/desktop/robocodeRoboRumble.desktop deleted file mode 100644 index f366fdf..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/desktop/robocodeRobocode.desktop b/代码/robocode/robocode.content/target/classes/desktop/robocodeRobocode.desktop deleted file mode 100644 index 89c34f6..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/desktop/robocodeTeamRumble.desktop b/代码/robocode/robocode.content/target/classes/desktop/robocodeTeamRumble.desktop deleted file mode 100644 index d0f1e25..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/desktop/robocodeTwinDuel.desktop b/代码/robocode/robocode.content/target/classes/desktop/robocodeTwinDuel.desktop deleted file mode 100644 index 564090b..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/desktop/roborumble.png b/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/meleerumble.bat b/代码/robocode/robocode.content/target/classes/meleerumble.bat deleted file mode 100644 index 49fef2c..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/meleerumble.command b/代码/robocode/robocode.content/target/classes/meleerumble.command deleted file mode 100644 index f5ac342..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/meleerumble.sh b/代码/robocode/robocode.content/target/classes/meleerumble.sh deleted file mode 100644 index e6714a1..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/robocode.bat b/代码/robocode/robocode.content/target/classes/robocode.bat deleted file mode 100644 index cdb3c2a..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/robocode.command b/代码/robocode/robocode.content/target/classes/robocode.command deleted file mode 100644 index 3065355..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/robocode.ico b/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/robocode.sh b/代码/robocode/robocode.content/target/classes/robocode.sh deleted file mode 100644 index 81ca7de..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble.bat b/代码/robocode/robocode.content/target/classes/roborumble.bat deleted file mode 100644 index e056ed9..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble.command b/代码/robocode/robocode.content/target/classes/roborumble.command deleted file mode 100644 index 27f9f4b..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble.ico b/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble.sh b/代码/robocode/robocode.content/target/classes/roborumble.sh deleted file mode 100644 index b0a4050..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble/meleerumble.txt b/代码/robocode/robocode.content/target/classes/roborumble/meleerumble.txt deleted file mode 100644 index 969673d..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble/roborumble.properties b/代码/robocode/robocode.content/target/classes/roborumble/roborumble.properties deleted file mode 100644 index 1df0dea..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble/roborumble.txt b/代码/robocode/robocode.content/target/classes/roborumble/roborumble.txt deleted file mode 100644 index ae45516..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble/teamrumble.txt b/代码/robocode/robocode.content/target/classes/roborumble/teamrumble.txt deleted file mode 100644 index cf6262f..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/roborumble/twinduel.txt b/代码/robocode/robocode.content/target/classes/roborumble/twinduel.txt deleted file mode 100644 index 8fc223b..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/teamrumble.bat b/代码/robocode/robocode.content/target/classes/teamrumble.bat deleted file mode 100644 index 3d97f1f..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/teamrumble.command b/代码/robocode/robocode.content/target/classes/teamrumble.command deleted file mode 100644 index c103230..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/teamrumble.sh b/代码/robocode/robocode.content/target/classes/teamrumble.sh deleted file mode 100644 index 96b6e82..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/templates/newjavafile.tpt b/代码/robocode/robocode.content/target/classes/templates/newjavafile.tpt deleted file mode 100644 index b5bbc36..0000000 --- a/代码/robocode/robocode.content/target/classes/templates/newjavafile.tpt +++ /dev/null @@ -1,8 +0,0 @@ -package $PACKAGE; - -/** - * $CLASSNAME - a class by (your name here) - */ -public class $CLASSNAME -{ -} diff --git a/代码/robocode/robocode.content/target/classes/templates/newjuniorrobot.tpt b/代码/robocode/robocode.content/target/classes/templates/newjuniorrobot.tpt deleted file mode 100644 index c7f0ec8..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/templates/newrobot.tpt b/代码/robocode/robocode.content/target/classes/templates/newrobot.tpt deleted file mode 100644 index 070e471..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/theme/editor/Robocode Black Theme.properties b/代码/robocode/robocode.content/target/classes/theme/editor/Robocode Black Theme.properties deleted file mode 100644 index bd627b6..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/theme/editor/Robocode White Theme.properties b/代码/robocode/robocode.content/target/classes/theme/editor/Robocode White Theme.properties deleted file mode 100644 index 0eecd3e..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/twinduel.bat b/代码/robocode/robocode.content/target/classes/twinduel.bat deleted file mode 100644 index c5573f2..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/twinduel.command b/代码/robocode/robocode.content/target/classes/twinduel.command deleted file mode 100644 index a61c9e8..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.content/target/classes/twinduel.sh b/代码/robocode/robocode.content/target/classes/twinduel.sh deleted file mode 100644 index 1669b1b..0000000 --- a/代码/robocode/robocode.content/target/classes/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/代码/robocode/robocode.installer/target/classes/net/sf/robocode/installer/AutoExtract$1.class b/代码/robocode/robocode.installer/target/classes/net/sf/robocode/installer/AutoExtract$1.class deleted file mode 100644 index 2e47a107adc0a14c1e01368f1b23079fc2363766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 877 zcma)4O>fgc5Pcgvbx7T>&=yMgZcCHU)B=t{NT@0jlG`3q6^Yx%UK)q3UD=z$Z{dK1 zxc0)ONF4Y9{3e8Wc7kZ&(!=iT?CiXG^Jahi`t}{bV|Wfq0voY1UiQXIlU@=eq4J_Q zGg51nde4U@*?DhL8JM+44s3z>fjpI-mhq9d-y5jFIG7SxE^ed5dl6|B%VR}rR4Op_ zG>RkhOu%Y14+ZRP;#Xl|+J%FPz?>h&YHxVlQ|W>1X(dqelR)Z2nMS!kzO+q0$^@GJ zC8>5;Sq6bRF#@X%|0282$SXSNnly@!I?dNrT*Z=u#fkn#Q5Va&CNOOhKY6FpZJCke zVx###Oa&|KaBCpb9Io!-CT{! zU-8G(88a$lmor@>gSWf#WUN@Vn+($+p92%;FU*nrP9=rki36QvY=2joeiAxp39MgA zUKg8avtp>UGHPFke$?Y|7XHyWpSSxmj;WcJS*9}F1v}&_^YfLs_yg!&;pqvjpe?t) zqWYx>yWFe!Gw~5NgEREq(Id=ajvo8M0{0wX$d@*4ee)c(y>{*TIc|KwY`b>5IFzk3 z`;1|W5Px7lp)5WZu&q(*7?vPpdao!|$9=34y39|o#*>A0=9BeLtT-I9g$MLY*g%8U OMiURQRa6-D!{cvbc*hz5 diff --git a/代码/robocode/robocode.installer/target/classes/net/sf/robocode/installer/AutoExtract.class b/代码/robocode/robocode.installer/target/classes/net/sf/robocode/installer/AutoExtract.class deleted file mode 100644 index b25dbc80c06fd32f7a7c692ef0856cbb90d0f725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21469 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 JGdA<*zX4s@r-uLl diff --git a/代码/robocode/robocode.samples/target/classes/sample/Corners.class b/代码/robocode/robocode.samples/target/classes/sample/Corners.class deleted file mode 100644 index 5b8935854a8ac104a1b9a3b12db728de5d34b697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2603 zcmaJ?YjYG;5IvJDvzyIL2oOL?3@fN4izI^b&;$t(9;*>B!SEFe}I1RXZQpBNQtLsmQBFYRPEe*yZd&ZKHazT+uuL`3SbSU z#Ct~&_JRu>)5UxJZYf5vungaY%5(gfPNL?Fb&Kdv|YWcJT|KRz1FCs4a^_(vX(Pq z`L>*^LbES)lSDlhD9l5n_*kfrKm(ly1)G3c2Jgh*%b&Gwe#Os zXnPq~;`oxyA0~BYx(ZhXSiC3Ko4YQlD$REclKNtH|b zc8)@1t@&ng&xbhdmHn*VZp*|~)q&qFC^+$01r|nroC^FVWK@Tx;<)7+rzD9++9{qM zaU~e8aH*A%dZ)VJJ1qJz!Rr-^-3RYzb3gtCsQb!*v(m$Z}B9;(`m0npvt^%8Thd*x`jkiS- zI-)NMy`S_QWL}4`fG!tvM7AM^4vxo%kPkyIiriO23*kOW3@!x4P}dRXp7XE@=PYGX z^0g~k5uCq-X2u_H#pH!Ah+%F8uS}zzsuSlgqlu)P3?)hKPH{H_u7j`ukD!X|r@JR(1E4ajrYPzrP(#>R) z=A)FxiQ@!oehN$RI;(t|9r^~VJcZpjgCV>{D&Luvom0!sAp_scWS3agb`MYA(q|pM F`v+en99IAU diff --git a/代码/robocode/robocode.samples/target/classes/sample/Corners.properties b/代码/robocode/robocode.samples/target/classes/sample/Corners.properties deleted file mode 100644 index 86a295d..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/Crazy.class b/代码/robocode/robocode.samples/target/classes/sample/Crazy.class deleted file mode 100644 index fda7610db2e0c1e7cbfda176c0017df3033b5c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 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 YL3|#-H&n$pge&+ZaT)j(@6_SyS2+oTRsaA1 diff --git a/代码/robocode/robocode.samples/target/classes/sample/Interactive.properties b/代码/robocode/robocode.samples/target/classes/sample/Interactive.properties deleted file mode 100644 index 66603d1..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/Interactive_v2$Direction.class b/代码/robocode/robocode.samples/target/classes/sample/Interactive_v2$Direction.class deleted file mode 100644 index 6f5b802a50faf5488aed715b765cb48c601f0bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 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 NULM(TwqGv5|V? zZ8#&LAaURUcn}_gGV5ANCBTQ>nVp^A%zxHDe}Df0U<*$(NH8o-#L1~ETL)+Rjz0(85j(UKAE;Rl&wns4%3&Sc)MvR*wTq9LqYugV0y6LUrhj#(~bb$#F{ujDfH}Fywmy?FZsC z?$Gp9&lXC_VKkF0WmGxVuuiDSMPOHrv_RI;xJ{0`8kddh9C`Y*&e4EHMUEYxt{U~1 zdTM!3y>^23Svz!H8EEtaj;2PJ$Mf^Hq?xIa#ysSBge^+c@LjF2D~|(GO9RlrT+a)A zTkbo$pUU4a+I%lQ3RH zgE>o95e%qVSv|Qrw%w6; z>U110g@nMO%VpQ;$!f4CV7#`K?Hvfji>0g*Qm^NDsK~0K$i2!VJjk&4`uELHH7odSukz( zfS4EqMwx2cH{GU#-7?{o0JS#F3Q_trJ9tQjz#}{kSx3y)tPI@21 diff --git a/代码/robocode/robocode.samples/target/classes/sample/MyFirstRobot.properties b/代码/robocode/robocode.samples/target/classes/sample/MyFirstRobot.properties deleted file mode 100644 index 1d298da..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/PaintingRobot.class b/代码/robocode/robocode.samples/target/classes/sample/PaintingRobot.class deleted file mode 100644 index cd1ef4da5918d83d11e25fec4757d844e7927078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2379 zcmaJ@Yjaao6kVrjlMpTtO3Sm-fIQL^h&)va7~4WAq-kwSq==83- zupw=jGE-g1Nqbh$m8C#;+RE$YtZo}>-Pr7OO2(qV=Jb<14-wt2n!(f@Ir0+$Q8a8q zk3g4Rl6rxT%>+K+tdlosoLgP)tokpB}ZM|p`lM1I&*sdy1=>_hvS4^ zX;4{jnKOCaG-aU?Vt+i{in`r$wkAzyXdoNLE`exSUv%27Av`Ov<(gj8lV#m3CTAR* zN)A_zazWY=?8W{N_6cl%I<$s31_VMy>16Z;D%TSqNUsDOieL~2LpVSRD{UGMAxVIm zUarc?d4YZLw)>O0Ycfy%ZCf5kLhi<4mA@kbz3o>Tb`|n5>KD_Um^ynx!}EB7wV+oj z(qu9YKIzgbKMgJDZZA%17{V!m2!kD#tPQj1mei=iKcnzp66j-&pNbO3%K{r?1zEJE zTvXH?V?mOiz=(!Xob{BP<)({#K_QPRT1PtfJ1^Q82G)n0D)N-mu9{@VD>(Dvl*_||Z>T$YZ& z&bA6|Gx!C1SzwJSP}dm26;*t%32bW>-^yEIyw2AcTQZzdtYR%mJ7&$ta;`f{dIfK4 zcuVCg%zRBLdl)(Tcue+!1_@T(TAmrR^-9Ue^NDY17O}qMB%9kuMu*m*gli!f>@jW~ zEAxm|wrma8QD$*jHlGo-iF!J=?5rOXl@Kg}O|6?gu!bA3Nt8Kq;drW%8y~^TgQKCU zV(KK{%fZw|zm?q5@OINOr`+Av@GkBUwP5Q@lYCz+uJ|}Vst2Xr7KC7G!b1qAGR>WA z6Y~mAs?>j?;Zv3RutQkY&0JTVQKjgl$I#vP$Hy zG<>ZD4cM{}OpSZgA~bxbp8OpZ-VYjnbie$Gk zw~j5|YI|e#>!W{oB;dksrf0C9u(uLsKYH0i`>?0YO@G79GwvON^ZB5k--_%FUhm*| zJkcF{h~0C8b?o^AWd2KLx$TpijibWmyi31N% ztYhH-7mGcp74LC!)15@ks9DE54a?o8g_CF{TJbIKH!Yk*Ytfo-`JidxBziM?lNRRS zL(1|IeSYiFazV*+p nj^ulvy;nrj^fJS;o@Ej*VS-8W)0k;7&A9wj8h;|A4*dKd`iLhH diff --git a/代码/robocode/robocode.samples/target/classes/sample/PaintingRobot.properties b/代码/robocode/robocode.samples/target/classes/sample/PaintingRobot.properties deleted file mode 100644 index df0c29e..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/RamFire.class b/代码/robocode/robocode.samples/target/classes/sample/RamFire.class deleted file mode 100644 index 5af3693995fad46013a4b707fa813d195669dbcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1544 zcmaJ>+in|G6kW%e`Z7LtlGZVWgx-=;dkS@E3#BAY+{AVo>a@iPR)r8^GM+d?otbJp zE{b^L1(6@90EyQ;gTM$L_yGQZH-3UwV4a!C4FMzhT-M(E?6vmU$G`sh^Dh9d!%86` zknfv2PkVNyW$rW_-%ddz=6jo-<#mX15eVdhf$!F6wgSg<1;naAa^7*BU_oG{RBj7s z%k7#eg$c6z*nDPI%uj;Kve)x`i5GBIAk%ZY+rf%&?y4hBy3FZh^OD3QrUYc) z4wk&mZWt_Zru0wea$Ds(Cvje#t95y#ioYmvNyTRwzcO&caOF57aalR0JEs3clFLneiAqFhJfB>8EoEw+YPUkqn(gei(7#Sjvj;r=ov*uxiaP{oW>oW=1>ClVm@|f0P!gm3mq;J% z!VLeM^0+}!H&MhboMTfOxXn~=hg^zLnwSd{;x3j*Lb1}27*|DIMlGTxatfnmk9q6= zPODB@wB9S={_}5;GYVK6;^9785!i~sjS##Ofo+0WV>E=6BnEH9evdr}joGW&WK_pyK`ku|L20UqNaw(tl$?B!3mA%8N?D5Qx;;Lkj8rP-@rwii*Oco=7&A$PFi!Ipz diff --git a/代码/robocode/robocode.samples/target/classes/sample/RamFire.properties b/代码/robocode/robocode.samples/target/classes/sample/RamFire.properties deleted file mode 100644 index e48d0d4..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/SittingDuck.class b/代码/robocode/robocode.samples/target/classes/sample/SittingDuck.class deleted file mode 100644 index 6705c168f6fb3c7c2a71a7ef9e547ef27397491e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2440 zcmaJ@-B%Q482`QO!oV^LZhk<14Vne$vT9idxG9LV$%hD{V2Z=;3ycgi+w3ezpH|#- zPRF}0>Y`JpbMmGeEtkr3%F~4xp3_Aa{S*BOW!dkYSzt9zaF}`C=kxb`ywC99pC5k$ za2QJ(Dg@$rb1rAg(Qca8K%iDfC8`AK`YcBd6y_$SH)2lOlFs_v zjA@UWo~6zuW>sh4CWZ*=b!!))&RFWL@<^9oK4wqTovtpXdbn)7DTT=0|K zuI+j{8qg?EwJ2@dT@a}6dtBZTBf{-Ec3`J~o|k@?n_Ubn1)getQn_VRsqfZdDD_&Z z_ZFN$Tf-h!E%0r*$*#iGl=N6MX=bIT;Th(-B0FW-GUQj|S%I32TX6igtm!M)%{p4p zO4rlUKWX}=QWn@#0%DuabaL4D*r|?|5F3Lj9j37t2UNKd0-H+eD>8+;2}vbAxRw>A zA&ibteptuzc!7=d2wJs@1#d1zDGwaOi#V#`CB_L-3S?={!?a|zUq(A!}ac7^=BcNe>qMT%n{E!*Lvl zA%&AF%^rcqwIY=31<9t+tK(Iq1+<)sWILR(=CrCq3a54Spnd0_=eQaf4u9I1G3TW*DWzkWMm}5|MwXkym~uVBx&oLN~||Z|Klsi z%VkW4JE~2A;dthQ3HRMFFAW7Iw3cnSoKCskoawJto|6y&>Q=4euH)3yhF(jYDs^Eb zhooV393H>_+);v+Uz?V)K2g?GmczOTls#A1hMWy()-v=)VD_y_o0!|(HQ-iD z*k_0>Rfs4PQ|?oAe|*(_*D|^X65ES7mDr&kMZESYI$FQOK>TbGBR7$3j|QjnJT(Sn z5o3(Eo2nBx(a>I5!ZFcUscD`T^k53Tu(*}xaGKHjv4lZbg9zE)QtK0_#XJ@`0zIqL zF!K+27x6`jI>Jn^QLiG<3#oIfyh}tA^6HtvBHpBA2vNL+w@Hl!)H|eHe2jM~i4b`_ zkVf$y(G*bkh^2^XYAiK%Cp27th#Ed0F{I)PvYNmwG{xb8Gp=F0SA+jI|3?ya4{=aK fs*Akse9*22RVBL=eO?F3U8PhUfe#qG0w4YhzU)2^ diff --git a/代码/robocode/robocode.samples/target/classes/sample/SittingDuck.html b/代码/robocode/robocode.samples/target/classes/sample/SittingDuck.html deleted file mode 100644 index 9f4d522..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/SittingDuck.properties b/代码/robocode/robocode.samples/target/classes/sample/SittingDuck.properties deleted file mode 100644 index c3aab1e..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/SpinBot.class b/代码/robocode/robocode.samples/target/classes/sample/SpinBot.class deleted file mode 100644 index 7602f847b3c0126b0ee6b8dc39b1197a7ed1f12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1264 zcmaJ=$x;(h6g>?gf$$h)h{zx^s3Almih>1dm?Bs`j{ggu$SHWgz<`3c624xxJhYM@ z61b?On)0SBJXgp|0wW69M&ynxN~ek)6Bt+6@QH4k_OSwA5x9DqMYbS)-f;TIYxW&b zh)IDYuK9WHmK|%y*xP4+L-Cb~TsYn1;XL59;G_s_r|y<~k<(4PV7MoWV@BYXdTNsU zx-2ratjlD#RcUb&)c|_@b_^)!Eico6xEi% zHXdkbF-lt}YqD&zk=)NGsz;9mc2pHDZmr3EwKC4Aa{Z!NyX+M7HAAhg2>udNYR@=* zvU=(vdfaw?BRr>QHQJ`c7c_sO)4;jGdj|T^N?-T@+BTjz%WCi|QmWvY#AkF=(CeEE zG=mik(~MSdInjf71qqs|3a${t8-y<4m@Fw%lJ8f3*P$~Ll#n@$#Ge*WCEU~C%Ok%Z8Jy}&x TQawvmRTMRc+UW1nZ@}ZfK4kOt diff --git a/代码/robocode/robocode.samples/target/classes/sample/SpinBot.properties b/代码/robocode/robocode.samples/target/classes/sample/SpinBot.properties deleted file mode 100644 index c80fa0b..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/Target$1.class b/代码/robocode/robocode.samples/target/classes/sample/Target$1.class deleted file mode 100644 index b6846749e64718b8411f6b24b823f9a374dea924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmZuu%Wl&^6g?BWF|l2e2Fm+UsDUH}LfICv2}LSO*`(@%-NYHWF3wD4PmuZr`~n;P zpc|wD5(_?nk3t+f*#xjOo_pt>bLZSMzkdJt3E(-p9%=&3LQYRI)jyDVqHMJ7!4+ud zW^7_JQT>6@lhme03)JmVT13xC87^^lSbCA_)V>smI)BxM$MS>hXHqBqk~s$W z+yQ$xAP|IDLEVRg)es&o3aoejPiYQQt=`V2W0fDsai%D8XkwWi$~-Oe#i3h@6j)o9 z5p7ds5J_$H>D0^$4$=Pi8tSsDumVn}`_9KT-0*N+V0CHQ5I1p4ph2^CwaSyz3jV4= z_?-}Uu_54b&?Hg0fY>8_WM%w*U!E)!`Xe*TWA!>MX9(uDKP_FNvAa6XOhK3Sl|3?( z5D)Q){qq^^rzkoX?rGjS$YfEd0voi@;bV$ctMrjkjmyIYo;Mf`n3wgSxAhf%@9}qp zUn)?Of4>3?61UJ|ex=F-tf9?}BwWH}p7Bjsn>Ty|ml1HacMkvCd^^YOkDoqc#XWP* qSaMJ{uUD`qRpW3@Sv0;^VZ=It_Zil(iHN&P10SHn$S1tKgWn(dLx`LJ diff --git a/代码/robocode/robocode.samples/target/classes/sample/Target.class b/代码/robocode/robocode.samples/target/classes/sample/Target.class deleted file mode 100644 index f559d6c55403416800b013b49dfb329419cc650b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1626 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 diff --git a/代码/robocode/robocode.samples/target/classes/sample/VelociRobot.properties b/代码/robocode/robocode.samples/target/classes/sample/VelociRobot.properties deleted file mode 100644 index a48dbb8..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/Walls.class b/代码/robocode/robocode.samples/target/classes/sample/Walls.class deleted file mode 100644 index bb6f236596a89cbeb437a91943a87a72b89a3b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 zcmZ`&U3U{z6y3K;6B=#{HYHXlQskp)5TZp;Y$+`Z4a=luHTPd@{gLo10P1>H8y zmSg3&jN`PEh%1cwUd5|=H7mctO`s5OS=Nq%+Ez$4y2+M%RZ$_aV7qp(s1VD} zmI*B|E`=CIHAaw9I8d@(>t?4}vHUxx;#dmfC9i6nvhi&>_l)tNVYf+L8dNjSTm6nZ zf(c}jI7IhDvupC^QIIcqj^}H&YY8(q5bPtygy~H<%ah zGCoXVOCj^$7>&FAoK`G0B6Iqsms4WtZkSt`+$S2JimG@eY%s;{o%}yq7TI&<1zoGw z(|Bw^hxa<+&=sQK@k+EDwRy)LEm&uaIO}A3moWXCOEmNo=z+AMyP@9-vC^ TQKd=M>`}#_#<_JFI0Wx+JcK)s diff --git a/代码/robocode/robocode.samples/target/classes/sample/Walls.properties b/代码/robocode/robocode.samples/target/classes/sample/Walls.properties deleted file mode 100644 index 7549037..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sample/pandafighter.class b/代码/robocode/robocode.samples/target/classes/sample/pandafighter.class deleted file mode 100644 index 1dc44306ec52ec32a8ac498a093659852979822d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4510 zcmaJ_33OY<6}?}UB}*E~OB5r(2_(?i7K@7si*QIC+evKW08N|(vzc${TUIRpALMUi zrvy@(!l5mNuF#fJpi5f1uoQ#~ZJ`HB3td>c@B4NNEj@)&%97qUU$T_sv^wYinR)Z( z&71q~dw=XFUVq@L08Ta{LHGljC}&$|&rFS3g<*3nZ*gYGNt^j? zW+5lzlF;u?*Sq+LJOAhq+@wA zJ!zm}=)mc&FdaKe;b^Qdpr$Ri$H~m=g$9@4yiEf9&8_P~?Nt>P#QSDSXSyTff z>xYKU*)F=LD4Z&~F>!b%pSRq_El*cS;S2)_POZ!An3)!bHaG>%g5jA0BkylJzkQpS zS)*{~fx6mBYIBX~2D%Sl@yc-D2?^0&r_h65&$3Kv-Oa*7_Hw4pSoz!fJj?49HXux& zGtLH5PL}s842UR}apZV*iI_5Vmco!sg)`13l61vj2@6wG{`)n zUo91dLwA*JE;JC&T5ex%+LgrIY)zTWD?6+6sxOR-aY+!PWd`R>JKM3zbSD%{ zj8VrNDQ=E<{J37>2AQvuq?w?b zgnMfKJpCSF@vyBqmm}SB9CAtj(qWZXR=to4>^CWV2p^`h$tZWSB^vFlwZ6HN_?nm3 z9L2u*PTBcZh1+mDF(W?1xhbN@8ao&wO+TUVNdy>Rm*PP8%AZ_*<;g3ak(tjZ+#xd! z1uJj5xmjy;tc;q0&nbLf0B@#2ouP-Key74+a@xbnXh>xmvc@ZU+(fQ9V%xFHw&lxG z-mV}EDiekoc({bR99u{rZZ0T%N!$!u_NZXWu!{IWg)fUZva?{7<$<+#J@(SA_dR!= zC_F5|4FtMZdGQm`qY7V_HFdLA-bv@&c@cg?;hWmfT(9F4Xr9R|0eC{;TRLIV&a~)# zN8!6#k9ECT?MxF6-3i%lv)0KO)d?uEX0vD9jILh%EAW&nYZo#D1s7pyBVaw#wZW+2! zt_hW8b5(ujWYn?yb8gSP_lYpDysF4mO_YmcpnL3LeF8!4S%v2`w*_25x6;?1Ic zo_32fQ%JLrO6hB?zM7mUr3))~yc%NU<5P=(MvK=VwsLUZpZJb&)I%+UZA0>YsN{o) zjogoh`_OndWj-w7JErZ_!q3(9v=ygJd26r~%^WeO7wz3qvbQmL4-!QzXS1@1H+W4O zo8yW&kxv#C%r5u*C8Y!SOtp|X5WDpH?{CPK6x$J=kb z1&2{Bj%(6dD-n(3+R0RuvLfD@Ohglr$s*n@r}6+@OYlIRC_>oCt7S7*5y)1Y!S{N! z6PY9~!g06+$0Lsu`MvGH9-M@$(TVGMHxytuYewBrLZT5@;63CTlLGU2FMBn#mBstm ztEJtoct3kVS|7v**bC8qCqBqtgu8TTo<E$lxAyp_je&RX+EW06u}TyR~<#nF05(S3~UpzR0Im z1LudYsi~ zI(qO(tCI@GQlXktBl~a#$?v38X=!UhO{P;ZZ}eCqn20Ul@yTo=SelnnI@REfzU|FF zIhn4Se{wRLYDzRPD(P&ZiOskWg_%Wxj1morrUmRt#rH;xrIFxm`>*nH?irnPkz^uL z#19zm9~be{N*FgVb3owZtRyYWh85VtY#An(x8f95g)Y{G0gNDr^KmWj;y2?$-jlWx zwu|uyM)5d#{}fCO?k>`hV3oinNce>Yw*~jf&4l4u!3)$cb*PW$CGA)21-aAh_%(YW zX3}2#2ES!4b)kUYQ6_)-Wbk|TV)UR7e_*eHejJNGve!fpVwyS;O`WBZbEhC!&N(K| zE7-+Y{t16Bap^^FD7mv+P>bU)B#hwDxMlV;TnuHeX_)Uf|%~$-yeBg ziYd(U&yLHnQ={u8|L#TV?q+me<*~ZC`ZXTP$JOl`4ZlW%HUBkC*3`UA#0f?PU z<`@S_r)4!~?n68oH&8TuUQ@f*XS6hQ-nReQii=)0O*5xv7>-$fkEThKIqlNXo}opT fmSMY5$8CH#LI={P9pQgqUPY}zFAO=Y&j|k)DQDg9 diff --git a/代码/robocode/robocode.samples/target/classes/sample/pandafighter.java b/代码/robocode/robocode.samples/target/classes/sample/pandafighter.java deleted file mode 100644 index 09420f9..0000000 --- a/代码/robocode/robocode.samples/target/classes/sample/pandafighter.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.pandafighter; -import robocode.*; -import java.awt.geom.Point2D; -import java.awt.Color; -public class pandafighter extends AdvancedRobot -{ -double moveDirection; -enemyStat enemy = new enemyStat(); -public void run() - { - setBodyColor(Color.black); - setGunColor(Color.WHITE); - setRadarColor(Color.WHITE); - setScanColor(Color.BLACK); - setBulletColor(Color.YELLOW); - setAdjustGunForRobotTurn(true); - setAdjustRadarForGunTurn(true); - setTurnRadarRightRadians(2*Math.PI); //״һֱת - while(true) - { - doFire(); - doScannedRobot(); - doMovement() ; - execute(); - } - } -public void onScannedRobot(ScannedRobotEvent e) - { - enemy.updateStat(e, this); - } - public void doMovement()//ƶ - { //ж˶Ƿɣɣѡһ㣬ƶõ - if( Math.abs( getDistanceRemaining() ) < 1 ) - { - double myX = getX(); - double myY = getY(); - double nextX, nextY; // the next point move to - nextX = Math.random() * ( getBattleFieldWidth() - 100 ) + 50; - nextY = Math.random() * ( getBattleFieldHeight() - 100 ) + 50; - double turnAngle =getAngle(myX,myY,nextX,nextY ); - turnAngle = normalizeBearing( turnAngle - getHeadingRadians() ); - double moveDistance = Point2D.distance( myX, myY, nextX, nextY ); - double moveDirection = 1; - if ( Math.abs( turnAngle ) >Math.PI/2) - { - turnAngle = normalizeBearing( turnAngle + Math.PI); - moveDirection *= -1; - } - setTurnRightRadians( turnAngle ); - setAhead( moveDirection * moveDistance ); } - } - public static double getAngle(double x1, double y1, double x2, double y2) - { - return Math.atan2( x2 - x1, y2 - y1 ); - } - public void doScannedRobot() - { - if (getTime()-enemy.time>1) - { - setTurnRadarRightRadians(3*Math.PI); - } - else - { - double absolation_bearing=(getHeadingRadians()+enemy.relative_bearing)%(2*Math.PI); - double relative_radar_bearing=getRadarHeadingRadians()-absolation_bearing; - double a=normalizeBearing(relative_radar_bearing); - setTurnRadarLeftRadians(a); - } - } -public double normalizeBearing( double angle ) - { - if ( angle < -Math.PI ) - angle += 2*Math.PI; - if ( angle > Math.PI ) - angle -= 2*Math.PI; - return angle; - } - public void doFire() - { - double heading_offset=enemy.en_heading-enemy.pre_heading+0.000001; - double distance=enemy.distance; - double bullet_velocity=20-3*3; - double r=enemy.velocity/heading_offset; - double heading=0.0; - for(int i=0;i<4;i++)// ʹԤ׼ȷ - { - double b_travel_ti=distance/bullet_velocity; - double predict_heading_r=enemy.en_heading+heading_offset*b_travel_ti; - double predict_x=enemy.xCoordinate-r*Math.cos(predict_heading_r)+r*Math.cos(enemy.en_heading); - double predict_y=enemy.yCoordinate+r*Math.sin(predict_heading_r)-r*Math.sin(enemy.en_heading); - heading=Math.atan2(predict_x-getX(),predict_y-getY()); - double diatance=Point2D.distance( getX(), getY(), predict_x, predict_y ); - } - double a=normalizeBearing(heading-getGunHeadingRadians()); - setTurnGunRightRadians(a); - setFire(3); - } - public void onHitByBullet(HitByBulletEvent e) - { - if(getX()>150&&getY()>150&&enemy.battle_w-getX()>150&&enemy.battle_h-getY()>150) - { - double dist=150; - double a=normalizeBearing(90 - (getHeading() - e.getHeading())); - if(Math.abs(a)>Math.PI/2) - { - a=normalizeBearing(a+Math.PI); - } - setTurnRight( a); - setAhead(dist); - dist *= -1; - } - } -public void onWin(WinEvent e) - { - for (int i = 0; i < 50; i++) - { - turnGunRightRadians(Math.PI*3/4); - turnGunLeftRadians(Math.PI*3/4); - } - } -} -class enemyStat // - - { public double pre_heading; - public double en_heading; - double xCoordinate; - double yCoordinate; - double direction; - double battle_h; - double battle_w; - double relative_bearing; - double velocity; - double time; - double distance; - public void updateStat(ScannedRobotEvent e,AdvancedRobot ar) - { - pre_heading=en_heading; - en_heading=e.getHeadingRadians(); - battle_h=ar.getBattleFieldHeight(); - battle_w=ar.getBattleFieldWidth(); - relative_bearing=e.getBearingRadians(); - direction = relative_bearing + ar.getHeadingRadians(); - xCoordinate= ar.getX() + Math.sin( direction ) * distance; - yCoordinate = ar.getY() + Math.cos( direction ) *distance; - velocity=e.getVelocity(); - time=e.getTime(); - distance=e.getDistance(); - } - } \ No newline at end of file diff --git a/代码/robocode/robocode.samples/target/classes/sampleex/Alien.class b/代码/robocode/robocode.samples/target/classes/sampleex/Alien.class deleted file mode 100644 index 4ff8a4c73d8ff0fbdad7bcab82dbef0d267aa019..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3054 zcmb7`TTdHT5Xb)qgAHcG#R0-4fsjILn}8__o-i}s?>JQ*|pDNSXl*WFK5pDX68S$yZ+;!-+l)$hu1N*FmzSS)3Y+? z-)C0K78fzJGW497=VqpCilfZV;R!FgF+>?A9sAHO+9jTm7p^5-?z}RKypq{kGb>hc z{hSN85<@$~M3b$15)eb2A)!OqJIyQV0aPDusZr6ux>KC*=6E>VbNsz9j6R8AZb+%(XQ9)|9mCHV8|=^=Oa zy<8GGyJ(gRren!_f3ej)wko7k?y`6kpy!CYDxj`rAer(iQG(XiX>UL6)yn0pipzzp zEJY5XwFR{%My$eJSsUq*40rMbQL(fdsX`2646~u3LS*a!!?=MP=wgUlbsj_JeKuLqOYHak_2!9Fn134@{YOwR#z(5Z^(%1at$`s>6frVY#>Lrp!k&uNHSli5@u zx-vBW_kMPIP;Qtv@IY>exm8DOlJ`5`o8blxOY!x#dFD5`%NF^fDFpYXhhZ$BZqTBJ zelb;${6zzg@Tu364a=b%`X~o2%38Ht<}Njjk?FQxzsjS8Z1Kc$*WP$O45NYg0Yfc( zbono@&N$Yw8N&v{P`$5>`wcw77DKNbKTd-!j`qxwWeS>TdMvWClxGHVQmS?-)tX&; z!!V)~ZUjaHf1yc3aYFRQ2Xh_gRy|sl`DzQnN0HVIEDMOmlV5O=8pqhC1 zuETjo4IR4%8r(y#${Kpxs#JLC@=$nNJ&T40x_os5O^PkD+;orC15odmTGEVuomjv^ z&z>3)_54wH0wt1!YE>f!HR7_7p+iv)%yOAw_%cK;YR0Wg3~ggDY@y=$rQ8Wn^tuKO zYfz(^q0JTtmY_iiKxjdG-_+jqbuD)b5^6PwJ?)aXo6h{`-k)C>o(YLs(la4Dx3hhWM$bh%e z4^J+*hxb&<6PWaIOFk}|o_dS-8(Gt&;!J=Qt+S#?Dq-l`RoC*IRF`thr+>!XKBO;j zKLYQ1_5yRY>xC=pKm7YAxkZ$I0~AvJRxvP7N(#m;9&#@ja5CQkH=!5Dx+SNfh8;xiD3n+KJh6fB#8;HlC`N{kS$)|X#|bj zB^rw505?(RCWyPOxX-cUa~FsyxlCicsap*o=&?{!CyQLdu0p)PUNgkwP()rK_VHOW z#Cj;Apb!W6ycuFM6!B6azQC8w5L=;$uN2~IeA5i^EEMsrLVO3a8DcvWai|bQl$s%S XLJ?dcUg4-2;zcOpSRpJmP$&NZVnB1J diff --git a/代码/robocode/robocode.samples/target/classes/sampleex/Alien.properties b/代码/robocode/robocode.samples/target/classes/sampleex/Alien.properties deleted file mode 100644 index 292c411..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sampleex/AlienComposition$AlienEventHandler.class b/代码/robocode/robocode.samples/target/classes/sampleex/AlienComposition$AlienEventHandler.class deleted file mode 100644 index d11f0fcfb1d6df8829b05f1a5465b2de05247a5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2403 zcma)-YfsZq7{~vIA#TkhjCSIa1 z`~ZF>^Zf^aIc&ty!7%Oey?slF_u0pmDP-Q>+qYfQ zGi^Dp1dH#4^j5g6TEdB=lcDb|f5)>Hm%G_#J8wnBi=&I-qGRva6}u|3{*7l!PdKl6 zMY!2wj=N?>VO)kT?~Un>&oT^`A`hM?v-_qry@w3vCjMbJxy8_#r$ZB9IAI`;<4MHO zYaoF>hS-E}&|5O4SgY;r2xpV;Sc2hX$*yo~i#w+OTo-owficWPAJB%xPeAZGD4mal@nba3_dh zoka89IEV9bj4;eLg85Hh1EUyYh`YjDG99Ycz(iqEN06&omhdQXMyfMf-kK_P#Fi_j zm-`U-s9rXr2`LUL)3xwx^!H|ACY{6-uEa4-C5p5+FoUZM{ky`;3F@TWE%U0$CAE;+ zUhoSrYv3B@7>;{2N9OG62dXILLL)J(<8FzA?5U+5_iBX7gqx{k2f;E7YDi!ns2I9! z8Dvass!<5h5Nk?CQ<}7tTnKbf!?B}qfl@<9j(~=3)Yt}sRnv7v_3+q+H5wXfcB=sm zj4ca-dv6%hp%9fwGg3ORkcJ_tCZ!y_LBk<`Dxs2UL|P*bD;W}svdt}vVdyZ#7iz}o zLkz8BFl?#LtEX}{MA32$8q%Oy#aX14CZ5x zzM|(NJ$0a;zPrc<$m1k^8|prZQy8EpiV1^t!ZMxU6MCmU!T5yJz29&)hHZ^WD)l0I zu%u9ffq5N8j<|qvg34 zftz*oO~U$UrZGXHr4WKO5R4GF6yi4Sv_q^#BJL{0J>BG$;Y T1JBezt>ZcU`mYr&Ka_#LF`f=5dJn7@4WOhXRNic5?dQJNo_9_K{VC2q*w~6N?QUxZZ4~Cz3heiQGE8F z@mZ)yeGngf@?R3v*)z1I7{P;`otgb^=9?eie}4V~U>QvdIfnU|4~BsdZ@u+E3e^q= z!!VYK3{^FAY;&nBIHS{z)%46z&v5iu-xqOceG#MskHB2^-y zm)sYzrvcv9Zo*ZcNBtfB`kY)XbL|C128VmoZ5eae+IE@Gi>$tTqne9Aat`*N;#!aBNnOaQl>5|J&>PU*9OK0iAY= q=mHN>L<<$HU=fc!E>!K+gASUfnyCmJ&k84W<9yuFJsMeQpO%{Xl62hP*b< zOj&a{p0)4OvJ(2zZf*+1TT=Q0>*axD%D~#KgtmKV`-hrzpDKlI+Kwx*R2~?8PN(yl zW;8dBNzqW=RxU%lIF)YrDl#WB@yv0ZaErO*3sw5vVbUoK;kt=Yj2XxXEdE0bDNJBW zL8b-f^Mhm9EL4*axM5-hrh!?3(k1L?<4qxpDTTjj;wr8QjFuf&zG*jW(tm5$8d4x# z_Ud+{YWt3Qca`z**a-x(e~F7V3}mRP&yM9UYgvB?biWE!19t`1{ApN>|maK)}HCqovV^fE=lc*Y@l3rK1{_Ilq>xYMTViU6;f=4Lb-VdpEAl z&JKe>vbO@b%}NgOH;g!UpE>e`DlE@2HEa6j%8IA0Ya1n;@x7o>~dF!7GU zWCt^pvr3-pVEz*gVz|XKtsN}zTqH#fvsj{Y(19kw0`;Jrqds!5O=OI^WU=%EcRI-T z$x`}{JfkgWlF7)hOQPa0qC^^jWvq1Rwz_nQVyT1G^IXf!ZsiPDqQ{lM8vQ7)d;B&= zp;`LPiWEO%<|AW_a!gPSn)mY>?&WnK8yA4*&x1EE0LSn^yLgC4ywh}+CDmif6TF`Q FzX4Y~TfYDR diff --git a/代码/robocode/robocode.samples/target/classes/sampleex/GreyEminence.class b/代码/robocode/robocode.samples/target/classes/sampleex/GreyEminence.class deleted file mode 100644 index d91efcc5b0e8c214408f130d3906cfabf20766c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1111 zcmaKqT~iWK7{~ty5QJ8tBGhy+dj%;??N!V%-{1nP(T15W7d*lioMqO<(YwA)*Uc2o zbkPUs6ZC1S|5*`s7>8wcIp=x#{h#MK=l9>AzW^*_ErNi+jbpRfYDjsySa9UoPSa9S zRb>PrziVIC+KqrC#nkZFzg-N8|;3*eyq&z7HcH61ST}z+ux=@$GyxYW-K#y1qs?x z=h3)Io_=B;m7~RV7+t1fo}e!`{|#eFBs)l*uVy+(_iS^0+n0ZT7#{RQQv?Eeg4dA5 zE2OcG3|2jHEkJBn{H~Wni@-hH?`pp$M)wod^mqpk`t8I##}-@P_O%l2wGzcV*}9d7 pc+|xeS&hae&Wl~hb?~^>!LvbXfwdQX)I^V(AoZn3T_q=g{C}N_<2(QW diff --git a/代码/robocode/robocode.samples/target/classes/sampleex/MasterAndSlave.class b/代码/robocode/robocode.samples/target/classes/sampleex/MasterAndSlave.class deleted file mode 100644 index 45dbfea4a325ff94942d9512a938aa6b23a25159..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2086 zcmaJ?ZC4vb6n=(4Qsbte(6j|wv=o{EvKqC%P+Lf$EgD)(YR>WFBpJeL*l;$R9Q)0G z<5&F>&hdjkz~ABTP@kFIB+H7MbF#BDbD!rv_s+eufByaZ9{@`DE`uq7n>~4U-cjl& z`$+bDQ0zyAo40lDk6(Uf)gce$UwW%R*qm!VTmFX5^`oE&49(7whTW!OvrhMGH&X!t(o` z`@HW~o%X4(p?56Y)f>|d+5Ax;SMxa@$@5Un^{!iMO4l7nxl*W%GZNi77%11@Db_XT zs)hT8^ThEOrr>`$2}QSE_l4t^-<12Ej$$tFM!ZBeMo!YZ^-*YB*v{Ys=4-4fZg0WH zhXUEQ^2>_3cH8EN_O;TIg^#t;YdS3zbwbxm6Qyw`rhbVmhq?x2({~2S2&yy|EFH!xZaK~k5&Cx5V)cB$)3}UaTXIfCy0RUk%cetrNAw+jp{Q-xRpqF2^4Vd zTKEdA>pVGYZy4*@B}T3Psf9f}WDoR||EkX{-YQgnkOOHuUHh0R_iMhVvG7*zYN8+2Ko@fs~1 z>9+0By2<^w7GC0&hL%_$wQk>Qs%MUF&H2lB#I`2D`>dE0|1)f>IgV^=KHuWZ<|sJM zY+NAw8(*ei@tHP@i^%ca3Jh=^vz$@s7~C+Vz{DY zNgPdNDH7pSz%jR{ubL3K&cIS8um>0TY@#AK2HrA;55(}cybAMq5{7*hV%9>1`m}fA zBBO5DHdjENBth6lS3t^15cX0CS!cR}lij?)v!r17F&JYaNqdomVV8|D5kKD~Vfbws hVzys_0PD~~K2 z`mJCF$_&i#0r*f1XIDyOl&A^+$g913etYlTJ@ViG{P7onTX;~$h`?M=9&`hxesaH% zy;w!-vZu-@3Cui}1L+1*x80rQW97vH=Q=9rs%STChJ3qFk2vtcmU7ox1F1dLvXNzh z@fBbD@v6XRwYDcv+TfxJMsdzT853ok7nnNQw-LwzqYkD`bcWz+{V13vwOreqgun|9 z#xO20UH7&6vVYK2(IeRm6eIP}lfj;heDj`8mg0`z6PQ1d$gSEcK1}}ZK}&RCUwW$NZvRKrW6297HJ(y@kmI<|JI}Q|GT+PXT6^xUnZoQ>?y2~pGBw|-7MI-R3U}KoZE{AzGpXPj-YDaB zcEB|0_;qk_1y=6=SeP5R)6?!$-&(ugA^57Imq9b8A1_q3aZ z%-P${i8DU+?U>N4&KI1wxy-oky5-pVpCwktgfs5*c5!*!Fy)O znCvLoGBY1J_`u9ew0MDx7YJ-h?}>@6IQYcGO8b7qi+&BCI=Exy-S9`#_Nh=eJgIeR zAb~4G=P(?xhsnOWe7pTh_xjO`l6wY0^=CU}#9=RF0-OrtSHhH909Y7zoWAFC!B9M znEDN~zi@H{b9_!&zzP@M!3``KlN&?g zu_N)zc;zhOtrNu;ap^4L2PcYO#pSbzcTN=3NU3;@MUJr4NmKLEGrX2HuVMoY_WO~A zEF=rl+9|=Cc#9Zeyi$Ox<#AsT_jLho2{$Z`ra8im+7q$+aCBz@?!!FJBd%3|`#8;xhAzM@=W%V~I;Y_HIVixb=5bGm3kq?(*or8Wnn>b>Hy9HjfESG#Ax*s8ZpXN~oiWR{p+AcR zG10^y;EyuCvo`Gp3pX=!zMeVfo%#Le$1ecSv6V+guy*G4zJ^Mj@4So5`S9(><46q; zdx2KkS9#oVEU4-DSiy6!c=3DIiO~2Ps(W%!76(cR< zdtuv)0&9<)x%g9XCaB$x7R(v_I*9j&`~5If9J$tLjnzm64hKrd?8NrH;$jI^!Hlv_ z!Rjp)f|AiEzNhtA)OzZMbR>PnLl+NFj|XtFL4B63E^wRh!x}p sT>UzZVqoJ&oE=}RU?bd%#0CnsyDMy5r)^T2t<;2t@q|w}QwE!V0kp!hbN~PV diff --git a/代码/robocode/robocode.samples/target/classes/sampleex/ProxyOfGreyEminence.properties b/代码/robocode/robocode.samples/target/classes/sampleex/ProxyOfGreyEminence.properties deleted file mode 100644 index e47c5a0..0000000 --- a/代码/robocode/robocode.samples/target/classes/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/代码/robocode/robocode.samples/target/classes/sampleex/RegullarMonk.class b/代码/robocode/robocode.samples/target/classes/sampleex/RegullarMonk.class deleted file mode 100644 index e5044ff813d7412fc22c9c424040f73101791e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmZusO;5s55S%TQN=3dB!j&U>u!&cV7ZXke5-{9f%ci{gXiaI2f6EgI2Y!G*im*>T zaNshtGrQTH{WTojV7*8C$vMI@wD1RT)e5sFrgRbu`)|lXsiECw_NKjVGv$C z{zUK>c~!(b)^MHo)-3`3WR^1`yH;o#c<#Y+BVR|jbQU{K=@V^ Jp(W^`eFEEqJB|PV diff --git a/代码/robocode/robocode.samples/target/classes/sampleex/Slave.class b/代码/robocode/robocode.samples/target/classes/sampleex/Slave.class deleted file mode 100644 index 0af7ecbbbb4af0d4eef1910bc0375251869cfe60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmaKq%}(1u6otv;sL$7IFf`DC~q@ z*i{E7-GS7e>VD@!EHHU3Bc(Z6XpYh@WG_}xL-y1$1)qKG$6o}NYHup)ZGqfZk{x6* z?ZSd9kge6*HfY7g1SSP$n!Z-w`d1wlUCK_N1m>EdCxf<(d=n2BbMX(qC-7l>P*MS1 zWTU=zuz*DiMS=M@th$&tCl^B9@}$E>40S)*V~3#cCmz#fS|FJ|H%dN zp+5KH#%-e?1d45|r0}VYH2sr{3aSF-G5M8Jz-fj3$Wv#&>5h}sz5i1VB-Yr+EU%Y+ zG0o&G$GL?mjy9t+WcUEi?jOE;zmdOVl)((gLXufx#xk{K5`f~f8nc*V#Jq&c;!OjG z%p-mU_ojA#A%BmLW1^E}S9pFkp_vTohBW>qC=D4WR2pBlVeH*w`6XnXX&Wg^_Q;Zr c6|5!}*tmCaYcFxz#O=I`TTgHs^pnBn6V_sw#sB~S diff --git a/代码/robocode/robocode.samples/target/classes/samplesentry/BorderGuard$RobotData.class b/代码/robocode/robocode.samples/target/classes/samplesentry/BorderGuard$RobotData.class deleted file mode 100644 index f771285ef0fa4678f2f0ea7dfcb85cb1b288c660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1762 zcmaJ>ZBrXn6n^d!^42R2&|<`v(i+<&U{g^<1hK%8#=cA4ExmEYnx zj{3P{tAsi_qchIvjQ%LcbMA)5sfI6m&b@nHp7We@?q7fZ^b3F~cnKH+7XsDXYuJJ9 zhW>tO$@6Qrf4!yrT5i*;dZDR8l|W1&v#ai_QbW1*((UT5ZG{3cS2b;cp>p@vR_Hr! zeNG@5Sju(n+Fb!*c8}WvCp&*CcEhura9?1cb92L1HS!ingvzhmA^CPRa*KyMPLR7I zFk0?~n9|1Q9oGpL1ZMNS&B{JiW_dNcv=xEWm9E?;3g!wGs%x44r66!hVgM)8=);Ia z2G0ugJFdOnYF2Ikj;c0v*E~x#D#~~G+_{V~ z$pX2a+;xY7$nLk9GJ!M4q2$6|k$4r;0w;)#4KHv)$8!bdkFPFbOMMoW>bBP`ZFr6w zPMJB=YZ2bL6lO4+!0VJ@j2ViOT4L1``p5}B(7pH0@a;GYOu*C90w7^HYZqq4##b0IzQ&mG4K5nr;wAb&LUt4umr)|g+7-O4?`X$6$@ja- z4>7e?oIJp5ZRA+awUIAQ9Acr3C6;Cz*Pl-Q0CD3x3>Xh7`S+Ck2TFdRlaEI=J(Zl8 z#d)mariMWq*?~cEXxM>8%5!U#Djhz=I_Ym)v$5!OCmZ__@8<7Wv+?NSL%#TgFOolF zW;+|tCLhCkNI@cYMyN?Jenr3W8-|VFku(0lwDG3~x1ig%_ypXdW`+g{^Z1lnWnh^8 o)k%vXhqJuFAohJBm@c+rYUXHrs+bukaVGCDYrAXnIV&zGBfFh zK#`>i(kimFU|FOXACy&^v{XQZ2a56@qUd|#du-456a_(06qNX#|K3?rz(-;3{nvBO zfA;g=JooXVj}y^MenKM`laVs}x5TWJ6;CI3v@S>_!&Y+ffSC+y`p3s$b)*t2xQqJsG|GgF0D-0I)4+}wgyT^E{L&DMc*G}elNHX!JU z_QuWhK+-ww%PE$weFwufNKW2hNYbw8rKT66Lcygzc4o%w^j`FZ?clB%}p^dw4y5!GGlAaWK{aj zpeG%PrkLtJlM&#bJ2?>d0raUl&7yHkJ~>;|j74|iOiZWi6qMoOh#3#ZtZp-GCS|-$ zr#UiSWREYlfy~uuo*L~>Y_*h}WNo`n3uM$IqJo@y(q^a+hjgec1+#6LsU1uc8@jSO znm@B>D^#_uajlOQ(^8F=;AEe@PN!vbCXhu_wt_pbA+ilZ({i0w&?2VNfh}P(Z7p*2 zR;E_zbe2qwv8RNBtX9Z;k4~%QICXhjS1TP_l}LeiFdL?FIV;pqp;d%4jr(WEV$u_F zwYtMH(-Efed0fbi=XkJz&eiA~c!Ffc){k4I(|L403+94wu#petc!DJyO77ctuG5y1AC zLU=WlISXK6B9?%iUPWILR9}V`G%Urx#W>%+tv|nUz zZ3jz7D`{4%B6O=x-=IQZb1ds@QLx)|x;=kzy%^}7I(?Jwf-Bn`jl~v5lOb`Cfjq9| z*xT08kz=M}8h9yy@7C#C0$8)7gF^Ogo&F_n47hgDy*eGD`-Cbht@cBVd6+UFW$6Pt zJt(3m3@6QP;=qL~59{n(VxyfNxN5QA?W zt(cjPZnfIuy)nrl*rT&oL{kB|ifFp5%^9J{w5D^R(CP=RN^({|yek+ZlRlk`WwIEP zYpqx!6ix3an0MvQ*B0Mjd9f@g)7dY;#Q@tQ;HV5%=sboi?bx?EDzOi|U4{_A)jHLX z;kEUKe9(cowJj@T;Mt^7>274A*yW2PlF^-sc-lm8;tjyE)k>zL$h0trjgACib73o% zHYG7R7ao?U=sZ=TryErJD8k77#_|lNV8dspVz~$;3O*`zfKL*r4LUb+08qCKz)_y= zxEUor$4}Z`A%EmkLbMRntaFRxI0d$%gZcUSiXGUkWUTSt)rji_4ILdFjU7;vQF*-b zKVbfL{C0rriGgI6>zcFO#|wFpCPhnWRy(@~P#x*qDT-MNN^FPHv&FK)@bA1t=cVGy z%bY`IbW7&W)VWLMN}V|eAMA!#=)6+dNGb}4_yM1#bGPb;5~+guj#d@S_ht%%}bx{(!@ByEr^SOK;q}U&Y|MlY3V)Y;JMx8IP$Ib1+qfI)8gh$?3v_A@YdsS`4 zIo^a{2u2W&rb5YRKh~xZI$UYQ2nIk82mlm$ z0gk8N+^%}&_Vt=@+RjFlk+&z4=8mptD(!<9E*4$>0#mJ{e`*E%aVBSguJWbG8u+q| zgHbEgb{y++oxjLez?Vf+D+ki4XxM5`OFiINoZ`m@L`J?!GSG3tiQPJXNjT%fK~Ru} ztknsi;FIKWEi8?{B1zxUPf_)3{DwnwLS~kjHn2kYT4@`N8qcI8nA5b6I^Qa;vD)#w zSTs5yme|S70^0~h32)Q+cBQQ-uca*HJ9Yl1Adx_V{h#p92X($%aA?5MiKqxYh3k}r z%LfM95fEyX>p<0fP_?|7Ob0Vwm5~Y|_vw7U$lM#*u_XcSYYOV>gv>pp^TTRRh@2@@ zKBDsjGNMK7kcxDRhjl)p(k;mXR|2rOiulL1btNO=$EVc3OsQO zpxgs$B=tr~qTYy0>W#YrysNMWw+VQTN3Wj>&?0II4AX=_CHW51B)m!v)09BjVVV~3 z9Htq8W7M#|u*5S=fy31D5SF{B70(GEk!U@6P@EUje5#-&2!g0#Q6L8Bd^!=cx(%LA zBDu_AIysB_eDnl$4N#wg-)Z>G#_x>45X~PPkrd3W(A0rOqRl|lj}s;U@*DIPMR>|FL!j7&cXiVcb>2edfu>>VlE+FQ?3NSRsH(wwLS>}UZlJja z%)Jf_+pEx2+YlTyfJJL)E#Nx{g|F-AYzN^zSnLLlvz+ z*CW*1JVgEbsW8BY$-+>|o=J_KN#*FXIesgsybUb4lcu8}3D80C|8AUiP|-QbMx3Q{ z5m>bqWO*T>Z4?7xLU9qf{zd_f;cum$}laN!<%%^tN#JrAnq;GQA6Uw}Qtbj!#gn@4Gf0{>;BDRP6zU7&D9ph*@2 zr~PuU+MR>;D-W}?c8{~zc^`D%ih`U3I+ej4hISl*86Bl&dYsP0InSXdanq(gx`21XJOvxdnvHm?Nt64A;Puz3#6JpW&YCp5;O3 ze}i5;-yFAl->p<3E&SdZx4ZY|+sNygi_SaQsdvzO&z>sq%<_!iPt8@H{Zwx&=|NfB zdxZXMcL&jZQ@Z;Okk>sIi;E3!CH<`z_zdq6`gn-lfgvuyiZY-sN4p5^O4j#%gD%4I z%6zavZ4gV80oj0qTENhTxYW=}L8;~$B#&zjU|hU{({7X;d-+7#$0yUnd>Rd*On91u^eoS&mv|1n%=76t+=0Th zlRdnci*ffphF7q`D|r&H;bvZ|gxf9Z30QWh@^S-k)i>FlnjY{CacyNLZ%jPC7%`;0~PhG79h&)XrDa zV%|;5`5LIsUZ~9tWbsWoal_}>;+6y>b6V3mZ97flGt_Ap(*&Li(Rye(89WcI0(h(n zC{`i<+lbF!?RfhXSBfRF;ww!2BYY`vsdPvsA?|7{LE6M?Mjv(gAkRT^U`NX?q+myQ z!LlYfwinL>L9OW#UK}jKb6F5(tt`JW5iBt@W%X#58AXi=qxc9f?+cb^+N=74V~i4` zq|Ycb%KAdVs!Hxbzg+rb`a*rd8lzl#W29Hs8>}^IjGDemUSm}C8MS@A!Li2J(wlFk zJ7gb*YPK0;kMO$QL~#7*kx(Ky(HL(`Ji;4feTmZ^B%j?nKRDU&8b!wBKAXf)aH^qY z`>R0ObR?X?dU-VBNbjN18-zchw^Xa8DPT-B>J2Emd6*8OH{ED7T2yZkjFZgZ<0o@E zkc3Yrz61AZcR^bZ;%nI5)XLw2mJd=J-$R{zFP+7Q=sdm;9}ym;t^5#N$iuiq9-=`W zru+F(`W_!coPL7d<)>h=Pjfjx%hmh?82=A>IzPv){9`_YpXW3A4qnYKD1G{)q}ja2 z(Wh}(6Nc{KOC21E1<|`f$rMdSA!85b6F_xHn0OtB|ce&2hA9karx0H5XDXvcZGA1+B607uWJd zXpP5R=MGMyHId$>4V*%2GQ7?*xsnE*u;gRV4M^*k0HVgRj1o=!7(D_TwP z0ONQYS}jW7=aFXwslOWz4Cg@#G6Mfsq4JLi`tH&Hh&qwFoRha4HiAo2$8p>X=19eJ zNK)d|G2XsDYb?XOv#aSSUxIIJgES>;F)IRa4hQiY9Ohm7si^rVU&-X?#mLLZ5tiAz zW)}=nYi&Ws(q?-DwO;I$2ew`v)C{c=!Am!^WtahWS*y~{=Rrg2S*in^FEcW4ln?Hs ze2sF%SSPCI5z7W6QHSv_;C_CISn&#t=T~VGzXn(IItBR+nuq=p{w;O!n-t>TQHp<0 zJNYfTgx^LadlTPI-lqfnC%TtEP%5ZfbbBp?W*5bVems;ZoZc97;0{s0kG#c=ZfTlyHBOw83Kg1ttfV1nP%)f6i7_p2Z)N zhQBB1*=m!Ilf6`-b?T3rUsa={9Kz^<%LbEv9= z6$o=-;fShYL3UIGeY5bF6u69X==&M8qXgSK;nH5;tx`a|#CyM|MtXxq;_RGualPS1 zmQ~kiXn2jOH;P0l8;xSTyq-huLy85WZK_yx)q~syDs?r2@W^n*TGy{5j4_d{FW@qm$pVTsL}Os#?~aDX;zN)-9Rni54mSR>yd9TaH?MO{;Efz;6r zdr)y09(np3{0&1qBnobeqEr~{x`YZ`yQtQ6xx%Z8P)I(L2G#LVRfH1NDZElq)hWDE e64fC%4nr6&1W3_=@A6}Kbo$&SgnUqDxG(4BIp;j*+|57#{qZM&t9WUlLtv!l?CtwX zD`ziLI9&Cjn$AU`SGCY3Fc^j9uo6~PW{dhFFWN%4z?qgjwiW2U?FF8`BhZ;lZ3}d* z(8oq6`Xns$2%OD(fqGEiE30VBDf^1h`LN>n+fL+}dsEn@cfFdxSpFSJWf>r<2fd)b z#1PK$9@e$MaQ>-t;AFfovl)4TF6oH*W_xg6V5q&S3CgR7b2dgXZefhtxA;lCj|&3U zzJc-sq9>2xeJ5};#P$L=Yswr5gMzBn99I=pMR^CRDlneRx5#NK?;WT>)4|3BKC*C$ zfNwRC_!yrE*sjt|Pl3^7s#RJ^ku2YPX$Z?&_*CG%Hl8*^W@}>-Nr@EFYyxo}#U07n zBrIukvl4SBy2nO3YvT&$EnH<&V=Cer3y$8ExQ6Qj2}e5twTWadmm<&=+>p451%X~2 z=9C*L#g26)W2Hb=;>CB8PeJ#IaSK@7%YiEj)>A2C=#EH}nG65knPJ94T{)H44;;zwiNPxE3+V;ss7 zl{o8K#W{sn5>HN2ES)HfIeY0D^S*N3=TmP5cqZW+hcl+8QW_+YXP15OWLVCD>(bjZ-8A2>rq9mdgd!J(EfPm z%z)w&iR|Qmg6%dtzb{;SdCPDY+!N{FVgJTM2PD_-SU84$p5?It&fqL>Y<0`|CasOL zoqmIX!Qlo*P7!SCfQt+=(S~BTP(Hwi^koWSo@tp>ew}XM;@_Bjg%xx93zLPJ2By*t zOuOqm&G3|Q7ZRz_#1SqZ;j;xRJ!(;S%RRzk1Iy`iSZ!eKH5QMNHeO-=7-^%Bo_T{p z17Df_VFQoM{%r%_o84)kYIe7Qr>20;n1W>%3QX~NBr%9IE?}CsS^fxI#uC^2nCF|h zhAmvj4sM{z7w%&L8n^H>viJpyap7xZo5eK?H>W)WEParEA@)g=LH-F5<4%#R8czx0 e4-+Y(?+)YFaX`E0#OX%IzgSq6O;|L)p z(2j_LRuY5Ze?8*YJj0St#gE+?{W7TB@f79+K)ER6pEIPx5yN?3DaY@+TKF zl#*QnkG2BjTNz2g9)Z15uuMk2GpUTgK0L;z6&+hE>6+{14A<4loaNePVy2zW8yslG zyeNm7Nlr%&{CSzk0;KbU0>cSjxW%E^;b{TYF0@f_9Zd7Pc08-MLaWm-i6y(Jtr zxLj6Q+86?-B|A);8L2lbU`j>@8Kb7_X_n4?ox{9}N^58Q&^gVct_7P5;n|#+saf1m zIW7jA!&w1G3PY}G$w;0+wH2u#70wG>@D+61RdJE{39Rig+qAqmYIs536EAYuiBaMp zMn^9TT*51KY*z`7)s5D1(#Ken$L_IHnJ8Z4HE`ULVC(nne%G){{kFrKYN$VsH}IB< zHv=FEm|TzfDnQdum3+3 zak&l4n6EX5M2k^g7(R=rX&ed)+Kdaq;sY?3K(?)M(;Kce7FEH90B!?<7HlI2rZ4&H z700(Is`!qJyNKVr_2n#o5cpB8j4q{9?-rI9 zZeV40@Hcc_M{k4lHOK~%P1mudK?YKT*U(!>O47bMwoAI9j)x`PQpY2b4%D$bHCV^c z6@+uCRoGw00g}-=#v0_vmD_(alRRd)z**)Xa~{J=zBeO^E%M&y?`A9i90UAHV35yF zUhNrd!w9zXHcQib2km#_6mMi5yKx44a2C7#ntRv>*43;ziV7xhlo5}S+l{u{4BMtc zQ5lG@tZd7ZnB<#1Rib>ysHn>t@^uuxM)+!~j;Hyl=|^}f@l;OS#F?8|nA7)$$#R!i z=g5krZlPA_4fjTF;Ca6jYlfn!Yj~;a)jD2Z>mTcQ=PE<)V>J_tT}b)8ILIo7nf)Pl z;V^%77BpVMTj%}V9z1AIuYJ=FaOAF~fh4B-==!t^nKPkD;a zOBX)F=j^rY$Qp#iZ5%|q-;$|NDCBpgn{K|qmyND4m3F_WogCp;EcTmn9p5h@F769Y ZFprtQ1UeV<>SSI&(UpRq8LmSE9O7h4sdZX{PAL{7JKWg8Y4x>4R zDHpY|e`0!8hxSRgLn9-c8<<|-#?je+Q$Zal6nEpOpXewFbT}|sa>}QeeBhCyM}^$B zjcl@`kX>&!>w!XMH@-9lq%rBCgeisedOaA0!n6kuML{zj#!yr!wQOV#2i>;mo&G8* zx8jZt15I^QHVkHxYui^SxBhOrMYb!GoI4Kc5$8goa1sxC9kXX;w}N|<4Otv3ij^NAJ6s|F diff --git a/代码/robocode/robocode.samples/target/classes/sampleteam/RobotColors.class b/代码/robocode/robocode.samples/target/classes/sampleteam/RobotColors.class deleted file mode 100644 index 7a05bd6b9a4f51042de598df03bc6b2a0b2b9775..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmZut%TB{E5FGcFHng;qQp)SV4LA^qD~L-G5-0+RLhep#6(cuBi35Va;)KM358$H^ z8`nr2uw>7Acf32}ukVjf07uyIP+=J6eEz6}5quup=vbSvRyxZ))EIgX{D}vOr?cQX zeh`WA&|nzYtkl6oWRffS%3~#noZD+8vRvx)?&6GrT{3jWI?WAFO~h3p>NL4rjG-0l z>5CmkZ$sOYKbyd2jv1P>B6U?i<5QlwODj+KZ(%7e6iIiL#)(X&Ic2Es?MDo?v7QPa zRSetcW0j#B%2Zqx^H^lJ3(5UZCtO9GY>)+)teJb6GmOIjKZd0F6J2D9IG5J;pHDk1 zU0@d^fp#4YY{Em6;ud+Xz^ABX#h;U+m5;A9HNeLUX3cAVl{f8>hHNo{^7MU$F2@z#!3>(Lf4Igsq!HC68w3q( Fegm*kgueg) diff --git a/代码/robocode/robocode.tests.robots/target/classes/NoPackageShortName.class b/代码/robocode/robocode.tests.robots/target/classes/NoPackageShortName.class deleted file mode 100644 index 3efee5a096eb61e86e9a60fac4279e2a04df23f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmZWl!A`|zspopCAI&Tk+(>JxDBbgIIUUKsjqCK$2p#uP zpxRsZJ)(9Hd3gw|o7g~EAR`?m$8>9*w@2C2`4cw>;*Oe$dfZ`#QQ%!h-oTwWVN7h9 z*p3Oq;#mTPVaR+XA5#DP(2oLJUAXav_2nfF?&MrzpF(=#r4jKy#vJP|vtZ72Ua|5* zpm7-_G*HAEvH9D;TwukI{2RWdWIWvLlolv;s;Dfm8RJHZpT9pz>xpEIu0WZwLa8dh WV-pR=e~V^n(M)D2EU-hUVfP1yCsjQF diff --git a/代码/robocode/robocode.tests.robots/target/classes/robocode/BadNamespace.class b/代码/robocode/robocode.tests.robots/target/classes/robocode/BadNamespace.class deleted file mode 100644 index 24af7c0b7e75bab3e0c3c7235a4726a2f487ad4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmYjNO;5r=5PjPgP%Ko+r=lj_fP*AnHO8pX3vvL%(PZ0hWEEOcTF(9(&t5R`;1BSZ z_$$=e+8~#iH~VJZo1M?^_YVNaILJX`sD^EqM6K)FvA`}4g0_HMpXj< diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/Ahead.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/Ahead.class deleted file mode 100644 index 2b569908dd819c3172983c5759fb330f98652eda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmZuryGp}Q82(N!O^ne}+r-(eb}-=JqKHLt3Jxj-$CKnhkJJQm>3g{-IQRfQl=z(} z)xk5I|MuNJKHuH}9An>uB`|JP)2bq=tE_69WWH3g@Zboxz@&TuC=z0fiGV9jMEXvzjD2udb#<<;wJ{3%_(zX&Epb4O-LoxrOvc~i zoUjU3clHYZnTO)Bz$|#D6sWjYh<) Gh4>2#s6hAt diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/AwtAttack$1.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/AwtAttack$1.class deleted file mode 100644 index ddc8eff12af4f1510479ffef0bb75a8b54adcba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 790 zcmZ`%VQLND`^2Q3tCNB|b*#I3z@snKr0CGQ!!-6z|4+-~m+c=r?wpDN5b+fv(B6kW#{%Qhke!YvePXdy9>;?P3dKoW4d1QKy61~;_nMV6JK#*r9VhP?E9 zc+O16=_E7xfIjsP`qJ-cyS8j>la_kMXCFyx@4eRE`<&nYdi@r_$0%xuC=3L4Ik1Zv z-z#`QIg>pNvO!>4&oo38`sJNI>CK~w)A9PA-Y0L5^YH6 zXh%$;%WzzKyYjqX`}=00WGnO-o@JKurtipe{be*ba>@$VjY~)@GJ#)lW6OtR%wG}= zq~jWT72-j~cMba~*+kQ;llj>4coQ_JZDs42xw|-eWvE5*CGA}X5bbKIc6Xto1R|WgRofD0DdPiTBJl%)s{9 z_Ou}$nUYETUd45#E0mR>tXZAY@d-=sRVbvd26Vj4uJ5=(F7R#h`C=0D_)Np63fG!( z_K$q;R08Sv9CtVc$2AXDdfzuKPQhS3?K{zAhGIo;BWz9Ye=$=~bgy#>NjH*lNIFh^ zC$P^4cbR!YQp~dMl=P0%PyD4Z_6S0LC1ZOp3Hd_-?AlD3r|C5fB#8HTNt*VnSl{zexG4d=))-Qh~btrsd}1`(1*blp((CH_8x77R>+Pv z$tJ^>HxR|mFj9XFRF6bBKE!zF%DbZ;>Sr>NP(yDpama8tjp<)8bq3v-p85s1tC)L9 zBq;eR&s{6~X(V{oI&lZxSmd2|FU&bg45QU^Cdg%hUllQN+zp9~BHsVI8s_6n%?{S6 zs03ZbIsXPrhdtR>STUx%@w$q2nm@#})%L%Osp6p!?AfYf=M3Xpw`z3v&oFqt|B5os z_mm;AXEDbq7rV?U7Hc$QEwB~93LCUax@#E3I$QLBCEGw6o5VgO_7Ob|WU<9{o9iy) z?S<0k!lvfy(vz6N*Z79o=0oXEs5KkzzU6MKUXBPe09}X%8V(+5c+CHN{AwKEVX{^h hUdYYK{Jz<2sTz3xWiq9K5t!jxfJH0EV}h2ye*pNWg~b2> diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/BadFirePower.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/BadFirePower.class deleted file mode 100644 index 50d6cdf82ffde0a4d4b85dd44059488d5c64e5f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1100 zcmZ`&TT|0O6#lk_rqlq^Vi7DDytYM%R|JY&3Zix@GQxC5XMET;YmJ7alP2hI@Q28= zGfwa_vsS*QBe?M81qEi6Nc_Ob;oP#Wo~Sk zuGn(k3Rgi7LsmK(jv@3_V~^VnVLX+Q42eb4HoYZ=c)n0$=vkwf6yoSp(TfDbVAZt6 zroUSk?hdb8f+1aX8r-UJ*OcduvB!I5wi$BO|MMtO4cE6*U^uN}2x$hTDZCwXmq4j{ zC9#sH8__32vMNS!mZ85bJb9I}Z&`x)4(Hbk)x*m~)>0oOjHx(>93eSAg`KIs=6hT> z9ev9+ZExFi1>Y?xm|z$QJr=i{I+;zoS@uoK5N-+@E-08JddDMFT*M`!yT>hGJb6j* z`AQ+Ga0I86!Z@zTzFn0O-Tp!?i2}7$i)d>tIi3YgrcJ51hG`lHZ?%MNFifA6-v!yB zPL*}sP;i~VkM%|+iQHmHQl~>TgsoneCGW_Rvotf=(c?G%2Rx2B74uji49|%gCa2Jy zLL?Tkq~IPy=7i>}SeAWJT5=wioy00bO51d_dN^4*^EDOgQge!UCmOy-vPeWuhM}&R zlQgzH-gxtvw>lb3Z9Bf(5F4gc>Cn+9FeCY3l1juwfyHP?>ZZR!XPs6?Yj5!Y$&a*& zkpdCAfecR3UX221?WYsNz+v(i0*aCCMX?xQ@cl3{&4AQ5^#jG?Cyai>_%rGFjPnP$ zoX!U*P6e0=a67==0Hu9sCxop~SmdXry#MC|6^MtVCPKy|L|_zYjA52UKaU)0n80&n iL$cY3P>1XQs<@90BK?3+TT1szdm8vb!+Vy@(jWNCG3mVfJd@~tf0;_bkSq7f{Ha?pe zOnmSI_(}W}>VFn2`v5O{&Ya8doH=v$*PkCh0o=pWG!gneOF>m4Pq zPz@TgQ#ewo2*$nEZ1gU^gr_!fQ?vk zv1}t;(+l;ho<8Rg1y|0;Hs-EAIhNHgHX0KeE zBjK8h>nO6BpvT+is~=@wdVb)&4Sj7+OsM4P-Yjmg1QUxH+`?8Gn*zBBfi6lY3#89% zZijXAr6I2)b;~2n*DaP65FA@>LQBjI^r4cb&3B9S9GU)iJqwS|6q(p}evFAlaTI|b zKJ}4qDh_o$hKo7I&<7lE%t5rH?3@G&;}WreVWvRlBbf29iC^MCBSYOx} z;O4m7OyntI4jU0}X&5=e+10IJn;d~1+@8qWoxs~9Z)+;=PQ<&*-+NMj_b2eS$=jL2 Odx%F7?=f$fz>|NMAIu*B diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/BattleWin.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/BattleWin.class deleted file mode 100644 index a4591128b15ab680f3ca009c82402c097eabac7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1693 zcmaKr-A)rh7>3^g`oprt$p4RsRZ%GFqJlr5SStu>QKY2C!)-g3)iP_!mc%pf#$yvx z6A!!qufyw5-`Q@v8&Yi2ot^oaZU&NN_P2!K&s$z+_66fZU$XdDBDWOO0dh> z`Fv;N(a7epRNmS`Q8UvfF8a)OPMzBn{Ga<@6=hwu?RdFQxkjxf*~{}0l}Mm163-Uf zTg%{D0*mZd$JNPv6W4J=z^Fb z2#iGxa-nUkpUgWZ?&2Ob+y-%@`SxEnT|#i8qt9oD&OL)zYfz(mBaztnb|#3qlfzm(Q) zJ8g_)@z}U(&uys6rm9GuubBufTn~}Y1qQ-(a$`~-4}qzWAI4jC{vl{xu|Oqy2qJ+{ zW|zhy0qR6PUL?>KFbZy?UY1WCefb7k3GCJl-FT$=>3aS9lH?n2ET0L^Esla?Eb|@7 zuYBp@m4hD!hA_Z)vz5Rx#Tn6^;u4X%cs4VFGfkZ3Fxtd;Yc>_kzWn{olwKb@MrB}} z$`iy)ViZ%npJNf3*+6E-uOXbb1+#o=v+Kn4aExcDb|G|Y_^THPPy48`R#t%0ySaqR zWC+aRO2FD=wq~Vh^Xg&~3)Lp9lgK$Du0)Wj4l+gLEgyLs%K)TYd#UARz%uiX83jRne}4TPz`HOb2nbAhs_Cg} z%5@GLubIj^)n}!aYZnbqMbIZOp&b>cs#2M1+psIDTGWvO;Z@T%y)}VgJW&?td%&0| zf*6npAuKRdFm3g)RXQm~Z|J~i({ma-PTRC=+I&OeO`TWv@)ph7k)QaM#9P`Cp(ATl zzSY5V5^(Z_?q&zct*nea_6-39mzYSbCAxm zvYd+PJ=6Ak67OleNDnWH_pubg2LhufSK0DREA^N|Q(_s^cgl9$x?vTSWq4+rg48UP zQ#Ds9-i;PEH^9^%O03}{QgB+HzlJ(gkDQZ$ox zwq;sXE>d_&Ad3gOzoPPgzBj=aqr| z*eB+^kNLU87xp5Lj1jgbQw=((HFd}%$8@ohdi35GaNJEQm*(?CdXr7jb$gwW9 z<+vs^Uaz59NqbJqt*8xC_v6UfX1}AMaDx{V^!q2o8T*)HgzFUlg8xwR1^R#HB)~3& z?*^`7kaO7$;QtC&g4W~Be=w!qyq_GyPzNLYjdw7~R8#zB&sndZx8Cf=UT!_fa7t(c zBLo^H=P?o(M+}pgz%*vr@V7X|+0XO1iAAoK*{f@qLl(EOP3tZeP~u6S;O?0N?e`88 z&`$=Bq1AZG;|DZOaP=od$@uLbgqR*4c>eESno7{uCWb!F7b)UB4DcVreLw9)ck4;o zVI+`b;@gboi~Ki2BFqrJ89lV;OrcTNlO4=&ak!i3u&7sawU@ZR6iWVr)!&fbrz!gq z8!u3ZJ?h|-L4s@0!Epd6~lJWa`q$G08epZ(;~ryuVGV Xoj)VjY>$S-1-XVOmq3k(0UZ4Y%4%I# diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorAwtAttack$1.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorAwtAttack$1.class deleted file mode 100644 index 59ec141efdb065cd7c1e29400b8ce377c27be001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcma)4VQbVt5Pf@>Hg_?ac-GT;wbpCA=I*p<{UlU`a#&Q-3RVvEi|plAo0=w&-B|yY zpsgtQ1N>3qY>XU&&<2*>nasR5^Jaej`t}3BeQcPhF?dQyC8j~1O)@2eQI<-T7m>>H z?PImA6p!9}nss$7|GOy+ z_R};K`6%I13W*h(Po2&jnCt2>(c;zUG+~kV0=*uPtv%LY_yzXh6qi1gF_*Qk{G+p% z&?4KW9PPb=1-eNLxE0Eq3Z*mn4ErnE-_dz>iksoEwS0n=p>YCl2HPe;V42G4!oe!R pcr>D3NzpDTI~9dPls@`IQpbRDY8c`!-3HD79s+vlHgr++{RYU%!H@s| diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorAwtAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorAwtAttack.class deleted file mode 100644 index b6aa527e261c8e2dd1f33e8948be97f0f69aa229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1613 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 pf%lru6SS7jvE(m!pL(g{!zz{nVN@Cbsa zNf3w+{s4cJ@lIPTB%0KRo!NV5?mg$;d*_)6W8FrAp{zxu#ZEGW+~Jue7+_t-NaP3t!tvF=YGRH?fqw*%AyXy%$9J zC5DCiKtNRrSqo&K*BQLxfH9>8L$Vg`h#@eHxUi9SU}4n75Hbu_(Oej<2U5I@51K-4 zce!Qjq0d_lt^#BCoJm8NVQDbvKYbzImWri=tGI6C+Jzo<8|h*aH;A4eD_|Q_IE>=5X7_Er$7ldg>yNc?u0<%`nkL3&IK| zm3m9lkPoV9EKrBeU}kw|=nhI)wBa#~br@cZad8KC8SJ)6(~^|Ac&-r28_3;iso@aW zii;&U3~BEBA|g4M=`6drZ>E#{zylJ{Lx!1tA2y^GO2utb=JSufXzL&(gpn9`$$>h=)a|DR1!vkN;kUsWd^k&0578?WPZm I@SY;^8%&}f@c;k- diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorThreadAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ConstructorThreadAttack.class deleted file mode 100644 index 3eb54a78df22ed757320897d444ff07c6ac9baab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1577 zcmb7E?M@Rx6g|@xTGp)~6v{V(1xhItEBIAJu?mv3!~h|If6I0Qt7Vt$Zc!e@XYe

=r0QlbX%!%-p#j=bn3Ke*OOO6F?sCq6i6$dxq;7m7HVm*`Av#+Lr4% zHQlqFtpmr_@~I9u9Y)ez_`*}7KU)*Msr z>%xe4V7da6rKa!~qUaWwZAv#405lv02_$6-y#l-GCIdC6b`_&AwH-yjK*tB|Sj$y4 zYd;t8uAmQtGWd`{GF`ep-l$oYxF4K#Ik%YphLoU~1aA z_l{|Kn;wgLSWqy5bQF^UUDuu&*#0D4tC&KDl{gA4SpO|Y(^-k$I*?o5WYL8tF!#U7 z(~J;18?pew$?3Bd6zzA1aMtR4Bi5XB>^-bjOeyXx4rqZk$hV&#*|mdoRb zr1UBE8!06zrnT=An#Xe$1uU{TUBfGDpUIl-nBEE7I=vQ9z9fCTWIHwb2!Q)h3k~@+ zR7)V_?X#E-r;SDgs_DAnx~VyVOtbAKsaH1bnxh*lro1eJ|G2@kk{|(f&9V%qSk+wD z;Pr`J_Buw{IbpsFK!ht^TmGZm6*&ve@yt15912JLl!6dC`0u1TxQgH&V%(|d;tHI7 zBTBk_UEcn>!!Oj8fl?Pp>}13_dP*1Q+nGMcKskGc;jd6j)0uA=J;V5^?nL`3z=>dVn}{n4|0=J@F0Pjbb9k z13pD{h~KF!(^_bRnBVD~KgZ*8wnI6?GYL6M%rDkw{)#!xxR;p67!gFMAjKDDf~Y6C znnD^GV#{KlxFl!uq@6*pun*UM!XA!2=tt|LNPsBQ6c?VUvvDuC&P-3QrFOR6 z4G|C;J~cKI8TX8yD5s1jRNSSq?IW%q%qKWu+;^pw`$0JFyayayCD%!uCi)^ibD7c? zC;i=XLeS&3iy%}5KA;kzjE@2#J`vVBb82b>rR6Z6j%4;b8KsgJ7?^RAo+p{|{wx^y z1qhq(Ox5o40@Ze+jlP+h-14@K|C_#nbP3ewxxFTYa%cAsAv!a8HkLn?pJnN_z=wWo zLhV$KQ)7ASU(#KgNr(+XbH1zsTWB$Rmh(q&4;D)FwU${gO{|p`Emo||e@ykdmyN9w zpAZWiUu0{@*??cMxBnN>-oeH{h`Rz+<2x$Q#FbxAXTMc&2`r((9#>%*D+NYi6>FR& ud}izm_W{4es8Vq2Z+ON^5os1|;w3v{E8}Z{YT_He0oJjJZMLEr3!BdXXO~<6 diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents$2.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents$2.class deleted file mode 100644 index 676a395b031e505a7758282d25e879aedcb3b12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmaJ;O-~y!5Pg$uv#_`%1PYYT6y=ZrVj)+mULq<*O1V&R;I>Ju;A&$_Yi}g}6BiCu zB@X-meiUN7&7l+wW(LODxSLyNCKpqwoo#kP z1cbUz4b4c#U86_JDWeG$cdKmklOwhkK-$sDLp># zwXX?5m)kCauq5ySl?Y{g6bP|QSZ~d#srHqYm-%EMv!BTzmApXT43qRa$&~kJ!N4y- z*n4NHW``G8Y9`v~yNSsyZ(D!c^gqZMfqFc**Mv}RwQmT~mC3WA{I2{gEB^|7;1^51jXRH*FM!_cjW@l_=d@fL1*ycCD4)^@RRy1Q_^A!l$mudh2 diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents$3.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/CustomEvents$3.class deleted file mode 100644 index d30ba1ccc48d2a86e6185ad993d8d5c3c9f4fb5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmaJ;O>fgc5PciFF>$vf4W&S6OKD9>0>aR8D?&&iNRiTBf_mV#aaO6p*+t%UrT!BR z{DfYR_>eg81Nc#hS(5_@r7PJxv-9T7%$uLTzW)HQk4}IJ!-kc{%1NB-v9>1e6~^jW z|4b@tqJscFL(_#4J&|!wt4V58tr)8IG&Rv<${#K!I3(P&RHgPg!+!fR;P9a zr_P^0`fdP*txLL!4rqYoNGPq&XSy&nZS()4|3IEFumSb$G-2@Coi`y`*a&c&p|w~j zj!kSa)TYw*mCUE-W$w%Bi>I_HIt(i#E0T9d;{Ck+aHNYok*`uW;OgI7d*q~KsP|Qp zX+u&TNqed%9DBG=w0S|>qsB;GK2TJwmkDE}!8TR#T&+gKX-!szz5rL~y++nCMSZ$? z_rVv0-G`gsz(19!I{m{E%_uWMgZ%B1i(?f{@+b?}uvTI?u4A2|3^#Cd&fOU3VH)6y2AQ3>~Kpp)|JGlC)-7piLn}Ymr*h(zGVhq=tyb&t7JxWEwJ)H4M0X z^OyMQvunA))vo0a@OSt-)O`Vge9i;s9_~43pR@12_pg6m{|O+EhK7(pBCwl*ZDoD0 z<^|1csnra;{nfVZ22BlNfmyX-dX}AiXtkwl+SZne6qvg2xK8juU?P>S3WQ6H(J_H@ z1|~5jFkNr-v;p zMGzB+c<#1i?iC6;rV&@oToTBq&Z=L2CEGIFkZwI&34F(`7uV8N9RhC~xQr_T7o=s4 zF~f~idB{u2b1f%uJhzyxYIx`D9`g}g8}_)I(~&@2!~EGv%MsiVIPbY-@5fcw_Uk_t z?&+9Ad}?KfN6Ak$d(%J)X@N<(YfFnKl6su3POY?m9!4x0xT7MBpyj(yTke)q-wjl1 z&cKq|2-l>!N2E$X`%E4T&WOl|roS>i{YWsJ{~U|mHSi(s@yxsyWpb%cuH$8&li7g$ z+H$|B;UkiGl=eq0r(xN?>gc|Kk3n&1bvxL0_NgAqY+c6+9%*)q&U5#K(K+LPa&kU6Dj8c~e2ewN}7f;GKR%9?nQO71e z*YI2*J`&4_E(2Sr@Gv;xP(r+Ksq{(G((whp)WC}t8`b(>cm}@0PM@m{skn->$WemW zP66K-_*R8R0^ARR>>p@ZE?Dy_c8AO;%HU%=YUHz*rGAm_!k>z|!*rQF5rfFLBCHjUhV(Plt!q-wm&EWB>pF diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/DecelerationCaveat2.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/DecelerationCaveat2.class deleted file mode 100644 index 490485c0ae8c69806b8a7ad098cfaf77f7c53cab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 586 zcmah_yGjF55IwV5HxJi$e8#sZNeTlIY!oplf)FiK0+u(s1Fpth+1vz63qQm{u(naK z@B{oHD^X|HkVe4^_nw(K^Eh+gK3`q|lrfitL0Hh-)a;hRpdRREX_p;taHzBw_&ci2 zN|%!`31boO1TL2^dyGKz0!P@kEPj3+t`9h6g?nq7s38ZcGz#HVb>)neD?;+S zg<8ao*%*(6B>9@1mS$^v{U$CXkSBMa(08nrb8(=qI$|=%K`V54&x_VR^FueB|#GGDLy0hD25>-5!1jZdd0SX5(N9iBlLHR@1&(6v9)3r15X$- zHy@BGK4J8hC^wk8|9Tf<;um2F5sga3qgId>ds5U)$%q^V1t&3!dCXy1-hyBmi?NjX hc!#x)lysb%6G@9*Yg&4xVSd0SYbaWBMgj(AzX289Z7=`; diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/DecelerationCaveat3.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/DecelerationCaveat3.class deleted file mode 100644 index 77e46e5598b7a94c1e6896a2ef0f6cc5db8ece8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmah{O-my|6s(@aNz9Jln)Pe_hSewr^r(oU2twS$x&%CSW**pXc4nD$g5JIOKLpQS zB6wK#><{uJuGLA{)4~o+zxTRcSJi9!`R(Z!fGw=#;3+IxX;_KMX;MpUqkJTx)Fsu{ zB=MnciMHE0WEF}I50gmB2T@DMp+sNZ0R?~8#K!I^WLDRz3fV*U6p%rGfIj#NLlqOt zm*$U}q~CO{E()WSB-Hh)PK~R3n^}8d8Vbvm|JvE1RN9RF{c}#iuK-d87{jXybLxicLZj~Q=-YmRl9Q8D(F9+7`w;&Bjk zU|<3tm@DJN;r;qo?1`zImd2F~skE(Fe z5*S$Qdwzb;_I<71J^+j`@Zb;*tSqgZB}Ql3mdRMji72fHm#|aUay^sDO-&Md=c-Wl zg3viSo)X+k<^puk579-B5T&Y+*VR)d&7H{Rk`Sjl7xSqws>Yk5YadieI86T?ea7~t zDm?5GhV2IOHJ8s;>0-Uh)ej61p-%{Ib!BonQT5PpbHwSRco7(a4f$Ze;TP}8(PNZw zCeGcHCHzH02OMh}h_S^nTsLsuX2c)TibstZ;J+ifUt;f*c?ZAx!5_Wf>f@$s{~Jx5 BO0EC^ diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/EnvAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/EnvAttack.class deleted file mode 100644 index 8cc691f56f5869502702bd35cd46d136b24306f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644 zcmZ`$%TC)s6g@X_5;qtEDGd#;iW10UQA=GRQ6UheQY9A;c?{F`A4c@kL#; z0n|l5px?oFK<}gxr9$;$?!)KYbLY&jyB|LRyhW>k3}ME|zLAlylWt=A{*D@K86(1P z1vrF??S@Gt{jF#qR4AhZ3nS#;#VR%%glwbPAvoKNDI$w!9&*SNNLaFy6L4e-h^-Gm7mb z)uH?lTe~J69^#E%7)#904u@wrV~_bPaP4y>j=9z~+)GX}ydj3afhmk}?)?F99OsHh zKadrVwB&lZRGzxQ^DnJwRIf0{;nfwE{;6u;?{68J9gd&n5kLhlW>LZ%XY=gH0&1u} SlB|y;>q8#7tkvK&gXV7sz<)#l diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/EventPriorityFilter.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/EventPriorityFilter.class deleted file mode 100644 index 88d8192b2165d0571ac209a67472e3ae378aea5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmaiyO>Yx15QbmpJIl6Jztd7kmzFjS&;_nRDCJ8W0zwH&&(5xu7`EQZaUyZ!-*84k zLE^v<;2&`T#+xM#sDeG%p7qQ#?~Lc$k1t;V+{e8lG7O#(LnA_8$GzAL{ikE0%quNp zEzP@UGBQFJkz?4f_dy&A|0Eo96^O8H0~iVqq>|<#L$-F*Wyn1y9|u{KUF1<TigJO5J2P>$7eX-;_*F>KFOl>Yo(Orbe`KkL{n7q@N47R^YjHV?UO%l?3JF?ylR zi+q1DY>n|q2Z9EJ+$xt0%dxE&9`!AoB=782B**@)z_I&*_N+0Qvq31(#4SK;V zbatl>v@eiF0%yS|gtWmiKVOg&Saow7 R(u`KZ9ULb#pW-vP`wNziy~zLo diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/FairPlay.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/FairPlay.class deleted file mode 100644 index b329dc70994c74f11517a3274eb24a9c48bd0e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 941 zcmaJ<+iuf95IviuaT;7oXqtw!r4(97T&SUfatT5dO5hI>+ zF9z|z2kr{Kj>%%kKbA`BCk)woqsx$cPB}$nF>hlId4|QdRN{3!=!xi< z_X5Fiu^oCm=<-OK{rE7aPvnrH+WxzSCgDf1%76Spdg&{IaBM80Of^HHkK;&nc%Mfd z>7QuwBv%BNs~;Ls=R9rZe(1TmC+XObP*fav~Y!?_HQy9R}D#tNS+D066KG@8|WkIJjwHhhb?#9%~u6Z)q9YxP@H`sW2Mwpd$jVxMySEC3#%z%Nn^={TLnXvu`dxu%pc6cJF<6pWS_S_xSV8t3LqDz>XrM5ci#9-zlXk z-k#?lr&h`b&Z6(z#b2TbD-6kT(JMKr#nOrG7M;?T*eP`0DZ6F=YlRMTVp}1cp-l`O z=r#~Rr$Vn)cAfR=;hs||*n0<#Lciq|?SpN*QkM7NFzoM_j}_12$ibaxv;~W z`44eRtiS5pX@s?5Cz(p~N*!zxM61R^HjL1oNkJTxh&r6j# z`zT1I$8+;V+jW~ICQPeYef!PwiR1d|iEY6gGw_L&8>=u#oi{liH}IJppLHJPU1{2qW^J#@a z)6#wiw)-?ihqC*WX?Eia%tUcr;iIGw>yD zkvJ(*cRU-zJnlrn?p$c3+U8~8D{wR-M*<|x$qHL077Q#3Es^4ZckFbNsF@g+uoA_x z!e|3XMsVHpSG=lQTK=`@9QkF>HSi7YbF4I^?p&c_7dck(py+qoLHSk#TuBT2;7G$;FhsQKxd9PY2I#M0EZSDTF z_+X3;>d+e%p~ki5Gs^cArJ{^XzC_mxDj}{V^ffSybJUHx0p)qVDfBd*_XsJ@iOB)< z*3d^WSi|s{w@asQ|Dj2Th8<#LV3d(B6DEN{T;U#%w1r6oVMetN!4*vtd`hy*lp)G) zCVPdyPg@E1=<2Q_jL*@<@sz}e>c#;g-Eft+0>M46Ln`^s3FPi;m^=N%Oj^GoHC4mS z8g74BqtV?{j9XKazvEsFnN!3YdiE4XL$_Y&)aG!T>jBKMid8K)Ikt6L<}|ZOQZ$VL zw&XI`+{AT$*Jo&dgZnv4ubWum+a~vSi&&44)0N_T@IV@P5H4_MqhY1pKtqL*lS zYFk<>P!oE45q=)U(pnU&{N=jH13z@U6srGaYBDdm*Lb+o|LsfcSW|s?Rl_5SzeRM^ z^}j^a@I9HxC0k51bYY^Q2TYil(oC4FM3^vwca9 diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/FileOutputStreamAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/FileOutputStreamAttack.class deleted file mode 100644 index 11c9c1d91c821c74eabaa7e74813586ade8cf8d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1214 zcma)5+fEZv6kUf-nNkLjd%0f<*c%iTZUthlixQ`VTEdn!+QFe@6+_nxZryPH27L1*W zQ>r*=$2Rnnb;r@OA5|y<1JWgH<&5}x?o=;kjodpKBhb2H7ENbWz!M5*1eE9W@xy~Q z4PLYgbS2HAv0XViFzj9ZpkN5}B(1Do$mq5y?{!ddj?A*aT=IVyC0Na_6n(hEf-=Al zrq$4kK7sZ_!`aXsU5XKy4keHEQ$1eLi-&QlGK+_aa1AmoS8zhbfIz_Yszc2^@S`6A zsbxr@yPm8O8O})Sh=x&&33$(J(_u*^v=z>@kqi_i+YC>egrYA zVn(31!C-6W#iy)Ma!jkJVGeiM!%{7R!`QX;ENcXAnKWms5ejRF$kuza1*^S4zt~-|9BilNw?S?;XRqU)$o85>!nyb|IaY4$!6dUZ}Dg!Ni(b9gExWBMzHwIl&!={A}Lalo~|moli$$47rn$_DyCF1 ze2%s4`N$WHS1}#Cf)=YHbPn&bH+qGYXcf`-=U7@+{x$^i&b*jz$RYvz7HKao*qa&d3pnb6d$1HFm;Vk-6+v9{>B+Q$xPGC739}Gi$~m~ zRZL)w_y+M!;wj>9iDwYP9`SwRI`KU5W8xMw$bLmwfjz1Bs|7{eV@@s$3V47eau|aT z4_U*5$MoEWc1@B49iWqj;^gH6jTe;dK^=;mf|EE z*3wYcFf+On!4X;+(OfN-F&sVZ+Rlf4u_&rgCxO?~Xp3*PNH@_s6Q%Q`DjIQ&>PxyS zEsPWlkkrz;i$x|eAuYb7B8DcWN?Tjgt&BitvFXW$6}nI4^@_aZk$NVMt9Ti&2t-`l z4@023;HpT4vM151phckSA5x;CO-81y$t;;x1RVmZmxB+owyVkb1-ewkafRRv=LO}nEZM?%hsL@}9l*RuImjA9f?*;eBM75P95 zQOTAX#iWWUTowpz%BkbsGCw3aDZH&$Ke(8?tjGKuGtPzVqCm;~5NjxD z0_FQ#oOEZ==I|a*{%0mQ!ouKhls{V98{DF}D09dQXIxwJwu6G}3RVh9@ai+Y?AV)r zKSon_)=7Ig=Wday-`!kYvMtcWrVDV_0VVw6QsSxb73VE@huXFgdF-*HJS7{bMj21l z7vOz}FGgNaF8K{XX+&IT`wEAjplYtNW*fC_IW*+(Vh+tYoY>{G`<%`kUiCSZ-QPr# zVq8qLRrciY+W4+yf|4CM^ye_-OY(7X_6bJkI=1oFMBr?23uT?{IZS*K6g9!{XFGpv z;Z9$$J}6D(aHaDpYUt;kEtL0#>%)0!$5T9zmLB5XuB&<9RUYdWZuW%^RBrN>8xBye z4}JH4RUfk+{kVmX+3ELi9}jr<<1W5ux}V`WenLt_MY*UTJpfsrhd9Br77eIFH_u+~ z;slOSi-XNtUq>_2T$U!~9B#u+-nY<-+uVJ3(Lpa=^b^M;oWkcggD+_1OZ3oVJANep z8Trr2|C#(>$p4l6-_auiI48nfm{D|za>PXycVr{?Uku&iB>4kGB3tGfN@ZK*Tc(#f z?-G+hLIm+1-e(W?ixOy9U_3Ve#L~#Hm2Oi@$0ENT<-fv2;M2nNmH)yLJ(wupVQ3)* zLcy|v0R6Lsr?^ zZbz6qoe_81qVq-tF~m14$C8^2(L%Aw5Zk2~9Z}30m_eLju5LNvrQdG}?|`>#!H}xE zZEiQYXDK~2#^ifz$gohKT0({3J>Q9MC#YKbbP$Yzd88SVLm~GpPgH%|7F1BWP%GAt zs-0LXvy_lEuz*EEa(xQR)IabMH!atE?OBd&NKf#7MZ*OuV(hWG(=*9zIlZcH*&X32 z)=LI1;|hb;6Y{|7Q#;i6zK%SuX;@-7cQV(&b=;u%5x0Hus!PO${o;iC7(+!z4!6|E zZmWpX{$ewMBDwOt$x`yXD}|TuQse7+m3+s*GFE6Gd@vABhhb$J$|>NmHR5M54cx^& z2Az5fcRy~grtr%O|2_>sjrU}e|50*yXy6eZGbE%tnVwq7=@epI$A$)4?fjHY7Y)6&1Wnf!flqNojwl8V)$%f?Zk1zNjJR-f}`d(Y?S?bJ;u!U8HjwJ$!j&CPI z5?v9s#N3aw(0u0O#M9z9RDj zxp$=i7r)`^A#SD$0ZOE<23QO5Aixt+Hb4LUO=;0FRSGeZvq;c&E@P2akU2(M4rzDB M@kGW@B{72Ce+~%N1poj5 diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/GunTurnRate.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/GunTurnRate.class deleted file mode 100644 index 88a48cfa1fe1a579f8c4f561cab2d754600994ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1609 zcma)6TT>fl7=FG45(r-lLJAaGrP@Q19#SpXmb4XUN-2gO0!>ezmh4Bm%x0I_>@vM@ zMrZU!ue|fZ3-7%1qBFYf=!`$WU*j)ue7?6>o<>68 zu&-LaGK-$O?)t6b&A?d;Jf~{-Dvch2Q7x~#rYg>x+lEtDW>o_PQdca;@~;UbbNQM; z&vjxlNTOe&7b$_kish)=L33SsYsR{*1coba-LPwhXX$$^?D3ykErH3(YuzZ(gcmre zxh%crUk0R-7(rIxU`zQc#J*HT~n)rF2r9PU6hjsaHGhOb#BC5~uUN7XY` z4}3N6nB}0k)nU_+HznTE+JiI{Ygett(@6c8#M}C9Ab#u69+x3aPp2u1|T1 z0!|Bz6ESaY1}&dnExKNmT5U!L@;G199-NgphoZoNhSI1dWtf)Jh|*rx@9#>Ml0l^7 zATpT7`)SMwjO>&y@GZM|pG!;PA}$F`IIh<;?5eU2-`Zy24O^8}!&8d2&^avklX_O7 zgex@V2EM?d%BHbx6fL)S*Rvdd)%TRqETzE~7>izP!)X*Lrh5y4Wt+;={>@3uV}btB z|23=0K48NvXHdps8aD)nUe%Sji6!E<4LeYGHfT7voNwFSWucV8RV?dX`%okHzUOOw zSP@9fPHE&FiMzPRt~Iu{lw&fj`>E_~gKpbhOB;&YlB z$5@DD)PG5yIGpY z*UNpT5aP@dm-G5?s__yRmJ7e&^6$9%h>{Op;`$5R8m@%6oexnBaX-YPZos1v$u+KX n=w~P+9L8zfh>TA~eKHdp@1@(HFfg_#1O1FAU2=miB(VMujNVmA diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/HttpAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/HttpAttack.class deleted file mode 100644 index f4f7477f10daf17d829bc404dcaa59b621f7d00e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmZ`&+fEZv6kVq+OsNA%rQ8I$h@~ykk&8D#w1Nhbf~3?MpUf~lmeDfPOsB-p@y%xv z1BoWaN8?8s*O^vZBtG<%E4Ez>qRqZdn?+@`>qKvRqJc0zKQs;{Kc5)>c6vo_}Yam`2rfD#n5D*-m9mpm)=C z>b~jtC9~R)QS=B*9kKYT5kRS$*}B{CEcw>;Dl+Rx-w^0tw;kKx5D2HzC4tB$!(s@d zPe%+_1p4!~BljA|hteyWhgGS-UCXSNOwU&DmNDWV*>!=j{QrhygJG}XXh;a?LH7#( zWg#EKAchs#h(IEBd9ZXzMU3gVj&XrLwPXACU5ALNbTg+_uI*dXaD)E8Sc+)k zwF6?9z?6<@%y7(#^b4|HBZX2?5b&|1B4%~mLXyag*l}tNpM*>ESYY@Mvh5ljjJeya;QQdmyl&BMa^!>^8XML~|CV>~pIvC{|p=vWBJ3iZ7mhuw+ef zpkoDhIYF(NK_L}A)8YgpEjItDrqcvX&cfjMp{Vv$*a@wWXEX^aY~O}9JkoLxW= zxWm_OQz`U7$$ZzWwL}v;2;}(OR)Lr<*7FVFn~B;r15X^IUypnEq}$}>v;4WL;3kLjDE+&?(H*7 z4&cW}jPl>jy@fN(z4`<_KcD#wTJD?%MUzN#J7Flu8TJP1RLLfeNsMDksS8QWB107| zVJ>KAh4T=y)lQ6Y_i&%p;uQJ=Jmh@Sj9A4Q>trN9v6#k}N+OjNnipZ^kT-t&x;yqOZipH8s3~g%k-*k77)iO(VXE8nzzex-l zfA|1ChtHv&*=~R)#MmZ#_RM_eJKwovfBydd1Hc9zWRYT6P$E>qwFAH9tI)1WryaRs zhaZUWkUL^aDeipC!eAKJ5XX0gz2zQp=?HgM$1r3bdeT#m8Pdg4lfigO7!zsqTIfNB zVX)>&u@fD%M9|=^wqO{k`3`S4dEjY3IW*M17cwl>{zp-TvIUXMY`&#h=x2ghEsSD} zA*Z51*2Er3Gm6`#W@dBY95i9!ss{D&eZgHFHf3R2pBOEwl%c<_D}Kcf6IlbktUFxF zvvLc?+F2(q-aI=JQdLS#%{gabJ}zB$HE9;a)tRxc8xO zqQFz1?H8Ww3c2MtA`C5*P-f_J0>PEojoN}5StwSk)$Nz>s-^Q(Pq#5y*zxXCaYU$?n@Z#VV>|C1h`gv=L>Nttyw}9qBlm(4w?E-!p-!M`wfe4j$zeS%3rW@3j2i6z%a&Ws+|f(C=0Mm mXGKz9#tc?3{e_x}Q1RN+o)+`u#-T9VL^$u5)C)-_kGoND^iJ| zbELfemU!G1QY8>$u=Q!(ZwPm%(dDu(8oN52VQkZrp4wuF7E3jT*h7j*BZ`!TIK~*p ztDY3kJBRxsc*P0HkgNK2-m3Ay)9Y|ErVhL|L!tT~F=e_a=*T1{7_6tBdd*ucqcVvc z!{lC_OBrf2+i5UNS(t{+FwqpsY`zFQKk(FhhUsGUE$?!-#bwjoQ-LR&T3kz6ei1P!%8{|vzk+vtZr+EF{Gkz47o%Q9YWO|HZ zb>Q^qiP2py)l$U1Y+)HIWQ53 ziHVwYO3f4ygqb%k)(jaf!ZK+XE64p)u`z#!{}> zgEJJEHYdwSVa4F=eq@N#U3vvqiNolR;CjfbkPOYsII$jXkj^_j+#MqODp$#zHNvcq SU^4@32KTUKu=fcR!S-)~#PYQO diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/JuniorEvents.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/JuniorEvents.class deleted file mode 100644 index 35170da373b938d7c34e1d2e10e4f24e07f34de5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5577 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 JjCL_R{||rbCb<9r diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/MaxVelocity.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/MaxVelocity.class deleted file mode 100644 index 88149cf5669ab6a679f6a51e934da5f1a5c744ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1356 zcmZ`(OH30{6g{sk9jGHB@-HeswN#;sf(i%)fe02+F-=$w?Gs1K3@KBB8`myONZgsY zFuEYoxG*urXky%$5F;@$Zrqu;GjZdNNQmc6D>kBSPTzg++_~r8`|kAJ=F8UrI&fKo zN1)b`^NvhL()P6N%tywJ#kfq_3Ddc$!6#6q&J%W0Mh21#hLw=X%gRx}-)mZ?(_)kOHY1%Y<}71Ue5`~_g^o&8ac^gsTV?FJv0y|@J905?TF#`Cmd0$4 zh8lrtmq{7cOoYd#H8YqoQ%RW)pbqsKf)x4NL&sk1qv(Q>%E*bU3?CY8%_$Vb=?S13 z4XXG?<*}V_jTfU?z|-BJJP+tNh(m0nF*hfzq(Ixh9@!QppDo1%T6KhRSYQXc@%zr) zjtnV*HYLz5P#+rFp6s76)i|o-7&-)s9Xr<%b~Cj75lWswmxfM(J^$#gj+3fzZB8{j zW%;8^Q4SfP67A8^i!)T1m(IX7X|P%!vx+OOUq@7N8o5Cual;=id#^rgiX750tjJQ5 z1%v62PPwt+f0J8XmGe4cYVb684;rbJ0~3mA2;UmV;7jTGwFmJG1Xv} z6~t~=wV{#XUN^Rf7U!A28ut;df@@KD1;x*3cqk2*21>Dmww`m~x|2KR{`+CE3LpI; z0^uxn-R=$U#_B_~gr8&2D^yPfU!Zmc`^%fMJj)`K#gQx`SsV{OVVqBdQc~io_zEIH zgos(9m$*e-ByJN);vTU`JRKYP>{SK(R*81hu#P$`A&9%! z$6EH|KAKodGajP_PjQGfgs_6ctmg>cq7AD!iVvLSj~vv`=)@Ov;VVw#8@llwXYd1k zSVuoLFetnj78?Id)Qwf;ZY6(XejzZ93+(g+IhD-@+Qd&xm6VjZ-%>RUs?Q!=`UM3K BB2oYV diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/PrivateConstructor.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/PrivateConstructor.class deleted file mode 100644 index f79a141db22808148aaa6d1d06856996ab8bf6fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmaivF^j@L5QX2wXf%4KXkn{XYGL3kPizFMAfjTwi3{$bS=em+UsoMmaX;XGlsJoa z7B=sjH!}=x{;$7(06x$P;1POO=2jjeqZ4iOXl>L*Sh>(yZcUL|Z36g&cQ;P;K}H+5 zN2ttHrtF+h8jkh^f5Ed5CDa-yqe5uLDwC_?oJg}1$w?C0u};NlFN|{j(e&+6<%B`} zD#a%u-0H%la;e<4?sL$|m$(S@!I}6!Fg=%r8L*o&iCG^1p!&^)hmbX70&V!{pw3m} OzQlZE$B(mmXx;!*SVunq diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/RadarTurnRateAndSetAdjust.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/RadarTurnRateAndSetAdjust.class deleted file mode 100644 index e314c5cd612d194a881250f2fd7b1b1fe61ea57b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2151 zcma)7Pf#0G9R41E5(q04N&yS4P-#ih(pW5FON*hTfS3a1Pb#zuOY#Vdn+DZe#haskZ#My2TBn!ye*1pk`+k4lZ-4yf z-gf}{@J0|70zHl_I5HEn^DB9$5S!66x;^LG){O4RVJkB$o#D*7TX2G?5@=DVbUq_v z!3LEJ()>gb~dc*)_UZ6;4D_ z3e=*ZRr%E-w`AJ&B2BotjdI`$@}!2til?E(Gv-b% z&yw(ONl@eo4VN*>Y-Xk7g)lDljA3QHj!7uQxP}*1NrI)4gzyrs1d$XtxYKp6W0OF(V(F zwhhafb!@5U27{OvX!SIvZe?RUrhAuM!^}uq`FBmj%UGa)j9|{lv4z>|6Cqs3D?!{~ z$sfF{;Z-aVzp0z9oLZ&f@I=J7y~n~}2y@WYGg(oH{rX6%1{r~h^PLL0sv(OtJ~(}2 zLs~rVeb|+KETuR+W9y3IH8wHR^S{8H1`BzC8Yk~(L!ddl{|ZT8MY|mj5zwpX>?i{LKn+Y=`~v=B@P;{L4L=$ z3+~m?JE-}JLIo!SJT*{{I?9?4;Qj=^_$JGjD?TSBFN^JHGa8C$B*!6NY}*yvcg3T- zV%M(N?TM8|^ziPSp6|P!|`wi^Zd)*pmv#BiRZD7bI9X7 zHZh2|Z~?b*5g%X}AM)16wDk!R_>^<%GmPR3vV6%A^bL}@hb#D=j6YxsKVcd_<0^h3 z`>#mhH(bN-oD6?p0e@i;f8#p4XGv6JS%jdA1~z{S(&7joaW|w0!w|h#7kzw!12Dx9 za^f;9k>pF8MnTNO5sPre5;nyuZi*bXgoACdg*SH_S8SIWw?h5K*siMU-{T9Y=H4GI zVq~1lm=b!jcQG*${TkEXVs3#ask>ObgXN}l5i(MQQG{8<#!k|iU`6sa*ITH?yZo8n j##y}Y8SnI-TYt%THPh@enSA#+hMSbs%h}@X3T*!eNVL^G diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/Random.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/Random.class deleted file mode 100644 index 12daa16c53fe68cac61b3670be899752d9c770be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmZut%TB^T6g|VEyov-wK#UJGDxk56Ta6*nxB?eoNL)_oKr7IiGO+ezwQ{Qbn16!)TijG|sjhMVQ)Ecv8{eg}{m5HnRrs&fp z(j7@vE&i}rDcSL+eotIGYU$Mch9^odDl|GAP=^T7ndpy^Z;)kVqxDzBp9zF$RRn1u zixgpfUO+ZY9v$GX*{4CO*{J7{c|&&if+E39kr!RW~gCLRoD|0bip*`vBeOs5luk|^C}{c8IpCU zXYUT4v~6$CYfv3SR-*@^9M*Y7^uF@6WpeJvqNH~28sFjKn&>3QV zo9_+0o)AtN3fGG*d9ohx+fvg|6kUh5BrQRpzcW%Ifl50#<+KAxC~>(|6?goAE#zX=w#?T(#|y1)T{%w{E-Np z$Vijhu6ZeRqgO%?b#KJ1nVRb==tDn)e89a8gPT=`>1?qPQ}!IgIw<5KCMQrs^}`D( z3}RTq5JO)ht0_dmb&N2yyWCsVb?&-`Pdc7`m)jNDV+wBICgCIq3=`4ruPaBSdsFw& zl)^YBB;0Ny9rzU7K{jCIGi1nQqxgMeLB=FQ;*{8V5~iBU1e}FrGYVAPWk?dV688>m zl4m6fFqG$gM4q60wBdysK?PE5Rw#C#q5p5if*2VO7}_?uY1(6ZwqsUB&LahnF;DYl zSZDSzjm>-%NvKN{$-mW0f}x-wjYWo@0J~wUZ-f}ch-)VVav3WUo{)GAkn10Gek#^L z!7858Ecx=4#Y*frnof}VLr7Pui9JZ{2jevm(dt5(V3fqDR*u9vG+Krni1kUR|6s&> zksm6{zz9P~$X|m?#Iz>uKG2eO8ZKC>Y}Xu}Zx~_)d$zCa_>90ngGr$1#{jg@8?7&$ z65UjKGI}N^zd}Cu-6=YS8|XqCok|cu&vv>oT)RyEMQ?GkJx_O}yXwdk^YJ0 z(o`L{(z*C|bia+I^W{3Gx2DN^Z+ePs<7As7+rz!jP>T7D+I$fF=55F$fqF zNYdE@nRdG!{m5W|Y(vOn7z-GoxKV5nHvw~wSP_&Erc86ThG$eULtC^?Q7x3&P5w=) by-XEf;3auqQ4aknKS@}Y=~|>~3rc?gm|;rP diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ReverseDirection.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ReverseDirection.class deleted file mode 100644 index f739e851974ddbd29dca848719eb28a0d6706328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmaJ;T~8B16g^YQE-foqXb}VvL9yKkoA@NbXo!tZ)fg~+-|pVPn6hhTXB&L-!Cz!z zYT|=Gz+d4{@E53ODndex^Dy`0+;i`lJKuhO`3m46c70S7)~ys)(#Yh4+!oQHjKmbu z)kYGl^UOz8Vab6>o=S9(j^Zql^w3o+c#n0a?GuHmcBijUea4zPrceto4Nqadr!#q3 zo({ykjt4_gSm@tipJAH>O1-Rj`Ibtv3v%U=TMB8@`S_yE|3H0SmlF~|zxwQbdu+ABI$)~k?Z{krL z={$O6bY_pNk@$4qaW?|o!KT9OvDm*oCmZP2aTnV@?kOz(gB;+#Q{%sN{f3$M^!wx$ z@P3`YN1=X{mnMX6QMX2qvO)$~80$vW>MvaZGQ&WS3 g7U;FG%8%H@GCEkn4%YC9o4ypZcOmEjnHB8(1~wsu*Z=?k diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/RobotDeathEvents.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/RobotDeathEvents.class deleted file mode 100644 index 11a743a35c0aa8072bbc1880e7133496e5f141fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmaJ<-A)rh7(LUL7M4X6Y@tO;YZcm6*~D9v#2_Y`DhU`8yxZBVUR8BaQ%fOsWf$Uyeq?u3It(eX?m`@j!; zwJngYHx8M)!+Ha0%$b;hAu!+c1NmamYsu)P)9Olrg=XkF-9snxwLNlXRLAcNRGRolUhJhl=TE&_`zTQl54pig^?XAY4Zlh}Arq-F0r_voLsp)T- zm_k-y?m#*2o9E8)NTeAC$>0T6>&@}R6MwuAf^)naR_Wg<;J$tMUC z5pMDz97L{s;_IE{FY)&`wOmvwCe6Pn#gB^O7YEBb!wC1wbC#CPTkxK;E?|C&)2{H$ z#?D2|^KA|ja23~R@h=z`zl*^LVp(6X`2HMAA5peGV<|R2oMG-8ibo487g+s4SB0V4 z*`HsUCJjwf=CXlh_ERKHiRTJxSj7fkn^>Emw@381nLmZJSxB>!btVpF?9iEFXx2I+ zy&>63BF2bA+%>Vapu#Y9gvcV)(IAk3g*zj_ZRTjetd%)O?K0Ln={6>?vSX|)vF^rL J_gJ06=3jW~z(oK6 diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/SkipTurns.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/SkipTurns.class deleted file mode 100644 index 436b949dd2f248eb6ddceff6bbb0c756649a376e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1733 zcmZ`&Yfl?T6g`6ATPQfTur8?Cv8`YxWm}>0@gWjI$ z3Jm8yqMO75PTkUQfsm(%t~ieEM3591aShLOADOZ;os?E3Su#AYDwDOUG+go@#U;i6 zQ-Q(BHr090F|EhhR55&eoWAfECHKoZCXo_|c(gnxAJN(1rPp&nySfrPG0Pc zVu>-DuU=jNi|X<4YX}-=HW|M=(1`){Uickij1P@t4_Du?LU0~TAE7rLc!~b>Ys7Yr zF!&OQ7tPWkjspmCjB$(;>K4Zsh8fXY#rOp0x#BB10sg}W-cA3C{>XE5zsBg!z{Mks z9jD_MZ(zdT=u#U;NFS$r8<_fE@Z-5NhyVVE| z8TT)u{6|XGO6Fa##%HZ&G^r>YW>kZ@%G2B{gH5dBEG?%jt zY)`#CM0o1$@e2ZIn4o)k&a;>!+#Ieq=a%~uqy-AoD5@8$BzKp0agR0Y^gBlrmoSgb qHqu$2becD|i0?>Q`96s7-x$#l>s-{3k1T80`HNcu-*dAAKl}$P#a$r) diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/SocketAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/SocketAttack.class deleted file mode 100644 index 50cbb72976d3dac249af1baf71457a023358b049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1613 zcmZ`(OHUhD7(Le>dx$%!LwG~dJV=TSIMe1yZAuFvDWv9+m{Os3GmJ-MiZf%4#{{Wr zltmVisw}dI(#H>A9jP)>BelCM`lCwEox%7PDGT3k?mge*d@uj=@1K7GxQaC$34!6z zX@pMI4E#+$Y?u|_-gd&-FtqG#9hyMD1Z=SWxL%a=RmQKBUs zLjnWQtLvNdR%k7H^=4QJ1IK!l!3fUkIKyO)*%|l<=LA07azaI)p4uVkOaV$64B~<$ zcu`<57qd8~l3&+xi6q-xRs+{lczkSN3^_7k$dzVz#8LV?Op6Xxgh59!E`v@840VG3 zPe+!j08_^mf!=m#Rl~q1vZ|@afg7^FS8-j(HHD^l9|`zif}U50?Xz=DV0>c#qFOna9hq{ z%C7khG9SSlXQ2^I4I8CQf-*=PwX|Jx9gkGI6_t2c1QK#qJ2@!H(=y=`>_19Sts+rD z!ir@lJz^&-a^IG$dbAWe?zan3v%D>H?P1_Qj#nsC@tc9|+;!zXb*syIMK%u?Snwpb z8%Xerd&pDg&7>5RsquYuy@}uqPYDA(_<*MoD^Q-~jkDc0PMo4k>Ew4&7E5oD-RK_6 z?z21-E%fp}xG~wn@IKBjzs0EhzPyioQ5({<7A6ZVeERJk7M2U+f8bUNrHOYiXgIrv zR53mI4huAx-@|M%y@%;y>Nsq~Fm;Dgf4?7mgDz;8LWzU4fHGDnzrhB+r_?YHi}bg! z4UhK_yZDjv8J^>3%9nVBUnrB1C3%8#Jo{O{0a_08e`Ex`IE(Y#_yW&stnm~sQh$_w zFEiR0wn~Gg zRX%{v;G!Z1?u{b$>lye|-7^;0&Hvh%pRm-qyU~D1XVB?p2_R=%%X$wh)+?w`YAf>z1re zMuimm8pGk@R)(cThQx&5;5}g2Zo@(PztPy}#{q_v>v_B#Vy|wEsTMXa(4y&h zzVrg6xYUlT{T1OkW8qPinlE!zN#hU>TNq#{{kM~iJdRLTg!B|&q0nQpag*z?Th$&y zG-zW8!zB9wX?I8E2;aG*gw*qzSg=yDaExK^+Js3hQEkquy#iio~$1 zxY>nlFW{1eiwrx%k~e~}aoH4RwG6%{4Yh)+7DhMlIwHS~Yq(BC>&_%n{+Tnb;;XO_99?)ggS*C|X=^M6TsH{2&fq-h&BkzOOpX~X2IjTyt_#7kG`6l&yZX0KGx zqSZ9LwJ^spur`Txzo%Y#yrqRN8DfI^$*T0w66V)6^>60H?(Oqt&FgNfyBw2SQue=A z#tfNZ(a?ZUrsw@Yd3;)!TcL0L-Ez`kVX&)Gay8L(+igy3nfi6(5PON5^lSsmX3fUa zl@&+Kge7f;q;n+2=uDSKKEN)oV#hm@V(6oHl5BuUd1yMVz5)=PudC$QBeS{v8!ow@~lTg2FF!krv3nAWfD>R&oFDeKNg_;X(L*h(~mq KPSgHVve-|iHivcq diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadAttack.class deleted file mode 100644 index 380d973875e48f1def89d473386489f4f438360c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2124 zcma)7YgZdp6x}xoOh|`EfzlSR*b+1ej}Z#BHAo4M*60K)Ae#D|Ohy=m8P;Ti_J{Zz z`qi$b!6j??1NFMqOXFpr z;z}0;`c!nFQ=nJ39c!a`P_w*kqqc7e^y{u^?C%(!E$7i<%HOja0;Br*(UWS@YdW3F zRjS2bhF)%}7{-V|+HZP}Zhc1?Qn|JKPUmv=-$P?6-js(rj6F&z&F-iemn*3nRTb#o zlIm8B!-!0e>ui~Z^<2&m|)U}x3k(fCZd87rp$T3WpT%A-gC08@;)j1Ne zq@9fR0#pU>2#lXEM>cd~c^PP!lexMpu$H?>zzg=;XpBa|0`nK7eBW?(qY}(u9`8yw z_XV!!!U_wvH=B+lGa2YGkM~p*WyBo~-|&1{3h%2}!b4`yZ8GRgp3%Hn$Lxy{2gK4wK$o}E^Kj!&d+n>-)ajgi~VZlIcuZ55w_ zta}=kUon27G_Gg+&ty55Wqr-#bBR$En2BSAL<6tI82?yG1QPx(GZx#88C@WBZPr(kSDj(Xe#19~@9bNAc5$}CUBR)haEwgh1ZwpdJ-?y%1=kX|%4bhtKZq31 z_F@qITvJ0E3~(;7ueI@N5#Cr~5JN58;4s?4tuwRR&tLsbvt$52L|R~zQZPbSql9{c z&zmtfW04!#u>!KJTf7zVU+0+MMi=?N&41x_;^QQqCB2CNaVR_-A<_)fm#4%>|6U*QaG;u#J^&a?X#=w*s~ z(~L}GKb;L26o^jjh(QM3c!bA98Q}T{D3jj^nS6+kxF#d!H}9!}QkolVlo7?>d04_M z#3}04{*7ZisZ8}{TG*15r^xxUjp_g8oWo?B^Bn>cjGXT=q4ych1Ntr^hebMF;^kTn zxX%Z6>%S=)l+;yirFZNWI*;z6#P1u(tT-siLat4COAs@Iw)rEFMJ6Lt}|F% l2|O~jH2E6e{Kw=>szZ~zrzQmYHh?ow<0!u~8viB|{{U^|$FKkZ diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadGroupAttack$1.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadGroupAttack$1.class deleted file mode 100644 index 7f72191e4a25d17477461b37d4a2ea6b307b4233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcma)5(M}UV6g@)=OP2vEVhf@`p=w)@QdC4i5<}2niW(u9=+ksNfyFZ0%+4BL{TiN4 z6p0UhfWP8{KVZZ=+a^RHsheze=ght5p1JqTk3ZkO16aVSgD!@gk)e_GvJPs23Cr7i zT8jEp9YoE?#t83SzTzOsklq*XMY$o=Zuv!RUwXzt55v$Y`YKXN)EbhZ$L#rGex9hS z9k`b%c*R$~S!Kuc3U zY|?lO&x$(^?lO#@o^wMPsddyOo34NGWYhS8V(4qe2W_`5drnWQaWs}KYvWDPY){_Z z3L@>vC%*M+=A7T>Y+bU^y7C%9=&RjLY4(CT$BOk>ik#587YuwuDXG^QA`E4SN%CZZ z-fpmT+FFzDSQou1xP1&x){MdEE2Y>B`wJitTxCdp~bctn5p JpjI|Le*ymj5kCL` diff --git a/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadGroupAttack.class b/代码/robocode/robocode.tests.robots/target/classes/tested/robots/ThreadGroupAttack.class deleted file mode 100644 index a4397c81a80288d265e4342efaf07d47a87c57d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1967 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 Date: Thu, 25 Aug 2016 10:01:29 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.projects/robocode.api/.markers | Bin 0 -> 597 bytes .../.projects/robocode.battle/.markers | Bin 0 -> 933 bytes .../.projects/robocode.core/.markers | Bin 0 -> 677 bytes .../.projects/robocode.host/.markers | Bin 0 -> 2415 bytes .../.projects/robocode.roborumble/.markers | Bin 0 -> 293 bytes .../.projects/robocode.ui.editor/.markers | Bin 0 -> 1642 bytes .../.projects/robocode.ui/.markers | Bin 0 -> 1066 bytes .../.safetable/org.eclipse.core.resources | Bin 0 -> 1328 bytes .../.settings/org.eclipse.jdt.launching.prefs | 2 + .../.settings/org.eclipse.rse.core.prefs | 4 + .../org.eclipse.e4.workbench/workbench.xmi | 2502 +++++++++++++++++ .../org.eclipse.jdt.core/externalLibsTimeStamps | Bin 0 -> 972 bytes .../org.eclipse.jdt.core/savedIndexNames.txt | 29 + .../variablesAndContainers.dat | Bin 0 -> 19199 bytes .../segments.gen | Bin 0 -> 20 bytes .../segments.gen | Bin 0 -> 20 bytes .../segments.gen | Bin 0 -> 20 bytes .../net/sf/robocode/dotnet/host/Module.java | 77 + .../net/sf/robocode/installer/AutoExtract.java | 382 +++ .../robocode/test/robotscs/TestMaxTurnRate.java | 72 + .../net/sf/robocode/installer/AutoExtract.java | 389 +++ .../net/sf/robocode/security/HiddenAccess.java | 290 ++ .../battle/events/BattleEventDispatcher.java | 154 + .../java/net/sf/robocode/core/RobocodeMain.java | 414 +++ .../java/net/sf/robocode/host/JavaHost.java | 192 ++ .../sf/robocode/host/events/EventManager.java | 572 ++++ .../host/proxies/HostingRobotProxy.java | 306 ++ .../host/security/RobotClassLoader.java | 424 +++ .../net/sf/robocode/installer/AutoExtract.java | 705 +++++ .../roborumble/netengine/FileTransfer.java | 657 +++++ .../src/main/java/tested/robots/AwtAttack.java | 84 + .../tested/robots/ConstructorAwtAttack.java | 68 + .../tested/robots/ConstructorThreadAttack.java | 61 + .../src/main/java/tested/robots/FileAttack.java | 81 + .../tested/robots/IncludeNamespaceAttack.java | 45 + .../main/java/tested/robots/ThreadAttack.java | 87 + .../java/tested/robots/ThreadGroupAttack.java | 71 + .../main/java/tested/robots/UndeadThread.java | 44 + .../net/sf/robocode/test/helpers/Assert.java | 38 + .../net/sf/robocode/ui/editor/EditWindow.java | 485 ++++ .../sf/robocode/ui/editor/WindowMenuItem.java | 291 ++ .../java/net/sf/robocode/ui/WindowManager.java | 632 +++++ .../sf/robocode/ui/battle/AwtBattleAdaptor.java | 335 +++ 43 files changed, 9493 insertions(+) create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.roborumble/.markers create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui.editor/.markers create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen create mode 100644 代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen create mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/Module.java create mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java create mode 100644 代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxTurnRate.java create mode 100644 代码/workspace_robo4/plugins/testing/robocode.testing.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java create mode 100644 代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/HiddenAccess.java create mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/events/BattleEventDispatcher.java create mode 100644 代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMain.java create mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/JavaHost.java create mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventManager.java create mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/HostingRobotProxy.java create mode 100644 代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotClassLoader.java create mode 100644 代码/workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java create mode 100644 代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/FileTransfer.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/AwtAttack.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorAwtAttack.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorThreadAttack.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileAttack.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/IncludeNamespaceAttack.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadAttack.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadGroupAttack.java create mode 100644 代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/UndeadThread.java create mode 100644 代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/Assert.java create mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditWindow.java create mode 100644 代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/WindowMenuItem.java create mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/WindowManager.java create mode 100644 代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battle/AwtBattleAdaptor.java diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.api/.markers new file mode 100644 index 0000000000000000000000000000000000000000..cf728b1c9fd1074507ba4551cd70d4804fffd6a0 GIT binary patch literal 597 zcma)&!Ac`R5QZz0L$c!0i?`Yrn0W*djG~}fvSA70rKY<~I?i;5s+vfi#N+xb!oJaZ zw?{$5gV@l}#s63H{~rJh;i!^SCzm{zv77TIC&QO^>QlklPljKK}1vQF}6>IKSoiJH8)jRB)m_iYJfiQT2@kT@^|sRoB)mz2OE%y@$vok2s2l@8Nj<_X6>qv2_3d literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.battle/.markers new file mode 100644 index 0000000000000000000000000000000000000000..b8400f51d9432364cd49f6e5760f2348385de1b0 GIT binary patch literal 933 zcmbW#v5wO~5C-5$f^-2P?wTv;rUL}BJCG34HFrn>K}as5qgZ<<@m}m*Yj>Qx(7_w< z1n>$x0TK-_K@BBu0L(gYib7*y$@Y%?@5uf<05E{3sdt&nou(vH%q6A4=V_&kP0!Ry zrIt7i^UF}`DR*8QyGW<)>Y1`?K|YCL0O-jXj~jis>HH$0yfk&7tt9haPDJ#!X?|*}9rLpw9sWS30@DBE3;KXXF z4j#buCXheThE-OQeAqC!#^*HB0~kCxo=L}-AKw3*z~oY=8{uDPtLjiVPN(t%`1DV; z3%S1$-4?qa#UA2gbAeo#fWgUKF)oPPRwJwF;`SYsNAd+)TmqBQ-B=Dk?y`K@W;y)c zk>wMN{*R?5@*9#DvfAZ1_?N?OIL5YIqtY5_C1Vrf2*t^ctB9jKp(@Raj_@u{sd6$p wc|rLypqWdAu(gY5Z45J-%e=;pGVE=jZG6;?@y(AN#w%a98Q;F@#`x>eZ&+g;5C8xG literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.core/.markers new file mode 100644 index 0000000000000000000000000000000000000000..5a5ffb364aadf7e284c9289c6dbcdd895a5ff043 GIT binary patch literal 677 zcmb`Du};G<5QeV_QVL>aU?K}!6+Z*e3R}zpx;&Q%J>c~s5!oW+g@>sAC zx2Tj(8L(v8mVckW?*Jf%fgqPV5eiRA6w;JpCKpna$ih!H5#f>9lv6Kmel|l{ z$|+J7(g4t^XBbfg$Bw2MDr@E*vzg{q`HZE1fHourdS5?`;dDIej?%lc;i!`mPNZT- zoz%~*;WS^Sh0~Qq50TMP3at-l&&fD4yo~B^TClI~CEc(juFvr!99UE0byeg@A#ego z2=q!FuAkws@<=^xSmqXM*tT~SDeUVQ;z4&@SG;|F`7Gdaquit`xn#B|`sb^4rzHU+ wjCkFfZTF*<`>!=&;TG7;HL<&{7u&AMQ#04Et2G_${WIR%E?(~s-g{HLZ{Y2{K>z>% literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.host/.markers new file mode 100644 index 0000000000000000000000000000000000000000..9af950237546736e4e997007c92f4f515903c7dc GIT binary patch literal 2415 zcmd6oKW`H;7{;B1khGLCF|eQ)3223?JBg76sWb=zwCP_WHs|~%aeHS+w$qXsHWtLl z0DKn2zz1MrV&*G=5U=y6N-wJ9c7f9+C;RN^eSUtQCycQY+l!5E=|l^Ry4t$fnk3G+ zRPjDP!n88<1))V0Y`Og|^WdC_Dm#J#D4aW&lQOXIDUIwd9~p zzl#odOZVwJP3dh*JD>^-v}KBx6{RQwD|}|vo{`#D?aL~#xuna@w&TXpcuww$ac~#(jD9K6 z#*e6Lr0V!ya1EL}KK~H}#wxQk8qH=CwlG7_8=QuIPjH9ex(LyFZ3hm~Sg92pbx|P= zfD<^bItbE2#sw|aw3-G<%B{T-#;bfi$BW&Z=2cc*wdS%B@UJr&axbXjSsG zPPn4{JdjqMZJwPLIhgLa&JEoZ1`o7SWEbj*NxV$jYi<_UvNzj3*c~^O9%jg-rG}xh z(L+^VdlJ?*#r-^ptJ7^$d>06!$|In;-t z<4xtm&|7C@CW_OPCn!b%OPqm%X_QAkVtLz<<0ztzIQh#UIa7p@T6~))^=g{b;`cyO z=|~d0bebk#obIOrS_mDjg^z==s$t<28~)klhX^g%AzVN?;ULpOwk0X|aTBQNM_$wG zX-!w|1Z%3F-3F9>%GtQ)AGvd%^#8&vqkj~y#rJtqCw=lWkklKtdUjI&Z|D?4muCrG W@XiQ3|LT{#s>byBSHA|T`tTRm(Z%@y literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.roborumble/.markers b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.roborumble/.markers new file mode 100644 index 0000000000000000000000000000000000000000..bd2015536ca5f69e68e22c2cc2c2046a0800b654 GIT binary patch literal 293 zcmXYs!A`?442IqIu!1Hbj@rt#>;W`_qn68}P*nD)qA%T4g4GXMZZ>Rjg~ zTm;@~GK1U4BwNuYFloW~0yWG$#fV#~;BvEGuCG)}J{(BB_B5&-K$P@MXw~B3Ns05M z434TJ3pg=7@}nS2+Rwh=bZ{fxr>w*o5SV3PHQFry hzKkCe{b= z#upH8?6dU3Yahi6AHbO=mSjU9abN>s4%y%Lz*&Xc?IS87@<)Ixt8i;bYt50xh(S&VZ*WxGS`qtSsX)u+lke z^o-O-(rMYfvBa*3gq!!o4Y}{N9d^~vzs<7V9Bb#s0d_mU4?`+ezk8iY3Mx zR_8|GUR+_7{jHY!#Sdp^^Kt zUltUyJT2tuFcAlyR1yfS+Om@y|2Kid#ZQDP21*co0-=ki18rg(%n(orM)hk^z`Y3p z=L-s0nHKP9C}3B1lGHr}8B(I-QId~F8wW4m?adkH>dzwc{R!sZ3o_rFW?n8btBb{% zcipOgii8iw32RFW60S}YJ{iU0!b?!xH3)DQgrT`E%6%<3Nv*8Uex%cQPIqh9itNn^ z_Lpd#+>sz%c$fU5_oUtf{%4)0@ZFxR!OXGMxTN>B@0tdIdt^fc4 literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.projects/robocode.ui/.markers new file mode 100644 index 0000000000000000000000000000000000000000..f4be5ab1765d8630bddc8ebfd4f2c9c95573b324 GIT binary patch literal 1066 zcmb7@!D`z;5QfK6O`OuE(4>LV%l4LBBzkQRh2k`%hseYx_!JoLj-_p-U9r2e$i01y zkoV}J&{rzt5NPSjae}Zf%3OqYM#J|lzW^YFxF zn)VxbR#`GfLOPt~)B_k;T^UX%B82eEaN;+fUtjlsu4s4tgs(Q%c!|ZavQnk2^cR#< zVOgD#VjT0F1e+UOu#qPxLyD6?rqlO)h-WmK%*8DYv&N z_o9(|&(2nt{;?a_#bO=odmHTHM`y5;hdezdaHmv%Lg#WCE(3TUxh5Y?z1s8)r_*US zxBj0sH+a`}>)&*AyS-z9{Y{u;nJA%IO+M~ELYJ&Y<(Shf!v!&yNz2~)q?KfxBpapV i?&CyQj5A$N{ImJ(oIN=F&`oUj*SgqMTWoKqtJr@^At?O- literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000000000000000000000000000000000000..4683b6c30c08e4b3d5abdcb528870a568ae6ba9b GIT binary patch literal 1328 zcmZ?R*xjhShe1S2b=vdAllRFf=Oz}Hq!uZZBqrsg@^UHr=I1FmmZmEh87UZ8SQ#2v znHnoN2Ztya85o-JawX@aCKkD*=9DDH=NF~xr6%WO78IxIrKBd6rt2l=7p2;!CFT?Z z&C%B@DN0SXHNvSSw=$4gIJ;P{G!v!`hxu74B`BujP*#$fn5&muR!ofA^5PP` zvc#Osl*E$E{5%5o7o?=>B^G4rmE`B=6cbPja%)avXZ3-yJTq_DPi@?^Q z1RlsGS;a6P8k(3JnwlG%8(CNw0YeX;MtG=z^jH{~n3)=z85!dY@giVEAx9C8Km;jE u%gjk7B3eMfLWGH^9)u>40};PJgVSN)=bq}_<;NUG(\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs new file mode 100644 index 0000000..0a60e67 --- /dev/null +++ b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs @@ -0,0 +1,4 @@ +activeuserprofiles=DESKTOP-SHKMAML;Team +eclipse.preferences.version=1 +org.eclipse.rse.systemtype.local.systemType.defaultUserId=Terrans Force +useridperkey=DESKTOP-SHKMAML.Local\=Terrans Force; diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 0000000..8c2319f --- /dev/null +++ b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,2502 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + + + + + + topLevel + shellMaximized + + + Minimized + MinimizedByZoom + + + persp.actionSet:org.eclipse.mylyn.context.ui.actionSet + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.rse.core.search.searchActionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.jst.j2ee.J2eeMainActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.debug.ui.debugActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.wst.server.ui.ServersView + persp.viewSC:org.eclipse.datatools.connectivity.DataSourceExplorerNavigator + persp.viewSC:org.eclipse.ui.views.BookmarkView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.PropertySheet + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.wst.common.snippets.internal.ui.SnippetsView + persp.viewSC:org.eclipse.ui.views.AllMarkersView + persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.newWizSC:org.eclipse.jpt.jpa.ui.wizard.newJpaProject + persp.perspSC:org.eclipse.jpt.ui.jpaPerspective + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.jdt.ui.JavaPerspective + persp.perspSC:org.eclipse.ui.resourcePerspective + persp.perspSC:org.eclipse.wst.web.ui.webDevPerspective + persp.newWizSC:org.eclipse.jst.j2ee.ui.project.facet.EarProjectWizard + persp.newWizSC:org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard + persp.newWizSC:org.eclipse.jst.ejb.ui.project.facet.EjbProjectWizard + persp.newWizSC:org.eclipse.jst.j2ee.jca.ui.internal.wizard.ConnectorProjectWizard + persp.newWizSC:org.eclipse.jst.j2ee.ui.project.facet.appclient.AppClientProjectWizard + persp.newWizSC:org.eclipse.wst.web.ui.internal.wizards.SimpleWebProjectWizard + persp.newWizSC:org.eclipse.jpt.ui.wizard.newJpaProject + persp.newWizSC:org.eclipse.jst.servlet.ui.internal.wizard.AddServletWizard + persp.newWizSC:org.eclipse.jst.ejb.ui.internal.wizard.AddSessionBeanWizard + persp.newWizSC:org.eclipse.jst.ejb.ui.internal.wizard.AddMessageDrivenBeanWizard + persp.newWizSC:org.eclipse.jpt.ui.wizard.newEntity + persp.newWizSC:org.eclipse.jst.ws.creation.ui.wizard.serverwizard + persp.newWizSC:org.eclipse.ui.wizards.new.folder + persp.newWizSC:org.eclipse.ui.wizards.new.file + persp.actionSet:org.eclipse.wst.server.ui.internal.webbrowser.actionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.newWizSC:org.eclipse.m2e.core.wizards.Maven2ProjectWizard + persp.actionSet:org.eclipse.wst.ws.explorer.explorer + + + newtablook + + + + + + + + + + newtablook + + + + + + newtablook + + + + + + + + + + + + + + + + + + Maximized + + + + + + + View + categoryTag:Help + + + + View + categoryTag:General + activeOnClose + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Help + + + + newtablook + org.eclipse.e4.primaryDataStack + EditorStack + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + View + categoryTag:Java + + + View + categoryTag:Java Browsing + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + View + categoryTag:Server + + + View + categoryTag:Data Management + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Mylyn + + + + toolbarSeparator + + + + Draggable + + + + + + + + + + + + + + + toolbarSeparator + + + + Draggable + + + + + Draggable + + + + + + + + + + + + + + + + + + + Draggable + + + + + + + Draggable + + + + + + Draggable + + + + + + + Draggable + + + + + Draggable + + + + + toolbarSeparator + + + + Draggable + + + + + + + + + + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + + + stretch + + + glue + + + + glue + + + Draggable + + + + + stretch + + + + Draggable + + + + + TrimStack + + + + + + + + + + + + + + + + + + + + + + + + + locale:zh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + locale:zh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + locale:zh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + locale:zh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + View + categoryTag:Ant + + + View + categoryTag:Data Management + + + View + categoryTag:Data Management + + + View + categoryTag:Data Management + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Git + + + View + categoryTag:Git + + + View + categoryTag:Git + + + View + categoryTag:Git + + + View + categoryTag:General + + + View + categoryTag:Help + + + View + categoryTag:Debug + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java Browsing + + + View + categoryTag:Java + + + View + categoryTag:General + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:JPA + + + View + categoryTag:JPA + + + View + categoryTag:JavaServer Faces + + + View + categoryTag:JavaServer Faces + + + View + categoryTag:Web Services + + + View + categoryTag:Maven + + + View + categoryTag:Maven + + + View + categoryTag:Mylyn + + + View + categoryTag:Mylyn + + + View + categoryTag:Mylyn + + + View + categoryTag:API Tools + + + View + categoryTag:Plug-in Development + + + View + categoryTag:Plug-in Development + + + View + categoryTag:Plug-in Development + + + View + categoryTag:Plug-in Development + + + View + categoryTag:Plug-in Development + + + View + categoryTag:Remote Systems + + + View + categoryTag:Remote Systems + + + View + categoryTag:Remote Systems + + + View + categoryTag:Remote Systems + + + View + categoryTag:Remote Systems + + + View + categoryTag:Remote Systems + + + View + categoryTag:Remote Systems + + + View + categoryTag:Remote Systems + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:CVS + + + View + categoryTag:CVS + + + View + categoryTag:Team + + + View + categoryTag:Team + + + View + categoryTag:Terminal + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Help + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Debug + + + View + categoryTag:JavaScript + + + View + categoryTag:JavaScript + + + View + categoryTag:JavaScript + + + View + categoryTag:JavaScript + + + View + categoryTag:JavaScript + + + View + categoryTag:Server + + + View + categoryTag:XML + + + View + categoryTag:XML + + + View + categoryTag:XML + + + View + categoryTag:XML + + + View + categoryTag:XML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps new file mode 100644 index 0000000000000000000000000000000000000000..f5666298b590a888c66b2f99be77b3cd4794bc6f GIT binary patch literal 972 zcmb7@y-or_5XZ*{FtM{Gp|ZGL4iMu~Y+Z*@J*@U@S!&<5!3_ zmOg~Of$$IJMIsTJOhuDK&f0lS*wIEs zng%??h?`SRx~`@6kdF_e&XBvzO%lf@%ohZ(P|ZFrmjTnkH8prgNlOkRp+cm8S)RE? zmY*#;lVZ~D{^ARE)3x)vp^EtAEHc-fgw8ljaCh}>*s-{M(hU;rOhpA~_@3wq?t3kl zl~}G;T;)C?4^*9F-;Spn`Vwm$(mmxN#i-Hs;2m=5Q540>=gXxPSWB-QoA5#tniwz| z!V8?F8_IYGP0^NwCQ1TFYI{MK6=o}T&xN>0_NMv`Tl1L=v=jk)A`&rW^zd;6rSufp z6l5@(-t_157&g=E|Mt~3Qgl>eV%X}>GjBU8-L-#Z>f*_H12?@3`&^RVSL^4HpF?WQ JRD1iH`2};=LB{|9 literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt new file mode 100644 index 0000000..f84b816 --- /dev/null +++ b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt @@ -0,0 +1,29 @@ +INDEX VERSION 1.126+E:\2016Spring\robocodefiles\download\app\workspace_robo4\.metadata\.plugins\org.eclipse.jdt.core +3253539546.index +240634369.index +3357244662.index +3837392347.index +1270703585.index +743580145.index +4213330522.index +2815204631.index +972965919.index +649753860.index +2097671088.index +2394798482.index +1886545541.index +2420224983.index +9299668.index +2806151389.index +2816454019.index +2169288515.index +3228954160.index +2122446671.index +2936589608.index +1812437159.index +2690281349.index +3090911769.index +844486800.index +195189658.index +2555277089.index +4256357263.index diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat new file mode 100644 index 0000000000000000000000000000000000000000..0facbcd4b9baf082511caf207f299df748e6ab44 GIT binary patch literal 19199 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 H#FhRJzcsAQ literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/1a42e2ddbdd28c4e903ebde7bafa5867/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..e9fa6008becd133f1cac4c5cec7f4311c6576acc GIT binary patch literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/26522e0d83a422eed93329ece7565cfc/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..e9fa6008becd133f1cac4c5cec7f4311c6576acc GIT binary patch literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 literal 0 HcmV?d00001 diff --git a/代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen b/代码/workspace_robo4/.metadata/.plugins/org.eclipse.m2e.core/nexus/830bc118332e77292949ed1e6d2fabe0/segments.gen new file mode 100644 index 0000000000000000000000000000000000000000..e9fa6008becd133f1cac4c5cec7f4311c6576acc GIT binary patch literal 20 QcmezW|NlP*2w;ZM07=&b0ssI2 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000..e538d7a --- /dev/null +++ b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.host/src/main/java/net/sf/robocode/dotnet/host/Module.java @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.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 new file mode 100644 index 0000000..852475f --- /dev/null +++ b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java @@ -0,0 +1,382 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.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 new file mode 100644 index 0000000..5507bb1 --- /dev/null +++ b/代码/workspace_robo4/plugins/dotnet/robocode.dotnet.tests/src/test/java/net/sf/robocode/test/robotscs/TestMaxTurnRate.java @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/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 new file mode 100644 index 0000000..e993cf8 --- /dev/null +++ b/代码/workspace_robo4/plugins/testing/robocode.testing.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java @@ -0,0 +1,389 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/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 new file mode 100644 index 0000000..184001c --- /dev/null +++ b/代码/workspace_robo4/robocode.api/src/main/java/net/sf/robocode/security/HiddenAccess.java @@ -0,0 +1,290 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.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 new file mode 100644 index 0000000..9155e67 --- /dev/null +++ b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/battle/events/BattleEventDispatcher.java @@ -0,0 +1,154 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/core/RobocodeMain.java b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMain.java new file mode 100644 index 0000000..3ba5a93 --- /dev/null +++ b/代码/workspace_robo4/robocode.core/src/main/java/net/sf/robocode/core/RobocodeMain.java @@ -0,0 +1,414 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.host/src/main/java/net/sf/robocode/host/JavaHost.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/JavaHost.java new file mode 100644 index 0000000..7dde1e9 --- /dev/null +++ b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/JavaHost.java @@ -0,0 +1,192 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/events/EventManager.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventManager.java new file mode 100644 index 0000000..5621c87 --- /dev/null +++ b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/events/EventManager.java @@ -0,0 +1,572 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/proxies/HostingRobotProxy.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/HostingRobotProxy.java new file mode 100644 index 0000000..9fdb31e --- /dev/null +++ b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/proxies/HostingRobotProxy.java @@ -0,0 +1,306 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/security/RobotClassLoader.java b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotClassLoader.java new file mode 100644 index 0000000..0993839 --- /dev/null +++ b/代码/workspace_robo4/robocode.host/src/main/java/net/sf/robocode/host/security/RobotClassLoader.java @@ -0,0 +1,424 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java b/代码/workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java new file mode 100644 index 0000000..e4c6d0a --- /dev/null +++ b/代码/workspace_robo4/robocode.installer/src/main/java/net/sf/robocode/installer/AutoExtract.java @@ -0,0 +1,705 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.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 new file mode 100644 index 0000000..09004c4 --- /dev/null +++ b/代码/workspace_robo4/robocode.roborumble/src/main/java/net/sf/robocode/roborumble/netengine/FileTransfer.java @@ -0,0 +1,657 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.tests.robots/src/main/java/tested/robots/AwtAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/AwtAttack.java new file mode 100644 index 0000000..5722779 --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/AwtAttack.java @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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/ConstructorAwtAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorAwtAttack.java new file mode 100644 index 0000000..47ae244 --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorAwtAttack.java @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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/ConstructorThreadAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorThreadAttack.java new file mode 100644 index 0000000..0c5a0f8 --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ConstructorThreadAttack.java @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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/FileAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileAttack.java new file mode 100644 index 0000000..9f76ccf --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/FileAttack.java @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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/IncludeNamespaceAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/IncludeNamespaceAttack.java new file mode 100644 index 0000000..c5ecdb9 --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/IncludeNamespaceAttack.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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/ThreadAttack.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadAttack.java new file mode 100644 index 0000000..bb21f8c --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadAttack.java @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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 new file mode 100644 index 0000000..963b549 --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/ThreadGroupAttack.java @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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/UndeadThread.java b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/UndeadThread.java new file mode 100644 index 0000000..75fcbfa --- /dev/null +++ b/代码/workspace_robo4/robocode.tests.robots/src/main/java/tested/robots/UndeadThread.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms 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/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 new file mode 100644 index 0000000..27c29dd --- /dev/null +++ b/代码/workspace_robo4/robocode.tests/src/main/java/net/sf/robocode/test/helpers/Assert.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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.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 new file mode 100644 index 0000000..a0f8e9b --- /dev/null +++ b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/EditWindow.java @@ -0,0 +1,485 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/WindowMenuItem.java b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/WindowMenuItem.java new file mode 100644 index 0000000..bda1627 --- /dev/null +++ b/代码/workspace_robo4/robocode.ui.editor/src/main/java/net/sf/robocode/ui/editor/WindowMenuItem.java @@ -0,0 +1,291 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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/src/main/java/net/sf/robocode/ui/WindowManager.java b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/WindowManager.java new file mode 100644 index 0000000..bbdae95 --- /dev/null +++ b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/WindowManager.java @@ -0,0 +1,632 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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 new file mode 100644 index 0000000..11436ae --- /dev/null +++ b/代码/workspace_robo4/robocode.ui/src/main/java/net/sf/robocode/ui/battle/AwtBattleAdaptor.java @@ -0,0 +1,335 @@ +/** + * Copyright (c) 2001-2016 Mathew A. Nelson and Robocode contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse 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); + } + }); + } + } +}

Y#GTF}} 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�@i&Q8jg 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