forked from nan-academy/tron
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstate.js
65 lines (52 loc) · 1.51 KB
/
state.js
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
import observable from './izi/observ.js'
import map from './izi/map.js'
import rseed from './rseed.js'
import qs from './izi/query-string.js'
const noOp = _ => _
const rnd = Math.random
const setRoute = obj => {
const newQuery = '?'+ Object.keys(obj)
.sort()
.map(key => `${key}=${obj[key]}`)
.join('&')
if (newQuery !== location.search) {
location.search = newQuery
}
}
const seed = observable(rseed.seed())
seed.set = (setSeed => s => setSeed(rseed.seed(Number(s) || 0)))(seed.set)
const defaults = {
speedFactor: Number(localStorage.speedFactor) || 32,
seed: seed(),
users: [],
}
const urlParams = (parsers => map((val, key) =>
(parsers[key] || noOp)(val) || defaults[key], qs()))({
users: u => (u || '').split(',') || [ 'random' ],
seed: seed.set,
})
const players = []
const history = []
const speedFactor = observable.check(defaults.speedFactor)
const speedFactorBounds = [ 0.25, 32 ]
speedFactor(val => localStorage.speedFactor = val)
const decSpeed = () =>
speedFactor.set(Math.max(speedFactor() / 2, speedFactorBounds[0]))
const incSpeed = () =>
speedFactor.set(Math.min(speedFactor() * 2, speedFactorBounds[1]))
setRoute({ seed: seed(), users: (urlParams.users || ['nan-academy']).sort() })
export default {
players,
seed,
users: urlParams.users,
map: history,
paused: observable.check(true),
speedFactor,
incSpeed,
decSpeed,
reset: () => setRoute({
seed: Math.floor(rnd() * 0x80000000),
users: urlParams.users.sort(),
}),
reload: () => location.reload(),
}