Bonk kitten

Adds an cat which wanders around your screen and sometimes tries to make you die

// ==UserScript==
// @name         Bonk kitten
// @namespace    https://bonk.io/
// @version      0.4
// @description  Adds an cat which wanders around your screen and sometimes tries to make you die
// @author       You
// @match        https://bonk.io/*
// @run-at       document-start
// @grant        none
// @noframes
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bonk.io
// ==/UserScript==

function keyEvent (keyCode, type, modifiers) {
    let gdocument = document.getElementById("maingameframe").contentDocument;
	var evtName = (typeof(type) === "string") ? "key" + type : "keydown";
	var modifier = (typeof(modifiers) === "object") ? modifier : {};

	var event = document.createEvent("HTMLEvents");
	event.initEvent(evtName, true, false);
	event.keyCode = keyCode;

	for (var i in modifiers) {
		event[i] = modifiers[i];
	}

	gdocument.dispatchEvent(event);
}

//let SKIN = new Image();
//let CAT = new Image();
//SKIN.src = 'https://bonkclans.itsdawildshadow.repl.co/file/keyboard.png';
//CAT.src = 'https://bonkclans.itsdawildshadow.repl.co/file/cat.png';
//console.log(SKIN);
// TEMPORARY SOLUTION!
let mouse = {
 x: 0,
 y: 0,
 lx: 0,
 ly: 0,
 vx: 0,
 vy: 0,
 drag: false
}
let canvas = document.createElement("canvas");

canvas.style.width = window.innerWidth+"px";
canvas.style.position = 'fixed';
canvas.style.height = window.innerHeight+"px";
canvas.style.left = "0px";
canvas.style.top = "0px";
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.zIndex = 10;
canvas.style.pointerEvents = "none";
setTimeout(() => {
document.body.appendChild(canvas);
},4000);
let cvt = canvas.getContext("2d");

let assistent = {
    x: 0,
    y: 0,
    vy: 0,
    vx: 0,
    mode: "idle",
    right: false,
    left: false,
    jump: false
}

let lastCall = Date.now();
let decision = 1;
let randomInput = 0;
let lastInput = [0,0,0,0];
let lasterInput = [0,0,0,0];
let wander = 1;

let lastScroll = 0;

window.onscroll = function (e)
{
    assistent.y += lastScroll-(document.documentElement.scrollTop || document.body.scrollTop);
    if (assistent.y > canvas.height-50){
        assistent.vy = ((document.documentElement.scrollTop || document.body.scrollTop)-lastScroll)*3;
        assistent.y = canvas.height-50;
    }
        if (assistent.y < 50){
        assistent.vy = (lastScroll-(document.documentElement.scrollTop || document.body.scrollTop))*3;
        assistent.y = 50;
    }
    lastScroll = document.documentElement.scrollTop || document.body.scrollTop
}

window.addEventListener("resize", (event) => {
canvas.style.width = window.innerWidth+"px";
canvas.style.position = 'fixed';
canvas.style.height = window.innerHeight+"px";
canvas.style.left = "0px";
canvas.style.top = "0px";
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});

setInterval(() => {
    let dt = (Date.now()-lastCall)/1000;
    mouse.vx = (mouse.x-mouse.lx)/dt;
    mouse.vy = (mouse.y-mouse.ly)/dt;
    if (mouse.drag){
     assistent.x = mouse.x;
     assistent.y = mouse.y;
     assistent.vx = mouse.vx/3;
     assistent.vy = mouse.vy/3;
    }
    lastCall = Date.now();
    decision -= dt;
    if (decision <= 0){
     decision = Math.random()*6;
         let mode = Math.floor(Math.random()*5);
    if (mode <= 3){
    assistent.mode = 'type';
    }
        if (mode == 4){
    assistent.mode = 'wander';
    }
        if (mode == 5){
    assistent.mode = 'idle';
    }
    }
    if (assistent.mode == "wander"){
          decision += dt/2;
          wander -= dt;
    if (wander <= 0){
     wander = (Math.random()*3);
     if (Math.random()*3 <= 1){
         assistent.left = true;
         assistent.right = false;
     }else if (Math.random()*3 <= 1){
         assistent.right = true;
         assistent.left = false;
     }else{
         assistent.right = false;
          assistent.left = false;
     }
    }
    }
    cvt.clearRect(0,0,canvas.width,canvas.height);
    cvt.fillStyle = 'white';
    cvt.beginPath();
    cvt.arc(assistent.x,assistent.y,25,0,Math.PI*2);
    cvt.fill();
    cvt.closePath();
    //if (CAT.complete){
     //cvt.drawImage(CAT,assistent.x-25,assistent.y-25,50,50);
    //}
    if (assistent.mode == 'type'){
        decision -= dt*1.5
        //cvt.drawImage(SKIN,assistent.x-60,assistent.y-20,120,60)
        if (randomInput <= 0){
            randomInput = Math.random()*2;
            lastInput = [Math.floor(Math.random()*3)-1,Math.floor(Math.random()*3)-1,Math.floor(Math.random()*3)-1,Math.floor(Math.random()*3)-1]
        }
        randomInput -= dt;
        if (lasterInput !== lastInput){
        if (lastInput[1] > 0){
         keyEvent(68);
         keyEvent(65,'up');
        }else if (lastInput[1] < 0){
         keyEvent(68,'up');
         keyEvent(65);
        }else{
         keyEvent(68,'up');
         keyEvent(65,'up');
        }
                if (lastInput[1] > 0){
         keyEvent(87);
         keyEvent(83,'up');
        }else if (lastInput[1] < 0){
         keyEvent(87,'up');
         keyEvent(83);
        }else{
         keyEvent(83,'up');
         keyEvent(87,'up');
        }
       if (lastInput[2] > 0){
         keyEvent(32);
        }else{
         keyEvent(32,'up');
        }
               if (lastInput[3] > 0){
         keyEvent(90);
        }else{
         keyEvent(90,'up');
        }
         lasterInput = lastInput;
        }
    }

    assistent.vy += 200*dt;
    assistent.y += assistent.vy*dt;
    if (assistent.right){
     assistent.vx += 30*dt;
    }else if (assistent.left){
     assistent.vx -= 30*dt;
    }else{
     assistent.vx *= 0.99;
    }
    assistent.x += assistent.vx*dt;
    if (assistent.x < 25){
     assistent.x = 25;
     assistent.vx *= -0.9;
    }
    if (assistent.x > canvas.width-25){
     assistent.x = canvas.width-25;
     assistent.vx *= -0.9;
    }
    if (assistent.y > canvas.height-30){
    assistent.y = canvas.height-30;
    assistent.vy *= -0.6
    }
        if (assistent.y < 50){
    assistent.y = 50;
    assistent.vy *= -0.6
    }
},0);