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
8 changes: 4 additions & 4 deletions src/core/StatsSchemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ export const BoatUnitSchema = z.enum(boatUnits);
export type BoatUnit = z.infer<typeof BoatUnitSchema>;
export type BoatUnitType = UnitType.TradeShip | UnitType.TransportShip;

// export const unitTypeToBoatUnit = {
// [UnitType.TradeShip]: "trade",
// [UnitType.TransportShip]: "trans",
// } as const satisfies Record<BoatUnitType, BoatUnit>;
export const unitTypeToBoatUnit = {
[UnitType.TradeShip]: "trade",
[UnitType.TransportShip]: "trans",
} as const satisfies Record<BoatUnitType, BoatUnit>;

export const otherUnits = [
"city",
Expand Down
22 changes: 19 additions & 3 deletions src/core/execution/TradeShipExecution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,13 @@ export class TradeShipExecution implements Execution {
targetUnit: this._dstPort,
lastSetSafeFromPirates: ticks,
});
this.mg.stats().boatSendTrade(this.origOwner, this._dstPort.owner());
this.mg
.stats()
.boatSendTrade(
this.origOwner,
this._dstPort.owner(),
UnitType.TradeShip,
);
}

if (!this.tradeShip.isActive()) {
Expand Down Expand Up @@ -187,7 +193,12 @@ export class TradeShipExecution implements Execution {
// Record stats
this.mg
.stats()
.boatCapturedTrade(this.tradeShip!.owner(), this.origOwner, gold);
.boatCapturedTrade(
this.tradeShip!.owner(),
this.origOwner,
UnitType.TradeShip,
gold,
);
} else {
this.srcPort.owner().addGold(gold);
this._dstPort.owner().addGold(gold, this._dstPort.tile());
Expand All @@ -214,7 +225,12 @@ export class TradeShipExecution implements Execution {
// Record stats
this.mg
.stats()
.boatArriveTrade(this.srcPort.owner(), this._dstPort.owner(), gold);
.boatArriveTrade(
this.srcPort.owner(),
this._dstPort.owner(),
UnitType.TradeShip,
gold,
);
}
return;
}
Expand Down
21 changes: 18 additions & 3 deletions src/core/execution/TransportShipExecution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,12 @@ export class TransportShipExecution implements Execution {
// Record stats
this.mg
.stats()
.boatSendTroops(this.attacker, this.target, this.boat.troops());
.boatSendTroops(
this.attacker,
this.target,
UnitType.TransportShip,
this.boat.troops(),
);
}

tick(ticks: number) {
Expand Down Expand Up @@ -241,7 +246,12 @@ export class TransportShipExecution implements Execution {
// Record stats
this.mg
.stats()
.boatArriveTroops(this.attacker, this.target, survivors);
.boatArriveTroops(
this.attacker,
this.target,
UnitType.TransportShip,
survivors,
);
if (deaths) {
this.mg.displayMessage(
"events_display.attack_cancelled_retreat",
Expand Down Expand Up @@ -273,7 +283,12 @@ export class TransportShipExecution implements Execution {
// Record stats
this.mg
.stats()
.boatArriveTroops(this.attacker, this.target, this.boat.troops());
.boatArriveTroops(
this.attacker,
this.target,
UnitType.TransportShip,
this.boat.troops(),
);
return;
case PathStatus.NEXT:
this.boat.move(result.node);
Expand Down
22 changes: 18 additions & 4 deletions src/core/game/Stats.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { AllPlayersStats } from "../Schemas";
import { NukeType, OtherUnitType, PlayerStats } from "../StatsSchemas";
import {
BoatUnitType,
NukeType,
OtherUnitType,
PlayerStats,
} from "../StatsSchemas";
import { Player, TerraNullius } from "./Game";

export interface Stats {
Expand Down Expand Up @@ -29,39 +34,48 @@ export interface Stats {
lobbyFillTime(fillTimeMs: number): void;

// Player sends a trade ship to target
boatSendTrade(player: Player, target: Player): void;
boatSendTrade(player: Player, target: Player, type: BoatUnitType): void;

// Player's trade ship arrives at target, both players earn gold
boatArriveTrade(player: Player, target: Player, gold: number | bigint): void;
boatArriveTrade(
player: Player,
target: Player,
type: BoatUnitType,
gold: number | bigint,
): void;

// Player's trade ship, captured from target, arrives. Player earns gold.
boatCapturedTrade(
player: Player,
target: Player,
type: BoatUnitType,
gold: number | bigint,
): void;

// Player destroys target's trade ship
boatDestroyTrade(player: Player, target: Player): void;
boatDestroyTrade(player: Player, target: Player, type: BoatUnitType): void;

// Player sends a transport ship to target with troops
boatSendTroops(
player: Player,
target: Player | TerraNullius,
type: BoatUnitType,
troops: number | bigint,
): void;

// Player's transport ship arrives at target with troops
boatArriveTroops(
player: Player,
target: Player | TerraNullius,
type: BoatUnitType,
troops: number | bigint,
): void;

// Player destroys target's transport ship with troops
boatDestroyTroops(
player: Player,
target: Player,
type: BoatUnitType,
troops: number | bigint,
): void;

Expand Down
47 changes: 33 additions & 14 deletions src/core/game/StatsImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
BOAT_INDEX_CAPTURE,
BOAT_INDEX_DESTROY,
BOAT_INDEX_SENT,
BoatUnit,
BoatUnitType,
BOMB_INDEX_INTERCEPT,
BOMB_INDEX_LAND,
BOMB_INDEX_LAUNCH,
Expand All @@ -28,6 +28,7 @@ import {
PLAYER_INDEX_HUMAN,
PLAYER_INDEX_NATION,
PlayerStats,
unitTypeToBoatUnit,
unitTypeToBombUnit,
unitTypeToOtherUnit,
} from "../StatsSchemas";
Expand Down Expand Up @@ -97,10 +98,11 @@ export class StatsImpl implements Stats {

private _addBoat(
player: Player,
type: BoatUnit,
boatType: BoatUnitType,
index: number,
value: BigIntLike,
) {
const type = unitTypeToBoatUnit[boatType];
const p = this._makePlayerStats(player);
if (p === undefined) return;
p.boats ??= { [type]: [0n] };
Expand Down Expand Up @@ -188,43 +190,60 @@ export class StatsImpl implements Stats {
this._addBetrayal(player, 1);
}

boatSendTrade(player: Player, target: Player): void {
this._addBoat(player, "trade", BOAT_INDEX_SENT, 1);
boatSendTrade(player: Player, target: Player, type: BoatUnitType): void {
this._addBoat(player, type, BOAT_INDEX_SENT, 1);
}

boatArriveTrade(player: Player, target: Player, gold: BigIntLike): void {
this._addBoat(player, "trade", BOAT_INDEX_ARRIVE, 1);
boatArriveTrade(
player: Player,
target: Player,
type: BoatUnitType,
gold: BigIntLike,
): void {
this._addBoat(player, type, BOAT_INDEX_ARRIVE, 1);
this._addGold(player, GOLD_INDEX_TRADE, gold);
this._addGold(target, GOLD_INDEX_TRADE, gold);
}

boatCapturedTrade(player: Player, target: Player, gold: BigIntLike): void {
this._addBoat(player, "trade", BOAT_INDEX_CAPTURE, 1);
boatCapturedTrade(
player: Player,
target: Player,
type: BoatUnitType,
gold: BigIntLike,
): void {
this._addBoat(player, type, BOAT_INDEX_CAPTURE, 1);
this._addGold(player, GOLD_INDEX_STEAL, gold);
}

boatDestroyTrade(player: Player, target: Player): void {
this._addBoat(player, "trade", BOAT_INDEX_DESTROY, 1);
boatDestroyTrade(player: Player, target: Player, type: BoatUnitType): void {
this._addBoat(player, type, BOAT_INDEX_DESTROY, 1);
}

boatSendTroops(
player: Player,
target: Player | TerraNullius,
type: BoatUnitType,
troops: BigIntLike,
): void {
this._addBoat(player, "trans", BOAT_INDEX_SENT, 1);
this._addBoat(player, type, BOAT_INDEX_SENT, 1);
}

boatArriveTroops(
player: Player,
target: Player | TerraNullius,
type: BoatUnitType,
troops: BigIntLike,
): void {
this._addBoat(player, "trans", BOAT_INDEX_ARRIVE, 1);
this._addBoat(player, type, BOAT_INDEX_ARRIVE, 1);
}

boatDestroyTroops(player: Player, target: Player, troops: BigIntLike): void {
this._addBoat(player, "trans", BOAT_INDEX_DESTROY, 1);
boatDestroyTroops(
player: Player,
target: Player,
type: BoatUnitType,
troops: BigIntLike,
): void {
this._addBoat(player, type, BOAT_INDEX_DESTROY, 1);
}

bombLaunch(
Expand Down
11 changes: 9 additions & 2 deletions src/core/game/UnitImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -302,10 +302,17 @@ export class UnitImpl implements Unit {
case UnitType.TransportShip:
this.mg
.stats()
.boatDestroyTroops(destroyer, this._owner, this._troops);
.boatDestroyTroops(
destroyer,
this._owner,
UnitType.TransportShip,
this._troops,
);
break;
case UnitType.TradeShip:
this.mg.stats().boatDestroyTrade(destroyer, this._owner);
this.mg
.stats()
.boatDestroyTrade(destroyer, this._owner, UnitType.TradeShip);
break;
case UnitType.City:
case UnitType.DefensePost:
Expand Down
14 changes: 7 additions & 7 deletions tests/Stats.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ describe("Stats", () => {
});

test("boatSendTrade", () => {
stats.boatSendTrade(player1, player2);
stats.boatSendTrade(player1, player2, UnitType.TradeShip);
expect(stats.stats()).toStrictEqual({
client1: {
boats: {
Expand All @@ -72,7 +72,7 @@ describe("Stats", () => {
});

test("boatArriveTrade", () => {
stats.boatArriveTrade(player1, player2, 1);
stats.boatArriveTrade(player1, player2, UnitType.TradeShip, 1);
expect(stats.stats()).toStrictEqual({
client1: {
boats: { trade: [0n, 1n] },
Expand All @@ -85,7 +85,7 @@ describe("Stats", () => {
});

test("boatCapturedTrade", () => {
stats.boatCapturedTrade(player1, player2, 1);
stats.boatCapturedTrade(player1, player2, UnitType.TradeShip, 1);
expect(stats.stats()).toStrictEqual({
client1: {
boats: { trade: [0n, 0n, 1n] },
Expand All @@ -95,7 +95,7 @@ describe("Stats", () => {
});

test("boatDestroyTrade", () => {
stats.boatDestroyTrade(player1, player2);
stats.boatDestroyTrade(player1, player2, UnitType.TradeShip);
expect(stats.stats()).toStrictEqual({
client1: {
boats: { trade: [0n, 0n, 0n, 1n] },
Expand All @@ -104,7 +104,7 @@ describe("Stats", () => {
});

test("boatSendTroops", () => {
stats.boatSendTroops(player1, player2, 1);
stats.boatSendTroops(player1, player2, UnitType.TransportShip, 1);
expect(stats.stats()).toStrictEqual({
client1: {
boats: {
Expand All @@ -115,7 +115,7 @@ describe("Stats", () => {
});

test("boatArriveTroops", () => {
stats.boatArriveTroops(player1, player2, 1);
stats.boatArriveTroops(player1, player2, UnitType.TransportShip, 1);
expect(stats.stats()).toStrictEqual({
client1: {
boats: { trans: [0n, 1n] },
Expand All @@ -124,7 +124,7 @@ describe("Stats", () => {
});

test("boatDestroyTroops", () => {
stats.boatDestroyTroops(player1, player2, 1);
stats.boatDestroyTroops(player1, player2, UnitType.TransportShip, 1);
expect(stats.stats()).toStrictEqual({
client1: {
boats: { trans: [0n, 0n, 0n, 1n] },
Expand Down
Loading