Files
run-from-the-faggot/index.html
T
2026-03-18 14:13:02 -03:00

188 lines
6.2 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>i'm gonna touch you</title>
<link rel="icon" type="image/jpg" href="/bweeeeghg.jpg">
<style>
body { margin: 0; overflow: hidden; }
canvas {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
}
.faggif{
position: fixed;
width: 100vw;
height: 100vh;
z-index: 0;
inset: 0;
object-fit: fill;
pointer-events: none;
}
</style>
</head>
<body>
<img class="faggif" src="fagotni.gif" alt="if you are seeing this something went horribly wrong">
<canvas id="game"></canvas>
<script>
const canvas = document.getElementById('game');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const chaserImg = new Image();
chaserImg.src = '/creature.jpg';
const spawnSound = new Audio('wah.ogg');
spawnSound.preload = 'auto';
let audioUnlocked = false;
function unlockAudio() {
if (!audioUnlocked) {
spawnSound.play().then(() => {
spawnSound.pause();
spawnSound.currentTime = 0;
audioUnlocked = true;
}).catch(() => {});
}
}
canvas.addEventListener('mousedown', unlockAudio);
canvas.addEventListener('touchstart', unlockAudio);
let chasers = [
{ x: canvas.width / 2, y: canvas.height / 2, vx: 0, vy: 0, lastRandom: 0, lastSpawn: 0 }
];
let target = { x: canvas.width / 2, y: canvas.height / 2 };
const maxSpeed = 15;
const moveForce = 0.8;
const inertia = 0.8;
const repulsionDist = 15; // Slightly larger hitbox for 15px chasers
const repulsionStrength = 2;
const spawnCooldown = 0.5;
const randomCooldown = 2;
const chaserSize = 20; // Bigger chasers (15px)
const maxChasers = 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
// rape input
canvas.addEventListener('touchstart', e => {
e.preventDefault();
target.x = e.touches[0].clientX;
target.y = e.touches[0].clientY;
});
canvas.addEventListener('touchmove', e => {
e.preventDefault();
target.x = e.touches[0].clientX;
target.y = e.touches[0].clientY;
});
// Mouse input (for desktop testing)
canvas.addEventListener('mousemove', e => {
target.x = e.clientX;
target.y = e.clientY;
});
function update() {
const now = performance.now() / 1000;
ctx.clearRect(0, 0, canvas.width, canvas.height);
let newChasers = [];
chasers.forEach(c => {
// Chase target
const dx = target.x - c.x;
const dy = target.y - c.y;
const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1);
const ax = (dx / dist) * moveForce;
const ay = (dy / dist) * moveForce;
c.vx = (c.vx * inertia) + ax;
c.vy = (c.vy * inertia) + ay;
// Cap speed
const speed = Math.sqrt(c.vx * c.vx + c.vy * c.vy);
if (speed > maxSpeed) {
c.vx = c.vx * maxSpeed / speed;
c.vy = c.vy * maxSpeed / speed;
}
// Repulsion
chasers.forEach(other => {
if (other !== c) {
const rDx = c.x - other.x;
const rDy = c.y - other.y;
const rDist = Math.sqrt(rDx * rDx + rDy * rDy);
if (rDist < repulsionDist && rDist > 0) {
const push = repulsionStrength * (repulsionDist - rDist) / rDist;
c.vx += (rDx / rDist) * push;
c.vy += (rDy / rDist) * push;
}
}
});
// Random moves
if (now - c.lastRandom > randomCooldown && Math.random() < 0.2) {
const moveType = Math.floor(Math.random() * 3);
if (moveType === 0) { // Jump
c.vx += (dx / dist) * 10;
c.vy += (dy / dist) * 10;
console.log(`Chaser ${chasers.indexOf(c)}: Jumping!`);
} else if (moveType === 1) { // Wiggle
c.vx += Math.random() * 4 - 2;
c.vy += Math.random() * 4 - 2;
console.log(`Chaser ${chasers.indexOf(c)}: Wiggling!`);
} else { // Dash
const perpDx = -dy / dist;
const perpDy = dx / dist;
const dir = Math.random() < 0.5 ? -1 : 1;
c.vx += perpDx * 5 * dir;
c.vy += perpDy * 5 * dir;
console.log(`Chaser ${chasers.indexOf(c)}: Dashing!`);
}
c.lastRandom = now;
}
// Update position
c.x += c.vx;
c.y += c.vy;
c.x = Math.max(chaserSize / 2, Math.min(c.x, canvas.width - chaserSize / 2));
c.y = Math.max(chaserSize / 2, Math.min(c.y, canvas.height - chaserSize / 2));
// Spawn only on touch proximity
if (dist < 45 && now - c.lastSpawn > spawnCooldown && chasers.length < maxChasers) {
newChasers.push({
x: c.x,
y: c.y,
vx: 0,
vy: 0,
lastRandom: now,
lastSpawn: now
});
if (audioUnlocked) {
const s = spawnSound.cloneNode(); // allow overlapping sounds
s.volume = 0.6;
s.play();
}
c.lastSpawn = now;
}
// Draw with image
ctx.drawImage(chaserImg, c.x - chaserSize / 2, c.y - chaserSize / 2, chaserSize, chaserSize);
});
chasers.push(...newChasers);
requestAnimationFrame(update);
}
// Start after image loads
chaserImg.onload = () => update();
</script>
</body>
</html>