From 454a844d2832712b70a26eb8997b5a14fa14572b Mon Sep 17 00:00:00 2001 From: Greg Considine Date: Wed, 10 Mar 2021 11:37:46 -0500 Subject: [PATCH] [WIP] Fix achievements with unlock attempt on init. Fix lint --- src/js/game/blueprint.js | 6 ++- src/js/game/buildings/trash.js | 4 +- src/js/globals.d.ts | 2 +- src/js/platform/achievement_provider.js | 47 +++++++++++++------ .../electron/steam_achievement_provider.js | 23 ++++----- src/js/platform/electron/wrapper.js | 14 +++--- 6 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/js/game/blueprint.js b/src/js/game/blueprint.js index 9512adc5..3aaef831 100644 --- a/src/js/game/blueprint.js +++ b/src/js/game/blueprint.js @@ -165,8 +165,10 @@ export class Blueprint { } root.signals.bulkAchievementCheck.dispatch( - ACHIEVEMENTS.placeBlueprint, count, - ACHIEVEMENTS.placeBp1000, count + ACHIEVEMENTS.placeBlueprint, + count, + ACHIEVEMENTS.placeBp1000, + count ); return count !== 0; diff --git a/src/js/game/buildings/trash.js b/src/js/game/buildings/trash.js index c8f11f9b..0ad5bfd7 100644 --- a/src/js/game/buildings/trash.js +++ b/src/js/game/buildings/trash.js @@ -43,7 +43,7 @@ export class MetaTrashBuilding extends MetaBuilding { return; } - const itemProcessor = entity.components.ItemProcessor + const itemProcessor = entity.components.ItemProcessor; const tryTakeItem = itemProcessor.tryTakeItem.bind(itemProcessor); itemProcessor.tryTakeItem = () => { @@ -54,7 +54,7 @@ export class MetaTrashBuilding extends MetaBuilding { } return taken; - } + }; } /** diff --git a/src/js/globals.d.ts b/src/js/globals.d.ts index 4a903437..d1fb5305 100644 --- a/src/js/globals.d.ts +++ b/src/js/globals.d.ts @@ -19,7 +19,7 @@ declare const G_BUILD_VERSION: string; declare const G_ALL_UI_IMAGES: Array; declare const G_IS_RELEASE: boolean; -declare const G_CHINA_VERSION : boolean; +declare const G_CHINA_VERSION: boolean; // Polyfills declare interface String { diff --git a/src/js/platform/achievement_provider.js b/src/js/platform/achievement_provider.js index 5d7f94bc..036ba197 100644 --- a/src/js/platform/achievement_provider.js +++ b/src/js/platform/achievement_provider.js @@ -2,11 +2,11 @@ import { Application } from "../application"; import { Entity } from "../game/entity"; import { GameRoot } from "../game/root"; -import { ShapeDefinition } from "../game/shape_definition"; import { THEMES } from "../game/theme"; /* typehints:end */ import { enumAnalyticsDataSource } from "../game/production_analytics"; +import { ShapeDefinition } from "../game/shape_definition"; import { ShapeItem } from "../game/items/shape_item"; import { globalConfig } from "../core/config"; @@ -171,14 +171,8 @@ export class AchievementCollection { isValid: this.isBelt500TilesValid, signal: "entityAdded", }); - this.add(ACHIEVEMENTS.blueprint100k, { - isValid: this.isBlueprint100kValid, - signal: "shapeDelivered", - }); - this.add(ACHIEVEMENTS.blueprint1m, { - isValid: this.isBlueprint1mValid, - signal: "shapeDelivered", - }); + this.add(ACHIEVEMENTS.blueprint100k, this.createBlueprintOptions(100000)); + this.add(ACHIEVEMENTS.blueprint1m, this.createBlueprintOptions(1000000)); this.add(ACHIEVEMENTS.completeLvl26, this.createLevelOptions(26)); this.add(ACHIEVEMENTS.cutShape); this.add(ACHIEVEMENTS.darkMode, { @@ -271,14 +265,14 @@ export class AchievementCollection { this.root.signals.bulkAchievementCheck.add(this.bulkUnlock, this); for (let [key, achievement] of this.map.entries()) { - if (achievement.init) { - achievement.init(); - } - if (achievement.signal) { achievement.receiver = this.unlock.bind(this, key); this.root.signals[achievement.signal].add(achievement.receiver); } + + if (achievement.init) { + achievement.init(); + } } if (!this.hasDefaultReceivers()) { @@ -419,8 +413,18 @@ export class AchievementCollection { return item.getItemType() === ITEM_SHAPE && item.definition.getHash() === shape; } + createBlueprintOptions(count) { + return { + init: ({ key }) => this.unlock(key, ShapeDefinition.fromShortKey(SHAPE_BP)), + isValid: definition => + definition.cachedHash === SHAPE_BP && this.root.hubGoals.storedShapes[SHAPE_BP] >= count, + signal: "shapeDelivered", + }; + } + createLevelOptions(level) { return { + init: ({ key }) => this.unlock(key, this.root.hubGoals.level), isValid: currentLevel => currentLevel >= level, signal: "storyGoalCompleted", }; @@ -463,6 +467,7 @@ export class AchievementCollection { createUpgradeOptions(tier) { return { + init: ({ key }) => this.unlock(key), isValid: () => this.hasAllUpgradesAtLeastAtTier(tier), signal: "upgradePurchased", }; @@ -518,6 +523,13 @@ export class AchievementCollection { return true; } + /** @param {Achievement} achievement */ + initLogoBefore18({ key }) { + const item = new ShapeItem(ShapeDefinition.fromShortKey(SHAPE_LOGO)); + + this.unlock(key, item); + } + /** @param {ShapeItem} item @returns {boolean} */ isLogoBefore18Valid(item) { return this.root.hubGoals.level < 18 && this.isShape(item, SHAPE_LOGO); @@ -595,6 +607,11 @@ export class AchievementCollection { return item.getItemType() === ITEM_SHAPE && item.definition.layers.length === 4; } + /** @param {Achievement} achievement */ + initStore100Unique({ key }) { + this.unlock(key); + } + /** @returns {boolean} */ isStore100UniqueValid() { return Object.keys(this.root.hubGoals.storedShapes).length >= 100; @@ -617,8 +634,10 @@ export class AchievementCollection { return false; } - initTrash1000() { + /** @param {Achievement} achievement */ + initTrash1000({ key }) { if (Number(this.root.savegame.currentData.stats.trashedCount)) { + this.unlock(key, 0); return; } diff --git a/src/js/platform/electron/steam_achievement_provider.js b/src/js/platform/electron/steam_achievement_provider.js index c78453cb..f99205e6 100644 --- a/src/js/platform/electron/steam_achievement_provider.js +++ b/src/js/platform/electron/steam_achievement_provider.js @@ -5,11 +5,7 @@ import { GameRoot } from "../../game/root"; import { createLogger } from "../../core/logging"; import { getIPCRenderer } from "../../core/utils"; -import { - ACHIEVEMENTS, - AchievementCollection, - AchievementProviderInterface -} from "../achievement_provider"; +import { ACHIEVEMENTS, AchievementCollection, AchievementProviderInterface } from "../achievement_provider"; const logger = createLogger("achievements/steam"); @@ -111,16 +107,15 @@ export class SteamAchievementProvider extends AchievementProviderInterface { this.ipc = getIPCRenderer(); - return this.ipc.invoke("steam:is-initialized") - .then(initialized => { - this.initialized = initialized; + return this.ipc.invoke("steam:is-initialized").then(initialized => { + this.initialized = initialized; - if (!this.initialized) { - logger.warn("Steam failed to intialize. Achievements won't sync."); - } else { - logger.log("Steam achievement provider initialized"); - } - }); + if (!this.initialized) { + logger.warn("Steam failed to intialize. Achievements won't sync."); + } else { + logger.log("Steam achievement provider initialized"); + } + }); } /** diff --git a/src/js/platform/electron/wrapper.js b/src/js/platform/electron/wrapper.js index c807315f..501b7258 100644 --- a/src/js/platform/electron/wrapper.js +++ b/src/js/platform/electron/wrapper.js @@ -23,8 +23,9 @@ export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser { this.app.storage = new StorageImplElectron(this); this.app.achievementProvider = new SteamAchievementProvider(this.app); - return this.initializeAchievementProvider() - .then(() => PlatformWrapperInterface.prototype.initialize.call(this)); + return this.initializeAchievementProvider().then(() => + PlatformWrapperInterface.prototype.initialize.call(this) + ); } steamOverlayFixRedrawCanvas() { @@ -58,12 +59,11 @@ export class PlatformWrapperImplElectron extends PlatformWrapperImplBrowser { } initializeAchievementProvider() { - return this.app.achievementProvider.initialize() - .catch(err => { - logger.error("Failed to initialize achievement provider, disabling:", err); + return this.app.achievementProvider.initialize().catch(err => { + logger.error("Failed to initialize achievement provider, disabling:", err); - this.app.achievementProvider = new NoAchievementProvider(this.app); - }); + this.app.achievementProvider = new NoAchievementProvider(this.app); + }); } getSupportsFullscreen() {