GithubHelp home page GithubHelp logo

robocode-dev / tank-royale Goto Github PK

View Code? Open in Web Editor NEW
112.0 10.0 22.0 20.63 MB

Git repository for Robocode Tank Royale

License: Apache License 2.0

Kotlin 39.16% C# 29.86% Java 30.80% TypeScript 0.08% SCSS 0.10% Shell 0.01%
robocode bot ai programming-game tank battle competition battle-royale-game tank-royale

tank-royale's Introduction

Robocode Tank Royale

Robocode logo

Build the best - destroy the rest!

About

Robocode is a programming game where the goal is to code a bot in the form of a virtual tank to compete against other bots in a virtual battle arena.

The player is the programmer of a bot, who will have no direct influence on the game him/herself. Instead, the player must write a program with the logic for the brain of the bot. The program contains instructions to the bot about how it should move, scan for opponent bots, fire its gun, and how it should react to various events occurring during a battle.

The name Robocode is short for "Robot code," which originates from the original/first version of the game. Robocode Tank Royale is the next evolution/version of the game, where bots can participate via the Internet/network. All bots run over a web socket.

The game aims to help you learn how to program and improve your programming skills, and have fun while doing it. Robocode is also useful when studying or improving machine learning in a fast-running real-time game.

Robocode's battles take place on a "battlefield," where bots fight it out until only one is left, like a Battle Royale game. Hence the name Tank Royale.

Note that Robocode contains no gore, blood, people, and politics. The battles are simply for the excitement of the competition we appreciate so much.

Example of a battle

GIF animation of tanks battling each other on a 2D battlefield

Documentation

Main page: Robocode Tank Royale Docs

Try it out

Please head over to My First Bot tutorial to learn how to set up your first bot for Robocode Tank Royale.

Supported platforms

The Robocode game itself needs Java 11 or newer and can run on these operating systems:

  • Windows
  • macOS
  • Linux

These platforms are currently supported out of the box:

  • Java
  • .Net

Bots can (in theory) be written for any platform and programming language, as long as they have access to a WebSocket API, and also follow the protocol needed for communicating with the server.

However, these Bot APIs are provided that take care of all the communication with the server in the background, so you only need to deal with the bot logic:

Both implementations are first-class citizens within Tank Royale, and more might follow in the future for other popular platforms. Also, note that sample bots are provided for both APIs.

Supported programming languages

Due to the current bot APIs for the JVM and .Net, Robocode (should be) able to support these programming languages with the current Bot APIs:

Maintainer

@flemming-n-larsen

License

Apache License 2.0

Copyright

Copyright ยฉ 2022 Flemming N. Larsen

tank-royale's People

Contributors

flemming-n-larsen avatar fnl-trackunit avatar manimonji avatar martinezpenya avatar maxandersen avatar rhys-saldanha avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tank-royale's Issues

Bots in Bot Directories can't join the battle

Describe the bug
when you want to start a battle, you may choose bots are in bot directories, but you only can choose from joined bots(i dont know what is this means). but you can start bots local (i dont know what is this).

BulletHitBotEvent vs HitByBulletEvent

Describe the bug
Bot API allows to use onHitByBulletโ€‹(HitByBulletEvent hitByBulletEvent)
But the bot receives the BulletHitBotEvent instead:

{"victimId":1,"bullet":{"bulletId":10,"ownerId":3,"power":2.0,"x":388.9596630220835,"y":582.0,"direction":0.0,"color":"#008000"},"damage":10.0,"energy":42.59999999999999,"turnNumber":167,"type":"BulletHitBotEvent"}

Expected behavior
Expecting to receive as bot a HitByBulletEvent
Leave the BulletHitBotEvent for Controllers and Observers

Additional context
YAML of the 2 events for easy comparison of the contents
bullet-hit-bot-event
hit-by-bullet-event

getTurnRemaining is broken with the bot API 0.13.3 for the Java version

Describe the bug
The sample bot, Corners, provided with the sample bots does not turn correctly anymore.
The issue is with the getTurnRemaining() method, which does not return the correct value.

To Reproduce
Steps to reproduce the behavior:

  • Start a battle with the Corners Java sample bot from release 0.13.3.
  • Observe that Crazy moves on a line without turning. It should turn when moving forward and back.

at each tick the bots receives the full list of bullets

Describe the bug
As far as I know the bullets of other bots should be invisible to the bot but right now at each tick, inside the
tick-event-for-bot there are the bullets of other bots too

To Reproduce
I'm seeing this because I'm develping a full botApi in a different language so I can't explain step by step, if you read any tick-event-for-bot while any bullet is on the field you will see that those bullets are included in the bulletStates

Expected behavior
the bulletStates inside the tick-event-for-bot must contain only the bullets owned by the bot that shoot them

Print out
example of 2 consecutive ticks I've captured

TICK T
(bulletId: 3, ownerId: 1, power: 1.0, x: 249.4709461593531, y: 344.0048802302621, direction: 148.5360218511403, color: "")
my id is 2

TICK T+1
(bulletId: 3, ownerId: 1, power: 1.0, x: 234.9704818187843, y: 352.8782411441377, direction: 148.5360218511403, color: "")
my id is 2

Robocode Server version
Robocode Tank Royale Server 0.17.4

Server is not accepting the full range of ports

Describe the bug
The range ports for a standard computer is 1-65535 but the server uses a Short to store the port so the port can't have a port over the maximum positive short, that is 32767, leaving out 65535-32767=32768 unusable ports

To Reproduce
FAIL
launch the server with the maximum short+1=32768 and it will fail wiht the message "Invalid value for option '--port': '32768' is not a short"
java -jar robocode-tankroyale-server-0.19.1.jar --botSecrets veuogdpgjtd --controllerSecrets ifrafjbrpcg --port 32768

NO FAIL
launch the server with the maximum short = 32767 and the server will start ok
java -jar robocode-tankroyale-server-0.19.1.jar --botSecrets veuogdpgjtd --controllerSecrets ifrafjbrpcg --port 32767

Expected behavior
The server should be able to use any port out of the full range

Screenshots
Screenshot 2023-03-26 at 11 34 16

GUI: Unreadable Server Log on NixOS

Describe the bug
Dunno if this is only on my machine but when I open the server logs in the GUI I see white characters on a light grey background, making the all logs not readable if not highlighted or copied somewhere else.

To Reproduce
open the GUI, run a server and open "Show Server Log"

Screenshots
Screenshot from 2023-11-12 15-39-44

Desktop (please complete the following information):
Apple Inc. MacBookPro9,2
NixOS 23.05
GNOME Version 44.2
Windowing System Wayland
Kernel Version 6.1.61

Java info:
openjdk version "21" 2023-09-19
OpenJDK Runtime Environment Zulu21.28+85-CA (build 21+35)
OpenJDK 64-Bit Server VM Zulu21.28+85-CA (build 21+35, mixed mode, sharing)

Additional context
I want emphasize that this could be really caused by my desktop. I don't even want to push on this, I don't really need to se these logs right now.

Blocking functions `forward` and `back` do not execute on first run

My run function looks like this:

@Override
public void run() {
    forward(500);
}

When I create a battle and boot my robot, in the first battle, the robot does not move forward. Restarting the battle does not replicate the error. Stopping the battle and starting a new battle without unbooting and rebooting the robot does not replicate the error. However, stopping the battle, starting a new battle, unbooting the robot, and booting it again does replicate the error.

This behavior does not occur for blocking functions turnRight and turnLeft

Video demonstrating the issue:

Animation

TickEventForObserver and TickEventForBot seem not containing real values

Describe the bug
I have the suspect that the "botState" in both TickEventForBot and TickEventForBot is reporting only the starting values for the bot but for some elements.
For example:
energy is updated
direction is not updated

Is a suspect, because I'm observing this using my API that I'm developing, but if I run the bot with the GUI i can see it moving and doing actions, but from the printed RAW ticks the botState is not changing.

To Reproduce
TickEventForObserver
one need to implement an observer and watch the TicketEventForObserver messages

TickEventForBot
build an API and observe the raw ticks from the server during a match. :P

Error info
Here RAW messages of a TickEventForBot and TickEventForObserver of the turn 38

the server was started with initial positions enabled and with this positions:
test bot x:400,y:300,angle:0
another bot x:0,y:0,angle:90

and the ONLY instruction given was for the test bot to turn right by ~176 degrees (random value) starting at turn 10 and completed at turn 37 (expected behavior)

TickEventForBot

{
    "roundNumber": 1,
    "enemyCount": 1,
    "botState": {
        "isDroid": false,
        "energy": 97.30000000000015,
        "x": 400.0,
        "y": 300.0,
        "direction": 0.0,
        "gunDirection": 0.0,
        "radarDirection": 0.0,
        "radarSweep": 0.0,
        "speed": 0.0,
        "turnRate": 0.0,
        "gunTurnRate": 0.0,
        "radarTurnRate": 0.0,
        "gunHeat": 0.0
    },
    "bulletStates": [],
    "events": [],
    "turnNumber": 38,
    "type": "TickEventForBot"
}

TickEventForObserver

{
    "roundNumber": 1,
    "botStates": [
        {
            "id": 1,
            "sessionId": "7/ZlaPDCR6mLNQ938GltPQ",
            "isDroid": false,
            "energy": 97.30000000000015,
            "x": 18.0,
            "y": 18.0,
            "direction": 90.0,
            "gunDirection": 90.0,
            "radarDirection": 90.0,
            "radarSweep": 0.0,
            "speed": 0.0,
            "turnRate": 0.0,
            "gunTurnRate": 0.0,
            "radarTurnRate": 0.0,
            "gunHeat": 0.0
        },
        {
            "id": 2,
            "sessionId": "7fOJndqFQXq/LZkB9A8r6Q",
            "isDroid": false,
            "energy": 97.30000000000015,
            "x": 400.0,
            "y": 300.0,
            "direction": 0.0,
            "gunDirection": 0.0,
            "radarDirection": 0.0,
            "radarSweep": 0.0,
            "speed": 0.0,
            "turnRate": 0.0,
            "gunTurnRate": 0.0,
            "radarTurnRate": 0.0,
            "gunHeat": 0.0
        }
    ],
    "bulletStates": [],
    "events": [],
    "turnNumber": 38,
    "type": "TickEventForObserver"
}

Expected behavior
The ticks should contain values reflecting the real status of the bot

Desktop (please complete the following information):
NixOs 23.05

Java info:
openjdk version "21" 2023-09-19
OpenJDK Runtime Environment Zulu21.28+85-CA (build 21+35)
OpenJDK 64-Bit Server VM Zulu21.28+85-CA (build 21+35, mixed mode, sharing)

Additional context
About the TickEventforObserver:
This problem is affecting only who is working with a Controller. So me that I'm developing an API for the bots, and i use a Controller to do automated tests, and I'm using the BotState to check what the bot is doing. For the majority of the people, the Controller is hidden in the GUI and are not affected by this issue.

About the TickEventForBot, every creator of a bot should be able to observe this

NULL Pointer Exception running robocode-tankroyale-gui-0.14.2.jar in Java 18 Win 10

Describe the bug
Running the latest 0.14.2 GUI Jar file produces an NULL Pointer exception.

To Reproduce
Steps to reproduce the behavior:

  1. Download the robocode-tankroyale-gui-0.14.2.jar from the link in the latest releases page https://github.com/robocode-dev/tank-royale/releases.
  2. Open a windows 10 command prompt
  3. Type "java -jar robocode-tankroyale-gui-0.14.2.jar"
  4. See error

Error info
C:\Robocode Tank Royale>java -jar robocode-tankroyale-gui-0.14.2.jar
Exception in thread "main" java.lang.ExceptionInInitializerError
at dev.robocode.tankroyale.gui.ui.control.ControlPanel.(Unknown Source)
at dev.robocode.tankroyale.gui.ui.MainWindow$MainPanel.(Unknown Source)
at dev.robocode.tankroyale.gui.ui.MainWindow.(Unknown Source)
at dev.robocode.tankroyale.gui.GuiAppKt.main(Unknown Source)
at dev.robocode.tankroyale.gui.GuiAppKt.main(Unknown Source)
Caused by: java.lang.NullPointerException: must not be null
at dev.robocode.tankroyale.gui.settings.ConfigSettings.getTps(Unknown Source)
at dev.robocode.tankroyale.gui.ui.tps.TpsSlider.(Unknown Source)
... 5 more

Expected behavior
A null pointer wasn't expected. I expected the GUI to open but it didn't.

Screenshots
N/A

Desktop (please complete the following information):

  • Windows 10 Pro

Java info:

  • Version: [can be found by writing java -version from the command-line]
  • Vendor: Oracle

C:\Robocode Tank Royale>java -version
java version "18.0.2" 2022-07-19
Java(TM) SE Runtime Environment (build 18.0.2+9-61)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.2+9-61, mixed mode, sharing)

Additional context
N/A

cannot build project

running on OSX M1 machine.

git clone - gradlew is not executable and wrapper somehow incomplete. had to install gradle 8.0.2 manually first.

then ran brew install dotnet as otherwise build fails.

but then the dotnet build fails (p.s. no idea why the dotnet errors are in Spanish - i got no such locale configured :)

 gradle build --stacktrace
Using gradle at '/Users/manderse/code/robocode-dev/tank-royale/gradlew' to run buildFile '/Users/manderse/code/robocode-dev/tank-royale/build.gradle.kts':
Start restoring packages
Compilaรงรฃo de 04/03/2023 14:10:35 iniciada.
     1>Projeto "/Users/manderse/code/robocode-dev/tank-royale/bot-api/dotnet/Robocode.TankRoyale.BotApi/Robocode.TankRoyale.BotApi.csproj" no nรณ 1 (Restore destino(s)).
     1>_GetAllRestoreProjectPathItems:
         Determining projects to restore...
       Restore:
         X.509 certificate chain validation will use the fallback certificate bundle at '/opt/homebrew/Cellar/dotnet/7.0.100/libexec/sdk/7.0.100/trustedroots/codesignctl.pem'.
         X.509 certificate chain validation will use the fallback certificate bundle at '/opt/homebrew/Cellar/dotnet/7.0.100/libexec/sdk/7.0.100/trustedroots/timestampctl.pem'.
         Assets file has not changed. Skipping assets file writing. Path: /Users/manderse/code/robocode-dev/tank-royale/bot-api/dotnet/Robocode.TankRoyale.BotApi/obj/project.assets.json
         Restored /Users/manderse/code/robocode-dev/tank-royale/bot-api/dotnet/Robocode.TankRoyale.BotApi/Robocode.TankRoyale.BotApi.csproj (in 34 ms).

         NuGet Config files used:
             /Users/manderse/.nuget/NuGet/NuGet.Config

         Feeds used:
             https://api.nuget.org/v3/index.json
         All projects are up-to-date for restore.
     1>Projeto de compilaรงรฃo pronto "/Users/manderse/code/robocode-dev/tank-royale/bot-api/dotnet/Robocode.TankRoyale.BotApi/Robocode.TankRoyale.BotApi.csproj" (Restore destino(s)).

Compilaรงรฃo com รชxito.
    0 Aviso(s)
    0 Erro(s)

Tempo Decorrido 00:00:00.54
Complete restoring packages
Start parsing project
Complete parsing project
> Task :bot-api:dotnet:dotnetBuild FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':bot-api:dotnet:dotnetBuild'.

booted bots can't join the battle

  1. I started robocode-tankroyale-gui-0.22.0.jar on Windows 10.
  2. Selected Config Menu -> "Bot Root Directory" and added the path to the sample bots
  3. Selected Server Menu -> Start Server
  4. Selected Server Menu -> Select Server -> Test -> "server is running"
  5. Selected Battle Menu -> Start Battle -> Selected some bots from "Bot Directories (local only)" and clicked on Boot-Button.
  6. Selected Bots were shown on "Booted Bots (local only)" list
  7. "Joined Bots (local/remote)" list stays empty. So I can't add a bot to "Selected Bots(local/remote)" list and the "Start Battle" Button remains disabled.

What wents wrong?

Cannot import Maven dependency dev.robocode.tankroyale:robocode-tankroyale-bot-api:0.10.0

Describe the bug
Maven dependency dev.robocode.tankroyale:robocode-tankroyale-bot-api:0.10.0 cannot be imported into a Java project. It looks like groupId dev.robocode.tankroyale contains only one artifactId: robocode-tankroyale-bot-api. However, this artifact's pom depends on another artifact that should be in this group: dev.robocode.tankroyale:robocode-tankroyale-schema:0.10.0

To Reproduce
Steps to reproduce the behavior (Intellij IDEA):

  1. Create a Gradle project
  2. In build.gradle, in the dependencies block, add implementation 'dev.robocode.tankroyale:robocode-tankroyale-bot-api:0.10.0'
  3. Load Gradle changes

Error info

GradleBot:main: Could not find dev.robocode.tankroyale:robocode-tankroyale-schema:0.10.0.
Searched in the following locations:
  - https://repo.maven.apache.org/maven2/dev/robocode/tankroyale/robocode-tankroyale-schema/0.10.0/robocode-tankroyale-schema-0.10.0.pom
If the artifact you are trying to retrieve can be found in the repository but without metadata in 'Maven POM' format, you need to adjust the 'metadataSources { ... }' of the repository declaration.
Required by:
    project : > dev.robocode.tankroyale:robocode-tankroyale-bot-api:0.10.0

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

Desktop (please complete the following information):
Windows 11

Java info:
Oracle v.17

Bots receives skipped-turn-event events while dead

Describe the bug
I've took a while to discover this because I actively started again to work on code only yesterday, but looks like to me that at the death of the robot the server is still giving out the "skipped-turn-event" every turn

Expected behavior
2. stopping receiving the "skipped-turn-event" if the bot is dead

Screenshots
immagine

Add stepping turn-by-turn if battle is paused

When debugging a bot, it is helpful to observe what it does one turn at a time. The game already implements pausing a battle, which helps a lot. This could be expanded on by allowing paused matches to progress by one turn per hotkey/button press.

Getting results at round end

Is your feature request related to a problem? Please describe.
At the moment the results are provided at the end of the battle, I think that would be very useful to have the (partial) results provided at the end of each round

WebAssembly build

Hi, thanks for sharing this cool project.
It would be cool if we have a webassembly version of robocode so that people can watch a robocode game session in a browser. :D

I could offer some help on that. I guess this should be relatively easy, since we just need to fetch the game state and render it as is.
I could implement it either in Rust or C++ with sdl.

Let me know what you think. :D

Game replays

Describe the solution you'd like
Curious if there's any way to record / replay games from the server side?

Describe alternatives you've considered
Right now I have a semblance of recording via some custom python rendering in bot PoV. Would be cool to see it from the server side though.

Add a bot log console

When developing a bot, want to check certain values during runtime. I added some print statements to my bot's code, but when running the bot, I don't know if there is a console or similar for catching and displaying these print statements. If this feature does not exist, it would help the debugging experience. If there is currently a method to read bot print statements, please let me know.

Possibility to identify bot from Process to Tick

Is your feature request related to a problem? Please describe.
As I described in this discussion I'm developing an alternative graphic client for roboocode Tankroyale, focused on my needs.
The application runs the bots, the server and the controller. My problem is to match the runned robots from process with the bots competing into the battlefield but with the situation nowday looks like is impossiible with 100% accuracy. Here's why:
The bot is identified in 3 different ways not linkable to each other if not with guesses.

  1. The bot process is identified by the PID
  2. the bot (from version 0.17.0 of the libraries) is receiving a unique session id, aka sessionId, from the server and is shared to the controller via the BotListUpdate message
  3. the bots, during a battle, is identified by an Id, given with the TickEventForObserver message
    Assuming that my web application can correctly come in possession of all PIDs, Session IDs and in-battle IDs, right now it hasn't the possibility to connect the bots in these three lists together.

If not clear enough I've put, at the end of the request, a simulated example of situation where the matching is impossible.

Describe the solution you'd like
I think that the simpler and easier solution (and so the best) is to add to the BotListUpdate message, as middlepoint between the new bot and the battle, two fields: the PID of the bot (given by the bot itself during the handshake) and the id of the battle, pre-issued by the server that will later use as ids for the battle.
In this way the botlistupdate bot object would contain: name, sid, host, port, pid, battle id. With this combination of data every program will be able to discern what a bot is doing in every level of the software without confusion.

ps: I approve the usage of short ID for the battle, means less data to transfer for every tick and the ticks are spammed like hell during the battle, keeping those smallest as possible is mandatory.

Describe alternatives you've considered
Alternatives I like less

  1. the bot process, same way as the booter, is capable of receiving input from stdinput and answer to the command "identify" with "PID, sessionID, battleID"
  2. BotUpdateList adds the PID and TicksUpdateEventForObserver uses the sessionid instead of the "battle id"
  3. possiblity to enable for the bot "route stdout to websocket" that set the bot to route the stdoud and stderr messages to a websocket where any software can connect to and listen what the bot process says and TicksUpdateEventForObserver uses the sessionid instead of the "battle id". This solution should disable the need to use the PID and realy on the booter application to boot the bots.
  4. any combination of the above solution should solve the main issue

Additional context
simulated example, where the data has the same content is written in italic:

  1. I want to run 3 times the same bot pippo and i get from this 3 bot processes with possible identification by name and/or pid:
  • (pippo,pid1)
  • (pippo, pid2)
  • (pippo, pid3).
  1. I run the controller that upon connection it receives the BotUpdateList with 3 objects with possible identification by name, sessionId (sid in short), host and connection port:
  • (pippo,sid1,host,port1)
  • (pippo,sid2,host,port2)
  • (pippo,sid3,host,port3)
  1. when the match is running, via TickEventForObserver, I get as bot updates, these 3 objects with possible identification by id only:
  • (id1)
  • (id2)
  • (id3)

In this example, where the 3 bots have the same name and same host, is impossible to match the 3 same bots in the 3 lists among each other. Not even the Controller itself can match the bots in the list given within the TicksEventForObserver with the ones given in the BotListUpdate.

Thanks for reading this far

New version 0.21.0 freezes starting battle

Describe the bug
New version 0.21.0 freezes starting battle

To Reproduce
Launch 0.21.0 version gui jar from Kubuntu 22.04LTS, go to Battle, Start Battle... the app freezes, you can't select bots from samples bot and boot them. I have to close the app by the force. No error or debug information on console

Error info
No error shown

Expected behavior
Select bots, boot them and start battle, with version 0.19.3 it works very well.

Screenshots
non applicable

Desktop (please complete the following information):

  • OS name and version: Kubuntu 22.04 LTS

Java info:
openjdk 19.0.2 2023-01-17
OpenJDK Runtime Environment (build 19.0.2+7-Ubuntu-0ubuntu322.04)
OpenJDK 64-Bit Server VM (build 19.0.2+7-Ubuntu-0ubuntu322.04, mixed mode, sharing)

Additional context
nothing exceptional

Blocking bot functions do not stop bot after finishing

I tested this for Bot.forward, Bot.back, and Bot.turnGunRight. When the run function contains only one of these calls, I would expect the bot to perform the action and then remain still. However, the bot instead continues the motion.

For example, consider this run function:

@Override
public void run() {
    forward(100);
}

I would expect the bot to move forward 100 pixels and then stop. However, the bot instead moves forward 100 pixels, and then slowly creeps forward indefinitely. The problem is not that run is a loop. I tried this function as well:

@Override
public void run() {
    forward(100);
    back(100);
}

In this case, the bot moves forward 100 pixels, backs up 100 pixels, and then slowly creeps backwards indefinitely.

java.lang.NoClassDefFoundError: Could not initialize class dev.robocode.tankroyale.gui.ui.MainFrame

running gives error - tried on java 11 17 and newer.

java -jar ~/Downloads/robocode-tankroyale-gui-0.19.1.jar
Exception in thread "main" Exception in thread "AWT-EventQueue-0" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    b/a/w.a(Lb/a/f/g;La/i/f;Z)Lb/a/b; @164: invokestatic
  Reason:
    Type 'java/util/List' (current frame, stack[1]) is not assignable to 'java/util/ArrayList'
  Current Frame:
    bci: @164
    flags: { }
    locals: { 'b/a/f/g', 'java/util/List', integer, 'a/i/b', integer }
    stack: { 'a/i/b', 'java/util/List', integer }
  Bytecode:
    0000000: 2bb8 0047 4e2b b900 5d01 0036 042b b900
    0000010: 5c01 00c0 0021 593a 053a 06bb 0024 5919
    0000020: 0510 0ab8 0030 b700 59c0 0026 3a05 1906
    0000030: b900 5e01 003a 0619 06b9 0061 0100 9900
    0000040: 4a19 06b9 0062 0100 3a07 1905 1907 c000
    0000050: 0a3a 073a 0819 07b6 0036 59c7 0021 57bb
    0000060: 0023 5912 02b7 0056 2bb6 0057 b600 584b
    0000070: bb00 2059 2ab6 0055 b700 54bf 1908 5fb9
    0000080: 005f 0200 57a7 ffb2 1905 c000 2c59 4cb9
    0000090: 0064 0100 9900 0c2d 1504 b800 4ca7 0039
    00000a0: 2d2b 1504 b800 4b3a 051c 9900 1719 05b8
    00000b0: 0037 9900 0701 a700 0519 05c0 0010 a700
    00000c0: 1819 0559 3a06 b800 38c7 0008 1906 a700
    00000d0: 0501 b0c0 0010 593a 05c6 0009 1905 593a
    00000e0: 06b0 2bb9 0064 0100 9900 0e2a 2d01 0501
    00000f0: b800 4aa7 0039 2a2b 1c36 073a 0559 4d19
    0000100: 0515 07b8 0051 59c7 0006 5701 b03a 062d
    0000110: 2b19 063a 073a 0559 4d19 0519 07b8 004d
    0000120: 59c7 000b 572a 2d19 06b6 0049 593a 0559
    0000130: c600 0c59 3a05 1504 b800 4eb0 5701 b0
  Stackmap Table:
    full_frame(@55,{Object[#28],Object[#9],Integer,Object[#8],Integer,Object[#38],Object[#41]},{})
    full_frame(@124,{Object[#28],Object[#9],Integer,Object[#8],Integer,Object[#38],Object[#41],Top,Object[#38]},{Object[#9]})
    full_frame(@136,{Object[#28],Top,Integer,Object[#8],Integer,Object[#38]},{})
    full_frame(@160,{Object[#28],Object[#44],Integer,Object[#8],Integer},{})
    append_frame(@185,Object[#34])
    full_frame(@187,{Object[#28],Object[#44],Integer,Object[#8],Integer},{Object[#34]})
    append_frame(@193,Object[#34])
    full_frame(@209,{},{})
    full_frame(@211,{Object[#28],Object[#44],Integer,Object[#8],Integer},{Object[#34]})
    same_locals_1_stack_item_frame(@214,Object[#16])
    same_frame(@226)
    same_frame(@246)
    full_frame(@269,{Object[#28],Object[#44],Top,Object[#8],Integer},{Object[#44]})
    full_frame(@300,{Top,Top,Top,Top,Integer},{Object[#16]})
    full_frame(@316,{},{Object[#16]})

	at b.a.v.a(Unknown Source)
	at dev.robocode.tankroyale.gui.model.MessagesKt.<clinit>(Unknown Source)
	at dev.robocode.tankroyale.gui.model.MessageConstants$Companion$json$1.invoke(Unknown Source)
	at dev.robocode.tankroyale.gui.model.MessageConstants$Companion$json$1.invoke(Unknown Source)
	at b.a.e.w.a(Unknown Source)
	at dev.robocode.tankroyale.gui.model.MessageConstants.<clinit>(Unknown Source)
	at dev.robocode.tankroyale.gui.client.Client.<clinit>(Unknown Source)
	at dev.robocode.tankroyale.gui.ui.arena.ArenaPanel.<clinit>(Unknown Source)
	at dev.robocode.tankroyale.gui.ui.arena.BattlePanel.<clinit>(Unknown Source)
	at dev.robocode.tankroyale.gui.ui.MainFrame.<clinit>(Unknown Source)
	at dev.robocode.tankroyale.gui.GuiAppKt.main(Unknown Source)
	at dev.robocode.tankroyale.gui.GuiAppKt.main(Unknown Source)
java.lang.NoClassDefFoundError: Could not initialize class dev.robocode.tankroyale.gui.ui.MainFrame
	at dev.robocode.tankroyale.gui.util.BusyCursor.deactivate(Unknown Source)
	at dev.robocode.tankroyale.gui.util.GuiTask.enqueue$lambda$0(Unknown Source)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Could not initialize class dev.robocode.tankroyale.gui.ui.MainFrame
	at dev.robocode.tankroyale.gui.util.BusyCursor.activate(Unknown Source)
	at dev.robocode.tankroyale.gui.util.GuiTask.enqueue(Unknown Source)
	at dev.robocode.tankroyale.gui.ui.extensions.JComponentExt.setDefaultButton(Unknown Source)
	at dev.robocode.tankroyale.gui.ui.control.ControlPanel$6.invoke(Unknown Source)
	at dev.robocode.tankroyale.gui.ui.control.ControlPanel$6.invoke(Unknown Source)
	at dev.robocode.tankroyale.gui.util.GuiTask.enqueue$lambda$0(Unknown Source)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Java - `turnRight` and `turnLeft` never stop turning if last function

Version: Java

If the last function called in run is turnLeft or turnRight, the robot turns and never stops turning. If another function (e.g. forward) follows one of these two functions, the robot stops turning and performs the next action, as expected.

Some thoughts. This is similar to #17, which was recently fixed for forward and back. Now, these two functions are experiencing another issue in #22. When this problem with turnLeft and turnRight is looked at, hopefully the solution does not lead to similar #22 issues.

Battle does not restart

Describe the bug
When battling the "Target" and "Walls" C# sample robots, hitting "Restart" does not restart the battle. Instead the battle ends but does not restart. In the resulting state, hitting Ctrl+B to start a new battle does not open up the appropriate menu. To start a new battle, I had to close and reopen the GUI.

To Reproduce
Steps to reproduce the behavior:

  1. Run robocode-tankroyale-gui-0.11.0.jar
  2. Press Ctrl+B.
  3. Run Target and Walls (from sample-bots-csharp-0.11.0)
  4. Click "Add All"
  5. Click "Start Battle"
  6. Click "Restart"
  7. Observe that the battle does not restart

Error info
No error message is displayed, as far as I can tell.

Expected behavior
The battle restarts when I click "Restart".

Desktop (please complete the following information):
-Windows 10

Java info:
openjdk version "11.0.14.1" 2022-02-08
OpenJDK Runtime Environment Temurin-11.0.14.1+1 (build 11.0.14.1+1)
OpenJDK 64-Bit Server VM Temurin-11.0.14.1+1 (build 11.0.14.1+1, mixed mode)

Additional context
This reproduces pretty consistently for me, but the issue does not occur every single time. While typing the steps up for this issue, I reproduced the problem several times. However, there was one time where the restart button did work correctly. This occurred when I had left the battle creation menu open for some time before actually starting the battle.

Some configuration options I used:
initial-position-enabled=false
tps=30

Fire and Explosion Sounds

Hi,

First of all, thank you for creating an upgraded platform for robocode.
I love it! especially the fact that it enables me to use the latest .NET Framework.

Regarding sound (Firing and Tank Explosions), just wanted to inquire if this is already in place and perhaps my setup hasn't just enabled it (i.e. no sound by default). or there is really no sound as per the latest version?

feel free to reply and close when you get some time :-)
stay awesome!

GUI application 0.19.1 won't launch

Attempting to launch robocode-tankroyale-gui-0.19.1 with Java 11.0.18+10 fails.
On MacOS 12.6.3

%> java -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment Temurin-11.0.18+10 (build 11.0.18+10)
OpenJDK 64-Bit Server VM Temurin-11.0.18+10 (build 11.0.18+10, mixed mode)

%> java -jar robocode-tankroyale-gui-0.19.1.jar
Exception in thread "main" Exception in thread "AWT-EventQueue-0" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
b/a/w.a(Lb/a/f/g;La/i/f;Z)Lb/a/b; @164: invokestatic
Reason:
Type 'java/util/List' (current frame, stack[1]) is not assignable to 'java/util/ArrayList'
Current Frame:
bci: @164
flags: { }
locals: { 'b/a/f/g', 'java/util/List', integer, 'a/i/b', integer }
stack: { 'a/i/b', 'java/util/List', integer }
Bytecode:
0000000: 2bb8 0047 4e2b b900 5d01 0036 042b b900
0000010: 5c01 00c0 0021 593a 053a 06bb 0024 5919
0000020: 0510 0ab8 0030 b700 59c0 0026 3a05 1906
0000030: b900 5e01 003a 0619 06b9 0061 0100 9900
0000040: 4a19 06b9 0062 0100 3a07 1905 1907 c000
0000050: 0a3a 073a 0819 07b6 0036 59c7 0021 57bb
0000060: 0023 5912 02b7 0056 2bb6 0057 b600 584b
0000070: bb00 2059 2ab6 0055 b700 54bf 1908 5fb9
0000080: 005f 0200 57a7 ffb2 1905 c000 2c59 4cb9
0000090: 0064 0100 9900 0c2d 1504 b800 4ca7 0039
00000a0: 2d2b 1504 b800 4b3a 051c 9900 1719 05b8
00000b0: 0037 9900 0701 a700 0519 05c0 0010 a700
00000c0: 1819 0559 3a06 b800 38c7 0008 1906 a700
00000d0: 0501 b0c0 0010 593a 05c6 0009 1905 593a
00000e0: 06b0 2bb9 0064 0100 9900 0e2a 2d01 0501
00000f0: b800 4aa7 0039 2a2b 1c36 073a 0559 4d19
0000100: 0515 07b8 0051 59c7 0006 5701 b03a 062d
0000110: 2b19 063a 073a 0559 4d19 0519 07b8 004d
0000120: 59c7 000b 572a 2d19 06b6 0049 593a 0559
0000130: c600 0c59 3a05 1504 b800 4eb0 5701 b0
Stackmap Table:
full_frame(@55,{Object[#28],Object[#9],Integer,Object[#8],Integer,Object[#38],Object[#41]},{})
full_frame(@124,{Object[#28],Object[#9],Integer,Object[#8],Integer,Object[#38],Object[#41],Top,Object[#38]},{Object[#9]})
full_frame(@136,{Object[#28],Top,Integer,Object[#8],Integer,Object[#38]},{})
full_frame(@160,{Object[#28],Object[#44],Integer,Object[#8],Integer},{})
append_frame(@185,Object[#34])
full_frame(@187,{Object[#28],Object[#44],Integer,Object[#8],Integer},{Object[#34]})
append_frame(@193,Object[#34])
full_frame(@209,{},{})
full_frame(@211,{Object[#28],Object[#44],Integer,Object[#8],Integer},{Object[#34]})
same_locals_1_stack_item_frame(@214,Object[#16])
same_frame(@226)
same_frame(@246)
full_frame(@269,{Object[#28],Object[#44],Top,Object[#8],Integer},{Object[#44]})
full_frame(@300,{Top,Top,Top,Top,Integer},{Object[#16]})
full_frame(@316,{},{Object[#16]})

at b.a.v.a(Unknown Source)
at dev.robocode.tankroyale.gui.model.MessagesKt.<clinit>(Unknown Source)
at dev.robocode.tankroyale.gui.model.MessageConstants$Companion$json$1.invoke(Unknown Source)
at dev.robocode.tankroyale.gui.model.MessageConstants$Companion$json$1.invoke(Unknown Source)
at b.a.e.w.a(Unknown Source)
at dev.robocode.tankroyale.gui.model.MessageConstants.<clinit>(Unknown Source)
at dev.robocode.tankroyale.gui.client.Client.<clinit>(Unknown Source)
at dev.robocode.tankroyale.gui.ui.arena.ArenaPanel.<clinit>(Unknown Source)
at dev.robocode.tankroyale.gui.ui.arena.BattlePanel.<clinit>(Unknown Source)
at dev.robocode.tankroyale.gui.ui.MainFrame.<clinit>(Unknown Source)
at dev.robocode.tankroyale.gui.GuiAppKt.main(Unknown Source)
at dev.robocode.tankroyale.gui.GuiAppKt.main(Unknown Source)

java.lang.NoClassDefFoundError: Could not initialize class dev.robocode.tankroyale.gui.ui.MainFrame
at dev.robocode.tankroyale.gui.util.BusyCursor.deactivate(Unknown Source)
at dev.robocode.tankroyale.gui.util.GuiTask.enqueue$lambda$0(Unknown Source)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Could not initialize class dev.robocode.tankroyale.gui.ui.MainFrame
at dev.robocode.tankroyale.gui.util.BusyCursor.activate(Unknown Source)
at dev.robocode.tankroyale.gui.util.GuiTask.enqueue(Unknown Source)
at dev.robocode.tankroyale.gui.ui.extensions.JComponentExt.setDefaultButton(Unknown Source)
at dev.robocode.tankroyale.gui.ui.control.ControlPanel$6.invoke(Unknown Source)
at dev.robocode.tankroyale.gui.ui.control.ControlPanel$6.invoke(Unknown Source)
at dev.robocode.tankroyale.gui.util.GuiTask.enqueue$lambda$0(Unknown Source)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Turn two is skipped (?)

Describe the bug
It seems like the second turn of my robot is skipped.

To Reproduce
Steps to reproduce the behavior:

  1. Create a testing robot that prints out the current turn in its Run member. Working in F#, I used the following code:
    override this.Run() =  
            while(this.IsRunning) do
                use writer = File.AppendText("log.txt") 
                writer.WriteLine("It is turn: " + (string this.TurnNumber))                 
                this.Go()
  1. Create a battle with this testing robot and some other robot (I used Target).
  2. Let the battle run for a few seconds.
  3. Examine the log file "log.txt"

Expected behavior
I would expect each robot to be able to act on each turn. In particular, I would expect the log file created above to include the line "It is turn: 2".

Screenshots
The start of the resulting log file:
turn two is skipped

Desktop (please complete the following information):
Windows 10

Java info:
openjdk version "11.0.14.1" 2022-02-08
OpenJDK Runtime Environment Temurin-11.0.14.1+1 (build 11.0.14.1+1)
OpenJDK 64-Bit Server VM Temurin-11.0.14.1+1 (build 11.0.14.1+1, mixed mode)

Additional context
I'm using v0.10.0 of robocode tank-royale.

Bring original robocode bots to new platform

I quite like the new and modularized design, where bot creation is no longer limited by JVM. One can write e.g. a Python bot, finally, and even take advantage of GPUs. Imagine a whole new level of robocode competition!

Anyway we have a lot of ancient bots in original robocode, no longer updated by their authors. Yet their strategy is sophisticated, and is still inspiring new authors. Theoretically one can simply write a bridge, translate math coordinates, since the rest of game physics is mostly equivalent. However, such a bridge is error-prune, and may get out of maintenance, which creates fragmentation to the community.

If there were an officially supported bridge, it will be much easier to go with the new platform, with the benefit of the existing community and bots, out of the box. And I'm glad to help if there are already some plans ;)

Questions about seemingly inconsistent behavior

I want to make a bot that moves in a circle. I coded this in multiple ways that I assumed would behave the same. However, they each have different behaviors. Some of these different behaviors may be intentional, I am just curious about them.

setTurnRight(Double.POSITIVE_INFINITY);
forward(Double.POSITIVE_INFINITY);

This behaves how I would expect. The bot moves in a circle. If it hits an obstacle, it continues attempting to move in a circle. All is well and good

setForward(Double.POSITIVE_INFINITY);
turnRight(Double.POSITIVE_INFINITY);

This behaves similar to 1; the bot moves in a circle. However, if it hits an obstacle, it stops moving forward and spins in place. It seems like forward maintains distance remaining when the bot runs into something, but setForward does not

setForward(Double.POSITIVE_INFINITY);
setTurnRight(Double.POSITIVE_INFINITY);

The bot does not move at all. I expected this because I do not call go, and the documentation says that go must be called every turn if using these functions. Although this seems obvious, I thought there might be a chance that go is called automatically after the run function completes.

setForward(Double.POSITIVE_INFINITY);
setTurnRight(Double.POSITIVE_INFINITY);
go();

The bot moves in a tiny circle. Due to my misunderstanding of go, I was expecting this to either move for a single turn and then stop, or move similar to 1 and 2. However, the forward speed is much smaller than these previous cases. Additionally, it seems like bumping into obstacles does not eliminate its forward movement like 2, even though setForward is used here as well.

I should also mention when I was testing this case, I threw the following exception once at the beginning of a run. This exception seems to occur rarely for some reason, and I think it could have happened during any of these cases.

Exception in thread "Thread-28" java.lang.IllegalArgumentException: -Infinity is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method.
setForward(Double.POSITIVE_INFINITY);
setTurnRight(Double.POSITIVE_INFINITY);
while (true) {
    go();
}

The bot spins in place. Also, when I choose to restart the battle, the battle does not begin. To retry, I have to close the bot process and start it anew. I actually expected this to be the correct way to code a circle bot. The documentation for go says that it must be called every turn, so putting it in a while loop seemed the best way to ensure this. I thought if go is not called, actions would not be sent to the server, hence why I thought case 4 might have the bot only move for a single turn. Currently though, it appears that putting go in a loop with nothing else causes the most problems.

Server is kidnapping CPU cycles

Describe the bug
Version of the server 0.17.1, the server after a while reaches high level of CPU % taken, to my old macBookPro from 2012 is reaching 100% or more, I monitor the process using the tool htop and filtering with the keywork tankroyale
The problem doesn't look to appear until a game is started but when happens doesn't matter if the game is aborted or the bots are disconnected/unbooted/killed, the server is getting hold of my CPU

To Reproduce
Assuming the problem is not just related to me, boot up a server, join some bots, run a game, stop the game, un-run the bots. Monitor the CPU usage from the server on each step.

Expected behavior
server to use any CPU is required to him during the battle and releasing it when the battle is finished

Screenshots
htop screenshots, ignore the blue higlighted row and fcus on the server row and the CPU% column

Server just started:
Screenshot 2022-09-18 at 19 01 16

Walls and Crazy joined
Screenshot 2022-09-18 at 19 01 53

Game started
Screenshot 2022-09-18 at 19 02 14

Game aborted
Screenshot 2022-09-18 at 19 02 35

Bots killed (after the games i aborted in order to avoid any illegal disruption of the game)
Screenshot 2022-09-18 at 19 02 52

Desktop (please complete the following information):
MacOS Catalina on MacBook Pro 13-inch Mid 2-12

Java info:
java 18.0.2.1 2022-08-18
Java(TM) SE Runtime Environment (build 18.0.2.1+1-1)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)

extra
running server with this command line:
java -jar robocode/servers/robocode-tankroyale-server.jar --port=1234 --botSecrets=secret1 --controllerSecrets=secret2
The server jar is the one prelevated from the robocode-tankroyale-gui-0.17.1.jar upon extracting it

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.