mizzkey/packages/frontend/src/components/MkClickerGame.vue

114 lines
2.5 KiB
Vue
Raw Normal View History

<!--
2024-02-12 11:37:45 +09:00
SPDX-FileCopyrightText: syuilo and misskey-project
SPDX-License-Identifier: AGPL-3.0-only
-->
2023-01-08 17:41:09 +09:00
<template>
2023-10-13 07:26:27 +09:00
<div>
<div v-if="game.ready" :class="$style.game">
<div :class="$style.cps" class="">{{ number(cps) }}cps</div>
<div :class="$style.count" class=""><img :class="[$style.icon,{[$style.dark]:darkMode}]" alt="Cosaque daihuku"
src="https://media.discordapp.net/attachments/1153099592863334431/1162139796647448576/AfovawbDhjHYAAAAAElFTkSuQmCC.png"/>
{{ number(cookies) }}
</div>
<button v-click-anime class="_button" @click="onClick">
<img src="https://cdn.discordapp.com/attachments/1153099592863334431/1160169965568143391/dihk_cossack.gif"
:class="$style.img">
</button>
</div>
<div v-else>
<MkLoading/>
</div>
2023-01-08 17:41:09 +09:00
</div>
</template>
<script lang="ts" setup>
Merge remote-tracking branch 'misskey-original/develop' into develop # Conflicts: # locales/index.d.ts # locales/ja-JP.yml # package.json # packages/backend/src/server/api/endpoints/admin/emoji/copy.ts # packages/backend/src/server/api/endpoints/admin/meta.ts # packages/backend/src/server/api/endpoints/channels/timeline.ts # packages/backend/src/server/api/endpoints/notes/featured.ts # packages/frontend/src/components/MkButton.vue # packages/frontend/src/components/MkClickerGame.vue # packages/frontend/src/components/MkDialog.vue # packages/frontend/src/components/MkDrive.vue # packages/frontend/src/components/MkEmojiEditDialog.vue # packages/frontend/src/components/MkEmojiPicker.section.vue # packages/frontend/src/components/MkEmojiPicker.vue # packages/frontend/src/components/MkFollowButton.vue # packages/frontend/src/components/MkInstanceTicker.vue # packages/frontend/src/components/MkLaunchPad.vue # packages/frontend/src/components/MkMenu.vue # packages/frontend/src/components/MkNote.vue # packages/frontend/src/components/MkNoteSimple.vue # packages/frontend/src/components/MkPostForm.vue # packages/frontend/src/components/MkRadio.vue # packages/frontend/src/components/MkSignupDialog.form.vue # packages/frontend/src/components/MkSwitch.vue # packages/frontend/src/custom-emojis.ts # packages/frontend/src/pages/about.emojis.vue # packages/frontend/src/pages/about.vue # packages/frontend/src/pages/admin/index.vue # packages/frontend/src/pages/admin/other-settings.vue # packages/frontend/src/pages/custom-emojis-manager.vue # packages/frontend/src/pages/settings/general.vue # packages/frontend/src/pages/settings/mute-block.vue # packages/frontend/src/pages/timeline.vue # packages/frontend/src/pages/user/home.vue # packages/frontend/src/pages/user/index.files.vue # packages/frontend/src/scripts/get-note-menu.ts # packages/frontend/src/store.ts # packages/frontend/src/ui/_common_/stream-indicator.vue # packages/frontend/src/ui/classic.sidebar.vue # packages/frontend/src/ui/universal.vue # packages/frontend/src/ui/universal.widgets.vue # packages/frontend/vite.config.ts # packages/misskey-js/etc/misskey-js.api.md # packages/misskey-js/src/api.types.ts # packages/misskey-js/src/entities.ts # packages/misskey-js/src/streaming.types.ts
2023-12-13 07:08:57 +09:00
import {computed, onMounted, onUnmounted, ref } from 'vue';
2023-01-08 17:41:09 +09:00
import MkPlusOneEffect from '@/components/MkPlusOneEffect.vue';
2023-09-19 16:37:43 +09:00
import * as os from '@/os.js';
import { useInterval } from '@/scripts/use-interval.js';
import * as game from '@/scripts/clicker-game.js';
import number from '@/filters/number.js';
2023-10-13 07:26:27 +09:00
import {claimAchievement} from '@/scripts/achievements.js';
import {defaultStore} from "@/store.js";
2023-01-08 17:41:09 +09:00
2023-10-13 07:26:27 +09:00
const darkMode = computed(defaultStore.makeGetterSetter('darkMode'));
2023-01-08 17:41:09 +09:00
const saveData = game.saveData;
const cookies = computed(() => saveData.value?.cookies);
const cps = ref(0);
const prevCookies = ref(0);
2023-01-08 17:41:09 +09:00
function onClick(ev: MouseEvent) {
const x = ev.clientX;
const y = ev.clientY;
os.popup(MkPlusOneEffect, { x, y }, {}, 'end');
2023-01-08 17:41:09 +09:00
saveData.value!.cookies++;
2023-01-08 20:42:45 +09:00
saveData.value!.totalCookies++;
saveData.value!.totalHandmadeCookies++;
2023-01-08 17:41:09 +09:00
saveData.value!.clicked++;
if (cookies.value === 1) {
claimAchievement('cookieClicked');
}
2023-01-08 17:41:09 +09:00
}
2023-01-08 20:30:19 +09:00
useInterval(() => {
const diff = saveData.value!.cookies - prevCookies.value;
cps.value = diff;
prevCookies.value = saveData.value!.cookies;
2023-01-08 20:30:19 +09:00
}, 1000, {
immediate: false,
afterMounted: true,
});
2023-01-08 17:41:09 +09:00
useInterval(game.save, 1000 * 5, {
immediate: false,
afterMounted: true,
});
onMounted(async () => {
await game.load();
prevCookies.value = saveData.value!.cookies;
2023-01-08 17:41:09 +09:00
});
onUnmounted(() => {
game.save();
});
</script>
<style lang="scss" module>
.game {
padding: 16px;
text-align: center;
}
2023-01-08 20:30:19 +09:00
.cps {
position: absolute;
top: 12px;
left: 12px;
opacity: 0.5;
}
2023-01-08 17:41:09 +09:00
.count {
font-size: 1.3em;
margin-bottom: 6px;
}
.img {
max-width: 90px;
}
2023-10-13 07:26:27 +09:00
$color-scheme: var(--color-scheme);
.icon {
width: 1.3em;
vertical-align: -24%;
}
.dark {
filter: invert(1);
}
2023-01-08 17:41:09 +09:00
</style>