[verified] Snake 0.7: queued controls, records, pause and wrap mode
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
// Vela storage callbacks return raw strings, not { data } wrappers.
|
||||
// https://iot.mi.com/vela/quickapp/en/features/data/storage.html
|
||||
function createStore(storage) {
|
||||
let value = 0
|
||||
let saved = 0
|
||||
let loaded = false
|
||||
let reading = false
|
||||
let writing = false
|
||||
let listener = null
|
||||
function notify() { if (listener) listener(value) }
|
||||
function flush() {
|
||||
if (!loaded || writing || value <= saved) return
|
||||
writing = true
|
||||
const target = value
|
||||
let settled = false
|
||||
const fail = () => { if (!settled) { settled = true; writing = false } }
|
||||
try {
|
||||
storage.set({ key: 'snake.best', value: String(target), success() {
|
||||
if (settled) return
|
||||
settled = true
|
||||
writing = false
|
||||
saved = target
|
||||
flush()
|
||||
}, fail })
|
||||
} catch (e) { fail() }
|
||||
}
|
||||
function sync() {
|
||||
if (loaded) { flush(); return }
|
||||
if (reading) return
|
||||
reading = true
|
||||
let settled = false
|
||||
const fail = () => { if (!settled) { settled = true; reading = false } }
|
||||
try {
|
||||
storage.get({ key: 'snake.best', default: '0', success(raw) {
|
||||
if (settled) return
|
||||
settled = true
|
||||
reading = false
|
||||
const n = Number(raw)
|
||||
saved = Number.isInteger(n) && n >= 0 && n <= 253 ? n : 0
|
||||
value = Math.max(value, saved)
|
||||
loaded = true
|
||||
notify()
|
||||
flush()
|
||||
}, fail })
|
||||
} catch (e) { fail() }
|
||||
}
|
||||
return {
|
||||
subscribe(fn) { listener = fn; notify() },
|
||||
record(score) { value = Math.max(value, score); notify(); sync() },
|
||||
sync
|
||||
}
|
||||
}
|
||||
// One coordinator per native storage module, retained across page recreation.
|
||||
let sharedAPI
|
||||
let sharedStore
|
||||
function getStore(storage) {
|
||||
if (storage !== sharedAPI) {
|
||||
sharedAPI = storage
|
||||
sharedStore = createStore(storage)
|
||||
}
|
||||
return sharedStore
|
||||
}
|
||||
module.exports = { getStore }
|
||||
Reference in New Issue
Block a user