// A random player: any listed move, random targets and cards where the move leaves them open. Seeded from what it // sees, so the same game plays the same way twice. export default function act(obs, legal) { let x = [...JSON.stringify([obs.zones, obs.log.length, obs.viewer, legal.length])].reduce((h, c) => (h * 31 + c.charCodeAt(0)) >>> 0, 7); const rand = (n) => ((x = (x * 1103515245 + 12345) >>> 0) % n); const l = legal[rand(legal.length)]; const m = structuredClone(l.message); if (l.validTargets.length && !Array.isArray(m.params.targets)) { const t = l.validTargets[rand(l.validTargets.length)]; m.params.targets = [t]; m.params.target = t; } if (Array.isArray(m.params.cardIds) && !m.params.cardIds.length) { const hand = obs.players[obs.viewer].hand ?? []; const need = obs.pending?.discard?.min ?? 1; m.params.cardIds = hand.slice(0, need).map((c) => c.id); } return m; }