diff --git a/eslint.config.js b/eslint.config.js index d0ebfde9a..05c378288 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -48,10 +48,20 @@ export default [ { rules: { // Enable rules - "@typescript-eslint/consistent-type-assertions": [ - "warn", // TODO: Raise this to error, https://github.com/openfrontio/OpenFrontIO/issues/1033 - { assertionStyle: "never" }, + "@typescript-eslint/consistent-type-definitions": [ + "error", + "type", + // TODO: { assertionStyle: "never" }, https://github.com/openfrontio/OpenFrontIO/issues/1033 ], + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-inferrable-types": "error", + "@typescript-eslint/no-mixed-enums": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-includes": "error", + "@typescript-eslint/prefer-literal-enum-member": "error", "@typescript-eslint/prefer-nullish-coalescing": "error", eqeqeq: "error", "sort-keys": "error", diff --git a/src/client/ClientGameRunner.ts b/src/client/ClientGameRunner.ts index eab9a3393..b96cd8257 100644 --- a/src/client/ClientGameRunner.ts +++ b/src/client/ClientGameRunner.ts @@ -47,7 +47,7 @@ import { import { createCanvas } from "./Utils"; import { createRenderer, GameRenderer } from "./graphics/GameRenderer"; -export interface LobbyConfig { +export type LobbyConfig = { serverConfig: ServerConfig; pattern: string | undefined; flag: string; @@ -59,7 +59,7 @@ export interface LobbyConfig { gameStartInfo?: GameStartInfo; // GameRecord exists when replaying an archived game. gameRecord?: GameRecord; -} +}; export function joinLobby( eventBus: EventBus, @@ -192,7 +192,7 @@ export class ClientGameRunner { private lastMousePosition: { x: number; y: number } | null = null; - private lastMessageTime: number = 0; + private lastMessageTime = 0; private connectionCheckInterval: NodeJS.Timeout | null = null; constructor( @@ -364,7 +364,7 @@ export class ClientGameRunner { this.transport.connect(onconnect, onmessage); } - public stop(saveFullGame: boolean = false) { + public stop(saveFullGame = false) { if (!this.isActive) return; this.isActive = false; @@ -420,7 +420,7 @@ export class ClientGameRunner { const owner = this.gameView.owner(tile); if (owner.isPlayer()) { - this.gameView.setFocusedPlayer(owner as PlayerView); + this.gameView.setFocusedPlayer(owner); } else { this.gameView.setFocusedPlayer(null); } @@ -623,7 +623,7 @@ export class ClientGameRunner { if (this.gameView.isLand(tile)) { const owner = this.gameView.owner(tile); if (owner.isPlayer()) { - this.gameView.setFocusedPlayer(owner as PlayerView); + this.gameView.setFocusedPlayer(owner); } else { this.gameView.setFocusedPlayer(null); } @@ -637,7 +637,7 @@ export class ClientGameRunner { .sort((a, b) => a.distSquared - b.distSquared); if (units.length > 0) { - this.gameView.setFocusedPlayer(units[0].unit.owner() as PlayerView); + this.gameView.setFocusedPlayer(units[0].unit.owner()); } else { this.gameView.setFocusedPlayer(null); } diff --git a/src/client/FlagInput.ts b/src/client/FlagInput.ts index 584253700..aeb1f0493 100644 --- a/src/client/FlagInput.ts +++ b/src/client/FlagInput.ts @@ -1,11 +1,11 @@ import { LitElement, css, html } from "lit"; import { customElement, state } from "lit/decorators.js"; import { renderPlayerFlag } from "../core/CustomFlag"; -const flagKey: string = "flag"; +const flagKey = "flag"; @customElement("flag-input") export class FlagInput extends LitElement { - @state() public flag: string = ""; + @state() public flag = ""; static styles = css` @media (max-width: 768px) { diff --git a/src/client/FlagInputModal.ts b/src/client/FlagInputModal.ts index 86e413677..eb4b65ad3 100644 --- a/src/client/FlagInputModal.ts +++ b/src/client/FlagInputModal.ts @@ -9,7 +9,7 @@ export class FlagInputModal extends LitElement { close: () => void; }; - @state() private search: string = ""; + @state() private search = ""; createRenderRoot() { return this; diff --git a/src/client/GoogleAdElement.ts b/src/client/GoogleAdElement.ts index 8d86e47fa..2d22d33bc 100644 --- a/src/client/GoogleAdElement.ts +++ b/src/client/GoogleAdElement.ts @@ -2,6 +2,7 @@ import { LitElement, css, html } from "lit"; import { customElement, property } from "lit/decorators.js"; declare global { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface Window { adsbygoogle: unknown[]; } @@ -108,7 +109,7 @@ const isElectron = () => { if ( typeof navigator === "object" && typeof navigator.userAgent === "string" && - navigator.userAgent.indexOf("Electron") >= 0 + navigator.userAgent.includes("Electron") ) { return true; } diff --git a/src/client/HostLobbyModal.ts b/src/client/HostLobbyModal.ts index 63a73731f..05905b922 100644 --- a/src/client/HostLobbyModal.ts +++ b/src/client/HostLobbyModal.ts @@ -40,19 +40,19 @@ export class HostLobbyModal extends LitElement { @state() private disableNPCs = false; @state() private gameMode: GameMode = GameMode.FFA; @state() private teamCount: TeamCountConfig = 2; - @state() private bots: number = 400; - @state() private infiniteGold: boolean = false; - @state() private donateGold: boolean = false; - @state() private infiniteTroops: boolean = false; - @state() private donateTroops: boolean = false; - @state() private instantBuild: boolean = false; + @state() private bots = 400; + @state() private infiniteGold = false; + @state() private donateGold = false; + @state() private infiniteTroops = false; + @state() private donateTroops = false; + @state() private instantBuild = false; @state() private lobbyId = ""; @state() private copySuccess = false; @state() private clients: ClientInfo[] = []; - @state() private useRandomMap: boolean = false; + @state() private useRandomMap = false; @state() private disabledUnits: UnitType[] = []; - @state() private lobbyCreatorClientID: string = ""; - @state() private lobbyIdVisible: boolean = true; + @state() private lobbyCreatorClientID = ""; + @state() private lobbyIdVisible = true; private playersInterval: NodeJS.Timeout | null = null; // Add a new timer for debouncing bot changes diff --git a/src/client/InputHandler.ts b/src/client/InputHandler.ts index 5b9d397a8..5f0ab44e6 100644 --- a/src/client/InputHandler.ts +++ b/src/client/InputHandler.ts @@ -115,17 +115,17 @@ export class AutoUpgradeEvent implements GameEvent { } export class InputHandler { - private lastPointerX: number = 0; - private lastPointerY: number = 0; + private lastPointerX = 0; + private lastPointerY = 0; - private lastPointerDownX: number = 0; - private lastPointerDownY: number = 0; + private lastPointerDownX = 0; + private lastPointerDownY = 0; private pointers: Map = new Map(); - private lastPinchDistance: number = 0; + private lastPinchDistance = 0; - private pointerDown: boolean = false; + private pointerDown = false; private alternateView = false; @@ -163,7 +163,7 @@ export class InputHandler { }; // Mac users might have different keybinds - const isMac = /Mac/.test(navigator.userAgent); + const isMac = navigator.userAgent.includes("Mac"); if (isMac) { this.keybinds.modifierKey = "MetaLeft"; // Use Command key on Mac } diff --git a/src/client/JoinPrivateLobbyModal.ts b/src/client/JoinPrivateLobbyModal.ts index a4a4a0809..d67697836 100644 --- a/src/client/JoinPrivateLobbyModal.ts +++ b/src/client/JoinPrivateLobbyModal.ts @@ -19,7 +19,7 @@ export class JoinPrivateLobbyModal extends LitElement { close: () => void; }; @query("#lobbyIdInput") private lobbyIdInput!: HTMLInputElement; - @state() private message: string = ""; + @state() private message = ""; @state() private hasJoined = false; @state() private players: string[] = []; @@ -110,7 +110,7 @@ export class JoinPrivateLobbyModal extends LitElement { return this; // light DOM } - public open(id: string = "") { + public open(id = "") { this.modalEl?.open(); if (id) { this.setLobbyId(id); diff --git a/src/client/LangSelector.ts b/src/client/LangSelector.ts index ca0424f22..2e6c5d51a 100644 --- a/src/client/LangSelector.ts +++ b/src/client/LangSelector.ts @@ -35,12 +35,12 @@ import zh_CN from "../../resources/lang/zh-CN.json"; export class LangSelector extends LitElement { @state() public translations: Record | undefined; @state() public defaultTranslations: Record | undefined; - @state() public currentLang: string = "en"; + @state() public currentLang = "en"; @state() private languageList: any[] = []; - @state() private showModal: boolean = false; - @state() private debugMode: boolean = false; + @state() private showModal = false; + @state() private debugMode = false; - private debugKeyPressed: boolean = false; + private debugKeyPressed = false; private languageMap: Record = { ar, diff --git a/src/client/LocalServer.ts b/src/client/LocalServer.ts index 24cf46782..cd195b28a 100644 --- a/src/client/LocalServer.ts +++ b/src/client/LocalServer.ts @@ -169,7 +169,7 @@ export class LocalServer { }); } - public endGame(saveFullGame: boolean = false) { + public endGame(saveFullGame = false) { console.log("local server ending game"); clearInterval(this.turnCheckInterval); if (this.isReplay) { diff --git a/src/client/Main.ts b/src/client/Main.ts index 97cca212c..55b7c75b0 100644 --- a/src/client/Main.ts +++ b/src/client/Main.ts @@ -43,6 +43,7 @@ import { discordLogin, getUserMe, isLoggedIn, logOut } from "./jwt"; import "./styles.css"; declare global { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface Window { PageOS: { session: { @@ -62,13 +63,14 @@ declare global { } // Extend the global interfaces to include your custom events + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface DocumentEventMap { "join-lobby": CustomEvent; - "kick-player": CustomEvent; + "kick-player": CustomEvent; } } -export interface JoinLobbyEvent { +export type JoinLobbyEvent = { clientID: string; // Multiplayer games only have gameID, gameConfig is not known until game starts. gameID: string; @@ -76,7 +78,11 @@ export interface JoinLobbyEvent { gameStartInfo?: GameStartInfo; // GameRecord exists when replaying an archived game. gameRecord?: GameRecord; -} +}; + +export type KickPlayerEvent = { + target: string; +}; class Client { private gameStop: (() => void) | null = null; @@ -548,7 +554,7 @@ class Client { this.publicLobby.leaveLobby(); } - private handleKickPlayer(event: CustomEvent) { + private handleKickPlayer(event: CustomEvent) { const { target } = event.detail; // Forward to eventBus if available diff --git a/src/client/NewsModal.ts b/src/client/NewsModal.ts index ddfa1fdc5..e3aeef95a 100644 --- a/src/client/NewsModal.ts +++ b/src/client/NewsModal.ts @@ -32,7 +32,7 @@ export class NewsModal extends LitElement { @property({ type: String }) markdown = "Loading..."; - private initialized: boolean = false; + private initialized = false; static styles = css` :host { diff --git a/src/client/PublicLobby.ts b/src/client/PublicLobby.ts index 512c63444..6ab99d2cd 100644 --- a/src/client/PublicLobby.ts +++ b/src/client/PublicLobby.ts @@ -11,12 +11,12 @@ import { terrainMapFileLoader } from "./TerrainMapFileLoader"; @customElement("public-lobby") export class PublicLobby extends LitElement { @state() private lobbies: GameInfo[] = []; - @state() public isLobbyHighlighted: boolean = false; - @state() private isButtonDebounced: boolean = false; + @state() public isLobbyHighlighted = false; + @state() private isButtonDebounced = false; @state() private mapImages: Map = new Map(); private lobbiesInterval: number | null = null; private currLobby: GameInfo | null = null; - private debounceDelay: number = 750; + private debounceDelay = 750; private lobbyIDToStart = new Map(); createRenderRoot() { diff --git a/src/client/SinglePlayerModal.ts b/src/client/SinglePlayerModal.ts index 3f1256403..657ef62a3 100644 --- a/src/client/SinglePlayerModal.ts +++ b/src/client/SinglePlayerModal.ts @@ -34,14 +34,14 @@ export class SinglePlayerModal extends LitElement { }; @state() private selectedMap: GameMapType = GameMapType.World; @state() private selectedDifficulty: Difficulty = Difficulty.Medium; - @state() private disableNPCs: boolean = false; - @state() private bots: number = 400; - @state() private infiniteGold: boolean = false; - @state() private donateGold: boolean = false; - @state() private infiniteTroops: boolean = false; - @state() private donateTroops: boolean = false; - @state() private instantBuild: boolean = false; - @state() private useRandomMap: boolean = false; + @state() private disableNPCs = false; + @state() private bots = 400; + @state() private infiniteGold = false; + @state() private donateGold = false; + @state() private infiniteTroops = false; + @state() private donateTroops = false; + @state() private instantBuild = false; + @state() private useRandomMap = false; @state() private gameMode: GameMode = GameMode.FFA; @state() private teamCount: TeamCountConfig = 2; diff --git a/src/client/TerritoryPatternsModal.ts b/src/client/TerritoryPatternsModal.ts index 74e8e6857..3fd321faa 100644 --- a/src/client/TerritoryPatternsModal.ts +++ b/src/client/TerritoryPatternsModal.ts @@ -19,7 +19,7 @@ export class TerritoryPatternsModal extends LitElement { }; public previewButton: HTMLElement | null = null; - public buttonWidth: number = 150; + public buttonWidth = 150; @state() private selectedPattern: string | undefined; @@ -172,7 +172,7 @@ export class TerritoryPatternsModal extends LitElement { }} > ${translateText("territory_patterns.purchase")} - (${pattern.product!.price}) + (${pattern.product.price}) ` : null} diff --git a/src/client/Transport.ts b/src/client/Transport.ts index 200ae13d6..688fc5eee 100644 --- a/src/client/Transport.ts +++ b/src/client/Transport.ts @@ -383,7 +383,7 @@ export class Transport { } satisfies ClientJoinMessage); } - leaveGame(saveFullGame: boolean = false) { + leaveGame(saveFullGame = false) { if (this.isLocal) { this.localServer.endGame(saveFullGame); return; diff --git a/src/client/UsernameInput.ts b/src/client/UsernameInput.ts index 3b3c24b7d..04dce6436 100644 --- a/src/client/UsernameInput.ts +++ b/src/client/UsernameInput.ts @@ -8,13 +8,13 @@ import { validateUsername, } from "../core/validations/username"; -const usernameKey: string = "username"; +const usernameKey = "username"; @customElement("username-input") export class UsernameInput extends LitElement { - @state() private username: string = ""; - @property({ type: String }) validationError: string = ""; - private _isValid: boolean = true; + @state() private username = ""; + @property({ type: String }) validationError = ""; + private _isValid = true; private userSettings: UserSettings = new UserSettings(); // Remove static styles since we're using Tailwind diff --git a/src/client/Utils.ts b/src/client/Utils.ts index 494109fbd..118474bec 100644 --- a/src/client/Utils.ts +++ b/src/client/Utils.ts @@ -192,7 +192,7 @@ export function getMessageTypeClasses(type: MessageType): string { } export function getModifierKey(): string { - const isMac = /Mac/.test(navigator.userAgent); + const isMac = navigator.userAgent.includes("Mac"); if (isMac) { return "⌘"; // Command key } else { @@ -201,7 +201,7 @@ export function getModifierKey(): string { } export function getAltKey(): string { - const isMac = /Mac/.test(navigator.userAgent); + const isMac = navigator.userAgent.includes("Mac"); if (isMac) { return "⌥"; // Option key } else { diff --git a/src/client/components/Maps.ts b/src/client/components/Maps.ts index 0b118c0d4..77a0bab88 100644 --- a/src/client/components/Maps.ts +++ b/src/client/components/Maps.ts @@ -41,7 +41,7 @@ export const MapDescription: Record = { export class MapDisplay extends LitElement { @property({ type: String }) mapKey = ""; @property({ type: Boolean }) selected = false; - @property({ type: String }) translation: string = ""; + @property({ type: String }) translation = ""; @state() private mapWebpPath: string | null = null; @state() private mapName: string | null = null; @state() private isLoading = true; diff --git a/src/client/components/ModalOverlay.ts b/src/client/components/ModalOverlay.ts index 468de56eb..772a7399b 100644 --- a/src/client/components/ModalOverlay.ts +++ b/src/client/components/ModalOverlay.ts @@ -3,7 +3,7 @@ import { customElement, property } from "lit/decorators"; @customElement("modal-overlay") export class ModalOverlay extends LitElement { - @property({ reflect: true }) public visible: boolean = false; + @property({ reflect: true }) public visible = false; static styles = css` .overlay { diff --git a/src/client/graphics/AnimatedSprite.ts b/src/client/graphics/AnimatedSprite.ts index 5fea319d7..0cf108292 100644 --- a/src/client/graphics/AnimatedSprite.ts +++ b/src/client/graphics/AnimatedSprite.ts @@ -1,15 +1,15 @@ export class AnimatedSprite { private frameHeight: number; - private currentFrame: number = 0; - private elapsedTime: number = 0; - private active: boolean = true; + private currentFrame = 0; + private elapsedTime = 0; + private active = true; constructor( private image: CanvasImageSource, private frameWidth: number, private frameCount: number, private frameDuration: number, // in milliseconds - private looping: boolean = false, + private looping = false, private originX: number, private originY: number, ) { diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index 3a089f33e..95164f163 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -246,7 +246,7 @@ export function createRenderer( eventBus, game, transformHandler, - emojiTable as EmojiTable, + emojiTable, buildMenu, uiState, playerPanel, diff --git a/src/client/graphics/NameBoxCalculator.ts b/src/client/graphics/NameBoxCalculator.ts index 328ac7aac..2d291c04d 100644 --- a/src/client/graphics/NameBoxCalculator.ts +++ b/src/client/graphics/NameBoxCalculator.ts @@ -1,17 +1,17 @@ import { Cell, Game, NameViewData, Player } from "../../core/game/Game"; import { calculateBoundingBox } from "../../core/Util"; -export interface Point { +export type Point = { x: number; y: number; -} +}; -export interface Rectangle { +export type Rectangle = { x: number; y: number; width: number; height: number; -} +}; export function placeName(game: Game, player: Player): NameViewData { const boundingBox = diff --git a/src/client/graphics/ProgressBar.ts b/src/client/graphics/ProgressBar.ts index 52500bb87..5d186da6f 100644 --- a/src/client/graphics/ProgressBar.ts +++ b/src/client/graphics/ProgressBar.ts @@ -7,7 +7,7 @@ export class ProgressBar { private y: number, private w: number, private h: number, - private progress: number = 0, // Progress from 0 to 1 + private progress = 0, // Progress from 0 to 1 ) { this.setProgress(progress); } diff --git a/src/client/graphics/TransformHandler.ts b/src/client/graphics/TransformHandler.ts index 47b569d5a..252ee8042 100644 --- a/src/client/graphics/TransformHandler.ts +++ b/src/client/graphics/TransformHandler.ts @@ -13,10 +13,10 @@ export const CAMERA_MAX_SPEED = 15; export const CAMERA_SMOOTHING = 0.03; export class TransformHandler { - public scale: number = 1.8; + public scale = 1.8; private _boundingRect: DOMRect; - private offsetX: number = -350; - private offsetY: number = -200; + private offsetX = -350; + private offsetY = -200; private lastGoToCallTime: number | null = null; private target: Cell | null; @@ -267,7 +267,7 @@ export class TransformHandler { this.target = null; } - override(x: number = 0, y: number = 0, s: number = 1) { + override(x = 0, y = 0, s = 1) { //hardset view position this.clearTarget(); this.offsetX = x; @@ -276,7 +276,7 @@ export class TransformHandler { this.changed = true; } - centerAll(fit: number = 1) { + centerAll(fit = 1) { //position entire map centered on the screen const vpWidth = this.boundingRect().width; diff --git a/src/client/graphics/UIState.ts b/src/client/graphics/UIState.ts index be985a580..839edc7fe 100644 --- a/src/client/graphics/UIState.ts +++ b/src/client/graphics/UIState.ts @@ -1,3 +1,3 @@ -export interface UIState { +export type UIState = { attackRatio: number; -} +}; diff --git a/src/client/graphics/fx/Fx.ts b/src/client/graphics/fx/Fx.ts index 2aeb3ccf6..051e0bb66 100644 --- a/src/client/graphics/fx/Fx.ts +++ b/src/client/graphics/fx/Fx.ts @@ -1,6 +1,6 @@ -export interface Fx { +export type Fx = { renderTick(duration: number, ctx: CanvasRenderingContext2D): boolean; -} +}; export enum FxType { MiniFire = "MiniFire", diff --git a/src/client/graphics/fx/NukeFx.ts b/src/client/graphics/fx/NukeFx.ts index 479d68e18..1394e2cbd 100644 --- a/src/client/graphics/fx/NukeFx.ts +++ b/src/client/graphics/fx/NukeFx.ts @@ -7,7 +7,7 @@ import { FadeFx, SpriteFx } from "./SpriteFx"; * Shockwave effect: draw a growing 1px white circle */ export class ShockwaveFx implements Fx { - private lifeTime: number = 0; + private lifeTime = 0; constructor( private x: number, private y: number, diff --git a/src/client/graphics/fx/SpriteFx.ts b/src/client/graphics/fx/SpriteFx.ts index 919533386..7dcd000b4 100644 --- a/src/client/graphics/fx/SpriteFx.ts +++ b/src/client/graphics/fx/SpriteFx.ts @@ -4,11 +4,7 @@ import { AnimatedSprite } from "../AnimatedSprite"; import { AnimatedSpriteLoader } from "../AnimatedSpriteLoader"; import { Fx, FxType } from "./Fx"; -function fadeInOut( - t: number, - fadeIn: number = 0.3, - fadeOut: number = 0.7, -): number { +function fadeInOut(t: number, fadeIn = 0.3, fadeOut = 0.7): number { if (t < fadeIn) { const f = t / fadeIn; // Map to [0, 1] return f * f; diff --git a/src/client/graphics/fx/TextFx.ts b/src/client/graphics/fx/TextFx.ts index c1a82e212..47eb68e32 100644 --- a/src/client/graphics/fx/TextFx.ts +++ b/src/client/graphics/fx/TextFx.ts @@ -1,15 +1,15 @@ import { Fx } from "./Fx"; export class TextFx implements Fx { - private lifeTime: number = 0; + private lifeTime = 0; constructor( private text: string, private x: number, private y: number, private duration: number, - private riseDistance: number = 30, - private font: string = "11px sans-serif", + private riseDistance = 30, + private font = "11px sans-serif", private color: { r: number; g: number; b: number } = { r: 255, g: 255, diff --git a/src/client/graphics/layers/AlertFrame.ts b/src/client/graphics/layers/AlertFrame.ts index cccff9efa..c792f8398 100644 --- a/src/client/graphics/layers/AlertFrame.ts +++ b/src/client/graphics/layers/AlertFrame.ts @@ -80,7 +80,7 @@ export class AlertFrame extends LitElement implements Layer { this.game .updatesSinceLastTick() ?.[GameUpdateType.BrokeAlliance]?.forEach((update) => { - this.onBrokeAllianceUpdate(update as BrokeAllianceUpdate); + this.onBrokeAllianceUpdate(update); }); } diff --git a/src/client/graphics/layers/BuildMenu.ts b/src/client/graphics/layers/BuildMenu.ts index 9399218e9..d28a6ce63 100644 --- a/src/client/graphics/layers/BuildMenu.ts +++ b/src/client/graphics/layers/BuildMenu.ts @@ -35,13 +35,13 @@ import { renderNumber } from "../../Utils"; import { TransformHandler } from "../TransformHandler"; import { Layer } from "./Layer"; -export interface BuildItemDisplay { +export type BuildItemDisplay = { unitType: UnitType; icon: string; description?: string; key?: string; countable?: boolean; -} +}; export const buildTable: BuildItemDisplay[][] = [ [ diff --git a/src/client/graphics/layers/ChatDisplay.ts b/src/client/graphics/layers/ChatDisplay.ts index 941b08551..c2cadd0da 100644 --- a/src/client/graphics/layers/ChatDisplay.ts +++ b/src/client/graphics/layers/ChatDisplay.ts @@ -12,22 +12,22 @@ import { GameView } from "../../../core/game/GameView"; import { onlyImages } from "../../../core/Util"; import { Layer } from "./Layer"; -interface ChatEvent { +type ChatEvent = { description: string; unsafeDescription?: boolean; createdAt: number; highlight?: boolean; -} +}; @customElement("chat-display") export class ChatDisplay extends LitElement implements Layer { public eventBus: EventBus; public game: GameView; - private active: boolean = false; + private active = false; - @state() private _hidden: boolean = false; - @state() private newEvents: number = 0; + @state() private _hidden = false; + @state() private newEvents = 0; @state() private chatEvents: ChatEvent[] = []; private toggleHidden() { diff --git a/src/client/graphics/layers/ChatModal.ts b/src/client/graphics/layers/ChatModal.ts index 64023e66f..020ee8ac1 100644 --- a/src/client/graphics/layers/ChatModal.ts +++ b/src/client/graphics/layers/ChatModal.ts @@ -32,9 +32,9 @@ export class ChatModal extends LitElement { private players: PlayerView[] = []; - private playerSearchQuery: string = ""; + private playerSearchQuery = ""; private previewText: string | null = null; - private requiresPlayerSelection: boolean = false; + private requiresPlayerSelection = false; private selectedCategory: string | null = null; private selectedPhraseText: string | null = null; private selectedPhraseTemplate: string | null = null; diff --git a/src/client/graphics/layers/ControlPanel.ts b/src/client/graphics/layers/ControlPanel.ts index b10c81680..ea3ed9fdc 100644 --- a/src/client/graphics/layers/ControlPanel.ts +++ b/src/client/graphics/layers/ControlPanel.ts @@ -18,7 +18,7 @@ export class ControlPanel extends LitElement implements Layer { public uiState: UIState; @state() - private attackRatio: number = 0.2; + private attackRatio = 0.2; @state() private _maxTroops: number; @@ -35,7 +35,7 @@ export class ControlPanel extends LitElement implements Layer { @state() private _gold: Gold; - private _troopRateIsIncreasing: boolean = true; + private _troopRateIsIncreasing = true; private _lastTroopIncreaseRate: number; diff --git a/src/client/graphics/layers/EventsDisplay.ts b/src/client/graphics/layers/EventsDisplay.ts index 3712f8faa..34e59adc3 100644 --- a/src/client/graphics/layers/EventsDisplay.ts +++ b/src/client/graphics/layers/EventsDisplay.ts @@ -48,7 +48,7 @@ import { import { getMessageTypeClasses, translateText } from "../../Utils"; -interface GameEvent { +type GameEvent = { description: string; unsafeDescription?: boolean; buttons?: { @@ -66,14 +66,14 @@ interface GameEvent { duration?: Tick; focusID?: number; unitView?: UnitView; -} +}; @customElement("events-display") export class EventsDisplay extends LitElement implements Layer { public eventBus: EventBus; public game: GameView; - private active: boolean = false; + private active = false; private events: GameEvent[] = []; // allianceID -> last checked at tick @@ -82,11 +82,11 @@ export class EventsDisplay extends LitElement implements Layer { @state() private outgoingAttacks: AttackUpdate[] = []; @state() private outgoingLandAttacks: AttackUpdate[] = []; @state() private outgoingBoats: UnitView[] = []; - @state() private _hidden: boolean = false; - @state() private _isVisible: boolean = false; - @state() private newEvents: number = 0; + @state() private _hidden = false; + @state() private _isVisible = false; + @state() private newEvents = 0; @state() private latestGoldAmount: bigint | null = null; - @state() private goldAmountAnimating: boolean = false; + @state() private goldAmountAnimating = false; private goldAmountTimeoutId: ReturnType | null = null; @state() private eventsFilters: Map = new Map([ [MessageCategory.ATTACK, false], @@ -261,7 +261,7 @@ export class EventsDisplay extends LitElement implements Layer { this.alliancesCheckedAt.set(alliance.id, this.game.ticks()); - const other = this.game.player(alliance.other) as PlayerView; + const other = this.game.player(alliance.other); if (!other.isAlive()) continue; this.addEvent({ @@ -393,7 +393,7 @@ export class EventsDisplay extends LitElement implements Layer { } } - let otherPlayerDiplayName: string = ""; + let otherPlayerDiplayName = ""; if (event.recipient !== null) { //'recipient' parameter contains sender ID or recipient ID const player = this.game.player(event.recipient); diff --git a/src/client/graphics/layers/FPSDisplay.ts b/src/client/graphics/layers/FPSDisplay.ts index 37b3bb3cd..ded24567a 100644 --- a/src/client/graphics/layers/FPSDisplay.ts +++ b/src/client/graphics/layers/FPSDisplay.ts @@ -14,29 +14,29 @@ export class FPSDisplay extends LitElement implements Layer { public userSettings!: UserSettings; @state() - private currentFPS: number = 0; + private currentFPS = 0; @state() - private averageFPS: number = 0; + private averageFPS = 0; @state() - private frameTime: number = 0; + private frameTime = 0; @state() - private isVisible: boolean = false; + private isVisible = false; @state() - private isDragging: boolean = false; + private isDragging = false; @state() private position: { x: number; y: number } = { x: 50, y: 20 }; // Percentage values - private frameCount: number = 0; - private lastTime: number = 0; + private frameCount = 0; + private lastTime = 0; private frameTimes: number[] = []; private fpsHistory: number[] = []; - private lastSecondTime: number = 0; - private framesThisSecond: number = 0; + private lastSecondTime = 0; + private framesThisSecond = 0; private dragStart: { x: number; y: number } = { x: 0, y: 0 }; static styles = css` diff --git a/src/client/graphics/layers/FxLayer.ts b/src/client/graphics/layers/FxLayer.ts index 1d33ab123..877ece3da 100644 --- a/src/client/graphics/layers/FxLayer.ts +++ b/src/client/graphics/layers/FxLayer.ts @@ -20,8 +20,8 @@ export class FxLayer implements Layer { private canvas: HTMLCanvasElement; private context: CanvasRenderingContext2D; - private lastRefresh: number = 0; - private refreshRate: number = 10; + private lastRefresh = 0; + private refreshRate = 10; private theme: Theme; private animatedSpriteLoader: AnimatedSpriteLoader = new AnimatedSpriteLoader(); diff --git a/src/client/graphics/layers/GameRightSidebar.ts b/src/client/graphics/layers/GameRightSidebar.ts index 3ac7ce450..82d7f0a71 100644 --- a/src/client/graphics/layers/GameRightSidebar.ts +++ b/src/client/graphics/layers/GameRightSidebar.ts @@ -22,19 +22,19 @@ export class GameRightSidebar extends LitElement implements Layer { public eventBus: EventBus; @state() - private _isSinglePlayer: boolean = false; + private _isSinglePlayer = false; @state() - private _isReplayVisible: boolean = false; + private _isReplayVisible = false; @state() - private _isVisible: boolean = true; + private _isVisible = true; @state() - private isPaused: boolean = false; + private isPaused = false; @state() - private timer: number = 0; + private timer = 0; private hasWinner = false; diff --git a/src/client/graphics/layers/GutterAdModal.ts b/src/client/graphics/layers/GutterAdModal.ts index 707a04054..bc0027c68 100644 --- a/src/client/graphics/layers/GutterAdModal.ts +++ b/src/client/graphics/layers/GutterAdModal.ts @@ -13,16 +13,16 @@ export class GutterAdModal extends LitElement implements Layer { public eventBus: EventBus; @state() - private isVisible: boolean = false; + private isVisible = false; @state() - private adLoaded: boolean = false; + private adLoaded = false; - private leftAdType: string = "left_rail"; - private rightAdType: string = "right_rail"; - private leftContainerId: string = "gutter-ad-container-left"; - private rightContainerId: string = "gutter-ad-container-right"; - private margin: string = "10px"; + private leftAdType = "left_rail"; + private rightAdType = "right_rail"; + private leftContainerId = "gutter-ad-container-left"; + private rightContainerId = "gutter-ad-container-right"; + private margin = "10px"; // Override createRenderRoot to disable shadow DOM createRenderRoot() { diff --git a/src/client/graphics/layers/Layer.ts b/src/client/graphics/layers/Layer.ts index 239937435..36a850f78 100644 --- a/src/client/graphics/layers/Layer.ts +++ b/src/client/graphics/layers/Layer.ts @@ -1,7 +1,7 @@ -export interface Layer { +export type Layer = { init?: () => void; tick?: () => void; renderLayer?: (context: CanvasRenderingContext2D) => void; shouldTransform?: () => boolean; redraw?: () => void; -} +}; diff --git a/src/client/graphics/layers/Leaderboard.ts b/src/client/graphics/layers/Leaderboard.ts index 513aa2711..e117d82bb 100644 --- a/src/client/graphics/layers/Leaderboard.ts +++ b/src/client/graphics/layers/Leaderboard.ts @@ -7,7 +7,7 @@ import { GameView, PlayerView, UnitView } from "../../../core/game/GameView"; import { renderNumber } from "../../Utils"; import { Layer } from "./Layer"; -interface Entry { +type Entry = { name: string; position: number; score: string; @@ -15,7 +15,7 @@ interface Entry { troops: string; isMyPlayer: boolean; player: PlayerView; -} +}; export class GoToPlayerEvent implements GameEvent { constructor(public player: PlayerView) {} diff --git a/src/client/graphics/layers/MainRadialMenu.ts b/src/client/graphics/layers/MainRadialMenu.ts index 002b488b0..8a5b48e57 100644 --- a/src/client/graphics/layers/MainRadialMenu.ts +++ b/src/client/graphics/layers/MainRadialMenu.ts @@ -110,7 +110,7 @@ export class MainRadialMenu extends LitElement implements Layer { this.buildMenu.playerActions = actions; const tileOwner = this.game.owner(tile); - const recipient = tileOwner.isPlayer() ? (tileOwner as PlayerView) : null; + const recipient = tileOwner.isPlayer() ? tileOwner : null; if (myPlayer && recipient) { this.chatIntegration.setupChatModal(myPlayer, recipient); diff --git a/src/client/graphics/layers/MultiTabModal.ts b/src/client/graphics/layers/MultiTabModal.ts index 312b092d6..94b8b6021 100644 --- a/src/client/graphics/layers/MultiTabModal.ts +++ b/src/client/graphics/layers/MultiTabModal.ts @@ -13,12 +13,12 @@ export class MultiTabModal extends LitElement implements Layer { private detector: MultiTabDetector; - @property({ type: Number }) duration: number = 5000; - @state() private countdown: number = 5; - @state() private isVisible: boolean = false; - @state() private fakeIp: string = ""; - @state() private deviceFingerprint: string = ""; - @state() private reported: boolean = true; + @property({ type: Number }) duration = 5000; + @state() private countdown = 5; + @state() private isVisible = false; + @state() private fakeIp = ""; + @state() private deviceFingerprint = ""; + @state() private reported = true; private intervalId?: number; diff --git a/src/client/graphics/layers/NameLayer.ts b/src/client/graphics/layers/NameLayer.ts index 2a1863c12..245fdcbb8 100644 --- a/src/client/graphics/layers/NameLayer.ts +++ b/src/client/graphics/layers/NameLayer.ts @@ -59,7 +59,7 @@ export class NameLayer implements Layer { private firstPlace: PlayerView | null = null; private theme: Theme = this.game.config().theme(); private userSettings: UserSettings = new UserSettings(); - private isVisible: boolean = true; + private isVisible = true; constructor( private game: GameView, @@ -617,7 +617,7 @@ export class NameLayer implements Layer { src: string, size: number, id: string, - center: boolean = false, + center = false, ): HTMLImageElement { const icon = document.createElement("img"); icon.src = src; diff --git a/src/client/graphics/layers/OptionsMenu.ts b/src/client/graphics/layers/OptionsMenu.ts index e0ee2004f..3290a1bef 100644 --- a/src/client/graphics/layers/OptionsMenu.ts +++ b/src/client/graphics/layers/OptionsMenu.ts @@ -48,23 +48,23 @@ export class OptionsMenu extends LitElement implements Layer { private userSettings: UserSettings = new UserSettings(); @state() - private showPauseButton: boolean = true; + private showPauseButton = true; @state() - private isPaused: boolean = false; + private isPaused = false; @state() - private timer: number = 0; + private timer = 0; @state() - private showSettings: boolean = false; + private showSettings = false; private isVisible = false; private hasWinner = false; @state() - private alternateView: boolean = false; + private alternateView = false; private onTerrainButtonClick() { this.alternateView = !this.alternateView; diff --git a/src/client/graphics/layers/PlayerInfoOverlay.ts b/src/client/graphics/layers/PlayerInfoOverlay.ts index dab035023..f3aff01df 100644 --- a/src/client/graphics/layers/PlayerInfoOverlay.ts +++ b/src/client/graphics/layers/PlayerInfoOverlay.ts @@ -60,7 +60,7 @@ export class PlayerInfoOverlay extends LitElement implements Layer { private unit: UnitView | null = null; @state() - private _isInfoVisible: boolean = false; + private _isInfoVisible = false; private _isActive = false; @@ -107,7 +107,7 @@ export class PlayerInfoOverlay extends LitElement implements Layer { const owner = this.game.owner(tile); if (owner && owner.isPlayer()) { - this.player = owner as PlayerView; + this.player = owner; this.player.profile().then((p) => { this.playerProfile = p; }); @@ -231,7 +231,7 @@ export class PlayerInfoOverlay extends LitElement implements Layer { }} > ${player.cosmetics.flag - ? player.cosmetics.flag!.startsWith("!") + ? player.cosmetics.flag.startsWith("!") ? html`
{ @@ -244,7 +244,7 @@ export class PlayerInfoOverlay extends LitElement implements Layer { >
` : html`` : html``} ${player.name()} diff --git a/src/client/graphics/layers/PlayerPanel.ts b/src/client/graphics/layers/PlayerPanel.ts index 7f4f425db..d70fbc1a7 100644 --- a/src/client/graphics/layers/PlayerPanel.ts +++ b/src/client/graphics/layers/PlayerPanel.ts @@ -40,7 +40,7 @@ export class PlayerPanel extends LitElement implements Layer { private tile: TileRef | null = null; @state() - public isVisible: boolean = false; + public isVisible = false; @state() private allianceExpiryText: string | null = null; @@ -224,13 +224,12 @@ export class PlayerPanel extends LitElement implements Layer { const myPlayer = this.g.myPlayer(); if (myPlayer === null) return; if (this.tile === null) return; - let other = this.g.owner(this.tile); + const other = this.g.owner(this.tile); if (!other.isPlayer()) { this.hide(); console.warn("Tile is not owned by a player"); return; } - other = other as PlayerView; const canDonateGold = this.actions?.interaction?.canDonateGold; const canDonateTroops = this.actions?.interaction?.canDonateTroops; diff --git a/src/client/graphics/layers/RadialMenu.ts b/src/client/graphics/layers/RadialMenu.ts index 9e81cc7cc..eeaa2dfc1 100644 --- a/src/client/graphics/layers/RadialMenu.ts +++ b/src/client/graphics/layers/RadialMenu.ts @@ -15,12 +15,12 @@ export class CloseRadialMenuEvent implements GameEvent { constructor() {} } -export interface TooltipItem { +export type TooltipItem = { text: string; className: string; -} +}; -export interface RadialMenuConfig { +export type RadialMenuConfig = { menuSize?: number; submenuScale?: number; centerButtonSize?: number; @@ -33,7 +33,7 @@ export interface RadialMenuConfig { maxNestedLevels?: number; innerRadiusIncrement?: number; tooltipStyle?: string; -} +}; type CenterButtonState = "default" | "back"; @@ -42,9 +42,9 @@ type RequiredRadialMenuConfig = Required; export class RadialMenu implements Layer { private menuElement: d3.Selection; private tooltipElement: HTMLDivElement | null = null; - private isVisible: boolean = false; + private isVisible = false; - private currentLevel: number = 0; // Current menu level (0 = main menu, 1 = submenu, etc.) + private currentLevel = 0; // Current menu level (0 = main menu, 1 = submenu, etc.) private menuStack: MenuElement[][] = []; // Stack to track menu navigation history private currentMenuItems: MenuElement[] = []; // Current active menu items (changes based on level) @@ -53,9 +53,9 @@ export class RadialMenu implements Layer { private centerButtonState: CenterButtonState = "default"; - private isTransitioning: boolean = false; - private lastHideTime: number = 0; - private reopenCooldownMs: number = 300; + private isTransitioning = false; + private lastHideTime = 0; + private reopenCooldownMs = 300; private menuGroups: Map< number, @@ -73,8 +73,8 @@ export class RadialMenu implements Layer { private selectedItemId: string | null = null; private submenuHoverTimeout: number | null = null; private backButtonHoverTimeout: number | null = null; - private navigationInProgress: boolean = false; - private originalCenterButtonIcon: string = ""; + private navigationInProgress = false; + private originalCenterButtonIcon = ""; private params: MenuElementParams | null = null; diff --git a/src/client/graphics/layers/RadialMenuElements.ts b/src/client/graphics/layers/RadialMenuElements.ts index 3e2445d26..53e58a870 100644 --- a/src/client/graphics/layers/RadialMenuElements.ts +++ b/src/client/graphics/layers/RadialMenuElements.ts @@ -25,7 +25,7 @@ import traitorIcon from "../../../../resources/images/TraitorIconWhite.svg"; import xIcon from "../../../../resources/images/XIcon.svg"; import { EventBus } from "../../../core/EventBus"; -export interface MenuElementParams { +export type MenuElementParams = { myPlayer: PlayerView; selected: PlayerView | null; tile: TileRef; @@ -38,9 +38,9 @@ export interface MenuElementParams { chatIntegration: ChatIntegration; eventBus: EventBus; closeMenu: () => void; -} +}; -export interface MenuElement { +export type MenuElement = { id: string; name: string; displayed?: boolean | ((params: MenuElementParams) => boolean); @@ -54,18 +54,18 @@ export interface MenuElement { disabled: (params: MenuElementParams) => boolean; action?: (params: MenuElementParams) => void; // For leaf items that perform actions subMenu?: (params: MenuElementParams) => MenuElement[]; // For non-leaf items that open submenus -} +}; -export interface TooltipKey { +export type TooltipKey = { key: string; className: string; params?: Record; -} +}; -export interface CenterButtonElement { +export type CenterButtonElement = { disabled: (params: MenuElementParams) => boolean; action: (params: MenuElementParams) => void; -} +}; export const COLORS = { build: "#ebe250", @@ -566,8 +566,7 @@ export const rootMenuElement: MenuElement = { const tileOwner = params.game.owner(params.tile); const isOwnTerritory = - tileOwner.isPlayer() && - (tileOwner as PlayerView).id() === params.myPlayer.id(); + tileOwner.isPlayer() && tileOwner.id() === params.myPlayer.id(); const menuItems: (MenuElement | null)[] = [ infoMenuElement, diff --git a/src/client/graphics/layers/RailroadLayer.ts b/src/client/graphics/layers/RailroadLayer.ts index 1a77cb77a..8d111b93e 100644 --- a/src/client/graphics/layers/RailroadLayer.ts +++ b/src/client/graphics/layers/RailroadLayer.ts @@ -8,7 +8,7 @@ import { RailTile, RailType, } from "../../../core/game/GameUpdates"; -import { GameView, PlayerView } from "../../../core/game/GameView"; +import { GameView } from "../../../core/game/GameView"; import { Layer } from "./Layer"; import { getRailroadRects } from "./RailroadSprites"; @@ -151,7 +151,7 @@ export class RailroadLayer implements Layer { const x = this.game.x(railRoad.tile); const y = this.game.y(railRoad.tile); const owner = this.game.owner(railRoad.tile); - const recipient = owner.isPlayer() ? (owner as PlayerView) : null; + const recipient = owner.isPlayer() ? owner : null; const color = recipient ? this.theme.railroadColor(recipient) : new Colord({ r: 255, g: 255, b: 255, a: 1 }); diff --git a/src/client/graphics/layers/ReplayPanel.ts b/src/client/graphics/layers/ReplayPanel.ts index e68288596..a2fad7bba 100644 --- a/src/client/graphics/layers/ReplayPanel.ts +++ b/src/client/graphics/layers/ReplayPanel.ts @@ -12,8 +12,8 @@ import { Layer } from "./Layer"; export class ShowReplayPanelEvent { constructor( - public visible: boolean = true, - public isSingleplayer: boolean = false, + public visible = true, + public isSingleplayer = false, ) {} } @@ -23,7 +23,7 @@ export class ReplayPanel extends LitElement implements Layer { public eventBus: EventBus | undefined; @property({ type: Boolean }) - visible: boolean = false; + visible = false; @state() private _replaySpeedMultiplier: number = defaultReplaySpeedMultiplier; diff --git a/src/client/graphics/layers/SettingsModal.ts b/src/client/graphics/layers/SettingsModal.ts index 72d4c6cf3..a8e6b359b 100644 --- a/src/client/graphics/layers/SettingsModal.ts +++ b/src/client/graphics/layers/SettingsModal.ts @@ -18,9 +18,9 @@ import { Layer } from "./Layer"; export class ShowSettingsModalEvent { constructor( - public readonly isVisible: boolean = true, - public readonly shouldPause: boolean = false, - public readonly isPaused: boolean = false, + public readonly isVisible = true, + public readonly shouldPause = false, + public readonly isPaused = false, ) {} } @@ -30,10 +30,10 @@ export class SettingsModal extends LitElement implements Layer { public userSettings: UserSettings; @state() - private isVisible: boolean = false; + private isVisible = false; @state() - private alternateView: boolean = false; + private alternateView = false; @query(".modal-overlay") private modalOverlay!: HTMLElement; diff --git a/src/client/graphics/layers/SpawnAd.ts b/src/client/graphics/layers/SpawnAd.ts index f8f39294f..311d2dcc2 100644 --- a/src/client/graphics/layers/SpawnAd.ts +++ b/src/client/graphics/layers/SpawnAd.ts @@ -13,12 +13,12 @@ export class SpawnAd extends LitElement implements Layer { public g: GameView; @state() - private isVisible: boolean = false; + private isVisible = false; @state() - private adLoaded: boolean = false; + private adLoaded = false; - private gamesPlayed: number = 0; + private gamesPlayed = 0; // Override createRenderRoot to disable shadow DOM createRenderRoot() { diff --git a/src/client/graphics/layers/StructureIconsLayer.ts b/src/client/graphics/layers/StructureIconsLayer.ts index f28c05a88..83499e0b9 100644 --- a/src/client/graphics/layers/StructureIconsLayer.ts +++ b/src/client/graphics/layers/StructureIconsLayer.ts @@ -19,15 +19,15 @@ import { Layer } from "./Layer"; type ShapeType = "triangle" | "square" | "pentagon" | "octagon" | "circle"; class StructureRenderInfo { - public isOnScreen: boolean = false; + public isOnScreen = false; constructor( public unit: UnitView, public owner: PlayerID, public iconContainer: PIXI.Container, public levelContainer: PIXI.Container, public dotContainer: PIXI.Container, - public level: number = 0, - public underConstruction: boolean = true, + public level = 0, + public underConstruction = true, ) {} } @@ -58,7 +58,7 @@ export class StructureIconsLayer implements Layer { private iconsStage: PIXI.Container; private levelsStage: PIXI.Container; private dotsStage: PIXI.Container; - private shouldRedraw: boolean = true; + private shouldRedraw = true; private textureCache: Map = new Map(); private theme: Theme; private renderer: PIXI.Renderer; diff --git a/src/client/graphics/layers/StructureLayer.ts b/src/client/graphics/layers/StructureLayer.ts index f999edf09..46fe69dc6 100644 --- a/src/client/graphics/layers/StructureLayer.ts +++ b/src/client/graphics/layers/StructureLayer.ts @@ -23,11 +23,11 @@ const BASE_TERRITORY_RADIUS = 13.5; const RADIUS_SCALE_FACTOR = 0.5; const ZOOM_THRESHOLD = 4.3; // below this zoom level, structures are not rendered -interface UnitRenderConfig { +type UnitRenderConfig = { icon: string; borderRadius: number; territoryRadius: number; -} +}; export class StructureLayer implements Layer { private canvas: HTMLCanvasElement; diff --git a/src/client/graphics/layers/TeamStats.ts b/src/client/graphics/layers/TeamStats.ts index 687d807c6..2a1af49d6 100644 --- a/src/client/graphics/layers/TeamStats.ts +++ b/src/client/graphics/layers/TeamStats.ts @@ -6,14 +6,14 @@ import { GameView, PlayerView } from "../../../core/game/GameView"; import { renderNumber, translateText } from "../../Utils"; import { Layer } from "./Layer"; -interface TeamEntry { +type TeamEntry = { teamName: string; totalScoreStr: string; totalGold: string; totalTroops: string; totalScoreSort: number; players: PlayerView[]; -} +}; @customElement("team-stats") export class TeamStats extends LitElement implements Layer { diff --git a/src/client/graphics/layers/TerritoryLayer.ts b/src/client/graphics/layers/TerritoryLayer.ts index e104559d2..045e5adf2 100644 --- a/src/client/graphics/layers/TerritoryLayer.ts +++ b/src/client/graphics/layers/TerritoryLayer.ts @@ -391,7 +391,7 @@ export class TerritoryLayer implements Layer { } } - paintTerritory(tile: TileRef, isBorder: boolean = false) { + paintTerritory(tile: TileRef, isBorder = false) { if (isBorder && !this.game.hasOwner(tile)) { return; } diff --git a/src/client/jwt.ts b/src/client/jwt.ts index c6f6ba381..8b365adf6 100644 --- a/src/client/jwt.ts +++ b/src/client/jwt.ts @@ -77,7 +77,7 @@ export function getAuthHeader(): string { return `Bearer ${token}`; } -export async function logOut(allSessions: boolean = false) { +export async function logOut(allSessions = false) { const token = getToken(); if (token === null) return; clearToken(); diff --git a/src/client/utilities/RenderUnitTypeOptions.ts b/src/client/utilities/RenderUnitTypeOptions.ts index 0392935d6..725f2bff5 100644 --- a/src/client/utilities/RenderUnitTypeOptions.ts +++ b/src/client/utilities/RenderUnitTypeOptions.ts @@ -3,10 +3,10 @@ import { html, TemplateResult } from "lit"; import { UnitType } from "../../core/game/Game"; import { translateText } from "../Utils"; -export interface UnitTypeRenderContext { +export type UnitTypeRenderContext = { disabledUnits: UnitType[]; toggleUnit: (unit: UnitType, checked: boolean) => void; -} +}; const unitOptions: { type: UnitType; translationKey: string }[] = [ { type: UnitType.City, translationKey: "unit_type.city" }, diff --git a/src/core/EventBus.ts b/src/core/EventBus.ts index 008cc7320..3ca0c895b 100644 --- a/src/core/EventBus.ts +++ b/src/core/EventBus.ts @@ -1,8 +1,8 @@ export type GameEvent = object; -export interface EventConstructor { - new (...args: any[]): T; -} +export type EventConstructor = new ( + ...args: any[] +) => T; export class EventBus { private listeners: Map void>> = diff --git a/src/core/GameRunner.ts b/src/core/GameRunner.ts index 545c73213..9a794aac7 100644 --- a/src/core/GameRunner.ts +++ b/src/core/GameRunner.ts @@ -198,7 +198,7 @@ export class GameRunner { canTarget: player.canTarget(other), sharedBorder: player.sharesBorderWith(other), }; - const alliance = player.allianceWith(other as Player); + const alliance = player.allianceWith(other); if (alliance) { actions.interaction.allianceExpiresAt = alliance.expiresAt(); } diff --git a/src/core/PseudoRandom.ts b/src/core/PseudoRandom.ts index 495796a77..35e092275 100644 --- a/src/core/PseudoRandom.ts +++ b/src/core/PseudoRandom.ts @@ -4,9 +4,9 @@ export class PseudoRandom { private state1: number; // Keep these variables to maintain the exact same interface - private m: number = 0x80000000; // 2**31 - private a: number = 1103515245; - private c: number = 12345; + private m = 0x80000000; // 2**31 + private a = 1103515245; + private c = 12345; private state: number; private static readonly POW36_8 = Math.pow(36, 8); // Pre-compute 36^8 diff --git a/src/core/configuration/Config.ts b/src/core/configuration/Config.ts index 7dfc9c521..c9b7134e1 100644 --- a/src/core/configuration/Config.ts +++ b/src/core/configuration/Config.ts @@ -26,7 +26,7 @@ export enum GameEnv { Prod, } -export interface ServerConfig { +export type ServerConfig = { turnIntervalMs(): number; gameCreationRate(): number; lobbyMaxPlayers( @@ -62,14 +62,14 @@ export interface ServerConfig { cloudflareCredsPath(): string; stripePublishableKey(): string; allowedFlares(): string[] | undefined; -} +}; -export interface NukeMagnitude { +export type NukeMagnitude = { inner: number; outer: number; -} +}; -export interface Config { +export type Config = { samHittingChance(): number; samWarheadHittingChance(): number; spawnImmunityDuration(): Tick; @@ -170,9 +170,9 @@ export interface Config { structureMinDist(): number; isReplay(): boolean; allianceExtensionPromptOffset(): number; -} +}; -export interface Theme { +export type Theme = { teamColor(team: Team): Colord; territoryColor(playerInfo: PlayerView): Colord; specialBuildingColor(playerInfo: PlayerView): Colord; @@ -190,4 +190,4 @@ export interface Theme { allyColor(): Colord; enemyColor(): Colord; spawnHighlightColor(): Colord; -} +}; diff --git a/src/core/configuration/ConfigLoader.ts b/src/core/configuration/ConfigLoader.ts index 7fd65c1d6..3bb7f53fc 100644 --- a/src/core/configuration/ConfigLoader.ts +++ b/src/core/configuration/ConfigLoader.ts @@ -12,7 +12,7 @@ export let cachedSC: ServerConfig | null = null; export async function getConfig( gameConfig: GameConfig, userSettings: UserSettings | null, - isReplay: boolean = false, + isReplay = false, ): Promise { const sc = await getServerConfigFromClient(); switch (sc.env()) { diff --git a/src/core/execution/AttackExecution.ts b/src/core/execution/AttackExecution.ts index 69608357a..497cabd0e 100644 --- a/src/core/execution/AttackExecution.ts +++ b/src/core/execution/AttackExecution.ts @@ -18,7 +18,7 @@ const malusForRetreat = 25; export class AttackExecution implements Execution { private breakAlliance = false; private wasAlliedAtInit = false; // Store alliance state at initialization - private active: boolean = true; + private active = true; private toConquer = new FlatBinaryHeap(); private random = new PseudoRandom(123); @@ -34,7 +34,7 @@ export class AttackExecution implements Execution { private _owner: Player, private _targetID: PlayerID | null, private sourceTile: TileRef | null = null, - private removeTroops: boolean = true, + private removeTroops = true, ) {} public targetID(): PlayerID | null { @@ -69,7 +69,7 @@ export class AttackExecution implements Execution { } if (this.target && this.target.isPlayer()) { - const targetPlayer = this.target as Player; + const targetPlayer = this.target; if ( targetPlayer.type() !== PlayerType.Bot && this._owner.type() !== PlayerType.Bot diff --git a/src/core/execution/CityExecution.ts b/src/core/execution/CityExecution.ts index c037c12c2..f21e19f62 100644 --- a/src/core/execution/CityExecution.ts +++ b/src/core/execution/CityExecution.ts @@ -5,7 +5,7 @@ import { TrainStationExecution } from "./TrainStationExecution"; export class CityExecution implements Execution { private mg: Game; private city: Unit | null = null; - private active: boolean = true; + private active = true; constructor( private player: Player, @@ -48,7 +48,7 @@ export class CityExecution implements Execution { createStation(): void { if (this.city !== null) { const nearbyFactory = this.mg.hasUnitNearby( - this.city.tile()!, + this.city.tile(), this.mg.config().trainStationMaxRange(), UnitType.Factory, this.player.id(), diff --git a/src/core/execution/ConstructionExecution.ts b/src/core/execution/ConstructionExecution.ts index 8217f497d..772fe7e23 100644 --- a/src/core/execution/ConstructionExecution.ts +++ b/src/core/execution/ConstructionExecution.ts @@ -20,7 +20,7 @@ import { WarshipExecution } from "./WarshipExecution"; export class ConstructionExecution implements Execution { private construction: Unit | null = null; - private active: boolean = true; + private active = true; private mg: Game; private ticksUntilComplete: Tick; diff --git a/src/core/execution/DefensePostExecution.ts b/src/core/execution/DefensePostExecution.ts index ab36f81ae..40eb9c969 100644 --- a/src/core/execution/DefensePostExecution.ts +++ b/src/core/execution/DefensePostExecution.ts @@ -5,7 +5,7 @@ import { ShellExecution } from "./ShellExecution"; export class DefensePostExecution implements Execution { private mg: Game; private post: Unit | null = null; - private active: boolean = true; + private active = true; private target: Unit | null = null; private lastShellAttack = 0; diff --git a/src/core/execution/DeleteUnitExecution.ts b/src/core/execution/DeleteUnitExecution.ts index 424130eea..e1291c60b 100644 --- a/src/core/execution/DeleteUnitExecution.ts +++ b/src/core/execution/DeleteUnitExecution.ts @@ -1,7 +1,7 @@ import { Execution, Game, MessageType, Player } from "../game/Game"; export class DeleteUnitExecution implements Execution { - private active: boolean = true; + private active = true; private mg: Game; constructor( diff --git a/src/core/execution/FactoryExecution.ts b/src/core/execution/FactoryExecution.ts index fd24de674..f9065d0ef 100644 --- a/src/core/execution/FactoryExecution.ts +++ b/src/core/execution/FactoryExecution.ts @@ -4,7 +4,7 @@ import { TrainStationExecution } from "./TrainStationExecution"; export class FactoryExecution implements Execution { private factory: Unit | null = null; - private active: boolean = true; + private active = true; private game: Game; constructor( private player: Player, @@ -47,7 +47,7 @@ export class FactoryExecution implements Execution { createStation(): void { if (this.factory !== null) { const structures = this.game.nearbyUnits( - this.factory.tile()!, + this.factory.tile(), this.game.config().trainStationMaxRange(), [UnitType.City, UnitType.Port, UnitType.Factory], ); diff --git a/src/core/execution/MIRVExecution.ts b/src/core/execution/MIRVExecution.ts index 9a6075b68..e627fc387 100644 --- a/src/core/execution/MIRVExecution.ts +++ b/src/core/execution/MIRVExecution.ts @@ -31,7 +31,7 @@ export class MirvExecution implements Execution { private separateDst: TileRef; - private speed: number = -1; + private speed = -1; constructor( private player: Player, diff --git a/src/core/execution/NukeExecution.ts b/src/core/execution/NukeExecution.ts index 739932a5c..5bfe1debe 100644 --- a/src/core/execution/NukeExecution.ts +++ b/src/core/execution/NukeExecution.ts @@ -28,7 +28,7 @@ export class NukeExecution implements Execution { private player: Player, private dst: TileRef, private src?: TileRef | null, - private speed: number = -1, + private speed = -1, private waitTicks = 0, ) {} diff --git a/src/core/execution/PlayerExecution.ts b/src/core/execution/PlayerExecution.ts index db021bd7f..647b97eb2 100644 --- a/src/core/execution/PlayerExecution.ts +++ b/src/core/execution/PlayerExecution.ts @@ -28,11 +28,11 @@ export class PlayerExecution implements Execution { tick(ticks: number) { this.player.decayRelations(); this.player.units().forEach((u) => { - const tileOwner = this.mg!.owner(u.tile()); + const tileOwner = this.mg.owner(u.tile()); if (u.info().territoryBound) { if (tileOwner.isPlayer()) { if (tileOwner !== this.player) { - this.mg!.player(tileOwner.id()).captureUnit(u); + this.mg.player(tileOwner.id()).captureUnit(u); } } else { u.delete(); @@ -218,7 +218,7 @@ export class PlayerExecution implements Execution { } let largestNeighborAttack: Player | null = null; - let largestTroopCount: number = 0; + let largestTroopCount = 0; for (const id of neighborsIDs) { const neighbor = this.mg.playerBySmallID(id); if (!neighbor.isPlayer() || this.player.isFriendly(neighbor)) { diff --git a/src/core/execution/PortExecution.ts b/src/core/execution/PortExecution.ts index 6d3f45351..1e6bea8e8 100644 --- a/src/core/execution/PortExecution.ts +++ b/src/core/execution/PortExecution.ts @@ -90,7 +90,7 @@ export class PortExecution implements Execution { createStation(): void { if (this.port !== null) { const nearbyFactory = this.mg.hasUnitNearby( - this.port.tile()!, + this.port.tile(), this.mg.config().trainStationMaxRange(), UnitType.Factory, this.player.id(), diff --git a/src/core/execution/RailroadExecution.ts b/src/core/execution/RailroadExecution.ts index 97f28f744..268e39ba0 100644 --- a/src/core/execution/RailroadExecution.ts +++ b/src/core/execution/RailroadExecution.ts @@ -5,10 +5,10 @@ import { Railroad } from "../game/Railroad"; export class RailroadExecution implements Execution { private mg: Game; - private active: boolean = true; - private headIndex: number = 0; - private tailIndex: number = 0; - private increment: number = 3; + private active = true; + private headIndex = 0; + private tailIndex = 0; + private increment = 3; private railTiles: RailTile[] = []; constructor(private railRoad: Railroad) { this.tailIndex = railRoad.tiles.length; diff --git a/src/core/execution/SAMLauncherExecution.ts b/src/core/execution/SAMLauncherExecution.ts index 4fb2765fe..e5467f8f6 100644 --- a/src/core/execution/SAMLauncherExecution.ts +++ b/src/core/execution/SAMLauncherExecution.ts @@ -128,7 +128,7 @@ class SAMTargetingSystem { export class SAMLauncherExecution implements Execution { private mg: Game; - private active: boolean = true; + private active = true; // As MIRV go very fast we have to detect them very early but we only // shoot the one targeting very close (MIRVWarheadProtectionRadius) diff --git a/src/core/execution/SAMMissileExecution.ts b/src/core/execution/SAMMissileExecution.ts index e313acd8c..4359d9dc1 100644 --- a/src/core/execution/SAMMissileExecution.ts +++ b/src/core/execution/SAMMissileExecution.ts @@ -16,7 +16,7 @@ export class SAMMissileExecution implements Execution { private pathFinder: AirPathFinder; private SAMMissile: Unit | undefined; private mg: Game; - private speed: number = 0; + private speed = 0; constructor( private spawn: TileRef, diff --git a/src/core/execution/ShellExecution.ts b/src/core/execution/ShellExecution.ts index 4bf1103ec..9a05005eb 100644 --- a/src/core/execution/ShellExecution.ts +++ b/src/core/execution/ShellExecution.ts @@ -8,7 +8,7 @@ export class ShellExecution implements Execution { private pathFinder: AirPathFinder; private shell: Unit | undefined; private mg: Game; - private destroyAtTick: number = -1; + private destroyAtTick = -1; private random: PseudoRandom; constructor( diff --git a/src/core/execution/SpawnExecution.ts b/src/core/execution/SpawnExecution.ts index 57baff6ee..6721b2794 100644 --- a/src/core/execution/SpawnExecution.ts +++ b/src/core/execution/SpawnExecution.ts @@ -5,7 +5,7 @@ import { PlayerExecution } from "./PlayerExecution"; import { getSpawnTiles } from "./Util"; export class SpawnExecution implements Execution { - active: boolean = true; + active = true; private mg: Game; constructor( diff --git a/src/core/execution/TrainExecution.ts b/src/core/execution/TrainExecution.ts index 34a8634e7..137fa9e88 100644 --- a/src/core/execution/TrainExecution.ts +++ b/src/core/execution/TrainExecution.ts @@ -16,13 +16,13 @@ export class TrainExecution implements Execution { private mg: Game | null = null; private train: Unit | null = null; private cars: Unit[] = []; - private hasCargo: boolean = false; - private currentTile: number = 0; + private hasCargo = false; + private currentTile = 0; private spacing = 2; private usedTiles: TileRef[] = []; // used for cars behind private stations: TrainStation[] = []; private currentRailroad: OrientedRailroad | null = null; - private speed: number = 2; + private speed = 2; constructor( private railNetwork: RailNetwork, diff --git a/src/core/execution/TrainStationExecution.ts b/src/core/execution/TrainStationExecution.ts index ee0174bcc..29792655c 100644 --- a/src/core/execution/TrainStationExecution.ts +++ b/src/core/execution/TrainStationExecution.ts @@ -5,12 +5,12 @@ import { TrainExecution } from "./TrainExecution"; export class TrainStationExecution implements Execution { private mg: Game; - private active: boolean = true; + private active = true; private random: PseudoRandom; private station: TrainStation | null = null; - private numCars: number = 5; - private lastSpawnTick: number = 0; - private ticksCooldown: number = 10; // Minimum cooldown between two trains + private numCars = 5; + private lastSpawnTick = 0; + private ticksCooldown = 10; // Minimum cooldown between two trains constructor( private unit: Unit, private spawnTrains?: boolean, // If set, the station will spawn trains @@ -50,7 +50,7 @@ export class TrainStationExecution implements Execution { private shouldSpawnTrain(clusterSize: number): boolean { const spawnRate = this.mg.config().trainSpawnRate(clusterSize); - for (let i = 0; i < this.unit!.level(); i++) { + for (let i = 0; i < this.unit.level(); i++) { if (this.random.chance(spawnRate)) { return true; } diff --git a/src/core/execution/WarshipExecution.ts b/src/core/execution/WarshipExecution.ts index 9e0a71309..778a56eed 100644 --- a/src/core/execution/WarshipExecution.ts +++ b/src/core/execution/WarshipExecution.ts @@ -79,7 +79,7 @@ export class WarshipExecution implements Execution { const patrolRangeSquared = this.mg.config().warshipPatrolRange() ** 2; const ships = this.mg.nearbyUnits( - this.warship.tile()!, + this.warship.tile(), this.mg.config().warshipTargettingRange(), [UnitType.TransportShip, UnitType.Warship, UnitType.TradeShip], ); @@ -238,11 +238,11 @@ export class WarshipExecution implements Execution { return false; } - randomTile(allowShoreline: boolean = false): TileRef | undefined { + randomTile(allowShoreline = false): TileRef | undefined { let warshipPatrolRange = this.mg.config().warshipPatrolRange(); - const maxAttemptBeforeExpand: number = 500; - let attempts: number = 0; - let expandCount: number = 0; + const maxAttemptBeforeExpand = 500; + let attempts = 0; + let expandCount = 0; while (expandCount < 3) { const x = this.mg.x(this.warship.patrolTile()!) + diff --git a/src/core/game/AllianceImpl.ts b/src/core/game/AllianceImpl.ts index fa74ca766..c6b3bb3bc 100644 --- a/src/core/game/AllianceImpl.ts +++ b/src/core/game/AllianceImpl.ts @@ -1,8 +1,8 @@ import { Game, MutableAlliance, Player, Tick } from "./Game"; export class AllianceImpl implements MutableAlliance { - private extensionRequestedRequestor_: boolean = false; - private extensionRequestedRecipient_: boolean = false; + private extensionRequestedRequestor_ = false; + private extensionRequestedRecipient_ = false; private expiresAt_: Tick; diff --git a/src/core/game/BinaryLoaderGameMapLoader.ts b/src/core/game/BinaryLoaderGameMapLoader.ts index 47dccca7b..bfb6109af 100644 --- a/src/core/game/BinaryLoaderGameMapLoader.ts +++ b/src/core/game/BinaryLoaderGameMapLoader.ts @@ -2,13 +2,13 @@ import { GameMapType } from "./Game"; import { GameMapLoader, MapData } from "./GameMapLoader"; import { MapManifest } from "./TerrainMapLoader"; -export interface BinModule { +export type BinModule = { default: string; -} +}; -interface NationMapModule { +type NationMapModule = { default: MapManifest; -} +}; export class BinaryLoaderGameMapLoader implements GameMapLoader { private maps: Map; diff --git a/src/core/game/Game.ts b/src/core/game/Game.ts index d19134357..105d4dd59 100644 --- a/src/core/game/Game.ts +++ b/src/core/game/Game.ts @@ -26,10 +26,10 @@ export type GameUpdates = { [K in GameUpdateType]: UpdateTypeMap[]; }; -export interface MapPos { +export type MapPos = { x: number; y: number; -} +}; export enum Difficulty { Easy = "Easy", @@ -141,7 +141,7 @@ export enum GameMode { Team = "Team", } -export interface UnitInfo { +export type UnitInfo = { cost: (player: Player) => Gold; // Determines if its owner changes when its tile is conquered. territoryBound: boolean; @@ -151,7 +151,7 @@ export interface UnitInfo { upgradable?: boolean; canBuildTrainStation?: boolean; experimental?: boolean; -} +}; export enum UnitType { TransportShip = "Transport", @@ -191,15 +191,15 @@ export function isStructureType(type: UnitType): boolean { return _structureTypes.has(type); } -export interface OwnerComp { +export type OwnerComp = { owner: Player; -} +}; export type TrajectoryTile = { tile: TileRef; targetable: boolean; }; -export interface UnitParamsMap { +export type UnitParamsMap = { [UnitType.TransportShip]: { troops?: number; destination?: TileRef; @@ -253,7 +253,7 @@ export interface UnitParamsMap { }; [UnitType.Construction]: Record; -} +}; // Type helper to get params type for a specific unit type export type UnitParams = UnitParamsMap[T]; @@ -320,14 +320,14 @@ export enum PlayerType { FakeHuman = "FAKEHUMAN", } -export interface Execution { +export type Execution = { isActive(): boolean; activeDuringSpawnPhase(): boolean; init(mg: Game, ticks: number): void; tick(ticks: number): void; -} +}; -export interface Attack { +export type Attack = { id(): string; retreating(): boolean; retreated(): boolean; @@ -346,25 +346,25 @@ export interface Attack { clearBorder(): void; borderSize(): number; averagePosition(): Cell | null; -} +}; -export interface AllianceRequest { +export type AllianceRequest = { accept(): void; reject(): void; requestor(): Player; recipient(): Player; createdAt(): Tick; -} +}; -export interface Alliance { +export type Alliance = { requestor(): Player; recipient(): Player; createdAt(): Tick; expiresAt(): Tick; other(player: Player): Player; -} +}; -export interface MutableAlliance extends Alliance { +export type MutableAlliance = { expire(): void; other(player: Player): Player; bothAgreedToExtend(): boolean; @@ -372,7 +372,7 @@ export interface MutableAlliance extends Alliance { id(): number; extend(): void; onlyOneAgreedToExtend(): boolean; -} +} & Alliance; export class PlayerInfo { public readonly clan: string | null; @@ -406,7 +406,7 @@ export function isUnit(unit: unknown): unit is Unit { ); } -export interface Unit { +export type Unit = { isUnit(): this is Unit; // Common properties. @@ -480,22 +480,22 @@ export interface Unit { // Warships setPatrolTile(tile: TileRef): void; patrolTile(): TileRef | undefined; -} +}; -export interface TerraNullius { +export type TerraNullius = { isPlayer(): false; id(): null; clientID(): ClientID; smallID(): number; -} +}; -export interface Embargo { +export type Embargo = { createdAt: Tick; isTemporary: boolean; target: PlayerID; -} +}; -export interface Player { +export type Player = { // Basic Info smallID(): number; info(): PlayerInfo; @@ -629,9 +629,9 @@ export interface Player { tradingPorts(port: Unit): Unit[]; // WARNING: this operation is expensive. bestTransportShipSpawn(tile: TileRef): TileRef | false; -} +}; -export interface Game extends GameMap { +export type Game = { // Map & Dimensions isOnMap(cell: Cell): boolean; width(): number; @@ -715,33 +715,33 @@ export interface Game extends GameMap { addUpdate(update: GameUpdate): void; railNetwork(): RailNetwork; conquerPlayer(conqueror: Player, conquered: Player): void; -} +} & GameMap; -export interface PlayerActions { +export type PlayerActions = { canAttack: boolean; buildableUnits: BuildableUnit[]; canSendEmojiAllPlayers: boolean; interaction?: PlayerInteraction; -} +}; -export interface BuildableUnit { +export type BuildableUnit = { canBuild: TileRef | false; // unit id of the existing unit that can be upgraded, or false if it cannot be upgraded. canUpgrade: number | false; type: UnitType; cost: Gold; -} +}; -export interface PlayerProfile { +export type PlayerProfile = { relations: Record; alliances: number[]; -} +}; -export interface PlayerBorderTiles { +export type PlayerBorderTiles = { borderTiles: ReadonlySet; -} +}; -export interface PlayerInteraction { +export type PlayerInteraction = { sharedBorder: boolean; canSendEmoji: boolean; canSendAllianceRequest: boolean; @@ -751,14 +751,14 @@ export interface PlayerInteraction { canDonateTroops: boolean; canEmbargo: boolean; allianceExpiresAt?: Tick; -} +}; -export interface EmojiMessage { +export type EmojiMessage = { message: string; senderID: number; recipientID: number | typeof AllPlayers; createdAt: Tick; -} +}; export enum MessageType { ATTACK_FAILED, @@ -832,8 +832,8 @@ export function getMessageCategory(messageType: MessageType): MessageCategory { return MESSAGE_TYPE_CATEGORIES[messageType]; } -export interface NameViewData { +export type NameViewData = { x: number; y: number; size: number; -} +}; diff --git a/src/core/game/GameImpl.ts b/src/core/game/GameImpl.ts index 02ec95eb5..5edf2968c 100644 --- a/src/core/game/GameImpl.ts +++ b/src/core/game/GameImpl.ts @@ -82,7 +82,7 @@ export class GameImpl implements Game { private _railNetwork: RailNetwork = createRailNetwork(this); // Used to assign unique IDs to each new alliance - private nextAllianceID: number = 0; + private nextAllianceID = 0; constructor( private _humans: PlayerInfo[], diff --git a/src/core/game/GameMap.ts b/src/core/game/GameMap.ts index 7a3bd8e6d..230d52c3a 100644 --- a/src/core/game/GameMap.ts +++ b/src/core/game/GameMap.ts @@ -3,7 +3,7 @@ import { Cell, TerrainType } from "./Game"; export type TileRef = number; export type TileUpdate = bigint; -export interface GameMap { +export type GameMap = { ref(x: number, y: number): TileRef; isValidRef(ref: TileRef): boolean; x(ref: TileRef): number; @@ -48,7 +48,7 @@ export interface GameMap { updateTile(tu: TileUpdate): TileRef; numTilesWithFallout(): number; -} +}; export class GameMapImpl implements GameMap { private _numTilesWithFallout = 0; @@ -341,7 +341,7 @@ export class GameMapImpl implements GameMap { export function euclDistFN( root: TileRef, dist: number, - center: boolean = false, + center = false, ): (gm: GameMap, tile: TileRef) => boolean { const dist2 = dist * dist; if (!center) { @@ -364,7 +364,7 @@ export function euclDistFN( export function manhattanDistFN( root: TileRef, dist: number, - center: boolean = false, + center = false, ): (gm: GameMap, tile: TileRef) => boolean { if (!center) { return (gm: GameMap, n: TileRef) => gm.manhattanDist(root, n) <= dist; @@ -382,7 +382,7 @@ export function manhattanDistFN( export function rectDistFN( root: TileRef, dist: number, - center: boolean = false, + center = false, ): (gm: GameMap, tile: TileRef) => boolean { if (!center) { return (gm: GameMap, n: TileRef) => { @@ -415,7 +415,7 @@ function isInIsometricTile( export function isometricDistFN( root: TileRef, dist: number, - center: boolean = false, + center = false, ): (gm: GameMap, tile: TileRef) => boolean { if (!center) { return (gm: GameMap, n: TileRef) => gm.manhattanDist(root, n) <= dist; @@ -437,7 +437,7 @@ export function isometricDistFN( export function hexDistFN( root: TileRef, dist: number, - center: boolean = false, + center = false, ): (gm: GameMap, tile: TileRef) => boolean { if (!center) { return (gm: GameMap, n: TileRef) => { diff --git a/src/core/game/GameMapLoader.ts b/src/core/game/GameMapLoader.ts index abf52ccf9..dd9d378c5 100644 --- a/src/core/game/GameMapLoader.ts +++ b/src/core/game/GameMapLoader.ts @@ -1,13 +1,13 @@ import { GameMapType } from "./Game"; import { MapManifest } from "./TerrainMapLoader"; -export interface GameMapLoader { +export type GameMapLoader = { getMapData(map: GameMapType): MapData; -} +}; -export interface MapData { +export type MapData = { mapBin: () => Promise; miniMapBin: () => Promise; manifest: () => Promise; webpPath: () => Promise; -} +}; diff --git a/src/core/game/GameUpdates.ts b/src/core/game/GameUpdates.ts index 565960479..cf60babac 100644 --- a/src/core/game/GameUpdates.ts +++ b/src/core/game/GameUpdates.ts @@ -14,17 +14,17 @@ import { } from "./Game"; import { TileRef, TileUpdate } from "./GameMap"; -export interface GameUpdateViewData { +export type GameUpdateViewData = { tick: number; updates: GameUpdates; packedTileUpdates: BigUint64Array; playerNameViewData: Record; -} +}; -export interface ErrorUpdate { +export type ErrorUpdate = { errMsg: string; stack?: string; -} +}; export enum GameUpdateType { Tile, @@ -67,13 +67,13 @@ export type GameUpdate = | RailroadUpdate | ConquestUpdate; -export interface BonusEventUpdate { +export type BonusEventUpdate = { type: GameUpdateType.BonusEvent; player: PlayerID; tile: TileRef; gold: number; troops: number; -} +}; export enum RailType { VERTICAL, @@ -84,30 +84,30 @@ export enum RailType { BOTTOM_RIGHT, } -export interface RailTile { +export type RailTile = { tile: TileRef; railType: RailType; -} +}; -export interface RailroadUpdate { +export type RailroadUpdate = { type: GameUpdateType.RailroadEvent; isActive: boolean; railTiles: RailTile[]; -} +}; -export interface ConquestUpdate { +export type ConquestUpdate = { type: GameUpdateType.ConquestEvent; conquerorId: PlayerID; conqueredId: PlayerID; gold: Gold; -} +}; -export interface TileUpdateWrapper { +export type TileUpdateWrapper = { type: GameUpdateType.Tile; update: TileUpdate; -} +}; -export interface UnitUpdate { +export type UnitUpdate = { type: GameUpdateType.Unit; unitType: UnitType; troops: number; @@ -130,17 +130,17 @@ export interface UnitUpdate { hasTrainStation: boolean; trainType?: TrainType; // Only for trains loaded?: boolean; // Only for trains -} +}; -export interface AttackUpdate { +export type AttackUpdate = { attackerID: number; targetID: number; troops: number; id: string; retreating: boolean; -} +}; -export interface PlayerUpdate { +export type PlayerUpdate = { type: GameUpdateType.Player; nameViewData?: NameViewData; clientID: ClientID | null; @@ -166,65 +166,65 @@ export interface PlayerUpdate { alliances: AllianceView[]; hasSpawned: boolean; betrayals?: bigint; -} +}; -export interface AllianceView { +export type AllianceView = { id: number; other: PlayerID; createdAt: Tick; expiresAt: Tick; -} +}; -export interface AllianceRequestUpdate { +export type AllianceRequestUpdate = { type: GameUpdateType.AllianceRequest; requestorID: number; recipientID: number; createdAt: Tick; -} +}; -export interface AllianceRequestReplyUpdate { +export type AllianceRequestReplyUpdate = { type: GameUpdateType.AllianceRequestReply; request: AllianceRequestUpdate; accepted: boolean; -} +}; -export interface BrokeAllianceUpdate { +export type BrokeAllianceUpdate = { type: GameUpdateType.BrokeAlliance; traitorID: number; betrayedID: number; -} +}; -export interface AllianceExpiredUpdate { +export type AllianceExpiredUpdate = { type: GameUpdateType.AllianceExpired; player1ID: number; player2ID: number; -} +}; -export interface AllianceExtensionUpdate { +export type AllianceExtensionUpdate = { type: GameUpdateType.AllianceExtension; playerID: number; allianceID: number; -} +}; -export interface TargetPlayerUpdate { +export type TargetPlayerUpdate = { type: GameUpdateType.TargetPlayer; playerID: number; targetID: number; -} +}; -export interface EmojiUpdate { +export type EmojiUpdate = { type: GameUpdateType.Emoji; emoji: EmojiMessage; -} +}; -export interface DisplayMessageUpdate { +export type DisplayMessageUpdate = { type: GameUpdateType.DisplayEvent; message: string; messageType: MessageType; goldAmount?: bigint; playerID: number | null; params?: Record; -} +}; export type DisplayChatMessageUpdate = { type: GameUpdateType.DisplayChatEvent; @@ -236,22 +236,22 @@ export type DisplayChatMessageUpdate = { recipient: string; }; -export interface WinUpdate { +export type WinUpdate = { type: GameUpdateType.Win; allPlayersStats: AllPlayersStats; winner: Winner; -} +}; -export interface HashUpdate { +export type HashUpdate = { type: GameUpdateType.Hash; tick: Tick; hash: number; -} +}; -export interface UnitIncomingUpdate { +export type UnitIncomingUpdate = { type: GameUpdateType.UnitIncoming; unitID: number; message: string; messageType: MessageType; playerID: number; -} +}; diff --git a/src/core/game/GameView.ts b/src/core/game/GameView.ts index 34dc7e005..2739cda60 100644 --- a/src/core/game/GameView.ts +++ b/src/core/game/GameView.ts @@ -39,10 +39,10 @@ import { UserSettings } from "./UserSettings"; const userSettings: UserSettings = new UserSettings(); -interface PlayerCosmetics { +type PlayerCosmetics = { pattern?: string | undefined; flag?: string | undefined; -} +}; export class UnitView { public _wasUpdated = true; @@ -106,7 +106,7 @@ export class UnitView { return this.data.pos; } owner(): PlayerView { - return this.gameView.playerBySmallID(this.data.ownerID)! as PlayerView; + return this.gameView.playerBySmallID(this.data.ownerID) as PlayerView; } isActive(): boolean { return this.data.isActive; diff --git a/src/core/game/PlayerImpl.ts b/src/core/game/PlayerImpl.ts index 56a88cc6f..7924e4605 100644 --- a/src/core/game/PlayerImpl.ts +++ b/src/core/game/PlayerImpl.ts @@ -53,10 +53,10 @@ import { } from "./TransportShipUtils"; import { UnitImpl } from "./UnitImpl"; -interface Target { +type Target = { tick: Tick; target: Player; -} +}; class Donation { constructor( @@ -66,7 +66,7 @@ class Donation { } export class PlayerImpl implements Player { - public _lastTileChange: number = 0; + public _lastTileChange = 0; public _pseudo_random: PseudoRandom; private _gold: bigint; @@ -278,7 +278,7 @@ export class PlayerImpl implements Player { } tiles(): ReadonlySet { - return new Set(this._tiles.values()) as Set; + return new Set(this._tiles.values()); } borderTiles(): ReadonlySet { diff --git a/src/core/game/RailNetwork.ts b/src/core/game/RailNetwork.ts index 404c062be..00c2e6f5e 100644 --- a/src/core/game/RailNetwork.ts +++ b/src/core/game/RailNetwork.ts @@ -1,8 +1,8 @@ import { Unit } from "./Game"; import { TrainStation } from "./TrainStation"; -export interface RailNetwork { +export type RailNetwork = { connectStation(station: TrainStation): void; removeStation(unit: Unit): void; findStationsPath(from: TrainStation, to: TrainStation): TrainStation[]; -} +}; diff --git a/src/core/game/RailNetworkImpl.ts b/src/core/game/RailNetworkImpl.ts index 4d054f911..6232ba06d 100644 --- a/src/core/game/RailNetworkImpl.ts +++ b/src/core/game/RailNetworkImpl.ts @@ -13,12 +13,12 @@ import { Cluster, TrainStation, TrainStationMapAdapter } from "./TrainStation"; * but it would be expensive to look through the graph to find a station. * This class stores the existing stations for quick access */ -export interface StationManager { +export type StationManager = { addStation(station: TrainStation): void; removeStation(station: TrainStation): void; findStation(unit: Unit): TrainStation | null; getAll(): Set; -} +}; export class StationManagerImpl implements StationManager { private stations: Set = new Set(); @@ -43,10 +43,10 @@ export class StationManagerImpl implements StationManager { } } -export interface RailPathFinderService { +export type RailPathFinderService = { findTilePath(from: TileRef, to: TileRef): TileRef[]; findStationsPath(from: TrainStation, to: TrainStation): TrainStation[]; -} +}; class RailPathFinderServiceImpl implements RailPathFinderService { constructor(private game: Game) {} @@ -88,7 +88,7 @@ export function createRailNetwork(game: Game): RailNetwork { } export class RailNetworkImpl implements RailNetwork { - private maxConnectionDistance: number = 4; + private maxConnectionDistance = 4; constructor( private game: Game, diff --git a/src/core/game/Stats.ts b/src/core/game/Stats.ts index d328c6d71..63a8aac79 100644 --- a/src/core/game/Stats.ts +++ b/src/core/game/Stats.ts @@ -2,7 +2,7 @@ import { AllPlayersStats } from "../Schemas"; import { NukeType, OtherUnitType, PlayerStats } from "../StatsSchemas"; import { Player, TerraNullius } from "./Game"; -export interface Stats { +export type Stats = { getPlayerStats(player: Player): PlayerStats | null; stats(): AllPlayersStats; @@ -93,4 +93,4 @@ export interface Stats { // Player loses a unit of type unitLose(player: Player, type: OtherUnitType): void; -} +}; diff --git a/src/core/game/TrainStation.ts b/src/core/game/TrainStation.ts index 458ba2785..55e74ff49 100644 --- a/src/core/game/TrainStation.ts +++ b/src/core/game/TrainStation.ts @@ -9,16 +9,16 @@ import { Railroad } from "./Railroad"; /** * Handle train stops at various station types */ -interface TrainStopHandler { +type TrainStopHandler = { onStop(mg: Game, station: TrainStation, trainExecution: TrainExecution): void; -} +}; /** * All stop handlers share the same logic for the time being * Behavior to be defined */ class CityStopHandler implements TrainStopHandler { - private factor: bigint = BigInt(2); + private factor = BigInt(2); onStop( mg: Game, station: TrainStation, @@ -38,7 +38,7 @@ class CityStopHandler implements TrainStopHandler { } class PortStopHandler implements TrainStopHandler { - private factor: bigint = BigInt(2); + private factor = BigInt(2); constructor(private random: PseudoRandom) {} onStop( mg: Game, @@ -59,7 +59,7 @@ class PortStopHandler implements TrainStopHandler { } class FactoryStopHandler implements TrainStopHandler { - private factor: bigint = BigInt(2); + private factor = BigInt(2); onStop( mg: Game, station: TrainStation, diff --git a/src/core/game/TransportShipUtils.ts b/src/core/game/TransportShipUtils.ts index 0e22eafdd..df335b714 100644 --- a/src/core/game/TransportShipUtils.ts +++ b/src/core/game/TransportShipUtils.ts @@ -102,7 +102,7 @@ export function sourceDstOceanShore( const srcTile = closestShoreFromPlayer(gm, src, tile); let dstTile: TileRef | null = null; if (dst.isPlayer()) { - dstTile = closestShoreFromPlayer(gm, dst as Player, tile); + dstTile = closestShoreFromPlayer(gm, dst, tile); } else { dstTile = closestShoreTN(gm, tile, 50); } @@ -113,7 +113,7 @@ export function targetTransportTile(gm: Game, tile: TileRef): TileRef | null { const dst = gm.playerBySmallID(gm.ownerID(tile)); let dstTile: TileRef | null = null; if (dst.isPlayer()) { - dstTile = closestShoreFromPlayer(gm, dst as Player, tile); + dstTile = closestShoreFromPlayer(gm, dst, tile); } else { dstTile = closestShoreTN(gm, tile, 50); } @@ -235,7 +235,7 @@ export function candidateShoreTiles( extremumTiles.maxX, extremumTiles.maxY, ...sampledTiles, - ].filter(Boolean) as number[]; + ].filter(Boolean); return candidates; } diff --git a/src/core/game/UnitImpl.ts b/src/core/game/UnitImpl.ts index c9c61b562..c30403108 100644 --- a/src/core/game/UnitImpl.ts +++ b/src/core/game/UnitImpl.ts @@ -21,7 +21,7 @@ export class UnitImpl implements Unit { private _targetUnit: Unit | undefined; private _health: bigint; private _lastTile: TileRef; - private _retreating: boolean = false; + private _retreating = false; private _targetedBySAM = false; private _reachedTarget = false; private _lastSetSafeFromPirates: number; // Only for trade ships @@ -30,14 +30,14 @@ export class UnitImpl implements Unit { private _troops: number; // Number of missiles in cooldown, if empty all missiles are ready. private _missileTimerQueue: number[] = []; - private _hasTrainStation: boolean = false; + private _hasTrainStation = false; private _patrolTile: TileRef | undefined; - private _level: number = 1; - private _targetable: boolean = true; + private _level = 1; + private _targetable = true; private _loaded: boolean | undefined; private _trainType: TrainType | undefined; // Nuke only - private _trajectoryIndex: number = 0; + private _trajectoryIndex = 0; private _trajectory: TrajectoryTile[]; constructor( diff --git a/src/core/pathfinding/AStar.ts b/src/core/pathfinding/AStar.ts index f16accf4e..4056c684f 100644 --- a/src/core/pathfinding/AStar.ts +++ b/src/core/pathfinding/AStar.ts @@ -1,7 +1,7 @@ -export interface AStar { +export type AStar = { compute(): PathFindResultType; reconstructPath(): NodeType[]; -} +}; export enum PathFindResultType { NextTile, @@ -25,7 +25,7 @@ export type AStarResult = type: PathFindResultType.PathNotFound; }; -export interface Point { +export type Point = { x: number; y: number; -} +}; diff --git a/src/core/pathfinding/MiniAStar.ts b/src/core/pathfinding/MiniAStar.ts index a355afd41..2c43950cb 100644 --- a/src/core/pathfinding/MiniAStar.ts +++ b/src/core/pathfinding/MiniAStar.ts @@ -36,8 +36,8 @@ export class MiniAStar implements AStar { private dst: TileRef, iterations: number, maxTries: number, - waterPath: boolean = true, - directionChangePenalty: number = 0, + waterPath = true, + directionChangePenalty = 0, ) { const srcArray: TileRef[] = Array.isArray(src) ? src : [src]; const miniSrc = srcArray.map((srcPoint) => @@ -113,7 +113,7 @@ function fixExtremes(upscaled: Cell[], cellDst: Cell, cellSrc?: Cell): Cell[] { return upscaled; } -function upscalePath(path: Cell[], scaleFactor: number = 2): Cell[] { +function upscalePath(path: Cell[], scaleFactor = 2): Cell[] { // Scale up each point const scaledPath = path.map( (point) => new Cell(point.x * scaleFactor, point.y * scaleFactor), diff --git a/src/core/pathfinding/PathFinding.ts b/src/core/pathfinding/PathFinding.ts index 9a34e3316..d5723abf1 100644 --- a/src/core/pathfinding/PathFinding.ts +++ b/src/core/pathfinding/PathFinding.ts @@ -14,7 +14,7 @@ export class ParabolaPathFinder { computeControlPoints( orig: TileRef, dst: TileRef, - increment: number = 3, + increment = 3, distanceBasedHeight = true, ) { const p0 = { x: this.mg.x(orig), y: this.mg.y(orig) }; @@ -117,8 +117,8 @@ export class PathFinder { public static Mini( game: Game, iterations: number, - waterPath: boolean = true, - maxTries: number = 20, + waterPath = true, + maxTries = 20, ) { return new PathFinder(game, (curr: TileRef, dst: TileRef) => { return new MiniAStar( @@ -136,7 +136,7 @@ export class PathFinder { nextTile( curr: TileRef | null, dst: TileRef | null, - dist: number = 1, + dist = 1, ): AStarResult { if (curr === null) { console.error("curr is null"); diff --git a/src/core/pathfinding/SerialAStar.ts b/src/core/pathfinding/SerialAStar.ts index fdb138c82..eef9306c4 100644 --- a/src/core/pathfinding/SerialAStar.ts +++ b/src/core/pathfinding/SerialAStar.ts @@ -4,12 +4,12 @@ import { AStar, PathFindResultType } from "./AStar"; /** * Implement this interface with your graph to find paths with A* */ -export interface GraphAdapter { +export type GraphAdapter = { neighbors(node: NodeType): NodeType[]; cost(node: NodeType): number; position(node: NodeType): { x: number; y: number }; isTraversable(from: NodeType, to: NodeType): boolean; -} +}; export class SerialAStar implements AStar { private fwdOpenSet: FastPriorityQueue<{ @@ -37,7 +37,7 @@ export class SerialAStar implements AStar { private iterations: number, private maxTries: number, private graph: GraphAdapter, - private directionChangePenalty: number = 0, + private directionChangePenalty = 0, ) { this.fwdOpenSet = new FastPriorityQueue((a, b) => a.fScore < b.fScore); this.bwdOpenSet = new FastPriorityQueue((a, b) => a.fScore < b.fScore); diff --git a/src/core/utilities/Line.ts b/src/core/utilities/Line.ts index 67024e9c6..57aea1e6c 100644 --- a/src/core/utilities/Line.ts +++ b/src/core/utilities/Line.ts @@ -77,9 +77,9 @@ export class CubicBezierCurve { * Useful to compute regular steps based on the curve rather than a t */ export class DistanceBasedBezierCurve extends CubicBezierCurve { - private totalDistance: number = 0; + private totalDistance = 0; private cachedPoints: Point[] = []; - private currentIndex: number = 0; + private currentIndex = 0; constructor( p0: Point, diff --git a/src/core/worker/WorkerMessages.ts b/src/core/worker/WorkerMessages.ts index 65234e2f6..059fbe3f7 100644 --- a/src/core/worker/WorkerMessages.ts +++ b/src/core/worker/WorkerMessages.ts @@ -26,91 +26,91 @@ export type WorkerMessageType = | "transport_ship_spawn_result"; // Base interface for all messages -interface BaseWorkerMessage { +type BaseWorkerMessage = { type: WorkerMessageType; id?: string; -} +}; -export interface HeartbeatMessage extends BaseWorkerMessage { +export type HeartbeatMessage = { type: "heartbeat"; -} +} & BaseWorkerMessage; // Messages from main thread to worker -export interface InitMessage extends BaseWorkerMessage { +export type InitMessage = { type: "init"; gameStartInfo: GameStartInfo; clientID: ClientID; -} +} & BaseWorkerMessage; -export interface TurnMessage extends BaseWorkerMessage { +export type TurnMessage = { type: "turn"; turn: Turn; -} +} & BaseWorkerMessage; // Messages from worker to main thread -export interface InitializedMessage extends BaseWorkerMessage { +export type InitializedMessage = { type: "initialized"; -} +} & BaseWorkerMessage; -export interface GameUpdateMessage extends BaseWorkerMessage { +export type GameUpdateMessage = { type: "game_update"; gameUpdate: GameUpdateViewData; -} +} & BaseWorkerMessage; -export interface PlayerActionsMessage extends BaseWorkerMessage { +export type PlayerActionsMessage = { type: "player_actions"; playerID: PlayerID; x: number; y: number; -} +} & BaseWorkerMessage; -export interface PlayerActionsResultMessage extends BaseWorkerMessage { +export type PlayerActionsResultMessage = { type: "player_actions_result"; result: PlayerActions; -} +} & BaseWorkerMessage; -export interface PlayerProfileMessage extends BaseWorkerMessage { +export type PlayerProfileMessage = { type: "player_profile"; playerID: number; -} +} & BaseWorkerMessage; -export interface PlayerProfileResultMessage extends BaseWorkerMessage { +export type PlayerProfileResultMessage = { type: "player_profile_result"; result: PlayerProfile; -} +} & BaseWorkerMessage; -export interface PlayerBorderTilesMessage extends BaseWorkerMessage { +export type PlayerBorderTilesMessage = { type: "player_border_tiles"; playerID: PlayerID; -} +} & BaseWorkerMessage; -export interface PlayerBorderTilesResultMessage extends BaseWorkerMessage { +export type PlayerBorderTilesResultMessage = { type: "player_border_tiles_result"; result: PlayerBorderTiles; -} +} & BaseWorkerMessage; -export interface AttackAveragePositionMessage extends BaseWorkerMessage { +export type AttackAveragePositionMessage = { type: "attack_average_position"; playerID: number; attackID: string; -} +} & BaseWorkerMessage; -export interface AttackAveragePositionResultMessage extends BaseWorkerMessage { +export type AttackAveragePositionResultMessage = { type: "attack_average_position_result"; x: number | null; y: number | null; -} +} & BaseWorkerMessage; -export interface TransportShipSpawnMessage extends BaseWorkerMessage { +export type TransportShipSpawnMessage = { type: "transport_ship_spawn"; playerID: PlayerID; targetTile: TileRef; -} +} & BaseWorkerMessage; -export interface TransportShipSpawnResultMessage extends BaseWorkerMessage { +export type TransportShipSpawnResultMessage = { type: "transport_ship_spawn_result"; result: TileRef | false; -} +} & BaseWorkerMessage; // Union types for type safety export type MainThreadMessage = diff --git a/src/server/Cloudflare.ts b/src/server/Cloudflare.ts index 140e868f6..197c29430 100644 --- a/src/server/Cloudflare.ts +++ b/src/server/Cloudflare.ts @@ -8,39 +8,39 @@ const log = logger.child({ module: "cloudflare", }); -export interface TunnelConfig { +export type TunnelConfig = { domain: string; subdomain: string; subdomainToService: Map; -} +}; -interface TunnelResponse { +type TunnelResponse = { result: { id: string; token: string; }; -} +}; -interface ZoneResponse { +type ZoneResponse = { result: Array<{ id: string; }>; -} +}; -interface DNSRecordResponse { +type DNSRecordResponse = { result: Array<{ id: string; }>; -} +}; -interface CloudflaredConfig { +type CloudflaredConfig = { tunnel: string; "credentials-file": string; ingress: Array<{ hostname?: string; service: string; }>; -} +}; const CloudflareTunnelConfigSchema = z.object({ a: z.string(), @@ -63,7 +63,7 @@ export class Cloudflare { private async makeRequest( url: string, - method: string = "GET", + method = "GET", data?: any, ): Promise { const response = await fetch(url, { diff --git a/src/server/Gatekeeper.ts b/src/server/Gatekeeper.ts index ee47cbf50..81d2fd9ff 100644 --- a/src/server/Gatekeeper.ts +++ b/src/server/Gatekeeper.ts @@ -12,7 +12,7 @@ export enum LimiterType { WebSocket = "websocket", } -export interface Gatekeeper { +export type Gatekeeper = { // The wrapper for request handlers with optional rate limiting httpHandler: ( limiterType: LimiterType, @@ -24,7 +24,7 @@ export interface Gatekeeper { req: http.IncomingMessage | string, fn: (message: string) => Promise, ) => (message: string) => Promise; -} +}; let gk: Gatekeeper | null = null; diff --git a/src/server/MapPlaylist.ts b/src/server/MapPlaylist.ts index 1698bef68..9927289af 100644 --- a/src/server/MapPlaylist.ts +++ b/src/server/MapPlaylist.ts @@ -49,10 +49,10 @@ const frequency: Partial> = { Yenisei: 1, }; -interface MapWithMode { +type MapWithMode = { map: GameMapType; mode: GameMode; -} +}; const TEAM_COUNTS = [ 2, diff --git a/src/server/Privilege.ts b/src/server/Privilege.ts index 88908215f..6d7722020 100644 --- a/src/server/Privilege.ts +++ b/src/server/Privilege.ts @@ -1,7 +1,7 @@ import { Cosmetics, Pattern } from "../core/CosmeticSchemas"; import { PatternDecoder } from "../core/PatternDecoder"; -export interface PrivilegeChecker { +export type PrivilegeChecker = { isPatternAllowed( base64: string, flares: readonly string[] | undefined, @@ -10,7 +10,7 @@ export interface PrivilegeChecker { flag: string, flares: readonly string[] | undefined, ): true | "restricted" | "invalid"; -} +}; export class PrivilegeCheckerImpl implements PrivilegeChecker { private b64ToPattern: Record = {}; diff --git a/tests/util/TestConfig.ts b/tests/util/TestConfig.ts index f0b10ac37..69b23f3cd 100644 --- a/tests/util/TestConfig.ts +++ b/tests/util/TestConfig.ts @@ -10,8 +10,8 @@ import { import { TileRef } from "../../src/core/game/GameMap"; export class TestConfig extends DefaultConfig { - private _proximityBonusPortsNb: number = 0; - private _defaultNukeSpeed: number = 4; + private _proximityBonusPortsNb = 0; + private _defaultNukeSpeed = 4; samHittingChance(): number { return 1;