mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-10 14:44:37 +00:00
a7f992e9b0
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) <noreply@anthropic.com>
Pathfinding Tests
This directory contains benchmarking tools, scenario generators, and an interactive playground for testing and optimizing pathfinding algorithms in OpenFrontIO.
TLDR
npx tsx tests/pathfinding/benchmark/run.ts --synthetic --all
npx tsx tests/pathfinding/playground/server.ts
Directory Structure
tests/pathfinding/
├── benchmark.ts # Benchmarking tool
├── scenarios/ # Scenarios for benchmarks
│ ├── default.ts # Hand-picked scenario
│ └── synthetic/ # Auto-generated synthetic scenarios
└── playground/ # Interactive web-based visualization
Available algorithms
- NavSat - future implementation - NavigationSatellite (HPA*)
- PF.Mini - current implementation - PathFinder.Mini (A*)
Benchmarking
Running a Single Scenario
# Run default scenario with default adapter (NavSat)
npx tsx tests/pathfinding/benchmark/run.ts
# Run specific scenario
npx tsx tests/pathfinding/benchmark/run.ts default
# Run with specific adapter
npx tsx tests/pathfinding/benchmark/run.ts default legacy
Running Synthetic Scenarios
Synthetic scenarios are auto-generated from maps with random port selections and routes.
# Run single synthetic scenario
npx tsx tests/pathfinding/benchmark/run.ts --synthetic iceland
# Run single synthetic scenario with specific adapter
npx tsx tests/pathfinding/benchmark/run.ts --synthetic iceland legacy
# Run ALL synthetic scenarios (comprehensive benchmark)
npx tsx tests/pathfinding/benchmark/run.ts --synthetic --all
# Run all with specific adapter
npx tsx tests/pathfinding/benchmark/run.ts --synthetic --all legacy
Benchmark Metrics
The benchmark measures three key metrics:
- Initialization Time - How long it takes to preprocess the map
- Path Distance - Total distance across all routes (quality metric)
- Pathfinding Time - How long it takes to compute paths (performance metric)
Example Output
================================================================================
METRIC 1: INITIALIZATION TIME
================================================================================
Initialization time: 45.32ms
================================================================================
METRIC 2: PATH DISTANCE
================================================================================
Route Path Length
Miami → Boston 346 tiles
Miami → Houston 212 tiles
...
Total distance: 52432 tiles
Routes completed: 22 / 22
================================================================================
METRIC 3: PATHFINDING TIME
================================================================================
Route Time
Miami → Boston 2.45ms
Miami → Houston 1.82ms
...
Total time: 156.34ms
Average time: 7.11ms
Routes benchmarked: 22 / 22
================================================================================
SUMMARY
================================================================================
Adapter: default
Scenario: default
Scores:
Initialization: 45.32ms
Pathfinding: 156.34ms
Distance: 52432 tiles
Generating Scenarios
Generate Synthetic Scenarios
Synthetic scenarios are generated by:
- Finding all water shoreline tiles on a map
- Randomly selecting 200 ports
- Creating 1000 routes connecting nearby ports
# Generate scenario for a single map
npx tsx tests/pathfinding/benchmark/generate.ts iceland
# Generate scenarios for all maps
npx tsx tests/pathfinding/benchmark/generate.ts --all
# Force overwrite existing scenarios
npx tsx tests/pathfinding/benchmark/generate.ts iceland --force
npx tsx tests/pathfinding/benchmark/generate.ts --all --force
Interactive Playground
The playground provides a web-based UI for visualizing pathfinding results, comparing algorithms, and debugging.
Starting the Playground
# Start with path caching enabled (default)
npx tsx tests/pathfinding/playground/server.ts
# Start without path caching (to measure uncached performance)
npx tsx tests/pathfinding/playground/server.ts --no-cache
Then open http://localhost:5555 in your browser.