-
Notifications
You must be signed in to change notification settings - Fork 156
Expand file tree
/
Copy pathcreateGameActor.ts
More file actions
90 lines (80 loc) · 1.53 KB
/
createGameActor.ts
File metadata and controls
90 lines (80 loc) · 1.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { setup, createActor } from 'xstate';
// import { inspect } from '@xstate/inspect';
import type { IntermediateMachines } from './types';
import { context, type Context } from './machineContext';
import {
STATE_RENDERING,
STATE_IDLE,
STATE_BET,
STATE_AUTOBET,
STATE_RESUME_BET,
} from './constants';
// states
const stateRendering = {
on: {
RENDERED: {
target: 'idle',
},
},
};
const stateIdle = {
on: {
RESUME_BET: {
target: 'resumeBet',
},
BET: {
target: 'bet',
},
AUTO_BET: {
target: 'autoBet',
},
},
};
const stateResumeBet = {
invoke: {
id: 'resumeBet',
src: 'resumeBet' as const,
onDone: 'idle',
},
};
const stateBet = {
invoke: {
id: 'bet',
src: 'bet' as const,
onDone: 'idle',
},
};
const stateAutoBet = {
invoke: {
id: 'autoBet',
src: 'autoBet' as const,
onDone: 'idle',
},
};
const createGameActor = (intermediateMachines: IntermediateMachines) => {
// machine
const gameMachine = setup({
types: {} as {
context: Context;
},
actors: {
bet: intermediateMachines.bet,
autoBet: intermediateMachines.autoBet,
resumeBet: intermediateMachines.resumeBet,
},
}).createMachine({
context,
initial: 'rendering',
states: {
[STATE_RENDERING]: stateRendering,
[STATE_IDLE]: stateIdle, // Note: No intermediateMachines.idle exists
[STATE_BET]: stateBet,
[STATE_AUTOBET]: stateAutoBet,
[STATE_RESUME_BET]: stateResumeBet,
},
});
// create game actor
const gameActor = createActor(gameMachine);
return gameActor;
};
export { createGameActor };