p5.disableFriendlyErrors = true;
console.log = function() {}
let allowRAISafe = false;
let showWASDKnowlage = true;
let showShootKnowlage = true;
let showAimKnowlage = true;
img: loadImage(assetsDir + "player.png"),
img: loadImage(assetsDir + "small.png"),
img: loadImage(assetsDir + "mid.png"),
img: loadImage(assetsDir + "large.png"),
img: loadImage(assetsDir + "boss.png"),
img: loadImage(assetsDir + "bigBoss.png"),
overlay = loadImage(assetsDir + "overlay.png");
crosshair = loadImage(assetsDir + "crosshair.png");
gameFont = loadFont(assetsDir + "LilLua.ttf");
for (let i = 0; i < 5; i++) {
shootSounds[i] = loadSound(assetsDir + "shoot" + i + ".wav");
damageSound = loadSound(assetsDir + "damage.wav");
explosionSound = loadSound(assetsDir + "explosion.wav")
let windowSize = getWindowSize();
createCanvas(windowSize.x, windowSize.y);
g = createGraphics(screenUnits.x, screenUnits.y);
player = new Entity.Entity(null, null, sprites.player, new Player.Control());
timeSlow -= (millis() - lastTime) * 0.006;
timeSlow = max(1, min(2.2, timeSlow));
frameRate(60 / timeSlow);
for (; i < bullets.length; i++) {
Bullet.update(bullets[i], kill);
entities[i].collider.remove();
for (; i < entities.length; i++) {
Entity.update(entities[i], kill);
if (RAITimer % RAIrate === 0) {
if (player.health > 0 && allowRAI) {
Player.RAI(player.control);
if (RAITimer % RAIrate === floor(RAIrate / 2)) {
if (player.health <= 0) {
g.textFont(gameFont, 32);
if (player.health > 0 && allowRAI) {
g.translate(-Level.scroll, 0);
for (let i = 0; i < entities.length; i++) {
for (let i = 0; i < bullets.length; i++) {
g.rect(333, 335, 303, 21);
for (i = 0; i < player.health; i++) {
g.rect(330 + 31 * i, 335, 30, 21);
if (mouseX !== 0 || mouseY !== 0) {
let mX = mouseX / width * screenUnits.x;
let mY = mouseY / height * screenUnits.y;
if (player.control.mouseAim || player.control.shootToMove) {
g.image(crosshair, round(mX - 9), round(mY - 9), 18, 18);
g.image(crosshair, round(mX - 4), round(mY - 4), 9, 9);
translate((noise(frameCount / 5, 2534) - 0.5) * screenShake, (noise(frameCount / 5, 7435) - 0.5) * screenShake);
screenShake = screenShake * 0.965;
screenShake = max(0, screenShake - 0.5);
image(g, 0, 0, width, height);
function windowResized() {
let windowSize = getWindowSize();
createCanvas(windowSize.x, windowSize.y);
g = createGraphics(screenUnits.x, screenUnits.y);
function getWindowSize() {
let s = min(window.innerWidth / screenUnits.x, (window.innerHeight - 1) / screenUnits.y);
let x = screenUnits.x * s;
let y = screenUnits.y * s;
let e = 255 - sqrt(abs(((RAITimer + RAIrate / 2) % RAIrate) - RAIrate / 2)) * 50;
let e2 = 255 - abs(((RAITimer + RAIrate / 2) % RAIrate) - RAIrate / 2) * 3;
let ae = (RAITimer % RAIrate) < RAIrate / 2;
if (RAITimer < RAIrate / 2) {
g.background(255, 0, 255, e);
let mX = mouseX / width * screenUnits.x;
let mY = mouseY / height * screenUnits.y;
if (player.control.mouseAim && ae) {
g.circle(mX, mY, 40 + e2 / 3);
if (player.control.lockX && ae) {
g.rect(player.position.x - Level.scroll, player.position.y, 32 + e2 / 10, 10000);
if (player.control.lockY && ae) {
g.rect(player.position.x - Level.scroll, player.position.y, 10000, 32 + e2 / 10);
if (player.control.shootToMove && ae) {
let angle = -atan2(mX - player.position.x + Level.scroll, player.position.y - mY);
let x1 = player.position.x - Level.scroll + sin(angle - PI / 2) * (16 + e2 / 20);
let y1 = player.position.y + cos(angle - PI / 2) * (16 + e2 / 20);
let x2 = player.position.x - Level.scroll + sin(angle + PI / 2) * (16 + e2 / 20);
let y2 = player.position.y + cos(angle + PI / 2) * (16 + e2 / 20);
g.triangle(mX, mY, x1, y1, x2, y2);
if (player.control.mouseAim && dist(mouseX, mouseY, pmouseX, pmouseY) > 3) {
if (keyDown("d") || keyDown(RIGHT_ARROW) || keyDown("a") || keyDown(LEFT_ARROW)) {
if (!player.control.lockX) {
if (keyDown("s") || keyDown(DOWN_ARROW) || keyDown("w") || keyDown(UP_ARROW)) {
if (!player.control.lockY) {