c091bf3c34
All prior measurements ran on server 0.35.5. The default is now the current 1.3.1 jar, with the legacy jar kept and switchable via TR_SERVER_JAR (no code edit). test_gauntlet_5bots.nim no longer clobbers a caller's TR_SERVER_JAR - it used to putEnv() unconditionally, so an override was silently ignored. RE-BASELINE (controlled RulesProbe battle, stationary bot, powers 0.1/0.5/1/2/3): dimension 1.3.1 0.35.5 verdict bullet damage per hit 0.4/2/4/10/16 identical SAME bullet speed (20-3p) within noise within noise SAME post-fire gun heat (1+p/5) identical identical SAME cooling 0.1/tick 0.1/tick SAME bulletDamage SCORE exactly 100/round 104..113/round DIFFERENT bulletKillBonus (20%) 20/round 20..23/round DIFFERENT LOUD FINDING - a SCORING rule changed, physics did not: 0.35.5 credits OVERKILL to bulletDamage (the killing bullet's full damage even past 0 energy); 1.3.1 caps it at the energy actually removed. Every 0.35.5 score is therefore inflated ~5-6%, and bulletKillBonus inherits the inflation. Gauntlet totals shift accordingly (SittingDuck 1936 -> 1800, WaveSurfer 1886 -> 1669). Consequence: score-based numbers recorded on 0.35.5 are NOT comparable to 1.3.1. Our gun A/Bs used real HIT RATE, not score, so those conclusions stand. Runner 1.0.2 (unchanged, no newer one on the box) is measured compatible with the 1.3.1 server. Note TrBattleCapture uses the runner's EMBEDDED server, which is 1.0.2 - so the capture path still runs an older engine than the gauntlet. Also re-ran acceptance_offline_vs_online on the new default: 12/12.
73 lines
2.3 KiB
Nim
73 lines
2.3 KiB
Nim
## TR server lifecycle manager — lazy singleton for integration tests.
|
|
## Start with ensureServer(), query with getServerUrl().
|
|
|
|
import std/[osproc, net, os, strutils, times, streams, exitprocs]
|
|
|
|
const
|
|
DefaultServerJar* = "/home/davide/Downloads/robocode-tankroyale/robocode-tankroyale-server.jar"
|
|
## Current server (Implementation-Version 1.3.1).
|
|
LegacyServerJar* = "/home/davide/Projects/tank-royale/server/build/libs/robocode-tankroyale-server-0.35.5-all.jar"
|
|
## Previous server (0.35.5). Every pre-1.3.1 measurement was taken on it;
|
|
## kept so old baselines can be reproduced. Select it with
|
|
## `TR_SERVER_JAR=$LegacyServerJar`, no code edit needed.
|
|
ReadySignal = "Starting server on port"
|
|
StartupTimeout = 15.0 # seconds
|
|
|
|
var
|
|
serverProc: Process = nil
|
|
serverPort: int = 0
|
|
|
|
proc findFreePort(): int =
|
|
let s = newSocket()
|
|
s.bindAddr(Port(0))
|
|
let (_, port) = s.getLocalAddr()
|
|
result = port.int
|
|
s.close()
|
|
|
|
proc ensureServer*() =
|
|
if serverProc != nil: return
|
|
|
|
let jar = getEnv("TR_SERVER_JAR", DefaultServerJar)
|
|
if not fileExists(jar):
|
|
raise newException(IOError, "TR server JAR not found: " & jar &
|
|
"\nSet TR_SERVER_JAR env var to override.")
|
|
|
|
serverPort = findFreePort()
|
|
serverProc = startProcess("java",
|
|
args = @["-jar", jar, "--port", $serverPort, "--enable-initial-position", "--tps", "-1"],
|
|
options = {poUsePath, poStdErrToStdOut})
|
|
|
|
exitprocs.addExitProc(proc() =
|
|
if serverProc != nil:
|
|
serverProc.terminate()
|
|
serverProc.close()
|
|
)
|
|
|
|
# Wait for ready signal
|
|
let deadline = epochTime() + StartupTimeout
|
|
var ready = false
|
|
while epochTime() < deadline:
|
|
var line: string
|
|
discard serverProc.outputStream.readLine(line)
|
|
if ReadySignal in line:
|
|
ready = true
|
|
break
|
|
if not ready:
|
|
serverProc.terminate()
|
|
serverProc.close()
|
|
serverProc = nil
|
|
raise newException(TimeoutError, "TR server did not start within " & $StartupTimeout & "s")
|
|
|
|
proc getServerUrl*(): string =
|
|
if serverPort == 0:
|
|
raise newException(CatchableError, "Server not started — call ensureServer() first")
|
|
"ws://localhost:" & $serverPort
|
|
|
|
when isMainModule:
|
|
echo "Starting TR server..."
|
|
ensureServer()
|
|
echo "Server ready at: ", getServerUrl()
|
|
echo "Sleeping 2s then exiting (addExitProc will kill server)..."
|
|
os.sleep(2000)
|
|
echo "Done."
|