OneAbove.Arena.GameHost.Dev
4.3.0
dotnet add package OneAbove.Arena.GameHost.Dev --version 4.3.0
NuGet\Install-Package OneAbove.Arena.GameHost.Dev -Version 4.3.0
<PackageReference Include="OneAbove.Arena.GameHost.Dev" Version="4.3.0" />
<PackageVersion Include="OneAbove.Arena.GameHost.Dev" Version="4.3.0" />
<PackageReference Include="OneAbove.Arena.GameHost.Dev" />
paket add OneAbove.Arena.GameHost.Dev --version 4.3.0
#r "nuget: OneAbove.Arena.GameHost.Dev, 4.3.0"
#:package OneAbove.Arena.GameHost.Dev@4.3.0
#addin nuget:?package=OneAbove.Arena.GameHost.Dev&version=4.3.0
#tool nuget:?package=OneAbove.Arena.GameHost.Dev&version=4.3.0
OneAbove.Arena.GameHost.Dev
The test table: your game playable with dotnet run — without a database,
without a sign-in, without the arena.
Use
A console project, one line:
using OneAbove.Arena.GameHost.Dev;
await ArenaTestTable.RunAsync(new MyGame());
dotnet run
→ http://localhost:5080
There all seats lie side by side, each with its own view, all playable. The
renderer is served from ./renderer.
await ArenaTestTable.RunAsync(new MyGame(), new ArenaTestTableOptions
{
OfferingKey = "online",
SeatCount = 4,
RngSeed = 4711,
RendererPath = "renderer",
Port = 5080,
UndoEnabled = false, // default: on whenever the offering offers undo
});
Without OfferingKey the test table plays the first offering your descriptor
declares, with its defaults filled in — exactly as the lobby would offer it.
Why this is no toy
The test table calls your rule module in exactly the same order as the real platform:
ApplyMove · GetSeatsToAct · GetOutcome · GetLegalMoves(n) · GetView(n) … · GetView(spectator)
That is no declaration of intent — a test in the platform puts a recording engine under both routes and compares what actually arrived. „Runs at the test table, breaks in the arena" is the class of fault this package is built against.
Taken just as seriously:
- The iframe is sandboxed, without
allow-same-origin— as in the arena. With that your renderer has an opaque origin here too. That is the whole bridge's most frequent stumbling block, and here you stumble cheaply. - A seat that is not to act gets no legal moves. At the test table too there is no shared state for everyone.
- A rejected move comes back as a 422 with a reason, not as an error.
The „undo" button
At every seat, when the table plays with undo (contract 4.1). It sits
outside the iframe, as in the arena's action bar: a renderer never sends an
undo itself. Enabled when canUndo is true — the switch, the seat to act, the
match running — and what comes back from your IUndoableGame.Undo is shown
as the reason when it refuses. Whether your game cuts its turns differently
with undo on (a tentative move, a confirmation) is yours to decide; the test
table passes MatchSetup.UndoEnabled and asks no further.
The „disconnect" button
At every seat. Afterwards the state comes completely anew — nothing that happened in the meantime is resent.
That is exactly how the arena behaves: reconnecting is the normal case there, and there is no event buffer. A renderer building on a gapless log stands out here instead of at a player mid-move.
What the test table is not
No platform. No Postgres, no sign-in, no lobby, no clocks, no deadlines. A match lives as long as the process lives. Whoever wants to check persistence, restoring from the move list or simultaneous connections needs the arena.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- OneAbove.Arena.GameContract (>= 4.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.3.0 | 0 | 9/17/2026 |
| 4.3.0-rc.2 | 0 | 9/17/2026 |
| 4.3.0-rc.1 | 0 | 9/17/2026 |
| 4.2.0 | 0 | 9/17/2026 |
| 4.2.0-rc.1 | 0 | 9/17/2026 |
| 4.1.1 | 0 | 9/17/2026 |
| 4.1.1-rc.1 | 0 | 9/17/2026 |
| 4.1.0 | 0 | 9/17/2026 |
| 4.1.0-rc.3 | 0 | 9/17/2026 |
| 4.1.0-rc.2 | 0 | 9/17/2026 |
| 4.1.0-rc.1 | 0 | 9/17/2026 |
| 4.0.0 | 44 | 9/16/2026 |
| 4.0.0-rc.5 | 65 | 9/16/2026 |
| 4.0.0-rc.4 | 63 | 9/15/2026 |
| 4.0.0-rc.3 | 32 | 9/15/2026 |
| 4.0.0-rc.2 | 35 | 9/15/2026 |
| 4.0.0-rc.1 | 42 | 9/15/2026 |
| 3.0.1 | 76 | 9/14/2026 |
| 3.0.0 | 101 | 9/14/2026 |
| 3.0.0-rc.1 | 44 | 9/14/2026 |