Skip to content

Commit bf33f85

Browse files
feat(levels): insert 22
1 parent 407a373 commit bf33f85

File tree

7 files changed

+163
-65
lines changed

7 files changed

+163
-65
lines changed

src/levels/22.ts

Lines changed: 80 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,96 @@
11
import {
2-
addKey,
2+
addExit,
33
addPlayer,
4-
addText,
5-
loadExit,
6-
registerPasswordCheck,
7-
registerPlayerMovement,
4+
loadEgg,
5+
loadEnemy,
6+
loadHit,
87
registerWinCondition,
98
} from '../templates'
109

1110
export const level = 22
12-
export const title = 'Fullfilled Promise'
13-
export const hint = 'key.promise.then(...)'
14-
15-
const password = btoa(String(Date.now()))
11+
export const title = 'Last stand'
12+
export const hint = "addEventListener('click', ...)"
1613

1714
export const prescript = `
18-
${loadExit()}
15+
${loadEgg()}
16+
${loadEnemy()}
17+
${loadHit()}
1918
20-
${addPlayer({ pos: '100, 100' })}
21-
${addKey({
22-
pos: 'center()',
23-
obj: `{ promise: Promise.resolve('${password}') }`,
24-
})}
19+
${addExit({ pos: 'center()' })}
2520
26-
${registerPlayerMovement()}
2721
${registerWinCondition(level)}
28-
${registerPasswordCheck(password)}
2922
30-
${addText('Pass the Promise')}
31-
`
23+
let seconds = 30
24+
const getMessage = () => 'Player spawns in ' + seconds + ' sec'
3225
33-
export const script = `
34-
/**
35-
* A Promise produces a value in the future
36-
* If a Promise succeeded, it will produce a resolved value
37-
*/
26+
wait(seconds, () => {
27+
${addPlayer({ pos: 'center()' })}
28+
})
29+
30+
add([rect(width(), 32), color(0, 0, 0), z(100)])
31+
const message = add([text(getMessage()), z(100)])
32+
33+
const cancelMessageLoop = loop(1, () => {
34+
if (seconds <= 0) {
35+
message.text = 'Player spawned'
36+
cancelMessageLoop()
37+
} else {
38+
seconds--
39+
message.text = getMessage()
40+
}
41+
}).cancel
42+
43+
const cancelEnemyLoop = loop(1, () => {
44+
const enemy = add([
45+
sprite('enemy'),
46+
pos(randi(2) ? 0 : width(), randi(2) ? 0 : height()),
47+
anchor('center'),
48+
area({ scale: 0.9 }),
49+
body(),
50+
'enemy',
51+
])
3852
39-
const key = get('key')[0]
53+
enemy.onUpdate(() => {
54+
const ENEMY_SPEED = 100
55+
const exit = get('exit')[0]
56+
if (exit) {
57+
const dir = exit.pos.sub(enemy.pos).unit()
58+
enemy.move(dir.scale(ENEMY_SPEED))
59+
}
60+
})
61+
}).cancel
4062
41-
// set \`key.password\` to the resolved value of \`key.promise\`
42-
key.promise
63+
onUpdate('egg', (egg) => {
64+
const SPEED = 300
65+
egg.move(egg.dir.scale(SPEED))
66+
})
67+
68+
onCollide('exit', 'enemy', (exit, enemy) => {
69+
cancelEnemyLoop()
70+
play('hit')
71+
exit.destroy()
72+
enemy.destroy()
73+
addKaboom(exit.pos)
74+
})
75+
76+
onCollide('egg', 'enemy', (egg, enemy) => {
77+
play('hit')
78+
egg.destroy()
79+
enemy.destroy()
80+
addKaboom(egg.pos)
81+
})
82+
`
83+
84+
export const script = `
85+
function shoot() {
86+
add([
87+
pos(center()),
88+
sprite('egg'),
89+
anchor('center'),
90+
area({ scale: 0.7 }),
91+
offscreen({ destroy: true }),
92+
'egg',
93+
{ dir: mousePos().sub(center()).unit() },
94+
])
95+
}
4396
`

src/levels/23.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import {
99
} from '../templates'
1010

1111
export const level = 23
12-
export const title = 'Rejected Promise'
13-
export const hint = 'key.promise.catch(...)'
12+
export const title = 'Fullfilled Promise'
13+
export const hint = 'key.promise.then(...)'
1414

1515
const password = btoa(String(Date.now()))
1616

@@ -20,26 +20,24 @@ ${loadExit()}
2020
${addPlayer({ pos: '100, 100' })}
2121
${addKey({
2222
pos: 'center()',
23-
obj: `{ promise: Promise.reject('${password}') }`,
23+
obj: `{ promise: Promise.resolve('${password}') }`,
2424
})}
2525
2626
${registerPlayerMovement()}
2727
${registerWinCondition(level)}
2828
${registerPasswordCheck(password)}
2929
30-
${addText('Catch the Promise')}
31-
32-
window.isPromise = (value) => value instanceof Promise
30+
${addText('Pass the Promise')}
3331
`
3432

3533
export const script = `
3634
/**
3735
* A Promise produces a value in the future
38-
* If a Promise failed, it will produce a rejected value
36+
* If a Promise succeeded, it will produce a resolved value
3937
*/
4038
4139
const key = get('key')[0]
4240
43-
// set \`key.password\` to the rejected value of \`key.promise\`
41+
// set \`key.password\` to the resolved value of \`key.promise\`
4442
key.promise
4543
`

src/levels/24.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,37 @@ import {
99
} from '../templates'
1010

1111
export const level = 24
12-
export const title = 'Promise methods'
13-
export const hint = 'key.promise.then(...).catch(...)'
12+
export const title = 'Rejected Promise'
13+
export const hint = 'key.promise.catch(...)'
1414

15-
const password = Date.now()
15+
const password = btoa(String(Date.now()))
1616

1717
export const prescript = `
1818
${loadExit()}
1919
2020
${addPlayer({ pos: '100, 100' })}
2121
${addKey({
2222
pos: 'center()',
23-
obj: `{ promise: randi(2) ? Promise.resolve(${password}) : Promise.reject(${password}) }`,
23+
obj: `{ promise: Promise.reject('${password}') }`,
2424
})}
2525
2626
${registerPlayerMovement()}
2727
${registerWinCondition(level)}
2828
${registerPasswordCheck(password)}
2929
30-
${addText('then or catch')}
30+
${addText('Catch the Promise')}
31+
32+
window.isPromise = (value) => value instanceof Promise
3133
`
3234

3335
export const script = `
36+
/**
37+
* A Promise produces a value in the future
38+
* If a Promise failed, it will produce a rejected value
39+
*/
40+
3441
const key = get('key')[0]
3542
36-
// set \`key.password\` to the resolved or rejected value of \`key.promise\`
43+
// set \`key.password\` to the rejected value of \`key.promise\`
3744
key.promise
3845
`

src/levels/25.ts

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import {
99
} from '../templates'
1010

1111
export const level = 25
12-
export const title = 'Async/await'
13-
export const hint = 'Google Async/await'
12+
export const title = 'Promise methods'
13+
export const hint = 'key.promise.then(...).catch(...)'
1414

1515
const password = Date.now()
1616

@@ -27,22 +27,12 @@ ${registerPlayerMovement()}
2727
${registerWinCondition(level)}
2828
${registerPasswordCheck(password)}
2929
30-
${addText('Bye Bye Bye')}
30+
${addText('then or catch')}
3131
`
3232

3333
export const script = `
34-
/**
35-
* \`await\` pauses an async function execution and
36-
* waits for a Promise to resolve before continuing
37-
*/
38-
3934
const key = get('key')[0]
4035
41-
async function main() {
42-
// password = resolved or rejected value of \`key.promise\`
43-
let password
44-
key.password = password
45-
}
46-
47-
main()
36+
// set \`key.password\` to the resolved or rejected value of \`key.promise\`
37+
key.promise
4838
`

src/levels/26.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { password } from '../../public/data/password.json'
21
import {
32
addKey,
43
addPlayer,
@@ -10,34 +9,40 @@ import {
109
} from '../templates'
1110

1211
export const level = 26
13-
export const title = 'fetch'
14-
export const hint = 'Google JavaScript Fetch API'
12+
export const title = 'Async/await'
13+
export const hint = 'Google Async/await'
14+
15+
const password = Date.now()
1516

1617
export const prescript = `
1718
${loadExit()}
1819
1920
${addPlayer({ pos: '100, 100' })}
2021
${addKey({
2122
pos: 'center()',
22-
obj: JSON.stringify({ password }),
23+
obj: `{ promise: randi(2) ? Promise.resolve(${password}) : Promise.reject(${password}) }`,
2324
})}
2425
2526
${registerPlayerMovement()}
2627
${registerWinCondition(level)}
2728
${registerPasswordCheck(password)}
2829
29-
${addText('Fetch the password')}
30+
${addText('Bye Bye Bye')}
3031
`
3132

3233
export const script = `
3334
/**
34-
* fetch() makes a request for a resource
35+
* \`await\` pauses an async function execution and
36+
* waits for a Promise to resolve before continuing
3537
*/
3638
3739
const key = get('key')[0]
3840
39-
// GET the password from "/data/password.json"
40-
let password
41+
async function main() {
42+
// password = resolved or rejected value of \`key.promise\`
43+
let password
44+
key.password = password
45+
}
4146
42-
key.password = password
47+
main()
4348
`

src/levels/27.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { password } from '../../public/data/password.json'
2+
import {
3+
addKey,
4+
addPlayer,
5+
addText,
6+
loadExit,
7+
registerPasswordCheck,
8+
registerPlayerMovement,
9+
registerWinCondition,
10+
} from '../templates'
11+
12+
export const level = 27
13+
export const title = 'fetch'
14+
export const hint = 'Google JavaScript Fetch API'
15+
16+
export const prescript = `
17+
${loadExit()}
18+
19+
${addPlayer({ pos: '100, 100' })}
20+
${addKey({
21+
pos: 'center()',
22+
obj: JSON.stringify({ password }),
23+
})}
24+
25+
${registerPlayerMovement()}
26+
${registerWinCondition(level)}
27+
${registerPasswordCheck(password)}
28+
29+
${addText('Fetch the password')}
30+
`
31+
32+
export const script = `
33+
/**
34+
* fetch() makes a request for a resource
35+
*/
36+
37+
const key = get('key')[0]
38+
39+
// GET the password from "/data/password.json"
40+
let password
41+
42+
key.password = password
43+
`

src/templates/sprites.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ add([
5353

5454
export const loadBlock = () => `loadSprite('block', 'sprites/steel.png')`
5555

56+
export const loadEgg = () => `loadSprite('egg', 'sprites/egg.png')`
57+
5658
export const loadExit = () => `loadSprite('exit', 'sprites/door.png')`
5759

5860
export const loadEnemy = () => `loadSprite('enemy', 'sprites/ghosty.png')`

0 commit comments

Comments
 (0)