From 091ffd10316cf695b7744f5d2e72b1d2d56f8cb8 Mon Sep 17 00:00:00 2001 From: tobspr Date: Tue, 22 Sep 2020 19:31:40 +0200 Subject: [PATCH] Make chained miner default and the only option after unlocking it --- src/js/game/buildings/miner.js | 156 +++++++++--------- .../game/hud/parts/building_placer_logic.js | 22 ++- 2 files changed, 94 insertions(+), 84 deletions(-) diff --git a/src/js/game/buildings/miner.js b/src/js/game/buildings/miner.js index 1a9c97ff..13e4f1f5 100644 --- a/src/js/game/buildings/miner.js +++ b/src/js/game/buildings/miner.js @@ -1,78 +1,78 @@ -import { enumDirection, Vector } from "../../core/vector"; -import { ItemEjectorComponent } from "../components/item_ejector"; -import { MinerComponent } from "../components/miner"; -import { Entity } from "../entity"; -import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; -import { GameRoot } from "../root"; -import { enumHubGoalRewards } from "../tutorial_goals"; -import { T } from "../../translations"; -import { formatItemsPerSecond } from "../../core/utils"; - -/** @enum {string} */ -export const enumMinerVariants = { chainable: "chainable" }; - -const overlayMatrix = [1, 1, 1, 1, 0, 1, 1, 1, 1]; - -export class MetaMinerBuilding extends MetaBuilding { - constructor() { - super("miner"); - } - - getSilhouetteColor() { - return "#b37dcd"; - } - - /** - * @param {GameRoot} root - * @param {string} variant - * @returns {Array<[string, string]>} - */ - getAdditionalStatistics(root, variant) { - const speed = root.hubGoals.getMinerBaseSpeed(); - return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]]; - } - - /** - * - * @param {GameRoot} root - */ - getAvailableVariants(root) { - if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_miner_chainable)) { - return [defaultBuildingVariant, enumMinerVariants.chainable]; - } - return super.getAvailableVariants(root); - } - - /** - * @param {number} rotation - * @param {number} rotationVariant - * @param {string} variant - * @param {Entity} entity - */ - getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) { - return overlayMatrix; - } - - /** - * Creates the entity at the given location - * @param {Entity} entity - */ - setupEntityComponents(entity) { - entity.addComponent(new MinerComponent({})); - entity.addComponent( - new ItemEjectorComponent({ - slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], - }) - ); - } - - /** - * - * @param {Entity} entity - * @param {number} rotationVariant - * @param {string} variant - */ - updateVariants(entity, rotationVariant, variant) { - entity.components.Miner.chainable = variant === enumMinerVariants.chainable; - } -} +import { enumDirection, Vector } from "../../core/vector"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { MinerComponent } from "../components/miner"; +import { Entity } from "../entity"; +import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; +import { T } from "../../translations"; +import { formatItemsPerSecond } from "../../core/utils"; + +/** @enum {string} */ +export const enumMinerVariants = { chainable: "chainable" }; + +const overlayMatrix = [1, 1, 1, 1, 0, 1, 1, 1, 1]; + +export class MetaMinerBuilding extends MetaBuilding { + constructor() { + super("miner"); + } + + getSilhouetteColor() { + return "#b37dcd"; + } + + /** + * @param {GameRoot} root + * @param {string} variant + * @returns {Array<[string, string]>} + */ + getAdditionalStatistics(root, variant) { + const speed = root.hubGoals.getMinerBaseSpeed(); + return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]]; + } + + /** + * + * @param {GameRoot} root + */ + getAvailableVariants(root) { + if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_miner_chainable)) { + return [enumMinerVariants.chainable]; + } + return super.getAvailableVariants(root); + } + + /** + * @param {number} rotation + * @param {number} rotationVariant + * @param {string} variant + * @param {Entity} entity + */ + getSpecialOverlayRenderMatrix(rotation, rotationVariant, variant, entity) { + return overlayMatrix; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent(new MinerComponent({})); + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }], + }) + ); + } + + /** + * + * @param {Entity} entity + * @param {number} rotationVariant + * @param {string} variant + */ + updateVariants(entity, rotationVariant, variant) { + entity.components.Miner.chainable = variant === enumMinerVariants.chainable; + } +} diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js index 8e8e72c3..8d5713ea 100644 --- a/src/js/game/hud/parts/building_placer_logic.js +++ b/src/js/game/hud/parts/building_placer_logic.js @@ -457,11 +457,11 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { this.currentVariant.set(defaultBuildingVariant); } else { const availableVariants = metaBuilding.getAvailableVariants(this.root); - const index = availableVariants.indexOf(this.currentVariant.get()); - assert( - index >= 0, - "Current variant was invalid: " + this.currentVariant.get() + " out of " + availableVariants - ); + let index = availableVariants.indexOf(this.currentVariant.get()); + if (index < 0) { + index = 0; + console.warn("Invalid variant selected:", this.currentVariant.get()); + } const newIndex = (index + 1) % availableVariants.length; const newVariant = availableVariants[newIndex]; this.setVariant(newVariant); @@ -595,7 +595,17 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { this.abortDragging(); this.root.hud.signals.selectedPlacementBuildingChanged.dispatch(metaBuilding); if (metaBuilding) { - const variant = this.preferredVariants[metaBuilding.getId()] || defaultBuildingVariant; + const availableVariants = metaBuilding.getAvailableVariants(this.root); + const preferredVariant = this.preferredVariants[metaBuilding.getId()]; + + // Choose last stored variant if possible, otherwise the default one + let variant; + if (!preferredVariant || !availableVariants.includes(preferredVariant)) { + variant = availableVariants[0]; + } else { + variant = preferredVariant; + } + this.currentVariant.set(variant); this.fakeEntity = new Entity(null);