Re: Recording RoboCode battles from Java API
Andrea Giardini <[email protected]> Tue, 15 Mar 2016 17:25:07 +0100
| Newsgroups | gmane.comp.java.robocode |
|---|---|
| Message-ID | <[email protected]> |
Hi Flemming
Can you give me a couple of more hints about this?
Cheers
Andrea
On 03/09/2016 10:36 PM, fnl wrote:
> Hi Andrea,
>
> It is possible, if the RobocodeEngine is extended to provide the
> recording feature (both Java and .NET version).
> But it is time consuming to implement, and you might be the only one
> asking for such a feature.
> You are welcome to add this feature to the RobocodeEngine as Robocode
> is Open Source. :-)
>
> Otherwise, I think you'll have to live with the JVM reloading or take
> advantage of the auto-recording feature, which also works with the
> RobocodeEngine.
>
> Cheers,
> - Flemming
>
>
> Den mandag den 7. marts 2016 kl. 11.13.27 UTC+1 skrev Andrea Giardini:
>
> Hi Flemming
>
> Thank you for your answer, it was helpful :)
>
> However, it didn't really solve my problem... maybe it's better if
> i explain you my use case a little:
>
> I would like to trigger a set of battles on my server every time i
> push to a git repository. The battles are run using a CI system
> that, ideally, will give me the artifacts of the recorded battles
> once the process is complete. Using the graphic interface is not
> an option here.
>
> As you suggested i could just create several Java processes
> triggering the Robocode CLI with different battle files. This
> solution would work for sure, but I would like to know it we could
> do something better (it reloads a JVM after every battle,
> definitely not optimal). All i need is something like this example
> http://robocode.sourceforge.net/docs/robocode/robocode/control/package-summary.html
> <http://robocode.sourceforge.net/docs/robocode/robocode/control/package-summary.html>
> but able to record the battles to a br file.
>
> Is it possible?
>
> Cheers
> Andrea
>
> On 03/06/2016 11:53 PM, fnl wrote:
>> Hi Andrea,
>>
>> First of all, the robocode.control.RobocodeEngine does not
>> support saving the games. It should be added to the RobocodeEngine.
>>
>> Note that you should only use classes that are a part of the
>> public API. That is robocode.* classes like e.g. robocode.control.
>> You are not supposed to "hack" into the internals of Robocode by
>> accessing net.sf.robocode classes. Those are internal and could
>> change at any time.
>> Code based on internal classes might work now, but not in the
>> future. Only the public API is guaranteed to be backward compatible.
>>
>> What you could do instead is enabling "auto recording" in
>> Robocode from the UI by selecting Options -> Preferences ->
>> Common Options -> "Enable auto recording ..."
>>
>> This feature will automatically record the battles and store
>> these into the /battles directory under the /robocode directory.
>> A record will get a name like
>> "20160306-233521-sample.RamFire-sample.Corners.zip.br
>> <http://20160306-233521-sample.RamFire-sample.Corners.zip.br>"
>> (br stands for Battle Record)
>>
>> You can replay this in Robocode (Battle -> Open Record).
>>
>> Alternatively, you could use the Robocode command-line option
>> <http://robowiki.net/wiki/Robocode/Console_Usage>s, where you can
>> set '-battle <battle file>' to run a specific battle
>> specification and also set '-recordXML' in order to record the
>> battle in XML format.
>> You can replay the records using '-replay <record file>' .
>>
>> Note that you could run Robocode in a Java Process
>> <https://docs.oracle.com/javase/7/docs/api/java/lang/Process.html>.
>> If you do this, you should use robocode.sh as the first
>> command-line argument and the add the command-line options, you
>> need. :-)
>>
>> I hope this helps?
>>
>> Kind regards
>> - Flemming
>>
>> Den fredag den 4. marts 2016 kl. 15.24.17 UTC+1 skrev Andrea
>> Giardini:
>>
>> Hello everyone
>>
>> I'm trying to record battles from the java API. I would like
>> to trigger battles inside Java and then, at the end of the
>> run, be able to see the replay only of the battles i'm
>> interested in.
>>
>> This is my code:
>>
>> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> import robocode.control.*;
>> import net.sf.robocode.battle.events.BattleEventDispatcher;
>> import net.sf.robocode.io.Logger;
>> import net.sf.robocode.recording.BattleRecordFormat;
>> import net.sf.robocode.recording.RecordManager;
>> import net.sf.robocode.serialization.SerializableOptions;
>> import net.sf.robocode.settings.SettingsManager;
>>
>> public class BattleRunner {
>>
>> // Path configuration
>> public static String roboCodePath =
>> "/home/andrea/git/AttProgIA_2016/RoboCode";
>>
>> private static String recordFile = "/tmp/testingLOL.xml";
>>
>> // Recording
>> private static SettingsManager settingsManager = new
>> SettingsManager();
>> private static BattleEventDispatcher
>> battleEventDispatcher = new BattleEventDispatcher();
>> private static RecordManager recordManager = new
>> RecordManager(settingsManager);
>>
>> public static void main(String[] args) {
>>
>>
>> // Disable log messages from Robocode
>> RobocodeEngine.setLogMessagesEnabled(false);
>>
>> // Create the RobocodeEngine
>> RobocodeEngine engine = new RobocodeEngine(new
>> java.io.File(roboCodePath));
>>
>>
>> // Setup the battle specification
>>
>> int numberOfRounds = 5;
>> BattlefieldSpecification battlefield = new
>> BattlefieldSpecification(800, 600); // 800x600
>> RobotSpecification[] selectedRobots =
>> engine.getLocalRepository("sample.RamFire,sample.Corners");
>>
>> BattleSpecification battleSpec = new
>> BattleSpecification(numberOfRounds, battlefield, selectedRobots);
>>
>> // *********************
>> Logger.setLogListener(battleEventDispatcher);
>> recordManager.attachRecorder(battleEventDispatcher);
>>
>>
>> // Show the Robocode battle view
>> engine.setVisible(false);
>>
>> // *********************
>>
>> // Run our specified battle and let it run till it is
>> over
>> engine.runBattle(battleSpec, true); // waits till the
>> battle finishes
>>
>> // Save the recording
>>
>> recordManager.saveRecord(recordFile,
>> BattleRecordFormat.XML, new SerializableOptions(false));
>> // Cleanup our RobocodeEngine
>> engine.close();
>>
>> // Make sure that the Java VM is shut down properly
>> System.exit(0);
>> }
>> }
>>
>> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> Unfortunately all i get it's:
>>
>> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> No robocode.properties. Using defaults.
>> Exception in thread "Application Thread"
>> java.lang.NullPointerException
>> at
>> net.sf.robocode.recording.RecordManager.saveRecord(RecordManager.java:344)
>> at BattleRunner.main(BattleRunner.java:57)
>>
>> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> Which i really don't understand... battles run properly (i
>> tried to print the results and it works correctly), but as
>> soon as i try to save the record i receive this null pointer
>> exception. It looks like the recordInfo variable inside
>> RecordManager it's not initialized properly...
>>
>> Can you give me a hint? It's really annoying, and
>> unfortunately i can't find any documentation or examples
>> online...
>>
>> Thank you
>>
>> Andrea
>>
>
--
You received this message because you are subscribed to the Google Groups "robocode" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.