global.debugshow = false; function oil(id) { return "\nO" + id +": " + document.getElementById('oil' + id + '').style.left.split("px")[0] + " " + document.getElementById('oil' + id + '').style.top.split("px")[0] + " / " + document.getElementById('oil' + id + '').style.transform.split("rotate(")[1].split("deg)")[0]; } $(document).keydown((e) => { if (e.keyCode === 114) { // F3 if (debugshow) { global.debugshow = false; document.getElementById("debug").style.display = "none"; } else { global.debugshow = true; document.getElementById("debug").style.display = ""; } } }) if (require('os').platform() !== "darwin") { gpuinfo = require('@electron/remote').app.getGPUFeatureStatus(); gpuscore = 0; maxscore = 10; if (gpuinfo['2d_canvas'].startsWith("enabled")) { if (gpuinfo['2d_canvas'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['gpu_compositing'].startsWith("enabled")) { if (gpuinfo['gpu_compositing'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['video_decode'].startsWith("enabled")) { if (gpuinfo['video_decode'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['multiple_raster_threads'].startsWith("enabled")) { if (gpuinfo['multiple_raster_threads'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['oop_rasterization'].startsWith("enabled")) { if (gpuinfo['oop_rasterization'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['rasterization'].startsWith("enabled")) { if (gpuinfo['rasterization'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['opengl'].startsWith("enabled")) { if (gpuinfo['opengl'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['skia_renderer'].startsWith("enabled")) { if (gpuinfo['skia_renderer'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['vulkan'].startsWith("enabled")) { if (gpuinfo['vulkan'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } if (gpuinfo['webgl'].startsWith("enabled")) { if (gpuinfo['webgl'] === "enabled") { gpuscore++; } else { gpuscore += 0.5; } } gpuperct = (gpuscore/maxscore)*100; } else { gpuperct = 100; } pubver = require('../package.json').version; pvpart = pubver.split("."); if (pvpart.length === 3) { intver = pvpart[0] + "." + pvpart[1]; } else { intver = "unknown"; } if (require('@electron/remote').getCurrentWindow().mods.length > 0) { release = "mods+" + require('@electron/remote').getCurrentWindow().mods.length; } else { release = "official"; } if (gpuperct < 25) { perf = "fast"; } else if (gpuperct < 50) { perf = "fancy"; } else { perf = "fabulous"; } if (location.search === "") { game = "Local multiplayer game"; } else if (location.search === "?sp") { game = "Singleplayer game"; } else if (location.search === "?online") { game = require("../online/server.json").hostname + ":" + require("../online/server.json").port; } tps = -1; cping = -1; changedDataLeft = "playing: %false%" changedDataRight = "" immutableDataLeft = "Kartik " + pubver + " (" + intver + "/" + require('../package.json').channel + "+" + release + ")\n%tps% tps T:" + perf + ";vsync\n" + game + " @ %ping% ms ticks"; immutableDataRight = "Electron: " + process.versions.electron + " " + process.arch; credits = "Debug: start runtime with debug argument\nFor help: https://kartik.hopto.org" setInterval(() => { if (!debugshow) { return; } leftparts = (immutableDataLeft + "\n" + changedDataLeft + "\n\n" + credits).split("\n"); lefttext = "" + leftparts.join("
") + ""; rightparts = (immutableDataRight + "\n" + changedDataRight).split("\n"); righttext = "" + rightparts.join("
") + ""; document.getElementById("debug-left").innerHTML = lefttext.replaceAll("%tps%", tps).replaceAll("%ping%", cping).replaceAll("%false%", "false").replaceAll("%true%", "true"); document.getElementById("debug-right").innerHTML = righttext; }, 100) var filterStrength = 20; var frameTime = 0, lastLoop = new Date, thisLoop; setInterval(() => { if (!debugshow) { return; } var thisFrameTime = (thisLoop=new Date) - lastLoop; frameTime+= (thisFrameTime - frameTime) / filterStrength; lastLoop = thisLoop; }, 50) require('systeminformation').graphics().then((data) => { global.gpudata = data; }); setInterval(() => { if (!debugshow) { return; } tps = (1000/frameTime).toFixed(1); if (typeof ping === "number") { cping = ping; } else { cping = 0; } if (started) { changedDataLeft = "playing: %true%"; changedDataLeft += "\n\n0$: XY: " + document.getElementById('car0').style.left.split("px")[0] + " / " + document.getElementById('car0').style.top.split("px")[0] c0rotate = document.getElementById('car0').style.transform.split("rotate(")[1].split("deg)")[0]; if (c0rotate === "90") { changedDataLeft += "\n0$: Facing: south (Towards negative Y)"; } else if (c0rotate === "-90") { changedDataLeft += "\n0$: Facing: north (Towards negative Y)"; } else if (c0rotate === "0") { changedDataLeft += "\n0$: Facing: east (Towards positive X)"; } else if (c0rotate === "180") { changedDataLeft += "\n0$: Facing: west (Towards negative X)"; } changedDataLeft += "\n0$: Speed: A: " + car0cspeed.toFixed(2) + " R: " + (car0speed - car0cspeed).toFixed(2) + " M: " + car0speed.toFixed(2); changedDataLeft += "\n0$: Laps: " + document.getElementById('laps-car0').innerText + "/5"; changedDataLeft += "\n0$: Model: " + selectedModel0; changedDataLeft += "\n\n1$: XY: " + document.getElementById('car1').style.left.split("px")[0] + " / " + document.getElementById('car1').style.top.split("px")[0] c0rotate = document.getElementById('car1').style.transform.split("rotate(")[1].split("deg)")[0]; if (c0rotate === "90") { changedDataLeft += "\n1$: Facing: south (Towards negative Y)"; } else if (c0rotate === "-90") { changedDataLeft += "\n1$: Facing: north (Towards negative Y)"; } else if (c0rotate === "0") { changedDataLeft += "\n1$: Facing: east (Towards positive X)"; } else if (c0rotate === "180") { changedDataLeft += "\n1$: Facing: west (Towards negative X)"; } changedDataLeft += "\n1$: Speed: A: " + car1cspeed.toFixed(2) + " R: " + (car1speed - car1cspeed).toFixed(2) + " M: " + car1speed.toFixed(2); changedDataLeft += "\n1$: Laps: " + document.getElementById('laps-car1').innerText + "/5"; changedDataLeft += "\n1$: Model: " + selectedModel1; changedDataLeft += "\n" + oil(0) + oil(1) + oil(2) + oil(3) + oil(4); changedDataLeft += "\n\nMusic: " + i; changedDataLeft += "\nCircuit: " + rand; } else { changedDataLeft = "playing: %false%" } usedMem = (process.memoryUsage().heapUsed / 1000000).toFixed(2); totalMem = (process.memoryUsage().heapTotal / 1000000).toFixed(2); percMem = Math.round((process.memoryUsage().heapUsed / process.memoryUsage().heapTotal)*100); allocateMem = (process.memoryUsage().rss / 1000000).toFixed(2); changedDataRight = "Mem: " + percMem + "% " + usedMem + "/" + totalMem + "MB" changedDataRight += "\nAllocated: " + allocateMem + "MB" changedDataRight += "\n\nCPU: (" + process.getCPUUsage().percentCPUUsage.toFixed(2) + "%) " + require('os').cpus().length + "x " + require('os').cpus()[0].model.trim() + " @ " + (require('os').cpus()[0].speed/1000).toFixed(2) + "GHz" try { changedDataRight += "\n\nDisplay: " + window.innerWidth + "x" + window.innerHeight + " (" + gpudata.controllers[0].vendor + ")"; changedDataRight += "\n" + gpudata.controllers[0].model; try { if (gpudriverdata.gpuDevice[0].driverVendor !== undefined) { dvendor = gpudriverdata.gpuDevice[0].driverVendor; } else { dvendor = "<Unknown>"; } if (gpudriverdata.gpuDevice[0].driverVersion !== undefined) { dversion = gpudriverdata.gpuDevice[0].driverVersion; } else { dversion = "<Unknown>"; } } catch (e) { dvendor = "<Unknown>"; dversion = "<Unknown>"; } changedDataRight += "\n" + dvendor + " - " + dversion; } catch (e) { console.error(e); } },1000); window.addEventListener("load", () => { require('@electron/remote').app.getGPUInfo('complete').then((data) => { global.gpudriverdata = data; }); })