summaryrefslogtreecommitdiff
path: root/packages/frontend/src/utility/clicker-game.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/utility/clicker-game.ts')
-rw-r--r--packages/frontend/src/utility/clicker-game.ts73
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;
+}