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
|
import{ setupLevel, setupLevelUi } from './level.js';
function buildLevel(x, y, t) {
const ts = t.slice(0, -1);
const tf = t[t.length-1];
return setupLevel(ts.map(T => [ x(T), y(T) ]), [ x(tf), y(tf) ]);
}
const levels = {
'initial jump': [ [], setupLevel([], [8, 0]) ],
'monopole harvesting': [ ['initial jump'], setupLevel([[3, 3]], [8,8]) ],
'parabolic 0': [ ['initial jump', 'monopole harvesting'], setupLevel([[-2, 4], [0,0], [2, 4]], [3,9]) ],
'sinusoidal': [
['initial jump', 'monopole harvesting'],
buildLevel(t => t-4, t => 4 * Math.sin(t), [...Array(8).keys()].map(x => Math.PI * x / 4)),
],
'parabolic 1': [
['parabolic 0'],
buildLevel(t => -0.5*(t-3)**2 + 4, t => t-3, [...Array(8).keys()].map(x => x - 2)),
],
'orbital': [
['parabolic 0', 'sinusoidal'],
buildLevel(t => 8*Math.cos(t), t => 8*Math.sin(t), [...Array(8).keys()].map(x => Math.PI * x / 4)),
],
'lissajous 0': [
['orbital'],
buildLevel(t => 8*Math.cos(3*t), t => 8*Math.sin(2*t), [...Array(8).keys()].map(x => Math.PI * x / 4)),
],
'lissajous 1': [
['orbital'],
buildLevel(t => 8*Math.sin(4*t), t => 8*Math.cos(3*t), [...Array(16).keys()].map(x => Math.PI * x / 8)),
],
};
export function setupLevelSelectUi(root, sfx) {
const levelList = document.createElement('ol');
const levelPicker = name => {
const [ dependencies, level ] = levels[name];
const allDependenciesSatisfied = dependencies.map(x => levels[x][1].completed).reduce((acc, x) => acc && x, true);
if (allDependenciesSatisfied) {
sfx.listAppearAudio.currentTime = 0;
sfx.listAppearAudio.play();
// if (true) {
const button = document.createElement('input');
button.type = 'button';
button.value = name;
button.onmouseenter = () => {
sfx.buttonEnterAudio.currentTime = 0;
sfx.buttonEnterAudio.play();
}
button.onclick = () => {
sfx.buttonClickAudio.currentTime = 0;
sfx.buttonClickAudio.play();
root.innerText = '';
setupLevelUi(level, root, sfx);
}
const li = document.createElement('li');
li.appendChild(button);
if (level.completed) {
li.appendChild(document.createTextNode('[complete]'));
}
levelList.appendChild(li);
}
}
let time = 0;
[...Object.keys(levels)].forEach(name => {
setTimeout(() => {
levelPicker(name);
}, 100 * time + 100)
time += 1;
});
const header = document.createElement('h1');
header.classList.add('center');
header.innerText = 'AVAILABLE CONTRACTS';
root.appendChild(header);
const p = document.createElement('p');
p.innerText = 'Please select a General Products AMH hyperspace navigation contract from the list below.';
root.appendChild(p);
root.appendChild(levelList);
}
|