import { createLocalMatch } from '@table-craft/table-craft';
import { TablecraftGame } from '@table-craft/table-craft/react';
import '@table-craft/table-craft/style.css';
import source from './treasure-road.js?raw';
const match = createLocalMatch({ source, players: ['You', 'bot', 'bot'] });
export default function App() {
return <TablecraftGame client={match} style={{ height: '100vh' }} />;
}
import { mountGame, createLocalMatch } from '@table-craft/table-craft/embed';
import '@table-craft/table-craft/style.css';
const source = await (await fetch('/games/treasure-road.js')).text();
mountGame(document.getElementById('table'), {
client: createLocalMatch({ source, players: ['You', 'bot'] }),
locale: 'en',
});
import fs from 'node:fs';
import { createServer } from 'node:http';
import { Server } from 'socket.io';
import { createRoomServer } from '@table-craft/table-craft/server';
const http = createServer();
const rooms = createRoomServer(new Server(http).of('/tablecraft'));
const code = rooms.createRoom({ source: fs.readFileSync('game.js', 'utf8') });
http.listen(3000, () => console.log('room', code));
// client: connectRoom({ io, url: 'http://localhost:3000', room: code, name })
import { simulate, summarize } from '@table-craft/table-craft/server';
const report = simulate(source, { games: 200 });
console.log(summarize(report));
// 200 games · 200 finished · 0 stuck · 0 hit the move cap · avg 18 moves
// …or every move actions() offered but move() rejected, stuck states,
// invariant violations and broken scenes — with the game, move and args.