mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-22 01:57:44 +00:00
c2cf2ce65f
## Description: Record player death ticks and "conquests" (when a player has < 100 tiles). Tournaments would be easier to manage with those information. Related infra PR: https://github.com/openfrontio/infra/pull/196 Tested locally with docker/infra repo ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: IngloriousTom
111 lines
3.8 KiB
TypeScript
111 lines
3.8 KiB
TypeScript
import { z } from "zod";
|
|
import { UnitType } from "./game/Game";
|
|
|
|
export const bombUnits = ["abomb", "hbomb", "mirv", "mirvw"] as const;
|
|
export const BombUnitSchema = z.enum(bombUnits);
|
|
export type BombUnit = z.infer<typeof BombUnitSchema>;
|
|
export type NukeType =
|
|
| UnitType.AtomBomb
|
|
| UnitType.HydrogenBomb
|
|
| UnitType.MIRV
|
|
| UnitType.MIRVWarhead;
|
|
|
|
export const unitTypeToBombUnit = {
|
|
[UnitType.AtomBomb]: "abomb",
|
|
[UnitType.HydrogenBomb]: "hbomb",
|
|
[UnitType.MIRV]: "mirv",
|
|
[UnitType.MIRVWarhead]: "mirvw",
|
|
} as const satisfies Record<NukeType, BombUnit>;
|
|
|
|
export const boatUnits = ["trade", "trans"] as const;
|
|
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 otherUnits = [
|
|
"city",
|
|
"defp",
|
|
"port",
|
|
"wshp",
|
|
"silo",
|
|
"saml",
|
|
"fact",
|
|
] as const;
|
|
export const OtherUnitSchema = z.enum(otherUnits);
|
|
export type OtherUnit = z.infer<typeof OtherUnitSchema>;
|
|
export type OtherUnitType =
|
|
| UnitType.City
|
|
| UnitType.DefensePost
|
|
| UnitType.MissileSilo
|
|
| UnitType.Port
|
|
| UnitType.SAMLauncher
|
|
| UnitType.Warship
|
|
| UnitType.Factory;
|
|
|
|
export const unitTypeToOtherUnit = {
|
|
[UnitType.City]: "city",
|
|
[UnitType.DefensePost]: "defp",
|
|
[UnitType.MissileSilo]: "silo",
|
|
[UnitType.Port]: "port",
|
|
[UnitType.SAMLauncher]: "saml",
|
|
[UnitType.Warship]: "wshp",
|
|
[UnitType.Factory]: "fact",
|
|
} as const satisfies Record<OtherUnitType, OtherUnit>;
|
|
|
|
// Attacks
|
|
export const ATTACK_INDEX_SENT = 0; // Outgoing attack troops
|
|
export const ATTACK_INDEX_RECV = 1; // Incmoing attack troops
|
|
export const ATTACK_INDEX_CANCEL = 2; // Cancelled attack troops
|
|
|
|
// Boats
|
|
export const BOAT_INDEX_SENT = 0; // Boats launched
|
|
export const BOAT_INDEX_ARRIVE = 1; // Boats arrived
|
|
export const BOAT_INDEX_CAPTURE = 2; // Boats captured
|
|
export const BOAT_INDEX_DESTROY = 3; // Boats destroyed
|
|
|
|
// Bombs
|
|
export const BOMB_INDEX_LAUNCH = 0; // Bombs launched
|
|
export const BOMB_INDEX_LAND = 1; // Bombs landed
|
|
export const BOMB_INDEX_INTERCEPT = 2; // Bombs intercepted
|
|
|
|
// Gold
|
|
export const GOLD_INDEX_WORK = 0; // Gold earned by workers
|
|
export const GOLD_INDEX_WAR = 1; // Gold earned by conquering players
|
|
export const GOLD_INDEX_TRADE = 2; // Gold earned by trade ships
|
|
export const GOLD_INDEX_STEAL = 3; // Gold earned by capturing trade ships
|
|
|
|
// Other Units
|
|
export const OTHER_INDEX_BUILT = 0; // Structures and warships built
|
|
export const OTHER_INDEX_DESTROY = 1; // Structures and warships destroyed
|
|
export const OTHER_INDEX_CAPTURE = 2; // Structures captured
|
|
export const OTHER_INDEX_LOST = 3; // Structures/warships destroyed/captured by others
|
|
export const OTHER_INDEX_UPGRADE = 4; // Structures upgraded
|
|
|
|
export const BigIntStringSchema = z.preprocess((val) => {
|
|
if (typeof val === "string" && /^-?\d+$/.test(val)) return BigInt(val);
|
|
if (typeof val === "bigint") return val;
|
|
return val;
|
|
}, z.bigint());
|
|
|
|
const AtLeastOneNumberSchema = BigIntStringSchema.array().min(1);
|
|
export type AtLeastOneNumber = z.infer<typeof AtLeastOneNumberSchema>;
|
|
|
|
export const PlayerStatsSchema = z
|
|
.object({
|
|
attacks: AtLeastOneNumberSchema.optional(),
|
|
betrayals: BigIntStringSchema.optional(),
|
|
killedAt: BigIntStringSchema.optional(),
|
|
conquests: BigIntStringSchema.optional(),
|
|
boats: z.partialRecord(BoatUnitSchema, AtLeastOneNumberSchema).optional(),
|
|
bombs: z.partialRecord(BombUnitSchema, AtLeastOneNumberSchema).optional(),
|
|
gold: AtLeastOneNumberSchema.optional(),
|
|
units: z.partialRecord(OtherUnitSchema, AtLeastOneNumberSchema).optional(),
|
|
})
|
|
.optional();
|
|
export type PlayerStats = z.infer<typeof PlayerStatsSchema>;
|