<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://robowiki.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bnorm</id>
	<title>Robowiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://robowiki.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bnorm"/>
	<link rel="alternate" type="text/html" href="http://robowiki.net/wiki/Special:Contributions/Bnorm"/>
	<updated>2026-04-29T19:39:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm/CoroutineRobot&amp;diff=56940</id>
		<title>User:Bnorm/CoroutineRobot</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm/CoroutineRobot&amp;diff=56940"/>
		<updated>2021-07-30T04:45:39Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CoroutineRobot ==&lt;br /&gt;
&lt;br /&gt;
Using [https://kotlinlang.org/ Kotlin] and [https://github.com/Kotlin/kotlinx.coroutines coroutines], safe and fair multithreading for a Robot can be implemented in Robocode. This can be achieved with [https://kotlinlang.org/docs/coroutines-basics.html structured concurrency] and a custom thread dispatcher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Kotlin&amp;quot;&amp;gt;&lt;br /&gt;
import kotlinx.coroutines.CoroutineDispatcher&lt;br /&gt;
import kotlinx.coroutines.runBlocking&lt;br /&gt;
import robocode.AdvancedRobot&lt;br /&gt;
import java.util.concurrent.LinkedBlockingQueue&lt;br /&gt;
import kotlin.concurrent.thread&lt;br /&gt;
import kotlin.coroutines.CoroutineContext&lt;br /&gt;
&lt;br /&gt;
abstract class CoroutineRobot : AdvancedRobot() {&lt;br /&gt;
    private val _computation = QueueCoroutineDispatcher(4)&lt;br /&gt;
    val Computation: CoroutineDispatcher get() = _computation&lt;br /&gt;
&lt;br /&gt;
    private lateinit var _main: CoroutineDispatcher&lt;br /&gt;
    val Main: CoroutineDispatcher get() = _main&lt;br /&gt;
&lt;br /&gt;
    final override fun run() {&lt;br /&gt;
        try {&lt;br /&gt;
            runBlocking {&lt;br /&gt;
                _main = coroutineContext[CoroutineDispatcher]!!&lt;br /&gt;
                coroutineRun()&lt;br /&gt;
            }&lt;br /&gt;
        } finally {&lt;br /&gt;
            _computation.shutdown()&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    abstract suspend fun coroutineRun()&lt;br /&gt;
&lt;br /&gt;
    private class QueueCoroutineDispatcher(threadCount: Int) : CoroutineDispatcher() {&lt;br /&gt;
        companion object {&lt;br /&gt;
            private val POISON = Runnable {}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private val queue = LinkedBlockingQueue&amp;lt;Runnable&amp;gt;()&lt;br /&gt;
        private val threads = List(threadCount) {&lt;br /&gt;
            thread(name = &amp;quot;Computation $it&amp;quot;) {&lt;br /&gt;
                try {&lt;br /&gt;
                    while (true) {&lt;br /&gt;
                        val task = queue.take()&lt;br /&gt;
                        if (task === POISON) break&lt;br /&gt;
                        task.run()&lt;br /&gt;
                    }&lt;br /&gt;
                } catch (ignore: InterruptedException) {&lt;br /&gt;
                    // ignore&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        override fun dispatch(context: CoroutineContext, block: Runnable) {&lt;br /&gt;
            queue.put(block)&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        fun shutdown() {&lt;br /&gt;
            repeat(threads.size) {&lt;br /&gt;
                // poison the queue once for each thread&lt;br /&gt;
                queue.put(POISON)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multithreading ==&lt;br /&gt;
&lt;br /&gt;
With the above base class multithreading can be achieved using [https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html coroutineScope], [https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html launch], and [https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html withContext] builder functions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Kotlin&amp;quot;&amp;gt;&lt;br /&gt;
import kotlinx.coroutines.coroutineScope&lt;br /&gt;
import kotlinx.coroutines.launch&lt;br /&gt;
import kotlinx.coroutines.withContext&lt;br /&gt;
&lt;br /&gt;
class SampleRobot : CoroutineRobot() {&lt;br /&gt;
    override suspend fun coroutineRun() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            coroutineScope { // Starts a logic container for asynchronous work&lt;br /&gt;
                launch(Computation) { // Launch asynchronous work on 1 of the 4 computation threads&lt;br /&gt;
&lt;br /&gt;
                    // Do radar logic&lt;br /&gt;
&lt;br /&gt;
                    withContext(Main) { // Switch back to run thread&lt;br /&gt;
                        setTurnRadarRightRadians(radarTurn)&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                launch(Computation) { // Launch asynchronous work on 1 of the 4 computation threads&lt;br /&gt;
&lt;br /&gt;
                    // Do firing logic&lt;br /&gt;
&lt;br /&gt;
                    withContext(Main) { // Switch back to run thread&lt;br /&gt;
                        setTurnGunRightRadians(gunTurn)&lt;br /&gt;
                        setFire(bulletPower)&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                launch(Computation) { // Launch asynchronous work on 1 of the 4 computation threads&lt;br /&gt;
&lt;br /&gt;
                    // Do movement logic&lt;br /&gt;
&lt;br /&gt;
                    withContext(Main) { // Switch back to run thread&lt;br /&gt;
                        setTurnRightRadians(tankTurn)&lt;br /&gt;
                        setAhead(tankMove)&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            execute()&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=56939</id>
		<title>User:Bnorm</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=56939"/>
		<updated>2021-07-30T04:07:23Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Who I Am ==&lt;br /&gt;
&lt;br /&gt;
I was introduced to Robocode sometime in February of '04 when my father sent me a link to download it. Well, I played with it for about two months and then got bored after being too confused, it being my first programing experience and all. I returned to it in April of '05 for reasons that I have since forgotten, but the addiction hasn't left since then.&lt;br /&gt;
&lt;br /&gt;
I may not be the most active Robocoder on the wiki but I am usually checking it every couple days.&lt;br /&gt;
&lt;br /&gt;
== My Robots ==&lt;br /&gt;
&lt;br /&gt;
* '''[[Gladiator]]''' - My first and only competitive robot.&lt;br /&gt;
* '''[[NightFox]]''' - A test robot.&lt;br /&gt;
* '''[[Toa]]''' - A pre [[Gladiator]] remake robot.&lt;br /&gt;
* '''[[Rinzler]]''' - I'm reserving the name for a future bot. Maybe a [[Tron]] tribute/killer.&lt;br /&gt;
* '''[[Jarvis]]''' - Working on something new. It's a mess, but fun.&lt;br /&gt;
&lt;br /&gt;
== My Teams ==&lt;br /&gt;
&lt;br /&gt;
* '''[[DeltaSquad]]''' - A four robot team. Winners of the CodeFest 2011: VirtualCombat competition.&lt;br /&gt;
* '''[[OmegaSquad]]''' - A pre [[DeltaSquad]] remake team.&lt;br /&gt;
&lt;br /&gt;
== Free Code ==&lt;br /&gt;
&lt;br /&gt;
* '''[[User:Bnorm/CoroutineRobot]]''' - Base Robot which uses Kotlin coroutine.&lt;br /&gt;
* '''[[User:Bnorm/DrawMenu]]''' - A graphical debugging tool.&lt;br /&gt;
* I've got an account on GitHub under the username bnorm.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bot Authors|KID]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm/CoroutineRobot&amp;diff=56938</id>
		<title>User:Bnorm/CoroutineRobot</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm/CoroutineRobot&amp;diff=56938"/>
		<updated>2021-07-30T04:03:55Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Base robot which uses Kotlin coroutines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CoroutineRobot ==&lt;br /&gt;
&lt;br /&gt;
Using [https://kotlinlang.org/ Kotlin] and [https://github.com/Kotlin/kotlinx.coroutines coroutines], safe and fair multithreading for a Robot can be implemented in Robocode. This can be achieved with [https://kotlinlang.org/docs/coroutines-basics.html structured concurrency] and a custom thread dispatcher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Kotlin&amp;quot;&amp;gt;&lt;br /&gt;
import kotlinx.coroutines.CoroutineDispatcher&lt;br /&gt;
import kotlinx.coroutines.runBlocking&lt;br /&gt;
import robocode.AdvancedRobot&lt;br /&gt;
import java.util.concurrent.LinkedBlockingQueue&lt;br /&gt;
import kotlin.concurrent.thread&lt;br /&gt;
import kotlin.coroutines.CoroutineContext&lt;br /&gt;
&lt;br /&gt;
abstract class CoroutineRobot : AdvancedRobot() {&lt;br /&gt;
    private val _computation = QueueCoroutineDispatcher(4)&lt;br /&gt;
    val Computation: CoroutineDispatcher get() = _computation&lt;br /&gt;
&lt;br /&gt;
    private lateinit var _main: CoroutineDispatcher&lt;br /&gt;
    val Main: CoroutineDispatcher get() = _main&lt;br /&gt;
&lt;br /&gt;
    final override fun run() {&lt;br /&gt;
        try {&lt;br /&gt;
            runBlocking {&lt;br /&gt;
                _main = coroutineContext[CoroutineDispatcher]!!&lt;br /&gt;
                coroutineRun()&lt;br /&gt;
            }&lt;br /&gt;
        } finally {&lt;br /&gt;
            _computation.shutdown()&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    abstract suspend fun coroutineRun()&lt;br /&gt;
&lt;br /&gt;
    private class QueueCoroutineDispatcher(threadCount: Int) : CoroutineDispatcher() {&lt;br /&gt;
        private val queue = LinkedBlockingQueue&amp;lt;Runnable?&amp;gt;()&lt;br /&gt;
        private val threads = List(threadCount) {&lt;br /&gt;
            thread(name = &amp;quot;Computation $it&amp;quot;) {&lt;br /&gt;
                try {&lt;br /&gt;
                    while (true) {&lt;br /&gt;
                        val task = queue.take() ?: break&lt;br /&gt;
                        task.run()&lt;br /&gt;
                    }&lt;br /&gt;
                } catch (ignore: InterruptedException) {&lt;br /&gt;
                    // ignore&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        override fun dispatch(context: CoroutineContext, block: Runnable) {&lt;br /&gt;
            queue.put(block)&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        fun shutdown() {&lt;br /&gt;
            repeat(threads.size) {&lt;br /&gt;
                // poison the queue once for each thread&lt;br /&gt;
                queue.put(null)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multithreading ==&lt;br /&gt;
&lt;br /&gt;
With the above base class multithreading can be achieved using [https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html coroutineScope], [https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html launch], and [https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html withContext] builder functions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Kotlin&amp;quot;&amp;gt;&lt;br /&gt;
import kotlinx.coroutines.coroutineScope&lt;br /&gt;
import kotlinx.coroutines.launch&lt;br /&gt;
import kotlinx.coroutines.withContext&lt;br /&gt;
&lt;br /&gt;
class SampleRobot : CoroutineRobot() {&lt;br /&gt;
    override suspend fun coroutineRun() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            coroutineScope { // Starts a logic container for asynchronous work&lt;br /&gt;
                launch(Computation) { // Launch asynchronous work on 1 of the 4 computation threads&lt;br /&gt;
&lt;br /&gt;
                    // Do radar logic&lt;br /&gt;
&lt;br /&gt;
                    withContext(Main) { // Switch back to run thread&lt;br /&gt;
                        setTurnRadarRightRadians(radarTurn)&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                launch(Computation) { // Launch asynchronous work on 1 of the 4 computation threads&lt;br /&gt;
&lt;br /&gt;
                    // Do firing logic&lt;br /&gt;
&lt;br /&gt;
                    withContext(Main) { // Switch back to run thread&lt;br /&gt;
                        setTurnGunRightRadians(gunTurn)&lt;br /&gt;
                        setFire(bulletPower)&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                launch(Computation) { // Launch asynchronous work on 1 of the 4 computation threads&lt;br /&gt;
&lt;br /&gt;
                    // Do movement logic&lt;br /&gt;
&lt;br /&gt;
                    withContext(Main) { // Switch back to run thread&lt;br /&gt;
                        setTurnRightRadians(tankTurn)&lt;br /&gt;
                        setAhead(tankMove)&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            execute()&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:Talk:Jarvis/Looks_awesome/reply&amp;diff=56431</id>
		<title>Thread:Talk:Jarvis/Looks awesome/reply</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:Talk:Jarvis/Looks_awesome/reply&amp;diff=56431"/>
		<updated>2021-01-18T15:04:38Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Looks awesome&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I'm quite honestly shocked by the results. I was in the 86 range for a while, using iterative precise escape angles, then switched to escape circle calculation and jumped up significantly! Now if only I could hit those go-to movement bots as well as everybody else...&lt;br /&gt;
&lt;br /&gt;
I'm also worried it might not translate well to the rumble. I tested a little bit with some basic min-risk movement turned on and the results dropped. Though maybe that's normal?&lt;br /&gt;
&lt;br /&gt;
Either way, now working on some basic wave surfing movement and energy management, and hoping to enter the rumble in a couple weeks! Top 20 is the goal! But number 1 would of course be nice... ;)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:Talk:Robocode/Gradle/Great_work/reply&amp;diff=56430</id>
		<title>Thread:Talk:Robocode/Gradle/Great work/reply</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:Talk:Robocode/Gradle/Great_work/reply&amp;diff=56430"/>
		<updated>2021-01-18T14:56:05Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Great work&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks! Thought it would be nice to bootstrap Robocode for GitHub actions to automate releases. Just kept adding little things like the battle configuration. Maybe I can even abuse GitHub actions to run battles... :D&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Targeting_Challenge_RM/Results&amp;diff=56425</id>
		<title>Targeting Challenge RM/Results</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Targeting_Challenge_RM/Results&amp;diff=56425"/>
		<updated>2021-01-18T00:59:15Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Jarvis WIP GF gun (25 sessions)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== 35 Rounds ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse; font-size: 85%; color: black&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Bot&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Author&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Gun&lt;br /&gt;
!|Aspd&lt;br /&gt;
!|Sprw&lt;br /&gt;
!|Fhqw&lt;br /&gt;
!|Yngw&lt;br /&gt;
!|FlMn&lt;br /&gt;
!|EASY&lt;br /&gt;
!|Tron&lt;br /&gt;
!|HTTC&lt;br /&gt;
!|RnMB&lt;br /&gt;
!|DlMc&lt;br /&gt;
!|Grbb&lt;br /&gt;
!|MED&lt;br /&gt;
!|SnDT&lt;br /&gt;
!|Cgrt&lt;br /&gt;
!|Frtn&lt;br /&gt;
!|WkOb&lt;br /&gt;
!|RkMc&lt;br /&gt;
!|HARD&lt;br /&gt;
!|TOTAL&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Comments&lt;br /&gt;
|-&lt;br /&gt;
| [[ScalarG]] tc0.080 || [[User:Xor|Xor]] || KNN/GF || 96.35 || 99.28 || 97.37 || 98.48 || 95.54 || '''97.4''' || 90.88 || 85.94 || 93.91 || 89.82 || 90.48 || '''90.21''' || 90.93 || 84.46 || 84.75 || 88.3 || 85.24 || '''86.73''' || '''91.45''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[DrussGT]] 2.9.3TC || [[User:Skilgannon|Skilgannon]] || VG{KNN/KNN-AS}|| 95.63 || 99.29 || 98.65 || 98.65 || 94.78 || '''97.40''' || 91.32 || 85.82 || 93.47 || 89.16 || 89.43 || '''89.84''' || 91.40 || 83.33 || 84.17 || 89.06 || 84.31 || '''86.45''' || '''91.23''' || 100 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Jarvis]]* || [[User:bnorm|bnorm]] || KNN/GF || 96.12 || 99.68 || 98.74 || 97.34 || 95.7 || '''97.52''' || 93.01 || 91.87 || 92.8 || 81.91 || 88.0 || '''89.52''' || 94.71 || 78.81 || 83.09 || 84.52 || 81.77 || '''84.58''' || '''90.54''' || 25 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Gilgalad]] 1.95TC (No AntiSurfer Gun) || [[User:AW|AW]] || KNN/GF || 95.93 || 98.81 || 96.6 || 96.92 || 95.96 || '''96.85''' || 91.17 || 88.27 || 92.8 || 89.84 || 85.62 || '''89.54''' || 89.45 || 83.57 || 82.96 || 87.46 || 82.35 || '''85.16''' || '''90.52''' || 20.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Diamond]] 1.6.6 || [[User:Voidious|Voidious]] || VG/DC/GF || 95.02 || 99.19 || 98.38 || 98.18 || 95.26 || '''97.21''' || 91.13 || 88.88 || 93.12 || 86.36 || 84.20 || '''88.74''' || 88.57 || 86.75 || 81.39 || 87.35 || 82.86 || '''85.38''' || '''90.44''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[WhiteFang]]TC 2.6.8.1b(No AS) || [[User:Dsekercioglu| Dsekercioglu]] || DC/GF || 95.78 || 99.46 || 98.44 || 98.38 || 95.91 || '''97.59''' || 90.21 || 87.97 || 91.27 || 87.5 || 86.36 || '''88.66''' ||  84.22 || 85.78 || 80.32 || 87.31 || 82.09 || '''84.05''' || '''90.1''' || 30.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Rednaxela/SaphireEdge|SaphireEdge]] VCS24&lt;br /&gt;
| [[User:Rednaxela|Rednaxela]]&lt;br /&gt;
| GF/VCS&lt;br /&gt;
| 95.24&lt;br /&gt;
| 98.45&lt;br /&gt;
| 97.43&lt;br /&gt;
| 97.92&lt;br /&gt;
| 95.10&lt;br /&gt;
| '''96.83'''&lt;br /&gt;
| 89.18&lt;br /&gt;
| '''89.98'''&lt;br /&gt;
| 89.56&lt;br /&gt;
| 89.80&lt;br /&gt;
| 85.89&lt;br /&gt;
| '''88.88'''&lt;br /&gt;
| 85.17&lt;br /&gt;
| 86.61&lt;br /&gt;
| 81.36&lt;br /&gt;
| 86.92&lt;br /&gt;
| 81.98&lt;br /&gt;
| '''84.41'''&lt;br /&gt;
| '''90.04'''&lt;br /&gt;
| 110.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Dookious]] 1.56MG&lt;br /&gt;
|[[User:Voidious|Voidious]]&lt;br /&gt;
|GF/VCS&lt;br /&gt;
|93.66&lt;br /&gt;
|98.40&lt;br /&gt;
|98.10&lt;br /&gt;
|98.28&lt;br /&gt;
|93.90&lt;br /&gt;
|'''96.47'''&lt;br /&gt;
|88.92&lt;br /&gt;
|86.56&lt;br /&gt;
|93.54&lt;br /&gt;
|88.18&lt;br /&gt;
|87.33&lt;br /&gt;
|'''88.91'''&lt;br /&gt;
|87.49&lt;br /&gt;
|84.58&lt;br /&gt;
|81.40&lt;br /&gt;
|86.21&lt;br /&gt;
|81.71&lt;br /&gt;
|'''84.28'''&lt;br /&gt;
|'''89.88'''&lt;br /&gt;
|50 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[David Alves/Phoenix|Phoenix]] 0.905 (No [[AntiSurfer|AS]])&lt;br /&gt;
|[[User:David Alves|David Alves]]&lt;br /&gt;
|GF/VCS&lt;br /&gt;
|93.78&lt;br /&gt;
|98.29&lt;br /&gt;
|97.06&lt;br /&gt;
|97.70&lt;br /&gt;
|94.29&lt;br /&gt;
|'''96.22'''&lt;br /&gt;
|87.88&lt;br /&gt;
|85.99&lt;br /&gt;
|93.17&lt;br /&gt;
|'''90.29'''&lt;br /&gt;
|87.47&lt;br /&gt;
|'''88.96'''&lt;br /&gt;
|80.35&lt;br /&gt;
|83.68&lt;br /&gt;
|82.69&lt;br /&gt;
|88.48&lt;br /&gt;
|82.33&lt;br /&gt;
|'''83.51'''&lt;br /&gt;
|'''89.56'''&lt;br /&gt;
|161 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[RougeDC]] Gamma6&lt;br /&gt;
|[[User:Rednaxela|Rednaxela]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|94.77&lt;br /&gt;
|98.08&lt;br /&gt;
|'''98.75'''&lt;br /&gt;
|98.44&lt;br /&gt;
|93.38&lt;br /&gt;
|'''96.68'''&lt;br /&gt;
|91.55&lt;br /&gt;
|86.83&lt;br /&gt;
|90.17&lt;br /&gt;
|88.27&lt;br /&gt;
|85.04&lt;br /&gt;
|'''88.37'''&lt;br /&gt;
|82.11&lt;br /&gt;
|83.80&lt;br /&gt;
|81.15&lt;br /&gt;
|84.49&lt;br /&gt;
|82.05&lt;br /&gt;
|'''82.72'''&lt;br /&gt;
|'''89.26'''&lt;br /&gt;
|50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Simonton/DCResearch|DCResearch]] 0071&lt;br /&gt;
|[[User:Simonton|Simonton]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|93.68&lt;br /&gt;
|98.78&lt;br /&gt;
|97.28&lt;br /&gt;
|97.79&lt;br /&gt;
|94.60&lt;br /&gt;
|'''96.43'''&lt;br /&gt;
|88.65&lt;br /&gt;
|88.85&lt;br /&gt;
|89.90&lt;br /&gt;
|86.95&lt;br /&gt;
|84.96&lt;br /&gt;
|'''87.86'''&lt;br /&gt;
|82.45&lt;br /&gt;
|84.84&lt;br /&gt;
|81.94&lt;br /&gt;
|83.88&lt;br /&gt;
|81.99&lt;br /&gt;
|'''83.02'''&lt;br /&gt;
|'''89.10'''&lt;br /&gt;
|105.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[WaveSerpent]] 1.4&lt;br /&gt;
|[[User:Kev|Kev]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|95.32&lt;br /&gt;
|98.42&lt;br /&gt;
|96.55&lt;br /&gt;
|98.23&lt;br /&gt;
|93.69&lt;br /&gt;
|'''96.44'''&lt;br /&gt;
|89.74&lt;br /&gt;
|88.27&lt;br /&gt;
|89.29&lt;br /&gt;
|88.52&lt;br /&gt;
|85.31&lt;br /&gt;
|'''88.23'''&lt;br /&gt;
|82.30&lt;br /&gt;
|84.75&lt;br /&gt;
|80.75&lt;br /&gt;
|85.03&lt;br /&gt;
|80.01&lt;br /&gt;
|'''82.57'''&lt;br /&gt;
|'''89.08'''&lt;br /&gt;
|100 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Firebird]] 0.22_tcmg&lt;br /&gt;
|[[User:David Alves|David Alves]]&lt;br /&gt;
|DC&lt;br /&gt;
|94.15&lt;br /&gt;
|97.26&lt;br /&gt;
|96.25&lt;br /&gt;
|97.22&lt;br /&gt;
|93.23&lt;br /&gt;
|'''95.62'''&lt;br /&gt;
|88.13&lt;br /&gt;
|86.74&lt;br /&gt;
|92.59&lt;br /&gt;
|89.73&lt;br /&gt;
|85.88&lt;br /&gt;
|'''88.62'''&lt;br /&gt;
|79.68&lt;br /&gt;
|81.77&lt;br /&gt;
|82.97&lt;br /&gt;
|84.90&lt;br /&gt;
|'''84.35'''&lt;br /&gt;
|'''82.73'''&lt;br /&gt;
|'''88.99'''&lt;br /&gt;
|168.3 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Komarious]] 1.842&lt;br /&gt;
|[[Voidious]]&lt;br /&gt;
|GF/VCS&lt;br /&gt;
|93.41&lt;br /&gt;
|98.23&lt;br /&gt;
|97.39&lt;br /&gt;
|97.97&lt;br /&gt;
|91.21&lt;br /&gt;
|'''95.64'''&lt;br /&gt;
|86.14&lt;br /&gt;
|88.02&lt;br /&gt;
|89.53&lt;br /&gt;
|88.06&lt;br /&gt;
|84.44&lt;br /&gt;
|'''87.24'''&lt;br /&gt;
|80.58&lt;br /&gt;
|84.30&lt;br /&gt;
|80.27&lt;br /&gt;
|85.98&lt;br /&gt;
|81.63&lt;br /&gt;
|'''82.55'''&lt;br /&gt;
|'''88.48'''&lt;br /&gt;
|67 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Raiko]] 0.43 || [[Jamougha]] || GF/VCS || 91.26 || 97.96 || 97.28 || 98.86 || 99.56 || '''96.98''' || 86.12 || 87.06 || 91.10 || 85.93 || 82.95 || '''86.63''' || 77.03 || 82.91 || 81.61 || 85.73 || 80.01 || '''81.46''' || '''88.36''' || 40.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Roborio]] 1.2.1tc || [[User:Rsalesc|Rsalesc]] || DC-DCAS || 93.26 || 97.42 || 94.92 || 92.4 || 96.5 || '''94.9''' || 88.05 || 83.4 || 91.77 || 88.54 || 83.1 || '''86.97''' || 82.8 || 80.52 || 83.46 || 85.1 || 82.92 || '''82.96''' || '''88.28''' || 30.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[DeBroglie]] TC0090 (Main gun) || [[User:Tkiesel|Tkiesel]] || DC/GF || 92.69 || 98.77 || 95.01 || 97.13 || 92.92 || '''95.30''' || 89.15 || 89.86 || 87.37 || 87.20 || 84.26 || '''87.57''' || 77.09 || 85.16 || 83.95 || 82.17 || 80.44 || '''81.76''' || '''88.21''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Neuromancer]] 4.0 || [[User:Skilgannon|Skilgannon]] || KNN/PIF|| 88.67 || 98.64 || 96.30 || 97.39 || 94.26 || '''95.05''' || 89.65 || 88.80 || 90.28 || 87.05 || 83.58 || '''87.87''' || 79.49 || 83.11 || 83.08 || 82.11 || 80.39 || '''81.64''' || '''88.19''' || 100 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Firebird]] 0.21 (Main Gun)&lt;br /&gt;
|[[User:David Alves|David Alves]]&lt;br /&gt;
|DC&lt;br /&gt;
|93.95&lt;br /&gt;
|97.34&lt;br /&gt;
|95.41&lt;br /&gt;
|97.04&lt;br /&gt;
|92.53&lt;br /&gt;
|'''95.25'''&lt;br /&gt;
|87.64&lt;br /&gt;
|86.01&lt;br /&gt;
|90.46&lt;br /&gt;
|88.26&lt;br /&gt;
|83.89&lt;br /&gt;
|'''87.25'''&lt;br /&gt;
|81.61&lt;br /&gt;
|80.13&lt;br /&gt;
|81.48&lt;br /&gt;
|82.56&lt;br /&gt;
|83.34&lt;br /&gt;
|'''81.82'''&lt;br /&gt;
|'''88.11'''&lt;br /&gt;
|151.3 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Mint]] 0.14b || [[Chase]] || DC || 94.47 || 97.69 || 94.57 || 97.27 || 92.87 || '''95.37 '''|| 88.64 || 89.16 || 88.27 || 86.26 || 83.5 || '''87.17''' || 82.12 || 83.82 || 78.65 || 82.42 || 78.32 || '''81.07''' || '''87.87''' || 15.0 Seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Shadow]] 3.83c || [[ABC]] || DC/PIF || 89.79 || 98.36 || 94.69 || 96.71 || 93.36 || '''94.58''' || 87.83 || 89.89 || 89.36 || 89.42 || 82.37 || '''87.78''' || 74.79 || 84.91 || 80.14 || 82.83 || 81.23 || '''80.78''' || '''87.71''' || 44.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Lukious]] 1.21&lt;br /&gt;
|[[User:Voidious|Voidious]]&lt;br /&gt;
|DC&lt;br /&gt;
|92.48&lt;br /&gt;
|97.42&lt;br /&gt;
|95.50&lt;br /&gt;
|97.40&lt;br /&gt;
|94.96&lt;br /&gt;
|'''95.55'''&lt;br /&gt;
|88.55&lt;br /&gt;
|87.87&lt;br /&gt;
|85.80&lt;br /&gt;
|86.24&lt;br /&gt;
|82.04&lt;br /&gt;
|'''86.10'''&lt;br /&gt;
|77.34&lt;br /&gt;
|'''86.82'''&lt;br /&gt;
|78.74&lt;br /&gt;
|82.82&lt;br /&gt;
|76.62&lt;br /&gt;
|'''80.47'''&lt;br /&gt;
|'''87.37'''&lt;br /&gt;
|60 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[GresSuffurd]] 0.2.28 || [[GrubbmGait]] || GF/VCS || 91.27 || 96.65 || 95.45 || 97.04 || 94.12 || '''94.91''' || 84.43 || 86.52 || 87.68 || 86.83 || 83.64 || '''85.82''' || 80.48 || 81.82 || 77.90 || 82.99 || 78.09 || '''80.25''' || '''86.99''' || 50 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[XanderCat]] 12.6 (No [[AntiSurfer|AS]])|| [[User:Skotty|Skotty]] || DC/GF || 89.84 || 95.59 || 94.48 || 96.61 || 90.45 || '''93.39''' || 83.08 || 84.46 || 88.76 || 88.87 || 82.09 || '''85.45''' || 68.74 || 85.06 || 82.23 || 82.37 || 80.94 || '''79.87''' || '''86.24''' || 100 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Tomcat]] 3.37 || [[Jdev]] || kNN/PIF ||88.60 ||97.31 ||94.14 ||95.17 ||91.80 ||'''93.41''' ||84.94 ||86.34 ||89.09 ||84.54 ||82.31 ||'''85.45''' ||71.03 ||85.34 ||79.34 ||80.46 ||76.17 ||'''78.47''' ||'''85.77''' ||35 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Cotillion]] 0.8TC || [[User:Skilgannon|Skilgannon]] || MC-PM || 86.95 || 96.78 || 94.74 || 96.12 || 91.59 || '''93.24''' || 85.43 || 86.01 || 87.53 || 84.04 || 83.06 || '''85.22''' || 70.29 || 82.31 || 77.13 || 82.66 || 77.84 || '''78.05''' || '''85.50''' || 50 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[XanderCat]] 12.6 (both guns)|| [[User:Skotty|Skotty]] || VG/DC/GF || 87.59 || 94.80 || 93.69 || 96.22 || 90.92 || '''92.64''' || 82.92 || 85.36 || 88.80 || 86.32 || 78.26 || '''84.33''' || 67.28 || 81.63 || 79.90 || 79.07 || 80.15 || '''77.61''' || '''84.86''' || 91.2 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Seraphim]] 2.0.6 || [[User:Chase-san|Chase-san]] || GF/VCS || 88.97 || 94.97 || 92.88 || 96.47 || 90.88 || '''92.83''' || 83.91 || 84.78 || 85.70 || 85.00 || 79.27 || '''83.74''' || 75.38 || 78.32 || 76.93 || 79.78 || 77.36 || '''77.55''' || '''84.71''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[RetroGirl]] 1.0.0 || [[User:Voidious|Voidious]] || ?/GF || 77.26 || 87.21 || 90.89 || 95.65 || 89.91 || '''88.19''' || 74.96 || 86.48 || 77.36 || 74.44 || 57.74 || '''74.19''' || 56.55 || 71.57 || 58.38 || 86.62 || 78.74 || '''70.37''' || '''77.58''' || 35.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| WSCBotC 1.0 || || CT || 64.31 || 94.89 || 88.36 || 93.91 || 85.11 || '''85.32''' || 81.50 || 78.61 || 88.24 || 64.15 || 6.96 || '''63.89''' || 58.65 || 58.04 || 20.62 || 25.39 || 73.95 || '''47.33''' || '''65.51''' || 40.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| WSCBotB 1.1 || || LT || 63.14 || 84.83 || 87.40 || 89.56 || 82.92 || '''81.57''' || 77.58 || 74.01 || 86.83 || 62.30 || 4.67 || '''61.08''' || 61.89 || 59.81 || 52.23 || 22.84 || 50.45 || '''49.45''' || '''64.03''' || 40.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| WSCBotA 1.0 || || HT || 81.19 || 79.21 || 85.37 || 96.67 || 82.70 || '''85.03''' || 80.07 || 84.86 || 70.63 || 89.27 || 11.75 || '''67.31''' || 55.77 || 67.87 || 12.06 || 19.82 || 18.46 || '''34.80''' || '''62.38''' || 40.0 seasons&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 500 Rounds ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse; font-size: 85%; color: black&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Bot&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Author&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Gun&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Aspd&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Sprw&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Fhqw&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Yngw&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|FlMn&lt;br /&gt;
!|EASY&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Tron&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|HTTC&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|RnMB&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|DlMc&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Grbb&lt;br /&gt;
!|MED&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|SnDT&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Cgrt&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Frtn&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|WkOb&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|RkMc&lt;br /&gt;
!|HARD&lt;br /&gt;
!|TOTAL&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Comments&lt;br /&gt;
|-&lt;br /&gt;
|[[Simonton/DCResearch|DCResearch]] 0071&lt;br /&gt;
|[[User:Simonton|Simonton]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|96.87&lt;br /&gt;
|99.53&lt;br /&gt;
|98.60&lt;br /&gt;
|98.55&lt;br /&gt;
|94.69&lt;br /&gt;
|'''97.65'''&lt;br /&gt;
|92.75&lt;br /&gt;
|91.66&lt;br /&gt;
|92.51&lt;br /&gt;
|89.31&lt;br /&gt;
|88.34&lt;br /&gt;
|'''90.92'''&lt;br /&gt;
|88.88&lt;br /&gt;
|88.41&lt;br /&gt;
|84.44&lt;br /&gt;
|84.83&lt;br /&gt;
|83.95&lt;br /&gt;
|'''86.10'''&lt;br /&gt;
|'''91.55'''&lt;br /&gt;
|6.0 seasons&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{gunabbr}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Challenge Results]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Targeting_Challenge_RM/Results&amp;diff=56424</id>
		<title>Targeting Challenge RM/Results</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Targeting_Challenge_RM/Results&amp;diff=56424"/>
		<updated>2021-01-17T21:44:18Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Jarvis WIP GF gun&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== 35 Rounds ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse; font-size: 85%; color: black&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Bot&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Author&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Gun&lt;br /&gt;
!|Aspd&lt;br /&gt;
!|Sprw&lt;br /&gt;
!|Fhqw&lt;br /&gt;
!|Yngw&lt;br /&gt;
!|FlMn&lt;br /&gt;
!|EASY&lt;br /&gt;
!|Tron&lt;br /&gt;
!|HTTC&lt;br /&gt;
!|RnMB&lt;br /&gt;
!|DlMc&lt;br /&gt;
!|Grbb&lt;br /&gt;
!|MED&lt;br /&gt;
!|SnDT&lt;br /&gt;
!|Cgrt&lt;br /&gt;
!|Frtn&lt;br /&gt;
!|WkOb&lt;br /&gt;
!|RkMc&lt;br /&gt;
!|HARD&lt;br /&gt;
!|TOTAL&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Comments&lt;br /&gt;
|-&lt;br /&gt;
| [[ScalarG]] tc0.080 || [[User:Xor|Xor]] || KNN/GF || 96.35 || 99.28 || 97.37 || 98.48 || 95.54 || '''97.4''' || 90.88 || 85.94 || 93.91 || 89.82 || 90.48 || '''90.21''' || 90.93 || 84.46 || 84.75 || 88.3 || 85.24 || '''86.73''' || '''91.45''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[DrussGT]] 2.9.3TC || [[User:Skilgannon|Skilgannon]] || VG{KNN/KNN-AS}|| 95.63 || 99.29 || 98.65 || 98.65 || 94.78 || '''97.40''' || 91.32 || 85.82 || 93.47 || 89.16 || 89.43 || '''89.84''' || 91.40 || 83.33 || 84.17 || 89.06 || 84.31 || '''86.45''' || '''91.23''' || 100 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Gilgalad]] 1.95TC (No AntiSurfer Gun) || [[User:AW|AW]] || KNN/GF || 95.93 || 98.81 || 96.6 || 96.92 || 95.96 || '''96.85''' || 91.17 || 88.27 || 92.8 || 89.84 || 85.62 || '''89.54''' || 89.45 || 83.57 || 82.96 || 87.46 || 82.35 || '''85.16''' || '''90.52''' || 20.0 seasons&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Diamond]] 1.6.6 || [[User:Voidious|Voidious]] || VG/DC/GF || 95.02 || 99.19 || 98.38 || 98.18 || 95.26 || '''97.21''' || 91.13 || 88.88 || 93.12 || 86.36 || 84.20 || '''88.74''' || 88.57 || 86.75 || 81.39 || 87.35 || 82.86 || '''85.38''' || '''90.44''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Jarvis]]* || [[User:bnorm|bnorm]] || KNN/GF || 95.0 || 98.8 || 99.0 || 97.7 || 94.6 || '''97.0''' || 91.9 || 91.6 || 94.5 || 82.2 || 87.2 || '''89.5''' || 96.2 || 80.4 || 83.0 || 83.9 || 79.7 || '''84.6''' || '''90.4''' || 10 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[WhiteFang]]TC 2.6.8.1b(No AS) || [[User:Dsekercioglu| Dsekercioglu]] || DC/GF || 95.78 || 99.46 || 98.44 || 98.38 || 95.91 || '''97.59''' || 90.21 || 87.97 || 91.27 || 87.5 || 86.36 || '''88.66''' ||  84.22 || 85.78 || 80.32 || 87.31 || 82.09 || '''84.05''' || '''90.1''' || 30.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Rednaxela/SaphireEdge|SaphireEdge]] VCS24&lt;br /&gt;
| [[User:Rednaxela|Rednaxela]]&lt;br /&gt;
| GF/VCS&lt;br /&gt;
| 95.24&lt;br /&gt;
| 98.45&lt;br /&gt;
| 97.43&lt;br /&gt;
| 97.92&lt;br /&gt;
| 95.10&lt;br /&gt;
| '''96.83'''&lt;br /&gt;
| 89.18&lt;br /&gt;
| '''89.98'''&lt;br /&gt;
| 89.56&lt;br /&gt;
| 89.80&lt;br /&gt;
| 85.89&lt;br /&gt;
| '''88.88'''&lt;br /&gt;
| 85.17&lt;br /&gt;
| 86.61&lt;br /&gt;
| 81.36&lt;br /&gt;
| 86.92&lt;br /&gt;
| 81.98&lt;br /&gt;
| '''84.41'''&lt;br /&gt;
| '''90.04'''&lt;br /&gt;
| 110.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Dookious]] 1.56MG&lt;br /&gt;
|[[User:Voidious|Voidious]]&lt;br /&gt;
|GF/VCS&lt;br /&gt;
|93.66&lt;br /&gt;
|98.40&lt;br /&gt;
|98.10&lt;br /&gt;
|98.28&lt;br /&gt;
|93.90&lt;br /&gt;
|'''96.47'''&lt;br /&gt;
|88.92&lt;br /&gt;
|86.56&lt;br /&gt;
|93.54&lt;br /&gt;
|88.18&lt;br /&gt;
|87.33&lt;br /&gt;
|'''88.91'''&lt;br /&gt;
|87.49&lt;br /&gt;
|84.58&lt;br /&gt;
|81.40&lt;br /&gt;
|86.21&lt;br /&gt;
|81.71&lt;br /&gt;
|'''84.28'''&lt;br /&gt;
|'''89.88'''&lt;br /&gt;
|50 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[David Alves/Phoenix|Phoenix]] 0.905 (No [[AntiSurfer|AS]])&lt;br /&gt;
|[[User:David Alves|David Alves]]&lt;br /&gt;
|GF/VCS&lt;br /&gt;
|93.78&lt;br /&gt;
|98.29&lt;br /&gt;
|97.06&lt;br /&gt;
|97.70&lt;br /&gt;
|94.29&lt;br /&gt;
|'''96.22'''&lt;br /&gt;
|87.88&lt;br /&gt;
|85.99&lt;br /&gt;
|93.17&lt;br /&gt;
|'''90.29'''&lt;br /&gt;
|87.47&lt;br /&gt;
|'''88.96'''&lt;br /&gt;
|80.35&lt;br /&gt;
|83.68&lt;br /&gt;
|82.69&lt;br /&gt;
|88.48&lt;br /&gt;
|82.33&lt;br /&gt;
|'''83.51'''&lt;br /&gt;
|'''89.56'''&lt;br /&gt;
|161 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[RougeDC]] Gamma6&lt;br /&gt;
|[[User:Rednaxela|Rednaxela]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|94.77&lt;br /&gt;
|98.08&lt;br /&gt;
|'''98.75'''&lt;br /&gt;
|98.44&lt;br /&gt;
|93.38&lt;br /&gt;
|'''96.68'''&lt;br /&gt;
|91.55&lt;br /&gt;
|86.83&lt;br /&gt;
|90.17&lt;br /&gt;
|88.27&lt;br /&gt;
|85.04&lt;br /&gt;
|'''88.37'''&lt;br /&gt;
|82.11&lt;br /&gt;
|83.80&lt;br /&gt;
|81.15&lt;br /&gt;
|84.49&lt;br /&gt;
|82.05&lt;br /&gt;
|'''82.72'''&lt;br /&gt;
|'''89.26'''&lt;br /&gt;
|50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Simonton/DCResearch|DCResearch]] 0071&lt;br /&gt;
|[[User:Simonton|Simonton]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|93.68&lt;br /&gt;
|98.78&lt;br /&gt;
|97.28&lt;br /&gt;
|97.79&lt;br /&gt;
|94.60&lt;br /&gt;
|'''96.43'''&lt;br /&gt;
|88.65&lt;br /&gt;
|88.85&lt;br /&gt;
|89.90&lt;br /&gt;
|86.95&lt;br /&gt;
|84.96&lt;br /&gt;
|'''87.86'''&lt;br /&gt;
|82.45&lt;br /&gt;
|84.84&lt;br /&gt;
|81.94&lt;br /&gt;
|83.88&lt;br /&gt;
|81.99&lt;br /&gt;
|'''83.02'''&lt;br /&gt;
|'''89.10'''&lt;br /&gt;
|105.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[WaveSerpent]] 1.4&lt;br /&gt;
|[[User:Kev|Kev]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|95.32&lt;br /&gt;
|98.42&lt;br /&gt;
|96.55&lt;br /&gt;
|98.23&lt;br /&gt;
|93.69&lt;br /&gt;
|'''96.44'''&lt;br /&gt;
|89.74&lt;br /&gt;
|88.27&lt;br /&gt;
|89.29&lt;br /&gt;
|88.52&lt;br /&gt;
|85.31&lt;br /&gt;
|'''88.23'''&lt;br /&gt;
|82.30&lt;br /&gt;
|84.75&lt;br /&gt;
|80.75&lt;br /&gt;
|85.03&lt;br /&gt;
|80.01&lt;br /&gt;
|'''82.57'''&lt;br /&gt;
|'''89.08'''&lt;br /&gt;
|100 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Firebird]] 0.22_tcmg&lt;br /&gt;
|[[User:David Alves|David Alves]]&lt;br /&gt;
|DC&lt;br /&gt;
|94.15&lt;br /&gt;
|97.26&lt;br /&gt;
|96.25&lt;br /&gt;
|97.22&lt;br /&gt;
|93.23&lt;br /&gt;
|'''95.62'''&lt;br /&gt;
|88.13&lt;br /&gt;
|86.74&lt;br /&gt;
|92.59&lt;br /&gt;
|89.73&lt;br /&gt;
|85.88&lt;br /&gt;
|'''88.62'''&lt;br /&gt;
|79.68&lt;br /&gt;
|81.77&lt;br /&gt;
|82.97&lt;br /&gt;
|84.90&lt;br /&gt;
|'''84.35'''&lt;br /&gt;
|'''82.73'''&lt;br /&gt;
|'''88.99'''&lt;br /&gt;
|168.3 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Komarious]] 1.842&lt;br /&gt;
|[[Voidious]]&lt;br /&gt;
|GF/VCS&lt;br /&gt;
|93.41&lt;br /&gt;
|98.23&lt;br /&gt;
|97.39&lt;br /&gt;
|97.97&lt;br /&gt;
|91.21&lt;br /&gt;
|'''95.64'''&lt;br /&gt;
|86.14&lt;br /&gt;
|88.02&lt;br /&gt;
|89.53&lt;br /&gt;
|88.06&lt;br /&gt;
|84.44&lt;br /&gt;
|'''87.24'''&lt;br /&gt;
|80.58&lt;br /&gt;
|84.30&lt;br /&gt;
|80.27&lt;br /&gt;
|85.98&lt;br /&gt;
|81.63&lt;br /&gt;
|'''82.55'''&lt;br /&gt;
|'''88.48'''&lt;br /&gt;
|67 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Raiko]] 0.43 || [[Jamougha]] || GF/VCS || 91.26 || 97.96 || 97.28 || 98.86 || 99.56 || '''96.98''' || 86.12 || 87.06 || 91.10 || 85.93 || 82.95 || '''86.63''' || 77.03 || 82.91 || 81.61 || 85.73 || 80.01 || '''81.46''' || '''88.36''' || 40.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Roborio]] 1.2.1tc || [[User:Rsalesc|Rsalesc]] || DC-DCAS || 93.26 || 97.42 || 94.92 || 92.4 || 96.5 || '''94.9''' || 88.05 || 83.4 || 91.77 || 88.54 || 83.1 || '''86.97''' || 82.8 || 80.52 || 83.46 || 85.1 || 82.92 || '''82.96''' || '''88.28''' || 30.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[DeBroglie]] TC0090 (Main gun) || [[User:Tkiesel|Tkiesel]] || DC/GF || 92.69 || 98.77 || 95.01 || 97.13 || 92.92 || '''95.30''' || 89.15 || 89.86 || 87.37 || 87.20 || 84.26 || '''87.57''' || 77.09 || 85.16 || 83.95 || 82.17 || 80.44 || '''81.76''' || '''88.21''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Neuromancer]] 4.0 || [[User:Skilgannon|Skilgannon]] || KNN/PIF|| 88.67 || 98.64 || 96.30 || 97.39 || 94.26 || '''95.05''' || 89.65 || 88.80 || 90.28 || 87.05 || 83.58 || '''87.87''' || 79.49 || 83.11 || 83.08 || 82.11 || 80.39 || '''81.64''' || '''88.19''' || 100 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Firebird]] 0.21 (Main Gun)&lt;br /&gt;
|[[User:David Alves|David Alves]]&lt;br /&gt;
|DC&lt;br /&gt;
|93.95&lt;br /&gt;
|97.34&lt;br /&gt;
|95.41&lt;br /&gt;
|97.04&lt;br /&gt;
|92.53&lt;br /&gt;
|'''95.25'''&lt;br /&gt;
|87.64&lt;br /&gt;
|86.01&lt;br /&gt;
|90.46&lt;br /&gt;
|88.26&lt;br /&gt;
|83.89&lt;br /&gt;
|'''87.25'''&lt;br /&gt;
|81.61&lt;br /&gt;
|80.13&lt;br /&gt;
|81.48&lt;br /&gt;
|82.56&lt;br /&gt;
|83.34&lt;br /&gt;
|'''81.82'''&lt;br /&gt;
|'''88.11'''&lt;br /&gt;
|151.3 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Mint]] 0.14b || [[Chase]] || DC || 94.47 || 97.69 || 94.57 || 97.27 || 92.87 || '''95.37 '''|| 88.64 || 89.16 || 88.27 || 86.26 || 83.5 || '''87.17''' || 82.12 || 83.82 || 78.65 || 82.42 || 78.32 || '''81.07''' || '''87.87''' || 15.0 Seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Shadow]] 3.83c || [[ABC]] || DC/PIF || 89.79 || 98.36 || 94.69 || 96.71 || 93.36 || '''94.58''' || 87.83 || 89.89 || 89.36 || 89.42 || 82.37 || '''87.78''' || 74.79 || 84.91 || 80.14 || 82.83 || 81.23 || '''80.78''' || '''87.71''' || 44.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
|[[Lukious]] 1.21&lt;br /&gt;
|[[User:Voidious|Voidious]]&lt;br /&gt;
|DC&lt;br /&gt;
|92.48&lt;br /&gt;
|97.42&lt;br /&gt;
|95.50&lt;br /&gt;
|97.40&lt;br /&gt;
|94.96&lt;br /&gt;
|'''95.55'''&lt;br /&gt;
|88.55&lt;br /&gt;
|87.87&lt;br /&gt;
|85.80&lt;br /&gt;
|86.24&lt;br /&gt;
|82.04&lt;br /&gt;
|'''86.10'''&lt;br /&gt;
|77.34&lt;br /&gt;
|'''86.82'''&lt;br /&gt;
|78.74&lt;br /&gt;
|82.82&lt;br /&gt;
|76.62&lt;br /&gt;
|'''80.47'''&lt;br /&gt;
|'''87.37'''&lt;br /&gt;
|60 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[GresSuffurd]] 0.2.28 || [[GrubbmGait]] || GF/VCS || 91.27 || 96.65 || 95.45 || 97.04 || 94.12 || '''94.91''' || 84.43 || 86.52 || 87.68 || 86.83 || 83.64 || '''85.82''' || 80.48 || 81.82 || 77.90 || 82.99 || 78.09 || '''80.25''' || '''86.99''' || 50 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[XanderCat]] 12.6 (No [[AntiSurfer|AS]])|| [[User:Skotty|Skotty]] || DC/GF || 89.84 || 95.59 || 94.48 || 96.61 || 90.45 || '''93.39''' || 83.08 || 84.46 || 88.76 || 88.87 || 82.09 || '''85.45''' || 68.74 || 85.06 || 82.23 || 82.37 || 80.94 || '''79.87''' || '''86.24''' || 100 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Tomcat]] 3.37 || [[Jdev]] || kNN/PIF ||88.60 ||97.31 ||94.14 ||95.17 ||91.80 ||'''93.41''' ||84.94 ||86.34 ||89.09 ||84.54 ||82.31 ||'''85.45''' ||71.03 ||85.34 ||79.34 ||80.46 ||76.17 ||'''78.47''' ||'''85.77''' ||35 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Cotillion]] 0.8TC || [[User:Skilgannon|Skilgannon]] || MC-PM || 86.95 || 96.78 || 94.74 || 96.12 || 91.59 || '''93.24''' || 85.43 || 86.01 || 87.53 || 84.04 || 83.06 || '''85.22''' || 70.29 || 82.31 || 77.13 || 82.66 || 77.84 || '''78.05''' || '''85.50''' || 50 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[XanderCat]] 12.6 (both guns)|| [[User:Skotty|Skotty]] || VG/DC/GF || 87.59 || 94.80 || 93.69 || 96.22 || 90.92 || '''92.64''' || 82.92 || 85.36 || 88.80 || 86.32 || 78.26 || '''84.33''' || 67.28 || 81.63 || 79.90 || 79.07 || 80.15 || '''77.61''' || '''84.86''' || 91.2 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[Seraphim]] 2.0.6 || [[User:Chase-san|Chase-san]] || GF/VCS || 88.97 || 94.97 || 92.88 || 96.47 || 90.88 || '''92.83''' || 83.91 || 84.78 || 85.70 || 85.00 || 79.27 || '''83.74''' || 75.38 || 78.32 || 76.93 || 79.78 || 77.36 || '''77.55''' || '''84.71''' || 50.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| [[RetroGirl]] 1.0.0 || [[User:Voidious|Voidious]] || ?/GF || 77.26 || 87.21 || 90.89 || 95.65 || 89.91 || '''88.19''' || 74.96 || 86.48 || 77.36 || 74.44 || 57.74 || '''74.19''' || 56.55 || 71.57 || 58.38 || 86.62 || 78.74 || '''70.37''' || '''77.58''' || 35.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| WSCBotC 1.0 || || CT || 64.31 || 94.89 || 88.36 || 93.91 || 85.11 || '''85.32''' || 81.50 || 78.61 || 88.24 || 64.15 || 6.96 || '''63.89''' || 58.65 || 58.04 || 20.62 || 25.39 || 73.95 || '''47.33''' || '''65.51''' || 40.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| WSCBotB 1.1 || || LT || 63.14 || 84.83 || 87.40 || 89.56 || 82.92 || '''81.57''' || 77.58 || 74.01 || 86.83 || 62.30 || 4.67 || '''61.08''' || 61.89 || 59.81 || 52.23 || 22.84 || 50.45 || '''49.45''' || '''64.03''' || 40.0 seasons&lt;br /&gt;
|-&lt;br /&gt;
| WSCBotA 1.0 || || HT || 81.19 || 79.21 || 85.37 || 96.67 || 82.70 || '''85.03''' || 80.07 || 84.86 || 70.63 || 89.27 || 11.75 || '''67.31''' || 55.77 || 67.87 || 12.06 || 19.82 || 18.46 || '''34.80''' || '''62.38''' || 40.0 seasons&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 500 Rounds ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse; font-size: 85%; color: black&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Bot&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Author&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Gun&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Aspd&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Sprw&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Fhqw&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Yngw&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|FlMn&lt;br /&gt;
!|EASY&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Tron&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|HTTC&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|RnMB&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|DlMc&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Grbb&lt;br /&gt;
!|MED&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|SnDT&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Cgrt&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Frtn&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|WkOb&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|RkMc&lt;br /&gt;
!|HARD&lt;br /&gt;
!|TOTAL&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Comments&lt;br /&gt;
|-&lt;br /&gt;
|[[Simonton/DCResearch|DCResearch]] 0071&lt;br /&gt;
|[[User:Simonton|Simonton]]&lt;br /&gt;
|DC/GF&lt;br /&gt;
|96.87&lt;br /&gt;
|99.53&lt;br /&gt;
|98.60&lt;br /&gt;
|98.55&lt;br /&gt;
|94.69&lt;br /&gt;
|'''97.65'''&lt;br /&gt;
|92.75&lt;br /&gt;
|91.66&lt;br /&gt;
|92.51&lt;br /&gt;
|89.31&lt;br /&gt;
|88.34&lt;br /&gt;
|'''90.92'''&lt;br /&gt;
|88.88&lt;br /&gt;
|88.41&lt;br /&gt;
|84.44&lt;br /&gt;
|84.83&lt;br /&gt;
|83.95&lt;br /&gt;
|'''86.10'''&lt;br /&gt;
|'''91.55'''&lt;br /&gt;
|6.0 seasons&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{gunabbr}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Challenge Results]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Jarvis&amp;diff=56423</id>
		<title>Jarvis</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Jarvis&amp;diff=56423"/>
		<updated>2021-01-17T21:34:34Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| caption         = Jarvis&lt;br /&gt;
| author          = [[User:bnorm|bnorm]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
| movement        = [[MinimumRiskMovement]]&lt;br /&gt;
| license         = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Mega bot named after my dog (in turn named after the Iron Man character) built with Kotlin. Nothing ground breaking, but it is the first robot I know of to use safe and fair [[Multithreading|multithreading]], enabled by Kotlin coroutines. I'm also messing around with JMH performance benchmarks, data saving and visualization, challenge battle automation, etc. Also uses Gradle for building, using a custom built plugin.&lt;br /&gt;
&lt;br /&gt;
: https://github.com/bnorm/jarvis&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Javis]]&lt;br /&gt;
[[Category:MegaBots|Javis]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Javis]]&lt;br /&gt;
[[Category:Open Source Bots|Javis]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Jarvis&amp;diff=56422</id>
		<title>Jarvis</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Jarvis&amp;diff=56422"/>
		<updated>2021-01-17T21:34:10Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: New bot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| caption         = Jarvis&lt;br /&gt;
| author          = [[User:bnorm|bnorm]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
| movement        = [[MinimumRiskMovement]]&lt;br /&gt;
| license         = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Jarvis =&lt;br /&gt;
&lt;br /&gt;
Mega bot named after my dog (in turn named after the Iron Man character) built with Kotlin. Nothing ground breaking, but it is the first robot I know of to use safe and fair [[Multithreading|multithreading]], enabled by Kotlin coroutines. I'm also messing around with JMH performance benchmarks, data saving and visualization, challenge battle automation, etc. Also uses Gradle for building, using a custom built plugin.&lt;br /&gt;
&lt;br /&gt;
: https://github.com/bnorm/jarvis&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Javis]]&lt;br /&gt;
[[Category:MegaBots|Javis]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Javis]]&lt;br /&gt;
[[Category:Open Source Bots|Javis]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Template:RobocodeDocsList&amp;diff=56421</id>
		<title>Template:RobocodeDocsList</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Template:RobocodeDocsList&amp;diff=56421"/>
		<updated>2021-01-17T17:29:20Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Add link to Gradle page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Robocode API ===&lt;br /&gt;
* [http://robocode.sourceforge.net/docs/robocode/ Robocode API]&lt;br /&gt;
&lt;br /&gt;
=== Beginner Guides ===&lt;br /&gt;
* [[Robocode|Welcome to Robocode]]&lt;br /&gt;
* [[Robocode/System Requirements|System requirements]]&lt;br /&gt;
* [[Robocode/Download And Install|Download and install]]&lt;br /&gt;
* [[Robocode/Getting Started|Getting started]]&lt;br /&gt;
* [[Robocode/FAQ|Frequently asked questions]]&lt;br /&gt;
* [[Robocode/My First Robot|My First Robot tutorial]]&lt;br /&gt;
* [[Robocode/Game Physics|Game physics]]&lt;br /&gt;
* [[Robocode/Robot Anatomy|The anatomy of a robot]]&lt;br /&gt;
* [[Robocode/Scoring|Scoring in Robocode]]&lt;br /&gt;
* [[Robocode/Robot Console|Using the robot console]]&lt;br /&gt;
* [[Robocode/Downloading_Robots|Downloading other robots]]&lt;br /&gt;
* [[Robocode/Learning from Robots|Learning from other robots]]&lt;br /&gt;
* [[Robocode/Package Robot|Package your robot]]&lt;br /&gt;
* [[Robocode/Articles|Articles about Robocode]]&lt;br /&gt;
* [[Robocode/Console Usage|Starting Robocode from the command line]]&lt;br /&gt;
* [[Robocode/Graphical_Debugging|Graphical debugging]]&lt;br /&gt;
&lt;br /&gt;
=== External Editors ===&lt;br /&gt;
&lt;br /&gt;
* [[Robocode/Eclipse|Using Eclipse with Robocode]]&lt;br /&gt;
* [[Robocode/Eclipse/Create_a_Project|Creating a project in Eclipse]]&lt;br /&gt;
* [[Robocode/Eclipse/Create_a_Robot|Creating a robot in Eclipse]]&lt;br /&gt;
* [[Robocode/Eclipse/Running from Eclipse|Running your robot from Eclipse]]&lt;br /&gt;
* [[Robocode/Eclipse/Debugging Robot|Debugging your robot with Eclipse]]&lt;br /&gt;
* [[Robocode/NetBeans/Configure|Using NetBeans with Robocode]]&lt;br /&gt;
* [[Robocode/Gradle|Using Gradle with Robocode]]&lt;br /&gt;
&lt;br /&gt;
=== .NET Robots ===&lt;br /&gt;
&lt;br /&gt;
* [[Robocode/.NET/Create a .NET robot with Visual Studio|Creating a .NET robot in Visual Studio]]&lt;br /&gt;
* [[Robocode/.NET/Debug a .NET robot in Visual Studio| Debugging a .NET robot in Visual Studio]]&lt;br /&gt;
* [http://robocode.sourceforge.net/docs/robocode.dotnet/Index.html Robocode .NET API]&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* [http://robocode.sourceforge.net/ Robocode homepage]&lt;br /&gt;
* [https://sourceforge.net/projects/robocode Robocode project at SourceForge]&lt;br /&gt;
* [https://github.com/robo-code/robocode Robocode code repository at GitHub]&lt;br /&gt;
* [https://groups.google.com/forum/?fromgroups#!forum/robocode Robocode Google Group]&lt;br /&gt;
* [https://sourceforge.net/project/showfiles.php?group_id=37202&amp;amp;package_id=29609 Robocode downloads]&lt;br /&gt;
* [https://sourceforge.net/projects/robocode/rss?path=/ Robocode RSS feed]&lt;br /&gt;
* [https://literumble.appspot.com/ LiteRumble]&lt;br /&gt;
* [http://robocode-archive.strangeautomata.com/robots/ Robots archive]&lt;br /&gt;
* [[wikipedia:Robocode|Wikipedia entry for Robocode]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Robocode/Gradle&amp;diff=56420</id>
		<title>Robocode/Gradle</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Robocode/Gradle&amp;diff=56420"/>
		<updated>2021-01-17T17:28:01Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Created page with &amp;quot;[https://gradle.org/ Gradle] is a build tool commonly used for JVM programming languages. It supports a powerful plugin architecture for providing build features.  == Robocode...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://gradle.org/ Gradle] is a build tool commonly used for JVM programming languages. It supports a powerful plugin architecture for providing build features.&lt;br /&gt;
&lt;br /&gt;
== Robocode Plugin ==&lt;br /&gt;
&lt;br /&gt;
A [https://github.com/bnorm/robocode-gradle-plugin Gradle plugin for Robocode] has been created by [[User:Bnorm|Bnorm]] which automates a few pieces of the Robocode development cycle:&lt;br /&gt;
&lt;br /&gt;
# Automatically downloads the configured version of Robocode (optionally can point at an existing install)&lt;br /&gt;
## Adds the robocode.jar file to the project compile class path&lt;br /&gt;
## If downloaded, automatically configures Robocode to point to development bin directory&lt;br /&gt;
# Flattens any dependencies into a single jar file&lt;br /&gt;
## This allows using third-party dependencies&lt;br /&gt;
## Also allows using alternative JVM languages (like Kotlin) which include their own standard library&lt;br /&gt;
# Adds tasks to Gradle for building each configured Robot and generates a Robocode compatible jar file&lt;br /&gt;
# Adds a task to Gradle for building class files and placing files in consistent directory for Robocode to read&lt;br /&gt;
# Adds a task to Gradle for running Robocode&lt;br /&gt;
# Adds a Gradle configuration with all Robocode runtime dependencies for automating targeting and movement challenges&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(7)&amp;diff=30675</id>
		<title>Thread:User talk:KID/Username Change/reply (7)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(7)&amp;diff=30675"/>
		<updated>2013-05-08T12:59:24Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Username Change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thank you sir!&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(5)&amp;diff=30660</id>
		<title>Thread:User talk:KID/Username Change/reply (5)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(5)&amp;diff=30660"/>
		<updated>2013-05-07T12:50:57Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Username Change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Any update?&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=30573</id>
		<title>DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=30573"/>
		<updated>2013-05-03T21:06:31Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: updating download and website links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Delta_squad.jpg&lt;br /&gt;
| caption         = The Delta Squad&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[TeamRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| best_rating     = Team: 1553.89 (16th)&lt;br /&gt;
| current_version = .1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = http://bnorm.github.io/robocode/delta-squad/kid.DeltaSquad.DeltaSquad_.1.jar&lt;br /&gt;
}}&lt;br /&gt;
{{Youtube|BuE-3fGXsGQ|Codefest Finals - Match 1}}&lt;br /&gt;
{{Youtube|V101GIhQtHY|Codefest Finals - Match 2}}&lt;br /&gt;
{{Youtube|jjE2y7KvxdA|Codefest Finals - Match 3}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Delta Squad - yep, it's from Republic Commando...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.io/robocode/delta-squad/index.html&lt;br /&gt;
&lt;br /&gt;
Delta Squad is a four robot team. My goal was to make each robot have a different strategy that lent itself to the team as a whole. While it hasn't quite gotten that far yet, I'm still working on it. The thing that I really like about this team though is that it does pretty well in the TeamRumble for only have four robots and not five.  &lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
It's on the back burner..&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Delta Squad is competing in [http://itbhu.ac.in/codefest/event.php?name=virtual%20combat Virtual Combat] after I hacked together some object detection/avoidance and flag seeking. It's also, currently, doing quite well.&lt;br /&gt;
&lt;br /&gt;
[[Category:Teams|DeltaSquad]]&lt;br /&gt;
[[Category:Open Source Bots|DeletaSquad]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Gladiator&amp;diff=30572</id>
		<title>Gladiator</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Gladiator&amp;diff=30572"/>
		<updated>2013-05-03T20:14:15Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: updating website link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Gladiator.jpg&lt;br /&gt;
| caption         = Gladiator&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
:[[TidalWave Targeting]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| released        = July 7th, 2005&lt;br /&gt;
| best_rating     = 1v1: 1873.02 (44th) &amp;lt;br/&amp;gt; Melee: 1710.39 (6th)&lt;br /&gt;
| current_version = .7.2&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = http://bnorm.github.io/robocode/gladiator/kid.Gladiator_.7.2.jar&lt;br /&gt;
}}&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Gladiator - yes, I got the name off the movie...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.io/robocode/gladiator/index.html&lt;br /&gt;
&lt;br /&gt;
Gladiator is programed in a very structured way. While some of it is ''very'' unstructured way, I did try to code it to the best of my abilities and keep it very maintainable. Gladiator is very much a plug-and-play robot, with classes such as &amp;quot;Targeting&amp;quot;, &amp;quot;Movement&amp;quot; and classes that extend those base classes. This created a very flexible and testable robot which is easy to maintain and upgrade with [[Virtual Guns]] and other things.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Currently, Gladiator is going under a massive overhaul. If you want to know just how massive it truly is, just take a look at the source code. In this effort, everything is being redone and nothing will be overlooked. This as been going on over the summer and continues into the fall and winter. I doubt there will be another version of Gladiator for sometime.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Gladiator]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Gladiator]]&lt;br /&gt;
[[Category:Melee Bots|Gladiator]]&lt;br /&gt;
[[Category:Open Source Bots|Gladiator]]&lt;br /&gt;
[[Category:MegaBots|Gladiator]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Toa&amp;diff=30571</id>
		<title>Toa</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Toa&amp;diff=30571"/>
		<updated>2013-05-03T20:13:09Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: updating download link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Toa.jpg&lt;br /&gt;
| caption         = Toa&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
| movement        = [[Perpendicular movement|Perpendicular]]&lt;br /&gt;
| released        = February 26th, 2008&lt;br /&gt;
| current_version = .0.1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = http://bnorm.github.io/robocode/toa/kid.Toa_.0.5.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Toa&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.io/robocode/toa/index.html&lt;br /&gt;
&lt;br /&gt;
Toa is what came about now that I am recreating [[Gladiator]]. I didn't feel like decreasing [[Gladiator]]'s score any, so I just released a new robot. I do plan to update this robot until it surpasses [[Gladiator]]. It will then be put on the shelf.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Oh all sorts of stuff. [[Wave Surfing]]... [[GuessFactor Targeting (traditional) | GuessFactor Targeting]]... [[Pattern Matching]]... the list goes on.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Toa]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Toa]]&lt;br /&gt;
[[Category:Melee Bots|Toa]]&lt;br /&gt;
[[Category:Open Source Bots|Toa]]&lt;br /&gt;
[[Category:MegaBots|Toa]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Gladiator&amp;diff=30570</id>
		<title>Gladiator</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Gladiator&amp;diff=30570"/>
		<updated>2013-05-03T20:12:19Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: updating download link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Gladiator.jpg&lt;br /&gt;
| caption         = Gladiator&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
:[[TidalWave Targeting]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| released        = July 7th, 2005&lt;br /&gt;
| best_rating     = 1v1: 1873.02 (44th) &amp;lt;br/&amp;gt; Melee: 1710.39 (6th)&lt;br /&gt;
| current_version = .7.2&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = http://bnorm.github.io/robocode/gladiator/kid.Gladiator_.7.2.jar&lt;br /&gt;
}}&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Gladiator - yes, I got the name off the movie...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.com/robocode/gladiator/index.html&lt;br /&gt;
&lt;br /&gt;
Gladiator is programed in a very structured way. While some of it is ''very'' unstructured way, I did try to code it to the best of my abilities and keep it very maintainable. Gladiator is very much a plug-and-play robot, with classes such as &amp;quot;Targeting&amp;quot;, &amp;quot;Movement&amp;quot; and classes that extend those base classes. This created a very flexible and testable robot which is easy to maintain and upgrade with [[Virtual Guns]] and other things.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Currently, Gladiator is going under a massive overhaul. If you want to know just how massive it truly is, just take a look at the source code. In this effort, everything is being redone and nothing will be overlooked. This as been going on over the summer and continues into the fall and winter. I doubt there will be another version of Gladiator for sometime.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Gladiator]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Gladiator]]&lt;br /&gt;
[[Category:Melee Bots|Gladiator]]&lt;br /&gt;
[[Category:Open Source Bots|Gladiator]]&lt;br /&gt;
[[Category:MegaBots|Gladiator]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(4)&amp;diff=30520</id>
		<title>Thread:User talk:KID/Username Change/reply (4)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(4)&amp;diff=30520"/>
		<updated>2013-04-30T18:24:12Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Username Change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No rush. I didn't think I would get a response for a couple days anyways.&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=30518</id>
		<title>User:Bnorm</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=30518"/>
		<updated>2013-04-30T18:21:28Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating my profile&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Who I Am ==&lt;br /&gt;
&lt;br /&gt;
I was introduced to Robocode sometime in February of '04 when my father sent me a link to download it. Well, I played with it for about two months and then got bored after being to confused, it being my first programing experience and all. I returned to it in April of '05 for reasons that I have since forgotten, but the addiction hasn't left since then.&lt;br /&gt;
&lt;br /&gt;
I may not be the most active Robocoder on the wiki but I am usually checking it every couple days.&lt;br /&gt;
&lt;br /&gt;
== My Robots ==&lt;br /&gt;
&lt;br /&gt;
* '''[[Gladiator]]''' - My first and only competitive robot.&lt;br /&gt;
* '''[[NightFox]]''' - A test robot.&lt;br /&gt;
* '''[[Toa]]''' - A pre [[Gladiator]] remake robot.&lt;br /&gt;
* '''[[Rinzler]]''' - I'm reserving the name for a future bot. Maybe a [[Tron]] tribute/killer.&lt;br /&gt;
&lt;br /&gt;
== My Teams ==&lt;br /&gt;
&lt;br /&gt;
* '''[[DeltaSquad]]''' - A four robot team. Winners of the CodeFest 2011: VirtualCombat competition.&lt;br /&gt;
* '''[[OmegaSquad]]''' - A pre [[DeltaSquad]] remake team.&lt;br /&gt;
&lt;br /&gt;
== Free Code ==&lt;br /&gt;
&lt;br /&gt;
* '''[[User:KID/DrawMenu]]''' - A graphical debugging tool.&lt;br /&gt;
* I've got an account on GitHub under the username bnorm.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bot Authors|KID]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(2)&amp;diff=30517</id>
		<title>Thread:User talk:KID/Username Change/reply (2)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change/reply_(2)&amp;diff=30517"/>
		<updated>2013-04-30T18:20:09Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Username Change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Yeah, that's what I saw too. If you don't want to install it I could always just create a new profile and redirect everything. But I do like having a User ID of 7... :-)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change&amp;diff=30515</id>
		<title>Thread:User talk:KID/Username Change</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Username_Change&amp;diff=30515"/>
		<updated>2013-04-30T18:05:42Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: New thread: Username Change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I'm not sure who I should contact about this but I would like to change my username to &amp;quot;bnorm&amp;quot;. I read online that an admin has to do that but I'm not sure who that is around here anymore.&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=26858</id>
		<title>DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=26858"/>
		<updated>2012-09-20T20:29:29Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Adding links to the final matches of codefest&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Delta_squad.jpg&lt;br /&gt;
| caption         = The Delta Squad&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[TeamRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| best_rating     = Team: 1553.89 (16th)&lt;br /&gt;
| current_version = .1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/bnorm/robocode/kid.DeltaSquad.DeltaSquad_.1.jar&lt;br /&gt;
}}&lt;br /&gt;
{{Youtube|BuE-3fGXsGQ|Codefest Finals - Match 1}}&lt;br /&gt;
{{Youtube|V101GIhQtHY|Codefest Finals - Match 2}}&lt;br /&gt;
{{Youtube|jjE2y7KvxdA|Codefest Finals - Match 3}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Delta Squad - yep, it's from Republic Commando...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.com/robocode/delta-squad/index.html&lt;br /&gt;
&lt;br /&gt;
Delta Squad is a four robot team. My goal was to make each robot have a different strategy that lent itself to the team as a whole. While it hasn't quite gotten that far yet, I'm still working on it. The thing that I really like about this team though is that it does pretty well in the TeamRumble for only have four robots and not five.  &lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
It's on the back burner..&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Delta Squad is competing in [http://itbhu.ac.in/codefest/event.php?name=virtual%20combat Virtual Combat] after I hacked together some object detection/avoidance and flag seeking. It's also, currently, doing quite well.&lt;br /&gt;
&lt;br /&gt;
[[Category:Teams|DeltaSquad]]&lt;br /&gt;
[[Category:Open Source Bots|DeletaSquad]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=26227</id>
		<title>DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=26227"/>
		<updated>2012-08-07T23:33:35Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: update links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Delta_squad.jpg&lt;br /&gt;
| caption         = The Delta Squad&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[TeamRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| best_rating     = Team: 1553.89 (16th)&lt;br /&gt;
| current_version = .1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/bnorm/robocode/kid.DeltaSquad.DeltaSquad_.1.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Delta Squad - yep, it's from Republic Commando...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.com/robocode/delta-squad/index.html&lt;br /&gt;
&lt;br /&gt;
Delta Squad is a four robot team. My goal was to make each robot have a different strategy that lent itself to the team as a whole. While it hasn't quite gotten that far yet, I'm still working on it. The thing that I really like about this team though is that it does pretty well in the TeamRumble for only have four robots and not five.  &lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
It's on the back burner..&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Delta Squad is competing in [http://itbhu.ac.in/codefest/event.php?name=virtual%20combat Virtual Combat] after I hacked together some object detection/avoidance and flag seeking. It's also, currently, doing quite well.&lt;br /&gt;
&lt;br /&gt;
[[Category:Teams|DeltaSquad]]&lt;br /&gt;
[[Category:Open Source Bots|DeletaSquad]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Toa&amp;diff=26226</id>
		<title>Toa</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Toa&amp;diff=26226"/>
		<updated>2012-08-07T23:32:04Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Toa.jpg&lt;br /&gt;
| caption         = Toa&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
| movement        = [[Perpendicular movement|Perpendicular]]&lt;br /&gt;
| released        = February 26th, 2008&lt;br /&gt;
| current_version = .0.1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/bnorm/robocode/kid.Toa_.0.5.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Toa&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.com/robocode/toa/index.html&lt;br /&gt;
&lt;br /&gt;
Toa is what came about now that I am recreating [[Gladiator]]. I didn't feel like decreasing [[Gladiator]]'s score any, so I just released a new robot. I do plan to update this robot until it surpasses [[Gladiator]]. It will then be put on the shelf.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Oh all sorts of stuff. [[Wave Surfing]]... [[GuessFactor Targeting (traditional) | GuessFactor Targeting]]... [[Pattern Matching]]... the list goes on.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Toa]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Toa]]&lt;br /&gt;
[[Category:Melee Bots|Toa]]&lt;br /&gt;
[[Category:Open Source Bots|Toa]]&lt;br /&gt;
[[Category:MegaBots|Toa]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Toa&amp;diff=26225</id>
		<title>Toa</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Toa&amp;diff=26225"/>
		<updated>2012-08-07T23:27:23Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Toa.jpg&lt;br /&gt;
| caption         = Toa&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
| movement        = [[Perpendicular movement|Perpendicular]]&lt;br /&gt;
| released        = February 26th, 2008&lt;br /&gt;
| current_version = .0.1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/bnorm/robocode/kid.Toa_.0.5.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Toa&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.com/robocode/toa/html.html&lt;br /&gt;
&lt;br /&gt;
Toa is what came about now that I am recreating [[Gladiator]]. I didn't feel like decreasing [[Gladiator]]'s score any, so I just released a new robot. I do plan to update this robot until it surpasses [[Gladiator]]. It will then be put on the shelf.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Oh all sorts of stuff. [[Wave Surfing]]... [[GuessFactor Targeting (traditional) | GuessFactor Targeting]]... [[Pattern Matching]]... the list goes on.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Toa]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Toa]]&lt;br /&gt;
[[Category:Melee Bots|Toa]]&lt;br /&gt;
[[Category:Open Source Bots|Toa]]&lt;br /&gt;
[[Category:MegaBots|Toa]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Gladiator&amp;diff=26224</id>
		<title>Gladiator</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Gladiator&amp;diff=26224"/>
		<updated>2012-08-07T23:26:37Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Gladiator.jpg&lt;br /&gt;
| caption         = Gladiator&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
:[[TidalWave Targeting]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| released        = July 7th, 2005&lt;br /&gt;
| best_rating     = 1v1: 1873.02 (44th) &amp;lt;br/&amp;gt; Melee: 1710.39 (6th)&lt;br /&gt;
| current_version = .7.2&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/bnorm/robocode/kid.Gladiator_.7.2.jar&lt;br /&gt;
}}&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Gladiator - yes, I got the name off the movie...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://bnorm.github.com/robocode/gladiator/index.html&lt;br /&gt;
&lt;br /&gt;
Gladiator is programed in a very structured way. While some of it is ''very'' unstructured way, I did try to code it to the best of my abilities and keep it very maintainable. Gladiator is very much a plug-and-play robot, with classes such as &amp;quot;Targeting&amp;quot;, &amp;quot;Movement&amp;quot; and classes that extend those base classes. This created a very flexible and testable robot which is easy to maintain and upgrade with [[Virtual Guns]] and other things.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Currently, Gladiator is going under a massive overhaul. If you want to know just how massive it truly is, just take a look at the source code. In this effort, everything is being redone and nothing will be overlooked. This as been going on over the summer and continues into the fall and winter. I doubt there will be another version of Gladiator for sometime.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Gladiator]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Gladiator]]&lt;br /&gt;
[[Category:Melee Bots|Gladiator]]&lt;br /&gt;
[[Category:Open Source Bots|Gladiator]]&lt;br /&gt;
[[Category:MegaBots|Gladiator]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(26)&amp;diff=26092</id>
		<title>Thread:User talk:KID/Rumble Server/reply (26)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(26)&amp;diff=26092"/>
		<updated>2012-07-30T19:35:52Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was actually thinking about doing 8 clients on one-on-one and 4 on melee. A couple hours is too long... I'll have to dial it up. :-)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(24)&amp;diff=26088</id>
		<title>Thread:User talk:KID/Rumble Server/reply (24)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(24)&amp;diff=26088"/>
		<updated>2012-07-30T18:54:19Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How long is it taking a new robot to stabilize with my clients running? Right now I have 6 running one-on-one and 6 running melee. I'm thinking about changing up the ratio though.&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(20)&amp;diff=25931</id>
		<title>Thread:User talk:KID/Rumble Server/reply (20)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(20)&amp;diff=25931"/>
		<updated>2012-07-24T04:39:16Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;6 clients are up! I have been so busy at work lately that I have been forgetting to run these when I can. I did lose one server temporally but will hopefully be able to get it back this weekend. Then 12 clients will be cranking out results.&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm/DrawMenu&amp;diff=25488</id>
		<title>User:Bnorm/DrawMenu</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm/DrawMenu&amp;diff=25488"/>
		<updated>2012-07-04T23:46:09Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: updating links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DrawMenu ==&lt;br /&gt;
&lt;br /&gt;
So a while ago I got really bored and decided to control all of my debugging graphics a little better. The result? A little menu that allows you to select which graphics to show. It's probably a little hard to read but I thought I would at least share it with you guys in case somebody wanted something like this but didn't have the time to create it. Rewrite, reuse, abuse, I don't care, just make sure you enjoy it. :-)&lt;br /&gt;
&lt;br /&gt;
Oh, but if you make any major improvements to it, be sure to let me know so I can update my copy.&lt;br /&gt;
&lt;br /&gt;
For the most resent copy of [https://github.com/bnorm/robocode/blob/master/src/kid/draw/DrawMenu.java this code] checkout my project on [https://github.com/bnorm/robocode GitHub].&lt;br /&gt;
&lt;br /&gt;
--[[User:KID|KID]] 21:11, 14 February 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Use ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// Wherever you do graphical debugging&lt;br /&gt;
if (DrawMenu.getValue(&amp;quot;Menu&amp;quot;, &amp;quot;Item&amp;quot;)) {&lt;br /&gt;
   ...&lt;br /&gt;
   // Do your graphical debugging stuff&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// All of these go in your advanced robot class of course&lt;br /&gt;
public void run() {&lt;br /&gt;
   DrawMenu.load(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onMouseEvent(MouseEvent e) {&lt;br /&gt;
   DrawMenu.inMouseEvent(e);&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onPaint(Graphics2D g) {&lt;br /&gt;
   DrawMenu.draw(g);&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onDeath(DeathEvent event) {&lt;br /&gt;
   ...&lt;br /&gt;
   DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onWin(WinEvent event) {&lt;br /&gt;
   ...&lt;br /&gt;
   DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
&lt;br /&gt;
import robocode.RobocodeFileWriter;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A utility class that provides the coder with the ability to add a draw menu&lt;br /&gt;
 * to the lower left of the battlefield. This menu is a boolean menu that&lt;br /&gt;
 * dynamically creates elements as the user requests them. When deciding to draw&lt;br /&gt;
 * something the user should check to see if the draw menu item has been&lt;br /&gt;
 * enabled. This functionality provides a quick and clean way for the user to&lt;br /&gt;
 * dynamically control what a robot draws to the screen.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Brian Norman (KID)&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class DrawMenu {&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The x-coordinate for the starting location of the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   startX        = 0;&lt;br /&gt;
   /**&lt;br /&gt;
    * The y-coordinate for the starting location of the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   startY        = 1;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The width of the start menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   baseRecWidth  = 71;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The height of the start menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   baseRecHeight = 13;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The width of the sub-menus in the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   recWidth      = 71;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The height of the sub-menus in the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   recHeight     = 13;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The relative x-coordinate for the starting location of the sub-menus. This&lt;br /&gt;
    * is relative to the lower right point of the title item.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   stringX       = 2;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The relative y-coordinate for the starting location of the sub-menus. This&lt;br /&gt;
    * is relative to the lower right point of the title item.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   stringY       = 2;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The border color of a sub-menu that is open.&lt;br /&gt;
    */&lt;br /&gt;
   private static Color                 colorOpen     = Color.CYAN;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The border color of a sub-menu that is closed.&lt;br /&gt;
    */&lt;br /&gt;
   private static Color                 colorClosed   = Color.RED;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * If the whole menu is currently open.&lt;br /&gt;
    */&lt;br /&gt;
   private static boolean               open          = false;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The HashMap of sub-menus keyed by their titles.&lt;br /&gt;
    */&lt;br /&gt;
   private static HashMap&amp;lt;String, Menu&amp;gt; menus         = new HashMap&amp;lt;String, Menu&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The title of the menu item with the longest character length.&lt;br /&gt;
    */&lt;br /&gt;
   private static String                longest       = &amp;quot;Draw Menu&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Returns the menu item value of the specified item in the specified menu.&lt;br /&gt;
    * If the the item does not exist it is created with a starting value of&lt;br /&gt;
    * &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. See {@link #getValue(String, String, boolean)} for a&lt;br /&gt;
    * usage example.&lt;br /&gt;
    * &lt;br /&gt;
    * @param item&lt;br /&gt;
    *           the title of the item&lt;br /&gt;
    * @param menu&lt;br /&gt;
    *           the title of the sub-menu.&lt;br /&gt;
    * @return the current value of the item.&lt;br /&gt;
    * @see #getValue(String, String, boolean)&lt;br /&gt;
    */&lt;br /&gt;
   public static boolean getValue(String item, String menu) {&lt;br /&gt;
      return getValue(item, menu, false);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Returns the item value of the specified item in the specified sub-menu. If&lt;br /&gt;
    * the the item does not exist it is created with the specified default&lt;br /&gt;
    * value. An example for use can be seen bellow.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // Where ever you do graphical debugging&lt;br /&gt;
    * if (DrawMenu.getValue(&amp;quot;Menu&amp;quot;, &amp;quot;Item&amp;quot;, true)) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    // graphical debugging stuff&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param item&lt;br /&gt;
    *           the title of the item&lt;br /&gt;
    * @param menu&lt;br /&gt;
    *           the title of the sub-menu.&lt;br /&gt;
    * @param def&lt;br /&gt;
    *           the default value for the item.&lt;br /&gt;
    * @return the current value of the item.&lt;br /&gt;
    */&lt;br /&gt;
   public static boolean getValue(String item, String menu, boolean def) {&lt;br /&gt;
      Menu m = menus.get(menu);&lt;br /&gt;
      if (m == null) {&lt;br /&gt;
         menus.put(menu, m = new Menu());&lt;br /&gt;
         longest = (longest.length() &amp;gt; item.length() ? longest : item);&lt;br /&gt;
      }&lt;br /&gt;
      return m.getValue(item, def);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Loads the specified configuration from the robot's directory that has&lt;br /&gt;
    * specified values for menu items. See the sample code bellow for an&lt;br /&gt;
    * example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * public void run() {&lt;br /&gt;
    *    DrawMenu.load(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    // The rest of your run() code&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param file&lt;br /&gt;
    *           the file to load.&lt;br /&gt;
    */&lt;br /&gt;
   public static void load(File file) {&lt;br /&gt;
      try {&lt;br /&gt;
         BufferedReader in = new BufferedReader(new FileReader(file));&lt;br /&gt;
         String line;&lt;br /&gt;
         while ((line = in.readLine()) != null) {&lt;br /&gt;
            String[] split = line.split(&amp;quot;\\s*,\\s*&amp;quot;);&lt;br /&gt;
            if (split.length &amp;gt; 2) {&lt;br /&gt;
               DrawMenu.getValue(split[0], split[1], Boolean.parseBoolean(split[2]));&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         in.close();&lt;br /&gt;
         System.out.println(&amp;quot;DrawMenu loaded from &amp;quot; + file.getName());&lt;br /&gt;
      } catch (IOException e) {&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Saves the configuration to the specified file in the robot's directory.&lt;br /&gt;
    * See the sample code bellow for an example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onDeath(DeathEvent event) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    * }&lt;br /&gt;
    * &lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onWin(WinEvent event) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    * }&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param file&lt;br /&gt;
    *           the file to save to.&lt;br /&gt;
    */&lt;br /&gt;
   public static void save(File file) {&lt;br /&gt;
      try {&lt;br /&gt;
         PrintWriter out = new PrintWriter(new RobocodeFileWriter(file));&lt;br /&gt;
         for (String s : menus.keySet()) {&lt;br /&gt;
            Menu m = menus.get(s);&lt;br /&gt;
            Set&amp;lt;String&amp;gt; items = m.getItems();&lt;br /&gt;
            for (String i : items)&lt;br /&gt;
               out.println(s + &amp;quot;,&amp;quot; + i + &amp;quot;,&amp;quot; + m.getValue(i, false));&lt;br /&gt;
         }&lt;br /&gt;
         out.close();&lt;br /&gt;
         System.out.println(&amp;quot;DrawMenu saved to &amp;quot; + file.getName());&lt;br /&gt;
      } catch (IOException e) {&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Processes a MouseEvent by checking for clicked events in the area of the&lt;br /&gt;
    * menu. This method should be called every time the robot receives a mouse&lt;br /&gt;
    * event. See the sample code bellow for an example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onMouseEvent(MouseEvent e) {&lt;br /&gt;
    *    DrawMenu.inMouseEvent(e);&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param e&lt;br /&gt;
    *           the mouse event to precess.&lt;br /&gt;
    */&lt;br /&gt;
   public static void inMouseEvent(MouseEvent e) {&lt;br /&gt;
      if (e.getID() == MouseEvent.MOUSE_CLICKED) {&lt;br /&gt;
         if (open) {&lt;br /&gt;
            boolean found = false;&lt;br /&gt;
&lt;br /&gt;
            // finds item&lt;br /&gt;
            Iterator&amp;lt;Menu&amp;gt; iter = menus.values().iterator();&lt;br /&gt;
            for (int i = 0; iter.hasNext() &amp;amp;&amp;amp; !found; i++) {&lt;br /&gt;
               found = iter.next().inMenu(e, i);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!found) {&lt;br /&gt;
               double x = e.getX() - startX;&lt;br /&gt;
               double y = e.getY() - startY;&lt;br /&gt;
               if (x &amp;lt;= recWidth &amp;amp;&amp;amp; x &amp;gt;= 0.0D &amp;amp;&amp;amp; y &amp;gt;= recHeight) {&lt;br /&gt;
                  iter = menus.values().iterator();&lt;br /&gt;
                  for (int i = 0; iter.hasNext() &amp;amp;&amp;amp; !found; i++) {&lt;br /&gt;
                     Menu menu = iter.next();&lt;br /&gt;
                     if (y &amp;lt;= (i + 2) * recHeight) {&lt;br /&gt;
                        if (menu.isOpen()) {&lt;br /&gt;
                           menu.close();&lt;br /&gt;
                        } else {&lt;br /&gt;
                           for (Menu m : menus.values())&lt;br /&gt;
                              m.close();&lt;br /&gt;
                           menu.open();&lt;br /&gt;
                        }&lt;br /&gt;
                        found = true;&lt;br /&gt;
                     }&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
&lt;br /&gt;
               if (!found) {&lt;br /&gt;
                  open = false;&lt;br /&gt;
                  for (Menu m : menus.values())&lt;br /&gt;
                     m.close();&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         } else {&lt;br /&gt;
            double x = e.getX() - startX;&lt;br /&gt;
            double y = e.getY() - startY;&lt;br /&gt;
            if (x &amp;lt;= baseRecWidth &amp;amp;&amp;amp; y &amp;lt;= baseRecHeight &amp;amp;&amp;amp; y &amp;gt;= 0.0D &amp;amp;&amp;amp; x &amp;gt;= 0.0D)&lt;br /&gt;
               open = true;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Draws the menu onto the battlefield. This method should be called every&lt;br /&gt;
    * time the robot draws to the battlefield. See the sample bellow for an&lt;br /&gt;
    * example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // As an advanced robot override&lt;br /&gt;
    * public void onPaint(Graphics2D g) {&lt;br /&gt;
    *    DrawMenu.draw(g);&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param graphics&lt;br /&gt;
    *           the object that handles the drawing.&lt;br /&gt;
    */&lt;br /&gt;
   public static void draw(Graphics graphics) {&lt;br /&gt;
      Color c = graphics.getColor();&lt;br /&gt;
&lt;br /&gt;
      baseRecWidth = (int) graphics.getFontMetrics().getStringBounds(&amp;quot;Draw Menu&amp;quot;, graphics).getWidth() + 20;&lt;br /&gt;
      baseRecHeight = (int) graphics.getFontMetrics().getStringBounds(longest, graphics).getHeight() + 2;&lt;br /&gt;
&lt;br /&gt;
      if (open) {&lt;br /&gt;
         recWidth = (int) graphics.getFontMetrics().getStringBounds(longest, graphics).getWidth();&lt;br /&gt;
         recHeight = baseRecHeight;&lt;br /&gt;
&lt;br /&gt;
         int i = 0;&lt;br /&gt;
         for (String key : menus.keySet()) {&lt;br /&gt;
            Menu menu = menus.get(key);&lt;br /&gt;
            graphics.setColor(menu.isOpen() ? colorOpen : colorClosed);&lt;br /&gt;
            graphics.drawRect(startX, startY + (i + 1) * recHeight, recWidth - 1, recHeight - 1);&lt;br /&gt;
            graphics.drawString(key, startX + stringX, startY + stringY + (i + 1) * recHeight);&lt;br /&gt;
            menu.draw(graphics, i);&lt;br /&gt;
            i++;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      graphics.setColor(open ? colorOpen : colorClosed);&lt;br /&gt;
      graphics.drawRect(startX, startY, baseRecWidth - 1, baseRecHeight - 1);&lt;br /&gt;
      graphics.drawString(&amp;quot;Draw Menu&amp;quot;, startX + stringX, startY + stringY);&lt;br /&gt;
&lt;br /&gt;
      graphics.setColor(c);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * An inner-class representing the sub-menus in the draw menu. Each menu has&lt;br /&gt;
    * its own list of items that store the values.&lt;br /&gt;
    * &lt;br /&gt;
    * @author Brian Norman (KID)&lt;br /&gt;
    * @version 1.0&lt;br /&gt;
    */&lt;br /&gt;
   private static class Menu {&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The border color of an item that is selected.&lt;br /&gt;
       */&lt;br /&gt;
      public static final Color        ITEM_ON  = Color.GREEN;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The border color of an item that is not selected.&lt;br /&gt;
       */&lt;br /&gt;
      public static final Color        ITEM_OFF = Color.RED;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * If the sub-menu is currently open.&lt;br /&gt;
       */&lt;br /&gt;
      private boolean                  open     = false;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * A HashMap of item values keyed by the title of the item.&lt;br /&gt;
       */&lt;br /&gt;
      private HashMap&amp;lt;String, Boolean&amp;gt; items    = new HashMap&amp;lt;String, Boolean&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The title of the item in the sub-menu with the longest character&lt;br /&gt;
       * length.&lt;br /&gt;
       */&lt;br /&gt;
      private String                   longest  = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The width of the items in the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      private int                      recWidth = 71;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns the item value of the specified item in the sub-menu. If the&lt;br /&gt;
       * the item does not exist it is created with the specified default value.&lt;br /&gt;
       * &lt;br /&gt;
       * @param item&lt;br /&gt;
       *           the title of the item&lt;br /&gt;
       * @param def&lt;br /&gt;
       *           the default value for the item.&lt;br /&gt;
       * @return the current value of the item.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean getValue(String item, boolean def) {&lt;br /&gt;
         Boolean value = this.items.get(item);&lt;br /&gt;
         if (value == null) {&lt;br /&gt;
            this.items.put(item, value = def);&lt;br /&gt;
            this.longest = (this.longest.length() &amp;gt; item.length() ? this.longest : item);&lt;br /&gt;
         }&lt;br /&gt;
         return value;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns the set of titles for the items in the sub-menu.&lt;br /&gt;
       * &lt;br /&gt;
       * @return the set of tiles.&lt;br /&gt;
       */&lt;br /&gt;
      public Set&amp;lt;String&amp;gt; getItems() {&lt;br /&gt;
         return items.keySet();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns if the sub-menu is open.&lt;br /&gt;
       * &lt;br /&gt;
       * @return if the sub-menu is open.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean isOpen() {&lt;br /&gt;
         return this.open;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Opens the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void open() {&lt;br /&gt;
         this.open = true;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Closes the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void close() {&lt;br /&gt;
         this.open = false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns if the specified MouseEvent is in the sub-menu. The index of&lt;br /&gt;
       * the sub-menu is also passed in to calculate the relative position of&lt;br /&gt;
       * the mouse click.&lt;br /&gt;
       * &lt;br /&gt;
       * @param e&lt;br /&gt;
       *           the mouse event the robot received.&lt;br /&gt;
       * @param menuNumber&lt;br /&gt;
       *           the index of the sub-menu in the draw menu.&lt;br /&gt;
       * @return if the mouse click was in the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean inMenu(MouseEvent e, int menuNumber) {&lt;br /&gt;
         if (this.open) {&lt;br /&gt;
            int menuStartX = startX + DrawMenu.recWidth;&lt;br /&gt;
            int menuStartY = startY + (menuNumber + 1) * recHeight;&lt;br /&gt;
&lt;br /&gt;
            int x = e.getX() - menuStartX;&lt;br /&gt;
            int y = e.getY() - menuStartY;&lt;br /&gt;
            if (x &amp;lt;= this.recWidth &amp;amp;&amp;amp; x &amp;gt;= 0.0D &amp;amp;&amp;amp; y &amp;gt;= 0.0D) {&lt;br /&gt;
               for (int i = 0; i &amp;lt; this.items.keySet().size(); i++) {&lt;br /&gt;
                  if (y &amp;lt;= (i + 1) * recHeight) {&lt;br /&gt;
                     String s = (String) (this.items.keySet().toArray())[i];&lt;br /&gt;
                     this.items.put(s, !this.items.get(s));&lt;br /&gt;
                     return true;&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Draws the sub-menu onto the battlefield. The index of the sub-menu is&lt;br /&gt;
       * also passed in to calculate the absolute position of the sub-menu on&lt;br /&gt;
       * the battlefield.&lt;br /&gt;
       * &lt;br /&gt;
       * @param graphics&lt;br /&gt;
       *           the object that handles the drawing.&lt;br /&gt;
       * @param menuNumber&lt;br /&gt;
       *           the index of the sub-menu in the draw menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void draw(Graphics graphics, int menuNumber) {&lt;br /&gt;
         if (this.open) {&lt;br /&gt;
            this.recWidth = (int) graphics.getFontMetrics().getStringBounds(this.longest, graphics).getWidth() + 20;&lt;br /&gt;
&lt;br /&gt;
            int menuStartX = startX + DrawMenu.recWidth;&lt;br /&gt;
            int menuStartY = startY + (menuNumber + 1) * recHeight;&lt;br /&gt;
&lt;br /&gt;
            int i = 0;&lt;br /&gt;
            for (String key : this.items.keySet()) {&lt;br /&gt;
               graphics.setColor(this.items.get(key) ? ITEM_ON : ITEM_OFF);&lt;br /&gt;
               graphics.drawRect(menuStartX, menuStartY + i * recHeight, this.recWidth - 1, recHeight - 1);&lt;br /&gt;
               graphics.drawString(key, menuStartX + stringX, menuStartY + stringY + i * recHeight);&lt;br /&gt;
               i++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(13)&amp;diff=24889</id>
		<title>Thread:User talk:KID/Rumble Server/reply (13)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(13)&amp;diff=24889"/>
		<updated>2012-06-12T13:59:35Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These aren't actually &amp;quot;my&amp;quot; machines... I have two servers at work that I'm not using for anything useful so I thought I would help out a little. Now that I have two servers running 6 instances each I'm trying to be the top contributor in each area of the rumble. Silly goal, I know, but it makes me happy. :-)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(9)&amp;diff=24791</id>
		<title>Thread:User talk:KID/Rumble Server/reply (9)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(9)&amp;diff=24791"/>
		<updated>2012-06-08T18:46:32Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I increased the CPU constant from about 7M to 9M and am running 6 instances. Really turning out the results now!&lt;br /&gt;
&lt;br /&gt;
Now I just need to start programming a robot again...&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(7)&amp;diff=24783</id>
		<title>Thread:User talk:KID/Rumble Server/reply (7)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(7)&amp;diff=24783"/>
		<updated>2012-06-08T14:03:31Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was watching the CPU usage last night and I saw spikes as high as 70% but it averaged around 30-40%. I'll have to double the CPU constant and run 6 and see what happens.&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Rinzler&amp;diff=24774</id>
		<title>Rinzler</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Rinzler&amp;diff=24774"/>
		<updated>2012-06-08T02:54:40Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Bot name reservation. :-)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bot name reserved by [[KID]]. Hah, hah. :-)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=24773</id>
		<title>User:Bnorm</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=24773"/>
		<updated>2012-06-08T02:51:33Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: /* My Robots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Who I Am ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;del&amp;gt;I am a now 19 year old PSEO collage student who sends all his free time on his laptop programing robots.&amp;lt;/del&amp;gt; I have no time anymore...&lt;br /&gt;
&lt;br /&gt;
I was introduced to Robocode sometime in February of '04 when my father sent me a link to download it. Well, I played with it for about two months and then got bored after being to confused, it being my first programing experience and all. I returned to it in April of '05 for reasons that I have since forgotten, but the addiction hasn't left since then. Which is a shame... because sometimes I really should be doing my homework...&lt;br /&gt;
&lt;br /&gt;
If you want to talk Robocode through other means then this wiki, my gtalk account is: robotikdude gmail com &lt;br /&gt;
&lt;br /&gt;
== My Robots ==&lt;br /&gt;
&lt;br /&gt;
* '''[[Gladiator]]''' - My first and only competitive robot.&lt;br /&gt;
* '''[[NightFox]]''' - A test robot.&lt;br /&gt;
* '''[[Toa]]''' - A pre [[Gladiator]] remake robot.&lt;br /&gt;
* '''[[Rinzler]]''' - I'm reserving the name for a future bot. Maybe a [[Tron]] tribute/killer.&lt;br /&gt;
&lt;br /&gt;
== My Teams ==&lt;br /&gt;
&lt;br /&gt;
* '''[[DeltaSquad]]''' - A four robot team.&lt;br /&gt;
* '''[[OmegaSquad]]''' - A pre [[DeltaSquad]] remake team.&lt;br /&gt;
&lt;br /&gt;
== Free Code ==&lt;br /&gt;
&lt;br /&gt;
* '''[[User:KID/DrawMenu]]''' - A graphical debugging tool.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bot Authors|KID]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(4)&amp;diff=24772</id>
		<title>Thread:User talk:KID/Rumble Server/reply (4)</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server/reply_(4)&amp;diff=24772"/>
		<updated>2012-06-08T02:49:09Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Reply to Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I think I just needed to have the robot directory rebuilt. When I deleted the directory and grabbed the latest bot archive it started working again.&lt;br /&gt;
&lt;br /&gt;
So I have three instances running on the server (rinzler) and one running on my personal computer (tron). I should be looking at actual cores and not threads, right? Because the Xeon in the server has 4 cores but 8 threads. And the Xeon in my personal computer has 4 cores and 4 threads. Three instances each?&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server&amp;diff=24763</id>
		<title>Thread:User talk:KID/Rumble Server</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server&amp;diff=24763"/>
		<updated>2012-06-07T22:55:20Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;So I've just started running the rumble on the server that I have available to me. It has an Intel Xeon X3740 which really cranks out the results. I've seen some discussion on running multiple instances of the rumble, one for each core, and was wondering if there was anything special you had to do. I know you have to copy the directory for each instance but is that it? I'm going to run just one instance for the time being until I get some feedback out how to do this.&lt;br /&gt;
&lt;br /&gt;
I'm also getting a lot of could not load robot errors. Is this because I am running Java 7?&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server&amp;diff=24762</id>
		<title>Thread:User talk:KID/Rumble Server</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Thread:User_talk:KID/Rumble_Server&amp;diff=24762"/>
		<updated>2012-06-07T22:55:00Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: New thread: Rumble Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;So I've just started running the rumble on the server that I have available to me. It has an Intel Xeon X3740 which really cranks out the results. I've seen some discussion on running multiple instances of the rumble, one for each core, and was wondering if there was anything special you had to do. I know you have to copy the directory for each instance but is that it? I'm going to run just one instance for the time being until I get some feedback out how to do this.&lt;br /&gt;
&lt;br /&gt;
I'm also getting a lot of could not load robot errors. Is this because I am running Java 7?&lt;br /&gt;
&lt;br /&gt;
--[[User:KID|KID]] 22:55, 7 June 2012 (UTC)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=23309</id>
		<title>DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=23309"/>
		<updated>2012-01-16T21:13:56Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating link to Robocode version, not Virtual Combat version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Delta_squad.jpg&lt;br /&gt;
| caption         = The Delta Squad&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[TeamRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| best_rating     = Team: 1553.89 (16th)&lt;br /&gt;
| current_version = .1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/brian-norman/robocode/kid.DeltaSquad.DeltaSquad_.1.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Delta Squad - yep, it's from Republic Commando...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://brian-norman.github.com/robocode/delta-squad/index.html&lt;br /&gt;
&lt;br /&gt;
Delta Squad is a four robot team. My goal was to make each robot have a different strategy that lent itself to the team as a whole. While it hasn't quite gotten that far yet, I'm still working on it. The thing that I really like about this team though is that it does pretty well in the TeamRumble for only have four robots and not five.  &lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
It's on the back burner..&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Delta Squad is competing in [http://itbhu.ac.in/codefest/event.php?name=virtual%20combat Virtual Combat] after I hacked together some object detection/avoidance and flag seeking. It's also, currently, doing quite well.&lt;br /&gt;
&lt;br /&gt;
[[Category:Teams|DeltaSquad]]&lt;br /&gt;
[[Category:Open Source Bots|DeletaSquad]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=23238</id>
		<title>DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=23238"/>
		<updated>2012-01-02T21:12:42Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating links to my bots.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Delta_squad.jpg&lt;br /&gt;
| caption         = The Delta Squad&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[TeamRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| best_rating     = Team: 1553.89 (16th)&lt;br /&gt;
| current_version = .1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/brian-norman/robocode/deltasquad.Deltasquad_0.2.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Delta Squad - yep, it's from Republic Commando...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://brian-norman.github.com/robocode/delta-squad/index.html&lt;br /&gt;
&lt;br /&gt;
Delta Squad is a four robot team. My goal was to make each robot have a different strategy that lent itself to the team as a whole. While it hasn't quite gotten that far yet, I'm still working on it. The thing that I really like about this team though is that it does pretty well in the TeamRumble for only have four robots and not five.  &lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
It's on the back burner..&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Delta Squad is competing in [http://itbhu.ac.in/codefest/event.php?name=virtual%20combat Virtual Combat] after I hacked together some object detection/avoidance and flag seeking. It's also, currently, doing quite well.&lt;br /&gt;
&lt;br /&gt;
[[Category:Teams|DeltaSquad]]&lt;br /&gt;
[[Category:Open Source Bots|DeletaSquad]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Toa&amp;diff=23237</id>
		<title>Toa</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Toa&amp;diff=23237"/>
		<updated>2012-01-02T21:07:51Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating links to my bots.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Toa.jpg&lt;br /&gt;
| caption         = Toa&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
| movement        = [[Perpendicular movement|Perpendicular]]&lt;br /&gt;
| released        = February 26th, 2008&lt;br /&gt;
| current_version = .0.1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/brian-norman/robocode/kid.Toa_.0.5.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Toa&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://brian-norman.github.com/robocode/toa/html.html&lt;br /&gt;
&lt;br /&gt;
Toa is what came about now that I am recreating [[Gladiator]]. I didn't feel like decreasing [[Gladiator]]'s score any, so I just released a new robot. I do plan to update this robot until it surpasses [[Gladiator]]. It will then be put on the shelf.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Oh all sorts of stuff. [[Wave Surfing]]... [[GuessFactor Targeting (traditional) | GuessFactor Targeting]]... [[Pattern Matching]]... the list goes on.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Toa]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Toa]]&lt;br /&gt;
[[Category:Melee Bots|Toa]]&lt;br /&gt;
[[Category:Open Source Bots|Toa]]&lt;br /&gt;
[[Category:MegaBots|Toa]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Gladiator&amp;diff=23236</id>
		<title>Gladiator</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Gladiator&amp;diff=23236"/>
		<updated>2012-01-02T20:45:57Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating links to my bots.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Gladiator.jpg&lt;br /&gt;
| caption         = Gladiator&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[AdvancedRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
:[[TidalWave Targeting]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| released        = July 7th, 2005&lt;br /&gt;
| best_rating     = 1v1: 1873.02 (44th) &amp;lt;br/&amp;gt; Melee: 1710.39 (6th)&lt;br /&gt;
| current_version = .7.2&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://github.com/downloads/brian-norman/robocode/kid.Gladiator_.7.2.jar&lt;br /&gt;
}}&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Gladiator - yes, I got the name off the movie...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: http://brian-norman.github.com/robocode/gladiator/index.html&lt;br /&gt;
&lt;br /&gt;
Gladiator is programed in a very structured way. While some of it is ''very'' unstructured way, I did try to code it to the best of my abilities and keep it very maintainable. Gladiator is very much a plug-and-play robot, with classes such as &amp;quot;Targeting&amp;quot;, &amp;quot;Movement&amp;quot; and classes that extend those base classes. This created a very flexible and testable robot which is easy to maintain and upgrade with [[Virtual Guns]] and other things.&lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
Currently, Gladiator is going under a massive overhaul. If you want to know just how massive it truly is, just take a look at the source code. In this effort, everything is being redone and nothing will be overlooked. This as been going on over the summer and continues into the fall and winter. I doubt there will be another version of Gladiator for sometime.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bots|Gladiator]]&lt;br /&gt;
[[Category:1-vs-1 Bots|Gladiator]]&lt;br /&gt;
[[Category:Melee Bots|Gladiator]]&lt;br /&gt;
[[Category:Open Source Bots|Gladiator]]&lt;br /&gt;
[[Category:MegaBots|Gladiator]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm/DrawMenu&amp;diff=23040</id>
		<title>User:Bnorm/DrawMenu</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm/DrawMenu&amp;diff=23040"/>
		<updated>2011-11-30T22:59:18Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating the comments on the code.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DrawMenu ==&lt;br /&gt;
&lt;br /&gt;
So a while ago I got really bored and decided to control all of my debugging graphics a little better. The result? A little menu that allows you to select which graphics to show. It's probably a little hard to read but I thought I would at least share it with you guys in case somebody wanted something like this but didn't have the time to create it. Rewrite, reuse, abuse, I don't care, just make sure you enjoy it. :-)&lt;br /&gt;
&lt;br /&gt;
Oh, but if you make any major improvements to it, be sure to let me know so I can update my copy.&lt;br /&gt;
&lt;br /&gt;
For the most resent copy of [https://github.com/brian-norman/robocode/blob/master/kid/src/kid/draw/DrawMenu.java this code] checkout my project on [https://github.com/brian-norman/robocode GitHub].&lt;br /&gt;
&lt;br /&gt;
--[[User:KID|KID]] 21:11, 14 February 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Use ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// Wherever you do graphical debugging&lt;br /&gt;
if (DrawMenu.getValue(&amp;quot;Menu&amp;quot;, &amp;quot;Item&amp;quot;)) {&lt;br /&gt;
   ...&lt;br /&gt;
   // Do your graphical debugging stuff&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// All of these go in your advanced robot class of course&lt;br /&gt;
public void run() {&lt;br /&gt;
   DrawMenu.load(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onMouseEvent(MouseEvent e) {&lt;br /&gt;
   DrawMenu.inMouseEvent(e);&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onPaint(Graphics2D g) {&lt;br /&gt;
   DrawMenu.draw(g);&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onDeath(DeathEvent event) {&lt;br /&gt;
   ...&lt;br /&gt;
   DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onWin(WinEvent event) {&lt;br /&gt;
   ...&lt;br /&gt;
   DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
&lt;br /&gt;
import robocode.RobocodeFileWriter;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A utility class that provides the coder with the ability to add a draw menu&lt;br /&gt;
 * to the lower left of the battlefield. This menu is a boolean menu that&lt;br /&gt;
 * dynamically creates elements as the user requests them. When deciding to draw&lt;br /&gt;
 * something the user should check to see if the draw menu item has been&lt;br /&gt;
 * enabled. This functionality provides a quick and clean way for the user to&lt;br /&gt;
 * dynamically control what a robot draws to the screen.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Brian Norman (KID)&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class DrawMenu {&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The x-coordinate for the starting location of the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   startX        = 0;&lt;br /&gt;
   /**&lt;br /&gt;
    * The y-coordinate for the starting location of the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   startY        = 1;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The width of the start menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   baseRecWidth  = 71;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The height of the start menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   baseRecHeight = 13;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The width of the sub-menus in the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   recWidth      = 71;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The height of the sub-menus in the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   recHeight     = 13;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The relative x-coordinate for the starting location of the sub-menus. This&lt;br /&gt;
    * is relative to the lower right point of the title item.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   stringX       = 2;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The relative y-coordinate for the starting location of the sub-menus. This&lt;br /&gt;
    * is relative to the lower right point of the title item.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   stringY       = 2;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The border color of a sub-menu that is open.&lt;br /&gt;
    */&lt;br /&gt;
   private static Color                 colorOpen     = Color.CYAN;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The border color of a sub-menu that is closed.&lt;br /&gt;
    */&lt;br /&gt;
   private static Color                 colorClosed   = Color.RED;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * If the whole menu is currently open.&lt;br /&gt;
    */&lt;br /&gt;
   private static boolean               open          = false;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The HashMap of sub-menus keyed by their titles.&lt;br /&gt;
    */&lt;br /&gt;
   private static HashMap&amp;lt;String, Menu&amp;gt; menus         = new HashMap&amp;lt;String, Menu&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The title of the menu item with the longest character length.&lt;br /&gt;
    */&lt;br /&gt;
   private static String                longest       = &amp;quot;Draw Menu&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Returns the menu item value of the specified item in the specified menu.&lt;br /&gt;
    * If the the item does not exist it is created with a starting value of&lt;br /&gt;
    * &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. See {@link #getValue(String, String, boolean)} for a&lt;br /&gt;
    * usage example.&lt;br /&gt;
    * &lt;br /&gt;
    * @param item&lt;br /&gt;
    *           the title of the item&lt;br /&gt;
    * @param menu&lt;br /&gt;
    *           the title of the sub-menu.&lt;br /&gt;
    * @return the current value of the item.&lt;br /&gt;
    * @see #getValue(String, String, boolean)&lt;br /&gt;
    */&lt;br /&gt;
   public static boolean getValue(String item, String menu) {&lt;br /&gt;
      return getValue(item, menu, false);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Returns the item value of the specified item in the specified sub-menu. If&lt;br /&gt;
    * the the item does not exist it is created with the specified default&lt;br /&gt;
    * value. An example for use can be seen bellow.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // Where ever you do graphical debugging&lt;br /&gt;
    * if (DrawMenu.getValue(&amp;quot;Menu&amp;quot;, &amp;quot;Item&amp;quot;, true)) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    // graphical debugging stuff&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param item&lt;br /&gt;
    *           the title of the item&lt;br /&gt;
    * @param menu&lt;br /&gt;
    *           the title of the sub-menu.&lt;br /&gt;
    * @param def&lt;br /&gt;
    *           the default value for the item.&lt;br /&gt;
    * @return the current value of the item.&lt;br /&gt;
    */&lt;br /&gt;
   public static boolean getValue(String item, String menu, boolean def) {&lt;br /&gt;
      Menu m = menus.get(menu);&lt;br /&gt;
      if (m == null) {&lt;br /&gt;
         menus.put(menu, m = new Menu());&lt;br /&gt;
         longest = (longest.length() &amp;gt; item.length() ? longest : item);&lt;br /&gt;
      }&lt;br /&gt;
      return m.getValue(item, def);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Loads the specified configuration from the robot's directory that has&lt;br /&gt;
    * specified values for menu items. See the sample code bellow for an&lt;br /&gt;
    * example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * public void run() {&lt;br /&gt;
    *    DrawMenu.load(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    // The rest of your run() code&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param file&lt;br /&gt;
    *           the file to load.&lt;br /&gt;
    */&lt;br /&gt;
   public static void load(File file) {&lt;br /&gt;
      try {&lt;br /&gt;
         BufferedReader in = new BufferedReader(new FileReader(file));&lt;br /&gt;
         String line;&lt;br /&gt;
         while ((line = in.readLine()) != null) {&lt;br /&gt;
            String[] split = line.split(&amp;quot;\\s*,\\s*&amp;quot;);&lt;br /&gt;
            if (split.length &amp;gt; 2) {&lt;br /&gt;
               DrawMenu.getValue(split[0], split[1], Boolean.parseBoolean(split[2]));&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         in.close();&lt;br /&gt;
         System.out.println(&amp;quot;DrawMenu loaded from &amp;quot; + file.getName());&lt;br /&gt;
      } catch (IOException e) {&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Saves the configuration to the specified file in the robot's directory.&lt;br /&gt;
    * See the sample code bellow for an example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onDeath(DeathEvent event) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    * }&lt;br /&gt;
    * &lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onWin(WinEvent event) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    * }&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param file&lt;br /&gt;
    *           the file to save to.&lt;br /&gt;
    */&lt;br /&gt;
   public static void save(File file) {&lt;br /&gt;
      try {&lt;br /&gt;
         PrintWriter out = new PrintWriter(new RobocodeFileWriter(file));&lt;br /&gt;
         for (String s : menus.keySet()) {&lt;br /&gt;
            Menu m = menus.get(s);&lt;br /&gt;
            Set&amp;lt;String&amp;gt; items = m.getItems();&lt;br /&gt;
            for (String i : items)&lt;br /&gt;
               out.println(s + &amp;quot;,&amp;quot; + i + &amp;quot;,&amp;quot; + m.getValue(i, false));&lt;br /&gt;
         }&lt;br /&gt;
         out.close();&lt;br /&gt;
         System.out.println(&amp;quot;DrawMenu saved to &amp;quot; + file.getName());&lt;br /&gt;
      } catch (IOException e) {&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Processes a MouseEvent by checking for clicked events in the area of the&lt;br /&gt;
    * menu. This method should be called every time the robot receives a mouse&lt;br /&gt;
    * event. See the sample code bellow for an example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onMouseEvent(MouseEvent e) {&lt;br /&gt;
    *    DrawMenu.inMouseEvent(e);&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param e&lt;br /&gt;
    *           the mouse event to precess.&lt;br /&gt;
    */&lt;br /&gt;
   public static void inMouseEvent(MouseEvent e) {&lt;br /&gt;
      if (e.getID() == MouseEvent.MOUSE_CLICKED) {&lt;br /&gt;
         if (open) {&lt;br /&gt;
            boolean found = false;&lt;br /&gt;
&lt;br /&gt;
            // finds item&lt;br /&gt;
            Iterator&amp;lt;Menu&amp;gt; iter = menus.values().iterator();&lt;br /&gt;
            for (int i = 0; iter.hasNext() &amp;amp;&amp;amp; !found; i++) {&lt;br /&gt;
               found = iter.next().inMenu(e, i);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!found) {&lt;br /&gt;
               double x = e.getX() - startX;&lt;br /&gt;
               double y = e.getY() - startY;&lt;br /&gt;
               if (x &amp;lt;= recWidth &amp;amp;&amp;amp; x &amp;gt;= 0.0D &amp;amp;&amp;amp; y &amp;gt;= recHeight) {&lt;br /&gt;
                  iter = menus.values().iterator();&lt;br /&gt;
                  for (int i = 0; iter.hasNext() &amp;amp;&amp;amp; !found; i++) {&lt;br /&gt;
                     Menu menu = iter.next();&lt;br /&gt;
                     if (y &amp;lt;= (i + 2) * recHeight) {&lt;br /&gt;
                        if (menu.isOpen()) {&lt;br /&gt;
                           menu.close();&lt;br /&gt;
                        } else {&lt;br /&gt;
                           for (Menu m : menus.values())&lt;br /&gt;
                              m.close();&lt;br /&gt;
                           menu.open();&lt;br /&gt;
                        }&lt;br /&gt;
                        found = true;&lt;br /&gt;
                     }&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
&lt;br /&gt;
               if (!found) {&lt;br /&gt;
                  open = false;&lt;br /&gt;
                  for (Menu m : menus.values())&lt;br /&gt;
                     m.close();&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         } else {&lt;br /&gt;
            double x = e.getX() - startX;&lt;br /&gt;
            double y = e.getY() - startY;&lt;br /&gt;
            if (x &amp;lt;= baseRecWidth &amp;amp;&amp;amp; y &amp;lt;= baseRecHeight &amp;amp;&amp;amp; y &amp;gt;= 0.0D &amp;amp;&amp;amp; x &amp;gt;= 0.0D)&lt;br /&gt;
               open = true;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Draws the menu onto the battlefield. This method should be called every&lt;br /&gt;
    * time the robot draws to the battlefield. See the sample bellow for an&lt;br /&gt;
    * example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // As an advanced robot override&lt;br /&gt;
    * public void onPaint(Graphics2D g) {&lt;br /&gt;
    *    DrawMenu.draw(g);&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param graphics&lt;br /&gt;
    *           the object that handles the drawing.&lt;br /&gt;
    */&lt;br /&gt;
   public static void draw(Graphics graphics) {&lt;br /&gt;
      Color c = graphics.getColor();&lt;br /&gt;
&lt;br /&gt;
      baseRecWidth = (int) graphics.getFontMetrics().getStringBounds(&amp;quot;Draw Menu&amp;quot;, graphics).getWidth() + 20;&lt;br /&gt;
      baseRecHeight = (int) graphics.getFontMetrics().getStringBounds(longest, graphics).getHeight() + 2;&lt;br /&gt;
&lt;br /&gt;
      if (open) {&lt;br /&gt;
         recWidth = (int) graphics.getFontMetrics().getStringBounds(longest, graphics).getWidth();&lt;br /&gt;
         recHeight = baseRecHeight;&lt;br /&gt;
&lt;br /&gt;
         int i = 0;&lt;br /&gt;
         for (String key : menus.keySet()) {&lt;br /&gt;
            Menu menu = menus.get(key);&lt;br /&gt;
            graphics.setColor(menu.isOpen() ? colorOpen : colorClosed);&lt;br /&gt;
            graphics.drawRect(startX, startY + (i + 1) * recHeight, recWidth - 1, recHeight - 1);&lt;br /&gt;
            graphics.drawString(key, startX + stringX, startY + stringY + (i + 1) * recHeight);&lt;br /&gt;
            menu.draw(graphics, i);&lt;br /&gt;
            i++;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      graphics.setColor(open ? colorOpen : colorClosed);&lt;br /&gt;
      graphics.drawRect(startX, startY, baseRecWidth - 1, baseRecHeight - 1);&lt;br /&gt;
      graphics.drawString(&amp;quot;Draw Menu&amp;quot;, startX + stringX, startY + stringY);&lt;br /&gt;
&lt;br /&gt;
      graphics.setColor(c);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * An inner-class representing the sub-menus in the draw menu. Each menu has&lt;br /&gt;
    * its own list of items that store the values.&lt;br /&gt;
    * &lt;br /&gt;
    * @author Brian Norman (KID)&lt;br /&gt;
    * @version 1.0&lt;br /&gt;
    */&lt;br /&gt;
   private static class Menu {&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The border color of an item that is selected.&lt;br /&gt;
       */&lt;br /&gt;
      public static final Color        ITEM_ON  = Color.GREEN;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The border color of an item that is not selected.&lt;br /&gt;
       */&lt;br /&gt;
      public static final Color        ITEM_OFF = Color.RED;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * If the sub-menu is currently open.&lt;br /&gt;
       */&lt;br /&gt;
      private boolean                  open     = false;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * A HashMap of item values keyed by the title of the item.&lt;br /&gt;
       */&lt;br /&gt;
      private HashMap&amp;lt;String, Boolean&amp;gt; items    = new HashMap&amp;lt;String, Boolean&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The title of the item in the sub-menu with the longest character&lt;br /&gt;
       * length.&lt;br /&gt;
       */&lt;br /&gt;
      private String                   longest  = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The width of the items in the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      private int                      recWidth = 71;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns the item value of the specified item in the sub-menu. If the&lt;br /&gt;
       * the item does not exist it is created with the specified default value.&lt;br /&gt;
       * &lt;br /&gt;
       * @param item&lt;br /&gt;
       *           the title of the item&lt;br /&gt;
       * @param def&lt;br /&gt;
       *           the default value for the item.&lt;br /&gt;
       * @return the current value of the item.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean getValue(String item, boolean def) {&lt;br /&gt;
         Boolean value = this.items.get(item);&lt;br /&gt;
         if (value == null) {&lt;br /&gt;
            this.items.put(item, value = def);&lt;br /&gt;
            this.longest = (this.longest.length() &amp;gt; item.length() ? this.longest : item);&lt;br /&gt;
         }&lt;br /&gt;
         return value;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns the set of titles for the items in the sub-menu.&lt;br /&gt;
       * &lt;br /&gt;
       * @return the set of tiles.&lt;br /&gt;
       */&lt;br /&gt;
      public Set&amp;lt;String&amp;gt; getItems() {&lt;br /&gt;
         return items.keySet();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns if the sub-menu is open.&lt;br /&gt;
       * &lt;br /&gt;
       * @return if the sub-menu is open.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean isOpen() {&lt;br /&gt;
         return this.open;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Opens the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void open() {&lt;br /&gt;
         this.open = true;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Closes the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void close() {&lt;br /&gt;
         this.open = false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns if the specified MouseEvent is in the sub-menu. The index of&lt;br /&gt;
       * the sub-menu is also passed in to calculate the relative position of&lt;br /&gt;
       * the mouse click.&lt;br /&gt;
       * &lt;br /&gt;
       * @param e&lt;br /&gt;
       *           the mouse event the robot received.&lt;br /&gt;
       * @param menuNumber&lt;br /&gt;
       *           the index of the sub-menu in the draw menu.&lt;br /&gt;
       * @return if the mouse click was in the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean inMenu(MouseEvent e, int menuNumber) {&lt;br /&gt;
         if (this.open) {&lt;br /&gt;
            int menuStartX = startX + DrawMenu.recWidth;&lt;br /&gt;
            int menuStartY = startY + (menuNumber + 1) * recHeight;&lt;br /&gt;
&lt;br /&gt;
            int x = e.getX() - menuStartX;&lt;br /&gt;
            int y = e.getY() - menuStartY;&lt;br /&gt;
            if (x &amp;lt;= this.recWidth &amp;amp;&amp;amp; x &amp;gt;= 0.0D &amp;amp;&amp;amp; y &amp;gt;= 0.0D) {&lt;br /&gt;
               for (int i = 0; i &amp;lt; this.items.keySet().size(); i++) {&lt;br /&gt;
                  if (y &amp;lt;= (i + 1) * recHeight) {&lt;br /&gt;
                     String s = (String) (this.items.keySet().toArray())[i];&lt;br /&gt;
                     this.items.put(s, !this.items.get(s));&lt;br /&gt;
                     return true;&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Draws the sub-menu onto the battlefield. The index of the sub-menu is&lt;br /&gt;
       * also passed in to calculate the absolute position of the sub-menu on&lt;br /&gt;
       * the battlefield.&lt;br /&gt;
       * &lt;br /&gt;
       * @param graphics&lt;br /&gt;
       *           the object that handles the drawing.&lt;br /&gt;
       * @param menuNumber&lt;br /&gt;
       *           the index of the sub-menu in the draw menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void draw(Graphics graphics, int menuNumber) {&lt;br /&gt;
         if (this.open) {&lt;br /&gt;
            this.recWidth = (int) graphics.getFontMetrics().getStringBounds(this.longest, graphics).getWidth() + 20;&lt;br /&gt;
&lt;br /&gt;
            int menuStartX = startX + DrawMenu.recWidth;&lt;br /&gt;
            int menuStartY = startY + (menuNumber + 1) * recHeight;&lt;br /&gt;
&lt;br /&gt;
            int i = 0;&lt;br /&gt;
            for (String key : this.items.keySet()) {&lt;br /&gt;
               graphics.setColor(this.items.get(key) ? ITEM_ON : ITEM_OFF);&lt;br /&gt;
               graphics.drawRect(menuStartX, menuStartY + i * recHeight, this.recWidth - 1, recHeight - 1);&lt;br /&gt;
               graphics.drawString(key, menuStartX + stringX, menuStartY + stringY + i * recHeight);&lt;br /&gt;
               i++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm/DrawMenu&amp;diff=23039</id>
		<title>User:Bnorm/DrawMenu</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm/DrawMenu&amp;diff=23039"/>
		<updated>2011-11-30T22:46:32Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Updating code with load(), save() and comments. Also updated the usage examples.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DrawMenu ==&lt;br /&gt;
&lt;br /&gt;
So a while ago I got really bored and decided to control all of my debugging graphics a little better. The result? A little menu that allows you to select which graphics to show. It's not commented at all and probably a little hard to read but I thought I would at least share it with you guys in case somebody wanted something like this but didn't have the time to create it. Rewrite, reuse, abuse, I don't care, just make sure you enjoy it. :-)&lt;br /&gt;
&lt;br /&gt;
Oh, but if you make any major improvements to it, be sure to let me know.&lt;br /&gt;
&lt;br /&gt;
--[[User:KID|KID]] 21:11, 14 February 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Use ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// Wherever you do graphical debugging&lt;br /&gt;
if (DrawMenu.getValue(&amp;quot;Menu&amp;quot;, &amp;quot;Item&amp;quot;)) {&lt;br /&gt;
   ...&lt;br /&gt;
   // Do your graphical debugging stuff&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// All of these go in your advanced robot class of course&lt;br /&gt;
public void run() {&lt;br /&gt;
   DrawMenu.load(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onMouseEvent(MouseEvent e) {&lt;br /&gt;
   DrawMenu.inMouseEvent(e);&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onPaint(Graphics2D g) {&lt;br /&gt;
   DrawMenu.draw(g);&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onDeath(DeathEvent event) {&lt;br /&gt;
   ...&lt;br /&gt;
   DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void onWin(WinEvent event) {&lt;br /&gt;
   ...&lt;br /&gt;
   DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
&lt;br /&gt;
import robocode.RobocodeFileWriter;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A utility class that provides the coder with the ability to add a draw menu&lt;br /&gt;
 * to the lower left of the battlefield. This menu is a boolean menu that&lt;br /&gt;
 * dynamically creates elements as the user requests them. When deciding to draw&lt;br /&gt;
 * something the user should check to see if the draw menu item has been&lt;br /&gt;
 * enabled. This functionality provides a quick and clean way for the user to&lt;br /&gt;
 * dynamically control what a robot draws to the screen.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Brian Norman (KID)&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class DrawMenu {&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The x-coordinate for the starting location of the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   startX        = 0;&lt;br /&gt;
   /**&lt;br /&gt;
    * The y-coordinate for the starting location of the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   startY        = 1;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The width of the start menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   baseRecWidth  = 71;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The height of the start menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   baseRecHeight = 13;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The width of the sub-menus in the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   recWidth      = 71;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The height of the sub-menus in the menu.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   recHeight     = 13;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The relative x-coordinate for the starting location of the sub-menus. This&lt;br /&gt;
    * is relative to the lower right point of the title item.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   stringX       = 2;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The relative y-coordinate for the starting location of the sub-menus. This&lt;br /&gt;
    * is relative to the lower right point of the title item.&lt;br /&gt;
    */&lt;br /&gt;
   private static int                   stringY       = 2;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The border color of a sub-menu that is open.&lt;br /&gt;
    */&lt;br /&gt;
   private static Color                 colorOpen     = Color.CYAN;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The border color of a sub-menu that is closed.&lt;br /&gt;
    */&lt;br /&gt;
   private static Color                 colorClosed   = Color.RED;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * If the whole menu is currently open.&lt;br /&gt;
    */&lt;br /&gt;
   private static boolean               open          = false;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The HashMap of sub-menus keyed by their titles.&lt;br /&gt;
    */&lt;br /&gt;
   private static HashMap&amp;lt;String, Menu&amp;gt; menus         = new HashMap&amp;lt;String, Menu&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * The title of the menu item with the longest character length.&lt;br /&gt;
    */&lt;br /&gt;
   private static String                longest       = &amp;quot;Draw Menu&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Returns the menu item value of the specified item in the specified menu.&lt;br /&gt;
    * If the the item does not exist it is created with a starting value of&lt;br /&gt;
    * &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. See {@link #getValue(String, String, boolean)} for a&lt;br /&gt;
    * usage example.&lt;br /&gt;
    * &lt;br /&gt;
    * @param item&lt;br /&gt;
    *           the title of the item&lt;br /&gt;
    * @param menu&lt;br /&gt;
    *           the title of the sub-menu.&lt;br /&gt;
    * @return the current value of the item.&lt;br /&gt;
    * @see #getValue(String, String, boolean)&lt;br /&gt;
    */&lt;br /&gt;
   public static boolean getValue(String item, String menu) {&lt;br /&gt;
      return getValue(item, menu, false);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Returns the item value of the specified item in the specified sub-menu. If&lt;br /&gt;
    * the the item does not exist it is created with the specified default&lt;br /&gt;
    * value. An example for use can be seen bellow.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // Where ever you do graphical debugging&lt;br /&gt;
    * if (DrawMenu.getValue(&amp;quot;Menu&amp;quot;, &amp;quot;Item&amp;quot;, true)) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    // graphical debugging stuff&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param item&lt;br /&gt;
    *           the title of the item&lt;br /&gt;
    * @param menu&lt;br /&gt;
    *           the title of the sub-menu.&lt;br /&gt;
    * @param def&lt;br /&gt;
    *           the default value for the item.&lt;br /&gt;
    * @return the current value of the item.&lt;br /&gt;
    */&lt;br /&gt;
   public static boolean getValue(String item, String menu, boolean def) {&lt;br /&gt;
      Menu m = menus.get(menu);&lt;br /&gt;
      if (m == null) {&lt;br /&gt;
         menus.put(menu, m = new Menu());&lt;br /&gt;
         longest = (longest.length() &amp;gt; item.length() ? longest : item);&lt;br /&gt;
      }&lt;br /&gt;
      return m.getValue(item, def);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Loads the specified configuration from the robot's directory that has&lt;br /&gt;
    * specified values for menu items. See the sample code bellow for an&lt;br /&gt;
    * example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * public void run() {&lt;br /&gt;
    *    DrawMenu.load(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    // The rest of your run() code&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param file&lt;br /&gt;
    *           the file to load.&lt;br /&gt;
    */&lt;br /&gt;
   public static void load(File file) {&lt;br /&gt;
      try {&lt;br /&gt;
         BufferedReader in = new BufferedReader(new FileReader(file));&lt;br /&gt;
         String line;&lt;br /&gt;
         while ((line = in.readLine()) != null) {&lt;br /&gt;
            String[] split = line.split(&amp;quot;\\s*,\\s*&amp;quot;);&lt;br /&gt;
            if (split.length &amp;gt; 2) {&lt;br /&gt;
               DrawMenu.getValue(split[0], split[1], Boolean.parseBoolean(split[2]));&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         in.close();&lt;br /&gt;
         System.out.println(&amp;quot;DrawMenu loaded from &amp;quot; + file.getName());&lt;br /&gt;
      } catch (IOException e) {&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Saves the configuration to the specified file in the robot's directory.&lt;br /&gt;
    * See the sample code bellow for an example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onDeath(DeathEvent event) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    * }&lt;br /&gt;
    * &lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onWin(WinEvent event) {&lt;br /&gt;
    *    ...&lt;br /&gt;
    *    DrawMenu.save(getDataFile(&amp;quot;menu.draw&amp;quot;));&lt;br /&gt;
    * }&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param file&lt;br /&gt;
    *           the file to save to.&lt;br /&gt;
    */&lt;br /&gt;
   public static void save(File file) {&lt;br /&gt;
      try {&lt;br /&gt;
         PrintWriter out = new PrintWriter(new RobocodeFileWriter(file));&lt;br /&gt;
         for (String s : menus.keySet()) {&lt;br /&gt;
            Menu m = menus.get(s);&lt;br /&gt;
            Set&amp;lt;String&amp;gt; items = m.getItems();&lt;br /&gt;
            for (String i : items)&lt;br /&gt;
               out.println(s + &amp;quot;,&amp;quot; + i + &amp;quot;,&amp;quot; + m.getValue(i, false));&lt;br /&gt;
         }&lt;br /&gt;
         out.close();&lt;br /&gt;
         System.out.println(&amp;quot;DrawMenu saved to &amp;quot; + file.getName());&lt;br /&gt;
      } catch (IOException e) {&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Processes a MouseEvent by checking for clicked events in the area of the&lt;br /&gt;
    * menu. This method should be called every time the robot receives a mouse&lt;br /&gt;
    * event. See the sample code bellow for an example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // As a robot event catcher&lt;br /&gt;
    * public void onMouseEvent(MouseEvent e) {&lt;br /&gt;
    *    DrawMenu.inMouseEvent(e);&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param e&lt;br /&gt;
    *           the mouse event to precess.&lt;br /&gt;
    */&lt;br /&gt;
   public static void inMouseEvent(MouseEvent e) {&lt;br /&gt;
      if (e.getID() == MouseEvent.MOUSE_CLICKED) {&lt;br /&gt;
         if (open) {&lt;br /&gt;
            boolean found = false;&lt;br /&gt;
&lt;br /&gt;
            // finds item&lt;br /&gt;
            Iterator&amp;lt;Menu&amp;gt; iter = menus.values().iterator();&lt;br /&gt;
            for (int i = 0; iter.hasNext() &amp;amp;&amp;amp; !found; i++) {&lt;br /&gt;
               found = iter.next().inMenu(e, i);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!found) {&lt;br /&gt;
               double x = e.getX() - startX;&lt;br /&gt;
               double y = e.getY() - startY;&lt;br /&gt;
               if (x &amp;lt;= recWidth &amp;amp;&amp;amp; x &amp;gt;= 0.0D &amp;amp;&amp;amp; y &amp;gt;= recHeight) {&lt;br /&gt;
                  iter = menus.values().iterator();&lt;br /&gt;
                  for (int i = 0; iter.hasNext() &amp;amp;&amp;amp; !found; i++) {&lt;br /&gt;
                     Menu menu = iter.next();&lt;br /&gt;
                     if (y &amp;lt;= (i + 2) * recHeight) {&lt;br /&gt;
                        if (menu.isOpen()) {&lt;br /&gt;
                           menu.close();&lt;br /&gt;
                        } else {&lt;br /&gt;
                           for (Menu m : menus.values())&lt;br /&gt;
                              m.close();&lt;br /&gt;
                           menu.open();&lt;br /&gt;
                        }&lt;br /&gt;
                        found = true;&lt;br /&gt;
                     }&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
&lt;br /&gt;
               if (!found) {&lt;br /&gt;
                  open = false;&lt;br /&gt;
                  for (Menu m : menus.values())&lt;br /&gt;
                     m.close();&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         } else {&lt;br /&gt;
            double x = e.getX() - startX;&lt;br /&gt;
            double y = e.getY() - startY;&lt;br /&gt;
            if (x &amp;lt;= baseRecWidth &amp;amp;&amp;amp; y &amp;lt;= baseRecHeight &amp;amp;&amp;amp; y &amp;gt;= 0.0D &amp;amp;&amp;amp; x &amp;gt;= 0.0D)&lt;br /&gt;
               open = true;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Draws the menu onto the battlefield. This method should be called every&lt;br /&gt;
    * time the robot draws to the battlefield. See the sample bellow for an&lt;br /&gt;
    * example.&lt;br /&gt;
    * &lt;br /&gt;
    * &amp;lt;pre&amp;gt;&lt;br /&gt;
    * ...&lt;br /&gt;
    * // As an advanced robot override&lt;br /&gt;
    * public void onPaint(Graphics2D g) {&lt;br /&gt;
    *    DrawMenu.draw(g);&lt;br /&gt;
    *    ...&lt;br /&gt;
    * }&lt;br /&gt;
    * ...&lt;br /&gt;
    * &amp;lt;/pre&amp;gt;&lt;br /&gt;
    * &lt;br /&gt;
    * @param graphics&lt;br /&gt;
    *           the object that handles the drawing.&lt;br /&gt;
    */&lt;br /&gt;
   public static void draw(Graphics graphics) {&lt;br /&gt;
      Color c = graphics.getColor();&lt;br /&gt;
&lt;br /&gt;
      baseRecWidth = (int) graphics.getFontMetrics().getStringBounds(&amp;quot;Draw Menu&amp;quot;, graphics).getWidth() + 20;&lt;br /&gt;
      baseRecHeight = (int) graphics.getFontMetrics().getStringBounds(longest, graphics).getHeight() + 2;&lt;br /&gt;
&lt;br /&gt;
      if (open) {&lt;br /&gt;
         recWidth = (int) graphics.getFontMetrics().getStringBounds(longest, graphics).getWidth();&lt;br /&gt;
         recHeight = baseRecHeight;&lt;br /&gt;
&lt;br /&gt;
         int i = 0;&lt;br /&gt;
         for (String key : menus.keySet()) {&lt;br /&gt;
            Menu menu = menus.get(key);&lt;br /&gt;
            graphics.setColor(menu.isOpen() ? colorOpen : colorClosed);&lt;br /&gt;
            graphics.drawRect(startX, startY + (i + 1) * recHeight, recWidth - 1, recHeight - 1);&lt;br /&gt;
            graphics.drawString(key, startX + stringX, startY + stringY + (i + 1) * recHeight);&lt;br /&gt;
            menu.draw(graphics, i);&lt;br /&gt;
            i++;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      graphics.setColor(open ? colorOpen : colorClosed);&lt;br /&gt;
      graphics.drawRect(startX, startY, baseRecWidth - 1, baseRecHeight - 1);&lt;br /&gt;
      graphics.drawString(&amp;quot;Draw Menu&amp;quot;, startX + stringX, startY + stringY);&lt;br /&gt;
&lt;br /&gt;
      graphics.setColor(c);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * An inner-class representing the sub-menus in the draw menu. Each menu has&lt;br /&gt;
    * its own list of items that store the values.&lt;br /&gt;
    * &lt;br /&gt;
    * @author Brian Norman (KID)&lt;br /&gt;
    * @version 1.0&lt;br /&gt;
    */&lt;br /&gt;
   private static class Menu {&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The border color of an item that is selected.&lt;br /&gt;
       */&lt;br /&gt;
      public static final Color        ITEM_ON  = Color.GREEN;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The border color of an item that is not selected.&lt;br /&gt;
       */&lt;br /&gt;
      public static final Color        ITEM_OFF = Color.RED;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * If the sub-menu is currently open.&lt;br /&gt;
       */&lt;br /&gt;
      private boolean                  open     = false;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * A HashMap of item values keyed by the title of the item.&lt;br /&gt;
       */&lt;br /&gt;
      private HashMap&amp;lt;String, Boolean&amp;gt; items    = new HashMap&amp;lt;String, Boolean&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The title of the item in the sub-menu with the longest character&lt;br /&gt;
       * length.&lt;br /&gt;
       */&lt;br /&gt;
      private String                   longest  = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The width of the items in the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      private int                      recWidth = 71;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns the item value of the specified item in the sub-menu. If the&lt;br /&gt;
       * the item does not exist it is created with the specified default value.&lt;br /&gt;
       * &lt;br /&gt;
       * @param item&lt;br /&gt;
       *           the title of the item&lt;br /&gt;
       * @param def&lt;br /&gt;
       *           the default value for the item.&lt;br /&gt;
       * @return the current value of the item.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean getValue(String item, boolean def) {&lt;br /&gt;
         Boolean value = this.items.get(item);&lt;br /&gt;
         if (value == null) {&lt;br /&gt;
            this.items.put(item, value = def);&lt;br /&gt;
            this.longest = (this.longest.length() &amp;gt; item.length() ? this.longest : item);&lt;br /&gt;
         }&lt;br /&gt;
         return value;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns the set of titles for the items in the sub-menu.&lt;br /&gt;
       * &lt;br /&gt;
       * @return the set of tiles.&lt;br /&gt;
       */&lt;br /&gt;
      public Set&amp;lt;String&amp;gt; getItems() {&lt;br /&gt;
         return items.keySet();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns if the sub-menu is open.&lt;br /&gt;
       * &lt;br /&gt;
       * @return if the sub-menu is open.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean isOpen() {&lt;br /&gt;
         return this.open;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Opens the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void open() {&lt;br /&gt;
         this.open = true;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Closes the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void close() {&lt;br /&gt;
         this.open = false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Returns if the specified MouseEvent is in the sub-menu. The index of&lt;br /&gt;
       * the sub-menu is also passed in to calculate the relative position of&lt;br /&gt;
       * the mouse click.&lt;br /&gt;
       * &lt;br /&gt;
       * @param e&lt;br /&gt;
       *           the mouse event the robot received.&lt;br /&gt;
       * @param menuNumber&lt;br /&gt;
       *           the index of the sub-menu in the draw menu.&lt;br /&gt;
       * @return if the mouse click was in the sub-menu.&lt;br /&gt;
       */&lt;br /&gt;
      public boolean inMenu(MouseEvent e, int menuNumber) {&lt;br /&gt;
         if (this.open) {&lt;br /&gt;
            int menuStartX = startX + DrawMenu.recWidth;&lt;br /&gt;
            int menuStartY = startY + (menuNumber + 1) * recHeight;&lt;br /&gt;
&lt;br /&gt;
            int x = e.getX() - menuStartX;&lt;br /&gt;
            int y = e.getY() - menuStartY;&lt;br /&gt;
            if (x &amp;lt;= this.recWidth &amp;amp;&amp;amp; x &amp;gt;= 0.0D &amp;amp;&amp;amp; y &amp;gt;= 0.0D) {&lt;br /&gt;
               for (int i = 0; i &amp;lt; this.items.keySet().size(); i++) {&lt;br /&gt;
                  if (y &amp;lt;= (i + 1) * recHeight) {&lt;br /&gt;
                     String s = (String) (this.items.keySet().toArray())[i];&lt;br /&gt;
                     this.items.put(s, !this.items.get(s));&lt;br /&gt;
                     return true;&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Draws the sub-menu onto the battlefield. The index of the sub-menu is&lt;br /&gt;
       * also passed in to calculate the absolute position of the sub-menu on&lt;br /&gt;
       * the battlefield.&lt;br /&gt;
       * &lt;br /&gt;
       * @param graphics&lt;br /&gt;
       *           the object that handles the drawing.&lt;br /&gt;
       * @param menuNumber&lt;br /&gt;
       *           the index of the sub-menu in the draw menu.&lt;br /&gt;
       */&lt;br /&gt;
      public void draw(Graphics graphics, int menuNumber) {&lt;br /&gt;
         if (this.open) {&lt;br /&gt;
            this.recWidth = (int) graphics.getFontMetrics().getStringBounds(this.longest, graphics).getWidth() + 20;&lt;br /&gt;
&lt;br /&gt;
            int menuStartX = startX + DrawMenu.recWidth;&lt;br /&gt;
            int menuStartY = startY + (menuNumber + 1) * recHeight;&lt;br /&gt;
&lt;br /&gt;
            int i = 0;&lt;br /&gt;
            for (String key : this.items.keySet()) {&lt;br /&gt;
               graphics.setColor(this.items.get(key) ? ITEM_ON : ITEM_OFF);&lt;br /&gt;
               graphics.drawRect(menuStartX, menuStartY + i * recHeight, this.recWidth - 1, recHeight - 1);&lt;br /&gt;
               graphics.drawString(key, menuStartX + stringX, menuStartY + stringY + i * recHeight);&lt;br /&gt;
               i++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User_talk:Zyx&amp;diff=19195</id>
		<title>User talk:Zyx</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User_talk:Zyx&amp;diff=19195"/>
		<updated>2011-04-25T13:33:34Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: /* Codefest Winnings */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox small&lt;br /&gt;
| title     = Archived Talks&lt;br /&gt;
| namespace = User&lt;br /&gt;
| page1     = Talk Archive 20090506&lt;br /&gt;
| title1    = 2009/05/06&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Wiki Help ==&lt;br /&gt;
&lt;br /&gt;
I'm trying to learn how to use the wiki, so probably will be asking more questions. But to start I would like to know how to add those nice ''content tables'' to the pages, I've been going trough the pages that has them and see nothing special in the code :-S. And as a more general second question, is there somewhere I can learn how to write wiki stuff? Particularly this one of course. --[[User:Zyx|zyx]] 01:11, 7 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
[[wikipedia:How_to_edit|Here]] is all about mediawiki syntax. MediaWiki automatically add the TOC once the page have more than 4 headers (inclusive) at before the first header. If you want to add the TOC manually, add &amp;lt;nowiki&amp;gt;__TOC__&amp;lt;/nowiki&amp;gt; to the page (like this page) &amp;amp;raquo; &amp;lt;span style=&amp;quot;font-size:0.9em;color:darkgreen;&amp;quot;&amp;gt;[[User:Nat|Nat]] | [[User_talk:Nat|Talk]]&amp;lt;/span&amp;gt; &amp;amp;raquo; 01:22, 7 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Another useful link I bookmarked recently is [http://meta.wikimedia.org/wiki/Cheatsheet this MediaWiki cheatsheet]. I tend to check [http://mediawiki.org mediawiki.org], or just Google (eg, ''mediawiki namespaces'') when I'm looking for something specific. There's a lot of good info out there because so many people use MediaWiki. But I've learned a lot of what I know from people like Nat and [[User:AaronR|AaronR]] doing stuff on this wiki. =) --[[User:Voidious|Voidious]] 01:30, 7 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Hey, you won't believe me that this is the first wiki (beside the old one) I've working on. I learn the thing from what AaronR and [[User:Nfwu|Nfwu]] used to done actually. &amp;amp;raquo; &amp;lt;span style=&amp;quot;font-size:0.9em;color:darkgreen;&amp;quot;&amp;gt;[[User:Nat|Nat]] | [[User_talk:Nat|Talk]]&amp;lt;/span&amp;gt; &amp;amp;raquo; 01:52, 7 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Thanks guys, I'm too dinosaur-ish for web related stuff. This is the first wiki I've been, and have been moderator of two forums, but there I'm just as dumb as I am here :-P. --[[User:Zyx|zyx]] 01:56, 7 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Handle ==&lt;br /&gt;
&lt;br /&gt;
I always realized that your handle was the last 3 letters in the alphabet, but it only just occurred to me that this is like the opposite of &amp;quot;[[User:ABC|ABC]]&amp;quot;. I'm curious if that is intentional or just coincidence? (To be clear, I mean if it's inspired by ABC the Robocoder or not.) Kind of funny that two of our PL kings have such similar handles. =) --[[User:Voidious|Voidious]] 18:16, 4 August 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: I think it is coincidence, because his email is zyx###@gmail.com (### replace with number, I don't remember which) &amp;amp;raquo; &amp;lt;span style=&amp;quot;font-size:0.9em;color:darkgreen;&amp;quot;&amp;gt;[[User:Nat|Nat]] | [[User_talk:Nat|Talk]]&amp;lt;/span&amp;gt; &amp;amp;raquo; 08:49, 5 August 2009 (UTC)&lt;br /&gt;
: It is a coincidence, I've been using zyx since nintendo times :). --[[User:Zyx|zyx]] 11:56, 5 August 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Melee Testing ==&lt;br /&gt;
How do you guys test melee bots? Not tool-wise, I know [[Voidious]] patched [[RoboResearch]] which I will probably use to test the melee bot as well soon. But I mean battle-wise, I was testing with the top 6 bots from different authors and 2 ''random'' middle bots, the other two spots were taken by two versions of my bots and ran 100 round battles and compare the results of my two bots to decide which one is better. But I knew that testing wasn't suitable, YersiniaPestis 3.0 can beat [[Shadow]], [[Aleph]] a lot of times (~40% of times beats one of them), [[Portia]] every now and then and [[Fermat]] every time under that circumstances, but I knew that in reality battles don't such a high concentration of top bots so results were kind of irrelevant as rumble performance meant. Thanks. --[[User:Zyx|zyx]] 21:03, 19 August 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Well, I struggle with this too, but my attitude is to try to emulate the same mixes of bots that you'll face in the rumble. So you'd want the same range of skill levels, some battles with all weak bots, some with mid-range bots, and some with stronger bots. Right now my test bed is 27 bots, split into 6 groups (with each bot appearing twice), and I'll run ~20 seasons. For many versions of [[Diamond]] in a row, this was accurately predicting a rating increase or not. Then I released a version without much testing, its rumble rating went up, but I ran the test afterward and the score went down. :-/ So I'm still figuring it out myself, really. If you're curious about my test bed, it's here: [http://www.dijitari.com/void/robocode/dibed6.rrc dibed6.rrc]. Good luck, and please let us know if you make any Melee test bed breakthroughs. =) --[[User:Voidious|Voidious]] 21:30, 19 August 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Thanks, I'll check it later. If I do, I will. --[[User:Zyx|zyx]]&lt;br /&gt;
&lt;br /&gt;
== Google Code Jam ==&lt;br /&gt;
I don't know if any of you like programming contests, but I'm actually a devoted contestant of those. Next week the Google Code Jam begins, which is an online contest similar to the ACM-ICPC or TopCoder contests but it has its differences, specially in the format and languages you can use (any language is fine, even BrainF#@k). I'll be participating in it, if anyone is interested in learing more about it go to [http://code.google.com/codejam/ CodeJam 2009]. Hope at least some of you find it interesting so we can meet there. --[[User:Zyx|zyx]] 16:38, 28 August 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Good AI Books ==&lt;br /&gt;
&lt;br /&gt;
Background: Buying books in Venezuela sucks, they are old, translated(I like to read the original author) and expensive.&lt;br /&gt;
&lt;br /&gt;
My mom is currently visiting my brother in the UK, I always buy some books when she is over there since I love reading scientific or technical books. Currently I'm looking to expand my AI books collection since it is rather poor, and I thought maybe some of you could help me find a good choice. I already have ''Artificial Intelligence: A Modern Approach'' of Norvig and Russell, although it's the first edition and in Spanish so I'm considering the second edition in English. But besides that one which good AI books can you recommend? Also I have a couple of NN books so I would be more interested in something either general or specific to other subjects, but if you have a good NN book to recommend I wouldn't mind hearing and reading about it as well. Thanks in advance. --[[User:Zyx|zyx]] 01:16, 7 September 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: I don't have any &amp;quot;general AI&amp;quot; books (could use some recommendations too) but the favourite of the ones I have is &amp;quot;Reinforcement Learning&amp;quot; by Sutton &amp;amp; Barto.  As a bonus, it's actually [http://www.cs.ualberta.ca/~sutton/book/the-book.html available online].  [[Leon]] and early versions of [[Pris]] use concepts from this book.  For NN I have &amp;quot;Fundamentals of Neural Networks&amp;quot; by Fausett, but there are many more practical resources scattered about online.  For example, [http://www.ai-junkie.com/ &amp;quot;ai-junkie] has some great tutorials on NN and genetic algorithms. --[[User:Darkcanuck|Darkcanuck]] 06:42, 7 September 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: I don't know if you find it usefull, but at the university I study at we're using ''Artificial Intelligence, structures and strategies for complex problem solving'' by George F. Luger. It's been pretty general so far (I'm at chapter 4, and it has mostly been about treesearching strategies), and it's also nice to read. I'm wondering if I can incoorperate anything in robots...   --[[User:Positive|Positive]] 17:35, 7 September 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: For an ''Intro to Machine Learning'' class I took in my last semester of CS, one of the books we used was this: [http://www.inference.phy.cam.ac.uk/mackay/itila/ Information Theory, Inference, and Learning Algorithms, by David MacKay]. The physical version of the book is sold normally, but you can download a PDF of the entire book for free as long as you agree not to print it out. I remember it being pretty &amp;quot;dense&amp;quot;, as was the class, but I learned a lot. The only other book I can think of to mention is one that [[User:PEZ|PEZ]] talked about a bit: [http://www.randomhouse.com/features/wisdomofcrowds/ The Wisdom of Crowds, by James Surowiecki]. (PEZ talks about it here: [[oldwiki:CrowdTargeting]].) Good luck - let us know how your search turns out. =) --[[User:Voidious|Voidious]] 17:49, 7 September 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Thanks for all your responses, I won't buy the books recommended by [[Darkcanuck]] (the first one) and [[Voidious]] because I can download them and I have to save every penny, in Venezuela we have exchange control right now and we are only allowed to spend $400 on Internet each year :-S. The NN book, well I have some and as he said ai-junkie is a great place. The book [[Positive]] posted is really inexpensive so I was excited at first, but I read a bit on the Amazon preview and it seems fine but rather basic, I already have 3 undergraduate AI courses and I'm actually looking to do some graduate level studies now.&lt;br /&gt;
&lt;br /&gt;
I will buy the second edition of ''A Modern Approach'' of Norvig and Russell as it seems to be the most recommended book all around the world, to have it as a reference rather than reading it in depth again. And just to please my self I will buy the first 2 books from the ''AI Game Programming Wisdom'' series, they seems to be in the same fashion as the Game Programming Gems series which I found to be amazingly interesting when I first read them. Thanks all, and I hope you get something out it as well. My mom comes back next week, I'll let you know then how good or bad the books end up being. --[[User:Zyx|zyx]] 21:36, 7 September 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: I forgot to mention ''The Wisdom of Crowds'' is not an AI book, the author is a journalist and not a scientific in any way, I already mentioned some of this once [[Nat]] asked a question about it, but is actually more a psychological on how a crowd of people behaves. I think it had very positive feedback from people who read it for fun and very negative feedback from people who wanted it for scientific reasons, I read a bit of it long time ago and didn't find it very interesting but I myself only like scientific reading. --[[User:Zyx|zyx]] 21:43, 7 September 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Google sites got disabled? ==&lt;br /&gt;
&lt;br /&gt;
Just to let you know, it seems your Google sites account recently got disabled &amp;quot;because of a perceived violation of the Terms of Service&amp;quot;. Got all your robots hosted there on the participants lists switched over to the Darkcanuck's mirror. --[[User:Rednaxela|Rednaxela]] 06:11, 30 April 2010 (UTC)&lt;br /&gt;
: Hi, thanks for this. However, I just checked and seems the Google site is working again, I don't use it for anything else than this robots. Hopefully it still works because I want to try doing some robocoding again. --[[User:Zyx|zyx]] 03:31, 15 October 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Codefest Winnings ==&lt;br /&gt;
&lt;br /&gt;
Hey Zyx, have you been contacted by anybody at Codefest about the prize money? I have yet to hear from anyone and am wondering if I'm alone in this situation. --[[User:KID|KID]] 13:33, 25 April 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=RoboRumble/Participants/Teams&amp;diff=18823</id>
		<title>RoboRumble/Participants/Teams</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=RoboRumble/Participants/Teams&amp;diff=18823"/>
		<updated>2011-03-18T05:49:50Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: adding deltasquad back into the mix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{:RoboRumble/Navigation}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Just add your team name ('''as appears in the Robocode selector after packaging, without 'Team:'''', so including version number) and the RobocodeRepository id number separated by &amp;quot;,&amp;quot; (there must be no space after the comma). Please, make sure your bot is not in the list before adding it, and delete the old version if you are adding a new one.&lt;br /&gt;
&lt;br /&gt;
The list is in '''alphabetical''' order. Add your bot in the right slot.&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abc.ShadowTeam 3.83,http://robocode.aclsi.pt/abc.ShadowTeam_3.83.jar&lt;br /&gt;
ags.polylunar.Polylunar 1.6,http://rednaxela-robocode.dyndns.org/data/robots/ags.polylunar.Polylunar_1.6.jar&lt;br /&gt;
amz.TeamDeathTeam 1,2062&lt;br /&gt;
apvteam.MambaTeam 0.7.5,1121&lt;br /&gt;
bugger.BuggerHive 1.0,2831&lt;br /&gt;
bvh.team.Valkiries 1.0,2775&lt;br /&gt;
CharlieN.OmegaTeam.OmegaTeam 1.0,http://darkcanuck.net/rumble/robots/CharlieN.OmegaTeam.OmegaTeam_1.0.jar&lt;br /&gt;
cx.mini.DemoniacNimrods 0.50,1277&lt;br /&gt;
davidalves.PhoenixTeam 0.54, http://davidalves.net/robocode/robots/davidalves.Phoenix_0.54.jar&lt;br /&gt;
dummy_team.BlindFighters 1.01,552&lt;br /&gt;
ethdsy.MalackaTeam 1.2,1160&lt;br /&gt;
florent.XSeries.Xmen 0.9,http://wesley3.free.fr/florent.XSeries.Xmen_0.9.jar&lt;br /&gt;
gh.mini.GrubbmGroup 0.4,2483&lt;br /&gt;
gh.nano.GrofGroup 1.1,2580&lt;br /&gt;
gimp.GimpTeam 0.1,2435&lt;br /&gt;
jab.DiamondStealers 5,http://darkcanuck.net/rumble/robots/jab.DiamondStealers_5.jar&lt;br /&gt;
jab.Enjambre 2,http://rednaxela-robocode.dyndns.org/data/robot_archive/jab.Enjambre_2.jar&lt;br /&gt;
kawigi.micro.ArmyOfShiz 1.1,2522&lt;br /&gt;
kawigi.sbf.TidalWave 0.8,1582&lt;br /&gt;
kid.DeltaSquad.DeltaSquad .1,https://sites.google.com/site/robocodekid/deltasquadfiles/kid.DeltaSquad.DeltaSquad_.1.jar&lt;br /&gt;
kid.team.OmegaSquad .0.2,http://darkcanuck.net/rumble/robots/kid.team.OmegaSquad_.0.2.jar&lt;br /&gt;
Krabb.sliNk.SlartibartfassTeam 0.5,http://darkcanuck.net/rumble/robots/Krabb.sliNk.SlartibartfassTeam_0.5.jar&lt;br /&gt;
mn.CombatTeam 1.0,2352&lt;br /&gt;
ms.AresHaikuTeam 0.3,1750&lt;br /&gt;
mskwik.BumblingIdiots 1.0,2704&lt;br /&gt;
myl.micro.TroodonPack 1.10,1227&lt;br /&gt;
ntc.slippery.Slippery 1.0,3271&lt;br /&gt;
pedersen.ImWithDroidTeam 1.3,http://darkcanuck.net/rumble/robots/pedersen.ImWithDroidTeam_1.3.jar&lt;br /&gt;
pedersen.ImWithStupidTeam 1.3,http://darkcanuck.net/rumble/robots/pedersen.ImWithStupidTeam_1.3.jar&lt;br /&gt;
radnor.RadnorMedSchool 1.0,2149&lt;br /&gt;
rz.AlephTeam 0.34,2013&lt;br /&gt;
rz.GlowingHawks 0.2,1689&lt;br /&gt;
rz.HOFSwarm 1.1,2494&lt;br /&gt;
sgp.DrunkenTeam 1.12,284&lt;br /&gt;
vuen.Bakery 2.51,453&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
'''''No chatting on this page. Use the /ParticipantsChat page for that.'''''&lt;br /&gt;
&lt;br /&gt;
'''Removed due to broken Jar file:'''&lt;br /&gt;
* tripphippy.wonderlandTeam 0.1,http://robocoderepository.com/BotFiles/3724/tripphippy.WonderlandTeam_0.1.jar&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Removed due to WontFix issues in Robocode 1.7+:&lt;br /&gt;
* GarmTeam: ([[http://sourceforge.net/tracker/?func=detail&amp;amp;aid=2845626&amp;amp;group_id=37202&amp;amp;atid=419486 SF #2845626]])&lt;br /&gt;
: Krabb.sliNk.GarmTeam 0.9v,http://designnj.de/roboking/Krabb.sliNk.GarmTeam_0.9v.jar&lt;br /&gt;
* DeltaSquad: ([[http://sourceforge.net/tracker/?func=detail&amp;amp;aid=2976258&amp;amp;group_id=37202&amp;amp;atid=419486 SF #297658]])&lt;br /&gt;
: kid.DeltaSquad.DeltaSquad .1,http://www.citlink.net/~normanp/robocode/team/kid.DeltaSquad.DeltaSquad_.1.jar&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=18822</id>
		<title>DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=DeltaSquad&amp;diff=18822"/>
		<updated>2011-03-18T04:48:57Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: updating deltasquad download link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Robot&lt;br /&gt;
| box_width       = 22em&lt;br /&gt;
| image           = Delta_squad.jpg&lt;br /&gt;
| caption         = The Delta Squad&lt;br /&gt;
| author          = [[User:KID|KID]]&lt;br /&gt;
| extends         = [[TeamRobot]]&lt;br /&gt;
| targeting       = [[Virtual Guns]] :&lt;br /&gt;
:[[Head-On Targeting]]&lt;br /&gt;
:[[Linear Targeting]]&lt;br /&gt;
:[[Circular Targeting]]&lt;br /&gt;
:[[Random Targeting]]&lt;br /&gt;
:[[GuessFactor Targeting (traditional)|GuessFactor Targeting]]&lt;br /&gt;
:[[PatternMatching]]&lt;br /&gt;
:[[PatternMatching|LateralVelocity PM]]&lt;br /&gt;
| movement        = [[WaveSurfing]]&amp;lt;br/&amp;gt;[[MinimumRiskMovement]]&lt;br /&gt;
| best_rating     = Team: 1553.89 (16th)&lt;br /&gt;
| current_version = .1&lt;br /&gt;
| license         = None&lt;br /&gt;
| download_link   = https://sites.google.com/site/robocodekid/deltasquadfiles/kid.DeltaSquad.DeltaSquad_.1.jar&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Creation ==&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: Delta Squad - yep, it's from Republic Commando...&lt;br /&gt;
&lt;br /&gt;
; Author&lt;br /&gt;
: [[User:KID|KID]]&lt;br /&gt;
&lt;br /&gt;
; Webpage&lt;br /&gt;
: https://sites.google.com/site/robocodekid/deltasquad&lt;br /&gt;
&lt;br /&gt;
Delta Squad is a four robot team. My goal was to make each robot have a different strategy that lent itself to the team as a whole. While it hasn't quite gotten that far yet, I'm still working on it. The thing that I really like about this team though is that it does pretty well in the TeamRumble for only have four robots and not five.  &lt;br /&gt;
&lt;br /&gt;
== What's Next? ==&lt;br /&gt;
&lt;br /&gt;
It's on the back burner..&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Delta Squad is competing in [http://itbhu.ac.in/codefest/event.php?name=virtual%20combat Virtual Combat] after I hacked together some object detection/avoidance and flag seeking. It's also, currently, doing quite well.&lt;br /&gt;
&lt;br /&gt;
[[Category:Teams|DeltaSquad]]&lt;br /&gt;
[[Category:Open Source Bots|DeletaSquad]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Talk:DeltaSquad&amp;diff=18793</id>
		<title>Talk:DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Talk:DeltaSquad&amp;diff=18793"/>
		<updated>2011-03-16T04:16:56Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: /* Virtual Combat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problems Running Teams ==&lt;br /&gt;
&lt;br /&gt;
So I've been having some problems running teams in robocode. When I create a team and go to run it I get something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Boss&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Fixer&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Sev&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Scorch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The funny thing is that those robots aren't even located in /home/brian/robocode/robots, they're off in my eclipse workspace. Anyone else have this problem? Know how to fix it? Could it be a bug in robocode? -- [[User:KID|KID]] 14:58, 25 March 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Which robocode version do you use? I know some version of robocode have this bug, but I think it is fixed. ([https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2585615&amp;amp;group_id=37202&amp;amp;atid=419486 bug report]) I it is not, then report it :-) &amp;amp;raquo; &amp;lt;span style=&amp;quot;font-size:0.9em;color:darkgreen;&amp;quot;&amp;gt;[[User:Nat|Nat]] | [[User_talk:Nat|Talk]]&amp;lt;/span&amp;gt; &amp;amp;raquo; 23:50, 25 March 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Hey cool, and looks like you're #1 and undefeated so far? Nice job! =) And good luck! --[[User:Voidious|Voidious]] 23:31, 8 February 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Thanks, dude! I'm trying not to let my head get to big right now as there is still a lot of time in phase 1, but I am still going to enjoy my time at the top. :-) Seeing as I was never able to make it there here... --[[User:KID|KID]] 04:48, 9 February 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Congratulations to [[User:KID|KID]] (and I think his father), [[DeltaSquad]] is the champion of virtual combat. The finals were a tough winner of 2 out of 3 matches against my team, [[Untouchable]], and even when my team had previously beaten [[DeltaSquad]] a good number of times. [[DeltaSquad]] much more robust team crushed [[Untouchable]] to ashes for an amazing and well deserved championship win. Congrats again, since day one I knew your's was the only team that would really put up a challenge and have been waiting for the finals against you ever since. Good job. (Battles can be watched at http://codefest.org.in/vc-tournament.php) --[[User:Zyx|zyx]] 17:23, 15 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Wow, cool to hear you guys ended up #1 and #2! I checked up on the results a few times and saw Untouchable had overtaken DeltaSquad, but had no idea zyx was behind it. Congrats to you both! It would be cool to read any thoughts you guys want to share about the experience. Was the rule set interesting enough to inspire a new tournament or rumble format here at the RoboWiki? Or just revive any interest in normal team battles or [[Twin Duel]]? --[[User:Voidious|Voidious]] 18:05, 15 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Thanks. I think the basics of the rules are interesting enough to make a branch, however, they need a lot of polishing to make the battles more intense. Sometimes they are too short and luck plays a huge role, luck is always important in Robocode, but there were times it was too much. Another problem is that I think they built the system on a relatively unstable version of the base code, I don't how hard or easy is to use their extension in a more stable version of Robocode. For me it also gave enough encouragement to finally write a team bot, so hopefully I will sometime write an eternal rumble team. However, I am so time constrained right now that I even had to hide this tournament from my significant other and code late at night so she wouldn't know, I sort of put university work aside for the moment. As soon as my schedule frees I will however retake my Robocode addiction to some degree :), I just love it. I drifted, summarizing, I really think the capture the flag mode is interesting enough to have a tournament based on it, but lots of work is still needed to make it as stable and fair as the current eternal rumble is. About [[TwinDuel]], I think is great, but I am a mega bot author, I can't really write anything adequate in a codesize restrained environment. --[[User:Zyx|zyx]] 18:30, 15 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Luck did play a lot into the competition, which I very much did not like, but in some respects it is the same in Robocode. Good starting locations can be a '''huge''' factor in who wins a melee battle for example. When competitions are based solely off single battle results and not off multiple battles the final results, in my opinion, cannot be trusted. I still believe that if a rating were to be assigned to both DeltaSquad and Untouchable like in the rumble, Untouchable would come out on top. I think, as you said yourself [[User:Zyx|zyx]], being robust is about the only thing that DeltaSquad has over Untouchable. --[[User:KID|KID]] 04:16, 16 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Thank you sir! I thought for sure you would take the final win. I thought I might sneak out a win with just one battle but thought for sure you would take me with the best of 3. I also got really scared after FedeeTeam beat me during the tournament... Yes, it was my dad, but he just joined because I thought you '''had''' to have two people to have a team. :-P&lt;br /&gt;
&lt;br /&gt;
I thought the competition was awesome! It was really cool to throw in the two new things of capture the flag and obstacles. In my mind, the later brought the most fun initially, but the combination of the two created a '''huge''' path-finding challenge in the end. I never did put any of my experiments in the field but was working on them throughout the entire competition. I would love to hear how [[User:Zyx|zyx]] worked on these new elements and would be willing to share all my source code as usual.&lt;br /&gt;
&lt;br /&gt;
As far as adding new competitions to the rumble, I think it would be fun and definitely revived my interest, but the actual program needs some work and maybe even some of the rules adjusted a little bit. The program stalled every once in a while, the pause didn't work after a flag was returned, and some other things I don't remember. While I thought only getting the closest point was a cool way to work the obstacles, the angle and distance made the points really inconsistent. Something to consider at least. Just my thoughts.&lt;br /&gt;
&lt;br /&gt;
--[[User:KID|KID]] 18:32, 15 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Just to address the problem you faced: original codebase of this tournament (which is custom-battlefield branch in Robocode SVN) is extremely unstable. The obstacle and other API isn't synchronised into the Roboccode core correctly, and it is based on early Robocode 1.7. At least two or three developers are brainstorming and working on this branch of Robocode.&lt;br /&gt;
&lt;br /&gt;
Congratulations too! This area of Robocode is really unexplored. This tournament really did bring new light into Robocode. --[[User:Nat|&amp;lt;span style=&amp;quot;color:#099;&amp;quot;&amp;gt;Nat&amp;lt;/span&amp;gt;]] [[User talk:Nat|&amp;lt;span style=&amp;quot;color:#0a5;&amp;quot;&amp;gt;Pavasant&amp;lt;/span&amp;gt;]] 02:23, 16 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
: I do realize that it was based off a branch of an earlier version of Robocode and am in no way &amp;quot;complaining,&amp;quot; just pointing out some areas that needed work if this were to ever be streamlined. I do believe that if some work was put into updating it to recent versions we could have a very fun new game play for Robocode. --[[User:KID|KID]] 04:16, 16 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Congrats! It's interesting to see how this went! Like Voidious, I also checked up on it a few times and Untouchable doing well, but unaware it was zyx. --[[User:Rednaxela|Rednaxela]] 03:08, 16 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
: I knew that he had to be from the wiki as soon as he started beating me! :-P --[[User:KID|KID]] 04:16, 16 March 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Talk:DeltaSquad&amp;diff=18786</id>
		<title>Talk:DeltaSquad</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Talk:DeltaSquad&amp;diff=18786"/>
		<updated>2011-03-15T18:32:19Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: /* Virtual Combat */ my thoughts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problems Running Teams ==&lt;br /&gt;
&lt;br /&gt;
So I've been having some problems running teams in robocode. When I create a team and go to run it I get something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Boss&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Fixer&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Sev&lt;br /&gt;
Aborting battle, could not find robot: /home/brian/robocode/robotskid.team.Scorch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The funny thing is that those robots aren't even located in /home/brian/robocode/robots, they're off in my eclipse workspace. Anyone else have this problem? Know how to fix it? Could it be a bug in robocode? -- [[User:KID|KID]] 14:58, 25 March 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Which robocode version do you use? I know some version of robocode have this bug, but I think it is fixed. ([https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2585615&amp;amp;group_id=37202&amp;amp;atid=419486 bug report]) I it is not, then report it :-) &amp;amp;raquo; &amp;lt;span style=&amp;quot;font-size:0.9em;color:darkgreen;&amp;quot;&amp;gt;[[User:Nat|Nat]] | [[User_talk:Nat|Talk]]&amp;lt;/span&amp;gt; &amp;amp;raquo; 23:50, 25 March 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Virtual Combat ==&lt;br /&gt;
&lt;br /&gt;
Hey cool, and looks like you're #1 and undefeated so far? Nice job! =) And good luck! --[[User:Voidious|Voidious]] 23:31, 8 February 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Thanks, dude! I'm trying not to let my head get to big right now as there is still a lot of time in phase 1, but I am still going to enjoy my time at the top. :-) Seeing as I was never able to make it there here... --[[User:KID|KID]] 04:48, 9 February 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Congratulations to [[User:KID|KID]] (and I think his father), [[DeltaSquad]] is the champion of virtual combat. The finals were a tough winner of 2 out of 3 matches against my team, [[Untouchable]], and even when my team had previously beaten [[DeltaSquad]] a good number of times. [[DeltaSquad]] much more robust team crushed [[Untouchable]] to ashes for an amazing and well deserved championship win. Congrats again, since day one I knew your's was the only team that would really put up a challenge and have been waiting for the finals against you ever since. Good job. (Battles can be watched at http://codefest.org.in/vc-tournament.php) --[[User:Zyx|zyx]] 17:23, 15 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Wow, cool to hear you guys ended up #1 and #2! I checked up on the results a few times and saw Untouchable had overtaken DeltaSquad, but had no idea zyx was behind it. Congrats to you both! It would be cool to read any thoughts you guys want to share about the experience. Was the rule set interesting enough to inspire a new tournament or rumble format here at the RoboWiki? Or just revive any interest in normal team battles or [[Twin Duel]]? --[[User:Voidious|Voidious]] 18:05, 15 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Thanks. I think the basics of the rules are interesting enough to make a branch, however, they need a lot of polishing to make the battles more intense. Sometimes they are too short and luck plays a huge role, luck is always important in Robocode, but there were times it was too much. Another problem is that I think they built the system on a relatively unstable version of the base code, I don't how hard or easy is to use their extension in a more stable version of Robocode. For me it also gave enough encouragement to finally write a team bot, so hopefully I will sometime write an eternal rumble team. However, I am so time constrained right now that I even had to hide this tournament from my significant other and code late at night so she wouldn't know, I sort of put university work aside for the moment. As soon as my schedule frees I will however retake my Robocode addiction to some degree :), I just love it. I drifted, summarizing, I really think the capture the flag mode is interesting enough to have a tournament based on it, but lots of work is still needed to make it as stable and fair as the current eternal rumble is. About [[TwinDuel]], I think is great, but I am a mega bot author, I can't really write anything adequate in a codesize restrained environment. --[[User:Zyx|zyx]] 18:30, 15 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
Thank you sir! I thought for sure you would take the final win. I thought I might sneak out a win with just one battle but thought for sure you would take me with the best of 3. I also got really scared after FedeeTeam beat me during the tournament... Yes, it was my dad, but he just joined because I thought you '''had''' to have two people to have a team. :-P&lt;br /&gt;
&lt;br /&gt;
I thought the competition was awesome! It was really cool to throw in the two new things of capture the flag and obstacles. In my mind, the later brought the most fun initially, but the combination of the two created a '''huge''' path-finding challenge in the end. I never did put any of my experiments in the field but was working on them throughout the entire competition. I would love to hear how [[User:Zyx|zyx]] worked on these new elements and would be willing to share all my source code as usual.&lt;br /&gt;
&lt;br /&gt;
As far as adding new competitions to the rumble, I think it would be fun and definitely revived my interest, but the actual program needs some work and maybe even some of the rules adjusted a little bit. The program stalled every once in a while, the pause didn't work after a flag was returned, and some other things I don't remember. While I thought only getting the closest point was a cool way to work the obstacles, the angle and distance made the points really inconsistent. Something to consider at least. Just my thoughts.&lt;br /&gt;
&lt;br /&gt;
--[[User:KID|KID]] 18:32, 15 March 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
	<entry>
		<id>http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=18552</id>
		<title>User:Bnorm</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=User:Bnorm&amp;diff=18552"/>
		<updated>2011-02-16T23:01:28Z</updated>

		<summary type="html">&lt;p&gt;Bnorm: Added DrawMenu link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Who I Am ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;del&amp;gt;I am a now 19 year old PSEO collage student who sends all his free time on his laptop programing robots.&amp;lt;/del&amp;gt; I have no time anymore...&lt;br /&gt;
&lt;br /&gt;
I was introduced to Robocode sometime in February of '04 when my father sent me a link to download it. Well, I played with it for about two months and then got bored after being to confused, it being my first programing experience and all. I returned to it in April of '05 for reasons that I have since forgotten, but the addiction hasn't left since then. Which is a shame... because sometimes I really should be doing my homework...&lt;br /&gt;
&lt;br /&gt;
If you want to talk Robocode through other means then this wiki, my gtalk account is: robotikdude gmail com &lt;br /&gt;
&lt;br /&gt;
== My Robots ==&lt;br /&gt;
&lt;br /&gt;
* '''[[Gladiator]]''' - My first and only competitive robot.&lt;br /&gt;
* '''[[NightFox]]''' - A test robot.&lt;br /&gt;
* '''[[Toa]]''' - A pre [[Gladiator]] remake robot.&lt;br /&gt;
&lt;br /&gt;
== My Teams ==&lt;br /&gt;
&lt;br /&gt;
* '''[[DeltaSquad]]''' - A four robot team.&lt;br /&gt;
* '''[[OmegaSquad]]''' - A pre [[DeltaSquad]] remake team.&lt;br /&gt;
&lt;br /&gt;
== Free Code ==&lt;br /&gt;
&lt;br /&gt;
* '''[[User:KID/DrawMenu]]''' - A graphical debugging tool.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bot Authors|KID]]&lt;/div&gt;</summary>
		<author><name>Bnorm</name></author>
		
	</entry>
</feed>