mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-26 08:44:36 +00:00
d9ea9fd432
## Description: Betrayal count in PlayerUpdates came from stats. But stats are only kept for players with ClientID aka real humans. So betrayals stayed 0 for Nations even after betraying others. This PR fixes it by keeping a seperate betrayal count for PlayerUpdates while stats are still being kept to go in the database. See bug report https://discord.com/channels/1284581928254701718/1432759837560799403 After: <img width="642" height="337" alt="image" src="https://github.com/user-attachments/assets/1b8bcfa1-aadd-4bea-8a5f-7fa9f2c9111f" /> ## 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: tryout33
270 lines
5.3 KiB
TypeScript
270 lines
5.3 KiB
TypeScript
import { AllPlayersStats, ClientID, Winner } from "../Schemas";
|
|
import {
|
|
EmojiMessage,
|
|
GameUpdates,
|
|
Gold,
|
|
MessageType,
|
|
NameViewData,
|
|
PlayerID,
|
|
PlayerType,
|
|
Team,
|
|
Tick,
|
|
TrainType,
|
|
UnitType,
|
|
} from "./Game";
|
|
import { TileRef, TileUpdate } from "./GameMap";
|
|
|
|
export interface GameUpdateViewData {
|
|
tick: number;
|
|
updates: GameUpdates;
|
|
packedTileUpdates: BigUint64Array;
|
|
playerNameViewData: Record<string, NameViewData>;
|
|
}
|
|
|
|
export interface ErrorUpdate {
|
|
errMsg: string;
|
|
stack?: string;
|
|
}
|
|
|
|
export enum GameUpdateType {
|
|
Tile,
|
|
Unit,
|
|
Player,
|
|
DisplayEvent,
|
|
DisplayChatEvent,
|
|
AllianceRequest,
|
|
AllianceRequestReply,
|
|
BrokeAlliance,
|
|
AllianceExpired,
|
|
AllianceExtension,
|
|
TargetPlayer,
|
|
Emoji,
|
|
Win,
|
|
Hash,
|
|
UnitIncoming,
|
|
BonusEvent,
|
|
RailroadEvent,
|
|
ConquestEvent,
|
|
EmbargoEvent,
|
|
}
|
|
|
|
export type GameUpdate =
|
|
| TileUpdateWrapper
|
|
| UnitUpdate
|
|
| PlayerUpdate
|
|
| AllianceRequestUpdate
|
|
| AllianceRequestReplyUpdate
|
|
| BrokeAllianceUpdate
|
|
| AllianceExpiredUpdate
|
|
| DisplayMessageUpdate
|
|
| DisplayChatMessageUpdate
|
|
| TargetPlayerUpdate
|
|
| EmojiUpdate
|
|
| WinUpdate
|
|
| HashUpdate
|
|
| UnitIncomingUpdate
|
|
| AllianceExtensionUpdate
|
|
| BonusEventUpdate
|
|
| RailroadUpdate
|
|
| ConquestUpdate
|
|
| EmbargoUpdate;
|
|
|
|
export interface BonusEventUpdate {
|
|
type: GameUpdateType.BonusEvent;
|
|
player: PlayerID;
|
|
tile: TileRef;
|
|
gold: number;
|
|
troops: number;
|
|
}
|
|
|
|
export enum RailType {
|
|
VERTICAL,
|
|
HORIZONTAL,
|
|
TOP_LEFT,
|
|
TOP_RIGHT,
|
|
BOTTOM_LEFT,
|
|
BOTTOM_RIGHT,
|
|
}
|
|
|
|
export interface RailTile {
|
|
tile: TileRef;
|
|
railType: RailType;
|
|
}
|
|
|
|
export interface RailroadUpdate {
|
|
type: GameUpdateType.RailroadEvent;
|
|
isActive: boolean;
|
|
railTiles: RailTile[];
|
|
}
|
|
|
|
export interface ConquestUpdate {
|
|
type: GameUpdateType.ConquestEvent;
|
|
conquerorId: PlayerID;
|
|
conqueredId: PlayerID;
|
|
gold: Gold;
|
|
}
|
|
|
|
export interface TileUpdateWrapper {
|
|
type: GameUpdateType.Tile;
|
|
update: TileUpdate;
|
|
}
|
|
|
|
export interface UnitUpdate {
|
|
type: GameUpdateType.Unit;
|
|
unitType: UnitType;
|
|
troops: number;
|
|
id: number;
|
|
ownerID: number;
|
|
lastOwnerID?: number;
|
|
// TODO: make these tilerefs
|
|
pos: TileRef;
|
|
lastPos: TileRef;
|
|
isActive: boolean;
|
|
reachedTarget: boolean;
|
|
retreating: boolean;
|
|
targetable: boolean;
|
|
markedForDeletion: number | false;
|
|
targetUnitId?: number; // Only for trade ships
|
|
targetTile?: TileRef; // Only for nukes
|
|
health?: number;
|
|
constructionType?: UnitType;
|
|
missileTimerQueue: number[];
|
|
level: number;
|
|
hasTrainStation: boolean;
|
|
trainType?: TrainType; // Only for trains
|
|
loaded?: boolean; // Only for trains
|
|
}
|
|
|
|
export interface AttackUpdate {
|
|
attackerID: number;
|
|
targetID: number;
|
|
troops: number;
|
|
id: string;
|
|
retreating: boolean;
|
|
}
|
|
|
|
export interface PlayerUpdate {
|
|
type: GameUpdateType.Player;
|
|
nameViewData?: NameViewData;
|
|
clientID: ClientID | null;
|
|
name: string;
|
|
displayName: string;
|
|
id: PlayerID;
|
|
team?: Team;
|
|
smallID: number;
|
|
playerType: PlayerType;
|
|
isAlive: boolean;
|
|
isDisconnected: boolean;
|
|
tilesOwned: number;
|
|
gold: Gold;
|
|
troops: number;
|
|
allies: number[];
|
|
embargoes: Set<PlayerID>;
|
|
isTraitor: boolean;
|
|
traitorRemainingTicks?: number;
|
|
targets: number[];
|
|
outgoingEmojis: EmojiMessage[];
|
|
outgoingAttacks: AttackUpdate[];
|
|
incomingAttacks: AttackUpdate[];
|
|
outgoingAllianceRequests: PlayerID[];
|
|
alliances: AllianceView[];
|
|
hasSpawned: boolean;
|
|
betrayals: number;
|
|
lastDeleteUnitTick: Tick;
|
|
}
|
|
|
|
export interface AllianceView {
|
|
id: number;
|
|
other: PlayerID;
|
|
createdAt: Tick;
|
|
expiresAt: Tick;
|
|
}
|
|
|
|
export interface AllianceRequestUpdate {
|
|
type: GameUpdateType.AllianceRequest;
|
|
requestorID: number;
|
|
recipientID: number;
|
|
createdAt: Tick;
|
|
}
|
|
|
|
export interface AllianceRequestReplyUpdate {
|
|
type: GameUpdateType.AllianceRequestReply;
|
|
request: AllianceRequestUpdate;
|
|
accepted: boolean;
|
|
}
|
|
|
|
export interface BrokeAllianceUpdate {
|
|
type: GameUpdateType.BrokeAlliance;
|
|
traitorID: number;
|
|
betrayedID: number;
|
|
}
|
|
|
|
export interface AllianceExpiredUpdate {
|
|
type: GameUpdateType.AllianceExpired;
|
|
player1ID: number;
|
|
player2ID: number;
|
|
}
|
|
|
|
export interface AllianceExtensionUpdate {
|
|
type: GameUpdateType.AllianceExtension;
|
|
playerID: number;
|
|
allianceID: number;
|
|
}
|
|
|
|
export interface TargetPlayerUpdate {
|
|
type: GameUpdateType.TargetPlayer;
|
|
playerID: number;
|
|
targetID: number;
|
|
}
|
|
|
|
export interface EmojiUpdate {
|
|
type: GameUpdateType.Emoji;
|
|
emoji: EmojiMessage;
|
|
}
|
|
|
|
export interface DisplayMessageUpdate {
|
|
type: GameUpdateType.DisplayEvent;
|
|
message: string;
|
|
messageType: MessageType;
|
|
goldAmount?: bigint;
|
|
playerID: number | null;
|
|
params?: Record<string, string | number>;
|
|
}
|
|
|
|
export type DisplayChatMessageUpdate = {
|
|
type: GameUpdateType.DisplayChatEvent;
|
|
key: string;
|
|
category: string;
|
|
target: string | undefined;
|
|
playerID: number | null;
|
|
isFrom: boolean;
|
|
recipient: string;
|
|
};
|
|
|
|
export interface WinUpdate {
|
|
type: GameUpdateType.Win;
|
|
allPlayersStats: AllPlayersStats;
|
|
winner: Winner;
|
|
}
|
|
|
|
export interface HashUpdate {
|
|
type: GameUpdateType.Hash;
|
|
tick: Tick;
|
|
hash: number;
|
|
}
|
|
|
|
export interface UnitIncomingUpdate {
|
|
type: GameUpdateType.UnitIncoming;
|
|
unitID: number;
|
|
message: string;
|
|
messageType: MessageType;
|
|
playerID: number;
|
|
}
|
|
|
|
export interface EmbargoUpdate {
|
|
type: GameUpdateType.EmbargoEvent;
|
|
event: "start" | "stop";
|
|
playerID: number;
|
|
embargoedID: number;
|
|
}
|