diff options
Diffstat (limited to 'packages/frontend/src/utility/clicker-game.ts')
| -rw-r--r-- | packages/frontend/src/utility/clicker-game.ts | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/packages/frontend/src/utility/clicker-game.ts b/packages/frontend/src/utility/clicker-game.ts new file mode 100644 index 0000000000..0544be7757 --- /dev/null +++ b/packages/frontend/src/utility/clicker-game.ts @@ -0,0 +1,73 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { ref, computed } from 'vue'; +import { misskeyApi } from '@/utility/misskey-api.js'; + +type SaveData = { + gameVersion: number; + cookies: number; + totalCookies: number; + totalHandmadeCookies: number; + clicked: number; + achievements: any[]; + facilities: any[]; +}; + +export const saveData = ref<SaveData>(); +export const ready = computed(() => saveData.value != null); + +let prev = ''; + +export async function load() { + try { + saveData.value = await misskeyApi('i/registry/get', { + scope: ['clickerGame'], + key: 'saveData', + }); + } catch (err) { + if (err.code === 'NO_SUCH_KEY') { + saveData.value = { + gameVersion: 2, + cookies: 0, + totalCookies: 0, + totalHandmadeCookies: 0, + clicked: 0, + achievements: [], + facilities: [], + }; + save(); + return; + } + throw err; + } + + // migration + if (saveData.value.gameVersion === 1) { + saveData.value = { + gameVersion: 2, + cookies: saveData.value.cookies, + totalCookies: saveData.value.cookies, + totalHandmadeCookies: saveData.value.cookies, + clicked: saveData.value.clicked, + achievements: [], + facilities: [], + }; + save(); + } +} + +export async function save() { + const current = JSON.stringify(saveData.value); + if (current === prev) return; + + await misskeyApi('i/registry/set', { + scope: ['clickerGame'], + key: 'saveData', + value: saveData.value, + }); + + prev = current; +} |