diff --git a/res/ui/achievements/hidden.png b/res/ui/achievements/hidden.png new file mode 100644 index 00000000..2c70b25f Binary files /dev/null and b/res/ui/achievements/hidden.png differ diff --git a/src/css/ingame_hud/achievements.scss b/src/css/ingame_hud/achievements.scss index 1e3e4c37..5d2c6b99 100644 --- a/src/css/ingame_hud/achievements.scss +++ b/src/css/ingame_hud/achievements.scss @@ -16,6 +16,10 @@ @include S(height, 85px); grid-template-rows: #{D(20px)} auto; + &.hidden { + display: none; + } + &:last-child { margin-bottom: 0; } diff --git a/src/css/resources.scss b/src/css/resources.scss index 9d0b84c4..976f4fad 100644 --- a/src/css/resources.scss +++ b/src/css/resources.scss @@ -66,8 +66,8 @@ $icons: notification_saved, notification_success, notification_upgrade; } } -$achievements: belt500Tiles, blueprint100k, blueprint1m, completeLvl26, cutShape, darkMode, destroy1000, - irrelevantShape, level100, level50, logoBefore18, mam, mapMarkers15, noBeltUpgradesUntilBp, +$achievements: hidden, belt500Tiles, blueprint100k, blueprint1m, completeLvl26, cutShape, darkMode, + destroy1000, irrelevantShape, level100, level50, logoBefore18, mam, mapMarkers15, noBeltUpgradesUntilBp, noInverseRotater, oldLevel17, openWires, paintShape, place5000Wires, placeBlueprint, placeBp1000, play1h, play10h, play20h, produceLogo, produceMsLogo, produceRocket, rotateShape, speedrunBp30, speedrunBp60, speedrunBp120, stack4Layers, stackShape, store100Unique, storeShape, throughputBp25, throughputBp50, diff --git a/src/js/game/hud/parts/achievements.js b/src/js/game/hud/parts/achievements.js index 7d66a00f..9d7506ee 100644 --- a/src/js/game/hud/parts/achievements.js +++ b/src/js/game/hud/parts/achievements.js @@ -1,6 +1,10 @@ import { InputReceiver } from "../../../core/input_receiver"; import { makeDiv } from "../../../core/utils"; -import { ACHIEVEMENTS, enum_achievement_mappings } from "../../../platform/achievement_provider"; +import { + ACHIEVEMENTS, + enum_achievement_mappings, + HIDDEN_ACHIEVEMENTS, +} from "../../../platform/achievement_provider"; import { T } from "../../../translations"; import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper"; import { BaseHUDPart } from "../base_hud_part"; @@ -60,15 +64,53 @@ export class HUDAchievements extends BaseHUDPart { // Assign handle this.achievementToElements[achievementKey] = handle; } + + const handle = {}; + // Wrapper + handle.hidden = makeDiv(this.contentDiv, null, ["achievement"]); + + // Icon + handle.icon = makeDiv(handle.hidden, null, ["icon"]); + handle.icon.setAttribute("data-icon", "achievements/hidden.png"); + + // Info + handle.info = makeDiv(handle.hidden, null, ["info"]); + + // Title + handle.title = makeDiv(handle.info, null, ["title"], T.achievements.hidden.title); + + // Description + handle.description = makeDiv( + handle.info, + null, + ["description"], + T.achievements.hidden.description.replace("", HIDDEN_ACHIEVEMENTS.length + "") + ); + this.hiddenElement = handle; } renderStatus() { + let hidden = 0; for (const achievementKey in this.achievementToElements) { const handle = this.achievementToElements[achievementKey]; + if (!this.root.achievementProxy.provider.collection.map.get(ACHIEVEMENTS[achievementKey])) { if (!handle.elem.classList.contains("unlocked")) handle.elem.classList.add("unlocked"); - } else if (handle.elem.classList.contains("unlocked")) handle.elem.classList.remove("unlocked"); + if (handle.elem.classList.contains("hidden")) handle.elem.classList.remove("hidden"); + } else { + if (handle.elem.classList.contains("unlocked")) handle.elem.classList.remove("unlocked"); + + if (HIDDEN_ACHIEVEMENTS.includes(ACHIEVEMENTS[achievementKey])) { + if (!handle.elem.classList.contains("hidden")) handle.elem.classList.add("hidden"); + hidden++; + } + } } + + this.hiddenElement.description.innerHTML = T.achievements.hidden.description.replace( + "", + hidden + "" + ); } initialize() { diff --git a/src/js/platform/achievement_provider.js b/src/js/platform/achievement_provider.js index 39918808..d9b7d67d 100644 --- a/src/js/platform/achievement_provider.js +++ b/src/js/platform/achievement_provider.js @@ -58,6 +58,17 @@ export const ACHIEVEMENTS = { upgradesTier8: "upgradesTier8", }; +export const HIDDEN_ACHIEVEMENTS = [ + ACHIEVEMENTS.placeBp1000, + ACHIEVEMENTS.darkMode, + ACHIEVEMENTS.irrelevantShape, + ACHIEVEMENTS.logoBefore18, + ACHIEVEMENTS.mapMarkers15, + ACHIEVEMENTS.produceMsLogo, + ACHIEVEMENTS.belt500Tiles, + ACHIEVEMENTS.oldLevel17, +]; + export const enum_achievement_mappings = { [ACHIEVEMENTS.belt500Tiles]: function () { return { diff --git a/translations/base-en.yaml b/translations/base-en.yaml index ccaada5d..99508410 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -499,6 +499,9 @@ shopUpgrades: # All achievements achievements: + hidden: + title: Hidden achievements + description: You have hidden achievement(s) belt500Tiles: title: I need trains description: Have a belt with a length of 500 tiles