Play a complete game of tic-tac-toe on a Ulanzi D200. The plugin uses 11 button actions: nine fixed board cells, one New Game button, and one Session Score button. Choose X or O and play against the machine.
Current release: v1.5.0.
Place the cell actions in row-major order:
┌────────┬────────┬────────┐
│ Cell 1 │ Cell 2 │ Cell 3 │
├────────┼────────┼────────┤
│ Cell 4 │ Cell 5 │ Cell 6 │
├────────┼────────┼────────┤
│ Cell 7 │ Cell 8 │ Cell 9 │
└────────┴────────┴────────┘
The nine placement icons retain the position number and miniature grid to make setup unambiguous. Once configured, every cell switches among deterministic 196×196 runtime derivatives of the source artwork in assets/blank.png, assets/cross.png, and assets/circle.png. The build keeps the original artwork unchanged and packages only the optimized derivatives.
The New Game action normally shows the supplied New Game artwork. A human win, machine win, or draw temporarily replaces it with the supplied Victory, Defeat, or Draw artwork for exactly five seconds, then restores New Game without starting a round. Pressing New Game during that interval immediately starts a fresh round and safely cancels the pending restoration. These images are deterministic 196×196 derivatives; their workspace source files remain unchanged and are excluded from the runnable plugin and ZIP.
- Download
com.ulanzi.tictactoe.ulanziPlugin.zipfrom the GitHub release assets and extract it. - In Ulanzi Studio, use the local plugin selection to install the extracted
com.ulanzi.tictactoe.ulanziPluginfolder. This extract-first method is the primary installation path on both Windows and macOS. - Place Cell 1 through Cell 9 as shown above, then add New Game and Session Score wherever convenient.
- Select the New Game action, open its Property Inspector, and choose X / crosses or O / circles.
The release ZIP is a transport archive. Extract it first; direct ZIP import has not been established by the local installation test.
Optional Windows-only alternative: copy the extracted plugin folder to %APPDATA%\Ulanzi\UlanziDeck\Plugins\ using the locally verified Windows installation method. No macOS filesystem path is documented because one has not been verified.
The package supports the Ulanzi D200 keypad on Windows 10 or newer and macOS 14 Sonoma or newer, with Ulanzi Studio 2.1.4 or newer. The plugin has been physically validated with a D200 on Windows 10+ and with a D200 connected to a MacBook Pro running macOS Sonoma. Older macOS versions are not claimed as supported. Other devices are unsupported unless their host exposes the same D200 action contract.
The store gallery includes the original promotional banner and a second gameplay banner based on an authorized D200 screenshot. Both approved banners are also carried by the runnable package.
- Install Node.js 20 or newer.
- Run
npm run check,npm test,npm run smoke, andnpm run mock. - Run
npm run packagelast.
Packaging performs a final build and creates com.ulanzi.tictactoe.ulanziPlugin/package/com.ulanzi.tictactoe.ulanziPlugin.zip. The package/ directory is ignored by Git; attach the ZIP to the GitHub release instead of committing it.
The symbol setting is stored through the Ulanzi action parameter mechanism. No external service is required. Each fixed action UUID identifies its board cell, so moving a configured action moves that cell's control rather than changing the game state.
Cell action identities use one direct suffix segment: .cell-1 through .cell-9 in row-major order.
- The human uses the symbol selected on New Game; the machine uses the opposite symbol.
- X always starts a fresh round. Choose X to move first, or choose O for a machine-first round after the normal visible delay.
- Pressing New Game preserves the selected symbol and session score.
- The machine uses an approximately 75% optimal minimax / 25% random legal-move strategy.
- Cell input is locked while the machine is moving. Occupied cells and presses after a finished game are ignored.
- A win, draw, or final board remains visible until New Game. Winning marks deliberately keep the exact supplied X/O artwork; no fourth rendered variant or pixel-changing highlight is applied.
- Session Score counts X wins, O wins, and draws. Starting a new game does not reset it.
The game is process-local: all registered Tic-Tac-Toe actions connected to one plugin process show and control the same game. Restarting the plugin process resets the session score.
The host protocol and package conventions mirror the verified Flight Info template. Automated tests cover game rules, AI selection, rendering, and context broadcasting. The plugin has also been physically validated on a D200 with Windows 10+ and macOS 14 Sonoma.
The repository owner and rightsholder supplied and authorized all high-resolution PNG source files in assets/, and their generated derivatives, for distribution under this repository's MIT License. The build preserves those source files and generates the runtime derivatives reproducibly. Placement icons, score artwork, and plugin artwork are generated by scripts/assets.mjs; approved store media is preserved byte-for-byte and copied into the runnable package where required. No third-party provenance is claimed for the supplied artwork.
The project code, included source artwork, and generated derivatives are available under the MIT License.

