refactor: rename core-public -> engine-public; fold helpers in; drop shared

Tighten the package model around the determinism invariant: everything the
engine imports must itself be deterministic.

- Rename core-public -> engine-public (package, dir, `engine-public/*` alias,
  all 118 import sites). It is the deterministic public surface the engine
  depends on and that client/server also use.
- Move the pure formatting helpers (renderNumber/renderTroops) from shared
  into engine-public/format — the engine uses them and they're deterministic.
- Drop the now-empty shared package (and its alias). `shared` was intended for
  client/server-shared, engine-forbidden code; there is none yet, so it is
  removed and can be re-added when such code appears.

Final graph: engine-public (leaf) <- engine <- {client, server};
client/server also -> engine-public.

Verified: tsc clean; 1364 + 65 tests pass; prod build succeeds; engine-public
is a leaf; engine has no client/server imports. Lockfile regenerated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Evan Pelle
2026-06-10 20:32:32 +00:00
parent a7f992e9b0
commit 43d07ca85f
145 changed files with 193 additions and 201 deletions
+15 -10
View File
@@ -1290,14 +1290,14 @@
"resolved": "packages/client",
"link": true
},
"node_modules/@openfront/core-public": {
"resolved": "packages/core-public",
"link": true
},
"node_modules/@openfront/engine": {
"resolved": "packages/engine",
"link": true
},
"node_modules/@openfront/engine-public": {
"resolved": "packages/engine-public",
"link": true
},
"node_modules/@openfront/server": {
"resolved": "packages/server",
"link": true
@@ -10129,27 +10129,32 @@
"name": "@openfront/client",
"version": "0.0.0",
"dependencies": {
"@openfront/core-public": "*",
"@openfront/engine": "*"
"@openfront/engine": "*",
"@openfront/engine-public": "*"
}
},
"packages/core-public": {
"name": "@openfront/core-public",
"version": "0.0.0"
"version": "0.0.0",
"extraneous": true
},
"packages/engine": {
"name": "@openfront/engine",
"version": "0.0.0",
"dependencies": {
"@openfront/core-public": "*"
"@openfront/engine-public": "*"
}
},
"packages/engine-public": {
"name": "@openfront/engine-public",
"version": "0.0.0"
},
"packages/server": {
"name": "@openfront/server",
"version": "0.0.0",
"dependencies": {
"@openfront/core-public": "*",
"@openfront/engine": "*"
"@openfront/engine": "*",
"@openfront/engine-public": "*"
}
}
}
+1 -1
View File
@@ -5,7 +5,7 @@
"type": "module",
"main": "src/Main.ts",
"dependencies": {
"@openfront/core-public": "*",
"@openfront/engine-public": "*",
"@openfront/engine": "*"
}
}
+2 -2
View File
@@ -5,9 +5,9 @@ import {
PlayerGame,
PlayerStatsTree,
UserMeResponse,
} from "core-public/ApiSchemas";
} from "engine-public/ApiSchemas";
import { assetUrl } from "engine/AssetUrls";
import { Cosmetics } from "core-public/CosmeticSchemas";
import { Cosmetics } from "engine-public/CosmeticSchemas";
import { fetchPlayerById, getUserMe } from "./Api";
import { discordLogin, logOut, sendMagicLink } from "./Auth";
import "./components/baseComponents/stats/DiscordUserHeader";
+3 -3
View File
@@ -1,6 +1,6 @@
import newsItemsFallback from "resources/news.json";
import { z } from "zod";
import type { NewsItem } from "core-public/ApiSchemas";
import type { NewsItem } from "engine-public/ApiSchemas";
import {
NewsItemSchema,
PlayerProfile,
@@ -9,8 +9,8 @@ import {
RankedLeaderboardResponseSchema,
UserMeResponse,
UserMeResponseSchema,
} from "core-public/ApiSchemas";
import { AnalyticsRecord, AnalyticsRecordSchema } from "core-public/Schemas";
} from "engine-public/ApiSchemas";
import { AnalyticsRecord, AnalyticsRecordSchema } from "engine-public/Schemas";
import { getAuthHeader, logOut, userAuth } from "./Auth";
export async function fetchPlayerById(
+2 -2
View File
@@ -1,8 +1,8 @@
import { decodeJwt } from "jose";
import { UserSettings } from "engine/game/UserSettings";
import { z } from "zod";
import { TokenPayload, TokenPayloadSchema } from "core-public/ApiSchemas";
import { base64urlToUuid } from "core-public/Base64";
import { TokenPayload, TokenPayloadSchema } from "engine-public/ApiSchemas";
import { base64urlToUuid } from "engine-public/Base64";
import { getApiBase, getAudience } from "./Api";
import { generateCryptoRandomUUID } from "./Utils";
+2 -2
View File
@@ -15,7 +15,7 @@ import {
type ClanRequestsResponse,
ClanRequestsResponseSchema,
JoinClanResponseSchema,
} from "core-public/ClanApiSchemas";
} from "engine-public/ClanApiSchemas";
import { getApiBase, getUserMe } from "./Api";
import { getAuthHeader } from "./Auth";
@@ -36,7 +36,7 @@ export type {
ClanMemberStats,
ClanMemberWL,
ClanRequestsResponse,
} from "core-public/ClanApiSchemas";
} from "engine-public/ClanApiSchemas";
async function clanFetch(
path: string,
+1 -1
View File
@@ -1,6 +1,6 @@
import { JWK } from "jose";
import { z } from "zod";
import { GameID } from "core-public/Schemas";
import { GameID } from "engine-public/Schemas";
import { simpleHash } from "engine/Util";
import {
GameEnv,
+1 -1
View File
@@ -10,7 +10,7 @@ import {
PlayerCosmeticRefs,
PlayerRecord,
ServerMessage,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import { createPartialGameRecord, findClosestBy, replacer } from "engine/Util";
import {
BuildableUnit,
+3 -3
View File
@@ -1,5 +1,5 @@
import { assetUrl } from "engine/AssetUrls";
import { UserMeResponse } from "core-public/ApiSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import {
ColorPalette,
Cosmetics,
@@ -10,12 +10,12 @@ import {
Product,
Skin,
Subscription,
} from "core-public/CosmeticSchemas";
} from "engine-public/CosmeticSchemas";
import {
PlayerCosmeticRefs,
PlayerCosmetics,
PlayerPattern,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import { UserSettings } from "engine/game/UserSettings";
import {
changeSubscriptionTier,
+1 -1
View File
@@ -1,6 +1,6 @@
import { LitElement, html } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { FlagName } from "core-public/Schemas";
import { FlagName } from "engine-public/Schemas";
import {
FLAG_KEY,
USER_SETTINGS_CHANGED_EVENT,
+2 -2
View File
@@ -1,9 +1,9 @@
import { html } from "lit";
import { customElement, state } from "lit/decorators.js";
import Countries from "resources/countries.json" with { type: "json" };
import { UserMeResponse } from "core-public/ApiSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { assetUrl } from "engine/AssetUrls";
import { Cosmetics, Flag } from "core-public/CosmeticSchemas";
import { Cosmetics, Flag } from "engine-public/CosmeticSchemas";
import { UserSettings } from "engine/game/UserSettings";
import { getUserMe } from "./Api";
import {
+1 -1
View File
@@ -5,7 +5,7 @@ import {
FriendsListResponseSchema,
type SendFriendRequestResponse,
SendFriendRequestResponseSchema,
} from "core-public/ApiSchemas";
} from "engine-public/ApiSchemas";
import { getApiBase } from "./Api";
import { getAuthHeader } from "./Auth";
+1 -1
View File
@@ -1,6 +1,6 @@
import { html, LitElement } from "lit";
import { customElement, property, query, state } from "lit/decorators.js";
import { GameEndInfo } from "core-public/Schemas";
import { GameEndInfo } from "engine-public/Schemas";
import { GameMapType } from "engine/game/Game";
import { fetchGameById } from "./Api";
import { terrainMapFileLoader } from "./TerrainMapFileLoader";
+1 -1
View File
@@ -9,7 +9,7 @@ import {
Quads,
Trios,
} from "engine/game/Game";
import { PublicGameInfo, PublicGames } from "core-public/Schemas";
import { PublicGameInfo, PublicGames } from "engine-public/Schemas";
import "./components/IOSAddToHomeScreenBanner";
import { crazyGamesSDK } from "./CrazyGamesSDK";
import { HostLobbyModal } from "./HostLobbyModal";
+1 -1
View File
@@ -18,7 +18,7 @@ import {
LobbyInfoEvent,
TeamCountConfig,
isValidGameID,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import { generateID } from "engine/Util";
import { getPlayToken } from "./Auth";
import "./components/baseComponents/Modal";
+1 -1
View File
@@ -19,7 +19,7 @@ import {
GameRecordSchema,
LobbyInfoEvent,
PublicGameInfo,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import {
Difficulty,
GameMapSize,
+1 -1
View File
@@ -1,5 +1,5 @@
import { ClientEnv } from "client/ClientEnv";
import { PublicGames, PublicLobbyMessageSchema } from "core-public/Schemas";
import { PublicGames, PublicLobbyMessageSchema } from "engine-public/Schemas";
interface LobbySocketOptions {
reconnectDelay?: number;
+1 -1
View File
@@ -1,4 +1,4 @@
import { GameConfig, GameID, PartialGameRecord } from "core-public/Schemas";
import { GameConfig, GameID, PartialGameRecord } from "engine-public/Schemas";
import { replacer } from "engine/Util";
export interface LocalStatsData {
+1 -1
View File
@@ -12,7 +12,7 @@ import {
ServerStartGameMessage,
StampedIntent,
Turn,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import {
createPartialGameRecord,
decompressGameRecord,
+2 -2
View File
@@ -1,6 +1,6 @@
import version from "resources/version.txt?raw";
import { ClientEnv } from "client/ClientEnv";
import { UserMeResponse } from "core-public/ApiSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { assetUrl } from "engine/AssetUrls";
import { EventBus } from "engine/EventBus";
import {
@@ -9,7 +9,7 @@ import {
GameRecord,
GameStartInfo,
PublicGameInfo,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import { GameEnv } from "engine/configuration/Config";
import { GameType } from "engine/game/Game";
import {
+1 -1
View File
@@ -1,7 +1,7 @@
import { html, LitElement } from "lit";
import { customElement, state } from "lit/decorators.js";
import { ClientEnv } from "client/ClientEnv";
import { UserMeResponse } from "core-public/ApiSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { getUserMe, hasLinkedAccount } from "./Api";
import { getPlayToken } from "./Auth";
import { BaseModal } from "./components/BaseModal";
+1 -1
View File
@@ -4,7 +4,7 @@ import {
PATTERN_KEY,
USER_SETTINGS_CHANGED_EVENT,
} from "engine/game/UserSettings";
import { PlayerPattern, PlayerSkin } from "core-public/Schemas";
import { PlayerPattern, PlayerSkin } from "engine-public/Schemas";
import { renderPatternPreview } from "./components/PatternPreview";
import { getPlayerCosmetics } from "./Cosmetics";
import { crazyGamesSDK } from "./CrazyGamesSDK";
+2 -2
View File
@@ -1,7 +1,7 @@
import { TemplateResult, html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { translateText } from "client/Utils";
import { UserMeResponse } from "core-public/ApiSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { assetUrl } from "engine/AssetUrls";
import {
Difficulty,
@@ -11,7 +11,7 @@ import {
GameType,
UnitType,
} from "engine/game/Game";
import { TeamCountConfig } from "core-public/Schemas";
import { TeamCountConfig } from "engine-public/Schemas";
import { generateID } from "engine/Util";
import { hasLinkedAccount } from "./Api";
import "./components/baseComponents/Button";
+2 -2
View File
@@ -1,8 +1,8 @@
import type { TemplateResult } from "lit";
import { html } from "lit";
import { customElement } from "lit/decorators.js";
import { UserMeResponse } from "core-public/ApiSchemas";
import { Cosmetics } from "core-public/CosmeticSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { Cosmetics } from "engine-public/CosmeticSchemas";
import { UserSettings } from "engine/game/UserSettings";
import { BaseModal } from "./components/BaseModal";
import "./components/CosmeticButton";
@@ -1,14 +1,14 @@
import type { TemplateResult } from "lit";
import { html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { UserMeResponse } from "core-public/ApiSchemas";
import { Cosmetics, Skin } from "core-public/CosmeticSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { Cosmetics, Skin } from "engine-public/CosmeticSchemas";
import {
PATTERN_KEY,
USER_SETTINGS_CHANGED_EVENT,
UserSettings,
} from "engine/game/UserSettings";
import { PlayerPattern } from "core-public/Schemas";
import { PlayerPattern } from "engine-public/Schemas";
import { BaseModal } from "./components/BaseModal";
import "./components/CosmeticButton";
import "./components/NotLoggedInWarning";
+1 -1
View File
@@ -25,7 +25,7 @@ import {
ServerMessage,
ServerMessageSchema,
Winner,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import { replacer } from "engine/Util";
import { getPlayToken } from "./Auth";
import { LobbyConfig } from "./ClientGameRunner";
+2 -2
View File
@@ -9,7 +9,7 @@ import {
Team,
Trios,
} from "engine/game/Game";
import { GameConfig } from "core-public/Schemas";
import { GameConfig } from "engine-public/Schemas";
import type { LangSelector } from "./LangSelector";
import { Platform } from "./Platform";
@@ -272,7 +272,7 @@ export async function copyToClipboard(
// Moved to the shared package; re-exported so existing `client/Utils` importers
// keep working.
export { renderNumber, renderTroops } from "shared/format";
export { renderNumber, renderTroops } from "engine-public/format";
export function formatPercentage(value: number): string {
const perc = value * 100;
+1 -1
View File
@@ -1,7 +1,7 @@
import { Colord } from "colord";
import { base64url } from "jose";
import { assetUrl } from "engine/AssetUrls";
import { decodePatternData } from "core-public/PatternDecoder";
import { decodePatternData } from "engine-public/PatternDecoder";
import { PlayerType } from "engine/game/Game";
import { GameView } from "client/view";
import { uploadFrameData } from "./render/frame/Upload";
@@ -6,8 +6,8 @@ import {
Pattern,
Skin,
Subscription,
} from "core-public/CosmeticSchemas";
import { PlayerPattern } from "core-public/Schemas";
} from "engine-public/CosmeticSchemas";
import { PlayerPattern } from "engine-public/Schemas";
import {
PaymentMethod,
ResolvedCosmetic,
@@ -1,6 +1,6 @@
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators.js";
import { Product } from "core-public/CosmeticSchemas";
import { Product } from "engine-public/CosmeticSchemas";
import "./PurchaseButton";
import { DEFAULT_DOLLAR_LABEL_KEY } from "./PurchaseButton";
@@ -1,6 +1,6 @@
import { html, LitElement, TemplateResult } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import type { FriendEntry } from "core-public/ApiSchemas";
import type { FriendEntry } from "engine-public/ApiSchemas";
import {
acceptFriendRequest,
deleteFriendRequest,
@@ -17,7 +17,7 @@ import {
Trios,
UnitType,
} from "engine/game/Game";
import { TeamCountConfig } from "core-public/Schemas";
import { TeamCountConfig } from "engine-public/Schemas";
import { translateText } from "../Utils";
import "./Difficulties";
import "./FluentSlider";
@@ -14,7 +14,7 @@ import {
} from "engine/game/Game";
import { assignTeamsLobbyPreview } from "engine/game/TeamAssignment";
import { UserSettings } from "engine/game/UserSettings";
import { ClientInfo, TeamCountConfig } from "core-public/Schemas";
import { ClientInfo, TeamCountConfig } from "engine-public/Schemas";
import { createRandomName, formatPlayerDisplayName } from "engine/Util";
import { Theme } from "../theme/Theme";
import { themeProvider } from "../theme/ThemeProvider";
+1 -1
View File
@@ -1,7 +1,7 @@
import { LitElement, html, nothing } from "lit";
import { resolveMarkdown } from "lit-markdown";
import { customElement, state } from "lit/decorators.js";
import type { NewsItem } from "core-public/ApiSchemas";
import type { NewsItem } from "engine-public/ApiSchemas";
import { getNews } from "../Api";
import { translateText } from "../Utils";
@@ -1,6 +1,6 @@
import { LitElement, html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { UserMeResponse } from "core-public/ApiSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { hasLinkedAccount } from "../Api";
@customElement("not-logged-in-warning")
@@ -1,9 +1,9 @@
import { Colord } from "colord";
import { base64url } from "jose";
import { html, TemplateResult } from "lit";
import { DefaultPattern } from "core-public/CosmeticSchemas";
import { PatternDecoder } from "core-public/PatternDecoder";
import { PlayerPattern } from "core-public/Schemas";
import { DefaultPattern } from "engine-public/CosmeticSchemas";
import { PatternDecoder } from "engine-public/PatternDecoder";
import { PlayerPattern } from "engine-public/Schemas";
import { translateText } from "../Utils";
export function renderPatternPreview(
@@ -1,6 +1,6 @@
import { html, LitElement, nothing } from "lit";
import { customElement, property } from "lit/decorators.js";
import { Product } from "core-public/CosmeticSchemas";
import { Product } from "engine-public/CosmeticSchemas";
import { translateText } from "../Utils";
import "./CapIcon";
import "./PlutoniumIcon";
@@ -1,6 +1,6 @@
import { html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { UserMeResponse } from "core-public/ApiSchemas";
import { UserMeResponse } from "engine-public/ApiSchemas";
import { getUserMe, hasLinkedAccount } from "../Api";
import { userAuth } from "../Auth";
import { translateText } from "../Utils";
@@ -1,7 +1,7 @@
import { html, LitElement, TemplateResult } from "lit";
import { customElement, property } from "lit/decorators.js";
import { UserSubscription } from "core-public/ApiSchemas";
import { Subscription } from "core-public/CosmeticSchemas";
import { UserSubscription } from "engine-public/ApiSchemas";
import { Subscription } from "engine-public/CosmeticSchemas";
import {
cancelSubscription,
invalidateUserMe,
@@ -1,4 +1,4 @@
import { AnalyticsRecord, PlayerRecord } from "core-public/Schemas";
import { AnalyticsRecord, PlayerRecord } from "engine-public/Schemas";
import {
GOLD_INDEX_STEAL,
GOLD_INDEX_TRADE,
@@ -8,7 +8,7 @@ import {
PLAYER_INDEX_BOT,
PLAYER_INDEX_HUMAN,
PLAYER_INDEX_NATION,
} from "core-public/StatsSchemas";
} from "engine-public/StatsSchemas";
export enum RankType {
ConquestHumans = "ConquestHumans",
@@ -4,7 +4,7 @@ import {
GOLD_INDEX_TRADE,
GOLD_INDEX_TRAIN_OTHER,
GOLD_INDEX_TRAIN_SELF,
} from "core-public/StatsSchemas";
} from "engine-public/StatsSchemas";
import { assetUrl } from "engine/AssetUrls";
import { renderNumber } from "../../../Utils";
import { PlayerInfo, RankType } from "./GameInfoRanking";
@@ -1,6 +1,6 @@
import { LitElement, html } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import type { DiscordUser } from "core-public/ApiSchemas";
import type { DiscordUser } from "engine-public/ApiSchemas";
import { getDiscordAvatarUrl, translateText } from "../../../Utils";
@customElement("discord-user-header")
@@ -1,6 +1,6 @@
import { LitElement, html } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { PlayerGame } from "core-public/ApiSchemas";
import { PlayerGame } from "engine-public/ApiSchemas";
import { GameMode } from "engine/game/Game";
import { GameInfoModal } from "../../../GameInfoModal";
import { translateText } from "../../../Utils";
@@ -5,7 +5,7 @@ import {
boatUnits,
bombUnits,
otherUnits,
} from "core-public/StatsSchemas";
} from "engine-public/StatsSchemas";
import { renderNumber, translateText } from "../../../Utils";
@customElement("player-stats-table")
@@ -1,6 +1,6 @@
import { LitElement, PropertyValues, html } from "lit";
import { customElement, property, state } from "lit/decorators.js";
import { PlayerStatsLeaf, PlayerStatsTree } from "core-public/ApiSchemas";
import { PlayerStatsLeaf, PlayerStatsTree } from "engine-public/ApiSchemas";
import {
Difficulty,
GameMode,
@@ -10,7 +10,7 @@ import {
isGameMode,
isGameType,
} from "engine/game/Game";
import { PlayerStats } from "core-public/StatsSchemas";
import { PlayerStats } from "engine-public/StatsSchemas";
import { renderNumber, translateText } from "../../../Utils";
import "./PlayerStatsGrid";
import "./PlayerStatsTable";
@@ -5,7 +5,7 @@ import {
TEAM_BREAKDOWN_KEYS,
type ClanMemberStats,
type ClanMemberWL,
} from "core-public/ClanApiSchemas";
} from "engine-public/ClanApiSchemas";
import { translateText } from "../../Utils";
import { renderWLBarRow } from "./ClanShared";
@@ -3,7 +3,7 @@ import { customElement, state } from "lit/decorators.js";
import {
ClanLeaderboardEntry,
ClanLeaderboardResponse,
} from "core-public/ClanApiSchemas";
} from "engine-public/ClanApiSchemas";
import { fetchClanLeaderboard } from "../../ClanApi";
import { translateText } from "../../Utils";
@@ -1,6 +1,6 @@
import { html, LitElement, nothing } from "lit";
import { customElement, query, state } from "lit/decorators.js";
import { PlayerLeaderboardEntry } from "core-public/ApiSchemas";
import { PlayerLeaderboardEntry } from "engine-public/ApiSchemas";
import { RankedType } from "engine/game/Game";
import { fetchPlayerLeaderboard, getUserMe } from "../../Api";
import { translateText } from "../../Utils";
@@ -7,7 +7,7 @@ import { Gold } from "engine/game/Game";
import { GameUpdateType } from "engine/game/GameUpdates";
import { GameView } from "client/view";
import { UserSettings } from "engine/game/UserSettings";
import { ClientID } from "core-public/Schemas";
import { ClientID } from "engine-public/Schemas";
import { Controller } from "../../Controller";
import { AttackRatioEvent } from "../../InputHandler";
import { UIState } from "../../UIState";
@@ -1,4 +1,4 @@
import type { GraphicsOverrides } from "core-public/GraphicsOverrides";
import type { GraphicsOverrides } from "engine-public/GraphicsOverrides";
import type { RenderSettings } from "./RenderSettings";
const DARK_AMBIENT = 0.35;
+2 -2
View File
@@ -9,8 +9,8 @@ export type {
RadialMenuSelectEvent,
} from "./Events";
export { GameView } from "./GameView";
export { GraphicsOverridesSchema } from "core-public/GraphicsOverrides";
export type { GraphicsOverrides } from "core-public/GraphicsOverrides";
export { GraphicsOverridesSchema } from "engine-public/GraphicsOverrides";
export type { GraphicsOverrides } from "engine-public/GraphicsOverrides";
export type { SpawnCenter } from "./passes/SpawnOverlayPass";
export {
applyDarkModeOverride,
@@ -1,5 +1,5 @@
import { GameMapType, UnitType } from "engine/game/Game";
import { GameConfig } from "core-public/Schemas";
import { GameConfig } from "engine-public/Schemas";
/**
* Maps a slider value (0-400) to the nations config value.
+1 -1
View File
@@ -24,7 +24,7 @@ import {
import { TerrainMapData } from "engine/game/TerrainMapLoader";
import { TerraNulliusImpl } from "engine/game/TerraNulliusImpl";
import { UnitGrid, UnitPredicate } from "engine/game/UnitGrid";
import { ClientID, GameID, Player, PlayerCosmetics } from "core-public/Schemas";
import { ClientID, GameID, Player, PlayerCosmetics } from "engine-public/Schemas";
import { formatPlayerDisplayName } from "engine/Util";
import { WorkerClient } from "engine/worker/WorkerClient";
import { computeAllianceClusters } from "../render/frame/derive/AllianceClusters";
+3 -3
View File
@@ -1,8 +1,8 @@
import { Colord, colord } from "colord";
import { base64url } from "jose";
import { ColorPalette } from "core-public/CosmeticSchemas";
import { PatternDecoder } from "core-public/PatternDecoder";
import { ClientID, PlayerCosmetics } from "core-public/Schemas";
import { ColorPalette } from "engine-public/CosmeticSchemas";
import { PatternDecoder } from "engine-public/PatternDecoder";
import { ClientID, PlayerCosmetics } from "engine-public/Schemas";
import { createRandomName } from "engine/Util";
import {
BuildableUnit,
@@ -1,5 +1,5 @@
{
"name": "@openfront/core-public",
"name": "@openfront/engine-public",
"version": "0.0.0",
"private": true,
"type": "module",
@@ -1,6 +1,6 @@
// Pure enum/const declarations shared between the engine and clients.
// Extracted from engine/game/Game.ts so the public schema layer
// (core-public) can reference them without importing engine.
// (engine-public) can reference them without importing engine.
export const AllPlayers = "AllPlayers" as const;
+1 -1
View File
@@ -6,6 +6,6 @@
"main": "src/index.ts",
"types": "src/index.ts",
"dependencies": {
"@openfront/core-public": "*"
"@openfront/engine-public": "*"
}
}
+2 -2
View File
@@ -1,7 +1,7 @@
// Type contracts live in core-public so the public schema layer can reference
// Type contracts live in engine-public so the public schema layer can reference
// GameEvent without depending on the engine. Re-exported here for existing
// `engine/EventBus` consumers.
import type { EventConstructor, GameEvent } from "core-public/EventBus";
import type { EventConstructor, GameEvent } from "engine-public/EventBus";
export type { EventConstructor, GameEvent };
export class EventBus {
+1 -1
View File
@@ -28,7 +28,7 @@ import { ErrorUpdate, GameUpdateViewData } from "./game/GameUpdates";
import { createNationsForGame } from "./game/NationCreation";
import { loadTerrainMap as loadGameMap } from "./game/TerrainMapLoader";
import { PseudoRandom } from "./PseudoRandom";
import { ClientID, GameStartInfo, Turn } from "core-public/Schemas";
import { ClientID, GameStartInfo, Turn } from "engine-public/Schemas";
import { simpleHash } from "./Util";
export async function createGameRunner(
+3 -3
View File
@@ -1,12 +1,12 @@
import DOMPurify from "dompurify";
import { customAlphabet } from "nanoid";
// The emoji table moved to core-public; re-exported so existing `engine/Util`
// The emoji table moved to engine-public; re-exported so existing `engine/Util`
// imports of these symbols keep working.
export {
emojiTable,
flattenedEmojiTable,
type Emoji,
} from "core-public/Emojis";
} from "engine-public/Emojis";
import { Cell, PlayerType, Unit } from "./game/Game";
import { GameMap, TileRef } from "./game/GameMap";
import {
@@ -17,7 +17,7 @@ import {
PlayerRecord,
Turn,
Winner,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import {
TRIBE_NAME_PREFIXES,
+2 -2
View File
@@ -18,8 +18,8 @@ import {
import { TileRef } from "../game/GameMap";
import { PlayerLike } from "../game/ReadViews";
import { UserSettings } from "../game/UserSettings";
import { GameConfig, TeamCountConfig } from "core-public/Schemas";
import { NukeType } from "core-public/StatsSchemas";
import { GameConfig, TeamCountConfig } from "engine-public/Schemas";
import { NukeType } from "engine-public/StatsSchemas";
import { assertNever, sigmoid, toInt, within } from "../Util";
declare global {
@@ -1,4 +1,4 @@
import { renderTroops } from "shared/format";
import { renderTroops } from "engine-public/format";
import {
Attack,
Difficulty,
@@ -1,6 +1,6 @@
import { Execution, Game } from "../game/Game";
import { PseudoRandom } from "../PseudoRandom";
import { ClientID, GameID, StampedIntent, Turn } from "core-public/Schemas";
import { ClientID, GameID, StampedIntent, Turn } from "engine-public/Schemas";
import { simpleHash } from "../Util";
import { AllianceExtensionExecution } from "./alliance/AllianceExtensionExecution";
import { AllianceRejectExecution } from "./alliance/AllianceRejectExecution";
@@ -13,7 +13,7 @@ import {
} from "../game/Game";
import { TileRef } from "../game/GameMap";
import { PseudoRandom } from "../PseudoRandom";
import { GameID } from "core-public/Schemas";
import { GameID } from "engine-public/Schemas";
import { assertNever, simpleHash } from "../Util";
import { NationAllianceBehavior } from "./nation/NationAllianceBehavior";
import { NationEmojiBehavior } from "./nation/NationEmojiBehavior";
@@ -14,7 +14,7 @@ import { UniversalPathFinding } from "../pathfinding/PathFinder";
import { ParabolaUniversalPathFinder } from "../pathfinding/PathFinder.Parabola";
import { PathStatus } from "../pathfinding/types";
import { PseudoRandom } from "../PseudoRandom";
import { NukeType } from "core-public/StatsSchemas";
import { NukeType } from "engine-public/StatsSchemas";
import { listNukeBreakAlliance } from "./Util";
const SPRITE_RADIUS = 16;
@@ -9,7 +9,7 @@ import {
import { TileRef } from "../game/GameMap";
import { PathFinding } from "../pathfinding/PathFinder";
import { PathStatus, SteppingPathFinder } from "../pathfinding/types";
import { NukeType } from "core-public/StatsSchemas";
import { NukeType } from "engine-public/StatsSchemas";
export class SAMMissileExecution implements Execution {
private active = true;
@@ -9,7 +9,7 @@ import {
} from "../game/Game";
import { TileRef } from "../game/GameMap";
import { PseudoRandom } from "../PseudoRandom";
import { GameID } from "core-public/Schemas";
import { GameID } from "engine-public/Schemas";
import { simpleHash } from "../Util";
import { PlayerExecution } from "./PlayerExecution";
import { TribeExecution } from "./TribeExecution";
@@ -1,4 +1,4 @@
import { renderNumber } from "shared/format";
import { renderNumber } from "engine-public/format";
import {
Execution,
Game,
@@ -1,4 +1,4 @@
import { renderTroops } from "shared/format";
import { renderTroops } from "engine-public/format";
import {
Execution,
Game,
@@ -1,6 +1,6 @@
import { Game, PlayerInfo, PlayerType } from "../game/Game";
import { PseudoRandom } from "../PseudoRandom";
import { GameID } from "core-public/Schemas";
import { GameID } from "engine-public/Schemas";
import { simpleHash } from "../Util";
import { SpawnExecution } from "./SpawnExecution";
import { TRIBE_NAME_PREFIXES, TRIBE_NAME_SUFFIXES } from "./utils/TribeNames";
@@ -1,5 +1,5 @@
import { Game, PlayerType } from "../../game/Game";
import { GameID } from "core-public/Schemas";
import { GameID } from "engine-public/Schemas";
import { SpawnExecution } from "../SpawnExecution";
export class PlayerSpawner {
+3 -3
View File
@@ -1,7 +1,7 @@
import { Config } from "../configuration/Config";
import { AbstractGraph } from "../pathfinding/algorithms/AbstractGraph";
import { PathFinder } from "../pathfinding/types";
import { AllPlayersStats, ClientID } from "core-public/Schemas";
import { AllPlayersStats, ClientID } from "engine-public/Schemas";
import { formatPlayerDisplayName } from "../Util";
import { GameMap, TileRef } from "./GameMap";
import {
@@ -14,7 +14,7 @@ import { MotionPlanRecord } from "./MotionPlans";
import { RailNetwork } from "./RailNetwork";
import { Stats } from "./Stats";
import { UnitPredicate } from "./UnitGrid";
// Enums/consts now live in core-public so the public schema layer can use them
// Enums/consts now live in engine-public so the public schema layer can use them
// without depending on the engine. Re-exported here so existing
// `engine/game/Game` imports keep working.
import {
@@ -30,7 +30,7 @@ import {
RankedType,
Trios,
UnitType,
} from "core-public/game/GameTypes";
} from "engine-public/game/GameTypes";
export {
AllPlayers,
Difficulty,
+3 -3
View File
@@ -1,10 +1,10 @@
import { renderNumber } from "shared/format";
import { renderNumber } from "engine-public/format";
import { Config } from "../configuration/Config";
import { SharedWaterCache } from "../execution/nation/SharedWaterCache";
import { AbstractGraph } from "../pathfinding/algorithms/AbstractGraph";
import { PathFinder } from "../pathfinding/types";
import { AllPlayersStats, ClientID, Winner } from "core-public/Schemas";
import { ATTACK_INDEX_SENT } from "core-public/StatsSchemas";
import { AllPlayersStats, ClientID, Winner } from "engine-public/Schemas";
import { ATTACK_INDEX_SENT } from "engine-public/StatsSchemas";
import { simpleHash } from "../Util";
import { AllianceImpl } from "./AllianceImpl";
import { AllianceRequestImpl } from "./AllianceRequestImpl";
+1 -1
View File
@@ -1,4 +1,4 @@
import { AllPlayersStats, ClientID, Winner } from "core-public/Schemas";
import { AllPlayersStats, ClientID, Winner } from "engine-public/Schemas";
import {
EmojiMessage,
GameUpdates,
+1 -1
View File
@@ -1,5 +1,5 @@
import { PseudoRandom } from "../PseudoRandom";
import { GameStartInfo } from "core-public/Schemas";
import { GameStartInfo } from "engine-public/Schemas";
import {
Cell,
GameMapSize,
+1 -1
View File
@@ -1,5 +1,5 @@
import { PseudoRandom } from "../PseudoRandom";
import { ClientID } from "core-public/Schemas";
import { ClientID } from "engine-public/Schemas";
import {
assertNever,
findClosestBy,
+1 -1
View File
@@ -10,7 +10,7 @@
// Player-vs-PlayerView / Unit-vs-UnitView distinction.
import { Player, type PlayerID, Unit } from "./Game";
import { GameMap, type TileRef } from "./GameMap";
import { UnitType } from "core-public/game/GameTypes";
import { UnitType } from "engine-public/game/GameTypes";
/** Player members read by Config gold/troop calculations. */
export type PlayerLike = Pick<
+2 -2
View File
@@ -1,5 +1,5 @@
import { AllPlayersStats } from "core-public/Schemas";
import { NukeType, OtherUnitType, PlayerStats } from "core-public/StatsSchemas";
import { AllPlayersStats } from "engine-public/Schemas";
import { NukeType, OtherUnitType, PlayerStats } from "engine-public/StatsSchemas";
import { Player, TerraNullius } from "./Game";
export interface Stats {
+2 -2
View File
@@ -1,4 +1,4 @@
import { AllPlayersStats } from "core-public/Schemas";
import { AllPlayersStats } from "engine-public/Schemas";
import {
ATTACK_INDEX_CANCEL,
ATTACK_INDEX_RECV,
@@ -30,7 +30,7 @@ import {
PlayerStats,
unitTypeToBombUnit,
unitTypeToOtherUnit,
} from "core-public/StatsSchemas";
} from "engine-public/StatsSchemas";
import { Player, PlayerType, TerraNullius, UnitType } from "./Game";
import { Stats } from "./Stats";
+1 -1
View File
@@ -1,5 +1,5 @@
import { PseudoRandom } from "../PseudoRandom";
import { ClientID } from "core-public/Schemas";
import { ClientID } from "engine-public/Schemas";
import { simpleHash } from "../Util";
import { PlayerInfo, PlayerType, Team } from "./Game";
+1 -1
View File
@@ -1,4 +1,4 @@
import { ClientID } from "core-public/Schemas";
import { ClientID } from "engine-public/Schemas";
import { TerraNullius } from "./Game";
export class TerraNulliusImpl implements TerraNullius {
+3 -3
View File
@@ -1,9 +1,9 @@
import {
GraphicsOverrides,
GraphicsOverridesSchema,
} from "core-public/GraphicsOverrides";
import { Cosmetics } from "core-public/CosmeticSchemas";
import { PlayerPattern } from "core-public/Schemas";
} from "engine-public/GraphicsOverrides";
import { Cosmetics } from "engine-public/CosmeticSchemas";
import { PlayerPattern } from "engine-public/Schemas";
export function getDefaultKeybinds(isMac: boolean): Record<string, string> {
return {
+1 -1
View File
@@ -1,4 +1,4 @@
import { ClanTagSchema, UsernameSchema } from "core-public/Schemas";
import { ClanTagSchema, UsernameSchema } from "engine-public/Schemas";
export const MIN_USERNAME_LENGTH = 3;
export const MAX_USERNAME_LENGTH = 27;
+1 -1
View File
@@ -10,7 +10,7 @@ import {
} from "../game/Game";
import { TileRef } from "../game/GameMap";
import { ErrorUpdate, GameUpdateViewData } from "../game/GameUpdates";
import { ClientID, GameStartInfo, Turn } from "core-public/Schemas";
import { ClientID, GameStartInfo, Turn } from "engine-public/Schemas";
import { generateID } from "../Util";
import { WorkerMessage } from "./WorkerMessages";
// Inlined into the main bundle as a same-origin Blob, sidestepping the
+1 -1
View File
@@ -8,7 +8,7 @@ import {
} from "../game/Game";
import { TileRef } from "../game/GameMap";
import { ErrorUpdate, GameUpdateViewData } from "../game/GameUpdates";
import { ClientID, GameStartInfo, Turn } from "core-public/Schemas";
import { ClientID, GameStartInfo, Turn } from "engine-public/Schemas";
export type WorkerMessageType =
| "init"
+1 -1
View File
@@ -5,7 +5,7 @@
"type": "module",
"main": "src/Server.ts",
"dependencies": {
"@openfront/core-public": "*",
"@openfront/engine-public": "*",
"@openfront/engine": "*"
}
}
+1 -1
View File
@@ -6,7 +6,7 @@ import {
GameRecordSchema,
ID,
PartialGameRecord,
} from "core-public/Schemas";
} from "engine-public/Schemas";
import { replacer } from "engine/Util";
import { logger } from "./Logger";
import { ServerEnv } from "./ServerEnv";

Some files were not shown because too many files have changed in this diff Show More