i6-oneko.js - bitreich-www - the bitreich www website generator Err bitreich.org 70 1Log /scm/bitreich-www/log.gph bitreich.org 70 1Files /scm/bitreich-www/files.gph bitreich.org 70 1Refs /scm/bitreich-www/refs.gph bitreich.org 70 1Tags /scm/bitreich-www/tag bitreich.org 70 i--- Err bitreich.org 70 i6-oneko.js (5243B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 // Stolen from https://outerproduct.net/oneko.js Err bitreich.org 70 i 2 // based on maia's oneko.js https://maia.crimew.gay/ Err bitreich.org 70 i 3 // based on oneko.js from https://github.com/adryd325/oneko.js, licensed under MIT, with art from https://twitter.com/_Anunnery Err bitreich.org 70 i 4 Err bitreich.org 70 i 5 function getRandomInt(min, max) { Err bitreich.org 70 i 6 min = Math.ceil(min); Err bitreich.org 70 i 7 max = Math.floor(max); Err bitreich.org 70 i 8 return Math.floor(Math.random() * (max - min) + min); Err bitreich.org 70 i 9 } Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 function oneko() { Err bitreich.org 70 i 12 const nekoEl = document.createElement("div"); Err bitreich.org 70 i 13 let nekoPosX = getRandomInt(32, window.innerWidth - 63); Err bitreich.org 70 i 14 let nekoPosY = getRandomInt(32, window.innerHeight - 63); Err bitreich.org 70 i 15 let mousePosX = nekoPosX - 32; Err bitreich.org 70 i 16 let mousePosY = nekoPosY - 32; Err bitreich.org 70 i 17 let frameCount = 0; Err bitreich.org 70 i 18 let idleTime = 0; Err bitreich.org 70 i 19 let idleAnimation = null; Err bitreich.org 70 i 20 let idleAnimationFrame = 0; Err bitreich.org 70 i 21 const nekoSpeed = 10; Err bitreich.org 70 i 22 const spriteSets = { Err bitreich.org 70 i 23 idle: [[-3, -3]], Err bitreich.org 70 i 24 alert: [[-7, -3]], Err bitreich.org 70 i 25 scratchSelf: [ Err bitreich.org 70 i 26 [-5, 0], Err bitreich.org 70 i 27 [-6, 0], Err bitreich.org 70 i 28 [-7, 0], Err bitreich.org 70 i 29 ], Err bitreich.org 70 i 30 scratchWallN: [ Err bitreich.org 70 i 31 [0, 0], Err bitreich.org 70 i 32 [0, -1], Err bitreich.org 70 i 33 ], Err bitreich.org 70 i 34 scratchWallS: [ Err bitreich.org 70 i 35 [-7, -1], Err bitreich.org 70 i 36 [-6, -2], Err bitreich.org 70 i 37 ], Err bitreich.org 70 i 38 scratchWallE: [ Err bitreich.org 70 i 39 [-2, -2], Err bitreich.org 70 i 40 [-2, -3], Err bitreich.org 70 i 41 ], Err bitreich.org 70 i 42 scratchWallW: [ Err bitreich.org 70 i 43 [-4, 0], Err bitreich.org 70 i 44 [-4, -1], Err bitreich.org 70 i 45 ], Err bitreich.org 70 i 46 tired: [[-3, -2]], Err bitreich.org 70 i 47 sleeping: [ Err bitreich.org 70 i 48 [-2, 0], Err bitreich.org 70 i 49 [-2, -1], Err bitreich.org 70 i 50 ], Err bitreich.org 70 i 51 N: [ Err bitreich.org 70 i 52 [-1, -2], Err bitreich.org 70 i 53 [-1, -3], Err bitreich.org 70 i 54 ], Err bitreich.org 70 i 55 NE: [ Err bitreich.org 70 i 56 [0, -2], Err bitreich.org 70 i 57 [0, -3], Err bitreich.org 70 i 58 ], Err bitreich.org 70 i 59 E: [ Err bitreich.org 70 i 60 [-3, 0], Err bitreich.org 70 i 61 [-3, -1], Err bitreich.org 70 i 62 ], Err bitreich.org 70 i 63 SE: [ Err bitreich.org 70 i 64 [-5, -1], Err bitreich.org 70 i 65 [-5, -2], Err bitreich.org 70 i 66 ], Err bitreich.org 70 i 67 S: [ Err bitreich.org 70 i 68 [-6, -3], Err bitreich.org 70 i 69 [-7, -2], Err bitreich.org 70 i 70 ], Err bitreich.org 70 i 71 SW: [ Err bitreich.org 70 i 72 [-5, -3], Err bitreich.org 70 i 73 [-6, -1], Err bitreich.org 70 i 74 ], Err bitreich.org 70 i 75 W: [ Err bitreich.org 70 i 76 [-4, -2], Err bitreich.org 70 i 77 [-4, -3], Err bitreich.org 70 i 78 ], Err bitreich.org 70 i 79 NW: [ Err bitreich.org 70 i 80 [-1, 0], Err bitreich.org 70 i 81 [-1, -1], Err bitreich.org 70 i 82 ], Err bitreich.org 70 i 83 }; Err bitreich.org 70 i 84 Err bitreich.org 70 i 85 function create() { Err bitreich.org 70 i 86 nekoEl.id = "oneko"; Err bitreich.org 70 i 87 nekoEl.style.width = "32px"; Err bitreich.org 70 i 88 nekoEl.style.height = "32px"; Err bitreich.org 70 i 89 nekoEl.style.position = "fixed"; Err bitreich.org 70 i 90 nekoEl.style.pointerEvents = "none"; Err bitreich.org 70 i 91 nekoEl.style.backgroundImage = "url('/s/neko.png')"; Err bitreich.org 70 i 92 nekoEl.style.imageRendering = "pixelated"; Err bitreich.org 70 i 93 nekoEl.style.left = `${nekoPosX}px`; Err bitreich.org 70 i 94 nekoEl.style.top = `${nekoPosY}px`; Err bitreich.org 70 i 95 nekoEl.style.zIndex = 9999999999; //Number.MAX_SAFE_INTEGER Err bitreich.org 70 i 96 Err bitreich.org 70 i 97 document.body.appendChild(nekoEl); Err bitreich.org 70 i 98 Err bitreich.org 70 i 99 document.onmousemove = (event) => { Err bitreich.org 70 i 100 mousePosX = event.clientX; Err bitreich.org 70 i 101 mousePosY = event.clientY; Err bitreich.org 70 i 102 }; Err bitreich.org 70 i 103 Err bitreich.org 70 i 104 window.onekoInterval = setInterval(frame, 100); Err bitreich.org 70 i 105 } Err bitreich.org 70 i 106 Err bitreich.org 70 i 107 function setSprite(name, frame) { Err bitreich.org 70 i 108 const sprite = spriteSets[name][frame % spriteSets[name].length]; Err bitreich.org 70 i 109 nekoEl.style.backgroundPosition = `${sprite[0] * 32}px ${sprite[1] * 32}px`; Err bitreich.org 70 i 110 } Err bitreich.org 70 i 111 Err bitreich.org 70 i 112 function resetIdleAnimation() { Err bitreich.org 70 i 113 idleAnimation = null; Err bitreich.org 70 i 114 idleAnimationFrame = 0; Err bitreich.org 70 i 115 } Err bitreich.org 70 i 116 Err bitreich.org 70 i 117 function idle() { Err bitreich.org 70 i 118 idleTime += 1; Err bitreich.org 70 i 119 Err bitreich.org 70 i 120 // every ~ 20 seconds Err bitreich.org 70 i 121 if (idleTime > 10 && true && idleAnimation == null) { Err bitreich.org 70 i 122 let avalibleIdleAnimations = ["sleeping", "scratchSelf"]; Err bitreich.org 70 i 123 if (nekoPosX < 32) { Err bitreich.org 70 i 124 avalibleIdleAnimations.push("scratchWallW"); Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 if (nekoPosY < 32) { Err bitreich.org 70 i 127 avalibleIdleAnimations.push("scratchWallN"); Err bitreich.org 70 i 128 } Err bitreich.org 70 i 129 if (nekoPosX > window.innerWidth - 32) { Err bitreich.org 70 i 130 avalibleIdleAnimations.push("scratchWallE"); Err bitreich.org 70 i 131 } Err bitreich.org 70 i 132 if (nekoPosY > window.innerHeight - 32) { Err bitreich.org 70 i 133 avalibleIdleAnimations.push("scratchWallS"); Err bitreich.org 70 i 134 } Err bitreich.org 70 i 135 idleAnimation = Err bitreich.org 70 i 136 avalibleIdleAnimations[ Err bitreich.org 70 i 137 Math.floor(Math.random() * avalibleIdleAnimations.length) Err bitreich.org 70 i 138 ]; Err bitreich.org 70 i 139 } Err bitreich.org 70 i 140 Err bitreich.org 70 i 141 switch (idleAnimation) { Err bitreich.org 70 i 142 case "sleeping": Err bitreich.org 70 i 143 if (idleAnimationFrame < 8) { Err bitreich.org 70 i 144 setSprite("tired", 0); Err bitreich.org 70 i 145 break; Err bitreich.org 70 i 146 } Err bitreich.org 70 i 147 setSprite("sleeping", Math.floor(idleAnimationFrame / 4)); Err bitreich.org 70 i 148 if (idleAnimationFrame > 192) { Err bitreich.org 70 i 149 resetIdleAnimation(); Err bitreich.org 70 i 150 } Err bitreich.org 70 i 151 break; Err bitreich.org 70 i 152 case "scratchWallN": Err bitreich.org 70 i 153 case "scratchWallS": Err bitreich.org 70 i 154 case "scratchWallE": Err bitreich.org 70 i 155 case "scratchWallW": Err bitreich.org 70 i 156 case "scratchSelf": Err bitreich.org 70 i 157 setSprite(idleAnimation, idleAnimationFrame); Err bitreich.org 70 i 158 if (idleAnimationFrame > 9) { Err bitreich.org 70 i 159 resetIdleAnimation(); Err bitreich.org 70 i 160 } Err bitreich.org 70 i 161 break; Err bitreich.org 70 i 162 default: Err bitreich.org 70 i 163 setSprite("idle", 0); Err bitreich.org 70 i 164 return; Err bitreich.org 70 i 165 } Err bitreich.org 70 i 166 idleAnimationFrame += 1; Err bitreich.org 70 i 167 } Err bitreich.org 70 i 168 Err bitreich.org 70 i 169 function frame() { Err bitreich.org 70 i 170 frameCount += 1; Err bitreich.org 70 i 171 const diffX = nekoPosX - mousePosX; Err bitreich.org 70 i 172 const diffY = nekoPosY - mousePosY; Err bitreich.org 70 i 173 const distance = Math.sqrt(diffX ** 2 + diffY ** 2); Err bitreich.org 70 i 174 Err bitreich.org 70 i 175 if (distance < nekoSpeed || distance < 48) { Err bitreich.org 70 i 176 idle(); Err bitreich.org 70 i 177 return; Err bitreich.org 70 i 178 } Err bitreich.org 70 i 179 Err bitreich.org 70 i 180 idleAnimation = null; Err bitreich.org 70 i 181 idleAnimationFrame = 0; Err bitreich.org 70 i 182 Err bitreich.org 70 i 183 if (idleTime > 1) { Err bitreich.org 70 i 184 setSprite("alert", 0); Err bitreich.org 70 i 185 // count down after being alerted before moving Err bitreich.org 70 i 186 idleTime = Math.min(idleTime, 7); Err bitreich.org 70 i 187 idleTime -= 1; Err bitreich.org 70 i 188 return; Err bitreich.org 70 i 189 } Err bitreich.org 70 i 190 Err bitreich.org 70 i 191 direction = diffY / distance > 0.5 ? "N" : ""; Err bitreich.org 70 i 192 direction += diffY / distance < -0.5 ? "S" : ""; Err bitreich.org 70 i 193 direction += diffX / distance > 0.5 ? "W" : ""; Err bitreich.org 70 i 194 direction += diffX / distance < -0.5 ? "E" : ""; Err bitreich.org 70 i 195 setSprite(direction, frameCount); Err bitreich.org 70 i 196 Err bitreich.org 70 i 197 nekoPosX -= (diffX / distance) * nekoSpeed; Err bitreich.org 70 i 198 nekoPosY -= (diffY / distance) * nekoSpeed; Err bitreich.org 70 i 199 Err bitreich.org 70 i 200 nekoPosX = Math.min(Math.max(16, nekoPosX), window.innerWidth - 16); Err bitreich.org 70 i 201 nekoPosY = Math.min(Math.max(16, nekoPosY), window.innerHeight - 16); Err bitreich.org 70 i 202 Err bitreich.org 70 i 203 nekoEl.style.left = `${nekoPosX - 16}px`; Err bitreich.org 70 i 204 nekoEl.style.top = `${nekoPosY - 16}px`; Err bitreich.org 70 i 205 } Err bitreich.org 70 i 206 Err bitreich.org 70 i 207 create(); Err bitreich.org 70 i 208 }; Err bitreich.org 70 i 209 Err bitreich.org 70 i 210 const isReduced = window.matchMedia(`(prefers-reduced-motion: reduce)`) === true || window.matchMedia(`(prefers-reduced-motion: reduce)`).matches === true; Err bitreich.org 70 i 211 if (!isReduced) { Err bitreich.org 70 i 212 oneko(); Err bitreich.org 70 i 213 } Err bitreich.org 70 i 214 Err bitreich.org 70 .