Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/client/graphics/layers/UnitLayer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -360,11 +360,17 @@ export class UnitLayer implements Layer {
}

private handleWarShipEvent(unit: UnitView) {
if (unit.retreating()) {
this.drawSprite(unit, colord("rgb(0,180,255)"));
return;
}

if (unit.targetUnitId()) {
this.drawSprite(unit, colord("rgb(200,0,0)"));
} else {
this.drawSprite(unit);
return;
}

this.drawSprite(unit);
}

private handleShellEvent(unit: UnitView) {
Expand Down
6 changes: 6 additions & 0 deletions src/core/configuration/Config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,12 @@ export interface Config {
warshipPatrolRange(): number;
warshipShellAttackRate(): number;
warshipTargettingRange(): number;
warshipPortHealingRadius(): number;
warshipPortHealingBonus(): number;
warshipRetreatHealthThreshold(): number;
warshipPassiveHealing(): number;
warshipPassiveHealingRange(): number;
warshipPortSwitchThreshold(): number;
defensePostShellAttackRate(): number;
defensePostTargettingRange(): number;
// 0-1
Expand Down
24 changes: 24 additions & 0 deletions src/core/configuration/DefaultConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -969,6 +969,30 @@ export class DefaultConfig implements Config {
return 20;
}

warshipPortHealingRadius(): number {
return 5;
}

warshipPortHealingBonus(): number {
return 5;
}

warshipRetreatHealthThreshold(): number {
return 750;
}

warshipPassiveHealing(): number {
return 1;
}

warshipPassiveHealingRange(): number {
return 150;
}

warshipPortSwitchThreshold(): number {
return 0.75;
}

defensePostShellAttackRate(): number {
return 100;
}
Expand Down
58 changes: 58 additions & 0 deletions src/core/execution/HealAtPortExecution.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { Execution, Game, Player, UnitType } from "../game/Game";
import { TileRef } from "../game/GameMap";

/**
* Orders a warship to retreat toward a friendly port for healing.
* Only works with friendly ports owned by the same player.
*/
export class HealAtPortExecution implements Execution {
constructor(
private readonly owner: Player,
private readonly warshipId: number,
private readonly portTile: TileRef,
) {}

init(mg: Game, ticks: number): void {
if (!mg.isValidRef(this.portTile)) {
console.warn(`HealAtPortExecution: port tile ${this.portTile} not valid`);
return;
}

const warship = this.owner
.units(UnitType.Warship)
.find((u) => u.id() === this.warshipId);

if (!warship) {
console.warn("HealAtPortExecution: warship not found");
return;
}

if (!warship.isActive()) {
console.warn("HealAtPortExecution: warship is not active");
return;
}

const isFriendlyPort = this.owner
.units(UnitType.Port)
.some((port) => port.tile() === this.portTile);
if (!isFriendlyPort) {
console.warn("HealAtPortExecution: target port is not friendly");
return;
}

// Set warship to go to the port
warship.setPatrolTile(this.portTile);
warship.setTargetTile(this.portTile);
warship.setRetreating(true); // Enable healing behavior
}

tick(ticks: number): void {}

isActive(): boolean {
return false;
}

activeDuringSpawnPhase(): boolean {
return false;
}
}
3 changes: 2 additions & 1 deletion src/core/execution/MoveWarshipExecution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ export class MoveWarshipExecution implements Execution {
return;
}
warship.setPatrolTile(this.position);
warship.setTargetTile(undefined);
warship.setTargetTile(this.position);
warship.setRetreating(false);
}

tick(ticks: number): void {}
Expand Down
Loading
Loading