From a7f992e9b01486f02dfbae64cc0c5c59ec316cb0 Mon Sep 17 00:00:00 2001 From: Evan Pelle Date: Wed, 10 Jun 2026 16:51:03 +0000 Subject: [PATCH] refactor: convert to npm-workspaces monorepo (engine/core-public/shared/client/server) Restructure the single src/ tree into an npm-workspaces monorepo under packages/, rename core -> engine, extract a types-only core-public layer, and break the pre-existing engine -> client dependency cycle. Structure (packages/): core-public public API/wire schemas + shared enums (clean leaf) shared framework-agnostic helpers (clean leaf) engine deterministic simulation (was src/core) client rendering/UI (was src/client) server coordination (was src/server) Dependency DAG: engine -> {core-public, shared}; client -> {core-public, shared, engine}; server -> {core-public, engine}. - npm workspaces: root package.json workspaces + per-package package.json; tsconfig.base.json holds shared options + path aliases (core-public/* shared/* engine/* client/* server/*) resolved uniformly by tsc, Vite (resolve.tsconfigPaths), Vitest, and tsx. Lockfile regenerated. - core-public: moved Schemas/ApiSchemas/CosmeticSchemas/StatsSchemas/ ClanApiSchemas/WorkerSchemas/Base64/PatternDecoder; extracted the enums (GameTypes), GameEvent type, emoji table, and GraphicsOverrides schema. Engine re-exports the moved enums/types so existing imports keep working. - Broke engine -> client cycle: - renderNumber/renderTroops -> shared/format - NameBoxCalculator moved into engine - username validation returns translation key + params; client translates - applyStateUpdate moved to client (operates on the render-only PlayerState) - Config/UnitGrid/execution-Util/GameImpl now use structural read interfaces (engine/game/ReadViews: PlayerLike/UnitLike/GameLike) instead of importing client view classes; client imports view classes from a new client/view barrel; deleted the engine/game/GameView re-export shim. - Build/deploy updated: vite.config, index.html, eslint, Dockerfile (copies packages/ + tsconfig.base.json before npm ci), .vscode, tests. Verified: tsc --noEmit clean; 1364 + 65 tests pass; production vite build succeeds; engine has zero client/server imports; core-public and shared are dependency leaves. Co-Authored-By: Claude Opus 4.8 (1M context) --- .vscode/launch.json | 2 +- Dockerfile | 11 +- eslint.config.js | 7 +- index.html | 2 +- package-lock.json | 46 +++++ package.json | 8 +- packages/client/package.json | 11 ++ .../client/src}/AccountModal.ts | 8 +- {src/client => packages/client/src}/Api.ts | 6 +- {src/client => packages/client/src}/Auth.ts | 6 +- .../client => packages/client/src}/ClanApi.ts | 4 +- .../client/src}/ClanModal.ts | 0 .../client/src}/ClientEnv.ts | 6 +- .../client/src}/ClientGameRunner.ts | 26 +-- .../client/src}/Controller.ts | 0 .../client/src}/Cosmetics.ts | 10 +- .../client/src}/CrazyGamesSDK.ts | 0 .../client/src}/FlagInput.ts | 4 +- .../client/src}/FlagInputModal.ts | 8 +- .../client/src}/FriendsApi.ts | 2 +- .../client/src}/GameInfoModal.ts | 4 +- .../client/src}/GameModeSelector.ts | 6 +- .../client/src}/GameStartingModal.ts | 0 .../client/src}/GoogleAdElement.ts | 0 .../client/src}/HelpModal.ts | 6 +- .../client/src}/HomepagePromos.ts | 0 .../client/src}/HostLobbyModal.ts | 14 +- .../client/src}/InputHandler.ts | 8 +- .../client/src}/JoinLobbyModal.ts | 12 +- .../client/src}/LangSelector.ts | 6 +- .../client/src}/LanguageModal.ts | 4 +- {src/client => packages/client/src}/Layout.ts | 0 .../client/src}/LeaderboardModal.ts | 0 .../client/src}/LobbySocket.ts | 4 +- .../client/src}/LocalPersistantStats.ts | 4 +- .../client/src}/LocalServer.ts | 8 +- {src/client => packages/client/src}/Main.ts | 16 +- .../client/src}/Matchmaking.ts | 4 +- .../client/src}/ModalRouter.ts | 0 .../client/src}/MultiTabDetector.ts | 0 .../client/src}/Navigation.ts | 0 .../client/src}/NewsMarkdown.ts | 0 .../client/src}/NewsModal.ts | 4 +- .../client/src}/PatternInput.ts | 4 +- .../client/src}/Platform.ts | 0 .../client/src}/SinglePlayerModal.ts | 12 +- {src/client => packages/client/src}/Store.ts | 6 +- packages/client/src/TerrainMapFileLoader.ts | 6 + .../client/src}/TerritoryPatternsModal.ts | 8 +- .../client/src}/TokenLoginModal.ts | 0 .../client/src}/TransformHandler.ts | 6 +- .../client/src}/Transport.ts | 14 +- .../client/src}/TroubleshootingModal.ts | 2 +- .../client => packages/client/src}/UIState.ts | 2 +- .../client/src}/UserSettingModal.ts | 4 +- .../client/src}/UsernameInput.ts | 14 +- {src/client => packages/client/src}/Utils.ts | 36 +--- .../client/src}/WebGLFrameBuilder.ts | 8 +- .../client/src}/components/BaseModal.ts | 0 .../client/src}/components/CapIcon.ts | 2 +- .../client/src}/components/ConfirmDialog.ts | 0 .../client/src}/components/CopyButton.ts | 4 +- .../client/src}/components/CosmeticButton.ts | 4 +- .../src}/components/CosmeticContainer.ts | 2 +- .../client/src}/components/CosmeticInfo.ts | 0 .../client/src}/components/CurrencyDisplay.ts | 0 .../client/src}/components/DesktopNavBar.ts | 2 +- .../client/src}/components/Difficulties.ts | 0 .../client/src}/components/FluentSlider.ts | 0 .../client/src}/components/Footer.ts | 2 +- .../client/src}/components/FriendsList.ts | 2 +- .../src}/components/GameConfigSettings.ts | 4 +- .../components/IOSAddToHomeScreenBanner.ts | 0 .../client/src}/components/LobbyConfigItem.ts | 0 .../client/src}/components/LobbyPlayerView.ts | 10 +- .../client/src}/components/MainLayout.ts | 0 .../client/src}/components/MobileNavBar.ts | 2 +- .../client/src}/components/ModalOverlay.ts | 0 .../components/NavNotificationsController.ts | 0 .../client/src}/components/NewsBox.ts | 2 +- .../src}/components/NotLoggedInWarning.ts | 2 +- .../client/src}/components/PatternPreview.ts | 6 +- .../client/src}/components/PlayPage.ts | 2 +- .../client/src}/components/PlutoniumIcon.ts | 2 +- .../client/src}/components/PurchaseButton.ts | 2 +- .../client/src}/components/RankedModal.ts | 2 +- .../src}/components/SubscriptionPanel.ts | 4 +- .../client/src}/components/ToggleInputCard.ts | 0 .../src}/components/baseComponents/Button.ts | 0 .../src}/components/baseComponents/Modal.ts | 0 .../baseComponents/ranking/GameInfoRanking.ts | 4 +- .../baseComponents/ranking/PlayerRow.ts | 4 +- .../baseComponents/ranking/RankingControls.ts | 0 .../baseComponents/ranking/RankingHeader.ts | 0 .../baseComponents/setting/SettingKeybind.ts | 2 +- .../baseComponents/setting/SettingNumber.ts | 0 .../baseComponents/setting/SettingSelect.ts | 0 .../baseComponents/setting/SettingSlider.ts | 0 .../baseComponents/setting/SettingToggle.ts | 0 .../baseComponents/stats/DiscordUserHeader.ts | 2 +- .../baseComponents/stats/GameList.ts | 4 +- .../baseComponents/stats/PlayerStatsGrid.ts | 0 .../baseComponents/stats/PlayerStatsTable.ts | 2 +- .../baseComponents/stats/PlayerStatsTree.ts | 6 +- .../src}/components/clan/ClanBansView.ts | 0 .../src}/components/clan/ClanBrowseView.ts | 0 .../client/src}/components/clan/ClanCard.ts | 0 .../src}/components/clan/ClanDetailView.ts | 0 .../components/clan/ClanGameHistoryView.ts | 2 +- .../src}/components/clan/ClanManageView.ts | 0 .../components/clan/ClanMyRequestsView.ts | 0 .../src}/components/clan/ClanRequestsView.ts | 0 .../client/src}/components/clan/ClanShared.ts | 0 .../components/clan/ClanStatsBreakdown.ts | 2 +- .../src}/components/clan/ClanTransferView.ts | 0 .../leaderboard/LeaderboardClanTable.ts | 2 +- .../leaderboard/LeaderboardPlayerList.ts | 4 +- .../client/src}/components/map/MapDisplay.ts | 4 +- .../client/src}/components/map/MapPicker.ts | 4 +- .../client/src}/components/ui/ActionButton.ts | 0 .../client/src}/components/ui/Divider.ts | 0 .../client/src}/components/ui/ModalHeader.ts | 0 .../controllers/AttackingTroopsController.ts | 8 +- .../controllers/BuildPreviewController.ts | 12 +- .../controllers/HoverHighlightController.ts | 4 +- .../src}/controllers/SoundEffectController.ts | 8 +- .../StructureHighlightController.ts | 2 +- .../src}/controllers/ViewModeController.ts | 2 +- .../controllers/WarshipSelectionController.ts | 10 +- .../client/src}/hud/FrameProfiler.ts | 0 .../client/src}/hud/GameRenderer.ts | 6 +- .../client/src}/hud/PlayerIcons.ts | 6 +- .../client/src}/hud/SpriteLoader.ts | 6 +- .../src}/hud/layers/ActionableEvents.ts | 8 +- .../client/src}/hud/layers/AlertFrame.ts | 8 +- .../client/src}/hud/layers/AttacksDisplay.ts | 10 +- .../client/src}/hud/layers/BuildMenu.ts | 12 +- .../client/src}/hud/layers/ChatDisplay.ts | 10 +- .../client/src}/hud/layers/ChatIntegration.ts | 4 +- .../client/src}/hud/layers/ChatModal.ts | 6 +- .../client/src}/hud/layers/ControlPanel.ts | 14 +- .../client/src}/hud/layers/EmojiTable.ts | 10 +- .../client/src}/hud/layers/EventsDisplay.ts | 10 +- .../client/src}/hud/layers/GameLeftSidebar.ts | 8 +- .../src}/hud/layers/GameRightSidebar.ts | 8 +- .../src}/hud/layers/GraphicsSettingsModal.ts | 10 +- .../client/src}/hud/layers/HeadsUpMessage.ts | 6 +- .../client/src}/hud/layers/ImmunityTimer.ts | 6 +- .../client/src}/hud/layers/InGamePromo.ts | 2 +- .../client/src}/hud/layers/Leaderboard.ts | 6 +- .../client/src}/hud/layers/MainRadialMenu.ts | 10 +- .../client/src}/hud/layers/MultiTabModal.ts | 8 +- .../src}/hud/layers/PerformanceOverlay.ts | 4 +- .../src}/hud/layers/PlayerActionHandler.ts | 6 +- .../src}/hud/layers/PlayerInfoOverlay.ts | 12 +- .../src}/hud/layers/PlayerModerationModal.ts | 8 +- .../client/src}/hud/layers/PlayerPanel.ts | 12 +- .../client/src}/hud/layers/RadialMenu.ts | 4 +- .../src}/hud/layers/RadialMenuElements.ts | 14 +- .../client/src}/hud/layers/RelationSmiley.ts | 2 +- .../client/src}/hud/layers/ReplayPanel.ts | 4 +- .../src}/hud/layers/SendResourceModal.ts | 6 +- .../client/src}/hud/layers/SettingsModal.ts | 10 +- .../client/src}/hud/layers/SpawnTimer.ts | 6 +- .../client/src}/hud/layers/TeamStats.ts | 6 +- .../client/src}/hud/layers/UnitDisplay.ts | 10 +- .../client/src}/hud/layers/WinModal.ts | 10 +- .../client/src}/hud/ui/TextIndicator.ts | 2 +- .../client/src}/hud/ui/UIElement.ts | 0 .../client/src}/render/CLAUDE.md | 0 .../client/src/render/applyStateUpdate.ts | 48 +++++ .../client/src}/render/frame/RailroadCache.ts | 2 +- .../client/src}/render/frame/TrailManager.ts | 0 .../client/src}/render/frame/Upload.ts | 0 .../render/frame/derive/AllianceClusters.ts | 0 .../src}/render/frame/derive/AttackRings.ts | 0 .../render/frame/derive/NukeTelegraphs.ts | 0 .../src}/render/frame/derive/PlayerStatus.ts | 0 .../render/frame/derive/RelationMatrix.ts | 0 .../client/src}/render/frame/index.ts | 0 .../client/src}/render/gl/Camera.ts | 0 .../client/src}/render/gl/DynamicBuffer.ts | 0 .../client/src}/render/gl/Events.ts | 0 .../client/src}/render/gl/GameView.ts | 2 +- .../client/src}/render/gl/RenderOverrides.ts | 2 +- .../client/src}/render/gl/RenderSettings.ts | 0 .../client/src}/render/gl/Renderer.ts | 2 +- .../client/src}/render/gl/SettingsUtils.ts | 0 .../client/src}/render/gl/debug/ConfigProp.ts | 0 .../client/src}/render/gl/debug/Folder.ts | 0 .../client/src}/render/gl/debug/Layout.ts | 0 .../client/src}/render/gl/debug/Tree.ts | 0 .../client/src}/render/gl/debug/Wiring.ts | 0 .../client/src}/render/gl/debug/index.ts | 0 .../src}/render/gl/debug/props/Color.ts | 0 .../src}/render/gl/debug/props/Select.ts | 0 .../src}/render/gl/debug/props/Slider.ts | 0 .../src}/render/gl/debug/props/Toggle.ts | 0 .../client/src}/render/gl/index.ts | 4 +- .../client/src}/render/gl/passes/BarPass.ts | 4 +- .../render/gl/passes/BorderComputePass.ts | 0 .../render/gl/passes/BorderScatterPass.ts | 0 .../src}/render/gl/passes/BorderStampPass.ts | 0 .../render/gl/passes/CoordinateGridPass.ts | 0 .../src}/render/gl/passes/CrosshairPass.ts | 0 .../render/gl/passes/DefenseCoveragePass.ts | 0 .../src}/render/gl/passes/FalloutBloomPass.ts | 0 .../src}/render/gl/passes/FalloutLightPass.ts | 0 .../src}/render/gl/passes/LightmapPass.ts | 0 .../render/gl/passes/MoveIndicatorPass.ts | 0 .../render/gl/passes/NightCompositePass.ts | 0 .../render/gl/passes/NukeTelegraphPass.ts | 0 .../render/gl/passes/NukeTrajectoryPass.ts | 0 .../src}/render/gl/passes/PointLightPass.ts | 0 .../src}/render/gl/passes/RadialMenuPass.ts | 2 +- .../src}/render/gl/passes/RailroadPass.ts | 0 .../src}/render/gl/passes/RangeCirclePass.ts | 0 .../src}/render/gl/passes/SamRadiusPass.ts | 0 .../src}/render/gl/passes/SelectionBoxPass.ts | 0 .../src}/render/gl/passes/SkinAtlasArray.ts | 0 .../src}/render/gl/passes/SpawnOverlayPass.ts | 0 .../render/gl/passes/StructureLevelPass.ts | 2 +- .../src}/render/gl/passes/StructurePass.ts | 2 +- .../src}/render/gl/passes/TerrainPass.ts | 0 .../src}/render/gl/passes/TerritoryPass.ts | 0 .../src}/render/gl/passes/TileScatterPass.ts | 0 .../client/src}/render/gl/passes/TrailPass.ts | 0 .../client/src}/render/gl/passes/UnitPass.ts | 2 +- .../src}/render/gl/passes/WorldTextPass.ts | 4 +- .../gl/passes/fx-pass/FxAttackRingPass.ts | 0 .../gl/passes/fx-pass/FxShockwavePass.ts | 0 .../render/gl/passes/fx-pass/FxSpritePass.ts | 4 +- .../src}/render/gl/passes/fx-pass/index.ts | 2 +- .../render/gl/passes/name-pass/AtlasData.ts | 0 .../gl/passes/name-pass/DataTextures.ts | 0 .../gl/passes/name-pass/DebugProgram.ts | 0 .../gl/passes/name-pass/FlagAtlasArray.ts | 0 .../render/gl/passes/name-pass/IconProgram.ts | 2 +- .../gl/passes/name-pass/StatusIconProgram.ts | 2 +- .../render/gl/passes/name-pass/TextLayout.ts | 0 .../render/gl/passes/name-pass/TextProgram.ts | 2 +- .../src}/render/gl/passes/name-pass/Types.ts | 0 .../src}/render/gl/passes/name-pass/index.ts | 0 .../src}/render/gl/render-settings.json | 0 .../src}/render/gl/shaders/bar/bar.frag.glsl | 0 .../src}/render/gl/shaders/bar/bar.vert.glsl | 0 .../border-compute/border-compute.frag.glsl | 0 .../border-compute/border-scatter.vert.glsl | 0 .../gl/shaders/crosshair/crosshair.frag.glsl | 0 .../gl/shaders/crosshair/crosshair.vert.glsl | 0 .../shaders/day-night/border-stamp.frag.glsl | 0 .../shaders/day-night/border-stamp.vert.glsl | 0 .../gl/shaders/day-night/composite.frag.glsl | 0 .../day-night/fallout-composite.frag.glsl | 0 .../day-night/fallout-composite.vert.glsl | 0 .../shaders/day-night/fallout-light.frag.glsl | 0 .../gl/shaders/day-night/light.frag.glsl | 0 .../gl/shaders/day-night/light.vert.glsl | 0 .../defense-coverage.frag.glsl | 0 .../defense-coverage.vert.glsl | 0 .../shaders/fallout-bloom/composite.frag.glsl | 0 .../shaders/fallout-bloom/composite.vert.glsl | 0 .../shaders/fallout-bloom/extract.frag.glsl | 0 .../fallout-bloom/heat-decay.frag.glsl | 0 .../gl/shaders/fx/attack-ring.frag.glsl | 0 .../gl/shaders/fx/attack-ring.vert.glsl | 0 .../render/gl/shaders/fx/shockwave.frag.glsl | 0 .../render/gl/shaders/fx/shockwave.vert.glsl | 0 .../render/gl/shaders/fx/sprite.frag.glsl | 0 .../render/gl/shaders/fx/sprite.vert.glsl | 0 .../client/src}/render/gl/shaders/glsl.d.ts | 0 .../render/gl/shaders/grid/grid.frag.glsl | 0 .../gl/shaders/map-overlay/overlay.vert.glsl | 0 .../shaders/map-overlay/territory.frag.glsl | 0 .../map-overlay/tile-scatter.frag.glsl | 0 .../map-overlay/tile-scatter.vert.glsl | 0 .../gl/shaders/map-overlay/trail.frag.glsl | 0 .../move-indicator/move-indicator.frag.glsl | 0 .../move-indicator/move-indicator.vert.glsl | 0 .../gl/shaders/name/debug-box.frag.glsl | 0 .../gl/shaders/name/debug-box.vert.glsl | 0 .../render/gl/shaders/name/icon.frag.glsl | 0 .../render/gl/shaders/name/icon.vert.glsl | 0 .../render/gl/shaders/name/name.frag.glsl | 0 .../render/gl/shaders/name/name.vert.glsl | 0 .../gl/shaders/name/status-icon.frag.glsl | 0 .../gl/shaders/name/status-icon.vert.glsl | 0 .../nuke-telegraph/nuke-telegraph.frag.glsl | 0 .../nuke-telegraph/nuke-telegraph.vert.glsl | 0 .../nuke-trajectory-marker.frag.glsl | 0 .../nuke-trajectory-marker.vert.glsl | 0 .../nuke-trajectory/nuke-trajectory.frag.glsl | 0 .../nuke-trajectory/nuke-trajectory.vert.glsl | 0 .../gl/shaders/radial-menu/arcs.frag.glsl | 0 .../gl/shaders/radial-menu/arcs.vert.glsl | 0 .../gl/shaders/radial-menu/icon.frag.glsl | 0 .../gl/shaders/radial-menu/icon.vert.glsl | 0 .../gl/shaders/railroad/railroad.frag.glsl | 0 .../range-circle/range-circle.frag.glsl | 0 .../range-circle/range-circle.vert.glsl | 0 .../shaders/sam-radius/sam-radius.frag.glsl | 0 .../shaders/sam-radius/sam-radius.vert.glsl | 0 .../selection-box/selection-box.frag.glsl | 0 .../selection-box/selection-box.vert.glsl | 0 .../render/gl/shaders/shared/blur.frag.glsl | 0 .../shaders/shared/fullscreen-no-uv.vert.glsl | 0 .../gl/shaders/shared/fullscreen.vert.glsl | 0 .../spawn-overlay/spawn-overlay.frag.glsl | 0 .../structure-level/structure-level.frag.glsl | 0 .../structure-level/structure-level.vert.glsl | 0 .../gl/shaders/structure/structure.frag.glsl | 0 .../gl/shaders/structure/structure.vert.glsl | 0 .../gl/shaders/terrain/terrain.frag.glsl | 0 .../gl/shaders/terrain/terrain.vert.glsl | 0 .../render/gl/shaders/unit/unit.frag.glsl | 0 .../render/gl/shaders/unit/unit.vert.glsl | 0 .../shaders/world-text/world-text.frag.glsl | 0 .../shaders/world-text/world-text.vert.glsl | 0 .../src}/render/gl/utils/Affiliation.ts | 0 .../client/src}/render/gl/utils/ColorUtils.ts | 0 .../client/src}/render/gl/utils/GlUtils.ts | 0 .../src}/render/gl/utils/GpuResources.ts | 0 .../src}/render/gl/utils/HeatManager.ts | 0 .../src}/render/gl/utils/NukeTrajectory.ts | 0 .../client/src}/render/gl/utils/TileCodec.ts | 0 .../client/src}/render/gl/vite-env.d.ts | 0 .../client/src}/render/types/FrameData.ts | 0 .../client/src}/render/types/FrameEvents.ts | 0 .../client/src}/render/types/FrameSource.ts | 0 .../client/src}/render/types/Game.ts | 0 .../client/src}/render/types/GameUpdates.ts | 0 .../client/src}/render/types/Renderer.ts | 2 +- .../client/src}/render/types/Replay.ts | 0 .../client/src}/render/types/UnitType.ts | 0 .../client/src}/render/types/index.ts | 0 .../client/src}/sound/SoundManager.ts | 6 +- .../client/src}/sound/Sounds.ts | 4 +- .../client => packages/client/src}/styles.css | 0 .../src}/styles/components/controls.css | 0 .../client/src}/styles/components/setting.css | 0 .../src}/styles/core/flag-animation.css | 0 .../client/src}/styles/core/typography.css | 0 .../client/src}/styles/core/variables.css | 0 .../client/src}/styles/layout/container.css | 0 .../client/src}/styles/layout/header.css | 0 .../client/src}/styles/modal/chat.css | 0 .../client/src}/theme/ColorAllocator.ts | 6 +- .../client/src}/theme/Colors.ts | 0 .../client/src}/theme/PastelTheme.ts | 8 +- .../client/src}/theme/PastelThemeDark.ts | 4 +- .../client/src}/theme/Theme.ts | 6 +- .../client/src}/theme/ThemeProvider.ts | 2 +- .../client/src}/utilities/Diagnostic.ts | 0 .../src}/utilities/DisableSafariPinchZoom.ts | 0 .../src}/utilities/GameConfigHelpers.ts | 4 +- .../src}/utilities/ReplaySpeedMultiplier.ts | 0 .../client/src}/view/GameView.ts | 25 +-- .../client/src}/view/PlayerView.ts | 18 +- .../client/src}/view/UnitView.ts | 6 +- packages/client/src/view/index.ts | 5 + .../client/src}/vite-env.d.ts | 0 packages/client/tsconfig.json | 4 + packages/core-public/package.json | 8 + .../core-public/src}/ApiSchemas.ts | 2 +- .../core-public/src}/Base64.ts | 0 .../core-public/src}/ClanApiSchemas.ts | 0 .../core-public/src}/CosmeticSchemas.ts | 0 packages/core-public/src/Emojis.ts | 20 ++ packages/core-public/src/EventBus.ts | 7 + .../core-public/src}/GraphicsOverrides.ts | 0 .../core-public/src}/PatternDecoder.ts | 0 .../core-public/src}/Schemas.ts | 4 +- .../core-public/src}/StatsSchemas.ts | 2 +- .../core-public/src}/WorkerSchemas.ts | 0 packages/core-public/src/game/GameTypes.ts | 151 +++++++++++++++ packages/core-public/tsconfig.json | 4 + packages/engine/package.json | 11 ++ .../core => packages/engine/src}/AssetUrls.ts | 0 {src/core => packages/engine/src}/EventBus.ts | 10 +- .../engine/src}/GameRunner.ts | 4 +- .../engine/src}/PseudoRandom.ts | 0 {src/core => packages/engine/src}/Util.ts | 27 +-- .../engine/src}/configuration/Config.ts | 22 +-- .../engine/src}/execution/AttackExecution.ts | 2 +- .../src}/execution/BoatRetreatExecution.ts | 0 .../engine/src}/execution/CityExecution.ts | 0 .../src}/execution/ConstructionExecution.ts | 0 .../src}/execution/DefensePostExecution.ts | 0 .../src}/execution/DeleteUnitExecution.ts | 0 .../src}/execution/DonateGoldExecution.ts | 0 .../src}/execution/DonateTroopExecution.ts | 0 .../src}/execution/EmbargoAllExecution.ts | 0 .../engine/src}/execution/EmbargoExecution.ts | 0 .../engine/src}/execution/EmojiExecution.ts | 0 .../engine/src}/execution/ExecutionManager.ts | 2 +- .../engine/src}/execution/FactoryExecution.ts | 0 .../engine/src}/execution/MIRVExecution.ts | 0 .../execution/MarkDisconnectedExecution.ts | 0 .../src}/execution/MissileSiloExecution.ts | 0 .../src}/execution/MoveWarshipExecution.ts | 0 .../engine/src}/execution/NationExecution.ts | 2 +- .../engine/src}/execution/NoOpExecution.ts | 0 .../engine/src}/execution/NukeExecution.ts | 2 +- .../engine/src}/execution/PauseExecution.ts | 0 .../engine/src}/execution/PlayerExecution.ts | 0 .../engine/src}/execution/PortExecution.ts | 0 .../src}/execution/QuickChatExecution.ts | 0 .../RecomputeRailClusterExecution.ts | 0 .../engine/src}/execution/RetreatExecution.ts | 0 .../src}/execution/SAMLauncherExecution.ts | 0 .../src}/execution/SAMMissileExecution.ts | 2 +- .../engine/src}/execution/ShellExecution.ts | 0 .../engine/src}/execution/SpawnExecution.ts | 2 +- .../src}/execution/SpawnTimerExecution.ts | 0 .../src}/execution/TargetPlayerExecution.ts | 0 .../src}/execution/TradeShipExecution.ts | 2 +- .../engine/src}/execution/TrainExecution.ts | 0 .../src}/execution/TrainStationExecution.ts | 0 .../src}/execution/TransportShipExecution.ts | 2 +- .../engine/src}/execution/TribeExecution.ts | 0 .../engine/src}/execution/TribeSpawner.ts | 2 +- .../execution/UpgradeStructureExecution.ts | 0 .../engine/src}/execution/Util.ts | 4 +- .../engine/src}/execution/WarshipExecution.ts | 0 .../src}/execution/WinCheckExecution.ts | 0 .../alliance/AllianceExtensionExecution.ts | 0 .../alliance/AllianceRejectExecution.ts | 0 .../alliance/AllianceRequestExecution.ts | 0 .../alliance/BreakAllianceExecution.ts | 0 .../nation/NationAllianceBehavior.ts | 0 .../execution/nation/NationEmojiBehavior.ts | 0 .../execution/nation/NationMIRVBehavior.ts | 0 .../execution/nation/NationNukeBehavior.ts | 0 .../nation/NationStructureBehavior.ts | 0 .../src}/execution/nation/NationUtils.ts | 0 .../execution/nation/NationWarshipBehavior.ts | 0 .../src}/execution/nation/SharedWaterCache.ts | 0 .../src}/execution/utils/AiAttackBehavior.ts | 0 .../src}/execution/utils/FlatBinaryHeap.ts | 0 .../src}/execution/utils/PlayerSpawner.ts | 2 +- .../engine/src}/execution/utils/TribeNames.ts | 0 .../engine/src}/game/AllianceImpl.ts | 0 .../engine/src}/game/AllianceRequestImpl.ts | 0 .../engine/src}/game/AttackImpl.ts | 0 .../src}/game/BinaryLoaderGameMapLoader.ts | 0 .../engine/src}/game/FetchGameMapLoader.ts | 0 .../core => packages/engine/src}/game/Game.ts | 172 ++++-------------- .../engine/src}/game/GameImpl.ts | 10 +- .../engine/src}/game/GameMap.ts | 0 .../engine/src}/game/GameMapLoader.ts | 0 .../engine/src}/game/GameUpdateUtils.ts | 43 ----- .../engine/src}/game/GameUpdates.ts | 2 +- .../engine/src}/game/MotionPlans.ts | 0 .../engine/src/game}/NameBoxCalculator.ts | 4 +- .../engine/src}/game/NationCreation.ts | 2 +- .../engine/src}/game/PlayerImpl.ts | 2 +- .../engine/src}/game/RailNetwork.ts | 0 .../engine/src}/game/RailNetworkImpl.ts | 0 .../engine/src}/game/Railroad.ts | 0 .../engine/src}/game/RailroadSpatialGrid.ts | 0 packages/engine/src/game/ReadViews.ts | 55 ++++++ .../engine/src}/game/Stats.ts | 4 +- .../engine/src}/game/StatsImpl.ts | 4 +- .../engine/src}/game/TeamAssignment.ts | 2 +- .../engine/src}/game/TerraNulliusImpl.ts | 2 +- .../engine/src}/game/TerrainMapLoader.ts | 0 .../engine/src}/game/TerrainSearchMap.ts | 0 .../engine/src}/game/TrainStation.ts | 0 .../engine/src}/game/TransportShipUtils.ts | 0 .../engine/src}/game/UnitGrid.ts | 30 +-- .../engine/src}/game/UnitImpl.ts | 0 .../engine/src}/game/UserSettings.ts | 6 +- .../engine/src}/game/WaterManager.ts | 0 .../engine/src}/pathfinding/PathFinder.Air.ts | 0 .../src}/pathfinding/PathFinder.Parabola.ts | 0 .../src}/pathfinding/PathFinder.Station.ts | 0 .../engine/src}/pathfinding/PathFinder.ts | 0 .../src}/pathfinding/PathFinderBuilder.ts | 0 .../src}/pathfinding/PathFinderStepper.ts | 0 .../algorithms/AStar.AbstractGraph.ts | 0 .../src}/pathfinding/algorithms/AStar.Rail.ts | 0 .../pathfinding/algorithms/AStar.Water.ts | 0 .../algorithms/AStar.WaterBounded.ts | 0 .../algorithms/AStar.WaterHierarchical.ts | 0 .../src}/pathfinding/algorithms/AStar.ts | 0 .../pathfinding/algorithms/AbstractGraph.ts | 0 .../src}/pathfinding/algorithms/BFS.Grid.ts | 0 .../engine/src}/pathfinding/algorithms/BFS.ts | 0 .../algorithms/ConnectedComponents.ts | 0 .../pathfinding/algorithms/PriorityQueue.ts | 0 .../src}/pathfinding/spatial/SpatialQuery.ts | 0 .../transformers/ComponentCheckTransformer.ts | 0 .../transformers/MiniMapTransformer.ts | 0 .../transformers/ShoreCoercingTransformer.ts | 0 .../transformers/SmoothingWaterTransformer.ts | 0 .../engine/src}/pathfinding/types.ts | 0 .../engine/src}/utilities/DebugSpan.ts | 0 .../engine/src}/utilities/Line.ts | 0 packages/engine/src/validations/username.ts | 73 ++++++++ .../engine/src}/worker/Worker.worker.ts | 0 .../engine/src}/worker/WorkerClient.ts | 2 +- .../engine/src}/worker/WorkerMessages.ts | 2 +- packages/engine/tsconfig.json | 4 + packages/server/package.json | 11 ++ .../server => packages/server/src}/Archive.ts | 6 +- {src/server => packages/server/src}/Client.ts | 6 +- .../server/src}/ClientMsgRateLimiter.ts | 2 +- .../server/src}/GameManager.ts | 4 +- .../server/src}/GamePreviewBuilder.ts | 8 +- .../server/src}/GamePreviewRoute.ts | 4 +- .../server/src}/GameServer.ts | 10 +- .../server/src}/IPCBridgeSchema.ts | 2 +- {src/server => packages/server/src}/Logger.ts | 0 .../server/src}/MapLandTiles.ts | 4 +- .../server/src}/MapPlaylist.ts | 8 +- {src/server => packages/server/src}/Master.ts | 2 +- .../server/src}/MasterLobbyService.ts | 4 +- .../server/src}/NoStoreHeaders.ts | 0 .../server/src}/OtelResource.ts | 0 .../server/src}/PollingLoop.ts | 0 .../server/src}/Privilege.ts | 8 +- .../server/src}/PrivilegeRefresher.ts | 4 +- .../server/src}/PublicAssetManifest.ts | 4 +- {src/server => packages/server/src}/README.md | 0 .../server/src}/RenderHtml.ts | 2 +- .../server/src}/RuntimeAssetManifest.ts | 2 +- {src/server => packages/server/src}/Server.ts | 0 .../server/src}/ServerEnv.ts | 6 +- .../server/src}/StaticAssetCache.ts | 0 .../server/src}/Turnstile.ts | 0 {src/server => packages/server/src}/Worker.ts | 10 +- .../server/src}/WorkerLobbyService.ts | 2 +- .../server/src}/WorkerMetrics.ts | 0 {src/server => packages/server/src}/jwt.ts | 6 +- packages/server/tsconfig.json | 4 + packages/shared/package.json | 8 + packages/shared/src/format.ts | 32 ++++ packages/shared/tsconfig.json | 4 + src/client/TerrainMapFileLoader.ts | 6 - src/core/game/GameView.ts | 12 -- src/core/validations/username.ts | 73 -------- tests/AiAttackBehavior.test.ts | 6 +- tests/AllianceAcceptNukes.test.ts | 8 +- tests/AllianceDonation.test.ts | 6 +- tests/AllianceExtensionExecution.test.ts | 6 +- tests/AllianceRequestExecution.test.ts | 8 +- tests/AssetUrls.test.ts | 2 +- tests/Attack.test.ts | 12 +- tests/AttackStats.test.ts | 6 +- tests/AutoUpgrade.test.ts | 4 +- tests/Censor.test.ts | 4 +- tests/Colors.test.ts | 6 +- tests/ConquerGold.test.ts | 6 +- tests/CosmeticRelationship.test.ts | 4 +- tests/DeleteUnitExecution.test.ts | 10 +- tests/Disconnected.test.ts | 16 +- tests/Donate.test.ts | 10 +- tests/FindAndUpgradeNearestBuilding.test.ts | 8 +- tests/GameInfoRanking.test.ts | 8 +- tests/GameUpdateUtils.test.ts | 12 +- tests/GraphicsOverrides.test.ts | 6 +- tests/InputHandler.test.ts | 12 +- tests/LobbySocket.test.ts | 4 +- tests/MapConsistency.test.ts | 10 +- tests/MessageTypeClasses.test.ts | 4 +- tests/MissileSilo.test.ts | 12 +- tests/NameLayer.test.ts | 2 +- tests/NationAllianceBehavior.test.ts | 8 +- tests/NationCounterWarshipInfestation.test.ts | 4 +- tests/NationCreation.test.ts | 10 +- tests/NationMIRV.test.ts | 8 +- tests/NationNukeSamOverwhelm.test.ts | 8 +- tests/NationStructureBehavior.test.ts | 10 +- tests/PlayerAllianceList.test.ts | 6 +- tests/PlayerImpl.test.ts | 2 +- tests/PlayerInfo.test.ts | 2 +- tests/PortExecution.test.ts | 4 +- tests/Privilege.test.ts | 2 +- tests/QuickChat.test.ts | 4 +- tests/ResolveCosmetics.test.ts | 6 +- tests/ShellRandom.test.ts | 8 +- tests/Stats.test.ts | 8 +- tests/StatsSchema.test.ts | 4 +- tests/Team.test.ts | 2 +- tests/TeamAssignment.test.ts | 4 +- tests/TerritoryCapture.test.ts | 6 +- tests/TranslationSystem.test.ts | 2 +- tests/UnitGrid.test.ts | 4 +- tests/Warship.test.ts | 10 +- tests/WarshipMultiSelection.test.ts | 6 +- tests/client/DisableSafariPinchZoom.test.ts | 2 +- tests/client/JoinLobbyModal.test.ts | 2 +- tests/client/LeaderboardModal.test.ts | 14 +- tests/client/NewsMarkdown.test.ts | 2 +- tests/client/Platform.test.ts | 2 +- tests/client/clan/ClanApiBans.test.ts | 6 +- tests/client/clan/ClanApiMutations.test.ts | 6 +- tests/client/clan/ClanApiQueries.test.ts | 10 +- tests/client/clan/ClanApiSchemas.test.ts | 2 +- tests/client/clan/ClanGameHistoryView.test.ts | 20 +- tests/client/clan/ClanModal.handlers.test.ts | 66 +++---- tests/client/clan/ClanModal.rendering.test.ts | 34 ++-- tests/client/clan/ClanModalTestUtils.ts | 4 +- tests/client/clan/ClanShared.test.ts | 4 +- tests/client/components/FluentSlider.test.ts | 4 +- tests/client/components/NewsBox.test.ts | 4 +- .../BuildPreviewController.test.ts | 4 +- .../WarshipSelectionController.test.ts | 4 +- .../graphics/RadialMenuElements.test.ts | 24 +-- .../layers/ActionableEventsAlliance.test.ts | 6 +- .../layers/AttackingTroopsOverlay.test.ts | 4 +- .../graphics/layers/PlayerPanelKick.test.ts | 16 +- tests/client/graphics/layers/WinModal.test.ts | 10 +- .../render/frame/derive/player-status.test.ts | 6 +- tests/client/sound/SoundManager.test.ts | 12 +- tests/client/view/GameView.test.ts | 4 +- tests/client/view/PlayerView.test.ts | 6 +- tests/client/view/UnitView.test.ts | 4 +- tests/core/GameRunner.test.ts | 8 +- tests/core/configuration/ConfigLoader.test.ts | 4 +- tests/core/execution/SpawnExecution.test.ts | 4 +- tests/core/executions/MIRVExecution.test.ts | 4 +- .../executions/NoInverseAnnexation.test.ts | 4 +- tests/core/executions/NukeExecution.test.ts | 4 +- tests/core/executions/PlayerExecution.test.ts | 4 +- .../executions/SAMLauncherExecution.test.ts | 12 +- .../executions/TradeShipExecution.test.ts | 6 +- .../core/executions/WinCheckExecution.test.ts | 4 +- tests/core/game/Cluster.test.ts | 4 +- tests/core/game/FetchGameMapLoader.test.ts | 4 +- tests/core/game/GameImpl.test.ts | 16 +- .../core/game/GameMap.tileStateBuffer.test.ts | 2 +- tests/core/game/RailNetwork.test.ts | 8 +- tests/core/game/TrainStation.test.ts | 20 +- .../pathfinding/PathFinderStepper.test.ts | 4 +- .../core/pathfinding/PathFinding.Air.test.ts | 8 +- .../core/pathfinding/PathFinding.Rail.test.ts | 8 +- .../pathfinding/PathFinding.Water.test.ts | 8 +- tests/core/pathfinding/SpatialQuery.test.ts | 8 +- .../UniversalPathFinding.Parabola.test.ts | 6 +- .../core/pathfinding/WaterComponents.test.ts | 2 +- tests/core/pathfinding/_fixtures.ts | 10 +- .../ComponentCheckTransformer.test.ts | 4 +- .../transformers/MiniMapTransformer.test.ts | 6 +- .../ShoreCoercingTransformer.test.ts | 4 +- tests/economy/ConstructionGold.test.ts | 6 +- tests/nukes/HydrogenAndMirv.test.ts | 4 +- tests/nukes/WaterNukes.test.ts | 6 +- tests/pathfinding/playground/api/maps.ts | 6 +- .../pathfinding/playground/api/pathfinding.ts | 8 +- .../playground/api/spatialQuery.ts | 8 +- tests/pathfinding/playground/server.ts | 2 +- tests/pathfinding/utils.ts | 26 +-- tests/perf/DiffPlayerUpdatePerf.ts | 6 +- tests/perf/MIRVPerf.ts | 4 +- tests/radialMenuElements.test.ts | 8 +- tests/server/Archive.test.ts | 14 +- tests/server/ClientMsgRateLimiter.test.ts | 2 +- tests/server/GameLifecycle.test.ts | 8 +- tests/server/KickPlayerAuthorization.test.ts | 10 +- tests/server/MasterLobbyServiceHealth.test.ts | 8 +- tests/server/NoStoreHeaders.test.ts | 2 +- tests/server/PollingLoop.test.ts | 4 +- tests/server/PublicAssetManifest.test.ts | 4 +- tests/server/RenderHtml.test.ts | 2 +- tests/server/ServerEnv.test.ts | 2 +- tests/server/StaticAssetCache.test.ts | 2 +- tests/util/Setup.ts | 10 +- tests/util/TestConfig.ts | 6 +- tests/util/utils.ts | 4 +- tests/util/viewStubs.ts | 20 +- tsconfig.base.json | 30 +++ tsconfig.json | 31 +--- vite.config.ts | 6 +- 674 files changed, 1637 insertions(+), 1370 deletions(-) create mode 100644 packages/client/package.json rename {src/client => packages/client/src}/AccountModal.ts (98%) rename {src/client => packages/client/src}/Api.ts (98%) rename {src/client => packages/client/src}/Auth.ts (97%) rename {src/client => packages/client/src}/ClanApi.ts (99%) rename {src/client => packages/client/src}/ClanModal.ts (100%) rename {src/client => packages/client/src}/ClientEnv.ts (96%) rename {src/client => packages/client/src}/ClientGameRunner.ts (98%) rename {src/client => packages/client/src}/Controller.ts (100%) rename {src/client => packages/client/src}/Cosmetics.ts (98%) rename {src/client => packages/client/src}/CrazyGamesSDK.ts (100%) rename {src/client => packages/client/src}/FlagInput.ts (97%) rename {src/client => packages/client/src}/FlagInputModal.ts (96%) rename {src/client => packages/client/src}/FriendsApi.ts (99%) rename {src/client => packages/client/src}/GameInfoModal.ts (98%) rename {src/client => packages/client/src}/GameModeSelector.ts (99%) rename {src/client => packages/client/src}/GameStartingModal.ts (100%) rename {src/client => packages/client/src}/GoogleAdElement.ts (100%) rename {src/client => packages/client/src}/HelpModal.ts (99%) rename {src/client => packages/client/src}/HomepagePromos.ts (100%) rename {src/client => packages/client/src}/HostLobbyModal.ts (99%) rename {src/client => packages/client/src}/InputHandler.ts (99%) rename {src/client => packages/client/src}/JoinLobbyModal.ts (99%) rename {src/client => packages/client/src}/LangSelector.ts (98%) rename {src/client => packages/client/src}/LanguageModal.ts (97%) rename {src/client => packages/client/src}/Layout.ts (100%) rename {src/client => packages/client/src}/LeaderboardModal.ts (100%) rename {src/client => packages/client/src}/LobbySocket.ts (97%) rename {src/client => packages/client/src}/LocalPersistantStats.ts (91%) rename {src/client => packages/client/src}/LocalServer.ts (98%) rename {src/client => packages/client/src}/Main.ts (98%) rename {src/client => packages/client/src}/Matchmaking.ts (98%) rename {src/client => packages/client/src}/ModalRouter.ts (100%) rename {src/client => packages/client/src}/MultiTabDetector.ts (100%) rename {src/client => packages/client/src}/Navigation.ts (100%) rename {src/client => packages/client/src}/NewsMarkdown.ts (100%) rename {src/client => packages/client/src}/NewsModal.ts (96%) rename {src/client => packages/client/src}/PatternInput.ts (98%) rename {src/client => packages/client/src}/Platform.ts (100%) rename {src/client => packages/client/src}/SinglePlayerModal.ts (98%) rename {src/client => packages/client/src}/Store.ts (97%) create mode 100644 packages/client/src/TerrainMapFileLoader.ts rename {src/client => packages/client/src}/TerritoryPatternsModal.ts (97%) rename {src/client => packages/client/src}/TokenLoginModal.ts (100%) rename {src/client => packages/client/src}/TransformHandler.ts (98%) rename {src/client => packages/client/src}/Transport.ts (98%) rename {src/client => packages/client/src}/TroubleshootingModal.ts (99%) rename {src/client => packages/client/src}/UIState.ts (68%) rename {src/client => packages/client/src}/UserSettingModal.ts (99%) rename {src/client => packages/client/src}/UsernameInput.ts (95%) rename {src/client => packages/client/src}/Utils.ts (95%) rename {src/client => packages/client/src}/WebGLFrameBuilder.ts (97%) rename {src/client => packages/client/src}/components/BaseModal.ts (100%) rename {src/client => packages/client/src}/components/CapIcon.ts (92%) rename {src/client => packages/client/src}/components/ConfirmDialog.ts (100%) rename {src/client => packages/client/src}/components/CopyButton.ts (98%) rename {src/client => packages/client/src}/components/CosmeticButton.ts (99%) rename {src/client => packages/client/src}/components/CosmeticContainer.ts (99%) rename {src/client => packages/client/src}/components/CosmeticInfo.ts (100%) rename {src/client => packages/client/src}/components/CurrencyDisplay.ts (100%) rename {src/client => packages/client/src}/components/DesktopNavBar.ts (99%) rename {src/client => packages/client/src}/components/Difficulties.ts (100%) rename {src/client => packages/client/src}/components/FluentSlider.ts (100%) rename {src/client => packages/client/src}/components/Footer.ts (99%) rename {src/client => packages/client/src}/components/FriendsList.ts (99%) rename {src/client => packages/client/src}/components/GameConfigSettings.ts (99%) rename {src/client => packages/client/src}/components/IOSAddToHomeScreenBanner.ts (100%) rename {src/client => packages/client/src}/components/LobbyConfigItem.ts (100%) rename {src/client => packages/client/src}/components/LobbyPlayerView.ts (97%) rename {src/client => packages/client/src}/components/MainLayout.ts (100%) rename {src/client => packages/client/src}/components/MobileNavBar.ts (99%) rename {src/client => packages/client/src}/components/ModalOverlay.ts (100%) rename {src/client => packages/client/src}/components/NavNotificationsController.ts (100%) rename {src/client => packages/client/src}/components/NewsBox.ts (99%) rename {src/client => packages/client/src}/components/NotLoggedInWarning.ts (95%) rename {src/client => packages/client/src}/components/PatternPreview.ts (95%) rename {src/client => packages/client/src}/components/PlayPage.ts (98%) rename {src/client => packages/client/src}/components/PlutoniumIcon.ts (97%) rename {src/client => packages/client/src}/components/PurchaseButton.ts (99%) rename {src/client => packages/client/src}/components/RankedModal.ts (98%) rename {src/client => packages/client/src}/components/SubscriptionPanel.ts (98%) rename {src/client => packages/client/src}/components/ToggleInputCard.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/Button.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/Modal.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/ranking/GameInfoRanking.ts (97%) rename {src/client => packages/client/src}/components/baseComponents/ranking/PlayerRow.ts (98%) rename {src/client => packages/client/src}/components/baseComponents/ranking/RankingControls.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/ranking/RankingHeader.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/setting/SettingKeybind.ts (98%) rename {src/client => packages/client/src}/components/baseComponents/setting/SettingNumber.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/setting/SettingSelect.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/setting/SettingSlider.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/setting/SettingToggle.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/stats/DiscordUserHeader.ts (96%) rename {src/client => packages/client/src}/components/baseComponents/stats/GameList.ts (98%) rename {src/client => packages/client/src}/components/baseComponents/stats/PlayerStatsGrid.ts (100%) rename {src/client => packages/client/src}/components/baseComponents/stats/PlayerStatsTable.ts (99%) rename {src/client => packages/client/src}/components/baseComponents/stats/PlayerStatsTree.ts (98%) rename {src/client => packages/client/src}/components/clan/ClanBansView.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanBrowseView.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanCard.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanDetailView.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanGameHistoryView.ts (99%) rename {src/client => packages/client/src}/components/clan/ClanManageView.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanMyRequestsView.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanRequestsView.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanShared.ts (100%) rename {src/client => packages/client/src}/components/clan/ClanStatsBreakdown.ts (99%) rename {src/client => packages/client/src}/components/clan/ClanTransferView.ts (100%) rename {src/client => packages/client/src}/components/leaderboard/LeaderboardClanTable.ts (99%) rename {src/client => packages/client/src}/components/leaderboard/LeaderboardPlayerList.ts (99%) rename {src/client => packages/client/src}/components/map/MapDisplay.ts (97%) rename {src/client => packages/client/src}/components/map/MapPicker.ts (98%) rename {src/client => packages/client/src}/components/ui/ActionButton.ts (100%) rename {src/client => packages/client/src}/components/ui/Divider.ts (100%) rename {src/client => packages/client/src}/components/ui/ModalHeader.ts (100%) rename {src/client => packages/client/src}/controllers/AttackingTroopsController.ts (97%) rename {src/client => packages/client/src}/controllers/BuildPreviewController.ts (97%) rename {src/client => packages/client/src}/controllers/HoverHighlightController.ts (93%) rename {src/client => packages/client/src}/controllers/SoundEffectController.ts (91%) rename {src/client => packages/client/src}/controllers/StructureHighlightController.ts (95%) rename {src/client => packages/client/src}/controllers/ViewModeController.ts (94%) rename {src/client => packages/client/src}/controllers/WarshipSelectionController.ts (97%) rename {src/client => packages/client/src}/hud/FrameProfiler.ts (100%) rename {src/client => packages/client/src}/hud/GameRenderer.ts (98%) rename {src/client => packages/client/src}/hud/PlayerIcons.ts (98%) rename {src/client => packages/client/src}/hud/SpriteLoader.ts (97%) rename {src/client => packages/client/src}/hud/layers/ActionableEvents.ts (97%) rename {src/client => packages/client/src}/hud/layers/AlertFrame.ts (97%) rename {src/client => packages/client/src}/hud/layers/AttacksDisplay.ts (98%) rename {src/client => packages/client/src}/hud/layers/BuildMenu.ts (97%) rename {src/client => packages/client/src}/hud/layers/ChatDisplay.ts (94%) rename {src/client => packages/client/src}/hud/layers/ChatIntegration.ts (96%) rename {src/client => packages/client/src}/hud/layers/ChatModal.ts (98%) rename {src/client => packages/client/src}/hud/layers/ControlPanel.ts (97%) rename {src/client => packages/client/src}/hud/layers/EmojiTable.ts (92%) rename {src/client => packages/client/src}/hud/layers/EventsDisplay.ts (98%) rename {src/client => packages/client/src}/hud/layers/GameLeftSidebar.ts (96%) rename {src/client => packages/client/src}/hud/layers/GameRightSidebar.ts (97%) rename {src/client => packages/client/src}/hud/layers/GraphicsSettingsModal.ts (98%) rename {src/client => packages/client/src}/hud/layers/HeadsUpMessage.ts (97%) rename {src/client => packages/client/src}/hud/layers/ImmunityTimer.ts (94%) rename {src/client => packages/client/src}/hud/layers/InGamePromo.ts (98%) rename {src/client => packages/client/src}/hud/layers/Leaderboard.ts (97%) rename {src/client => packages/client/src}/hud/layers/MainRadialMenu.ts (94%) rename {src/client => packages/client/src}/hud/layers/MultiTabModal.ts (96%) rename {src/client => packages/client/src}/hud/layers/PerformanceOverlay.ts (99%) rename {src/client => packages/client/src}/hud/layers/PlayerActionHandler.ts (94%) rename {src/client => packages/client/src}/hud/layers/PlayerInfoOverlay.ts (98%) rename {src/client => packages/client/src}/hud/layers/PlayerModerationModal.ts (96%) rename {src/client => packages/client/src}/hud/layers/PlayerPanel.ts (99%) rename {src/client => packages/client/src}/hud/layers/RadialMenu.ts (99%) rename {src/client => packages/client/src}/hud/layers/RadialMenuElements.ts (98%) rename {src/client => packages/client/src}/hud/layers/RelationSmiley.ts (97%) rename {src/client => packages/client/src}/hud/layers/ReplayPanel.ts (96%) rename {src/client => packages/client/src}/hud/layers/SendResourceModal.ts (99%) rename {src/client => packages/client/src}/hud/layers/SettingsModal.ts (98%) rename {src/client => packages/client/src}/hud/layers/SpawnTimer.ts (95%) rename {src/client => packages/client/src}/hud/layers/TeamStats.ts (97%) rename {src/client => packages/client/src}/hud/layers/UnitDisplay.ts (97%) rename {src/client => packages/client/src}/hud/layers/WinModal.ts (97%) rename {src/client => packages/client/src}/hud/ui/TextIndicator.ts (97%) rename {src/client => packages/client/src}/hud/ui/UIElement.ts (100%) rename {src/client => packages/client/src}/render/CLAUDE.md (100%) create mode 100644 packages/client/src/render/applyStateUpdate.ts rename {src/client => packages/client/src}/render/frame/RailroadCache.ts (99%) rename {src/client => packages/client/src}/render/frame/TrailManager.ts (100%) rename {src/client => packages/client/src}/render/frame/Upload.ts (100%) rename {src/client => packages/client/src}/render/frame/derive/AllianceClusters.ts (100%) rename {src/client => packages/client/src}/render/frame/derive/AttackRings.ts (100%) rename {src/client => packages/client/src}/render/frame/derive/NukeTelegraphs.ts (100%) rename {src/client => packages/client/src}/render/frame/derive/PlayerStatus.ts (100%) rename {src/client => packages/client/src}/render/frame/derive/RelationMatrix.ts (100%) rename {src/client => packages/client/src}/render/frame/index.ts (100%) rename {src/client => packages/client/src}/render/gl/Camera.ts (100%) rename {src/client => packages/client/src}/render/gl/DynamicBuffer.ts (100%) rename {src/client => packages/client/src}/render/gl/Events.ts (100%) rename {src/client => packages/client/src}/render/gl/GameView.ts (99%) rename {src/client => packages/client/src}/render/gl/RenderOverrides.ts (97%) rename {src/client => packages/client/src}/render/gl/RenderSettings.ts (100%) rename {src/client => packages/client/src}/render/gl/Renderer.ts (99%) rename {src/client => packages/client/src}/render/gl/SettingsUtils.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/ConfigProp.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/Folder.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/Layout.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/Tree.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/Wiring.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/index.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/props/Color.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/props/Select.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/props/Slider.ts (100%) rename {src/client => packages/client/src}/render/gl/debug/props/Toggle.ts (100%) rename {src/client => packages/client/src}/render/gl/index.ts (87%) rename {src/client => packages/client/src}/render/gl/passes/BarPass.ts (98%) rename {src/client => packages/client/src}/render/gl/passes/BorderComputePass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/BorderScatterPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/BorderStampPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/CoordinateGridPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/CrosshairPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/DefenseCoveragePass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/FalloutBloomPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/FalloutLightPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/LightmapPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/MoveIndicatorPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/NightCompositePass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/NukeTelegraphPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/NukeTrajectoryPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/PointLightPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/RadialMenuPass.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/RailroadPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/RangeCirclePass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/SamRadiusPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/SelectionBoxPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/SkinAtlasArray.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/SpawnOverlayPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/StructureLevelPass.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/StructurePass.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/TerrainPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/TerritoryPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/TileScatterPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/TrailPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/UnitPass.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/WorldTextPass.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/fx-pass/FxAttackRingPass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/fx-pass/FxShockwavePass.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/fx-pass/FxSpritePass.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/fx-pass/index.ts (98%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/AtlasData.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/DataTextures.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/DebugProgram.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/FlagAtlasArray.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/IconProgram.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/StatusIconProgram.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/TextLayout.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/TextProgram.ts (99%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/Types.ts (100%) rename {src/client => packages/client/src}/render/gl/passes/name-pass/index.ts (100%) rename {src/client => packages/client/src}/render/gl/render-settings.json (100%) rename {src/client => packages/client/src}/render/gl/shaders/bar/bar.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/bar/bar.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/border-compute/border-compute.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/border-compute/border-scatter.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/crosshair/crosshair.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/crosshair/crosshair.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/border-stamp.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/border-stamp.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/composite.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/fallout-composite.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/fallout-composite.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/fallout-light.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/light.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/day-night/light.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/defense-coverage/defense-coverage.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/defense-coverage/defense-coverage.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fallout-bloom/composite.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fallout-bloom/composite.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fallout-bloom/extract.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fallout-bloom/heat-decay.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fx/attack-ring.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fx/attack-ring.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fx/shockwave.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fx/shockwave.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fx/sprite.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/fx/sprite.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/glsl.d.ts (100%) rename {src/client => packages/client/src}/render/gl/shaders/grid/grid.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/map-overlay/overlay.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/map-overlay/territory.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/map-overlay/tile-scatter.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/map-overlay/tile-scatter.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/map-overlay/trail.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/move-indicator/move-indicator.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/move-indicator/move-indicator.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/debug-box.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/debug-box.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/icon.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/icon.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/name.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/name.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/status-icon.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/name/status-icon.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/nuke-telegraph/nuke-telegraph.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/nuke-telegraph/nuke-telegraph.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/nuke-trajectory/nuke-trajectory-marker.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/nuke-trajectory/nuke-trajectory-marker.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/nuke-trajectory/nuke-trajectory.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/nuke-trajectory/nuke-trajectory.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/radial-menu/arcs.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/radial-menu/arcs.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/radial-menu/icon.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/radial-menu/icon.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/railroad/railroad.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/range-circle/range-circle.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/range-circle/range-circle.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/sam-radius/sam-radius.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/sam-radius/sam-radius.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/selection-box/selection-box.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/selection-box/selection-box.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/shared/blur.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/shared/fullscreen-no-uv.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/shared/fullscreen.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/spawn-overlay/spawn-overlay.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/structure-level/structure-level.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/structure-level/structure-level.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/structure/structure.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/structure/structure.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/terrain/terrain.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/terrain/terrain.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/unit/unit.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/unit/unit.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/world-text/world-text.frag.glsl (100%) rename {src/client => packages/client/src}/render/gl/shaders/world-text/world-text.vert.glsl (100%) rename {src/client => packages/client/src}/render/gl/utils/Affiliation.ts (100%) rename {src/client => packages/client/src}/render/gl/utils/ColorUtils.ts (100%) rename {src/client => packages/client/src}/render/gl/utils/GlUtils.ts (100%) rename {src/client => packages/client/src}/render/gl/utils/GpuResources.ts (100%) rename {src/client => packages/client/src}/render/gl/utils/HeatManager.ts (100%) rename {src/client => packages/client/src}/render/gl/utils/NukeTrajectory.ts (100%) rename {src/client => packages/client/src}/render/gl/utils/TileCodec.ts (100%) rename {src/client => packages/client/src}/render/gl/vite-env.d.ts (100%) rename {src/client => packages/client/src}/render/types/FrameData.ts (100%) rename {src/client => packages/client/src}/render/types/FrameEvents.ts (100%) rename {src/client => packages/client/src}/render/types/FrameSource.ts (100%) rename {src/client => packages/client/src}/render/types/Game.ts (100%) rename {src/client => packages/client/src}/render/types/GameUpdates.ts (100%) rename {src/client => packages/client/src}/render/types/Renderer.ts (99%) rename {src/client => packages/client/src}/render/types/Replay.ts (100%) rename {src/client => packages/client/src}/render/types/UnitType.ts (100%) rename {src/client => packages/client/src}/render/types/index.ts (100%) rename {src/client => packages/client/src}/sound/SoundManager.ts (97%) rename {src/client => packages/client/src}/sound/Sounds.ts (94%) rename {src/client => packages/client/src}/styles.css (100%) rename {src/client => packages/client/src}/styles/components/controls.css (100%) rename {src/client => packages/client/src}/styles/components/setting.css (100%) rename {src/client => packages/client/src}/styles/core/flag-animation.css (100%) rename {src/client => packages/client/src}/styles/core/typography.css (100%) rename {src/client => packages/client/src}/styles/core/variables.css (100%) rename {src/client => packages/client/src}/styles/layout/container.css (100%) rename {src/client => packages/client/src}/styles/layout/header.css (100%) rename {src/client => packages/client/src}/styles/modal/chat.css (100%) rename {src/client => packages/client/src}/theme/ColorAllocator.ts (96%) rename {src/client => packages/client/src}/theme/Colors.ts (100%) rename {src/client => packages/client/src}/theme/PastelTheme.ts (97%) rename {src/client => packages/client/src}/theme/PastelThemeDark.ts (95%) rename {src/client => packages/client/src}/theme/Theme.ts (84%) rename {src/client => packages/client/src}/theme/ThemeProvider.ts (94%) rename {src/client => packages/client/src}/utilities/Diagnostic.ts (100%) rename {src/client => packages/client/src}/utilities/DisableSafariPinchZoom.ts (100%) rename {src/client => packages/client/src}/utilities/GameConfigHelpers.ts (96%) rename {src/client => packages/client/src}/utilities/ReplaySpeedMultiplier.ts (100%) rename {src/client => packages/client/src}/view/GameView.ts (98%) rename {src/client => packages/client/src}/view/PlayerView.ts (97%) rename {src/client => packages/client/src}/view/UnitView.ts (98%) create mode 100644 packages/client/src/view/index.ts rename {src/client => packages/client/src}/vite-env.d.ts (100%) create mode 100644 packages/client/tsconfig.json create mode 100644 packages/core-public/package.json rename {src/core => packages/core-public/src}/ApiSchemas.ts (99%) rename {src/core => packages/core-public/src}/Base64.ts (100%) rename {src/core => packages/core-public/src}/ClanApiSchemas.ts (100%) rename {src/core => packages/core-public/src}/CosmeticSchemas.ts (100%) create mode 100644 packages/core-public/src/Emojis.ts create mode 100644 packages/core-public/src/EventBus.ts rename {src/client/render/gl => packages/core-public/src}/GraphicsOverrides.ts (100%) rename {src/core => packages/core-public/src}/PatternDecoder.ts (100%) rename {src/core => packages/core-public/src}/Schemas.ts (99%) rename {src/core => packages/core-public/src}/StatsSchemas.ts (98%) rename {src/core => packages/core-public/src}/WorkerSchemas.ts (100%) create mode 100644 packages/core-public/src/game/GameTypes.ts create mode 100644 packages/core-public/tsconfig.json create mode 100644 packages/engine/package.json rename {src/core => packages/engine/src}/AssetUrls.ts (100%) rename {src/core => packages/engine/src}/EventBus.ts (77%) rename {src/core => packages/engine/src}/GameRunner.ts (98%) rename {src/core => packages/engine/src}/PseudoRandom.ts (100%) rename {src/core => packages/engine/src}/Util.ts (92%) rename {src/core => packages/engine/src}/configuration/Config.ts (97%) rename {src/core => packages/engine/src}/execution/AttackExecution.ts (99%) rename {src/core => packages/engine/src}/execution/BoatRetreatExecution.ts (100%) rename {src/core => packages/engine/src}/execution/CityExecution.ts (100%) rename {src/core => packages/engine/src}/execution/ConstructionExecution.ts (100%) rename {src/core => packages/engine/src}/execution/DefensePostExecution.ts (100%) rename {src/core => packages/engine/src}/execution/DeleteUnitExecution.ts (100%) rename {src/core => packages/engine/src}/execution/DonateGoldExecution.ts (100%) rename {src/core => packages/engine/src}/execution/DonateTroopExecution.ts (100%) rename {src/core => packages/engine/src}/execution/EmbargoAllExecution.ts (100%) rename {src/core => packages/engine/src}/execution/EmbargoExecution.ts (100%) rename {src/core => packages/engine/src}/execution/EmojiExecution.ts (100%) rename {src/core => packages/engine/src}/execution/ExecutionManager.ts (98%) rename {src/core => packages/engine/src}/execution/FactoryExecution.ts (100%) rename {src/core => packages/engine/src}/execution/MIRVExecution.ts (100%) rename {src/core => packages/engine/src}/execution/MarkDisconnectedExecution.ts (100%) rename {src/core => packages/engine/src}/execution/MissileSiloExecution.ts (100%) rename {src/core => packages/engine/src}/execution/MoveWarshipExecution.ts (100%) rename {src/core => packages/engine/src}/execution/NationExecution.ts (99%) rename {src/core => packages/engine/src}/execution/NoOpExecution.ts (100%) rename {src/core => packages/engine/src}/execution/NukeExecution.ts (99%) rename {src/core => packages/engine/src}/execution/PauseExecution.ts (100%) rename {src/core => packages/engine/src}/execution/PlayerExecution.ts (100%) rename {src/core => packages/engine/src}/execution/PortExecution.ts (100%) rename {src/core => packages/engine/src}/execution/QuickChatExecution.ts (100%) rename {src/core => packages/engine/src}/execution/RecomputeRailClusterExecution.ts (100%) rename {src/core => packages/engine/src}/execution/RetreatExecution.ts (100%) rename {src/core => packages/engine/src}/execution/SAMLauncherExecution.ts (100%) rename {src/core => packages/engine/src}/execution/SAMMissileExecution.ts (97%) rename {src/core => packages/engine/src}/execution/ShellExecution.ts (100%) rename {src/core => packages/engine/src}/execution/SpawnExecution.ts (98%) rename {src/core => packages/engine/src}/execution/SpawnTimerExecution.ts (100%) rename {src/core => packages/engine/src}/execution/TargetPlayerExecution.ts (100%) rename {src/core => packages/engine/src}/execution/TradeShipExecution.ts (99%) rename {src/core => packages/engine/src}/execution/TrainExecution.ts (100%) rename {src/core => packages/engine/src}/execution/TrainStationExecution.ts (100%) rename {src/core => packages/engine/src}/execution/TransportShipExecution.ts (99%) rename {src/core => packages/engine/src}/execution/TribeExecution.ts (100%) rename {src/core => packages/engine/src}/execution/TribeSpawner.ts (96%) rename {src/core => packages/engine/src}/execution/UpgradeStructureExecution.ts (100%) rename {src/core => packages/engine/src}/execution/Util.ts (99%) rename {src/core => packages/engine/src}/execution/WarshipExecution.ts (100%) rename {src/core => packages/engine/src}/execution/WinCheckExecution.ts (100%) rename {src/core => packages/engine/src}/execution/alliance/AllianceExtensionExecution.ts (100%) rename {src/core => packages/engine/src}/execution/alliance/AllianceRejectExecution.ts (100%) rename {src/core => packages/engine/src}/execution/alliance/AllianceRequestExecution.ts (100%) rename {src/core => packages/engine/src}/execution/alliance/BreakAllianceExecution.ts (100%) rename {src/core => packages/engine/src}/execution/nation/NationAllianceBehavior.ts (100%) rename {src/core => packages/engine/src}/execution/nation/NationEmojiBehavior.ts (100%) rename {src/core => packages/engine/src}/execution/nation/NationMIRVBehavior.ts (100%) rename {src/core => packages/engine/src}/execution/nation/NationNukeBehavior.ts (100%) rename {src/core => packages/engine/src}/execution/nation/NationStructureBehavior.ts (100%) rename {src/core => packages/engine/src}/execution/nation/NationUtils.ts (100%) rename {src/core => packages/engine/src}/execution/nation/NationWarshipBehavior.ts (100%) rename {src/core => packages/engine/src}/execution/nation/SharedWaterCache.ts (100%) rename {src/core => packages/engine/src}/execution/utils/AiAttackBehavior.ts (100%) rename {src/core => packages/engine/src}/execution/utils/FlatBinaryHeap.ts (100%) rename {src/core => packages/engine/src}/execution/utils/PlayerSpawner.ts (91%) rename {src/core => packages/engine/src}/execution/utils/TribeNames.ts (100%) rename {src/core => packages/engine/src}/game/AllianceImpl.ts (100%) rename {src/core => packages/engine/src}/game/AllianceRequestImpl.ts (100%) rename {src/core => packages/engine/src}/game/AttackImpl.ts (100%) rename {src/core => packages/engine/src}/game/BinaryLoaderGameMapLoader.ts (100%) rename {src/core => packages/engine/src}/game/FetchGameMapLoader.ts (100%) rename {src/core => packages/engine/src}/game/Game.ts (86%) rename {src/core => packages/engine/src}/game/GameImpl.ts (99%) rename {src/core => packages/engine/src}/game/GameMap.ts (100%) rename {src/core => packages/engine/src}/game/GameMapLoader.ts (100%) rename {src/core => packages/engine/src}/game/GameUpdateUtils.ts (72%) rename {src/core => packages/engine/src}/game/GameUpdates.ts (99%) rename {src/core => packages/engine/src}/game/MotionPlans.ts (100%) rename {src/client/hud => packages/engine/src/game}/NameBoxCalculator.ts (97%) rename {src/core => packages/engine/src}/game/NationCreation.ts (99%) rename {src/core => packages/engine/src}/game/PlayerImpl.ts (99%) rename {src/core => packages/engine/src}/game/RailNetwork.ts (100%) rename {src/core => packages/engine/src}/game/RailNetworkImpl.ts (100%) rename {src/core => packages/engine/src}/game/Railroad.ts (100%) rename {src/core => packages/engine/src}/game/RailroadSpatialGrid.ts (100%) create mode 100644 packages/engine/src/game/ReadViews.ts rename {src/core => packages/engine/src}/game/Stats.ts (95%) rename {src/core => packages/engine/src}/game/StatsImpl.ts (98%) rename {src/core => packages/engine/src}/game/TeamAssignment.ts (98%) rename {src/core => packages/engine/src}/game/TerraNulliusImpl.ts (86%) rename {src/core => packages/engine/src}/game/TerrainMapLoader.ts (100%) rename {src/core => packages/engine/src}/game/TerrainSearchMap.ts (100%) rename {src/core => packages/engine/src}/game/TrainStation.ts (100%) rename {src/core => packages/engine/src}/game/TransportShipUtils.ts (100%) rename {src/core => packages/engine/src}/game/UnitGrid.ts (92%) rename {src/core => packages/engine/src}/game/UnitImpl.ts (100%) rename {src/core => packages/engine/src}/game/UserSettings.ts (98%) rename {src/core => packages/engine/src}/game/WaterManager.ts (100%) rename {src/core => packages/engine/src}/pathfinding/PathFinder.Air.ts (100%) rename {src/core => packages/engine/src}/pathfinding/PathFinder.Parabola.ts (100%) rename {src/core => packages/engine/src}/pathfinding/PathFinder.Station.ts (100%) rename {src/core => packages/engine/src}/pathfinding/PathFinder.ts (100%) rename {src/core => packages/engine/src}/pathfinding/PathFinderBuilder.ts (100%) rename {src/core => packages/engine/src}/pathfinding/PathFinderStepper.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/AStar.AbstractGraph.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/AStar.Rail.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/AStar.Water.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/AStar.WaterBounded.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/AStar.WaterHierarchical.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/AStar.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/AbstractGraph.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/BFS.Grid.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/BFS.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/ConnectedComponents.ts (100%) rename {src/core => packages/engine/src}/pathfinding/algorithms/PriorityQueue.ts (100%) rename {src/core => packages/engine/src}/pathfinding/spatial/SpatialQuery.ts (100%) rename {src/core => packages/engine/src}/pathfinding/transformers/ComponentCheckTransformer.ts (100%) rename {src/core => packages/engine/src}/pathfinding/transformers/MiniMapTransformer.ts (100%) rename {src/core => packages/engine/src}/pathfinding/transformers/ShoreCoercingTransformer.ts (100%) rename {src/core => packages/engine/src}/pathfinding/transformers/SmoothingWaterTransformer.ts (100%) rename {src/core => packages/engine/src}/pathfinding/types.ts (100%) rename {src/core => packages/engine/src}/utilities/DebugSpan.ts (100%) rename {src/core => packages/engine/src}/utilities/Line.ts (100%) create mode 100644 packages/engine/src/validations/username.ts rename {src/core => packages/engine/src}/worker/Worker.worker.ts (100%) rename {src/core => packages/engine/src}/worker/WorkerClient.ts (99%) rename {src/core => packages/engine/src}/worker/WorkerMessages.ts (98%) create mode 100644 packages/engine/tsconfig.json create mode 100644 packages/server/package.json rename {src/server => packages/server/src}/Archive.ts (96%) rename {src/server => packages/server/src}/Client.ts (80%) rename {src/server => packages/server/src}/ClientMsgRateLimiter.ts (97%) rename {src/server => packages/server/src}/GameManager.ts (97%) rename {src/server => packages/server/src}/GamePreviewBuilder.ts (97%) rename {src/server => packages/server/src}/GamePreviewRoute.ts (98%) rename {src/server => packages/server/src}/GameServer.ts (99%) rename {src/server => packages/server/src}/IPCBridgeSchema.ts (98%) rename {src/server => packages/server/src}/Logger.ts (100%) rename {src/server => packages/server/src}/MapLandTiles.ts (94%) rename {src/server => packages/server/src}/MapPlaylist.ts (99%) rename {src/server => packages/server/src}/Master.ts (98%) rename {src/server => packages/server/src}/MasterLobbyService.ts (97%) rename {src/server => packages/server/src}/NoStoreHeaders.ts (100%) rename {src/server => packages/server/src}/OtelResource.ts (100%) rename {src/server => packages/server/src}/PollingLoop.ts (100%) rename {src/server => packages/server/src}/Privilege.ts (98%) rename {src/server => packages/server/src}/PrivilegeRefresher.ts (97%) rename {src/server => packages/server/src}/PublicAssetManifest.ts (98%) rename {src/server => packages/server/src}/README.md (100%) rename {src/server => packages/server/src}/RenderHtml.ts (98%) rename {src/server => packages/server/src}/RuntimeAssetManifest.ts (94%) rename {src/server => packages/server/src}/Server.ts (100%) rename {src/server => packages/server/src}/ServerEnv.ts (96%) rename {src/server => packages/server/src}/StaticAssetCache.ts (100%) rename {src/server => packages/server/src}/Turnstile.ts (100%) rename {src/server => packages/server/src}/Worker.ts (98%) rename {src/server => packages/server/src}/WorkerLobbyService.ts (99%) rename {src/server => packages/server/src}/WorkerMetrics.ts (100%) rename {src/server => packages/server/src}/jwt.ts (94%) create mode 100644 packages/server/tsconfig.json create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/format.ts create mode 100644 packages/shared/tsconfig.json delete mode 100644 src/client/TerrainMapFileLoader.ts delete mode 100644 src/core/game/GameView.ts delete mode 100644 src/core/validations/username.ts create mode 100644 tsconfig.base.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 39394521d..2e2b1e7ce 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,7 +19,7 @@ "--loader", "ts-node/esm", "--experimental-specifier-resolution=node", - "${workspaceFolder}/src/server/Server.ts" + "${workspaceFolder}/packages/server/src/Server.ts" ], "env": { "GAME_ENV": "dev" diff --git a/Dockerfile b/Dockerfile index e5e01590e..4c6b312ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,19 +5,22 @@ WORKDIR /usr/src/app # Build stage - install ALL dependencies and build FROM base AS build ENV HUSKY=0 -# Copy package files first for better caching +# Copy package files first for better caching. The per-package package.json +# files are required for the workspace install, so packages/ must be present +# before `npm ci`. COPY package*.json ./ +COPY packages ./packages RUN --mount=type=cache,target=/root/.npm \ npm ci # Copy only what's needed for build COPY tsconfig.json ./ +COPY tsconfig.base.json ./ COPY vite.config.ts ./ COPY eslint.config.js ./ COPY index.html ./ COPY resources ./resources COPY proprietary ./proprietary -COPY src ./src ARG GIT_COMMIT=unknown ENV GIT_COMMIT="$GIT_COMMIT" @@ -28,6 +31,7 @@ FROM base AS prod-deps ENV HUSKY=0 ENV NPM_CONFIG_IGNORE_SCRIPTS=1 COPY package*.json ./ +COPY packages ./packages RUN --mount=type=cache,target=/root/.npm \ npm ci --omit=dev @@ -66,7 +70,8 @@ COPY resources ./resources # Remove maps because they are not used by the server. RUN rm -rf ./resources/maps COPY tsconfig.json ./ -COPY src ./src +COPY tsconfig.base.json ./ +COPY packages ./packages ARG GIT_COMMIT=unknown diff --git a/eslint.config.js b/eslint.config.js index 3168893d5..784b3acf4 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -13,7 +13,12 @@ const gitignorePath = path.resolve(__dirname, ".gitignore"); /** @type {import('eslint').Linter.Config[]} */ export default [ includeIgnoreFile(gitignorePath), - { ignores: ["src/server/gatekeeper/**", "tests/pathfinding/playground/**"] }, + { + ignores: [ + "packages/server/src/gatekeeper/**", + "tests/pathfinding/playground/**", + ], + }, { files: ["**/*.{js,mjs,cjs,ts}"] }, { languageOptions: { globals: { ...globals.browser, ...globals.node } } }, pluginJs.configs.recommended, diff --git a/index.html b/index.html index 4af07ad2d..c248ddfcf 100644 --- a/index.html +++ b/index.html @@ -440,7 +440,7 @@ src="https://static.cloudflareinsights.com/beacon.min.js" data-cf-beacon='{"token": "03d93e6fefb349c28ee69b408fa25a13"}' > - +