diff --git a/app/components/Achievements/BottomScreen.vue b/app/components/Achievements/BottomScreen.vue index 96d00d7..04668ce 100644 --- a/app/components/Achievements/BottomScreen.vue +++ b/app/components/Achievements/BottomScreen.vue @@ -46,7 +46,7 @@ onRender((ctx) => { i-- ) { const achievement = ACHIEVEMENTS[i]!; - const isUnlocked = achievementsStore.isUnlocked(achievement); + const isUnlocked = achievementsStore.isUnlocked(achievement.id); const offset = store.getItemOffset(i); if (offset === -ACHIEVEMENTS_LINE_HEIGHT) continue; @@ -60,11 +60,12 @@ onRender((ctx) => { ctx.fillStyle = "#000000"; ctx.fillRect(0, y, LOGICAL_WIDTH, ACHIEVEMENTS_LINE_HEIGHT); - // TODO: draw ??? for secret ones ctx.fillStyle = isUnlocked ? "#ffffff" : "#666666"; drawCheckbox(ctx, ACHIEVEMENTS_X, y, isUnlocked); ctx.fillText( - $t(`achievements.${achievement}`).replace("\n", " "), + achievement.secret && !isUnlocked + ? "???" + : $t(`achievements.${achievement.id}`).replace("\n", " "), ACHIEVEMENTS_X + CHECKBOX_SIZE + CHECKBOX_TEXT_GAP, y, ); diff --git a/app/components/Achievements/TopScreen.vue b/app/components/Achievements/TopScreen.vue index 5a2ee0b..77ddb8f 100644 --- a/app/components/Achievements/TopScreen.vue +++ b/app/components/Achievements/TopScreen.vue @@ -86,7 +86,7 @@ onRender((ctx) => { ctx.font = "7px NDS7"; for (let i = ACHIEVEMENTS_TOP_SCREEN_COUNT - 1; i >= 0; i--) { const achievement = ACHIEVEMENTS[i]!; - const isUnlocked = achievementsStore.isUnlocked(achievement); + const isUnlocked = achievementsStore.isUnlocked(achievement.id); const offset = store.getItemOffset(i); if (offset === -ACHIEVEMENTS_LINE_HEIGHT) continue; @@ -98,11 +98,12 @@ onRender((ctx) => { ctx.fillStyle = "#000000"; ctx.fillRect(0, y, LOGICAL_WIDTH, ACHIEVEMENTS_LINE_HEIGHT); - // TODO: draw ??? for secret ones ctx.fillStyle = isUnlocked ? "#ffffff" : "#666666"; drawCheckbox(ctx, ACHIEVEMENTS_X, y, isUnlocked); ctx.fillText( - $t(`achievements.${achievement}`).replace("\n", " "), + achievement.secret && !isUnlocked + ? "???" + : $t(`achievements.${achievement.id}`).replace("\n", " "), ACHIEVEMENTS_X + CHECKBOX_SIZE + CHECKBOX_TEXT_GAP, y, ); diff --git a/app/pages/index.vue b/app/pages/index.vue index a437a02..b9432c7 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -46,12 +46,12 @@ useKeyDown((key) => { a.reset(); } else if (key === "o") { for (const ach of ACHIEVEMENTS) { - a.unlock(ach); + a.unlock(ach.id); } } else if (key === "p") { for (const ach of ACHIEVEMENTS) { - if (!a.isUnlocked(ach)) { - a.unlock(ach); + if (!a.isUnlocked(ach.id)) { + a.unlock(ach.id); break; } } diff --git a/app/stores/achievements.ts b/app/stores/achievements.ts index afce216..8dd971f 100644 --- a/app/stores/achievements.ts +++ b/app/stores/achievements.ts @@ -3,29 +3,29 @@ import { useLocalStorage } from "@vueuse/core"; const STORAGE_ID = "achievements"; export const ACHIEVEMENTS = [ - "boot", + { id: "boot", secret: false }, // projects - "projects_visit", - "projects_view_5", - "projects_open_link", + { id: "projects_visit", secret: false }, + { id: "projects_view_5", secret: false }, + { id: "projects_open_link", secret: false }, // gallery - "gallery_visit", + { id: "gallery_visit", secret: false }, // contact - "contact_visit", - "contact_git_visit", + { id: "contact_visit", secret: false }, + { id: "contact_git_visit", secret: false }, // settings - "settings_color_change", + { id: "settings_color_change", secret: false }, // snake - "snake_play", - "snake_score_40", + { id: "snake_play", secret: false }, + { id: "snake_score_40", secret: false }, // secrets - "settings_color_try_all", - "settings_language_try_all", - "settings_visit_all", - "contact_36_notifications", + { id: "settings_color_try_all", secret: true }, + { id: "settings_language_try_all", secret: true }, + { id: "settings_visit_all", secret: true }, + { id: "contact_36_notifications", secret: true }, ] as const; -export type Achievement = (typeof ACHIEVEMENTS)[number]; +export type Achievement = (typeof ACHIEVEMENTS)[number]["id"]; export const useAchievementsStore = defineStore("achievements", () => { const app = useAppStore();