bugfix: has puck

This commit is contained in:
Pierre Wessman 2025-09-16 14:31:07 +02:00
parent ac5b83afee
commit c0ced95d46

View File

@ -18,6 +18,7 @@ class Puck {
this.updatePosition(deltaTime); this.updatePosition(deltaTime);
this.checkBoardCollisions(gameState); this.checkBoardCollisions(gameState);
this.checkPlayerCollisions(players, gameState); this.checkPlayerCollisions(players, gameState);
this.checkPuckPossession(players);
this.updateTrail(); this.updateTrail();
} }
@ -26,6 +27,31 @@ class Puck {
this.position = this.position.add(this.velocity.multiply(deltaTime)); this.position = this.position.add(this.velocity.multiply(deltaTime));
} }
checkPuckPossession(players) {
const puckCarrier = players.find(player => player.state.hasPuck);
if (!puckCarrier) return;
const distance = this.position.distance(puckCarrier.position);
const maxPossessionDistance = 25; // Maximum distance to maintain puck possession
if (distance > maxPossessionDistance) {
puckCarrier.state.hasPuck = false;
// Puck becomes loose and slightly moves in a random direction
if (this.velocity.magnitude() < 10) {
const randomDirection = new Vector2(
(Math.random() - 0.5) * 2,
(Math.random() - 0.5) * 2
).normalize();
this.velocity = randomDirection.multiply(20);
}
} else if (distance < 15) {
// Keep puck close to player when they have possession
const directionToPlayer = puckCarrier.position.subtract(this.position).normalize();
this.position = puckCarrier.position.subtract(directionToPlayer.multiply(12));
this.velocity = puckCarrier.velocity.multiply(0.8);
}
}
updateTrail() { updateTrail() {
if (this.velocity.magnitude() > 50) { if (this.velocity.magnitude() > 50) {
this.trail.unshift({ this.trail.unshift({
@ -111,11 +137,11 @@ class Puck {
}); });
if (closestPlayer) { if (closestPlayer) {
this.handlePlayerCollision(closestPlayer, gameState); this.handlePlayerCollision(closestPlayer, gameState, players);
} }
} }
handlePlayerCollision(player, gameState) { handlePlayerCollision(player, gameState, players) {
const distance = this.position.distance(player.position); const distance = this.position.distance(player.position);
const minDistance = this.radius + player.radius; const minDistance = this.radius + player.radius;
@ -136,14 +162,14 @@ class Puck {
this.velocity = this.velocity.subtract(direction.multiply(impulse * player.mass * this.restitution)); this.velocity = this.velocity.subtract(direction.multiply(impulse * player.mass * this.restitution));
if (this.velocity.magnitude() < 100 && player.role !== 'G') { if (this.velocity.magnitude() < 100 && player.role !== 'G') {
this.pickupPuck(player, gameState); this.pickupPuck(player, gameState, players);
} else if (player.role === 'G' && this.velocity.magnitude() > 50) { } else if (player.role === 'G' && this.velocity.magnitude() > 50) {
this.handleGoalieSave(player, gameState); this.handleGoalieSave(player, gameState);
} }
} }
} }
pickupPuck(player, gameState) { pickupPuck(player, gameState, players) {
if (player.state.hasPuck) return; if (player.state.hasPuck) return;
players.forEach(p => p.state.hasPuck = false); players.forEach(p => p.state.hasPuck = false);