diff --git a/app/components/Common/AchievementNotification.vue b/app/components/Common/AchievementNotification.vue
new file mode 100644
index 0000000..791ebed
--- /dev/null
+++ b/app/components/Common/AchievementNotification.vue
@@ -0,0 +1,99 @@
+
diff --git a/app/components/Contact/BottomScreen/BottomScreen.vue b/app/components/Contact/BottomScreen/BottomScreen.vue
index 9d3fff7..4c398fb 100644
--- a/app/components/Contact/BottomScreen/BottomScreen.vue
+++ b/app/components/Contact/BottomScreen/BottomScreen.vue
@@ -6,6 +6,7 @@ import Buttons from "./Buttons.vue";
import ButtonSelector from "~/components/Common/ButtonSelector.vue";
const store = useContactStore();
+const achievements = useAchievementsStore();
const confirmationModal = useConfirmationModal();
const ACTIONS = {
@@ -65,6 +66,12 @@ const actionateButton = async (button: (typeof selected)["value"]) => {
store.pushNotification(`${verb} opened`);
await sleep(100);
await navigateTo(content, { open: { target: "_blank " } });
+
+ await sleep(500);
+
+ if (button === "github") {
+ achievements.unlock("contact_git_visit");
+ }
},
});
}
diff --git a/app/components/Settings/BottomScreen/Menus/Options/Language.vue b/app/components/Settings/BottomScreen/Menus/Options/Language.vue
index 4d2f897..79f7a5f 100644
--- a/app/components/Settings/BottomScreen/Menus/Options/Language.vue
+++ b/app/components/Settings/BottomScreen/Menus/Options/Language.vue
@@ -2,6 +2,7 @@
const { locales, locale, setLocale } = useI18n();
const store = useSettingsStore();
const confirmationModal = useConfirmationModal();
+const achievements = useAchievementsStore();
const { assets } = useAssets();
const { onRender } = useScreen();
@@ -74,6 +75,13 @@ const handleConfirm = () => {
setLocale(selectedLocale.code);
+ if (!achievements.advancement.languages.includes(selectedLocale.code)) {
+ achievements.advancement.languages.push(selectedLocale.code);
+ if (achievements.advancement.languages.length === locales.value.length) {
+ achievements.unlock("settings_language_try_all");
+ }
+ }
+
confirmationModal.open({
text: $t(
"settings.options.language.confirmation",
diff --git a/app/components/Settings/BottomScreen/Menus/User/Color.vue b/app/components/Settings/BottomScreen/Menus/User/Color.vue
index f12f6b6..5a16cd5 100644
--- a/app/components/Settings/BottomScreen/Menus/User/Color.vue
+++ b/app/components/Settings/BottomScreen/Menus/User/Color.vue
@@ -5,6 +5,7 @@ const app = useAppStore();
const store = useSettingsStore();
const { assets } = useAssets();
const confirmationModal = useConfirmationModal();
+const achievements = useAchievementsStore();
const GRID_SIZE = 4;
const GRID_START_X = 32;
@@ -15,6 +16,7 @@ const ANIMATION_SPEED = 475;
const originalSelectedCol = app.color.col;
const originalSelectedRow = app.color.row;
+const originalColor = app.color.hex;
let selectedCol = app.color.col;
let selectedRow = app.color.row;
@@ -108,6 +110,18 @@ const handleCancel = () => {
const handleConfirm = () => {
app.save();
+
+ if (app.color.hex !== originalColor) {
+ achievements.unlock("settings_color_change");
+ }
+
+ if (!achievements.advancement.colors.includes(app.color.hex)) {
+ achievements.advancement.colors.push(app.color.hex);
+ if (achievements.advancement.colors.length === APP_COLORS.flat().length) {
+ achievements.unlock("settings_color_try_all");
+ }
+ }
+
confirmationModal.open({
text: $t("settings.user.color.confirmation"),
onClosed: () => store.closeSubMenu(),
diff --git a/app/components/Settings/BottomScreen/Menus/User/PersonalMessage.vue b/app/components/Settings/BottomScreen/Menus/User/PersonalMessage.vue
index 42d9f5e..bb2d6fd 100644
--- a/app/components/Settings/BottomScreen/Menus/User/PersonalMessage.vue
+++ b/app/components/Settings/BottomScreen/Menus/User/PersonalMessage.vue
@@ -3,6 +3,7 @@ import * as THREE from "three";
import { useIntervalFn, useLocalStorage } from "@vueuse/core";
const store = useSettingsStore();
+const achievements = useAchievementsStore();
const confirmationModal = useConfirmationModal();
const { onRender } = useScreen();
@@ -56,7 +57,11 @@ const handleConfirm = () => {
break;
}
- case "waiting":
+ case "waiting": {
+ achievements.unlock("snake_play");
+ spawn();
+ break;
+ }
case "dead": {
spawn();
break;
@@ -101,6 +106,10 @@ const eat = () => {
highScore.value = Math.max(highScore.value, score);
food.copy(randomFoodPos());
score += 1;
+
+ if (score === 40) {
+ achievements.unlock("snake_score_40");
+ }
};
const die = () => {
diff --git a/app/pages/index.vue b/app/pages/index.vue
index c69bd4a..59d8fc5 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -76,6 +76,8 @@ useKeyUp((key) => {