Build the best - destroy the rest!

Thursday, 5 August 2010

Robocode 1.7.2.1 (final)

Robocode version 1.7.2.1 (final) has now been released, which contains lots of bug fixes compared to the beta, but also a few changes.

You can read about the previous bugfixes and changes made for the beta version here:

In the following, the new bugfixes and changes made since the beta version are listed.

Bugfixes


  • Bug [3021140] - Possible for robot to kill other robot threads.

  • Bug [3029344] - Zipped robots data files are not extracted.

  • Bug [3026855] - Robot Packager doesn't package source file in Eclipse proj.

  • Bug [2828479] - Missed onRobotDeath events. Thanks goes to ForNeVeR for finding and solving this bug.

  • Bug [3019854] - Cannot see robot with no package in New Battle dialog.

  • Bug [3026856] - Robot Packaging Wizard doesn't save value for Next & Back.

  • Bug [3028102] - ClassNotFoundException at RobotClassLoader.java:271.

  • Bug [3032423] - "skipped" turns at start with -Ddebug=true

  • Bug [3032843] - Exclude filters not working.

  • Sometimes the compiler window was hanging for several seconds, even though the compiler had finished compiling.


Changes


  • The Robot Packing Wizard will now only allow word characters (letters, digits, dots, but no spaces) with the version field.

  • Added robocode.annotation.SafeStatic, which can be used to suppress warnings in the robot console for a robot uses static reference to a robot on a field. Note that this means that you need to clean the static field, when a new round is started. This annotation was suggested by Nat Pavasant. The annotation is used like this:


  • @SafeStatic
    private static AdvancedRobot robot;

  • Added syntax highlightning on Java annotations for the Robot Editor.


Download Robocode 1.7.2.1 (final) from here
Download Robocode .NET plug-in 1.7.2.1 from here
Download Robot testing plug-in 1.7.2.1 from here

Saturday, 19 June 2010

Robocode 1.7.2.1 Beta

This is the beta version of Robocode version 1.7.2.1, where the Jikes 1.22 compiler has been replaced with the Eclipse Compiler for Java (ECJ) 3.5.2.

We encourage everybody to test this new Beta version as much as possible and report any bugs found at our Bugs Tracker at SourceForge. Then we will do everything we can to fix issues before the final release of version 1.7.2.1.

In the following we list the new bugfixes and changes made with the 1.7.2.1 Beta version.

Bugfixes


  • Bug [2867326] - Lockup on start if too many bots in robots dir (cont'd).

  • Fixed some issues with the robot repository when file URLs contains spaces, where robots were sometimes disappearing from the repository.


Changes


  • Req [2815450] - Move away from Jikes towards ECJ. Jikes 1.22 has been replaced with the Eclipse Compiler for Java (ECJ) 3.5.2.


Download Robocode 1.7.2.1 Beta from here
Download Robocode .NET plugin 1.7.2.1 Beta from here

Friday, 28 May 2010

Robocode 1.7.2.0 (final)

The final version of Robocode version 1.7.2.0 has finally been released. As usual, lots of bugs have been found and fixed.

If you are new to Robocode 1.7.2.0 then please note that this version is the first version of Robocode that supports robots written for .NET. With the .NET plugin for Robocode, Java and .NET robots can participate in the same battles in the same time.

You can read our two first articles on the RoboWiki about
how to create and how to debug a .NET robot with Visual Studio.

If you want to know the differences between the Robot API for Java and the new one for .NET, you should read this article.

You can read about the bugfixes and changes with the previous beta versions here:

In the following, the new bugfixes and changes made since the 1.7.2.0 Beta 3 version are listed.

Bugfixes


  • Bug: Robots were disabled when skipping 30 skipping non-consecutive turns (or 120 turns when performing I/O operations). Now, Robocode is only disabling robots when the robot skips 30 consecutive turns, which is the original behavior, and which has been broken since version 1.6.1.4.

  • Bug [2994724] - Duplicate version numbers prevents uploading.

  • Bug [2994732] - tzu.TheArtOfWar 1.2 gets NullPointerExceptions.

  • Bug [3003721] - Attempting to install Robocode over an existing install NPEs.

  • Bug [3005547] - The robocode.command is missing the execute permissions bit.

  • Bug [2999719] - Problems with Graphics2D.fill/draw(Shape).

  • Bug [3005111] - NPE when uploading results.

  • Bug [2994560] - "Ignoring" messages in rumble is duplicated.

  • Bug [2975871] - Minor visual bug - Currently selected robot gets covered.

  • Bug: A security exception was thrown with development robots trying to access their data directory.


Changes


  • Robocode will now only install batch files relevant to the hosting system, e.g., .bat files are not installed under Unix/Linux/Mac OS X, and .sh files are not installed under Windows. Furthermore, .command files are only installed under Mac OS X, and has now the execution permission bit set (due to bug [3005547]).

  • Robocode will now write out a warning in the robot console when a robot is detected that uses static references to a robot, i.e. static fields that are declared as e.g. a Robot, AdvancedRobot, TeamRobot etc. (typically references to the robot itself). A static reference to a robot can cause unwanted behavior with the robot accessing these. Hence, it is strongly recommended that static robot references in a robot class or within its helper classes are changed into non-static references and that the robot is recompiled afterwards. In every round, Robocode is creating new instances of the individual robot, meaning that static references to former Robot objects points to "dead" objects that are not used anymore in the game, and which cannot be garbage collected during the battle when there is static references to these.


Download Robocode 1.7.2.0 (final) from here
Download Robocode .NET plugin 1.7.2.0 from here
Download Robot testing framework 1.7.2.0 from here

Friday, 30 April 2010

Robocode 1.7.2.0 Beta 3

This is the 3rd and last beta for Robocode version 1.7.2.0, where lots of bugs found in Beta 2 have been fixed.

We need to have the fixes verified and also let you check if we have introduced some unwanted side-effects with all the bug fixes we made. So if you have made a bug report for Robocode, please verify the fix the bug if it has been marked as "fixed", and update the tracker with a comment. That is, if the bug was fixed or not.

If you discover a new issue, then don't hesitate reporting it on SourceForge here with a note of which system and Java version you are running under.

If you are new to Robocode 1.7.2.0 then please note that this version is the first version of Robocode that supports robots written for .NET. With the .NET plugin for Robocode, Java and .NET robots can participate in the same battles in the same time.

You can read our two first articles on the RoboWiki about
how to create and how to debug a .NET robot with Visual Studio.

If you want to know the differences between the Robot API for Java and the new one for .NET, you should read this article.

We encourage everybody to test this new Beta version as much as possible and report any bugs found at our Bugs Tracker at SourceForge. Then we will do everything we can to fix issues before the final release of version 1.7.2.0.

You can read about the bugfixes and changed made with the first beta here and the second beta You can read about the bugfixes and changed made with the first beta here.


In the following we list the new bugfixes and changes since the 1.7.2.0 Beta 2 version.

Bugfixes


  • Bug [2976754] - Battle engine consumes more CPU power over time

  • Bug [2972932] - Strange issue first time running roborumble in 1.7.2.0 Beta 2.

  • Bug [2978825] - isTeammate() sometimes returns false with teammates.

  • Bug [2964562] - Cannot extract downloaded robot for editing in Robot Editor.

  • Bug [2976258] - Strange thread exceptions with kid.DeltaSquad in 1.7.

  • Bug [2974178] - Krabb.sliNk.Garm 0.9u freezes often in 1.7.

  • Bug [2970414] - Occasionally losing the bit of text in the robot console.

  • Bug [2954723] - java.lang.Error: Interrupted attempt to aquire read lock.

  • Bug: Teams with versions could not be found in a development path.

  • Bug: Files in /robots/.data or /robots/.robotcache dir were put into a underscore sub-directory.

  • Bug: The "Kill Robot" button in the robot console windows was often disabled.



Changes


  • The robot console now uses a rolling buffer so when the number of lines in the robot console exceeds the max number of lines (500), the oldest lines are removed, and "^^^ TEXT TRUNCATED ^^^" is written in the top. Previously half of the text was truncated when the max number of lines was reached.


Download Robocode 1.7.2.0 Beta 3 from here
Download Robocode .NET plugin 1.7.2.0 Beta 3 from here

Sunday, 14 March 2010

Robocode 1.7.2.0 Beta 2

This is the second Beta for Robocode version 1.7.2.0. Many issues were reported and found with the first Beta. We fixed many of these issues - especially regarding RoboRumble (also MeleeRumble and TeamRumble).

We need to have the fixes verified and also let you check if we have introduced some unwanted side-effects with all the bug fixes we made. So if you have made a bug report for Robocode, please verify the fix the bug if it has been marked as "fixed", and update the tracker with a comment. That is, if the bug was fixed or not.

If you discover a new issue, then don't hesitate reporting it on SourceForge here with a note of which system and Java version you are running under.

If you are new to Robocode 1.7.2.0 then please note that this version is the first version of Robocode that supports robots written for .NET. With the .NET plugin for Robocode, Java and .NET robots can participate in the same battles in the same time.

You can read our two first articles on the RoboWiki about
how to create and how to debug a .NET robot with Visual Studio.

If you want to know the differences between the Robot API for Java and the new one for .NET, you should read this article.

We encourage everybody to test this second Beta version as much as possible and report any bugs found at our Bugs Tracker at SourceForge. Then we will do everything we can to fix issues before the final release of version 1.7.2.0.

You can read about the bugfixes and changed made with the first beta here.

In the following we list the new bugfixes and changes since the first 1.7.2.0 Beta version.

Bugfixes


  • Bug [2953599] - Roborumble doesn't upload with EXECUTE=NOT.

  • Bug [2960836] - Team RoboRumble uploading is broken.

  • Bug [2964559] - TeamRumble: Cannot find robot in nested .jar files.

  • Bug [2930266] - Robot static data isn't being GCed after battle. More fixes were made.

  • Bug [2960870] - isTeammate() called on null gives NullPointerException.

  • Bug [2961489] - ArrayIndexOutOfBoundsException when starting team battle.

  • Bug [2952496] - Installer installs AutoExtract$1.class.

  • Bug [2952549] - yk.JahRoslav 1.1 throws WinException.

  • Bug [2960894] - jlm.javaDisturbance loses substantial score in 1.7.2 Beta.

  • Bug [2962846] - (.NET) condition tested on concurrently modified collection.


License Change


  • We have changed license from Common Public License (CPL) v1.0 into Eclipse Puplic License (EPL) v1.0.


Download Robocode 1.7.2.0 Beta 2 from here
Download Robocode .NET plugin 1.7.2.0 Beta 2 from here

Monday, 22 February 2010

Get started with Robocode for .NET robots

The biggest news for Robocode in a long time is the support for .NET robots.
So if you want to get started with .NET programming in a fun way, here is your chance to try it out and challenge your skills.

Get started by reading our two tutorials for .NET robots here:These two tutorials contains everything needed to get started with programming .NET robots for Robocode.

If you are already familiar with programming Robocode robots in Java, you might be interested in extending your skills into .NET as well. You can read about the differences between .NET and Java robots here.

Download Robocode 1.7.2.0 Beta from here
Download Robocode .NET plugin 1.7.2.0 Beta from here

Monday, 15 February 2010

Robocode .NET - introduction

Visible Robot differences


between Java and brand new .NET API for Robocode robots.

  • Namespaces start with uppercase Robocode.AdvancedRobot instead of robocode.AdvancedRobot from Java.

  • Methods start with uppercase AdvancedRobot.Execute() instead of AdvancedRobot.execute() from Java.

  • Getter and setter methods are represented by properties BulletHitEvent.VictimEnergy instead of BulletHitEvent.getVictimEnergy() from Java.

  • Droids are marked with Robocode.IDroid interface instead of robocode.Droid from java.

  • Painting robot uses Robocode.IGraphics interface, which is similar to System.Drawing.Graphics.

  • Robocode.Condition could be implemented by delegate, see SampleCs.Target.

  • Interactive robot should use Robocode.Keys constants, see SampleCs.Interactive.

  • team Robot messages should be binary serializable and marked with [Serializable] attribute.

  • .NET robot pays more work to submit each turn into battle (to overcome the interop layer). We will probably adjust CPU time given to robot to keep fair competition. The ratio Java/.NET is for discussion yet.

  • Access to files is done thru AdvancedRobot.GetDataFile() which returns System.IO.Stream

  • there is difference in implementation of floating point between CLR & JVM. The JVM uses strictfp - rounding after each operation, which is more portable. Whereas CLR uses FPU wide registers to achieve better speed and precision. If you recursively recompute same numbers, it will produce a little bit different result. Nothing to worry about.

  • System.Threading.Thread is banned, use Robocode.Thread instead.


About the implementation


Two years ago, when we came with the idea of introducing .NET for Robocode we had no idea what so ever how much work it would require from us. :-O
We had raw idea that the main problem is speed. Robocode version 1.6 and below used shared state in RobotPeer between Battle thread and Robot thread.
Each call on the Robot API was synchronized to one big mutex. Now imagine that each call from a .NET robot will come through interop layer and then through synchronization in Java. Our estimate was that we would need 10.000 calls per second across CLR/transport/JVM boundaries to satisfy all calls which robot does on RobotAPI. That's not very realistic!


After several trials and failures we came to idea that we will make communication between robot and battle chunky rather than chatty. We cache all commands from robot till end of turn (Execute) and then we send it to battle as a message.
The other way around it's the same. At end of turn, the battle produces a message for each robot. The message contains all the information a robot could ever ask for, i.e., all the events, positions - everything. The message is used by robot as cache for all queries on the Robot API.
And that's big success. The Java version of Robocode speedup about 10x in version 1.6.2. This design as well allows for .NET robot to cross the CLR/JVM boundary just once per turn! The messages are serializable to binary form, so the interface between robot and battle could be reused for C++/Delphi/Python/Ruby/Basic/Foxpro :-D robots in the future.


So now, how to connect two virtual machines? Webservice or tcp - slooow, named pipe - slow, COM - yeah maybe, but COM registration, JNI & PIvoke & C++ & in same process - that would be almost it.
In the end as by-product of need for Robocode, I started off new opensource project - jni4net. It's is fast intraprocess bridge, without any native code and it's object oriented. It's generally useful for .NET+Java solutions.


There were challenges about sandboxing the robot in .NET. We use AppDomain, CAS security and static code analysis to prevent you from cheating.


There is plenty of work ahead. I would not name it now, because we would like to hear from you, what you think we should improve?

Enjoy!