Greasy Fork is available in English.
https://github.com/Cazka/diepAPI
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/433681/1100602/diepAPI.js
// ==UserScript==
// @name diepAPI
// @description https://github.com/Cazka/diepAPI
// @version 3.0.0
// @author Cazka
// @match https://diep.io/*
// @icon https://www.google.com/s2/favicons?domain=diep.io
// @namespace http://greasyfork.icu/users/541070
// @run-at document-start
// @grant none
// ==/UserScript==
(() => {
const _window = "undefined" == typeof unsafeWindow ? window : unsafeWindow;
if (_window.diepAPI) return;
//diepAPI start
var diepAPI;
(() => {
"use strict";
var e = {
d: (t, n) => {
for (var s in n) e.o(n, s) && !e.o(t, s) && Object.defineProperty(t, s, { enumerable: !0, get: n[s] });
},
o: (e, t) => Object.prototype.hasOwnProperty.call(e, t),
r: (e) => {
"undefined" != typeof Symbol &&
Symbol.toStringTag &&
Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }),
Object.defineProperty(e, "__esModule", { value: !0 });
},
},
t = {};
e.r(t), e.d(t, { apis: () => n, core: () => s, extensions: () => i, tools: () => o, types: () => a });
var n = {};
e.r(n),
e.d(n, {
arena: () => u,
camera: () => w,
game: () => l,
minimap: () => h,
player: () => f,
playerMovement: () => v,
scaling: () => p,
});
var s = {};
e.r(s), e.d(s, { CanvasKit: () => c, EventEmitter: () => d, Movement: () => m, Vector: () => r });
var i = {};
e.r(i), e.d(i, { debugTool: () => T, entityManager: () => b });
var o = {};
e.r(o), e.d(o, { backgroundOverlay: () => S, overlay: () => R });
var a = {};
e.r(a), e.d(a, { Entity: () => C, EntityColor: () => k, EntityType: () => g });
class r {
x;
y;
constructor(e, t) {
(this.x = e), (this.y = t);
}
static len(e) {
return Math.sqrt(e.x ** 2 + e.y ** 2);
}
static round(e) {
return new r(Math.round(e.x), Math.round(e.y));
}
static scale(e, t) {
return new r(e * t.x, e * t.y);
}
static unscale(e, t) {
return new r(t.x / e, t.y / e);
}
static add(e, t) {
return new r(e.x + t.x, e.y + t.y);
}
static subtract(e, t) {
return new r(e.x - t.x, e.y - t.y);
}
static multiply(e, t) {
return new r(e.x * t.x, e.y * t.y);
}
static divide(e, t) {
return new r(e.x / t.x, e.y / t.y);
}
static distance(e, t) {
return r.len(r.subtract(e, t));
}
static centroid(...e) {
const t = e.reduce((e, t) => r.add(e, t), new r(0, 0));
return r.scale(1 / e.length, t);
}
static radius(...e) {
const t = r.centroid(...e);
return e.reduce((e, n) => e + r.distance(t, n), 0) / e.length;
}
}
class c {
static createCanvas() {
const e = document.createElement("canvas");
return (
(e.className = "CanvasKit-bypass"),
(e.style.pointerEvents = "none"),
(e.style.position = "fixed"),
(e.style["z-index"] = 1),
(e.style.top = "0px"),
(e.style.left = "0px"),
(e.style.right = "0px"),
(e.style.bottom = "0px"),
(e.style.width = "100%"),
(e.style.height = "100%"),
e
);
}
static hookRAF(e) {
window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, {
apply: (t, n, s) => (e(), Reflect.apply(t, n, s)),
});
}
static hookCtx(e, t) {
const n = _window.CanvasRenderingContext2D.prototype;
n[e] = new Proxy(n[e], {
apply: (e, n, s) => ("CanvasKit-bypass" !== n.canvas.className && t(e, n, s), Reflect.apply(e, n, s)),
});
}
static overrideCtx(e, t) {
const n = _window.CanvasRenderingContext2D.prototype;
n[e] = new Proxy(n[e], {
apply: (e, n, s) => ("CanvasKit-bypass" !== n.canvas.className ? t(e, n, s) : Reflect.apply(e, n, s)),
});
}
static hookPolygon(e, t) {
let n = 0,
s = [];
c.hookCtx("beginPath", (e, t, i) => {
(n = 1), (s = []);
}),
c.hookCtx("moveTo", (e, t, i) => {
if (1 === n) return n++, void s.push(new r(i[0], i[1]));
n = 0;
}),
c.hookCtx("lineTo", (t, i, o) => {
if (n >= 2 && n <= e) return n++, void s.push(new r(o[0], o[1]));
n = 0;
}),
c.hookCtx("fill", (i, o, a) => {
if (n === e + 1) return n++, void t(s, o);
n = 0;
});
}
}
class d extends EventTarget {
emit(e, ...t) {
this.dispatchEvent(new CustomEvent(e, { detail: t }));
}
on(e, t) {
this.addEventListener(e, (e) => Reflect.apply(t, this, e.detail));
}
once(e, t) {
this.addEventListener(e, (e) => Reflect.apply(t, this, e.detail), { once: !0 });
}
off(e, t) {
this.removeEventListener(e, t);
}
}
const l = new (class extends d {
#e = !1;
constructor() {
super(), c.hookRAF(() => this.#t());
}
#t() {
this.#e || void 0 === window.input || ((this.#e = !0), this.#n()), super.emit("frame");
}
#n() {
setTimeout(() => super.emit("ready"), 100);
}
})(),
h = new (class {
#s = new r(1, 1);
#i = new r(0, 0);
#o = new r(1, 1);
#a = new r(1, 1);
#r = new r(0.5, 0.5);
#c = !1;
constructor() {
l.once("ready", () => {
_window.input.set_convar("ren_minimap_viewport", "true"),
(_window.input.set_convar = new Proxy(_window.input.set_convar, {
apply: (e, t, n) => {
if ("ren_minimap_viewport" !== n[0]) return Reflect.apply(e, t, n);
this.#c = n[1];
},
}));
}),
this.#d(),
this.#l(),
this.#h();
}
get minimapDim() {
return this.#s;
}
get minimapPos() {
return this.#i;
}
get viewportDim() {
return this.#o;
}
get viewportPos() {
return this.#a;
}
get arrowPos() {
return this.#r;
}
#d() {
c.hookCtx("strokeRect", (e, t, n) => {
const s = t.getTransform();
(this.#s = new r(s.a, s.d)), (this.#i = new r(s.e, s.f));
});
}
#l() {
c.overrideCtx("fillRect", (e, t, n) => {
const s = t.getTransform();
return 0.1 !== t.globalAlpha ||
Math.abs(s.a / s.d - window.innerWidth / window.innerHeight) >
(window.innerWidth / window.innerHeight) * 5e-5
? Reflect.apply(e, t, n)
: ((this.#o = new r(s.a, s.d)), (this.#a = new r(s.e, s.f)), this.#c ? Reflect.apply(e, t, n) : void 0);
});
}
#h() {
c.hookPolygon(3, (e, t) => {
const n = Math.round(r.distance(e[0], e[1])),
s = Math.round(r.distance(e[0], e[2])),
i = Math.round(r.distance(e[1], e[2]));
if (n === s && s === i) return;
const o = r.centroid(...e),
a = r.subtract(o, this.#i),
c = r.divide(a, this.#s);
this.#r = c;
});
}
})(),
w = new (class {
get position() {
const e = r.add(h.viewportPos, r.unscale(2, h.viewportDim)),
t = r.subtract(e, h.minimapPos),
n = r.divide(t, h.minimapDim);
return u.scale(n);
}
})(),
p = new (class {
#w = 1;
#p = !1;
constructor() {
setTimeout(() => {
_window.input.set_convar = new Proxy(_window.input.set_convar, {
apply: (e, t, n) => {
"ren_solid_background" === n[0] ? (this.#p = n[1]) : Reflect.apply(e, t, n);
},
});
}, 1e3),
c.overrideCtx("stroke", (e, t, n) =>
"#cdcdcd" !== t.fillStyle || 0 === t.globalAlpha
? Reflect.apply(e, t, n)
: ((this.#w = 10 * t.globalAlpha), this.#p ? void 0 : Reflect.apply(e, t, n))
);
}
get windowRatio() {
return Math.max(_window.innerWidth / 1920, _window.innerHeight / 1080);
}
get scalingFactor() {
return this.#w;
}
get fov() {
return this.#w / this.windowRatio;
}
toArenaUnits(e) {
return r.unscale(this.#w, e);
}
toCanvasUnits(e) {
return r.scale(this.#w, e);
}
toArenaPos(e) {
const t = r.subtract(e, this.screenToCanvas(new r(_window.innerWidth / 2, _window.innerHeight / 2))),
n = this.toArenaUnits(t);
return r.add(n, w.position);
}
toCanvasPos(e) {
const t = r.subtract(e, w.position),
n = this.toCanvasUnits(t);
return r.add(n, this.screenToCanvas(new r(_window.innerWidth / 2, _window.innerHeight / 2)));
}
screenToCanvasUnits(e) {
return e * _window.devicePixelRatio;
}
canvasToScreenUnits(e) {
return e / _window.devicePixelRatio;
}
screenToCanvas(e) {
return r.scale(_window.devicePixelRatio, e);
}
canvasToScreen(e) {
return r.scale(1 / _window.devicePixelRatio, e);
}
})(),
u = new (class {
#u = 1;
constructor() {
setInterval(() => {
const e = r.divide(h.minimapDim, h.viewportDim),
t = r.multiply(e, p.screenToCanvas(new r(_window.innerWidth, _window.innerHeight))),
n = r.round(p.toArenaUnits(t));
this.#u = n.x;
}, 16);
}
get size() {
return this.#u;
}
scale(e) {
const t = (e) => Math.round(this.#u * (e - 0.5));
return new r(t(e.x), t(e.y));
}
unscale(e) {
const t = (e) => e / this.#u + 0.5;
return new r(t(e.x), t(e.y));
}
})(),
y = new (class {
#y;
#m;
connected;
constructor() {
(this.#y = [0, 0, 0, 0]),
(this.#m = [...Array(17)].map((e) => ({ pressed: !1 }))),
(this.connected = !1),
(window.navigator.getGamepads = new Proxy(window.navigator.getGamepads, {
apply: (e, t, n) => (this.connected ? [this.#v()] : Reflect.apply(e, t, n)),
}));
}
set x(e) {
this.#y[0] = e;
}
set y(e) {
this.#y[1] = e;
}
set mx(e) {
this.#y[2] = e;
}
set my(e) {
this.#y[3] = e;
}
set leftMouse(e) {
this.#m[7].pressed = e;
}
set rightMouse(e) {
this.#m[6].pressed = e;
}
get x() {
return this.#y[0];
}
get y() {
return this.#y[1];
}
get mx() {
return this.#y[2];
}
get my() {
return this.#y[3];
}
get leftMouse() {
return this.#m[7].pressed;
}
get rightMouse() {
return this.#m[6].pressed;
}
#v() {
return { axes: this.#y, buttons: this.#m, mapping: "standard" };
}
})();
class m {
#x = new r(0, 0);
#f = new r(0, 0);
#g = 10;
#k = [];
#P = 0;
#C = performance.now();
get position() {
return this.#x;
}
get velocity() {
return this.#f;
}
predictPos(e) {
const t = (e + performance.now() - this.#C) / 1e3;
return r.add(this.#x, r.scale(t, this.#f));
}
updatePos(e) {
this.#_(e), (this.#x = e);
}
#_(e) {
const t = performance.now(),
n = (t - this.#C) / 1e3;
if (0 === n) return;
this.#C = t;
const s = r.unscale(n, r.subtract(e, this.#x));
(this.#k[this.#P++] = s),
(this.#P %= this.#g),
(this.#f = r.unscale(
this.#k.length,
this.#k.reduce((e, t) => r.add(e, t))
));
}
}
const v = new (class extends m {
constructor() {
super(), l.on("frame", () => super.updatePos(u.scale(h.arrowPos)));
}
})(),
x = (e) => new Promise((t, n) => setTimeout(t, e)),
f = new (class extends d {
#b = !0;
#R = !1;
#T = new r(0, 0);
#S = new r(0, 0);
#U = _window.localStorage.gamemode;
#D = 1;
#M = "Tank";
constructor() {
super(),
l.once("ready", () => {
l.on("frame", () => {
const e = !_window.input.should_prevent_unload();
this.#b != e && ((this.#b = e), this.#b ? this.#A() : this.#N());
}),
l.on("frame", () => {
this.#S = p.toArenaPos(this.#T);
});
const e = document.getElementById("canvas");
(e.onmousemove = new Proxy(e.onmousemove, {
apply: (e, t, n) => {
if (!this.#R) return this.#B(n[0]), Reflect.apply(e, t, n);
},
})),
(e.onmousedown = new Proxy(e.onmousedown, {
apply: (e, t, n) => {
if (!this.#R) return this.#E(n[0]), Reflect.apply(e, t, n);
},
})),
(e.onmouseup = new Proxy(e.onmouseup, {
apply: (e, t, n) => {
if (!this.#R) return this.#H(n[0]), Reflect.apply(e, t, n);
},
})),
(_window.onkeydown = new Proxy(_window.onkeydown, {
apply: (e, t, n) => (this.#I(n[0]), Reflect.apply(e, t, n)),
})),
(_window.onkeyup = new Proxy(_window.onkeyup, {
apply: (e, t, n) => (this.#W(n[0]), Reflect.apply(e, t, n)),
})),
c.hookCtx("fillText", (e, t, n) => {
const s = n[0].match(/^Lvl (\d+) (\w+\s?\w*)$/);
if (null == s) return;
const i = Number(s[1]),
o = s[2];
for (; i > this.#D + 1; ) super.emit("level", ++this.#D);
i !== this.#D && super.emit("level", i),
o !== this.#M && super.emit("tank", o),
(this.#D = i),
(this.#M = s[2]);
});
});
}
get position() {
return v.position;
}
get velocity() {
return v.velocity;
}
get mouse() {
return this.#S;
}
get isDead() {
return this.#b;
}
get gamemode() {
return this.#U;
}
get level() {
return this.#D;
}
get tank() {
return this.#M;
}
predictPos(e) {
return v.predictPos(e);
}
async #A() {
await x(50), super.emit("dead");
}
async #N() {
(this.#U = _window.localStorage.gamemode), await x(50), super.emit("spawn");
}
useGamepad(e) {
y.connected = e;
}
keyDown(e) {
if ("string" == typeof e) {
if (1 != e.length) throw new Error(`diepAPI: Unsupported key: ${e}`);
e = e.toUpperCase().charCodeAt(0);
}
_window.input.keyDown(e), this.#I({ keyCode: e });
}
keyUp(e) {
if ("string" == typeof e) {
if (1 != e.length) throw new Error(`diepAPI: Unsupported key: ${e}`);
e = e.toUpperCase().charCodeAt(0);
}
_window.input.keyUp(e), this.#W({ keyCode: e });
}
async keyPress(e) {
this.keyDown(e), await x(200), this.keyUp(e), await x(10);
}
async spawn(e, t = 0) {
this.#b &&
(void 0 !== e && (document.getElementById("textInput").value = e),
await this.keyPress(13),
await x(250),
await this.spawn(e, t + 1));
}
async upgrade_stat(e, t) {
if (e < 1 || e > 8) throw `diepAPI: ${e} is not a supported stat`;
this.keyDown(85);
for (let n = 0; n < t; n++) await this.keyPress(48 + e);
this.keyUp(85), await x(250);
}
async upgrade_tank(e) {
const t = (e -= 1) % 2,
n = Math.floor(e / 2),
s = p.screenToCanvasUnits(p.windowRatio * (115 * t + 97.5)),
i = p.screenToCanvasUnits(p.windowRatio * (110 * n + 120));
(this.#R = !0),
_window.input.mouse(s, i),
await this.keyPress(1),
await x(200),
(this.#R = !1),
await x(1500);
}
moveTo(e) {
if (y.connected) {
const t = r.subtract(e, this.position),
n = r.len(t);
if (0 === n) return (y.x = 0), void (y.y = 0);
const s = r.scale(1 / n, t);
(y.x = s.x), (y.y = s.y);
} else {
const t = r.subtract(e, this.position);
t.x > 0
? (this.keyUp("a"), this.keyDown("d"))
: t.x < 0
? (this.keyUp("d"), this.keyDown("a"))
: (this.keyUp("a"), this.keyUp("d")),
t.y > 0
? (this.keyUp("w"), this.keyDown("s"))
: t.y < 0
? (this.keyUp("s"), this.keyDown("w"))
: (this.keyUp("w"), this.keyUp("s"));
}
}
lookAt(e) {
const t = p.toCanvasPos(e);
_window.input.mouse(t.x, t.y), this.#B({ clientX: t.x, clientY: t.y });
}
#B(e) {
if (((this.#T = p.screenToCanvas(new r(e.clientX, e.clientY))), y.connected)) {
const e = p.toArenaPos(this.#T),
t = r.subtract(e, this.position);
let n = r.scale(p.fov / 1200 / 1.1, t);
const s = r.len(n);
0 !== s && s < 0.15 && (n = r.scale(0.15 / s, n)), (y.mx = n.x), (y.my = n.y);
}
}
#E(e) {
y.connected && this.#I({ keyCode: e.which });
}
#H(e) {
y.connected && this.#W({ keyCode: e.which });
}
#I(e) {
if ((super.emit("keydown", e.keyCode), y.connected))
switch (e.keyCode) {
case 37:
case 65:
y.x = -1;
break;
case 40:
case 83:
y.y = 1;
break;
case 38:
case 87:
y.y = -1;
break;
case 39:
case 68:
y.x = 1;
break;
case 1:
case 32:
y.leftMouse = !0;
break;
case 3:
case 16:
y.rightMouse = !0;
}
}
#W(e) {
if ((super.emit("keyup", e.keyCode), y.connected))
switch (e.keyCode) {
case 37:
case 65:
case 39:
case 68:
y.x = 0;
break;
case 40:
case 83:
case 38:
case 87:
y.y = 0;
break;
case 1:
case 32:
y.leftMouse = !1;
break;
case 3:
case 16:
y.rightMouse = !1;
}
}
})();
var g, k;
!(function (e) {
(e[(e.Player = 0)] = "Player"),
(e[(e.Bullet = 1)] = "Bullet"),
(e[(e.Drone = 2)] = "Drone"),
(e[(e.Trap = 3)] = "Trap"),
(e[(e.Square = 4)] = "Square"),
(e[(e.Triangle = 5)] = "Triangle"),
(e[(e.Pentagon = 6)] = "Pentagon"),
(e[(e.AlphaPentagon = 7)] = "AlphaPentagon"),
(e[(e.Crasher = 8)] = "Crasher"),
(e[(e.UNKNOWN = 9)] = "UNKNOWN");
})(g || (g = {})),
(function (e) {
(e.TeamBlue = "#00b2e1"),
(e.TeamRed = "#f14e54"),
(e.TeamPurple = "#bf7ff5"),
(e.TeamGreen = "#00e16e"),
(e.Square = "#ffe869"),
(e.Triangle = "#fc7677"),
(e.Pentagon = "#768dfc"),
(e.AlphaPentagon = "#768dfc"),
(e.Crasher = "#f177dd"),
(e.NecromancerDrone = "#fcc376");
})(k || (k = {}));
const P = [k.TeamBlue, k.TeamRed, k.TeamPurple, k.TeamGreen];
class C extends m {
type;
parent;
extras;
constructor(e, t, n) {
super(), (this.type = e), (this.parent = t), (this.extras = n);
}
updatePos(e) {
super.updatePos(e);
}
}
class _ {
onload;
#$ = !1;
constructor(e) {
this.onload = e;
}
load() {
this.#$ || ((this.#$ = !0), this.onload());
}
}
const b = new (class extends _ {
#z = [];
#L = [];
constructor() {
super(() => {
l.on("frame", () => {
(this.#z = this.#L), (this.#L = []);
}),
this.#F(),
this.#O(),
this.#V(),
this.#K();
});
}
get entities() {
return this.#z;
}
getPlayer() {
return this.#z.filter((e) => e.type == g.Player && r.distance(e.position, v.position) < 28)[0];
}
#q(e, t, n = {}) {
const s = this.#G(e, t);
let i;
if (-1 === s) {
let s = null;
if (e == g.Bullet) {
const e = this.#G(g.Player, t, 300);
e >= 0 && (s = this.entities[e]);
}
i = new C(e, s, { id: Math.random().toString(36).slice(2, 5), timestamp: performance.now(), ...n });
} else i = this.#z[s];
i.updatePos(t), this.#L.push(i);
}
#G(e, t, n = 42) {
let s = -1,
i = 1 / 0;
return (
this.#z.forEach((n, o) => {
if (n.type !== e) return;
const a = r.distance(n.position, t);
a < i && ((i = a), (s = o));
}),
i > n ? -1 : s
);
}
#F() {
c.hookPolygon(3, (e, t) => {
const n = Math.round(r.distance(e[0], e[1])),
s = Math.round(r.distance(e[0], e[2])),
i = Math.round(r.distance(e[1], e[2]));
if (n !== s || s !== i) return;
if ("#000000" === t.fillStyle) return;
e = e.map((e) => p.toArenaPos(e));
const o = r.centroid(...e),
a = Math.round(r.radius(...e)),
c = t.fillStyle;
let d;
switch (a) {
case 23:
case 30:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
P.includes(c) && (d = g.Drone);
break;
case 35:
k.Crasher === c && (d = g.Crasher);
break;
case 55:
k.Crasher === c && (d = g.Crasher), k.Triangle === c && (d = g.Triangle);
}
void 0 === d && (d = g.UNKNOWN), this.#q(d, o, { color: c, radius: a });
});
}
#O() {
c.hookPolygon(4, (e, t) => {
e = e.map((e) => p.toArenaPos(e));
const n = r.centroid(...e),
s = Math.round(r.radius(...e)),
i = t.fillStyle;
let o;
55 === s &&
(k.Square === i && (o = g.Square), (P.includes(i) || k.NecromancerDrone === i) && (o = g.Drone)),
void 0 === o && (o = g.UNKNOWN),
this.#q(o, n, { color: i, radius: s });
});
}
#V() {
c.hookPolygon(5, (e, t) => {
e = e.map((e) => p.toArenaPos(e));
const n = r.centroid(...e),
s = Math.round(r.radius(...e)),
i = t.fillStyle;
let o;
switch (s) {
case 75:
k.Pentagon === i && (o = g.Pentagon);
break;
case 200:
k.AlphaPentagon === i && (o = g.AlphaPentagon);
}
void 0 === o && (o = g.UNKNOWN), this.#q(o, n, { color: i, radius: s });
});
}
#K() {
let e,
t,
n,
s = 0;
const i = () => {
(e = p.toArenaPos(e)), (n = p.toArenaUnits(new r(n, n)).x);
let s = g.UNKNOWN;
(s = n > 53 ? g.Player : g.Bullet), this.#q(s, e, { color: t, radius: n });
};
c.hookCtx("beginPath", (e, t, n) => {
3 === s ? (3 !== s ? (s = 0) : s++) : (s = 1);
}),
c.hookCtx("arc", (o, a, c) => {
if (1 === s) {
s++;
const t = a.getTransform();
return (e = new r(t.e, t.f)), void (n = t.a);
}
return 4 === s ? (s++, void (t = a.fillStyle)) : 6 === s ? (s++, void i()) : void (s = 0);
}),
c.hookCtx("fill", (e, t, n) => {
2 !== s && 5 !== s ? (s = 0) : s++;
});
}
})(),
R = new (class {
canvas;
ctx;
constructor() {
(this.canvas = c.createCanvas()),
(this.ctx = this.canvas.getContext("2d")),
document.body.appendChild(this.canvas),
_window.addEventListener("resize", () => this.#j()),
l.on("frame", () => this.#X()),
this.#j();
}
#j() {
(this.canvas.width = _window.innerWidth * _window.devicePixelRatio),
(this.canvas.height = _window.innerHeight * _window.devicePixelRatio);
}
#X() {
(this.canvas.width = _window.innerWidth * _window.devicePixelRatio),
(this.canvas.height = _window.innerHeight * _window.devicePixelRatio),
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height),
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
}
})(),
T = new (class extends _ {
#Y = !1;
#J = !1;
#Q = !1;
#Z = !1;
#ee = !1;
constructor() {
super(() => {
b.load(),
l.on("frame", () => {
b.entities.forEach((e) => {
const t = p.toCanvasPos(e.position),
n = p.toCanvasPos(e.predictPos(1e3)),
s = p.toCanvasUnits(new r(2 * e.extras.radius, 2 * e.extras.radius));
this.#Y && this.#te(e, t, s),
this.#J && this.#ne(t, n),
this.#Q && this.#se(e, t),
this.#Z && this.#ie(e, t, s);
}),
this.#ee && this.#oe();
});
});
}
drawAll(e) {
(this.#Y = e), (this.#J = e), (this.#Q = e), (this.#Z = e), (this.#ee = e);
}
drawBoundingBox(e) {
this.#Y = e;
}
drawVelocity(e) {
this.#J = e;
}
drawParent(e) {
this.#Q = e;
}
drawInfo(e) {
this.#Z = e;
}
drawStats(e) {
this.#ee = e;
}
#te(e, t, n) {
R.ctx.save(),
(R.ctx.strokeStyle = e.type === g.UNKNOWN ? "#ffffff" : e.extras.color),
(R.ctx.lineWidth = p.toCanvasUnits(new r(5, 5)).x),
R.ctx.strokeRect(t.x - n.x / 2, t.y - n.y / 2, n.x, n.y),
R.ctx.restore();
}
#ne(e, t) {
R.ctx.save(),
(R.ctx.strokeStyle = "#000000"),
(R.ctx.lineWidth = p.toCanvasUnits(new r(5, 5)).x),
R.ctx.beginPath(),
R.ctx.moveTo(e.x, e.y),
R.ctx.lineTo(t.x, t.y),
R.ctx.stroke(),
R.ctx.restore();
}
#se(e, t) {
if (null === e.parent) return;
const n = p.toCanvasPos(e.parent.position);
R.ctx.save(),
(R.ctx.strokeStyle = "#8aff69"),
(R.ctx.lineWidth = p.toCanvasUnits(new r(5, 5)).x),
R.ctx.beginPath(),
R.ctx.moveTo(t.x, t.y),
R.ctx.lineTo(n.x, n.y),
R.ctx.stroke(),
R.ctx.restore();
}
#ie(e, t, n) {
R.ctx.save();
const s = p.toCanvasUnits(new r(30, 30)).x;
(R.ctx.font = s + "px Ubuntu"),
(R.ctx.fillStyle = "#ffffff"),
(R.ctx.strokeStyle = "#000000"),
(R.ctx.lineWidth = s / 5),
R.ctx.strokeText(
`${e.extras.id} ${Math.floor((performance.now() - e.extras.timestamp) / 1e3)}`,
t.x,
t.y - 0.7 * n.y
),
R.ctx.fillText(
`${e.extras.id} ${Math.floor((performance.now() - e.extras.timestamp) / 1e3)}`,
t.x,
t.y - 0.7 * n.y
),
R.ctx.restore();
}
#oe() {
const e = `Debug Tool:\n Game Info:\n gamemode: ${f.gamemode}\n entities: ${
b.entities.length
}\n \n Player Info:\n Is dead: ${f.isDead}\n level: ${f.level}\n tank: ${
f.tank
}\n position: ${Math.round(f.position.x)},${Math.round(f.position.y)}\n mouse: ${Math.round(
f.mouse.x
)},${Math.round(f.mouse.y)}\n velocity [units/seconds]: ${Math.round(
Math.hypot(f.velocity.x, f.velocity.y)
)}`;
R.ctx.save();
const t = 20 * _window.devicePixelRatio;
(R.ctx.font = `${t}px Ubuntu`),
(R.ctx.fillStyle = "#ffffff"),
(R.ctx.strokeStyle = "#000000"),
(R.ctx.lineWidth = t / 5),
e.split("\n").forEach((e, n) => {
R.ctx.strokeText(e, 0, 0.25 * _window.innerHeight + n * t * 1.05),
R.ctx.fillText(e, 0, 0.25 * _window.innerHeight + n * t * 1.05);
}),
R.ctx.restore();
}
})(),
S = new (class {
canvas;
ctx;
#ae;
#re;
constructor() {
(this.canvas = c.createCanvas()),
(this.ctx = this.canvas.getContext("2d")),
_window.addEventListener("resize", () => this.#j()),
l.on("frame", () => this.#X()),
this.#j(),
l.once("ready", () => {
(this.#ae = document.getElementById("canvas")), (this.#re = this.#ae.getContext("2d")), this.#ce();
});
}
#j() {
(this.canvas.width = _window.innerWidth * _window.devicePixelRatio),
(this.canvas.height = _window.innerHeight * _window.devicePixelRatio);
}
#X() {
(this.canvas.width = _window.innerWidth * _window.devicePixelRatio),
(this.canvas.height = _window.innerHeight * _window.devicePixelRatio),
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height),
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
}
#ce() {
c.overrideCtx("fillRect", (e, t, n) => {
if ("object" != typeof t.fillStyle) return Reflect.apply(e, t, n);
const s = Reflect.apply(e, t, n);
return (
this.#re.save(),
this.#re.setTransform(1, 0, 0, 1, 0, 0),
(this.#re.globalAlpha = 1),
this.#re.drawImage(this.canvas, 0, 0),
this.#re.restore(),
s
);
});
}
})();
diepAPI = t;
})();
//diepAPI end
_window.diepAPI = diepAPI;
})();