Skip to content

Commit a48ebf5

Browse files
committed
Improve AI combat-only mode for duel and pirate scenarios
- When no navigation target or escape objective, AI enters pure combat mode - Aggressively closes range when stronger, maintains ideal distance when weaker - Speed management near enemies to avoid overshooting
1 parent 3f8c289 commit a48ebf5

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

src/shared/ai.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -307,18 +307,36 @@ function scoreCourse(
307307
}
308308
}
309309

310-
// Combat positioning: prefer keeping distance from enemies when weak
310+
// Combat positioning
311311
const myStrength = getCombatStrength([ship]);
312-
if (myStrength > 0 && enemyShips.length > 0) {
312+
const noPrimaryObjective = !escapeWins && !targetHex;
313+
if (enemyShips.length > 0) {
313314
for (const enemy of enemyShips) {
314315
const dist = hexDistance(course.destination, enemy.position);
315316
const enemyStr = getCombatStrength([enemy]);
316-
if (myStrength >= enemyStr) {
317-
// We're stronger: get closer
318-
score += Math.max(0, 5 - dist) * 2 * mult;
319-
} else {
320-
// We're weaker: stay away
321-
score += Math.min(dist, 5) * 1 * mult;
317+
318+
if (noPrimaryObjective) {
319+
// Pure combat mode: aggressively seek combat range
320+
if (myStrength >= enemyStr) {
321+
// Close in — strong bonus for being at range 1-3
322+
score += Math.max(0, 8 - dist) * 5 * mult;
323+
} else {
324+
// Weaker: stay at moderate range, but don't flee forever
325+
const idealDist = 4;
326+
score -= Math.abs(dist - idealDist) * 3 * mult;
327+
}
328+
// Speed management: prefer moderate velocity near enemies
329+
const speed = hexVecLength(course.newVelocity);
330+
if (dist < 5 && speed > 3) {
331+
score -= (speed - 3) * 4 * mult; // penalize overshooting
332+
}
333+
} else if (myStrength > 0) {
334+
// Has objective but also can fight
335+
if (myStrength >= enemyStr) {
336+
score += Math.max(0, 5 - dist) * 2 * mult;
337+
} else {
338+
score += Math.min(dist, 5) * 1 * mult;
339+
}
322340
}
323341
}
324342
}

0 commit comments

Comments
 (0)