Merge branch 'main' of github.com:openfrontio/OpenFrontIO

This commit is contained in:
Evan
2025-03-04 16:32:32 -08:00
7 changed files with 43 additions and 10 deletions
+17 -8
View File
@@ -1,4 +1,4 @@
import { Colord } from "colord";
import { colord, Colord } from "colord";
import { Theme } from "../../../core/configuration/Config";
import { Unit, UnitType, Player } from "../../../core/game/Game";
import { Layer } from "./Layer";
@@ -82,6 +82,10 @@ export class UnitLayer implements Layer {
* @returns Array of player's warships in range, sorted by distance (closest first)
*/
private findWarshipsNearCell(cell: { x: number; y: number }): UnitView[] {
if (!this.game.isValidCoord(cell.x, cell.y)) {
// The cell coordinate were invalid (user probably clicked outside the map), therefore no warships can be found
return [];
}
const clickRef = this.game.ref(cell.x, cell.y);
// Make sure we have the current player
@@ -240,15 +244,20 @@ export class UnitLayer implements Layer {
return;
}
let outerColor = this.theme.territoryColor(unit.owner().info());
if (unit.targetId()) {
const targetOwner = this.game
.units()
.find((u) => u.id() == unit.targetId())
.owner();
if (targetOwner == this.myPlayer) {
outerColor = colord({ r: 200, b: 0, g: 0 });
}
}
// Paint outer territory
for (const t of this.game.bfs(unit.tile(), euclDistFN(unit.tile(), 5))) {
this.paintCell(
this.game.x(t),
this.game.y(t),
rel,
this.theme.territoryColor(unit.owner().info()),
255,
);
this.paintCell(this.game.x(t), this.game.y(t), rel, outerColor, 255);
}
// Paint border
+1 -1
View File
@@ -36,7 +36,7 @@ export class MissileSiloExecution implements Execution {
if (this.silo == null) {
if (!this.player.canBuild(UnitType.MissileSilo, this.tile)) {
consolex.warn(
`player ${this.player} cannot build port at ${this.tile}`,
`player ${this.player} cannot build missile silo at ${this.tile}`,
);
this.active = false;
return;
+1
View File
@@ -110,6 +110,7 @@ export class WarshipExecution implements Execution {
return distSortUnit(this.mg, this.warship)(a, b);
})[0] ?? null;
this.warship.setTarget(this.target);
if (this.target == null || this.target.type() != UnitType.TradeShip) {
// Patrol unless we are hunting down a tradeship
const result = this.pathfinder.nextTile(
+5
View File
@@ -198,6 +198,8 @@ export class PlayerInfo {
}
export interface Unit {
id(): number;
// Properties
type(): UnitType;
troops(): number;
@@ -214,6 +216,9 @@ export interface Unit {
hasHealth(): boolean;
health(): number;
modifyHealth(delta: number): void;
// State for warships (currently)
setTarget(target: Unit): void;
target(): Unit;
// Mutations
setTroops(troops: number): void;
+1
View File
@@ -71,6 +71,7 @@ export interface UnitUpdate {
isActive: boolean;
health?: number;
constructionType?: UnitType;
targetId?: number;
}
export interface AttackUpdate {
+3 -1
View File
@@ -5,7 +5,6 @@ import {
Player,
PlayerActions,
PlayerProfile,
Unit,
} from "./Game";
import { AttackUpdate, PlayerUpdate } from "./GameUpdates";
import { UnitUpdate } from "./GameUpdates";
@@ -92,6 +91,9 @@ export class UnitView {
constructionType(): UnitType | undefined {
return this.data.constructionType;
}
targetId() {
return this.data.targetId;
}
}
export class PlayerView {
+15
View File
@@ -11,6 +11,8 @@ export class UnitImpl implements Unit {
private _active = true;
private _health: bigint;
private _lastTile: TileRef = null;
// Currently only warship use it
private _target: Unit = null;
private _constructionType: UnitType = undefined;
@@ -28,6 +30,10 @@ export class UnitImpl implements Unit {
this._lastTile = _tile;
}
id() {
return this._id;
}
toUpdate(): UnitUpdate {
return {
type: GameUpdateType.Unit,
@@ -40,6 +46,7 @@ export class UnitImpl implements Unit {
lastPos: this._lastTile,
health: this.hasHealth() ? Number(this._health) : undefined,
constructionType: this._constructionType,
targetId: this.target() ? this.target().id() : null,
};
}
@@ -150,4 +157,12 @@ export class UnitImpl implements Unit {
dstPort(): Unit {
return this._dstPort;
}
setTarget(target: Unit) {
this._target = target;
}
target() {
return this._target;
}
}