SOMETHING ONLINE ARCADE — UNITY C# AND JAVA EXPORT KIT
Candidate integration. Do not treat an upload check as engine/device certification.
Read verification.json for actual compile/runtime results and outstanding checks.

1. Choose your source engine
Unity 6: copy unity/Assets into your own Unity project. Add ArcadeClient and either
ArcadeCounter (solo) or ArcadeBoard (online) to one GameObject in your first scene.
Add the scene to Build Settings. Something Online > Export Web build creates an
uncompressed, single-threaded Web build, with browser data caching disabled. Existing
export settings are restored afterward. Custom games subscribe to Message before
Connect(), wait for ready, and implement pause/resume including input and audio.
The examples contain no audio. Install Unity Web Build Support first. Keep the
built-in JSON Serialize module enabled; the examples also need the IMGUI module.
For these IMGUI examples select Active Input Handling: Input Manager (Old).
The sample counter uses SPACE to collect and S to save; the board accepts keys 1–9.
Both examples also have responsive pointer controls. Custom games may use their own
input system; test their exported controls before submitting.

Java: install JDK 17+ and Maven 3.9+. In java/ run `mvn package` for the solo example;
for the online board use `mvn -Darcade.mainClass=com.somethingonline.BoardDemo package`.
TeaVM compiles compatible Java to browser JavaScript in java/target/web. This is not
a JVM in the browser. Swing, native JNI, desktop OpenGL and arbitrary Java libraries
do not automatically work. Port rendering and unsupported APIs to browser APIs.
Pin and review dependencies; do not include API keys or personal information.

2. Prepare the cabinet
Use arcade-solo.json or arcade-online.json. Change id, title, description, version,
classification and controls to describe YOUR game. Provide your own licensed cover.
Install Node 24+, then from this kit's root:

node prepare-export.mjs unity-web "path/to/WebBuild" arcade-solo.json "path/to/cover.png" "path/to/NEW-cabinet"
node prepare-export.mjs java-teavm "java/target/web" arcade-solo.json "path/to/cover.png" "path/to/NEW-cabinet"

Use arcade-online.json with either board example. Output must be a NEW folder
outside the export folder. The helper leaves source files intact and creates an
index wrapper, bridge, manifest, assets and upload.zip. It replaces the exported
host page; dependencies must be local. No .jar, .dll, .exe, .cs, .java, .br or .gz
belongs in the game upload. The downloadable SOURCE kit itself is not an upload.
The workshop checks the resulting ZIP again and requires review of each release.

3. Connect saves, scores and multiplayer
Unity: client.Save(new Progress{...}, score, saveVersion); client.Move(cell);
client.Stats(); client.SetPlaying(true/false). Java: Arcade.save(progressJson,score,
saveVersion), Arcade.move(cell), Arcade.stats(), Arcade.setPlaying(boolean).
Requests return an integer ID; events are JSON {type,id,payload}. Match responses by
ID. Listen for ready, pause, resume, saved, table, moved, stats and error.
Unity parses JSON using your own [Serializable] payload types / JsonUtility.
The solo examples demonstrate restoration and saving; the board examples render
table snapshots. Save only checkpoint changes; handle errors and let players retry.

ready.payload contains progress, bestScore and saveVersion for solo games. Saves
accept JSON objects up to 32 KB and integer scores 0..1e12. Revisions/account checks
remain in the host. Published account saves persist; private/beta solo saves are
temporary. A newer format must read/migrate old saves. Do not erase unknown formats.
stats returns the current personal best for solo, or last server winner and ranked
status for online. Full W/L/T and opponent history appear in the platform window;
this bridge does not expose player IDs or provide a general leaderboards API.
Self-reported solo scores are not verified achievements and cannot mint money.

Online pilot: grid-lines-v1 ONLY, two players, 3..9 rows/columns, target 3..6 fitting
both dimensions, optional gravity. Lobby, join code, friends, clocks, reconnect,
return-later turns, rematch and catalog W/L/T are owned by the host/server.
table.payload includes phase, revision, seat, turn, board (0/1/2), legal cells,
rules, winner and ranked. For gravity send a column; otherwise row-major cell index.
Wait for moved/error and updated table. The SDK attaches the latest revision;
the server rejects stale/illegal moves. Never predict final results or save online
scores yourself. Beta/private matches are unranked. Other multiplayer rules require
a separately reviewed server template; no uploaded server code is executed.

4. Test and review
Choose the complete upload.zip in the creator workshop; its arcade.json fills the details. Complete rights/AI
disclosures. Test load, controls, pause/audio, save/reopen, old save formats and all
declared devices. For online use two authorized accounts; test reconnect, out-of-turn
moves, forfeit and rematch. An administrator tests the immutable build before beta.
JavaScript/Wasm still runs under the same sandbox: no account cookies, external
servers, trackers, workers, storage-based saves or wallet connections. Never weaken
that sandbox to make an export pass. If your engine requires unsafe-eval, worker
threads or cross-origin isolation, that build profile is not supported in this pilot.

Pilot limits: ZIP 20 MB; 300 files. Web/Java: 40 MB expanded / 12 MB each.
Unity: 64 MB expanded / 32 MB each. Optimize engine modules, textures and audio.
These are enforced limits, not a claim that any Unity project fits them.

5. Future commerce
commerce-contract.json is a disabled design contract. Solana is the intended network;
provider, contracts, assets and launch terms remain undecided. Games will request
catalog offers through platform UI. Wallet approval, verified settlement receipts
and item entitlements belong to the platform. No blockchain transaction, wallet
connection, smart contract, token or purchase API exists in this kit.

Official engine references
https://docs.unity3d.com/6000.0/Documentation/Manual/webgl-interactingwithbrowserscripting.html
https://docs.unity3d.com/6000.0/Documentation/Manual/webgl-building.html
https://teavm.org/docs/tooling/maven.html
https://teavm.org/docs/runtime/jso.html


TWO WAYS TO FINISH — ONE UPLOADABLE ZIP
COPY FOR MY AI: open https://somethingonline.com/preview/creator.html#creator-guide,
choose this kit's game type, then Copy for my AI. The AI asks a few plain questions,
uses the linked kit and returns ONE complete game ZIP, with arcade.json inside.
If it cannot download the kit, attach this exact kit. Never claim an unbuilt ZIP.
STEP BY STEP: use the same workshop's Step by step guide. Build/test the game,
keep all required runtime files and the completed arcade.json at the ZIP root,
then choose that one ZIP. The workshop reads the manifest; review its details and
complete rights/AI disclosures personally. A separate manifest upload is optional.

OPTIONAL CABINET SKIN — EXACTLY ONE NEW IMAGE
Classic upright pilot: cabinet/skin.png, one static opaque 1024 x 1024 PNG, <=4 MiB.
Read https://somethingonline.com/preview/creator-cabinet-kit/cabinet-template.json
and download https://somethingonline.com/preview/creator-cabinet-kit.zip first.
Follow its exact six named regions, shared side/back art and physical obstructions;
never guess UVs or generate separate panel images. Add cabinetSkin with templateId
classic-upright-v1 and texturePath cabinet/skin.png to the manifest. Keep the game's
existing one cover unchanged; for a new game make one cover.png at 960 x 640.
Thus required submission art is one cover plus one atlas, not extra variants.
Agree any gameplay-art filenames, dimensions and count before creating those.
Do not put the template GLB, guides, example skin, nested kits, extra covers,
mockup renders or unused image versions in the game ZIP. The platform supplies
the model. Skin availability is server-gated; use the standard cabinet if off.


CURRENT UPLOAD AND REVIEW WORKFLOW — OCTOBER 20, 2026

A compatible existing browser game does not need AI or a starter-kit rebuild. arcade.json is optional: when absent, the workshop suggests entry/cover files and stores your confirmed details alongside the unchanged ZIP. A manifest helps automatic form filling; it does not automatically add pause, saves or scores. Keep the existing SDK contracts.

For a new build prepared using this kit, include a completed arcade.json for convenience. For an update, choose My games → Upload new version and preserve the game ID, ownership and compatible save format. Never replace the original source or uploaded archive in place.

Scanning, structural checks, isolated testing and review still apply. Regular creators use the beta/final review process. The verified site owner may use the audited Publish as owner option for their own tested submissions without beta votes; other developers do not gain that permission. No kit or passing scan publishes a game automatically.

NO-AI PATH: follow Step by step in the workshop and download creator-guides/existing.txt for an existing game. Only declare AI assistance when it was actually used.

GUIDED NEW GAMES: creator-guides/25m.txt, creator-guides/1h.txt and creator-guides/4h.txt ask about style, movement, controls and progression. The matching browser starter ZIPs are creator-kit-25m.zip, creator-kit-1h.zip and creator-kit-4h.zip. These playtime targets are estimates to test, not a claim that the sample is a finished campaign.
