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
|
"use strict"
const RED = "Red"
const BLUE = "Blue"
var game, view, states
exports.scenarios = [ "Standard" ]
exports.roles = [ RED, BLUE ]
exports.setup = function (seed, scenario, options) {
game = {
seed: seed,
state: null,
log: [],
undo: [],
}
return game
}
exports.action = function (state, player, action, arg) {
game = state
let S = states[game.state]
if (action in S)
S[action](arg, player)
else
throw new Error("Invalid action: " + action)
return game
}
exports.resign = function (state, player) {
game = state
if (game.state !== 'game_over') {
if (player === RED)
goto_game_over(BLUE, "Red resigned.")
if (player === BLUE)
goto_game_over(RED, "Blue resigned.")
}
return game
}
exports.view = function(state, player) {
game = state
let view = {
log: game.log,
prompt: null,
}
if (game.state === "game_over") {
view.prompt = game.victory
} else if (player !== game.active) {
let inactive = states[game.state].inactive || game.state
view.prompt = `Waiting for ${game.active} \u2014 ${inactive}...`
} else {
view.actions = {}
states[game.state].prompt()
if (game.undo && game.undo.length > 0)
view.actions.undo = 1
else
view.actions.undo = 0
}
return view;
}
|