🔬 Friends chase when > 180 pixels away and shoot when closer. What happens if you change 180 to 300 so they start attacking from farther away?
for (let f of friends) {
let closest = null; let record = Infinity;
for (let d of dogs) {
let dToDog = dist(f.pos.x, f.pos.y, d.pos.x, d.pos.y);
if (dToDog < record) { record = dToDog; closest = d; }
}
if (closest) {
if (record > 180) {
let dir = p5.Vector.sub(closest.pos, f.pos).normalize().mult(f.speed);
f.pos.add(dir);
} else if (frameCount % 40 === 0) {
let dir = p5.Vector.sub(closest.pos, f.pos).normalize().mult(12);
projectiles.push({ pos: f.pos.copy(), vel: dir, life: 60, isGod: false, damage: 1 });
}
}
}
🔬 When a dog gets hit, it spawns particles—8 for god shots, 3 for normal shots. What happens if you change 3 to 12 so every punch creates more visual impact?
for(let k=0; k < (p.isGod ? 8 : 3); k++) {
particles.push({pos: d.pos.copy(), vel: p5.Vector.random2D().mult(random(2,8)), life: 255});
}
function updateLogic() {
let isMoving = false;
if (keyIsDown(65) || keyIsDown(LEFT_ARROW)) { player.pos.x -= player.speed; isMoving = true; }
if (keyIsDown(68) || keyIsDown(RIGHT_ARROW)) { player.pos.x += player.speed; isMoving = true; }
if (keyIsDown(87) || keyIsDown(UP_ARROW)) { player.pos.y -= player.speed; isMoving = true; }
if (keyIsDown(83) || keyIsDown(DOWN_ARROW)) { player.pos.y += player.speed; isMoving = true; }
let joyBaseX = 120; let joyBaseY = height - 120;
let shootBtnX = width - 120; let shootBtnY = height - 120;
joyKnob = { x: joyBaseX, y: joyBaseY };
let shootActive = false;
if (mobileMode) {
let inputs = [];
if (touches.length > 0) {
for (let i = 0; i < touches.length; i++) inputs.push(touches[i]);
} else if (mouseIsPressed) {
inputs.push({ x: mouseX, y: mouseY });
}
for (let t of inputs) {
if (t.x < width / 2 && t.y > height / 2) {
let d = dist(t.x, t.y, joyBaseX, joyBaseY);
if (d < 150) {
let angle = atan2(t.y - joyBaseY, t.x - joyBaseX);
let mag = min(d, 50);
joyKnob.x = joyBaseX + cos(angle) * mag;
joyKnob.y = joyBaseY + sin(angle) * mag;
let moveVec = createVector(cos(angle), sin(angle)).mult(player.speed * (mag/50));
player.pos.add(moveVec);
isMoving = true;
}
}
if (t.x > width / 2 && t.y > height / 2) {
if (dist(t.x, t.y, shootBtnX, shootBtnY) < 100) shootActive = true;
}
}
if (shootActive) {
let closestDog = null; let record = Infinity;
for (let d of dogs) {
let dDist = dist(player.pos.x, player.pos.y, d.pos.x, d.pos.y);
if (dDist < record) { record = dDist; closestDog = d; }
}
let targetAngle = player.punchAngle;
if (closestDog) targetAngle = atan2(closestDog.pos.y - player.pos.y, closestDog.pos.x - player.pos.x);
if (hasMachineGun && player.punchFrames === 0) {
if (frameCount % 6 === 0) {
let dir = p5.Vector.fromAngle(targetAngle).mult(15);
projectiles.push({ pos: player.pos.copy(), vel: dir, life: 60, isGod: false, damage: 1 });
player.punchAngle = targetAngle;
shakeAmount = 1.5;
}
} else if (!hasMachineGun && player.punchFrames === 0) {
player.punchFrames = 15;
player.punchAngle = targetAngle;
executePunch(targetAngle);
}
}
}
else {
if (touches.length > 0 && !isMoving) {
let t = touches[0];
let dir = createVector(t.x - player.pos.x, t.y - player.pos.y);
if (dir.mag() > 20) {
dir.normalize().mult(player.speed);
player.pos.add(dir);
}
}
if (mouseIsPressed && hasMachineGun && player.punchFrames === 0) {
if (frameCount % 6 === 0) {
let tx = touches.length > 0 ? touches[0].x : mouseX;
let ty = touches.length > 0 ? touches[0].y : mouseY;
let dir = createVector(tx - player.pos.x, ty - player.pos.y).normalize().mult(15);
projectiles.push({ pos: player.pos.copy(), vel: dir, life: 60, isGod: false, damage: 1 });
player.punchAngle = dir.heading();
shakeAmount = 1.5;
}
}
}
let leftWall = width / 2 - alleyWidth / 2;
let rightWall = width / 2 + alleyWidth / 2;
player.pos.x = constrain(player.pos.x, leftWall + player.radius, rightWall - player.radius);
player.pos.y = constrain(player.pos.y, player.radius, height - player.radius);
if (player.punchFrames > 0) player.punchFrames--;
for (let f of friends) {
let closest = null; let record = Infinity;
for (let d of dogs) {
let dToDog = dist(f.pos.x, f.pos.y, d.pos.x, d.pos.y);
if (dToDog < record) { record = dToDog; closest = d; }
}
if (closest) {
if (record > 180) {
let dir = p5.Vector.sub(closest.pos, f.pos).normalize().mult(f.speed);
f.pos.add(dir);
} else if (frameCount % 40 === 0) {
let dir = p5.Vector.sub(closest.pos, f.pos).normalize().mult(12);
projectiles.push({ pos: f.pos.copy(), vel: dir, life: 60, isGod: false, damage: 1 });
}
}
}
let godFireRate = max(2, 8 - floor(wave / 3));
let godDamage = floor(25 * pow(1.2, wave - 1));
for (let g of gods) {
let closest = null; let record = Infinity;
for (let d of dogs) {
let dToDog = dist(g.pos.x, g.pos.y, d.pos.x, d.pos.y);
if (dToDog < record) { record = dToDog; closest = d; }
}
if (closest) {
if (record > 200) {
let dir = p5.Vector.sub(closest.pos, g.pos).normalize().mult(g.speed);
g.pos.add(dir);
} else if (frameCount % godFireRate === 0) {
let dir = p5.Vector.sub(closest.pos, g.pos).normalize().mult(25);
projectiles.push({ pos: g.pos.copy(), vel: dir, life: 100, isGod: true, damage: godDamage });
}
}
}
for (let i = projectiles.length - 1; i >= 0; i--) {
let p = projectiles[i];
p.pos.add(p.vel);
p.life--;
let hit = false;
for (let j = dogs.length - 1; j >= 0; j--) {
let d = dogs[j];
let hitRadius = p.isGod ? 25 : 15;
if (dist(p.pos.x, p.pos.y, d.pos.x, d.pos.y) < d.radius + hitRadius) {
let dmg = p.damage || 1;
d.hitsTaken += dmg;
d.flashRed = 8;
d.pos.add(p.vel.copy().setMag(p.isGod ? 8 : 2));
for(let k=0; k < (p.isGod ? 8 : 3); k++) {
particles.push({pos: d.pos.copy(), vel: p5.Vector.random2D().mult(random(2,8)), life: 255});
}
if (d.hitsTaken >= d.maxHits) dogs.splice(j, 1);
hit = true; break;
}
}
if (hit || p.life <= 0) projectiles.splice(i, 1);
}
for (let j = dogs.length - 1; j >= 0; j--) {
let d = dogs[j];
if (d.stunFrames > 0) {
d.stunFrames--;
} else {
let dirToPlayer = p5.Vector.sub(player.pos, d.pos);
let distToPlayer = dirToPlayer.mag();
let hitWall = false;
for (let i = walls.length - 1; i >= 0; i--) {
let w = walls[i];
if (dist(d.pos.x, d.pos.y, w.pos.x, w.pos.y) < d.radius + w.radius) {
hitWall = true;
w.hp -= 1.5;
d.pos.sub(p5.Vector.sub(d.pos, w.pos).setMag(3));
if (w.hp <= 0) walls.splice(i, 1);
}
}
if (!hitWall && distToPlayer > d.radius + player.radius) {
dirToPlayer.normalize().mult(d.speed);
d.pos.add(dirToPlayer);
}
if (distToPlayer < d.radius + player.radius + 5) {
player.health -= (gameMode === "HARDCORE") ? 1 : 0.8;
shakeAmount = 2;
if (player.health <= 0) {
gameState = "LOSE";
deathCooldown = 60;
}
}
}
d.pos.x = constrain(d.pos.x, leftWall + d.radius, rightWall - d.radius);
d.pos.y = constrain(d.pos.y, d.radius, height - d.radius);
if (d.flashRed > 0) d.flashRed--;
}
if (dogs.length === 0 && gameState === "PLAYING") {
let earned = (gameMode === "SWARM") ? wave * 15 + 20 : wave * 10 + 10;
coins += earned;
player.health = player.maxHealth;
gameState = "SHOP";
}
for (let i = particles.length - 1; i >= 0; i--) {
particles[i].pos.add(particles[i].vel);
particles[i].life -= 5;
if (particles[i].life <= 0) particles.splice(i, 1);
}
}