pxt-microbit 7.0.19 → 7.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/built/block-tests.js +1 -1
- package/built/editor.js +24 -4
- package/built/target-strings.json +1 -1
- package/built/target.js +1 -1
- package/built/target.json +1 -1
- package/built/targetlight.json +1 -1
- package/docs/extensions/extension-gallery.md +12 -8
- package/docs/projects/analog-pin-tester.md +1 -1
- package/docs/projects/banana-keyboard/code.md +25 -25
- package/docs/projects/banana-keyboard/make.md +1 -1
- package/docs/projects/crashy-bird.md +12 -12
- package/docs/projects/fireflies.md +3 -3
- package/docs/projects/guitar/accelerometer.md +5 -5
- package/docs/projects/guitar/displaybuttons.md +7 -7
- package/docs/projects/guitar/lightsensor.md +4 -4
- package/docs/projects/guitar/pinpress.md +12 -12
- package/docs/projects/hack-your-headphones/code.md +19 -19
- package/docs/projects/hot-or-cold/beacon.md +1 -1
- package/docs/projects/hot-or-cold/multi-beacons.md +2 -2
- package/docs/projects/hot-or-cold/seekers.md +2 -2
- package/docs/projects/hot-or-cold.md +3 -3
- package/docs/projects/inchworm/code.md +5 -5
- package/docs/projects/inchworm/connect.md +1 -1
- package/docs/projects/infection.md +175 -175
- package/docs/projects/karel.md +37 -37
- package/docs/projects/light-monster/code.md +1 -1
- package/docs/projects/light-monster/connect.md +2 -2
- package/docs/projects/magic-button-trick.md +13 -13
- package/docs/projects/micro-coin.md +3 -3
- package/docs/projects/milk-carton-robot/code.md +3 -3
- package/docs/projects/milk-carton-robot/connect.md +2 -2
- package/docs/projects/milky-monster/code.md +3 -3
- package/docs/projects/milky-monster/connect.md +2 -2
- package/docs/projects/mood-radio.md +4 -4
- package/docs/projects/plant-watering/code.md +1 -1
- package/docs/projects/railway-crossing.md +5 -5
- package/docs/projects/rc-car/code.md +2 -2
- package/docs/projects/rc-car/connect.md +6 -6
- package/docs/projects/reaction-time/code.md +15 -15
- package/docs/projects/salute.md +5 -5
- package/docs/projects/servo-calibrator.md +3 -3
- package/docs/projects/soil-moisture/code.md +3 -3
- package/docs/projects/soil-moisture/connect.md +2 -5
- package/docs/projects/spy/coin-flipper.md +4 -4
- package/docs/projects/spy/rock-paper-scissors.md +3 -3
- package/docs/projects/states-of-matter/code.md +15 -15
- package/docs/projects/tele-potato.md +6 -6
- package/docs/projects/telegraph/code.md +7 -7
- package/docs/projects/timing-gates.md +11 -11
- package/docs/projects/turtle-scanner.md +1 -1
- package/docs/projects/turtle-spiral.md +1 -1
- package/docs/projects/voting-machine.md +4 -4
- package/docs/projects/wallet/code.md +2 -2
- package/docs/projects/watch/code.md +11 -11
- package/docs/projects/watch/digital-watch.md +37 -37
- package/docs/projects/watch/timer.md +9 -9
- package/docs/teachertool.md +178 -0
- package/package.json +2 -2
- package/targetconfig.json +2 -0
|
@@ -32,7 +32,7 @@ radio.setTransmitPower(6)
|
|
|
32
32
|
The beacon just needs to send a radio message every now and then. So, to pace the transmits and give some visual feedback, we add some ``||basic:show icon||`` blocks to animate the screen.
|
|
33
33
|
|
|
34
34
|
```blocks
|
|
35
|
-
basic.forever(()
|
|
35
|
+
basic.forever(function () {
|
|
36
36
|
radio.sendNumber(0)
|
|
37
37
|
basic.showIcon(IconNames.Heart)
|
|
38
38
|
basic.showIcon(IconNames.SmallHeart)
|
|
@@ -142,7 +142,7 @@ radio.onReceivedNumber(function (receivedNumber) {
|
|
|
142
142
|
To see the current score, we add an ``||input:on button pressed||`` that displays the score on the screen when the **A** button is pressed.
|
|
143
143
|
|
|
144
144
|
```block
|
|
145
|
-
input.onButtonPressed(Button.A, ()
|
|
145
|
+
input.onButtonPressed(Button.A, function () {
|
|
146
146
|
basic.showNumber(game.score())
|
|
147
147
|
})
|
|
148
148
|
```
|
|
@@ -172,7 +172,7 @@ radio.onReceivedNumber(function (receivedNumber) {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
})
|
|
175
|
-
input.onButtonPressed(Button.A, ()
|
|
175
|
+
input.onButtonPressed(Button.A, function () {
|
|
176
176
|
basic.showNumber(game.score())
|
|
177
177
|
})
|
|
178
178
|
radio.setGroup(1)
|
|
@@ -15,11 +15,11 @@ Add code to make the inchworm move.
|
|
|
15
15
|
In order for the inchworm to move, the @boardname@ needs to command the servo to move between ``0`` and ``180`` degrees at a certain pace. The code below starts the inchworm moving when the **A** button is pressed.
|
|
16
16
|
|
|
17
17
|
```blocks
|
|
18
|
-
input.onButtonPressed(Button.A, ()
|
|
19
|
-
pins.servoWritePin(AnalogPin.P0, 0)
|
|
20
|
-
basic.pause(500)
|
|
21
|
-
pins.servoWritePin(AnalogPin.P0, 180)
|
|
22
|
-
basic.pause(500)
|
|
18
|
+
input.onButtonPressed(Button.A, function () {
|
|
19
|
+
pins.servoWritePin(AnalogPin.P0, 0)
|
|
20
|
+
basic.pause(500)
|
|
21
|
+
pins.servoWritePin(AnalogPin.P0, 180)
|
|
22
|
+
basic.pause(500)
|
|
23
23
|
});
|
|
24
24
|
```
|
|
25
25
|
|
|
@@ -106,10 +106,10 @@ As a result, it will not convert back to blocks.
|
|
|
106
106
|
* Healthy: IconNames.Happy
|
|
107
107
|
*
|
|
108
108
|
*/
|
|
109
|
-
const INCUBATION = 20000
|
|
110
|
-
const DEATH = 40000
|
|
111
|
-
const RSSI = -45
|
|
112
|
-
const TRANSMISSIONPROB = 40
|
|
109
|
+
const INCUBATION = 20000 // time before showing symptoms
|
|
110
|
+
const DEATH = 40000 // time before dying off the disease
|
|
111
|
+
const RSSI = -45 // db
|
|
112
|
+
const TRANSMISSIONPROB = 40 // % probability to transfer disease
|
|
113
113
|
|
|
114
114
|
enum GameState {
|
|
115
115
|
Stopped,
|
|
@@ -147,366 +147,366 @@ const GameIcons = {
|
|
|
147
147
|
|
|
148
148
|
class Message {
|
|
149
149
|
|
|
150
|
-
private _data: Buffer
|
|
150
|
+
private _data: Buffer
|
|
151
151
|
|
|
152
152
|
constructor(input?: Buffer) {
|
|
153
|
-
this._data = input || control.createBuffer(13)
|
|
153
|
+
this._data = input || control.createBuffer(13)
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
get kind(): number {
|
|
157
|
-
return this._data.getNumber(NumberFormat.Int8LE, 0)
|
|
157
|
+
return this._data.getNumber(NumberFormat.Int8LE, 0)
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
set kind(x: number) {
|
|
161
|
-
this._data.setNumber(NumberFormat.Int8LE, 0, x)
|
|
161
|
+
this._data.setNumber(NumberFormat.Int8LE, 0, x)
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
get fromSerialNumber(): number {
|
|
165
|
-
return this._data.getNumber(NumberFormat.Int32LE, 1)
|
|
165
|
+
return this._data.getNumber(NumberFormat.Int32LE, 1)
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
set fromSerialNumber(x: number) {
|
|
169
|
-
this._data.setNumber(NumberFormat.Int32LE, 1, x)
|
|
169
|
+
this._data.setNumber(NumberFormat.Int32LE, 1, x)
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
get value(): number {
|
|
173
|
-
return this._data.getNumber(NumberFormat.Int32LE, 5)
|
|
173
|
+
return this._data.getNumber(NumberFormat.Int32LE, 5)
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
set value(x: number) {
|
|
177
|
-
this._data.setNumber(NumberFormat.Int32LE, 5, x)
|
|
177
|
+
this._data.setNumber(NumberFormat.Int32LE, 5, x)
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
get toSerialNumber(): number {
|
|
181
|
-
return this._data.getNumber(NumberFormat.Int32LE, 9)
|
|
181
|
+
return this._data.getNumber(NumberFormat.Int32LE, 9)
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
set toSerialNumber(x: number) {
|
|
185
|
-
this._data.setNumber(NumberFormat.Int32LE, 9, x)
|
|
185
|
+
this._data.setNumber(NumberFormat.Int32LE, 9, x)
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
send() {
|
|
189
|
-
radio.sendBuffer(this._data)
|
|
190
|
-
basic.pause(250)
|
|
189
|
+
radio.sendBuffer(this._data)
|
|
190
|
+
basic.pause(250)
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
const playerIcons = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
194
|
+
const playerIcons = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
195
195
|
class Player {
|
|
196
|
-
id: number
|
|
197
|
-
icon: number
|
|
198
|
-
health: HealthState
|
|
196
|
+
id: number
|
|
197
|
+
icon: number
|
|
198
|
+
health: HealthState
|
|
199
199
|
show() {
|
|
200
|
-
basic.showString(playerIcons[this.icon])
|
|
200
|
+
basic.showString(playerIcons[this.icon])
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
// common state
|
|
205
|
-
let state = GameState.Stopped
|
|
205
|
+
let state = GameState.Stopped
|
|
206
206
|
|
|
207
207
|
// master state
|
|
208
|
-
let master = false
|
|
209
|
-
let patientZero: Player
|
|
210
|
-
const players: Player[] = []
|
|
208
|
+
let master = false
|
|
209
|
+
let patientZero: Player
|
|
210
|
+
const players: Player[] = []
|
|
211
211
|
|
|
212
212
|
// player state
|
|
213
|
-
let paired = false
|
|
214
|
-
let infectedBy = -1
|
|
215
|
-
let infectedTime = 0
|
|
216
|
-
let playerIcon = -1
|
|
217
|
-
let health = HealthState.Healthy
|
|
213
|
+
let paired = false
|
|
214
|
+
let infectedBy = -1 // who infected (playerIcon)
|
|
215
|
+
let infectedTime = 0 // local time when infection happened
|
|
216
|
+
let playerIcon = -1 // player icon and identity
|
|
217
|
+
let health = HealthState.Healthy
|
|
218
218
|
|
|
219
219
|
// get a player instance (creates one as needed)
|
|
220
220
|
function player(id: number): Player {
|
|
221
221
|
for (const p of players)
|
|
222
|
-
if (p.id == id) return p
|
|
222
|
+
if (p.id == id) return p
|
|
223
223
|
|
|
224
224
|
// add player to game
|
|
225
|
-
let p = new Player()
|
|
226
|
-
p.id = id
|
|
227
|
-
p.icon = (players.length + 1) % playerIcons.length
|
|
228
|
-
p.health = HealthState.Healthy
|
|
229
|
-
players.push(p)
|
|
225
|
+
let p = new Player()
|
|
226
|
+
p.id = id
|
|
227
|
+
p.icon = (players.length + 1) % playerIcons.length
|
|
228
|
+
p.health = HealthState.Healthy
|
|
229
|
+
players.push(p)
|
|
230
230
|
serial.writeLine(`player ==> ${p.id}`)
|
|
231
231
|
|
|
232
|
-
return p
|
|
232
|
+
return p
|
|
233
233
|
}
|
|
234
234
|
|
|
235
235
|
function allDead(): boolean {
|
|
236
236
|
for (const p of players)
|
|
237
|
-
if (p.health != HealthState.Dead) return false
|
|
238
|
-
return true
|
|
237
|
+
if (p.health != HealthState.Dead) return false
|
|
238
|
+
return true
|
|
239
239
|
}
|
|
240
240
|
|
|
241
241
|
function gameOver() {
|
|
242
|
-
state = GameState.Over
|
|
242
|
+
state = GameState.Over
|
|
243
243
|
if (patientZero)
|
|
244
|
-
patientZero.show()
|
|
244
|
+
patientZero.show()
|
|
245
245
|
}
|
|
246
246
|
|
|
247
247
|
function gameFace() {
|
|
248
248
|
switch (state) {
|
|
249
249
|
case GameState.Stopped:
|
|
250
|
-
basic.showIcon(GameIcons.Pairing)
|
|
251
|
-
break
|
|
250
|
+
basic.showIcon(GameIcons.Pairing)
|
|
251
|
+
break
|
|
252
252
|
case GameState.Pairing:
|
|
253
253
|
if (playerIcon > -1)
|
|
254
|
-
basic.showString(playerIcons[playerIcon])
|
|
254
|
+
basic.showString(playerIcons[playerIcon])
|
|
255
255
|
else
|
|
256
|
-
basic.showIcon(paired ? GameIcons.Paired : GameIcons.Pairing, 1)
|
|
257
|
-
break
|
|
256
|
+
basic.showIcon(paired ? GameIcons.Paired : GameIcons.Pairing, 1)
|
|
257
|
+
break
|
|
258
258
|
case GameState.Infecting:
|
|
259
259
|
case GameState.Running:
|
|
260
260
|
switch (health) {
|
|
261
261
|
case HealthState.Dead:
|
|
262
|
-
basic.showIcon(GameIcons.Dead, 1)
|
|
263
|
-
break
|
|
262
|
+
basic.showIcon(GameIcons.Dead, 1)
|
|
263
|
+
break
|
|
264
264
|
case HealthState.Sick:
|
|
265
|
-
basic.showIcon(GameIcons.Sick, 1)
|
|
266
|
-
break
|
|
265
|
+
basic.showIcon(GameIcons.Sick, 1)
|
|
266
|
+
break
|
|
267
267
|
default:
|
|
268
|
-
basic.showIcon(GameIcons.Healthy, 1)
|
|
269
|
-
break
|
|
268
|
+
basic.showIcon(GameIcons.Healthy, 1)
|
|
269
|
+
break
|
|
270
270
|
}
|
|
271
|
-
break
|
|
271
|
+
break
|
|
272
272
|
case GameState.Over:
|
|
273
273
|
// show id
|
|
274
|
-
basic.showString(playerIcons[playerIcon])
|
|
275
|
-
basic.pause(2000)
|
|
274
|
+
basic.showString(playerIcons[playerIcon])
|
|
275
|
+
basic.pause(2000)
|
|
276
276
|
// show health
|
|
277
277
|
switch (health) {
|
|
278
278
|
case HealthState.Dead:
|
|
279
|
-
basic.showIcon(GameIcons.Dead, 2000)
|
|
280
|
-
break
|
|
279
|
+
basic.showIcon(GameIcons.Dead, 2000)
|
|
280
|
+
break
|
|
281
281
|
case HealthState.Sick:
|
|
282
|
-
basic.showIcon(GameIcons.Sick, 2000)
|
|
283
|
-
break
|
|
282
|
+
basic.showIcon(GameIcons.Sick, 2000)
|
|
283
|
+
break
|
|
284
284
|
case HealthState.Incubating:
|
|
285
|
-
basic.showIcon(GameIcons.Incubating, 2000)
|
|
286
|
-
break
|
|
285
|
+
basic.showIcon(GameIcons.Incubating, 2000)
|
|
286
|
+
break
|
|
287
287
|
default:
|
|
288
|
-
basic.showIcon(GameIcons.Healthy, 2000)
|
|
289
|
-
break
|
|
288
|
+
basic.showIcon(GameIcons.Healthy, 2000)
|
|
289
|
+
break
|
|
290
290
|
}
|
|
291
291
|
// show how infected
|
|
292
292
|
if (infectedBy > -1) {
|
|
293
|
-
basic.showString(" INFECTED BY")
|
|
294
|
-
basic.showString(playerIcons[infectedBy])
|
|
295
|
-
basic.pause(2000)
|
|
293
|
+
basic.showString(" INFECTED BY")
|
|
294
|
+
basic.showString(playerIcons[infectedBy])
|
|
295
|
+
basic.pause(2000)
|
|
296
296
|
} else {
|
|
297
|
-
basic.showString(" PATIENT ZERO")
|
|
298
|
-
basic.pause(2000)
|
|
297
|
+
basic.showString(" PATIENT ZERO")
|
|
298
|
+
basic.pause(2000)
|
|
299
299
|
}
|
|
300
300
|
// show score
|
|
301
|
-
game.showScore()
|
|
302
|
-
basic.pause(1000)
|
|
303
|
-
break
|
|
301
|
+
game.showScore()
|
|
302
|
+
basic.pause(1000)
|
|
303
|
+
break
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
306
|
|
|
307
307
|
// master button controller
|
|
308
|
-
input.onButtonPressed(Button.AB, ()
|
|
308
|
+
input.onButtonPressed(Button.AB, function () {
|
|
309
309
|
// register as master
|
|
310
310
|
if (state == GameState.Stopped && !master) {
|
|
311
|
-
master = true
|
|
312
|
-
paired = true
|
|
313
|
-
state = GameState.Pairing
|
|
314
|
-
serial.writeLine("registered as master")
|
|
315
|
-
radio.setTransmitPower(7)
|
|
316
|
-
basic.showString("0")
|
|
317
|
-
return
|
|
311
|
+
master = true
|
|
312
|
+
paired = true
|
|
313
|
+
state = GameState.Pairing
|
|
314
|
+
serial.writeLine("registered as master")
|
|
315
|
+
radio.setTransmitPower(7) // beef up master signal
|
|
316
|
+
basic.showString("0")
|
|
317
|
+
return
|
|
318
318
|
}
|
|
319
319
|
|
|
320
|
-
if (!master) return
|
|
320
|
+
if (!master) return // master only beyond this
|
|
321
321
|
|
|
322
322
|
// launch game
|
|
323
323
|
if (state == GameState.Pairing) {
|
|
324
324
|
// pick 1 player and infect him
|
|
325
|
-
patientZero = players[randint(0, players.length - 1)]
|
|
325
|
+
patientZero = players[randint(0, players.length - 1)]
|
|
326
326
|
// infecting message needs to be confirmed by
|
|
327
327
|
// the player
|
|
328
|
-
state = GameState.Infecting
|
|
329
|
-
serial.writeLine(`game started ${players.length} players`)
|
|
328
|
+
state = GameState.Infecting
|
|
329
|
+
serial.writeLine(`game started ${players.length} players`)
|
|
330
330
|
} // end game
|
|
331
331
|
else if (state == GameState.Running) {
|
|
332
|
-
gameOver()
|
|
332
|
+
gameOver()
|
|
333
333
|
}
|
|
334
334
|
})
|
|
335
335
|
|
|
336
|
-
radio.setGroup(42)
|
|
336
|
+
radio.setGroup(42)
|
|
337
337
|
radio.onReceivedBuffer(function (receivedBuffer: Buffer) {
|
|
338
|
-
const incomingMessage = new Message(receivedBuffer)
|
|
339
|
-
const signal = radio.receivedPacket(RadioPacketProperty.SignalStrength)
|
|
338
|
+
const incomingMessage = new Message(receivedBuffer)
|
|
339
|
+
const signal = radio.receivedPacket(RadioPacketProperty.SignalStrength)
|
|
340
340
|
if (master) {
|
|
341
341
|
switch (incomingMessage.kind) {
|
|
342
342
|
case MessageKind.PairRequest:
|
|
343
343
|
// register player
|
|
344
|
-
let n = players.length
|
|
345
|
-
player(incomingMessage.fromSerialNumber)
|
|
344
|
+
let n = players.length
|
|
345
|
+
player(incomingMessage.fromSerialNumber)
|
|
346
346
|
// show player number if changed
|
|
347
347
|
if (n != players.length) {
|
|
348
|
-
basic.showNumber(players.length)
|
|
348
|
+
basic.showNumber(players.length)
|
|
349
349
|
}
|
|
350
|
-
break
|
|
350
|
+
break
|
|
351
351
|
case MessageKind.HealthValue:
|
|
352
|
-
let p = player(incomingMessage.fromSerialNumber)
|
|
353
|
-
p.health = incomingMessage.value
|
|
352
|
+
let p = player(incomingMessage.fromSerialNumber)
|
|
353
|
+
p.health = incomingMessage.value
|
|
354
354
|
// check if all infected
|
|
355
355
|
if (allDead())
|
|
356
|
-
gameOver()
|
|
357
|
-
break
|
|
356
|
+
gameOver()
|
|
357
|
+
break
|
|
358
358
|
}
|
|
359
359
|
} else {
|
|
360
360
|
switch (incomingMessage.kind) {
|
|
361
361
|
case MessageKind.GameState:
|
|
362
362
|
// update game state
|
|
363
|
-
state = incomingMessage.value as GameState
|
|
364
|
-
break
|
|
363
|
+
state = incomingMessage.value as GameState
|
|
364
|
+
break
|
|
365
365
|
case MessageKind.InitialInfect:
|
|
366
366
|
if (infectedBy < 0 &&
|
|
367
367
|
incomingMessage.toSerialNumber == control.deviceSerialNumber()) {
|
|
368
368
|
// infected by master
|
|
369
|
-
infectedBy = 0
|
|
370
|
-
infectedTime = input.runningTime()
|
|
371
|
-
health = HealthState.Incubating
|
|
372
|
-
serial.writeLine(`infected ${control.deviceSerialNumber()}`)
|
|
369
|
+
infectedBy = 0 // infected my master
|
|
370
|
+
infectedTime = input.runningTime()
|
|
371
|
+
health = HealthState.Incubating
|
|
372
|
+
serial.writeLine(`infected ${control.deviceSerialNumber()}`)
|
|
373
373
|
}
|
|
374
|
-
break
|
|
374
|
+
break
|
|
375
375
|
case MessageKind.HealthSet:
|
|
376
376
|
if (incomingMessage.toSerialNumber == control.deviceSerialNumber()) {
|
|
377
|
-
const newHealth = incomingMessage.value
|
|
377
|
+
const newHealth = incomingMessage.value
|
|
378
378
|
if (health < newHealth) {
|
|
379
|
-
health = newHealth
|
|
379
|
+
health = newHealth
|
|
380
380
|
}
|
|
381
381
|
}
|
|
382
|
-
break
|
|
382
|
+
break
|
|
383
383
|
case MessageKind.PairConfirmation:
|
|
384
384
|
if (!paired && state == GameState.Pairing &&
|
|
385
385
|
incomingMessage.toSerialNumber == control.deviceSerialNumber()) {
|
|
386
386
|
// paired!
|
|
387
387
|
serial.writeLine(`player paired ==> ${control.deviceSerialNumber()}`)
|
|
388
|
-
playerIcon = incomingMessage.value
|
|
389
|
-
paired = true
|
|
388
|
+
playerIcon = incomingMessage.value
|
|
389
|
+
paired = true
|
|
390
390
|
}
|
|
391
|
-
break
|
|
391
|
+
break
|
|
392
392
|
case MessageKind.TransmitVirus:
|
|
393
393
|
if (state == GameState.Running) {
|
|
394
394
|
if (health == HealthState.Healthy) {
|
|
395
|
-
serial.writeLine(`signal: ${signal}`)
|
|
395
|
+
serial.writeLine(`signal: ${signal}`)
|
|
396
396
|
if (signal > RSSI &&
|
|
397
397
|
randint(0, 100) > TRANSMISSIONPROB) {
|
|
398
|
-
infectedBy = incomingMessage.value
|
|
399
|
-
infectedTime = input.runningTime()
|
|
400
|
-
health = HealthState.Incubating
|
|
398
|
+
infectedBy = incomingMessage.value
|
|
399
|
+
infectedTime = input.runningTime()
|
|
400
|
+
health = HealthState.Incubating
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
403
|
}
|
|
404
|
-
break
|
|
404
|
+
break
|
|
405
405
|
case MessageKind.HealthValue:
|
|
406
406
|
if (health != HealthState.Dead && signal > RSSI) {
|
|
407
|
-
game.addScore(1)
|
|
407
|
+
game.addScore(1)
|
|
408
408
|
}
|
|
409
|
-
break
|
|
409
|
+
break
|
|
410
410
|
}
|
|
411
411
|
}
|
|
412
412
|
})
|
|
413
413
|
|
|
414
414
|
// main game loop
|
|
415
|
-
basic.forever(()
|
|
416
|
-
let message: Message
|
|
415
|
+
basic.forever(function () {
|
|
416
|
+
let message: Message
|
|
417
417
|
if (master) {
|
|
418
418
|
switch (state) {
|
|
419
419
|
case GameState.Pairing:
|
|
420
420
|
// tell each player they are registered
|
|
421
421
|
for (const p of players) {
|
|
422
|
-
message = new Message()
|
|
423
|
-
message.kind = MessageKind.PairConfirmation
|
|
424
|
-
message.value = p.icon
|
|
425
|
-
message.toSerialNumber = p.id
|
|
426
|
-
message.send()
|
|
422
|
+
message = new Message()
|
|
423
|
+
message.kind = MessageKind.PairConfirmation
|
|
424
|
+
message.value = p.icon
|
|
425
|
+
message.toSerialNumber = p.id
|
|
426
|
+
message.send()
|
|
427
427
|
}
|
|
428
|
-
serial.writeLine(`pairing ${players.length} players`)
|
|
429
|
-
basic.pause(500)
|
|
430
|
-
break
|
|
428
|
+
serial.writeLine(`pairing ${players.length} players`)
|
|
429
|
+
basic.pause(500)
|
|
430
|
+
break
|
|
431
431
|
case GameState.Infecting:
|
|
432
432
|
if (patientZero.health == HealthState.Healthy) {
|
|
433
|
-
message = new Message()
|
|
434
|
-
message.kind = MessageKind.InitialInfect
|
|
435
|
-
message.toSerialNumber = patientZero.id
|
|
436
|
-
message.send()
|
|
437
|
-
basic.pause(100)
|
|
433
|
+
message = new Message()
|
|
434
|
+
message.kind = MessageKind.InitialInfect
|
|
435
|
+
message.toSerialNumber = patientZero.id
|
|
436
|
+
message.send()
|
|
437
|
+
basic.pause(100)
|
|
438
438
|
} else {
|
|
439
|
-
serial.writeLine(`patient ${patientZero.id} infected`)
|
|
439
|
+
serial.writeLine(`patient ${patientZero.id} infected`)
|
|
440
440
|
// show startup
|
|
441
|
-
basic.showIcon(GameIcons.Dead)
|
|
442
|
-
state = GameState.Running
|
|
441
|
+
basic.showIcon(GameIcons.Dead)
|
|
442
|
+
state = GameState.Running
|
|
443
443
|
}
|
|
444
|
-
break
|
|
444
|
+
break
|
|
445
445
|
case GameState.Running:
|
|
446
446
|
for (const p of players) {
|
|
447
|
-
message = new Message()
|
|
448
|
-
message.kind = MessageKind.HealthSet
|
|
449
|
-
message.value = p.health
|
|
450
|
-
message.toSerialNumber = p.id
|
|
451
|
-
message.send()
|
|
447
|
+
message = new Message()
|
|
448
|
+
message.kind = MessageKind.HealthSet
|
|
449
|
+
message.value = p.health
|
|
450
|
+
message.toSerialNumber = p.id
|
|
451
|
+
message.send()
|
|
452
452
|
}
|
|
453
|
-
break
|
|
453
|
+
break
|
|
454
454
|
case GameState.Over:
|
|
455
455
|
if (patientZero)
|
|
456
|
-
patientZero.show()
|
|
457
|
-
break
|
|
456
|
+
patientZero.show()
|
|
457
|
+
break
|
|
458
458
|
}
|
|
459
459
|
message = new Message()
|
|
460
|
-
message.kind = MessageKind.GameState
|
|
461
|
-
message.value = state
|
|
462
|
-
message.send()
|
|
460
|
+
message.kind = MessageKind.GameState
|
|
461
|
+
message.value = state
|
|
462
|
+
message.send()
|
|
463
463
|
} else { // player loop
|
|
464
464
|
switch (state) {
|
|
465
465
|
case GameState.Pairing:
|
|
466
466
|
// broadcast player id
|
|
467
467
|
if (playerIcon < 0) {
|
|
468
|
-
message = new Message()
|
|
469
|
-
message.kind = MessageKind.PairRequest
|
|
470
|
-
message.fromSerialNumber = control.deviceSerialNumber()
|
|
471
|
-
message.send()
|
|
468
|
+
message = new Message()
|
|
469
|
+
message.kind = MessageKind.PairRequest
|
|
470
|
+
message.fromSerialNumber = control.deviceSerialNumber()
|
|
471
|
+
message.send()
|
|
472
472
|
} else if (infectedBy > -1) {
|
|
473
|
-
message = new Message()
|
|
474
|
-
message.kind = MessageKind.HealthValue
|
|
475
|
-
message.fromSerialNumber = control.deviceSerialNumber()
|
|
476
|
-
message.value = health
|
|
477
|
-
message.send()
|
|
473
|
+
message = new Message()
|
|
474
|
+
message.kind = MessageKind.HealthValue
|
|
475
|
+
message.fromSerialNumber = control.deviceSerialNumber()
|
|
476
|
+
message.value = health
|
|
477
|
+
message.send()
|
|
478
478
|
}
|
|
479
|
-
break
|
|
479
|
+
break
|
|
480
480
|
case GameState.Infecting:
|
|
481
|
-
message = new Message()
|
|
482
|
-
message.kind = MessageKind.HealthValue
|
|
483
|
-
message.fromSerialNumber = control.deviceSerialNumber()
|
|
484
|
-
message.value = health
|
|
485
|
-
message.send()
|
|
486
|
-
break
|
|
481
|
+
message = new Message()
|
|
482
|
+
message.kind = MessageKind.HealthValue
|
|
483
|
+
message.fromSerialNumber = control.deviceSerialNumber()
|
|
484
|
+
message.value = health
|
|
485
|
+
message.send()
|
|
486
|
+
break
|
|
487
487
|
case GameState.Running:
|
|
488
488
|
// update health status
|
|
489
489
|
if (health != HealthState.Healthy && input.runningTime() - infectedTime > DEATH)
|
|
490
|
-
health = HealthState.Dead
|
|
490
|
+
health = HealthState.Dead
|
|
491
491
|
else if (health != HealthState.Healthy && input.runningTime() - infectedTime > INCUBATION)
|
|
492
|
-
health = HealthState.Sick
|
|
492
|
+
health = HealthState.Sick
|
|
493
493
|
// transmit disease
|
|
494
494
|
if (health == HealthState.Incubating || health == HealthState.Sick) {
|
|
495
|
-
message = new Message()
|
|
496
|
-
message.kind = MessageKind.TransmitVirus
|
|
497
|
-
message.fromSerialNumber = control.deviceSerialNumber()
|
|
498
|
-
message.value = playerIcon
|
|
499
|
-
message.send()
|
|
495
|
+
message = new Message()
|
|
496
|
+
message.kind = MessageKind.TransmitVirus
|
|
497
|
+
message.fromSerialNumber = control.deviceSerialNumber()
|
|
498
|
+
message.value = playerIcon
|
|
499
|
+
message.send()
|
|
500
500
|
}
|
|
501
|
-
message = new Message()
|
|
502
|
-
message.kind = MessageKind.HealthValue
|
|
503
|
-
message.fromSerialNumber = control.deviceSerialNumber()
|
|
504
|
-
message.value = health
|
|
505
|
-
message.send()
|
|
506
|
-
break
|
|
501
|
+
message = new Message()
|
|
502
|
+
message.kind = MessageKind.HealthValue
|
|
503
|
+
message.fromSerialNumber = control.deviceSerialNumber()
|
|
504
|
+
message.value = health
|
|
505
|
+
message.send()
|
|
506
|
+
break
|
|
507
507
|
}
|
|
508
508
|
// show current animation
|
|
509
|
-
gameFace()
|
|
509
|
+
gameFace()
|
|
510
510
|
}
|
|
511
511
|
})
|
|
512
512
|
|