aggressive pressure

This commit is contained in:
Pierre Wessman 2025-09-16 15:13:06 +02:00
parent 326b3036b6
commit cfdad79207
2 changed files with 53 additions and 1 deletions

View File

@ -221,7 +221,14 @@ class Player {
// Only chase if this player is closest to the puck on their team // Only chase if this player is closest to the puck on their team
this.chasePuck(puck); this.chasePuck(puck);
} else if (puckOwner && puckOwner.team !== this.team) { } else if (puckOwner && puckOwner.team !== this.team) {
if (distanceToPuck < 150 && Math.random() < 0.2) { // Check if this player is the closest defender to the puck carrier
const isClosestDefender = this.isClosestDefenderToPuckCarrier(puckOwner, teammates);
if (isClosestDefender) {
// Closest defender aggressively targets the puck carrier
this.moveToPosition(puckOwner.position);
this.aiState.behavior = 'aggressive_pressure';
} else if (distanceToPuck < 150 && Math.random() < 0.2) {
this.checkPlayer(puckOwner); this.checkPlayer(puckOwner);
} else { } else {
this.defendPosition(gameState, puckOwner); this.defendPosition(gameState, puckOwner);
@ -587,6 +594,36 @@ class Player {
return closestPlayer === this; return closestPlayer === this;
} }
/**
* Checks if this player is the closest defender to the puck carrier
* @param {Object} puckCarrier - The player who has the puck
* @param {Array} teammates - Array of teammate player objects
* @returns {boolean} True if this player is closest to puck carrier on their team
*/
isClosestDefenderToPuckCarrier(puckCarrier, teammates) {
// Skip goalies
if (this.role === 'G') return false;
const myDistance = this.position.distance(puckCarrier.position);
// Include self in the list to compare against (excluding goalies)
const allTeamPlayers = [this, ...teammates.filter(t => t.role !== 'G')];
// Find the closest player to the puck carrier
let closestDistance = Infinity;
let closestPlayer = null;
allTeamPlayers.forEach(player => {
const distance = player.position.distance(puckCarrier.position);
if (distance < closestDistance) {
closestDistance = distance;
closestPlayer = player;
}
});
return closestPlayer === this;
}
/** /**
* Evaluates whether player has a clear shooting angle to goal * Evaluates whether player has a clear shooting angle to goal
* Checks if opponents are blocking the direct path to goal * Checks if opponents are blocking the direct path to goal

View File

@ -176,6 +176,9 @@ class AISystem {
const distanceToPuck = player.position.distance(context.puckPosition); const distanceToPuck = player.position.distance(context.puckPosition);
const isNearPuck = distanceToPuck < 100; const isNearPuck = distanceToPuck < 100;
const isClosestToPuck = context.closestPlayers[player.team] === player; const isClosestToPuck = context.closestPlayers[player.team] === player;
const isClosestDefender = context.puckOwner &&
context.puckOwner.team !== player.team &&
context.closestPlayers[player.team] === player;
if (player.state.hasPuck) { if (player.state.hasPuck) {
player.aiState.behavior = 'puck_carrier'; player.aiState.behavior = 'puck_carrier';
@ -183,6 +186,10 @@ class AISystem {
} else if (context.puckOwner && context.puckOwner.team === player.team) { } else if (context.puckOwner && context.puckOwner.team === player.team) {
player.aiState.behavior = 'support'; player.aiState.behavior = 'support';
this.executeSupportBehavior(player, context); this.executeSupportBehavior(player, context);
} else if (isClosestDefender) {
// Closest defender directly targets the puck carrier
player.aiState.behavior = 'aggressive_pressure';
this.executeAggressivePressureBehavior(player, context);
} else if (context.puckOwner && context.puckOwner.team !== player.team) { } else if (context.puckOwner && context.puckOwner.team !== player.team) {
player.aiState.behavior = 'pressure'; player.aiState.behavior = 'pressure';
this.executePressureBehavior(player, context); this.executePressureBehavior(player, context);
@ -221,6 +228,14 @@ class AISystem {
player.aiState.action = 'support'; player.aiState.action = 'support';
} }
executeAggressivePressureBehavior(player, context) {
const opponent = context.puckOwner;
// Closest defender directly targets the puck carrier's position
player.targetPosition = opponent.position.copy();
player.aiState.action = 'aggressive_pressure';
}
executePressureBehavior(player, context) { executePressureBehavior(player, context) {
const opponent = context.puckOwner; const opponent = context.puckOwner;
const pressurePosition = this.calculatePressurePosition(player, opponent, context); const pressurePosition = this.calculatePressurePosition(player, opponent, context);