View source for Talk:RoboRumble

From Robowiki
Jump to navigation Jump to search

Sub-pages: /Archive20130317

RoboRumble history

April 27 2005 - The RoboRumble@Home server is now moved to Pulsar's machine. See /TemporaryServerUp for the RR@H settings files to use and some more details. The only difference you should note is that the flag-less bots no longer have the Jolly Roger flag. This is temporary and will be fixed soon. Huge thanks to Pulsar for carrying the burden (reponsibility-wise) a while with this. I'll sleep tighter now when I don't need to worry if my WinXP Home PC (yes, it was hosted in such an environment before!) is awake and responsive. -- PEZ

October 28 2005 - The RoboRumble@Home server will be down for several hours for upgrades tomorrow (Saturday Octber 29). As a side effect this will solve the issues some people have with port 8080. --Pulsar

October 29 2005 - The RoboRumble@Home server is going down shortly and will be up and running again within 12hours hopefully. -- Pulsar

October 29 2005 - The RoboRumble@Home server is up and running. Updates are needed for RoboRumble@Home clients. -- Pulsar

February 18 2006 - The RoboRumble@Home server connection might experience some downtime the following hours as I will reorganize the firewall setup. --Pulsar

March 7 2006 - The firewall switch over has now finally been done, and everything seems to be working. Some people might experience a short delay until DNS records have been updated around the world (though they were and are set to a very short "time to live" to minimize this). RoboRumble@Home clients need to be restarted as Java by default caches DNS lookups. --Pulsar

Contents

Thread titleRepliesLast modified
Problems with JollyNinja214:25, 18 May 2024
USER variable not being used120:54, 7 April 2024
Publishing of scala robot415:46, 24 May 2021
Adding a new flag214:35, 31 October 2020
RoboRumble ranking unstable114:32, 13 July 2019
1.9.3.5 Could not load properties file: ./roborumble/roborumble.txt212:33, 24 March 2019
Upgrade client version3610:02, 7 November 2018
Huge battle results file? 710:39, 8 July 2018
Bots that aren't removed201:05, 5 July 2018
ThreadDeath problem2915:14, 15 January 2018
Thousands of duplicated battles???717:38, 23 October 2017
Script to fixup rotten participant jar file links004:01, 8 September 2017
ThreadDeath problem and large amount of skipped turns322:20, 7 September 2017
Client java version4919:44, 6 September 2017
How can I deploy roborumble client on a server?303:00, 21 August 2017
First page
First page
Previous page
Previous page
Last page
Last page

Problems with JollyNinja

I noticed that JollyNinja is getting unusually bad results in the latest battles it has run (it currently votes for Quantum, which it really shouldn't be!)

JollyNinja's results on LiteRumble

When I run battles locally I get the following warnings:

SYSTEM: Warning: sgp.JollyNinja uses static reference to a robot with the following field(s):
sgp.JollyNinja.instance, which points to a sgp.JollyNinja
sgp.Environment.robot, which points to a robocode.AdvancedRobot
SYSTEM: Static references to robots can cause unwanted behaviour with the robot using these.
SYSTEM: Please change static robot references to non-static references and recompile the robot.

When I run battles on a 1.9.4.2 client I see the poor performance seen in the rumble but with 1.9.5.2 the performance looks to be okay.

David414 (talk)15:44, 17 May 2024

Hey good catch. I guess we should upgrade the rumble to 1.9.5.2?

Skilgannon (talk)12:56, 18 May 2024

If it helps I'd be happy to point a 1.9.5.2 client at a fresh rumble to generate enough results to compare to the current rankings. I figure it'd be much easier to spot any bots that get broken that way.

David414 (talk)14:25, 18 May 2024
 
 

USER variable not being used

I'm using a shared computer (MacOS) to run battles and have set the USER variable in roborumble/meleerumble.txt to David414 however when the results are uploaded that username isn't used. This wasn't a problem when I mistakenly tried to use the 1.9.5.2 client. Does anybody know what I need to patch to fix this?

D414 (talk)11:45, 7 April 2024

Easiest fix is to add USER = YOUR_NAME to meleerumble.sh

D414 (talk)20:54, 7 April 2024
 

Publishing of scala robot

I decide to write robocode bot on scala to learn scala.
But there're a little problem - to run battles with them, you need download scala and add some libraries to rc classpath.
It's ok for me, if only my clients will run my bot. But will whole community agree, if i publish bot, which is not runnable in usual environment?

Jdev10:58, 22 March 2012

We shouldn't have bots in the rumble that can only be run on some clients. It's not really fair, and it makes us dependent on a few (or one) clients to get complete pairings for new bots.

There have been discussions about Scala in Robocode before and I think the current state is that we can't officially support it because it requires some insecure stuff disallowed by Robocode sandbox (like Reflection). See Talk:Other JVM Languages and this robocode-developers thread. Maybe we can revisit this discussion, but we'd need input from Pavel or Fnl, and possibly some Scala guru.

I'm also interested in Scala, and it might help us attract the edgy young functional programmers of the world if Robocode supported it. So it would be cool if we could. But I don't really know the details of how to do it right.

Voidious15:32, 22 March 2012
 

Edgy young functional programmers, eh? I must admit I am pretty interested in Scala too and that was one of the main things keeping me from giving it a real try.

Chase-san16:58, 22 March 2012
 

It's a pity... But i write robot on scala anyway. I will return to this question when take crown in my local tests:)

Jdev17:01, 22 March 2012
 

I'm also planning to write scala robot now ;) Since I write scala daily, and I was maintaining a fork of robocode featuring OpenGL, I think there must exist a solution to run scala robot without sacrificing robocode sandbox.

Xor (talk)15:46, 24 May 2021
 

Adding a new flag

Would like to add India's flag and link it to the code IND in the RoboRumble/Country Flagslist. I don't have a GIF. Help appreciated.

Vishius (talk)19:07, 28 October 2020

Welcome! I've added the flag, you should be good to go!

Skilgannon (talk)22:13, 28 October 2020

Thank you. Much appreciated

Vishius (talk)14:35, 31 October 2020
 
 

RoboRumble ranking unstable

For unknown reason, the RoboRumble ranking has lost a lot of pairings. MiniRumble and smaller seem not effected. So it will take a while for it to stabelize as there are lots of bots that are missing 1-40 pairings.

GrubbmGait (talk)10:35, 13 July 2019

That may be caused by a design flaw of the rumble client, which I didn't verify though. If the rumble cannot read robowiki's participants list, it will load a local cache instead. However, if that cache is outdated, it may cause the rumble to loose pairings, and recovering takes much longer. But this seems not to be the case losing 40 pairings.

Another possibility may be that the rumble client got a truncated participant list due to network issues, for this case, I may modify the client to check some flag to make sure the loaded participants list is full.

Xor (talk)14:32, 13 July 2019
 

1.9.3.5 Could not load properties file: ./roborumble/roborumble.txt

Hi all, has anybody had the same issue? When I start roborumble.sh, it says "Could not load properties file: ./roborumble/roborumble.txt", and the execution stops right after initiating Iteration 0. In 1.9.3.4, everything seems to work.

Cb (talk)21:29, 23 March 2019

I never ever experienced the same thing. And the code change from 1.9.3.4 is kept minimal that I couldn’t come up with whatever change could cause this to happen.

Anyway have you ever tried to have a clean install? Or maybe the path containing robocode contains some weird char that prevents robocode from processing (e.g. space, this bug is known)

Xor (talk)00:29, 24 March 2019

Thanks, that actually worked. I had to run the installation instead of simply unpacking the jar.

Cb (talk)12:33, 24 March 2019
 
 

Upgrade client version

Hi all

I've been thinking of upgrading the accepted client version. What are your thoughts on the matter? Have any of you tested extensively with the latest releases locally? Are there any changes in scores (or any changes that might affect scores) that we should do more extensive testing of first?

Skilgannon (talk)19:21, 5 July 2018

Finally 1.9.3.3 released, with RoboRumble battle duplicating fix, and with shorter participants list check period from 1.9.3.1 as well. It’s time to do a test and discuss to upgrade.

Question, what kind of tests should be done in local? Should we run a literumble locally and see whether it yields the same score as the main rumble? (which gives the best result but takes monthes). Or just using roborunner with a few robots (both 1v1 and melee certainly), and see their score is unaffected.

Xor (talk)01:08, 11 September 2018

Just roborunner and a few bots should be fine. At some point it would be good to reset the meleerumble as well, since old bots get biased downwards by excessive battles against new (good) bots.

Skilgannon (talk)06:02, 11 September 2018
Edited by author.
Last edit: 00:28, 4 October 2018

I've been always thinking about the pairing systems of meleerumble.

Once every combination of 10 bots had a run, the score is unbiased, which takes N = n! / (10! * (n - 10)!) ≈ 10^19 battles in current settings (n is the total of participants).

However we should get approximate score with feasible battles via monte carlo method. In current settings, ~10000 battles already gives a somewhat stable score (for the new participant).

Let each bot gets m battles, randomly selected from all (N / n) 10-bot combinations containing that bot, then the probability of meeting another specific bot in a battle is (N / n / (n - 1)) / (N / n) = 1 / (n - 1).

Assume that when a new bot is released, every battle contains that bot, then the probability of meeting that bot is 1 instead of 1 / (n - 1), which is highly biased.

To fix this, we have two options — mutate our current pairing systems to get unbiased score online, or to reset the entire meleerumble periodically.

Since the score of new bots are unbiased, all we need to do for an unbiased score is to ignore (n - 2) / (n - 1) biased battles randomly when calculating the score of an old bot. However this approach takes much more battles.

A more practical way is is, when bot A is added, for each battle, select another bot B randomly, and run melee battles containing those two bots as usual. A battle containing A, B and other 8 bots should yield 45 pairings, but only those matching (A, *) or (B, *) is taken into account. This produces 17 parings.

This scheme does not affect the pairings of the new bot itself at all, which is already unbiased; And for an old bot, the probability of being chosen as B is 1 / (n - 1), therefore the probability of a battle with A present being taken into account for old bots is 1 / (n - 1), the same as the unbiased one.

Xor (talk)09:29, 11 September 2018

Your second approach seems good, it will need patches on the client side so that if a priority pairing needs to happen it only uploads the battles which contain one of the priority bots. This filter will work fine for the 1v1 rumble as well.

Why don't we wait to update the client until this can be fixed too?

Skilgannon (talk)20:50, 11 September 2018

The only reason for upgrading earlier is that those two bugs are very annoying when running rumble client 7/24.

And it generally takes monthes for fnl to release a new version in normal cycle ;(

Anyway, since those two fixes are unrelated to robocode engine, one should expect no performance difference if we cherry pick the fix back to 1.9.2.5.

Maybe we could release a special version of 1.9.2.5 for those running rumble 7/24, before the melee pairing fix is released.

Or, we may just ask fnl whether he could please release 1.9.3.4 soon after the meleerumble patch is applied.

Xor (talk)01:51, 12 September 2018
 
 
 
 
 

Huge battle results file?

In literumble stats I see that one of my rumble client has stopped working for a few days — and once I had a look, it shows

929073875 Jul 2 21:40 resultsmelee.txt

the resultsmelee.txt grows so large that even the JVM gets killed when processing the file (887M)

and the content of the file is just one line which gets duplicated all the time (which grows exponentially).

Not sure whether this bug is fixed in the newest version, or how can I send pull request to robocode base? the github code seems to be mirror only.

Xor (talk)06:11, 5 July 2018

I would suggest making a bug on Sourceforge and attaching a patch if you have a fix.

Skilgannon (talk)19:19, 5 July 2018

Thanks ;)

The patch is submitted:

https://sourceforge.net/p/robocode/bugs/395/

Xor (talk)04:43, 8 July 2018
 

Btw, is literumble affected by duplicated uploads? Will it remove duplicated battles automatically?

Xor (talk)05:06, 8 July 2018

Literumble will reject battles older than 24 hours, so any broken battles have a limited window of problems.

Skilgannon (talk)08:40, 8 July 2018

Thousands of duplicated battles could be generated within only a few minutes due to the fact of exponential growth. Thankfully this only happens to bots with multiple weight classes. If literumble is not removing duplicates, then this could answer why some bots get 2x or 5x more battles than other bots. And for those bots, their battle result is mainly determined by those duplicated record which causes inaccurate score ;(

Hope fnl should react sooner this time (instead of half a year)

Xor (talk)10:25, 8 July 2018

Only that pairing will have lots of battles - it won't affect the score that much, since it doesn't affect all the other battles. Also, pairings are weighted with a rolling average so roughly only the last 40 battles actually contribute. So once some more battles happen it won't matter.

Skilgannon (talk)10:34, 8 July 2018
 
 
 
 
 

Bots that aren't removed

This isn't a crucial problem but when I have two computers running the client at the same time bots that should be retired aren't removed.

Dsekercioglu (talk)20:45, 4 July 2018

I usually restart robocode client to get updated list from the wiki. Otherwise it takes several hours to stop running battles with retired bots. I think it improved in the latest version of robocode, but littlerumble server does not accept this version yet.

Beaming (talk)22:40, 4 July 2018
 

I’m running roborumble on 3 computers/servers, and restarting them manually all the time is already annoying. Once we migrate to the newest version of roborumble, running roborumbe as a service may be eaiser, and I could run roborumble on even more servers (50+ roborumbe clients in total!).

Xor (talk)01:05, 5 July 2018
 

ThreadDeath problem

I decided to put a bit more info about the ThreadDeath problem. The offending log entry would look like

Round 4 of 10
=========================
java.lang.ThreadDeath
	at java.lang.Thread.stop(Thread.java:853)
	at net.sf.robocode.host.security.RobotThreadManager.stop(RobotThreadManager.java:190)
	at net.sf.robocode.host.security.RobotThreadManager.stopSteps(RobotThreadManager.java:172)
	at net.sf.robocode.host.security.RobotThreadManager.forceStop(RobotThreadManager.java:143)
	at net.sf.robocode.host.proxies.HostingRobotProxy.forceStopThread(HostingRobotProxy.java:144)
	at net.sf.robocode.host.proxies.BasicRobotProxy.forceStopThread(BasicRobotProxy.java:44)
	at net.sf.robocode.battle.peer.RobotPeer.checkSkippedTurn(RobotPeer.java:649)
	at net.sf.robocode.battle.peer.RobotPeer.executeImpl(RobotPeer.java:492)
	at net.sf.robocode.host.proxies.BasicRobotProxy.executeImpl(BasicRobotProxy.java:384)
	at net.sf.robocode.host.proxies.BasicRobotProxy.execute(BasicRobotProxy.java:122)
	at robocode.AdvancedRobot.execute(AdvancedRobot.java:552)
	at eem.frame.gameInfo.gameInfo.run(gameInfo.java:95)
	at eem.frame.core.CoreBot.run(CoreBot.java:206)
	at net.sf.robocode.host.proxies.HostingRobotProxy.callUserCode(HostingRobotProxy.java:274)
	at net.sf.robocode.host.proxies.HostingRobotProxy.run(HostingRobotProxy.java:221)
	at net.sf.robocode.host.proxies.BasicRobotProxy.run(BasicRobotProxy.java:44)
	at java.lang.Thread.run(Thread.java:748)

Note that something was very wrong. My bot did not received even SYSTEM onDeath event as can be seen in the more complete log below. Though, my bot was counted as a looser for the first 3 rounds by the other bot. Also, my bot outputted some log during rounds 1 to 4, so the error happens somewhere during the round and steal control from the bot. Also note some time profiling at the end, many methods report max as a factor of 100 times more than an average time. I.e. some catastrophic event happend. One issue that the number of operation is different in every method execution, but I bet not by factor of 100.

=========================
Round 1 of 10
=========================
=========== Round #1=============
100007 best target penguin.Joker .611wr
SYSTEM: EvBotNG vtest skipped turn 19
Skipped turn 19 reported at 100020
SYSTEM: EvBotNG vtest skipped turn 32
Skipped turn 32 reported at 100033
100221: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = -0.6450138864756005 with real bullet
100314: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = -0.2827484567498845 with real bullet
100387: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = -0.20989274379107656 with real bullet
100431: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.19347401753112997 with real bullet
=========================
Round 2 of 10
=========================
=========== Round #2=============
Probing new bullet energy 1.95
SYSTEM: EvBotNG vtest skipped turn 8
Skipped turn 8 reported at 200009
200055: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.3557362360118722 with real bullet
200307: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.08198800256947705 with real bullet
200335: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.06521832333874987 with real bullet
penguin.Joker .611wr hit enemy: eem.EvBotNG vtest with gun: circularGun fired at dist: 566.5311086790286
200354: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = -0.10610623841145142 with real bullet
SYSTEM: EvBotNG vtest skipped turn 396
Skipped turn 396 reported at 200397
=========================
Round 3 of 10
=========================
java.lang.ThreadDeath
	at java.lang.Thread.stop(Thread.java:853)
	at net.sf.robocode.host.security.RobotThreadManager.stop(RobotThreadManager.java:190)
	at net.sf.robocode.host.security.RobotThreadManager.stopSteps(RobotThreadManager.java:172)
	at net.sf.robocode.host.security.RobotThreadManager.forceStop(RobotThreadManager.java:143)
	at net.sf.robocode.host.proxies.HostingRobotProxy.forceStopThread(HostingRobotProxy.java:144)
	at net.sf.robocode.host.proxies.BasicRobotProxy.forceStopThread(BasicRobotProxy.java:44)
	at net.sf.robocode.battle.peer.RobotPeer.checkSkippedTurn(RobotPeer.java:649)
	at net.sf.robocode.battle.peer.RobotPeer.executeImpl(RobotPeer.java:492)
	at net.sf.robocode.host.proxies.BasicRobotProxy.executeImpl(BasicRobotProxy.java:384)
	at net.sf.robocode.host.proxies.BasicRobotProxy.execute(BasicRobotProxy.java:122)
	at robocode.AdvancedRobot.execute(AdvancedRobot.java:552)
	at eem.frame.gameInfo.gameInfo.run(gameInfo.java:95)
	at eem.frame.core.CoreBot.run(CoreBot.java:206)
	at net.sf.robocode.host.proxies.HostingRobotProxy.callUserCode(HostingRobotProxy.java:274)
	at net.sf.robocode.host.proxies.HostingRobotProxy.run(HostingRobotProxy.java:221)
	at net.sf.robocode.host.proxies.BasicRobotProxy.run(BasicRobotProxy.java:44)
	at java.lang.Thread.run(Thread.java:748)
=========== Round #3=============
Probing new bullet energy 1.95
300093: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.37068349323008726 with real bullet
SYSTEM: EvBotNG vtest skipped turn 156
Skipped turn 156 reported at 300157
SYSTEM: EvBotNG vtest skipped turn 191
Skipped turn 191 reported at 300192
300301: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = -0.2802401527715257 with real bullet
300493: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.1975865759018777 with real bullet
SYSTEM: EvBotNG vtest skipped turn 559
Skipped turn 559 reported at 300560
=========================
Round 4 of 10
=========================
java.lang.ThreadDeath
	at java.lang.Thread.stop(Thread.java:853)
	at net.sf.robocode.host.security.RobotThreadManager.stop(RobotThreadManager.java:190)
	at net.sf.robocode.host.security.RobotThreadManager.stopSteps(RobotThreadManager.java:172)
	at net.sf.robocode.host.security.RobotThreadManager.forceStop(RobotThreadManager.java:143)
	at net.sf.robocode.host.proxies.HostingRobotProxy.forceStopThread(HostingRobotProxy.java:144)
	at net.sf.robocode.host.proxies.BasicRobotProxy.forceStopThread(BasicRobotProxy.java:44)
	at net.sf.robocode.battle.peer.RobotPeer.checkSkippedTurn(RobotPeer.java:649)
	at net.sf.robocode.battle.peer.RobotPeer.executeImpl(RobotPeer.java:492)
	at net.sf.robocode.host.proxies.BasicRobotProxy.executeImpl(BasicRobotProxy.java:384)
	at net.sf.robocode.host.proxies.BasicRobotProxy.execute(BasicRobotProxy.java:122)
	at robocode.AdvancedRobot.execute(AdvancedRobot.java:552)
	at eem.frame.gameInfo.gameInfo.run(gameInfo.java:95)
	at eem.frame.core.CoreBot.run(CoreBot.java:206)
	at net.sf.robocode.host.proxies.HostingRobotProxy.callUserCode(HostingRobotProxy.java:274)
	at net.sf.robocode.host.proxies.HostingRobotProxy.run(HostingRobotProxy.java:221)
	at net.sf.robocode.host.proxies.BasicRobotProxy.run(BasicRobotProxy.java:44)
	at java.lang.Thread.run(Thread.java:748)
=========== Round #4=============
Probing new bullet energy 1.95
400161: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.6168884721887381 with real bullet
400292: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.09859694511664721 with real bullet
400317: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = -0.47485553157064525 with real bullet
400345: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.2798221445512617 with real bullet
400476: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.2817195309815388 with real bullet
400492: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = 0.34782608695652234 with real bullet
=========================
Round 5 of 10
=========================
=========== Round #5=============
Probing new bullet energy 1.95
SYSTEM: Bonus for killing penguin.Joker .611wr: 11
SYSTEM: eem.EvBotNG vtest wins the round.
Hit by bullet: [5, 4, 3, 6, 0, 0, 0, 0, 0, 0]
Wall hits stats: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Skipped turns stats: [2, 2, 3, 0, 0, 0, 0, 0, 0, 0]
Hit rate stats:   16/158  =   10.13%
Bullet hit bullet stats::   10/158  =    6.33%
Rounds ratio of win/lose = 1/2
Finishing places stats: [1, 2]
myWinLosePlace = 0
My score in this round = 113.4 enemy score = 0.0
My total score = 176.89999999999998 enemy score = 246.76000000000022
Round APS stats: [25.01444251877526, 0.0, 0.0, 14.727325750947783, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Accumulated APS = 41.76%
--- bot penguin.Joker .611wr stats:
hit rate for the following bot(s) out of 172 shots
 eem.EvBotNG vtest:   18/172  =   10.47%
  My virtual gun hit rate stats stats
                 enemy name              circularGun                headOnGun              realHitsGun               unknownGun
          eem.EvBotNG vtest        1/172  =    0.58%        0/172  =    0.00%       18/172  =   10.47%       17/172  =    9.88%
--- bot eem.EvBotNG vtest stats:
wrong path prediction count: 7 <------------------------------ improve me!
Hit me count by the following bot(s)
 penguin.Joker .611wr:   18/172  =   10.47%
  Enemies virtual gun stats
    circularGun of bot penguin.Joker .611wr hit me   12/172  =    6.98%
    headOnGun of bot penguin.Joker .611wr hit me   13/172  =    7.56%
    realHitsGun of bot penguin.Joker .611wr hit me    1/172  =    0.58%
hit rate for the following bot(s) out of 158 shots
 penguin.Joker .611wr:   16/158  =   10.13%
  My virtual gun hit rate stats stats
                 enemy name              circularGun         circularAccelGun                headOnGun                  kdtGF50                 kdtGF100                 kdtGF200                 kdtGF400                 kdtGF800                kdtGF1600           guessFactorGun                randomGun            assistedGFGun   decayingGuessFactorGun   flipLastGuessFactorGun
       penguin.Joker .611wr       11/147  =    7.48%       13/147  =    8.84%       17/147  =   11.56%       23/147  =   15.65%       14/147  =    9.52%       12/147  =    8.16%       19/147  =   12.93%       14/147  =    9.52%       18/147  =   12.24%       11/147  =    7.48%       17/147  =   11.56%       13/147  =    8.84%        7/147  =    4.76%       17/147  =   11.56%
bot penguin.Joker .611wr intercepted my bullet   10/172  =    5.81%
Profiler stats---------------------------
  getOverlap was executed 22026 execution times: min 67 nS, average 118 nS, max 58 uS
  getJoin was executed 5 execution times: min 2 uS, average 2 uS, max 3 uS
  choseNewPath was executed 2529 execution times: min 95 uS, average 321 uS, max 14 mS
  rankAimAtAllSolutions was executed 2358 execution times: min 243 nS, average 4 uS, max 2 mS
  waveWithBullets.getDanger was executed 312940 execution times: min 74 nS, average 331 nS, max 2 mS
  calculateDanger was executed 10899 execution times: min 801 nS, average 43 uS, max 13 mS
  waveWithBullets.getWaveDanger was executed 26899 execution times: min 450 nS, average 2 uS, max 2 mS
  gunManagerManage was executed 2529 execution times: min 3 uS, average 586 uS, max 12 mS
---------------------------
500353: penguin.Joker .611wr hit eem.EvBotNG vtest at GF = -0.31909710498646854 with real bullet
=========================
Beaming (talk)02:41, 5 September 2017

Would you try modifing the source of robocode to make it ouput the result of checkSkippedTurn? I think the bug may be whether the skipped turns are counted incorrectly or some skipped turns are not logged to console.

Xor (talk)03:21, 5 September 2017

Skipped turns are logged (and SkippedTurnEvents happens) only when the Robocode regains control over the execution of the thread. Since there is an unhandled exception being thrown right during the skipped turn checking, it makes sense that the skipped turns are not logged. I'm pretty sure you are skipping too many turns, Thread.stop() is being called as it is supposed to be (by looking at Robocode source), the exception is being thrown (because Thread.stop() is deprecated) and for some reason it's not being handled.

So, the error message is pretty much "you have skipped too many turns, I tried to stop your thread but for this I called a deprecated function which throws an error". The bot punishment for skipping too many turns is correct. The correct questions are: this should really happen? not the error, but the "too many skipped turns" thing. Does it happen when locking to 1000 FPS? If it was a "fair" turn skipping, it should happen while locked to 1000 FPS as well? If yes, why it's behaving differently when on full speed? Can others reproduce the same issue? (pick Roborio vs Neuromancer, for example, and go full speed). Why it's more likely to happen when a slow bot is against a fast bot? And so on.

Does you guys have any other interesting observations on that?

Rsalesc (talk)03:35, 5 September 2017

Ok. Roborio also fall into ThreadDeath in the battle:

rsalesc.roborio.Roborio 1.2.7  vs penguin.Joker .611wr

It does not happens at 1000 FPS, only if I push the slider to max.

I also see DrussGT falling into ThreadDeath in the battle:

jk.mega.DrussGT 3.2.1 vs penguin.Joker .611wr

It seems that in a pair of bots the most CPU demanding gets the exception.

Beaming (talk)04:33, 5 September 2017

Yeah, here is the heart of the issue in my opinion. Weird things going under the hood when going full speed. I still have not fully understood Robocode skipped turn source so I'm not sure what's happening. I'll do more tests tomorrow.

Rsalesc (talk)12:51, 5 September 2017
 

I looked at the internals. The difference between desired 1000 TPS and max is that in the later case the Thread.sleep is called (actually if you have more than 0.5 ms to spare). I am guessing that probabilistically Thread.Sleep is called couple times per round.

I do not know what java does when thread is asleep, but I would imagine that the garbage collector and other gizmos kick in during the sleep. While at max TPS the java chooses as it wishes when to run GC and if you are the unlucky one, the GC time will be counted against your bot. This would explain sporadic super long executions in my bot time profiling.

Beaming (talk)19:45, 5 September 2017
 

I would gladly try. But how do I call it within the AdvancedBot?

Beaming (talk)04:24, 5 September 2017

What I mean is that you hack in to the robocode to make it output some useful information about these bugs. There is no need for your bot to call that, as checkSkippedTurn is called by the game every turn.

Xor (talk)05:17, 5 September 2017
 

I must be very distracted, the skipped turns should be logged, right?

They are logged before the piece of code which calls the thread stopping procedure. It's logged if the bot is still alive. That means that the bots which are getting the ThreadError are not alive at all?

Rsalesc (talk)14:45, 5 September 2017

Yes, that's very strange. And that's why I think hack into robocode source code and make it output some useful information in checkSkippedTurn would help.

This would help us find out 1. why skipped turns are getting greater than 30 eventually. 2. why there is no output before at all (is it still alive? )

I'm also thinking about the possibility that the main thread of robocode is also skipping turns itself ;p

Xor (talk)15:14, 5 September 2017

I cannot remember how I get this knowledge but I recall that the logic is following. Robocode let you consume as much time as you want per tic (see the exception below), than if you exceed time quota, it will force you to skip as many turns as you excess time over permited time per tic. That is why you often see skipped turns in succession (though, not in my log above).

However, if a bot have a glitch and never returns control back to the robocode (let's say there is an infinite loop), then robocode have a way to force stop such bot. I would not be surprised that it first kill the bot and then executes checkSkippedTurn. In this case a bot will see nothing in console.

Beaming (talk)18:26, 5 September 2017
 

For your questions:

  1. I/O robots (bots that read/write from the data directory) get 240 skipped turns. Apparently a robot can get marked as an I/O robot just by calling getDataDirectory().
  2. This is where things stop making sense. The stacktrace shows RobotPeer.checkSkippedTurn() calling BasicRobotProxy.forceStopThread(), but the code shows that it can't happen without going through println("SYSTEM: ..."), there literally is no other code path. Are println() calls getting silently dropped?
  3. The Robocode main thread can't "skip turns" because it controls the turn counter.

Relevant code:

public void checkSkippedTurn() {
    // Store last and current execution time for detecting skipped turns
    lastExecutionTime = currentExecutionTime;
    currentExecutionTime = battle.getTime();

    int numSkippedTurns = (currentExecutionTime - lastExecutionTime) - 1;
    if (numSkippedTurns >= 1) {
        events.get().clear(false);

        if (isAlive()) {
            for (int skippedTurn = lastExecutionTime + 1; skippedTurn < currentExecutionTime; skippedTurn++) {
                addEvent(new SkippedTurnEvent(skippedTurn));
                println("SYSTEM: " + getShortName() + " skipped turn " + skippedTurn);
            }
        }

        if ((!isIORobot && (numSkippedTurns > MAX_SKIPPED_TURNS))
                || (isIORobot && (numSkippedTurns > MAX_SKIPPED_TURNS_WITH_IO))) {
            println("SYSTEM: " + getShortName() + " has not performed any actions in a reasonable amount of time.");
            println("SYSTEM: No score will be generated.");
            setHalt(true);
            waitWakeupNoWait();
            punishBadBehavior(BadBehavior.SKIPPED_TOO_MANY_TURNS);
            robotProxy.forceStopThread();
        }
    }
}
MultiplyByZer0 (talk)18:48, 5 September 2017

Here is my current best guess.

Note that Beaming's stacktrace includes:

...
at net.sf.robocode.host.proxies.BasicRobotProxy.forceStopThread(BasicRobotProxy.java:44)
at net.sf.robocode.battle.peer.RobotPeer.checkSkippedTurn(RobotPeer.java:649)
...

Therefore, RobotPeer.checkSkippedTurn() called BasicRobotProxy.forceStopThread()

The source code of RobotPeer.checkSkippedTurn() shows one and only one possible call to BasicRobotProxy.forceStopThread():

public void checkSkippedTurn() {
    // ...
    if (/* snip */) {
        println("SYSTEM: " + getShortName() + " has not performed any actions in a reasonable amount of time.");
        println("SYSTEM: No score will be generated.");
        /* snip */
        robotProxy.forceStopThread();
    }
}

Therefore, control flow must have passed through this path.

Note that this code sequence includes a println("SYSTEM: <Bot> has not performed any actions...") call, which must have been executed, yet no such SYSTEM message is present in Beaming's log.

The source code of the println() method:

public void println(String s) {
    synchronized (proxyText) {
        battleText.append(s);
        battleText.append("\n");
    }
}

Note the following:

  1. Robocode is multithreaded. Heavy multithreading causes race conditions.
  2. The variable battleText is a StringBuilder, which is not thread-safe (unlike a StringBuffer), which is.
  3. The code modifies battleText, but only synchronizes against proxyText.

Therefore, EvBotNG is skipping turns, but no log messages (from either Robocode or the bot) are printed, because they are silently dropped due to race conditions in the println() method. The only thing you ultimately see is the ThreadDeath exception caused by Thread.stop() forcibly terminating the thread.

Presumably, this occurs because of unlucky interaction between RobotPeer.println() and RobotPeer.readOutText().

readOutText()                                 | println()
============================================= | ===============================
final String robotText =                      |
battleText.toString() + proxyText.toString(); |
                                              | battleText.append(s);
                                              | battleText.append("\n");
battleText.setLength(0);                      |
proxyText.setLength(0);                       |
return robotText;                             |

Therefore, the solution is to add synchronized(battleText) { guards around readOutText() and println().

Or maybe I'm way off track.

MultiplyByZer0 (talk)20:46, 5 September 2017
 
 
 
 

Just looked at those functions showing in error stack, in checkSkippedTurn(), it says: SYSTEM: No score will be generated. before the thread is killed. Therefore the good news is that these errors should not affect your scores.

And oracle says An instance of ThreadDeath is thrown in the victim thread when the Thread.stop() method is invoked. and The top-level error handler does not print out a message if ThreadDeath is never caught.

therefore the error message you see in the console could simply because robocode caught that error to make some clean-ups.

actually robocode kills your thread when you are skipping 30 turns in a row (or if you have file access, this will be increased to 240).

Xor (talk)05:33, 5 September 2017

It somehow affects your score if you performed very well in this round :P Ok, the impact should be really small, and sometimes it may happen when you are doing bad, so it should balance, but you know... still a strange behavior.

Rsalesc (talk)12:48, 5 September 2017

You do not have permission to edit this page, for the following reasons:

  • The action you have requested is limited to users in the group: Users.
  • You must confirm your email address before editing pages. Please set and validate your email address through your user preferences.

You can view and copy the source of this page.

Return to Thread:Talk:RoboRumble/ThreadDeath problem/reply (9).

 

I think "no score will be generated" means that affected bot will get no points. The opponent still gets points, the winner bonus is assigned as the very least.

Beaming (talk)14:32, 5 September 2017
 

Searching on my system and old backups I was able to find Robocode versions for 1.7.4.2, 1.8.1.0. I was also able to download 1.8.0.0 and 1.9.0.0. So I ran some experiments using Neuromaner vs RaikoMicro. Note, dev version of Neuromancer I'm using here prints out each time it gets a SkippedTurnEvent.

  • I can't reproduce it in at all 1.7.4.2. All output looks perfect - every round has printed SYSTEM lines either saying win or death, and Neuromancer correctly gets win/death events. Neuromancer doesn't skip any turns.
  • I can't reproduce it at all in 1.8.0.0 - not even "SYSTEM: Neuromancer 5.4 has not performed any actions in a reasonable amount of time." However there are some rounds where nothing is printed, which is very suspicious. Still no skipped turn events.
  • In 1.8.1.0 I can sometimes get a "SYSTEM: Neuromancer 5.4 has not performed any actions in a reasonable amount of time.". I saw this 3 times out of 10+ battles. There are also the occasional suspicious blank rounds where Neuromancer prints nothing, and SYSTEM prints nothing. Still no skipped turn events.
  • In 1.9.0.0 I can reproduce ThreadDeath exceptions. On average 1 per battle, but sometimes 0 and max I saw was 4. Average of 3 skipped turn events per battle.

To note: all of them had similar CPU constants (between 5.3ms and 5.4ms).

Other things I tried:

  • Changing the GC algorithm doesn't affect the number of ThreadDeaths in 1.9.0.0
  • Doing a single getDataDirectory() at the beginning of each round doesn't affect the number of ThreadDeaths in 1.9.0.0

This makes me think it is a Robocode bug - possibly multiple bugs, since we have very different behaviors here over the different versions. It also greatly worries me that bots which were fine in 1.7.4.2 have problems in new versions.

Skilgannon (talk)19:58, 5 September 2017

Hi Skilgannon,

Isolating robocode issues from jdk version. Would it be correct to assume that you ran everything with openjdk-8?

Beaming (talk)20:14, 5 September 2017

Yes, all OpenJDK 8

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
Skilgannon (talk)20:19, 5 September 2017
 

Here is the old installs I used to do these tests, I'd appreciate if someone could try them on Windows as well.

Tying into what Beaming said about the sleep in the internals not happening when set to max, perhaps this has been changed since earlier versions of Robocode. However there are more things that may be an issue as well, I don't think that is the total of what is buggy here. The missing prints in a round particularly concerns me (and yes, this still happens in recent versions).

Skilgannon (talk)20:16, 5 September 2017
 

If this don't happen when running the rumble, I suggest you use -Ddebug=true command line flag for robocode, which disables skipped turns & painting limit, to temporarily "solve" this problem.

Xor (talk)15:13, 15 January 2018
 

Thousands of duplicated battles???

After my Roborumble@Home experienced some network error, and when the network finally recovered —

OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 9ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 7ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 20ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 25ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 13ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 37ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 41ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 28ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 12ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 18ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 27ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 7ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 10ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 43ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 16ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 24ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 7ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 11ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 13ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 11ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 72ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 81ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 44ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 19ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 7ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 37ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 47ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 79ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 84ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 5ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 6ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 11ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms
OK. MyFirstJuniorRobot vs PingPong added to queue in 4ms

there are thousands of similar logs, but when I searched the history, there are only one battle of "MyFirstJuniorRobot vs PingPong", which failed to upload and got doubled each time it failed again.

I think this must be some bug in Roborumble@Home, since the network is broken. And I see similar things quite often, although not that huge. It seems that each time a battle fails to upload, it doubles, and then two battles of the same fails to upload, it doubled again, and it grows like crazy.

Xor (talk)08:19, 23 October 2017

Since such battles are timestamped, it would not be a problem for the sever to remove duplicates with same timestamp, uploader and pairings before adding this to queue. But what I see is that the queue got full after thousands of uploads and the battles are logged, e.g. in BottomUp's page, SuperCrazy has 160 battles, which is significantly more than anything else.

Xor (talk)08:25, 23 October 2017
 

But the most important thing imo is to fix that in the client...

Xor (talk)08:26, 23 October 2017
 

This has happened to me too. I fixed it when I changed my computer.=)

Dsekercioglu (talk)12:42, 23 October 2017

Do you mean by using another computer, it won't submit duplicated battles after network error? Are you still using mac on the new computer?

Xor (talk)14:50, 23 October 2017

Yes,I still use a mac. It happened when I stopped a client before it finishes the whole iteration and then change the version.

Dsekercioglu (talk)15:11, 23 October 2017

change the version?

Xor (talk)15:32, 23 October 2017

Sorry for not being clear. I was meaning the robocode version but I'm not sure.

Dsekercioglu (talk)17:38, 23 October 2017
 
 
 
 
 

Script to fixup rotten participant jar file links

I cooked up a script to fix rotten link FixingParticipantLinks please use it from time to time

Beaming (talk)04:01, 8 September 2017

ThreadDeath problem and large amount of skipped turns

This continuation of problem investigation mentioned at Thread:Talk:RoboRumble/Client java version and Thread:Talk:RoboRumble/ThreadDeath problem.

After Skilgannon patch, I can see some useful debugging info. In particular, I added output for the number of skipped turns which triggers ThreadDeath call.

I see that as many as 100 or even more skips are detected. This is when TPS slider at max. Move it to 1000 and everything is handy dandy. Note that 1000 TPS is unrealistic with my CPU constant of 6 ms. I.e. per second I can get 1/0.006 about 170 tics. So the system have no time to go to the idle state in either case. On top of it, 160 skipped turns (times 6ms), i.e. about 1 seconds of inactivity, would be noticeable with a naked eye watching the battle. I see no freeze there. So something does not add up.

Here I need the experts help. I look at the source, and the only timing mechanism I see is that within allocated time the thread must report isSleeping. But I see no time checks anywhere, i.e. no one calls for nanoTime. So how the robocode decides that the timeout is exceeded?

Could it be that java calls to robocode waitSleeping are not done correctly.

Here is one more strange thing. I switched debug=true, than I have about 300*cpuConstant to finish a tic, and I time profiled everything. My time per tic is consistently shorter with debug=true, then with debug=false (default). I know it probabilistic but ... Also, in either case my inner methods never report times exceeding 25mS, which is 5 skipped ticks at most. So how do I end up with 100 skipped tics penalty.

Also, I cannot get to ThreadDeath when I play against HawkOnFire. This is very simple and fast bot, but how does it help my bot to avoid the skipped turn penalty?

Beaming (talk)19:38, 7 September 2017

It's interesting, I actually see considerable speed difference between running at 1000TPS and max, even though my CPU constant is 5.3ms. I think this is because many ticks have much less than 1ms of calculations, and these cause a sleep in 1000TPS mode. Also, just to confirm, I also only see the ThreadDeath issues when running at max, and never at 1000TPS.

From what I remember the engine works something like this:

  1. Engine triggers condition variable to release bot thread
  2. Engine goes to sleep for up to CPU_CONSTANT milliseconds
  3. Bot thread runs
  4. Bot thread finishes, triggers interrupts to wake up engine thread early
  5. Engine thread wakes up, and checks time. If time exceeded, divide time taken by CPU_CONSTANT milliseconds, subtract 1, say bot skipped this many turns, if exceeds 30 kill bot. Otherwise continue as normal.

So I'm wondering if maybe there is another thread that is delaying the engine thread from waking up, perhaps to do some maintenance (garbage collection, JIT compiler swapping out methods with optimized versions, etc). There are probably heuristics that say it is a good time to do maintenance, when switching between threads, if nothing else is available. When in 1000TPS mode these actions would happen when the sleep happens (ie. nicely scheduled, not interfering with bot timing etc), since the heuristics say it is better to work in a sleep than to not switch between threads quickly.

In my mind, the easiest way to fix this would be by also doing timing in the bot thread, and only checking the timing in the engine thread if the bot thread hasn't finished yet.

Thoughts? Does anybody see issues with my thinking here?

Skilgannon (talk)20:54, 7 September 2017

It does not look that item 5 is performed the way which would be reasonable (i.e. how you describe).

Have a look checkSkippedTurn() where decision about penalty is done (I believe it is actually your code :). It does not check CPU time, it makes comparison based on the internal robocode Ticks.

 int numSkippedTurns = (currentExecutionTime - lastExecutionTime) - 1;

Robocode should call something to increase time (tic) inside of robot peer. If it does not do so for a bot, that bot will be punished. I still cannot find the part of the code where time++ logic is executed. These threads drive me nuts.

So, I like your proposal to time the bot inside its thread.

Beaming (talk)21:45, 7 September 2017

Hmm, there is still a problem with my idea, robocode will still kill the thread if it doesn't respond in time.

I see two different ways to combat this:

  1. Put a turnState enum with states {START, RUNNING, FINISHED} which can be polled to know if the bot thread is finished, combine this with timing in the bot thread, and then if it is finished we know it is not the bot causing the delay, so we don't kill the thread.
  2. Put some small sleeps every ~100 ticks to give the JVM time to perform optimizations and cleanup without interfering with the bot threads.

These could be combined, since they attack the problem from different sides.

Skilgannon (talk)22:20, 7 September 2017
 
 
 

Client java version

Can we have a quick survey about java version with which you run your litumble clients?

I see that performance of my bots dropped since I switched to java-8-openjdk for bot compilations. Plus I see ridiculosly low scores for my bot against some very simple bots at the literumble. On my machine I beat them with much bigger margin. So I suspect that there is something strange with one of the clients.

For the record, I compile everything with java-8-openjdk and run my literumble clients with java provided within this jdk.

Beaming (talk)03:03, 4 September 2017

I'm using Java 8 for my rumbles. However, it seems that some bot stopped working on Java 8? etc. MoxieBot.

I'm also using Java 8 and its features for bot development. However, I compile my bot with Java 8, then transpile the bytecode to Java 6 compatible using retrolambda, as Java 8 compiled code will generally refuse to run on lower platform.

Xor (talk)04:45, 4 September 2017

Cross porting from Java 8 seems to be excessive, if the rest of us are running Java 8. But let's see what others are running.

Beaming (talk)05:20, 4 September 2017

But why risk getting low scores when there are someone using Java6? I think anyone who participant in rumble should make the bot compatible with Java 6 until it is not officially supported by the literumble.

Maybe what we really need is a vote for moving the minimum requirement of running rumble from Java 6 to Java 8?

Xor (talk)10:18, 4 September 2017

> what we really need is a vote

The problem with the Robocode community is that everyone talks making changes, but no one actually does anything.

MultiplyByZer0 (talk)10:58, 4 September 2017

Please don't be so harsh.

Our problem that we don't have large enough community. We can count active users in two hands. You cannot expect everyone to jump on the issues right away.

At least we can make reasonably complete bug reports and see if they can be addressed.

Beaming (talk)15:25, 4 September 2017
 
 
 

By the way, ncj.MoxieBot 1.0 is running OK on my machine. It sometimes freezes but it seems to be the fault of the internal logic.

Beaming (talk)05:24, 4 September 2017

But all my bots are getting 100% against MoxieBot on my computer, whereas there seems to be some 50% on the rumble, which makes me think that it doesn't work as expected on Java 8.

Xor (talk)05:57, 4 September 2017
 

MoxieBot is completely not working on my older machine (not the one I use to run RoboRumble). Output of MyFirstRobot vs. MoxieBot:

=========================
Round 1 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
SYSTEM: MoxieBot 1.0 skipped turn 60
SYSTEM: MoxieBot 1.0 skipped turn 61
SYSTEM: MoxieBot 1.0 skipped turn 62
SYSTEM: MoxieBot 1.0 skipped turn 132
Skipped firing solution at turn: 149
Skipped firing solution at turn: 171
Skipped firing solution at turn: 210
Skipped firing solution at turn: 211
SYSTEM: MoxieBot 1.0 skipped turn 249
Skipped firing solution at turn: 287
Skipped firing solution at turn: 469
SYSTEM: MoxieBot 1.0 skipped turn 546
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 1.1000000000000025
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 2 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
SYSTEM: MoxieBot 1.0 skipped turn 64
SYSTEM: MoxieBot 1.0 skipped turn 105
SYSTEM: MoxieBot 1.0 skipped turn 144
SYSTEM: MoxieBot 1.0 skipped turn 145
SYSTEM: MoxieBot 1.0 skipped turn 182
SYSTEM: MoxieBot 1.0 skipped turn 220
SYSTEM: MoxieBot 1.0 skipped turn 221
SYSTEM: MoxieBot 1.0 skipped turn 256
SYSTEM: MoxieBot 1.0 skipped turn 292
SYSTEM: MoxieBot 1.0 skipped turn 293
SYSTEM: MoxieBot 1.0 skipped turn 330
SYSTEM: MoxieBot 1.0 skipped turn 369
SYSTEM: MoxieBot 1.0 skipped turn 406
SYSTEM: MoxieBot 1.0 skipped turn 442
SYSTEM: MoxieBot 1.0 skipped turn 477
SYSTEM: MoxieBot 1.0 skipped turn 515
SYSTEM: MoxieBot 1.0 skipped turn 553
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.0
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 3 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
Skipped firing solution at turn: 64
SYSTEM: MoxieBot 1.0 skipped turn 104
SYSTEM: MoxieBot 1.0 skipped turn 138
SYSTEM: MoxieBot 1.0 skipped turn 212
SYSTEM: MoxieBot 1.0 skipped turn 249
SYSTEM: MoxieBot 1.0 skipped turn 283
SYSTEM: MoxieBot 1.0 skipped turn 319
SYSTEM: MoxieBot 1.0 skipped turn 320
SYSTEM: MoxieBot 1.0 skipped turn 321
SYSTEM: MoxieBot 1.0 skipped turn 356
SYSTEM: MoxieBot 1.0 skipped turn 357
SYSTEM: MoxieBot 1.0 skipped turn 393
SYSTEM: MoxieBot 1.0 skipped turn 431
SYSTEM: MoxieBot 1.0 skipped turn 468
SYSTEM: MoxieBot 1.0 skipped turn 503
SYSTEM: MoxieBot 1.0 skipped turn 504
SYSTEM: MoxieBot 1.0 skipped turn 577
SYSTEM: MoxieBot 1.0 skipped turn 616
SYSTEM: MoxieBot 1.0 skipped turn 653
SYSTEM: MoxieBot 1.0 skipped turn 688
SYSTEM: MoxieBot 1.0 skipped turn 726
SYSTEM: MoxieBot 1.0 skipped turn 727
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.3000000000000007
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 4 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
SYSTEM: MoxieBot 1.0 skipped turn 36
SYSTEM: MoxieBot 1.0 skipped turn 75
SYSTEM: MoxieBot 1.0 skipped turn 148
SYSTEM: MoxieBot 1.0 skipped turn 222
SYSTEM: MoxieBot 1.0 skipped turn 281
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.20000000000000284
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 5 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
SYSTEM: MoxieBot 1.0 skipped turn 66
SYSTEM: MoxieBot 1.0 skipped turn 102
Skipped firing solution at turn: 140
Skipped firing solution at turn: 141
SYSTEM: MoxieBot 1.0 skipped turn 178
SYSTEM: MoxieBot 1.0 skipped turn 179
SYSTEM: MoxieBot 1.0 skipped turn 214
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.10000000000000024
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 6 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
SYSTEM: MoxieBot 1.0 skipped turn 58
SYSTEM: MoxieBot 1.0 skipped turn 59
SYSTEM: MoxieBot 1.0 skipped turn 96
SYSTEM: MoxieBot 1.0 skipped turn 97
SYSTEM: MoxieBot 1.0 skipped turn 131
SYSTEM: MoxieBot 1.0 skipped turn 169
SYSTEM: MoxieBot 1.0 skipped turn 170
SYSTEM: MoxieBot 1.0 skipped turn 207
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.0
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 7 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
Skipped firing solution at turn: 102
SYSTEM: MoxieBot 1.0 skipped turn 120
Skipped firing solution at turn: 153
Skipped firing solution at turn: 154
SYSTEM: MoxieBot 1.0 skipped turn 257
SYSTEM: MoxieBot 1.0 skipped turn 333
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 92.0
Energy Fired: 0.6000000000000002
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 8 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
SYSTEM: MoxieBot 1.0 skipped turn 68
SYSTEM: MoxieBot 1.0 skipped turn 106
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.0
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 9 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
Skipped firing solution at turn: 100
Skipped firing solution at turn: 101
Skipped firing solution at turn: 102
SYSTEM: MoxieBot 1.0 skipped turn 138
SYSTEM: MoxieBot 1.0 skipped turn 177
SYSTEM: MoxieBot 1.0 skipped turn 215
SYSTEM: MoxieBot 1.0 skipped turn 254
SYSTEM: MoxieBot 1.0 skipped turn 293
Skipped firing solution at turn: 373
SYSTEM: MoxieBot 1.0 skipped turn 407
SYSTEM: MoxieBot 1.0 skipped turn 479
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.4999999999999976
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
=========================
Round 10 of 10
=========================
C:\robocode\robots\.data\ncj\MoxieBot.data
Skipped firing solution at turn: 155
SYSTEM: MoxieBot 1.0 skipped turn 307
SYSTEM: MoxieBot 1.0 skipped turn 367
SYSTEM: MoxieBot 1.0 skipped turn 399
SYSTEM: MoxieBot 1.0 skipped turn 419
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Hit by a wave that was not being correctly tracked. Fix this!
Damage Taken: 96.0
Energy Fired: 0.8000000000000018
Hit by a wave that was not being correctly tracked. Fix this!
SYSTEM: ncj.MoxieBot 1.0 has died
MultiplyByZer0 (talk)20:24, 4 September 2017

I do not think that above report indicates that MoxieBot is broken. Actually, the log indicates that the bot was working and was reporting sensible things. The part about

SYSTEM: ncj.MoxieBot 1.0 has died

is due to its logic: MoxieBot does not fire when there are no bullets in the air. If the other bot runs out of energy, then they both wait and robocode gives an energy penalty kick after certain "no fire" timeout. Eventually they both killed by penalty energy drain, which is reported as "has died".

I played MoxieBot in the GUI it gives similar log entry while it is moving and firing.

Beaming (talk)01:31, 5 September 2017

In the log above, there are 25 lines of "Hit by a wave that was not being correctly tracked", indicating MoxieBot losing energy. That would be consistent with MoxieBot stalling and MyFirstRobot getting a 100% hitrate on it. MyFirstRobot fires 1.0 power bullets, which cause 4.0 damage, and 100 / 4 = 25 hits to kill = 25 log messages.

I also made a video of MoxieBot vs. TrackFire on that computer. It stalls for 2 rounds, but works on the other 8. It doesn't seem so bad when not minimized.

I wonder if the bug is that MoxieBot loses its radar lock and cannot regain it, which wouldn't be that hard of a fix...

MultiplyByZer0 (talk)02:37, 5 September 2017
 
 
 
 

openjdk8 here, on Linux.

Skilgannon (talk)07:26, 4 September 2017
 

java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

Cb (talk)09:14, 4 September 2017
 

JDK 9 on Mac. Having the same problems with you.

Dsekercioglu (talk)09:33, 4 September 2017
 
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

on Windows 10.

MultiplyByZer0 (talk)10:36, 4 September 2017
 

Java 1.7, as I just use an older unused computer for it. Some bots don't run in the rumble, but those battles are not even fought, so no pollution of the stats. I plan to update to Java 1.8 later this week.

GrubbmGait (talk)11:11, 4 September 2017
 

openjdk8

Rsalesc (talk)11:47, 4 September 2017
 

Ok. Among recent literumble clients uploads we mostly have java8. The only exceptions are Dsekercioglu and GrubbmGait, we also have uncertainty on Anonymous uploads. GrubbmGait did not make uploads more recent than 4 days old, while I have score glitches on more recent releases. It could be abnormality in Java9.

One more thing. If I run GUI client at full speed with debug graphics toggle off, from time to time I see a error message in console from robocode 1.9.2.5 about java Threads dying. In such battles my score drops a lot, strange thing that it is not directly related to skipped turns counts. It could be a bug in robocode itself.

Does anyone see such phenomenon?

Beaming (talk)15:20, 4 September 2017

@ Dsekercioglu, would you mind switching off you liteclient for a while? Let's see if we can pinpoint the issue to java9 glitches.

@ all, if you are not running java8, please do not run liteclient for a week, starting from 2017/09/04.

Beaming (talk)15:27, 4 September 2017

Okay I'm closing it.

Dsekercioglu (talk)15:28, 4 September 2017

Or you can just use two versions in parallel ;) For me I develop my bot and run the rumble on Java 8, but I always test it on Java 6 before every release to make sure it works.

Just install them in different directories, and call java executable with the correct directories when starting robocode/roborumble.

Xor (talk)15:42, 4 September 2017
 

Would adding a bot written with JDK9 and compiled with robocode would create a problem if there was an error with JDK9?

Dsekercioglu (talk)12:27, 6 September 2017

If there is an error in JDK, than sure it will be a problem.

But there might be a problem with JDK9 compilation, even if jdk9 itself is good, if the rest of us run literumble with java8. You bot might even not start in our clients.

Couple years ago when java transitioned from java 6 to java 7, we had this issue in rumble. People who made their bots with more recent java were in disadvantage and their bots showed a lower score.

I would suggest to cross compile your bot to java8 version, since according to the poll the rest of us run java8. Or go to extremes and make it compatible with java7 via retrolambda, as User:Xor does.

Beaming (talk)15:19, 6 September 2017

Java 7 compatible is a very good idea, I am on 1.7_051 (but intend to go to JDK 8 in the near future) and can't run battles for a handful of bots. Just look at the missing pairings of GrubbmThree 0.9a. Btw, other clients should do those, why don't they. But it seems that there are also a few bots that can't handle a Java 8 client, like tcf.Drifter and sm.Devil (see comparison between GrubbmThree and MaxRisk)

GrubbmGait (talk)16:43, 6 September 2017
 
 
 

Yeah, I have exactly the same issue, but since I never saw anyone complain about this, I just ignored it. I can reproduce the issue with 1.9.2.6 as well.

I spent a lot of time reading Robocode's source trying to find a connection between that and skipped turns with no real success. Perhaps Skilgannon, which seems to be strongly related to how Robocode evaluate skipped turns as it is today, could share his thoughts about this.

When testing it with Roborio, there were a few times I fixed the running speed at 1000 TPS and could see skipped turn messages instead of these Thread errors, but this only happened when using my old GoTo code, which was really slow. I can't see skipped turn messages with Roborio 1.2.4, for example.

Then I tried to run Neuromancer with the same setup and could see a lot of these Thread dying errors as well, despite seeing no skipped turn messages when locking at 1000 TPS.

What is weird is not that the crashes are occurring at all. Maybe they really make sense. But the thrown exception instead of a helpful message is somewhat weird.

Rsalesc (talk)15:34, 4 September 2017

I sometimes see the ThreadDeath things as well, it seems completely sporadic. I can't reproduce it at all with the current dev version.

A possible issue is the platform it is run on. Windows has a system timer with a very coarse tick (30ms IIRC). We had to use the nanosecond timer in chunks of 0.999999ms to emulate the larger timer. Maybe this nanosecond timer is broken in later releases of Oracle JDK.

So I'm curious: the people who are seeing Moxiebot broken, are you running Windows? Are you using Oracle JDK or OpenJDK?

Skilgannon (talk)19:01, 4 September 2017

So, I was little distracted when I read the source for the first time. Now I've read it again.

This error is thrown when the bot must be stopped because it skipped too many turns in a row, since Thread.stop() is deprecated. Is that right? I can safely assume that if this error appears, then the bot has skipped too many turns in a row?

My only doubt is (it's more like a curiosity than anything else): what may cause the robot to skip this amount of turns when going full speed and not to skip any turns when going 1000 TPS?

I'm on OpenJDK 8 and Ubuntu, by the way.

Rsalesc (talk)01:38, 5 September 2017
 
 
 
Edited by author.
Last edit: 20:54, 5 September 2017

Perhaps we should all give more details about how we run the rumble client.

I run RoboRumble intermittently, not continuously (only when I see interesting new bots added to the participants list). So far, I've only run roborumble (not meleerumble or others), but that may change soon. (Edit: As of September 5, 2017 8:49 PM CET, I have started running meleerumble). It's running on my everyday-use computer, and not a dedicated machine. Sometimes I run Robocode battles or browse to CPU-intensive webpages, and that may cut into the amount of CPU the client gets. My CPU constant is 6500859 ns (6.5 ms) per turn. I have a 4-core machine, and RoboRumble tends to take up 30-60% CPU constantly. It takes about 15 minutes to execute 50 battles.

Seriously though, if your robot is incompatible with certain setups, the fault lies in your robot. Perhaps you should respond to SkippedTurnEvents by reducing the amount of computation your robot performs.

MultiplyByZer0 (talk)16:33, 4 September 2017

Running the rumble client on an ultrabook when I'm not using it and it is plugged into power. Often it uses 2 cores even with a single client. CPU constant is about 5.3ms in openjdk8 using Linux.

About the skipped turn thing, I agree. A big part of Robocode is how long you have to do your processing in. It is a massive tradeoff and I know some of my bots occasionally step over the edge. However, I also don't want to change the rules of the competition. If there is something in Oracle JDK8 that is killing certain bots we need to figure out what that is.

Skilgannon (talk)18:43, 4 September 2017

I am not arguing that heavy on skipping bots should not be punished, my complain that it is erratic and seemingly coming from Java itself. Looks like it shows when a heavy bot is matched against a low CPU demanding one.

By the way, sometimes it to my advantage. I see strange unexplainable APS gain in melee against 'sgp.JollyNinja 3.53' [1]

Note that my v7.4 is very mediocre when compared against v6.1, except one case JollyNinja.

Beaming (talk)19:09, 4 September 2017

Heavy vs light causing problems sounds to me like a race condition. And I think this might even be a separate issue from MoxieBot getting 0. This clearly needs further investigation.

Skilgannon (talk)19:39, 4 September 2017
 

I took a look at your results. Your bot is performing below expectations, most prominently with 37.71% survival against sample.Crazy (???), which I cannot reproduce on my own computer.

I do agree that bugs (particularly ones that produce unfair results) ought to be squashed ASAP. However, you cannot expect the amount of work-per-turn your bot is allowed to perform to remain constant between machines (and possibly not even between battles or rounds). Perhaps a CPU-intensive background process is running, or the user decides to play video games, or the OS starts throttling Java, or the CPU drops to 0.15 GHz for no good reason (I've actually seen that happen), or gamma rays hit your computer and flip a bit in the tick time counter, or whatever.

My point was that high-CPU bots must adapt to changing circumstances. Too many bots just ignore SkippedTurnEvent, when it's practically a blaring flashing-red-lights warning from Robocode. You could respond by reducing CPU load, e.g. disabling features, virtual guns, second wave surfing, etc. It's better for your bot to function suboptimally than to not function at all.

MultiplyByZer0 (talk)20:18, 4 September 2017

Agreed that the SkippedTurnEvent is mostly ignored, and that more could be done on this side. However, there is a reason that we have the CPU calibration, and that is because we want all environments to be similar. It is impossible to get consistent results if on one computer you can do second wave surfing with precise intersection and KNN gun with Gaussian kernel density estimation, and the other you have to fall back to single wave and a simple VCS gun. It would require all rumble battles to be contributed by a single machine, and then we are back to a standard environment.

Skilgannon (talk)22:36, 4 September 2017
 

Are we actually talking about time-per-turn problem? I supposed, given the age of Robocode and Roborumble, that this is a well discussed topic and that every possible decision to make the system work fair enough while providing the "contributing" feature was already made. It seems that what we are talking about here is a bug. I know every environment is not equal, but even with the very little time I have on Robocode I could conclude a robot should work under the assumption that at least a reasonable quota of its turn time will be respected (even if in reality it's not eventually). If that quota is not being respected even after like, 10 battles, in a machine that is OK, and the results are absurd like the results Beaming reported, there must be a bug somewhere, even if it's on Beaming's side, and IMO it's worth it to discuss it and, maybe, to find it, since it may explain some other weird behavior in the future.

Rsalesc (talk)01:13, 5 September 2017
 
 
 

Here is my setup,

I run literumble clients on two machines almost non stop. Each runs one rumble and one melee client at the same time. Since one has 4 cores and the other 6, this should not be a problem with CPU calculations under normal circumstances. Also, there is plenty of RAM so no swapping. If I expect high CPU demanding tasks, I stop clients so they not affected by CPU fight with other programs.

All my machines are 64 bit linux with openjdk-8-jdk-headless.

But I think at some point robocode became multi-threaded, so CPU constant (6.5 ms in my case) is not so relevant anymore. In top, I can see that rumble client often eats more than 100%, i.e. it spans between cores. Also, load on a machine seems to be high, i.e. it is often in the range of 3 for the 6 cores machine.

Plus there is CPU throttling which kicks in when ever it wants, thanks to modern hardware design.

Beaming (talk)19:16, 4 September 2017

I don't think Robocode actually runs more than 1 thread at a time. I think the extra CPU is from the JVM JIT optimizer running in parallel.

Skilgannon (talk)19:41, 4 September 2017

I meant the whole robocode machinery. I recall that couple years ago the robocode client (and its java) was confined to one CPU, today it is not the case. See the attached screenshot.

htop screenshot

Beaming (talk)02:14, 5 September 2017
 
 
 

I have a hunch that I would like to test. Never mind. That idea was almost definitely wrong.

MultiplyByZer0 (talk)00:39, 5 September 2017
 

How can I deploy roborumble client on a server?

My server is running CentOS, is that supported? If I'm running roborumble client on server, is there anything to be special cared?

Is that ok to use Java 8 sdk to run roborumble?

Xor (talk)01:32, 21 August 2017

It seems that robocode-1.9.2.5-setup.jar doesn't not support platform without X11?

How to install robocode without X11?

Xor (talk)01:47, 21 August 2017

The installer is a JAR file, which is just a renamed ZIP file.

Use a standard unarchiver to extract libs/, roborumble/, robots/, and [roborumble/meleerumble/teamrumble/twinduel].sh into a folder.

MultiplyByZer0 (talk)02:07, 21 August 2017

Thanks! Done!

Xor (talk)03:00, 21 August 2017
 
 
 
First page
First page
Previous page
Previous page
Last page
Last page