From dc6b1152ee058ec1b6d1d62e1e993273f44213c6 Mon Sep 17 00:00:00 2001 From: Bjorn Stromberg Date: Mon, 3 Aug 2020 23:48:26 +0900 Subject: [PATCH] Remove enumLayer and enumItemType --- src/js/game/base_item.js | 39 +++++------ src/js/game/belt_path.js | 8 ++- src/js/game/blueprint.js | 10 ++- src/js/game/buildings/advanced_processor.js | 13 ++-- src/js/game/buildings/belt_base.js | 10 ++- src/js/game/buildings/cutter.js | 3 +- src/js/game/buildings/energy_generator.js | 16 +++-- src/js/game/buildings/hub.js | 29 ++++----- src/js/game/buildings/mixer.js | 5 +- src/js/game/buildings/painter.js | 25 ++++---- src/js/game/buildings/rotater.js | 3 +- src/js/game/buildings/splitter.js | 11 ++-- src/js/game/buildings/stacker.js | 5 +- src/js/game/buildings/underground_belt.js | 7 +- src/js/game/buildings/wire_base.js | 4 +- src/js/game/buildings/wire_crossings.js | 18 +++--- src/js/game/components/belt.js | 15 +++-- src/js/game/components/energy_consumer.js | 12 ++-- src/js/game/components/energy_generator.js | 4 +- src/js/game/components/item_acceptor.js | 64 ++++++++++--------- src/js/game/components/item_ejector.js | 20 +++--- src/js/game/components/storage.js | 6 +- src/js/game/components/underground_belt.js | 6 +- src/js/game/core.js | 22 ++++--- src/js/game/entity.js | 12 +++- src/js/game/game_system_with_filter.js | 9 ++- src/js/game/hub_goals.js | 10 ++- src/js/game/hud/parts/blueprint_placer.js | 7 +- src/js/game/hud/parts/building_placer.js | 14 ++-- .../game/hud/parts/building_placer_logic.js | 11 ++-- src/js/game/hud/parts/buildings_toolbar.js | 3 +- src/js/game/hud/parts/color_blind_helper.js | 10 ++- src/js/game/hud/parts/wires_overlay.js | 9 ++- src/js/game/hud/parts/wires_toolbar.js | 3 +- src/js/game/hud/trailer_maker.js | 7 +- src/js/game/items/color_item.js | 5 +- src/js/game/items/negative_energy_item.js | 5 +- src/js/game/items/positive_energy_item.js | 5 +- src/js/game/items/shape_item.js | 5 +- src/js/game/logic.js | 16 ++--- src/js/game/map.js | 14 ++-- src/js/game/map_chunk.js | 16 +++-- src/js/game/meta_building.js | 10 ++- src/js/game/production_analytics.js | 4 +- src/js/game/root.js | 19 ++---- src/js/game/systems/belt.js | 11 ++-- src/js/game/systems/energy_consumer.js | 9 +-- src/js/game/systems/item_acceptor.js | 13 ++-- src/js/game/systems/item_ejector.js | 11 ++-- src/js/game/systems/item_processor.js | 6 +- src/js/game/systems/miner.js | 3 +- src/js/game/systems/static_map_entity.js | 1 - src/js/game/systems/storage.js | 3 +- src/js/game/systems/underground_belt.js | 3 +- src/js/game/systems/wired_pins.js | 7 +- src/js/savegame/serialization_data_types.js | 2 +- src/js/savegame/serializer_internal.js | 4 +- 57 files changed, 337 insertions(+), 285 deletions(-) diff --git a/src/js/game/base_item.js b/src/js/game/base_item.js index d0da5fa1..be8d7143 100644 --- a/src/js/game/base_item.js +++ b/src/js/game/base_item.js @@ -1,35 +1,28 @@ import { DrawParameters } from "../core/draw_parameters"; import { BasicSerializableObject } from "../savegame/serialization"; -import { enumLayer } from "./root"; -/** @enum {string} */ -export const enumItemType = { - shape: "shape", - color: "color", - positiveEnergy: "positiveEnergy", - negativeEnergy: "negativeEnergy", +/** + * @typedef {import("./root").Layer} Layer + * + * @typedef {"shape" | "color" | "positiveEnergy" | "negativeEnergy" | "genericEnergy"} ItemType + */ - // Can be used for filters - genericEnergy: "genericEnergy", -}; +/** @type {ItemType[]} **/ +export const itemTypes = ["shape", "color", "positiveEnergy", "negativeEnergy", "genericEnergy"]; -/** @enum {enumLayer} */ -export const enumItemTypeToLayer = { - [enumItemType.shape]: enumLayer.regular, - [enumItemType.color]: enumLayer.regular, - [enumItemType.positiveEnergy]: enumLayer.wires, - [enumItemType.negativeEnergy]: enumLayer.wires, - [enumItemType.genericEnergy]: enumLayer.wires, +/** @type {Record} **/ +export const itemTypeLayerMap = { + shape: "regular", + color: "regular", + positiveEnergy: "wires", + negativeEnergy: "wires", + genericEnergy: "wires", }; /** * Class for items on belts etc. Not an entity for performance reasons */ export class BaseItem extends BasicSerializableObject { - constructor() { - super(); - } - static getId() { return "base_item"; } @@ -39,10 +32,10 @@ export class BaseItem extends BasicSerializableObject { return {}; } - /** @returns {enumItemType} */ + /** @abstract @returns {ItemType} **/ getItemType() { abstract; - return ""; + return "shape"; } /** diff --git a/src/js/game/belt_path.js b/src/js/game/belt_path.js index 0b6da48c..6bfd2a8d 100644 --- a/src/js/game/belt_path.js +++ b/src/js/game/belt_path.js @@ -5,11 +5,15 @@ import { epsilonCompare, round4Digits } from "../core/utils"; import { Vector } from "../core/vector"; import { BaseItem } from "./base_item"; import { Entity } from "./entity"; -import { GameRoot, enumLayer } from "./root"; import { Rectangle } from "../core/rectangle"; import { BasicSerializableObject, types } from "../savegame/serialization"; import { gItemRegistry } from "../core/global_registries"; +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + **/ + const logger = createLogger("belt_path"); // Helpers for more semantic access into interleaved arrays @@ -127,7 +131,7 @@ export class BeltPath extends BasicSerializableObject { /** * Returns the layer of the this path - * @returns {enumLayer} + * @returns {Layer} */ getLayer() { return this.entityPath[0].layer; diff --git a/src/js/game/blueprint.js b/src/js/game/blueprint.js index e1ac2dec..daffb913 100644 --- a/src/js/game/blueprint.js +++ b/src/js/game/blueprint.js @@ -3,11 +3,15 @@ import { Loader } from "../core/loader"; import { createLogger } from "../core/logging"; import { Vector } from "../core/vector"; import { Entity } from "./entity"; -import { GameRoot, enumLayer } from "./root"; import { findNiceIntegerValue } from "../core/utils"; import { blueprintShape } from "./upgrades"; import { globalConfig } from "../core/config"; +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + **/ + const logger = createLogger("blueprint"); export class Blueprint { @@ -20,11 +24,11 @@ export class Blueprint { /** * Returns the layer of this blueprint - * @returns {enumLayer} + * @returns {Layer} */ get layer() { if (this.entities.length === 0) { - return enumLayer.regular; + return "regular"; } return this.entities[0].layer; } diff --git a/src/js/game/buildings/advanced_processor.js b/src/js/game/buildings/advanced_processor.js index a688c878..98449993 100644 --- a/src/js/game/buildings/advanced_processor.js +++ b/src/js/game/buildings/advanced_processor.js @@ -1,7 +1,6 @@ import { formatItemsPerSecond } from "../../core/utils"; import { enumDirection, Vector } from "../../core/vector"; import { T } from "../../translations"; -import { enumItemType } from "../base_item"; import { EnergyConsumerComponent } from "../components/energy_consumer"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { ItemEjectorComponent } from "../components/item_ejector"; @@ -9,7 +8,11 @@ import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/it import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; import { Entity } from "../entity"; import { MetaBuilding } from "../meta_building"; -import { enumLayer, GameRoot } from "../root"; + +/** + * @typedef {import("../root").GameRoot} GameRoot + * @typedef {import("../root").Layer} Layer + */ export class MetaAdvancedProcessorBuilding extends MetaBuilding { constructor() { @@ -58,7 +61,7 @@ export class MetaAdvancedProcessorBuilding extends MetaBuilding { new ItemEjectorComponent({ slots: [ { pos: new Vector(1, 0), direction: enumDirection.right }, - { pos: new Vector(1, 0), direction: enumDirection.top, layer: enumLayer.wires }, + { pos: new Vector(1, 0), direction: enumDirection.top, layer: "wires" }, ], }) ); @@ -98,8 +101,8 @@ export class MetaAdvancedProcessorBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.top], - filter: enumItemType.positiveEnergy, - layer: enumLayer.wires, + filter: "positiveEnergy", + layer: "wires", }, ], }) diff --git a/src/js/game/buildings/belt_base.js b/src/js/game/buildings/belt_base.js index a87589a3..2c12aeb5 100644 --- a/src/js/game/buildings/belt_base.js +++ b/src/js/game/buildings/belt_base.js @@ -8,7 +8,11 @@ import { ItemEjectorComponent } from "../components/item_ejector"; import { ReplaceableMapEntityComponent } from "../components/replaceable_map_entity"; import { Entity } from "../entity"; import { MetaBuilding } from "../meta_building"; -import { GameRoot, enumLayer } from "../root"; + +/** + * @typedef {import("../root").GameRoot} GameRoot + * @typedef {import("../root").Layer} Layer + */ export const arrayBeltVariantToRotation = [enumDirection.top, enumDirection.left, enumDirection.right]; @@ -23,7 +27,7 @@ export class MetaBeltBaseBuilding extends MetaBuilding { * @returns {Array<[string, string]>} */ getAdditionalStatistics(root, variant) { - const beltSpeed = root.hubGoals.getBeltBaseSpeed(enumLayer.regular); + const beltSpeed = root.hubGoals.getBeltBaseSpeed("regular"); return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(beltSpeed)]]; } @@ -100,7 +104,7 @@ export class MetaBeltBaseBuilding extends MetaBuilding { * @param {Vector} param0.tile * @param {number} param0.rotation * @param {string} param0.variant - * @param {string} param0.layer + * @param {Layer} param0.layer * @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array }} */ computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) { diff --git a/src/js/game/buildings/cutter.js b/src/js/game/buildings/cutter.js index bfe142d5..739f4a05 100644 --- a/src/js/game/buildings/cutter.js +++ b/src/js/game/buildings/cutter.js @@ -8,7 +8,6 @@ import { Entity } from "../entity"; import { defaultBuildingVariant, MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; import { enumHubGoalRewards } from "../tutorial_goals"; -import { enumItemType } from "../base_item"; /** @enum {string} */ export const enumCutterVariants = { quad: "quad" }; @@ -82,7 +81,7 @@ export class MetaCutterBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, ], }) diff --git a/src/js/game/buildings/energy_generator.js b/src/js/game/buildings/energy_generator.js index 1d7ac18b..3ff710e8 100644 --- a/src/js/game/buildings/energy_generator.js +++ b/src/js/game/buildings/energy_generator.js @@ -1,14 +1,16 @@ import { enumDirection, Vector } from "../../core/vector"; -import { enumItemType } from "../base_item"; import { EnergyGeneratorComponent } from "../components/energy_generator"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { ItemEjectorComponent } from "../components/item_ejector"; import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; import { Entity } from "../entity"; import { MetaBuilding } from "../meta_building"; -import { enumLayer, GameRoot } from "../root"; import { enumHubGoalRewards } from "../tutorial_goals"; +/** + * @typedef {import("../root").GameRoot} GameRoot + */ + export class MetaEnergyGenerator extends MetaBuilding { constructor() { super("energy_generator"); @@ -51,18 +53,18 @@ export class MetaEnergyGenerator extends MetaBuilding { { pos: new Vector(0, 1), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 1), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 0), directions: [enumDirection.top], - layer: enumLayer.wires, - filter: enumItemType.negativeEnergy, + layer: "wires", + filter: "negativeEnergy", }, ], }) @@ -74,7 +76,7 @@ export class MetaEnergyGenerator extends MetaBuilding { { pos: new Vector(0, 0), direction: enumDirection.top, - layer: enumLayer.wires, + layer: "wires", }, ], instantEject: true, diff --git a/src/js/game/buildings/hub.js b/src/js/game/buildings/hub.js index 4f0e0d80..14a3047c 100644 --- a/src/js/game/buildings/hub.js +++ b/src/js/game/buildings/hub.js @@ -1,5 +1,4 @@ import { enumDirection, Vector } from "../../core/vector"; -import { enumItemType } from "../base_item"; import { HubComponent } from "../components/hub"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; @@ -53,72 +52,72 @@ export class MetaHubBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.top, enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 0), directions: [enumDirection.top], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(2, 0), directions: [enumDirection.top], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(3, 0), directions: [enumDirection.top, enumDirection.right], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(0, 3), directions: [enumDirection.bottom, enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 3), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(2, 3), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(3, 3), directions: [enumDirection.bottom, enumDirection.right], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(0, 1), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(0, 2), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(0, 3), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(3, 1), directions: [enumDirection.right], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(3, 2), directions: [enumDirection.right], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(3, 3), directions: [enumDirection.right], - filter: enumItemType.shape, + filter: "shape", }, ], }) diff --git a/src/js/game/buildings/mixer.js b/src/js/game/buildings/mixer.js index a2b35280..cbde309e 100644 --- a/src/js/game/buildings/mixer.js +++ b/src/js/game/buildings/mixer.js @@ -1,7 +1,6 @@ import { formatItemsPerSecond } from "../../core/utils"; import { enumDirection, Vector } from "../../core/vector"; import { T } from "../../translations"; -import { enumItemType } from "../base_item"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { ItemEjectorComponent } from "../components/item_ejector"; import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; @@ -63,12 +62,12 @@ export class MetaMixerBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], - filter: enumItemType.color, + filter: "color", }, { pos: new Vector(1, 0), directions: [enumDirection.bottom], - filter: enumItemType.color, + filter: "color", }, ], }) diff --git a/src/js/game/buildings/painter.js b/src/js/game/buildings/painter.js index 61e77a7c..49c2ff69 100644 --- a/src/js/game/buildings/painter.js +++ b/src/js/game/buildings/painter.js @@ -8,7 +8,6 @@ import { Entity } from "../entity"; import { defaultBuildingVariant, MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; import { enumHubGoalRewards } from "../tutorial_goals"; -import { enumItemType } from "../base_item"; /** @enum {string} */ export const enumPainterVariants = { mirrored: "mirrored", double: "double", quad: "quad" }; @@ -98,12 +97,12 @@ export class MetaPainterBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 0), directions: [enumDirection.top], - filter: enumItemType.color, + filter: "color", }, ], }) @@ -124,14 +123,14 @@ export class MetaPainterBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 0), directions: [ variant === defaultBuildingVariant ? enumDirection.top : enumDirection.bottom, ], - filter: enumItemType.color, + filter: "color", }, ]); @@ -147,17 +146,17 @@ export class MetaPainterBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(0, 1), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 0), directions: [enumDirection.top], - filter: enumItemType.color, + filter: "color", }, ]); @@ -174,27 +173,27 @@ export class MetaPainterBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.left], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(0, 0), directions: [enumDirection.bottom], - filter: enumItemType.color, + filter: "color", }, { pos: new Vector(1, 0), directions: [enumDirection.bottom], - filter: enumItemType.color, + filter: "color", }, { pos: new Vector(2, 0), directions: [enumDirection.bottom], - filter: enumItemType.color, + filter: "color", }, { pos: new Vector(3, 0), directions: [enumDirection.bottom], - filter: enumItemType.color, + filter: "color", }, ]); diff --git a/src/js/game/buildings/rotater.js b/src/js/game/buildings/rotater.js index 45bb97b9..c278ef0d 100644 --- a/src/js/game/buildings/rotater.js +++ b/src/js/game/buildings/rotater.js @@ -8,7 +8,6 @@ import { Entity } from "../entity"; import { defaultBuildingVariant, MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; import { enumHubGoalRewards } from "../tutorial_goals"; -import { enumItemType } from "../base_item"; /** @enum {string} */ export const enumRotaterVariants = { ccw: "ccw", fl: "fl" }; @@ -89,7 +88,7 @@ export class MetaRotaterBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, ], }) diff --git a/src/js/game/buildings/splitter.js b/src/js/game/buildings/splitter.js index 12f0e6e7..d6a13a8c 100644 --- a/src/js/game/buildings/splitter.js +++ b/src/js/game/buildings/splitter.js @@ -5,11 +5,14 @@ import { ItemEjectorComponent } from "../components/item_ejector"; import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; import { Entity } from "../entity"; import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; -import { GameRoot, enumLayer } from "../root"; import { enumHubGoalRewards } from "../tutorial_goals"; import { T } from "../../translations"; import { formatItemsPerSecond } from "../../core/utils"; +/** + * @typedef {import("../root").GameRoot} GameRoot + */ + /** @enum {string} */ export const enumSplitterVariants = { compact: "compact", compactInverse: "compact-inverse" }; @@ -116,8 +119,8 @@ export class MetaSplitterBuilding extends MetaBuilding { ]); entity.components.ItemAcceptor.beltUnderlays = [ - { pos: new Vector(0, 0), direction: enumDirection.top, layer: enumLayer.regular }, - { pos: new Vector(1, 0), direction: enumDirection.top, layer: enumLayer.regular }, + { pos: new Vector(0, 0), direction: enumDirection.top, layer: "regular" }, + { pos: new Vector(1, 0), direction: enumDirection.top, layer: "regular" }, ]; break; @@ -144,7 +147,7 @@ export class MetaSplitterBuilding extends MetaBuilding { ]); entity.components.ItemAcceptor.beltUnderlays = [ - { pos: new Vector(0, 0), direction: enumDirection.top, layer: enumLayer.regular }, + { pos: new Vector(0, 0), direction: enumDirection.top, layer: "regular" }, ]; break; diff --git a/src/js/game/buildings/stacker.js b/src/js/game/buildings/stacker.js index 91ac3f62..40a9c5ae 100644 --- a/src/js/game/buildings/stacker.js +++ b/src/js/game/buildings/stacker.js @@ -8,7 +8,6 @@ import { Entity } from "../entity"; import { MetaBuilding } from "../meta_building"; import { GameRoot } from "../root"; import { enumHubGoalRewards } from "../tutorial_goals"; -import { enumItemType } from "../base_item"; export class MetaStackerBuilding extends MetaBuilding { constructor() { @@ -63,12 +62,12 @@ export class MetaStackerBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, { pos: new Vector(1, 0), directions: [enumDirection.bottom], - filter: enumItemType.shape, + filter: "shape", }, ], }) diff --git a/src/js/game/buildings/underground_belt.js b/src/js/game/buildings/underground_belt.js index 2c4f6a1d..f6b70b6f 100644 --- a/src/js/game/buildings/underground_belt.js +++ b/src/js/game/buildings/underground_belt.js @@ -5,12 +5,15 @@ import { ItemEjectorComponent } from "../components/item_ejector"; import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components/underground_belt"; import { Entity } from "../entity"; import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; -import { GameRoot, enumLayer } from "../root"; import { globalConfig } from "../../core/config"; import { enumHubGoalRewards } from "../tutorial_goals"; import { formatItemsPerSecond } from "../../core/utils"; import { T } from "../../translations"; +/** + * @typedef {import("../root").GameRoot} GameRoot + */ + /** @enum {string} */ export const arrayUndergroundRotationVariantToMode = [ enumUndergroundBeltMode.sender, @@ -172,7 +175,7 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding { tile = tile.addScalars(searchVector.x, searchVector.y); /* WIRES: FIXME */ - const contents = root.map.getTileContent(tile, enumLayer.regular); + const contents = root.map.getTileContent(tile, "regular"); if (contents) { const undergroundComp = contents.components.UndergroundBelt; if (undergroundComp && undergroundComp.tier === tier) { diff --git a/src/js/game/buildings/wire_base.js b/src/js/game/buildings/wire_base.js index 6f3ffec8..0d0038ad 100644 --- a/src/js/game/buildings/wire_base.js +++ b/src/js/game/buildings/wire_base.js @@ -1,6 +1,5 @@ import { Loader } from "../../core/loader"; import { enumDirection } from "../../core/vector"; -import { enumLayer } from "../root"; import { arrayBeltVariantToRotation, MetaBeltBaseBuilding } from "./belt_base"; export class MetaWireBaseBuilding extends MetaBeltBaseBuilding { @@ -12,8 +11,9 @@ export class MetaWireBaseBuilding extends MetaBeltBaseBuilding { return "#c425d7"; } + /** @returns {"wires"} **/ getLayer() { - return enumLayer.wires; + return "wires"; } getPreviewSprite(rotationVariant) { diff --git a/src/js/game/buildings/wire_crossings.js b/src/js/game/buildings/wire_crossings.js index cb3c933a..e6e0d335 100644 --- a/src/js/game/buildings/wire_crossings.js +++ b/src/js/game/buildings/wire_crossings.js @@ -1,11 +1,10 @@ import { enumDirection, Vector } from "../../core/vector"; -import { enumItemType } from "../base_item"; import { ItemAcceptorComponent } from "../components/item_acceptor"; import { ItemEjectorComponent } from "../components/item_ejector"; import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; import { Entity } from "../entity"; import { defaultBuildingVariant, MetaBuilding } from "../meta_building"; -import { enumLayer, GameRoot } from "../root"; +import { GameRoot } from "../root"; /** @enum {string} */ export const enumWireCrossingVariants = { @@ -26,8 +25,9 @@ export class MetaWireCrossingsBuilding extends MetaBuilding { return "#c425d7"; } + /** @returns {"wires"} **/ getLayer() { - return enumLayer.wires; + return "wires"; } /** @@ -83,13 +83,13 @@ export class MetaWireCrossingsBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], - layer: enumLayer.wires, + layer: "wires", }, ]); entity.components.ItemEjector.setSlots([ - { pos: new Vector(0, 0), direction: enumDirection.top, layer: enumLayer.wires }, - { pos: new Vector(0, 0), direction: enumDirection.right, layer: enumLayer.wires }, + { pos: new Vector(0, 0), direction: enumDirection.top, layer: "wires" }, + { pos: new Vector(0, 0), direction: enumDirection.right, layer: "wires" }, ]); break; @@ -99,17 +99,17 @@ export class MetaWireCrossingsBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.top], - layer: enumLayer.wires, + layer: "wires", }, { pos: new Vector(0, 0), directions: [enumDirection.right], - layer: enumLayer.wires, + layer: "wires", }, ]); entity.components.ItemEjector.setSlots([ - { pos: new Vector(0, 0), direction: enumDirection.bottom, layer: enumLayer.wires }, + { pos: new Vector(0, 0), direction: enumDirection.bottom, layer: "wires" }, ]); break; } diff --git a/src/js/game/components/belt.js b/src/js/game/components/belt.js index e9a0cd80..e4e6bbf2 100644 --- a/src/js/game/components/belt.js +++ b/src/js/game/components/belt.js @@ -3,7 +3,10 @@ import { types } from "../../savegame/serialization"; import { BeltPath } from "../belt_path"; import { Component } from "../component"; import { Entity } from "../entity"; -import { enumLayer } from "../root"; + +/** + * @typedef {import("../root").Layer} Layer + **/ export const curvedBeltLength = /* Math.PI / 4 */ 0.78; @@ -45,12 +48,12 @@ export class BeltComponent extends Component { /** * Returns the effective length of this belt in tile space - * @param {enumLayer} layer + * @param {Layer} layer * @returns {number} */ getEffectiveLengthTiles(layer) { assert(layer, "no layer given"); - if (layer === enumLayer.wires) { + if (layer === "wires") { return 1.0; } return this.direction === enumDirection.top ? 1.0 : curvedBeltLength; @@ -60,14 +63,14 @@ export class BeltComponent extends Component { * Converts from belt space (0 = start of belt ... 1 = end of belt) to the local * belt coordinates (-0.5|-0.5 to 0.5|0.5) * @param {number} progress - * @param {enumLayer} layer + * @param {Layer} layer * @returns {Vector} */ transformBeltToLocalSpace(progress, layer) { assert(progress >= 0.0, "Invalid progress ( < 0): " + progress); switch (layer) { - case enumLayer.regular: { + case "regular": { switch (this.direction) { case enumDirection.top: assert(progress <= 1.02, "Invalid progress: " + progress); @@ -94,7 +97,7 @@ export class BeltComponent extends Component { return new Vector(0, 0); } } - case enumLayer.wires: { + case "wires": { const pow = 0.5; switch (this.direction) { case enumDirection.top: diff --git a/src/js/game/components/energy_consumer.js b/src/js/game/components/energy_consumer.js index 6e54af86..0282458c 100644 --- a/src/js/game/components/energy_consumer.js +++ b/src/js/game/components/energy_consumer.js @@ -1,7 +1,7 @@ import { Component } from "../component"; import { types } from "../../savegame/serialization"; import { Vector } from "../../core/vector"; -import { BaseItem, enumItemTypeToLayer, enumItemType } from "../base_item"; +import { BaseItem, itemTypes } from "../base_item"; export class EnergyConsumerComponent extends Component { static getId() { @@ -13,8 +13,8 @@ export class EnergyConsumerComponent extends Component { bufferSize: types.float, perCharge: types.float, batteryPosition: types.vector, - energyType: types.enum(enumItemType), - wasteType: types.enum(enumItemType), + energyType: types.enum(itemTypes), + wasteType: types.enum(itemTypes), acceptorSlotIndex: types.uint, ejectorSlotIndex: types.uint, @@ -54,8 +54,10 @@ export class EnergyConsumerComponent extends Component { this.bufferSize = bufferSize; this.perCharge = perCharge; this.batteryPosition = batteryPosition; - this.energyType = enumItemType.positiveEnergy; - this.wasteType = enumItemType.negativeEnergy; + /** @type {"positiveEnergy"} **/ + this.energyType = "positiveEnergy"; + /** @type {"negativeEnergy"} **/ + this.wasteType = "negativeEnergy"; this.acceptorSlotIndex = acceptorSlotIndex; this.ejectorSlotIndex = ejectorSlotIndex; diff --git a/src/js/game/components/energy_generator.js b/src/js/game/components/energy_generator.js index a45492d7..3b6f1480 100644 --- a/src/js/game/components/energy_generator.js +++ b/src/js/game/components/energy_generator.js @@ -1,5 +1,5 @@ import { types } from "../../savegame/serialization"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem } from "../base_item"; import { Component } from "../component"; import { ShapeItem } from "../items/shape_item"; @@ -59,7 +59,7 @@ export class EnergyGeneratorComponent extends Component { // just destroy it return true; } else { - if (item.getItemType() !== enumItemType.shape) { + if (item.getItemType() !== "shape") { // This shouldn't happen since we have a filter - still, it doesn't hurt // to check either assertAlways( diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js index a5676119..74bfd5fd 100644 --- a/src/js/game/components/item_acceptor.js +++ b/src/js/game/components/item_acceptor.js @@ -1,30 +1,34 @@ import { enumDirection, enumInvertedDirections, Vector } from "../../core/vector"; import { types } from "../../savegame/serialization"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem, itemTypes } from "../base_item"; import { Component } from "../component"; -import { enumLayer } from "../root"; - -/** @typedef {{ - * pos: Vector, - * directions: enumDirection[], - * layer: enumLayer, - * filter?: enumItemType - * }} ItemAcceptorSlot */ +import { layers } from "../root"; /** + * @typedef {import("../root").Layer} Layer + * @typedef {import ("../base_item").ItemType} ItemType + * + * @typedef {{ + * pos: Vector, + * directions: enumDirection[], + * layer: Layer, + * filter?: ItemType + * }} ItemAcceptorSlot + * * Contains information about a slot plus its location * @typedef {{ - * slot: ItemAcceptorSlot, - * index: number, - * acceptedDirection: enumDirection - * }} ItemAcceptorLocatedSlot */ - -/** @typedef {{ - * pos: Vector, - * directions: enumDirection[], - * layer?: enumLayer, - * filter?: enumItemType - * }} ItemAcceptorSlotConfig */ + * slot: ItemAcceptorSlot, + * index: number, + * acceptedDirection: enumDirection + * }} ItemAcceptorLocatedSlot + * + * @typedef {{ + * pos: Vector, + * directions: enumDirection[], + * layer?: Layer, + * filter?: ItemType + * }} ItemAcceptorSlotConfig + **/ export class ItemAcceptorComponent extends Component { static getId() { @@ -37,10 +41,10 @@ export class ItemAcceptorComponent extends Component { types.structured({ pos: types.vector, directions: types.array(types.enum(enumDirection)), - filter: types.nullable(types.enum(enumItemType)), + filter: types.nullable(types.enum(itemTypes)), // TODO: MIGRATE - layer: types.enum(enumLayer), + layer: types.enum(layers), }) ), animated: types.bool, @@ -50,7 +54,7 @@ export class ItemAcceptorComponent extends Component { direction: types.enum(enumDirection), // TODO: MIGRATE - layer: types.enum(enumLayer), + layer: types.enum(layers), }) ), }; @@ -90,7 +94,7 @@ export class ItemAcceptorComponent extends Component { * @param {object} param0 * @param {Array} param0.slots The slots from which we accept items * @param {boolean=} param0.animated Whether to animate item consumption - * @param {Array<{pos: Vector, direction: enumDirection, layer: enumLayer}>=} param0.beltUnderlays Where to render belt underlays + * @param {Array<{pos: Vector, direction: enumDirection, layer: Layer}>=} param0.beltUnderlays Where to render belt underlays */ constructor({ slots = [], beltUnderlays = [], animated = true }) { super(); @@ -121,9 +125,9 @@ export class ItemAcceptorComponent extends Component { this.slots.push({ pos: slot.pos, directions: slot.directions, - layer: slot.layer || enumLayer.regular, + layer: slot.layer || "regular", - // Which type of item to accept (shape | color | all) @see enumItemType + // Which type of item to accept (shape | color | all) @see ItemType filter: slot.filter, }); } @@ -141,7 +145,7 @@ export class ItemAcceptorComponent extends Component { /** * Returns if the given filter matches - * @param {enumItemType|null} filter + * @param {ItemType|null} filter * @param {BaseItem} item */ filterMatches(filter, item) { @@ -150,8 +154,8 @@ export class ItemAcceptorComponent extends Component { } const itemType = item.getItemType(); - if (filter === enumItemType.genericEnergy) { - return itemType === enumItemType.positiveEnergy || itemType === enumItemType.negativeEnergy; + if (filter === "genericEnergy") { + return itemType === "positiveEnergy" || itemType === "negativeEnergy"; } return itemType === filter; @@ -178,7 +182,7 @@ export class ItemAcceptorComponent extends Component { * Tries to find a slot which accepts the current item * @param {Vector} targetLocalTile * @param {enumDirection} fromLocalDirection - * @param {enumLayer} layer + * @param {Layer} layer * @returns {ItemAcceptorLocatedSlot|null} */ findMatchingSlot(targetLocalTile, fromLocalDirection, layer) { diff --git a/src/js/game/components/item_ejector.js b/src/js/game/components/item_ejector.js index ee661078..46bfb681 100644 --- a/src/js/game/components/item_ejector.js +++ b/src/js/game/components/item_ejector.js @@ -4,14 +4,18 @@ import { Component } from "../component"; import { types } from "../../savegame/serialization"; import { gItemRegistry } from "../../core/global_registries"; import { Entity } from "../entity"; -import { enumLayer } from "../root"; +import { layers } from "../root"; + +/** + * @typedef {import("../root").Layer} Layer + **/ /** * @typedef {{ * pos: Vector, * direction: enumDirection, * item: BaseItem, - * layer: enumLayer, + * layer: Layer, * progress: number?, * cachedDestSlot?: import("./item_acceptor").ItemAcceptorLocatedSlot, * cachedTargetEntity?: Entity @@ -36,7 +40,7 @@ export class ItemEjectorComponent extends Component { progress: types.float, // TODO: Migrate - layer: types.enum(enumLayer), + layer: types.enum(layers), }) ), }; @@ -62,7 +66,7 @@ export class ItemEjectorComponent extends Component { /** * * @param {object} param0 - * @param {Array<{pos: Vector, direction: enumDirection, layer?: enumLayer}>=} param0.slots The slots to eject on + * @param {Array<{pos: Vector, direction: enumDirection, layer?: Layer}>=} param0.slots The slots to eject on * @param {boolean=} param0.instantEject If the ejection is instant */ constructor({ slots = [], instantEject = false }) { @@ -83,7 +87,7 @@ export class ItemEjectorComponent extends Component { } /** - * @param {Array<{pos: Vector, direction: enumDirection, layer?: enumLayer}>} slots The slots to eject on + * @param {Array<{pos: Vector, direction: enumDirection, layer?: Layer}>} slots The slots to eject on */ setSlots(slots) { /** @type {Array} */ @@ -95,7 +99,7 @@ export class ItemEjectorComponent extends Component { direction: slot.direction, item: null, progress: 0, - layer: slot.layer || enumLayer.regular, + layer: slot.layer || "regular", cachedDestSlot: null, cachedTargetEntity: null, }); @@ -116,7 +120,7 @@ export class ItemEjectorComponent extends Component { /** * Returns whether any slot ejects to the given local tile * @param {Vector} tile - * @param {enumLayer} layer + * @param {Layer} layer */ anySlotEjectsToLocalTile(tile, layer) { for (let i = 0; i < this.slots.length; ++i) { @@ -139,7 +143,7 @@ export class ItemEjectorComponent extends Component { /** * Returns the first free slot on this ejector or null if there is none - * @param {enumLayer} layer + * @param {Layer} layer * @returns {number?} */ getFirstFreeSlot(layer) { diff --git a/src/js/game/components/storage.js b/src/js/game/components/storage.js index e7b40a77..c3367144 100644 --- a/src/js/game/components/storage.js +++ b/src/js/game/components/storage.js @@ -1,7 +1,7 @@ import { Component } from "../component"; import { types } from "../../savegame/serialization"; import { gItemRegistry } from "../../core/global_registries"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem } from "../base_item"; import { ColorItem } from "../items/color_item"; import { ShapeItem } from "../items/shape_item"; @@ -67,11 +67,11 @@ export class StorageComponent extends Component { return false; } - if (itemType === enumItemType.color) { + if (itemType === "color") { return /** @type {ColorItem} */ (this.storedItem).color === /** @type {ColorItem} */ (item).color; } - if (itemType === enumItemType.shape) { + if (itemType === "shape") { return ( /** @type {ShapeItem} */ (this.storedItem).definition.getHash() === /** @type {ShapeItem} */ (item).definition.getHash() diff --git a/src/js/game/components/underground_belt.js b/src/js/game/components/underground_belt.js index e94b7cb1..e209dc17 100644 --- a/src/js/game/components/underground_belt.js +++ b/src/js/game/components/underground_belt.js @@ -4,7 +4,6 @@ import { globalConfig } from "../../core/config"; import { types } from "../../savegame/serialization"; import { gItemRegistry } from "../../core/global_registries"; import { Entity } from "../entity"; -import { enumLayer } from "../root"; /** @enum {string} */ export const enumUndergroundBeltMode = { @@ -103,8 +102,7 @@ export class UndergroundBeltComponent extends Component { } // Notice: We assume that for all items the travel distance is the same - const maxItemsInTunnel = - (2 + travelDistance) / globalConfig.beltItemSpacingByLayer[enumLayer.regular]; + const maxItemsInTunnel = (2 + travelDistance) / globalConfig.beltItemSpacingByLayer.regular; if (this.pendingItems.length >= maxItemsInTunnel) { // Simulate a real belt which gets full at some point return false; @@ -115,7 +113,7 @@ export class UndergroundBeltComponent extends Component { // So instead of adding 1 we add 0.5 only. // Additionally it takes 1 tile for the acceptor which we just add on top. const travelDuration = - (travelDistance + 1.5) / beltSpeed / globalConfig.beltItemSpacingByLayer[enumLayer.regular]; + (travelDistance + 1.5) / beltSpeed / globalConfig.beltItemSpacingByLayer.regular; this.pendingItems.push([item, travelDuration]); diff --git a/src/js/game/core.js b/src/js/game/core.js index 960a83e3..94e64042 100644 --- a/src/js/game/core.js +++ b/src/js/game/core.js @@ -23,7 +23,7 @@ import { GameHUD } from "./hud/hud"; import { KeyActionMapper } from "./key_action_mapper"; import { GameLogic } from "./logic"; import { MapView } from "./map_view"; -import { GameRoot, enumLayer } from "./root"; +import { GameRoot } from "./root"; import { ShapeDefinitionManager } from "./shape_definition_manager"; import { SoundProxy } from "./sound_proxy"; import { GameTime } from "./time/game_time"; @@ -32,6 +32,10 @@ import { randomInt } from "../core/utils"; import { defaultBuildingVariant } from "./meta_building"; import { DynamicTickrate } from "./dynamic_tickrate"; +/** + * @typedef {import("./root").Layer} Layer + **/ + const logger = createLogger("ingame/core"); // Store the canvas so we can reuse it later @@ -398,14 +402,14 @@ export class GameCore { if (!this.root.camera.getIsMapOverlayActive()) { // Underlays for splitters / balancers - systems.itemAcceptor.drawUnderlays(params, enumLayer.regular); + systems.itemAcceptor.drawUnderlays(params, "regular"); // Belt items - systems.belt.drawLayerBeltItems(params, enumLayer.regular); + systems.belt.drawLayerBeltItems(params, "regular"); // Items being ejected / accepted currently (animations) - systems.itemEjector.drawLayer(params, enumLayer.regular); - systems.itemAcceptor.drawLayer(params, enumLayer.regular); + systems.itemEjector.drawLayer(params, "regular"); + systems.itemAcceptor.drawLayer(params, "regular"); } // Miner & Static map entities @@ -428,14 +432,14 @@ export class GameCore { // Green wires overlay (not within the if because it can fade) root.hud.parts.wiresOverlay.draw(params); - if (this.root.currentLayer === enumLayer.wires && !this.root.camera.getIsMapOverlayActive()) { + if (this.root.currentLayer === "wires" && !this.root.camera.getIsMapOverlayActive()) { // Belt sprites & Static map entities root.map.drawWiresLayer(params); // Belt items as well as accepted / ejected items - systems.belt.drawLayerBeltItems(params, enumLayer.wires); - systems.itemEjector.drawLayer(params, enumLayer.wires); - systems.itemAcceptor.drawLayer(params, enumLayer.wires); + systems.belt.drawLayerBeltItems(params, "wires"); + systems.itemEjector.drawLayer(params, "wires"); + systems.itemAcceptor.drawLayer(params, "wires"); root.map.drawWiresForegroundLayer(params); diff --git a/src/js/game/entity.js b/src/js/game/entity.js index c86aa3b7..d1f073ab 100644 --- a/src/js/game/entity.js +++ b/src/js/game/entity.js @@ -3,15 +3,20 @@ import { DrawParameters } from "../core/draw_parameters"; import { Component } from "./component"; /* typehints:end */ -import { GameRoot, enumLayer } from "./root"; import { globalConfig } from "../core/config"; import { enumDirectionToVector, enumDirectionToAngle } from "../core/vector"; import { BasicSerializableObject, types } from "../savegame/serialization"; import { EntityComponentStorage } from "./entity_components"; +import { layers } from "./root"; import { Loader } from "../core/loader"; import { drawRotatedSprite } from "../core/draw_utils"; import { gComponentRegistry } from "../core/global_registries"; +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + **/ + export class Entity extends BasicSerializableObject { /** * @param {GameRoot} root @@ -36,8 +41,9 @@ export class Entity extends BasicSerializableObject { /** * On which layer this entity is + * @type {Layer} */ - this.layer = enumLayer.regular; + this.layer = "regular"; /** * Internal entity unique id, set by the @see EntityManager @@ -77,7 +83,7 @@ export class Entity extends BasicSerializableObject { return { uid: types.uint, components: types.keyValueMap(types.objData(gComponentRegistry)), - layer: types.enum(enumLayer), + layer: types.enum(layers), }; } diff --git a/src/js/game/game_system_with_filter.js b/src/js/game/game_system_with_filter.js index 82ab4c22..92ba551b 100644 --- a/src/js/game/game_system_with_filter.js +++ b/src/js/game/game_system_with_filter.js @@ -3,11 +3,16 @@ import { Component } from "./component"; import { Entity } from "./entity"; /* typehints:end */ -import { GameRoot, enumLayer } from "./root"; import { GameSystem } from "./game_system"; import { arrayDelete, arrayDeleteValue } from "../core/utils"; import { DrawParameters } from "../core/draw_parameters"; import { globalConfig } from "../core/config"; + +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + **/ + export class GameSystemWithFilter extends GameSystem { /** * Constructs a new game system with the given component filter. It will process @@ -39,7 +44,7 @@ export class GameSystemWithFilter extends GameSystem { * Calls a function for each matching entity on the screen, useful for drawing them * @param {DrawParameters} parameters * @param {function} callback - * @param {enumLayer=} layerFilter Can be null for no filter + * @param {Layer=} layerFilter Can be null for no filter */ forEachMatchingEntityOnScreen(parameters, callback, layerFilter = null) { const cullRange = parameters.visibleRect.toTileCullRectangle(); diff --git a/src/js/game/hub_goals.js b/src/js/game/hub_goals.js index 36f8f107..e76246d4 100644 --- a/src/js/game/hub_goals.js +++ b/src/js/game/hub_goals.js @@ -4,11 +4,15 @@ import { clamp, findNiceIntegerValue, randomChoice, randomInt } from "../core/ut import { BasicSerializableObject, types } from "../savegame/serialization"; import { enumColors } from "./colors"; import { enumItemProcessorTypes } from "./components/item_processor"; -import { GameRoot, enumLayer } from "./root"; import { enumSubShape, ShapeDefinition } from "./shape_definition"; import { enumHubGoalRewards, tutorialGoals } from "./tutorial_goals"; import { UPGRADES, blueprintShape } from "./upgrades"; +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + **/ + export class HubGoals extends BasicSerializableObject { static getId() { return "HubGoals"; @@ -370,11 +374,11 @@ export class HubGoals extends BasicSerializableObject { /** * Belt speed - * @param {enumLayer} layer + * @param {Layer} layer * @returns {number} items / sec */ getBeltBaseSpeed(layer) { - if (layer === enumLayer.wires) { + if (layer === "wires") { return globalConfig.wiresSpeedItemsPerSecond; } return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt; diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js index 38341395..4b3e7f0c 100644 --- a/src/js/game/hud/parts/blueprint_placer.js +++ b/src/js/game/hud/parts/blueprint_placer.js @@ -11,7 +11,10 @@ import { BaseHUDPart } from "../base_hud_part"; import { DynamicDomAttach } from "../dynamic_dom_attach"; import { Blueprint } from "../../blueprint"; import { SOUNDS } from "../../../platform/sound"; -import { enumLayer } from "../../root"; + +/** + * @typedef {import("../../root").Layer} Layer + **/ export class HUDBlueprintPlacer extends BaseHUDPart { createElements(parent) { @@ -60,7 +63,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { /** * Called when the layer was changed - * @param {enumLayer} layer + * @param {Layer} layer */ onEditModeChanged(layer) { // Check if the layer of the blueprint differs and thus we have to deselect it diff --git a/src/js/game/hud/parts/building_placer.js b/src/js/game/hud/parts/building_placer.js index d5770d0a..686fb213 100644 --- a/src/js/game/hud/parts/building_placer.js +++ b/src/js/game/hud/parts/building_placer.js @@ -13,13 +13,17 @@ import { import { T } from "../../../translations"; import { KEYMAPPINGS } from "../../key_action_mapper"; import { defaultBuildingVariant } from "../../meta_building"; +import { layers } from "../../root"; import { THEME } from "../../theme"; import { DynamicDomAttach } from "../dynamic_dom_attach"; import { HUDBuildingPlacerLogic } from "./building_placer_logic"; import { makeOffscreenBuffer } from "../../../core/buffer_utils"; -import { enumLayer } from "../../root"; import { getCodeFromBuildingData } from "../../building_codes"; +/** + * @typedef {import("../../root").Layer} Layer + **/ + export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { /** * @param {HTMLElement} parent @@ -60,9 +64,9 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { this.currentInterpolatedCornerTile = new Vector(); this.lockIndicatorSprites = {}; - for (const layerId in enumLayer) { - this.lockIndicatorSprites[layerId] = this.makeLockIndicatorSprite(layerId); - } + layers.forEach(layer => { + this.lockIndicatorSprites[layer] = this.makeLockIndicatorSprite(layer); + }); // @@ -75,7 +79,7 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { /** * Makes the lock indicator sprite for the given layer - * @param {enumLayer} layer + * @param {Layer} layer */ makeLockIndicatorSprite(layer) { const dims = 48; diff --git a/src/js/game/hud/parts/building_placer_logic.js b/src/js/game/hud/parts/building_placer_logic.js index 97a635a6..e7471376 100644 --- a/src/js/game/hud/parts/building_placer_logic.js +++ b/src/js/game/hud/parts/building_placer_logic.js @@ -12,9 +12,12 @@ import { BaseHUDPart } from "../base_hud_part"; import { SOUNDS } from "../../../platform/sound"; import { MetaMinerBuilding, enumMinerVariants } from "../../buildings/miner"; import { enumHubGoalRewards } from "../../tutorial_goals"; -import { enumLayer } from "../../root"; import { getBuildingDataFromCode, getCodeFromBuildingData } from "../../building_codes"; +/** + * @typedef {import("../../root").Layer} Layer + **/ + /** * Contains all logic for the building placer - this doesn't include the rendering * of info boxes or drawing. @@ -132,12 +135,12 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart { /** * Called when the edit mode got changed - * @param {enumLayer} editMode + * @param {Layer} layer */ - onEditModeChanged(editMode) { + onEditModeChanged(layer) { const metaBuilding = this.currentMetaBuilding.get(); if (metaBuilding) { - if (metaBuilding.getLayer() !== editMode) { + if (metaBuilding.getLayer() !== layer) { // This layer doesn't fit the edit mode anymore this.currentMetaBuilding.set(null); } diff --git a/src/js/game/hud/parts/buildings_toolbar.js b/src/js/game/hud/parts/buildings_toolbar.js index c46a5c98..6ee3b91c 100644 --- a/src/js/game/hud/parts/buildings_toolbar.js +++ b/src/js/game/hud/parts/buildings_toolbar.js @@ -9,7 +9,6 @@ import { MetaSplitterBuilding } from "../../buildings/splitter"; import { MetaStackerBuilding } from "../../buildings/stacker"; import { MetaTrashBuilding } from "../../buildings/trash"; import { MetaUndergroundBeltBuilding } from "../../buildings/underground_belt"; -import { enumLayer } from "../../root"; import { HUDBaseToolbar } from "./base_toolbar"; import { MetaAdvancedProcessorBuilding } from "../../buildings/advanced_processor"; @@ -34,7 +33,7 @@ export class HUDBuildingsToolbar extends HUDBaseToolbar { super(root, { supportedBuildings, visibilityCondition: () => - !this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === enumLayer.regular, + !this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === "regular", htmlElementId: "ingame_HUD_buildings_toolbar", }); } diff --git a/src/js/game/hud/parts/color_blind_helper.js b/src/js/game/hud/parts/color_blind_helper.js index c7dd6288..fc238470 100644 --- a/src/js/game/hud/parts/color_blind_helper.js +++ b/src/js/game/hud/parts/color_blind_helper.js @@ -7,8 +7,6 @@ import { DrawParameters } from "../../../core/draw_parameters"; import { THEME } from "../../theme"; import { globalConfig } from "../../../core/config"; import { T } from "../../../translations"; -import { enumItemType } from "../../base_item"; -import { enumLayer } from "../../root"; export class HUDColorBlindHelper extends BaseHUDPart { createElements(parent) { @@ -41,7 +39,7 @@ export class HUDColorBlindHelper extends BaseHUDPart { return null; } - if (this.root.currentLayer !== enumLayer.regular) { + if (this.root.currentLayer !== "regular") { // Not in regular mode return null; } @@ -56,7 +54,7 @@ export class HUDColorBlindHelper extends BaseHUDPart { // Check if the belt has a color item if (beltComp) { const item = beltComp.assignedPath.findItemAtTile(tile); - if (item && item.getItemType() === enumItemType.color) { + if (item && item.getItemType() === "color") { return /** @type {ColorItem} */ (item).color; } } @@ -69,7 +67,7 @@ export class HUDColorBlindHelper extends BaseHUDPart { if (slot.layer !== this.root.currentLayer) { continue; } - if (slot.item && slot.item.getItemType() === enumItemType.color) { + if (slot.item && slot.item.getItemType() === "color") { return /** @type {ColorItem} */ (slot.item).color; } } @@ -77,7 +75,7 @@ export class HUDColorBlindHelper extends BaseHUDPart { } else { // We hovered a lower layer, show the color there const lowerLayer = this.root.map.getLowerLayerContentXY(tile.x, tile.y); - if (lowerLayer && lowerLayer.getItemType() === enumItemType.color) { + if (lowerLayer && lowerLayer.getItemType() === "color") { return /** @type {ColorItem} */ (lowerLayer).color; } } diff --git a/src/js/game/hud/parts/wires_overlay.js b/src/js/game/hud/parts/wires_overlay.js index 8bda5d0d..4e09dc1a 100644 --- a/src/js/game/hud/parts/wires_overlay.js +++ b/src/js/game/hud/parts/wires_overlay.js @@ -2,7 +2,6 @@ import { makeOffscreenBuffer } from "../../../core/buffer_utils"; import { globalConfig } from "../../../core/config"; import { DrawParameters } from "../../../core/draw_parameters"; import { KEYMAPPINGS } from "../../key_action_mapper"; -import { enumLayer } from "../../root"; import { THEME } from "../../theme"; import { BaseHUDPart } from "../base_hud_part"; import { Loader } from "../../../core/loader"; @@ -26,10 +25,10 @@ export class HUDWiresOverlay extends BaseHUDPart { * Switches between layers */ switchLayers() { - if (this.root.currentLayer === enumLayer.regular) { - this.root.currentLayer = enumLayer.wires; + if (this.root.currentLayer === "regular") { + this.root.currentLayer = "wires"; } else { - this.root.currentLayer = enumLayer.regular; + this.root.currentLayer = "regular"; } this.root.signals.editModeChanged.dispatch(this.root.currentLayer); } @@ -50,7 +49,7 @@ export class HUDWiresOverlay extends BaseHUDPart { } update() { - const desiredAlpha = this.root.currentLayer === enumLayer.wires ? 1.0 : 0.0; + const desiredAlpha = this.root.currentLayer === "wires" ? 1.0 : 0.0; this.currentAlpha = lerp(this.currentAlpha, desiredAlpha, 0.12); } diff --git a/src/js/game/hud/parts/wires_toolbar.js b/src/js/game/hud/parts/wires_toolbar.js index 6ebc0a98..09c3d97a 100644 --- a/src/js/game/hud/parts/wires_toolbar.js +++ b/src/js/game/hud/parts/wires_toolbar.js @@ -1,5 +1,4 @@ import { MetaWireBaseBuilding } from "../../buildings/wire_base"; -import { enumLayer } from "../../root"; import { HUDBaseToolbar } from "./base_toolbar"; import { MetaWireCrossingsBuilding } from "../../buildings/wire_crossings"; @@ -10,7 +9,7 @@ export class HUDWiresToolbar extends HUDBaseToolbar { super(root, { supportedBuildings, visibilityCondition: () => - !this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === enumLayer.wires, + !this.root.camera.getIsMapOverlayActive() && this.root.currentLayer === "wires", htmlElementId: "ingame_HUD_wires_toolbar", }); } diff --git a/src/js/game/hud/trailer_maker.js b/src/js/game/hud/trailer_maker.js index 2834b40d..e75a6b3c 100644 --- a/src/js/game/hud/trailer_maker.js +++ b/src/js/game/hud/trailer_maker.js @@ -1,4 +1,3 @@ -import { GameRoot, enumLayer } from "../root"; import { globalConfig } from "../../core/config"; import { Vector, mixVector } from "../../core/vector"; import { lerp } from "../../core/utils"; @@ -9,6 +8,10 @@ import { gMetaBuildingRegistry } from "../../core/global_registries"; import { MetaBeltBaseBuilding } from "../buildings/belt_base"; import { MinerComponent } from "../components/miner"; +/** + * @typedef {import("../root").GameRoot} GameRoot + **/ + const tickrate = 1 / 165; export class TrailerMaker { @@ -92,7 +95,7 @@ export class TrailerMaker { const speed = globalConfig.tileSize * globalConfig.beltSpeedItemsPerSecond * - globalConfig.beltItemSpacingByLayer[enumLayer.regular]; + globalConfig.beltItemSpacingByLayer.regular; // let time = // this.currentPlaybackOrigin.distance(Vector.fromSerializedObject(nextMarker.pos)) / speed; const time = nextMarker.time; diff --git a/src/js/game/items/color_item.js b/src/js/game/items/color_item.js index d1b9a217..77722737 100644 --- a/src/js/game/items/color_item.js +++ b/src/js/game/items/color_item.js @@ -2,7 +2,7 @@ import { globalConfig } from "../../core/config"; import { smoothenDpi } from "../../core/dpi_manager"; import { DrawParameters } from "../../core/draw_parameters"; import { types } from "../../savegame/serialization"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem } from "../base_item"; import { enumColors, enumColorsToHexCode } from "../colors"; import { THEME } from "../theme"; @@ -23,8 +23,9 @@ export class ColorItem extends BaseItem { this.color = data; } + /** @returns {"color"} **/ getItemType() { - return enumItemType.color; + return "color"; } /** diff --git a/src/js/game/items/negative_energy_item.js b/src/js/game/items/negative_energy_item.js index 99e2cd06..1d79a6e0 100644 --- a/src/js/game/items/negative_energy_item.js +++ b/src/js/game/items/negative_energy_item.js @@ -1,7 +1,7 @@ import { DrawParameters } from "../../core/draw_parameters"; import { Loader } from "../../core/loader"; import { types } from "../../savegame/serialization"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem } from "../base_item"; export class NegativeEnergyItem extends BaseItem { static getId() { @@ -18,8 +18,9 @@ export class NegativeEnergyItem extends BaseItem { deserialize(data) {} + /** @returns {"negativeEnergy"} **/ getItemType() { - return enumItemType.negativeEnergy; + return "negativeEnergy"; } /** diff --git a/src/js/game/items/positive_energy_item.js b/src/js/game/items/positive_energy_item.js index 260ae149..74d40076 100644 --- a/src/js/game/items/positive_energy_item.js +++ b/src/js/game/items/positive_energy_item.js @@ -1,7 +1,7 @@ import { DrawParameters } from "../../core/draw_parameters"; import { Loader } from "../../core/loader"; import { types } from "../../savegame/serialization"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem } from "../base_item"; export class PositiveEnergyItem extends BaseItem { static getId() { @@ -18,8 +18,9 @@ export class PositiveEnergyItem extends BaseItem { deserialize(data) {} + /** @returns {"positiveEnergy"} **/ getItemType() { - return enumItemType.positiveEnergy; + return "positiveEnergy"; } /** diff --git a/src/js/game/items/shape_item.js b/src/js/game/items/shape_item.js index 2aca63f6..cb39b1ff 100644 --- a/src/js/game/items/shape_item.js +++ b/src/js/game/items/shape_item.js @@ -1,6 +1,6 @@ import { DrawParameters } from "../../core/draw_parameters"; import { types } from "../../savegame/serialization"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem } from "../base_item"; import { ShapeDefinition } from "../shape_definition"; import { THEME } from "../theme"; @@ -21,8 +21,9 @@ export class ShapeItem extends BaseItem { this.definition = ShapeDefinition.fromShortKey(data); } + /** @returns {"shape"} **/ getItemType() { - return enumItemType.shape; + return "shape"; } /** diff --git a/src/js/game/logic.js b/src/js/game/logic.js index 403fa15b..59b29091 100644 --- a/src/js/game/logic.js +++ b/src/js/game/logic.js @@ -3,32 +3,28 @@ import { round2Digits } from "../core/utils"; import { enumDirection, enumDirectionToVector, Vector } from "../core/vector"; import { Entity } from "./entity"; import { MetaBuilding } from "./meta_building"; -import { enumLayer, GameRoot } from "./root"; import { STOP_PROPAGATION } from "../core/signal"; const logger = createLogger("ingame/logic"); /** - * Typing helper + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + * * @typedef {Array<{ * entity: Entity, * slot: import("./components/item_ejector").ItemEjectorSlot, * fromTile: Vector, * toDirection: enumDirection * }>} EjectorsAffectingTile - */ - -/** - * Typing helper + * * @typedef {Array<{ * entity: Entity, * slot: import("./components/item_acceptor").ItemAcceptorSlot, * toTile: Vector, * fromDirection: enumDirection * }>} AcceptorsAffectingTile - */ - -/** + * * @typedef {{ * acceptors: AcceptorsAffectingTile, * ejectors: EjectorsAffectingTile @@ -178,7 +174,7 @@ export class GameLogic { /** * Returns the acceptors and ejectors which affect the current tile * @param {Vector} tile - * @param {enumLayer} layer + * @param {Layer} layer * @returns {AcceptorsAndEjectorsAffectingTile} */ getEjectorsAndAcceptorsAtTile(tile, layer) { diff --git a/src/js/game/map.js b/src/js/game/map.js index 3f8a16f8..64c3fff5 100644 --- a/src/js/game/map.js +++ b/src/js/game/map.js @@ -1,4 +1,3 @@ -import { GameRoot, enumLayer } from "./root"; import { globalConfig } from "../core/config"; import { Vector } from "../core/vector"; import { Entity } from "./entity"; @@ -8,6 +7,11 @@ import { MapChunkView } from "./map_chunk_view"; import { randomInt } from "../core/utils"; import { BasicSerializableObject, types } from "../savegame/serialization"; +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + */ + const logger = createLogger("map"); export class BaseMap extends BasicSerializableObject { @@ -98,7 +102,7 @@ export class BaseMap extends BasicSerializableObject { /** * Returns the tile content of a given tile * @param {Vector} tile - * @param {enumLayer} layer + * @param {Layer} layer * @returns {Entity} Entity or null */ getTileContent(tile, layer) { @@ -123,7 +127,7 @@ export class BaseMap extends BasicSerializableObject { * Returns the tile content of a given tile * @param {number} x * @param {number} y - * @param {enumLayer} layer + * @param {Layer} layer * @returns {Entity} Entity or null */ getLayerContentXY(x, y, layer) { @@ -148,7 +152,7 @@ export class BaseMap extends BasicSerializableObject { /** * Checks if the tile is used * @param {Vector} tile - * @param {enumLayer} layer + * @param {Layer} layer * @returns {boolean} */ isTileUsed(tile, layer) { @@ -163,7 +167,7 @@ export class BaseMap extends BasicSerializableObject { * Checks if the tile is used * @param {number} x * @param {number} y - * @param {enumLayer} layer + * @param {Layer} layer * @returns {boolean} */ isTileUsedXY(x, y, layer) { diff --git a/src/js/game/map_chunk.js b/src/js/game/map_chunk.js index dd9ba81d..b7e95b5f 100644 --- a/src/js/game/map_chunk.js +++ b/src/js/game/map_chunk.js @@ -1,4 +1,3 @@ -import { GameRoot, enumLayer } from "./root"; import { globalConfig } from "../core/config"; import { createLogger } from "../core/logging"; import { clamp, fastArrayDeleteValueIfContained, make2DUndefinedArray } from "../core/utils"; @@ -11,6 +10,11 @@ import { ShapeItem } from "./items/shape_item"; import { enumSubShape } from "./shape_definition"; import { RandomNumberGenerator } from "../core/rng"; +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + */ + const logger = createLogger("map_chunk"); export class MapChunk { @@ -332,7 +336,7 @@ export class MapChunk { * Returns the contents of this chunk from the given world space coordinates * @param {number} worldX * @param {number} worldY - * @param {enumLayer} layer + * @param {Layer} layer * @returns {Entity=} */ getLayerContentFromWorldCoords(worldX, worldY, layer) { @@ -342,7 +346,7 @@ export class MapChunk { assert(localY >= 0, "Local Y is < 0"); assert(localX < globalConfig.mapChunkSize, "Local X is >= chunk size"); assert(localY < globalConfig.mapChunkSize, "Local Y is >= chunk size"); - if (layer === enumLayer.regular) { + if (layer === "regular") { return this.contents[localX][localY] || null; } else { return this.wireContents[localX][localY] || null; @@ -395,7 +399,7 @@ export class MapChunk { * @param {number} tileX * @param {number} tileY * @param {Entity=} contents - * @param {enumLayer} layer + * @param {Layer} layer */ setLayerContentFromWorldCords(tileX, tileY, contents, layer) { const localX = tileX - this.tileX; @@ -406,7 +410,7 @@ export class MapChunk { assert(localY < globalConfig.mapChunkSize, "Local Y is >= chunk size"); let oldContents; - if (layer === enumLayer.regular) { + if (layer === "regular") { oldContents = this.contents[localX][localY]; } else { oldContents = this.wireContents[localX][localY]; @@ -419,7 +423,7 @@ export class MapChunk { fastArrayDeleteValueIfContained(this.containedEntities, oldContents); } - if (layer === enumLayer.regular) { + if (layer === "regular") { this.contents[localX][localY] = contents; } else { this.wireContents[localX][localY] = contents; diff --git a/src/js/game/meta_building.js b/src/js/game/meta_building.js index 722dca13..eda31833 100644 --- a/src/js/game/meta_building.js +++ b/src/js/game/meta_building.js @@ -4,9 +4,13 @@ import { Vector } from "../core/vector"; import { SOUNDS } from "../platform/sound"; import { StaticMapEntityComponent } from "./components/static_map_entity"; import { Entity } from "./entity"; -import { enumLayer, GameRoot } from "./root"; import { getCodeFromBuildingData } from "./building_codes"; +/** + * @typedef {import("./root").GameRoot} GameRoot + * @typedef {import("./root").Layer} Layer + */ + export const defaultBuildingVariant = "default"; export class MetaBuilding { @@ -27,10 +31,10 @@ export class MetaBuilding { /** * Returns the edit layer of the building - * @returns {enumLayer} + * @returns {Layer} */ getLayer() { - return enumLayer.regular; + return "regular"; } /** diff --git a/src/js/game/production_analytics.js b/src/js/game/production_analytics.js index 41ec31ae..eda79c83 100644 --- a/src/js/game/production_analytics.js +++ b/src/js/game/production_analytics.js @@ -1,7 +1,7 @@ import { GameRoot } from "./root"; import { ShapeDefinition } from "./shape_definition"; import { globalConfig } from "../core/config"; -import { BaseItem, enumItemType } from "./base_item"; +import { BaseItem } from "./base_item"; import { ShapeItem } from "./items/shape_item"; import { BasicSerializableObject } from "../savegame/serialization"; @@ -53,7 +53,7 @@ export class ProductionAnalytics extends BasicSerializableObject { * @param {BaseItem} item */ onItemProduced(item) { - if (item.getItemType() === enumItemType.shape) { + if (item.getItemType() === "shape") { const definition = /** @type {ShapeItem} */ (item).definition; const key = definition.getHash(); const entry = this.history[enumAnalyticsDataSource.produced]; diff --git a/src/js/game/root.js b/src/js/game/root.js index df0db09e..d25999fe 100644 --- a/src/js/game/root.js +++ b/src/js/game/root.js @@ -1,10 +1,7 @@ -/* eslint-disable no-unused-vars */ - import { Signal } from "../core/signal"; import { RandomNumberGenerator } from "../core/rng"; import { createLogger } from "../core/logging"; -// Type hints /* typehints:start */ import { GameTime } from "./time/game_time"; import { EntityManager } from "./entity_manager"; @@ -32,14 +29,10 @@ import { Vector } from "../core/vector"; const logger = createLogger("game/root"); -/** @enum {string} */ -export const enumLayer = { - regular: "regular", - wires: "wires", -}; +/** @typedef {"regular" | "wires"} Layer **/ -/** @type {Array} */ -export const arrayLayers = [enumLayer.regular, enumLayer.wires]; +/** @type {Array} */ +export const layers = ["regular", "wires"]; /** * The game root is basically the whole game state at a given point, @@ -134,8 +127,8 @@ export class GameRoot { /** @type {DynamicTickrate} */ this.dynamicTickrate = null; - /** @type {enumLayer} */ - this.currentLayer = enumLayer.regular; + /** @type {Layer} */ + this.currentLayer = "regular"; this.signals = { // Entities @@ -170,7 +163,7 @@ export class GameRoot { bulkOperationFinished: /** @type {TypedSignal<[]>} */ (new Signal()), - editModeChanged: /** @type {TypedSignal<[enumLayer]>} */ (new Signal()), + editModeChanged: /** @type {TypedSignal<[Layer]>} */ (new Signal()), // Called to check if an entity can be placed, second parameter is an additional offset. // Use to introduce additional placement checks diff --git a/src/js/game/systems/belt.js b/src/js/game/systems/belt.js index db538a56..dee1fd65 100644 --- a/src/js/game/systems/belt.js +++ b/src/js/game/systems/belt.js @@ -13,9 +13,8 @@ import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; import { MapChunkView } from "../map_chunk_view"; import { defaultBuildingVariant } from "../meta_building"; -import { enumLayer } from "../root"; -import { MetaWireBaseBuilding } from "../buildings/wire_base"; -import { enumItemType } from "../base_item"; + +/** @typedef {import("../root").Layer} Layer **/ export const BELT_ANIM_COUNT = 28; @@ -310,7 +309,7 @@ export class BeltSystem extends GameSystemWithFilter { /** * Draws all belt paths * @param {DrawParameters} parameters - * @param {enumLayer} layer + * @param {Layer} layer */ drawLayerBeltItems(parameters, layer) { for (let i = 0; i < this.beltPaths.length; ++i) { @@ -510,13 +509,13 @@ export class BeltSystem extends GameSystemWithFilter { } // Limit speed to avoid belts going backwards - const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed(enumLayer.regular), 10); + const speedMultiplier = Math.min(this.root.hubGoals.getBeltBaseSpeed("regular"), 10); // SYNC with systems/item_acceptor.js:drawEntityUnderlays! // 126 / 42 is the exact animation speed of the png animation const animationIndex = Math.floor( ((this.root.time.realtimeNow() * speedMultiplier * BELT_ANIM_COUNT * 126) / 42) * - globalConfig.beltItemSpacingByLayer[enumLayer.regular] + globalConfig.beltItemSpacingByLayer.regular ); const contents = chunk.contents; for (let y = 0; y < globalConfig.mapChunkSize; ++y) { diff --git a/src/js/game/systems/energy_consumer.js b/src/js/game/systems/energy_consumer.js index 6552fb9a..9cfc0037 100644 --- a/src/js/game/systems/energy_consumer.js +++ b/src/js/game/systems/energy_consumer.js @@ -1,13 +1,14 @@ import { DrawParameters } from "../../core/draw_parameters"; import { Loader } from "../../core/loader"; import { clamp } from "../../core/utils"; -import { enumItemType } from "../base_item"; import { EnergyConsumerComponent } from "../components/energy_consumer"; import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; import { NEGATIVE_ENERGY_ITEM_SINGLETON } from "../items/negative_energy_item"; import { POSITIVE_ENERGY_ITEM_SINGLETON } from "../items/positive_energy_item"; +/** @typedef {import("../base_item").ItemType} ItemType **/ + export class EnergyConsumerSystem extends GameSystemWithFilter { constructor(root) { super(root, [EnergyConsumerComponent]); @@ -42,13 +43,13 @@ export class EnergyConsumerSystem extends GameSystemWithFilter { /** * - * @param {enumItemType} itemType + * @param {ItemType} itemType */ getItemSingletonByType(itemType) { switch (itemType) { - case enumItemType.positiveEnergy: + case "positiveEnergy": return POSITIVE_ENERGY_ITEM_SINGLETON; - case enumItemType.negativeEnergy: + case "negativeEnergy": return NEGATIVE_ENERGY_ITEM_SINGLETON; default: assertAlways(false, "Bad item type: " + itemType); diff --git a/src/js/game/systems/item_acceptor.js b/src/js/game/systems/item_acceptor.js index 2c0f1686..1a3668ab 100644 --- a/src/js/game/systems/item_acceptor.js +++ b/src/js/game/systems/item_acceptor.js @@ -8,7 +8,10 @@ import { Loader } from "../../core/loader"; import { drawRotatedSprite } from "../../core/draw_utils"; import { BELT_ANIM_COUNT } from "./belt"; import { fastArrayDelete } from "../../core/utils"; -import { enumLayer } from "../root"; + +/** + * @typedef {import("../root").Layer} Layer + **/ export class ItemAcceptorSystem extends GameSystemWithFilter { constructor(root) { @@ -53,7 +56,7 @@ export class ItemAcceptorSystem extends GameSystemWithFilter { /** * Draws the acceptor items * @param {DrawParameters} parameters - * @param {enumLayer} layer + * @param {Layer} layer */ drawLayer(parameters, layer) { this.forEachMatchingEntityOnScreen(parameters, this.drawEntityRegularLayer.bind(this, layer)); @@ -62,14 +65,14 @@ export class ItemAcceptorSystem extends GameSystemWithFilter { /** * Draws the acceptor underlays * @param {DrawParameters} parameters - * @param {enumLayer} layer + * @param {Layer} layer */ drawUnderlays(parameters, layer) { this.forEachMatchingEntityOnScreen(parameters, this.drawEntityUnderlays.bind(this, layer)); } /** - * @param {enumLayer} layer + * @param {Layer} layer * @param {DrawParameters} parameters * @param {Entity} entity */ @@ -107,7 +110,7 @@ export class ItemAcceptorSystem extends GameSystemWithFilter { } /** - * @param {enumLayer} layer + * @param {Layer} layer * @param {DrawParameters} parameters * @param {Entity} entity */ diff --git a/src/js/game/systems/item_ejector.js b/src/js/game/systems/item_ejector.js index 316dc053..cc4fa177 100644 --- a/src/js/game/systems/item_ejector.js +++ b/src/js/game/systems/item_ejector.js @@ -3,11 +3,12 @@ import { DrawParameters } from "../../core/draw_parameters"; import { createLogger } from "../../core/logging"; import { Rectangle } from "../../core/rectangle"; import { enumDirectionToVector, Vector } from "../../core/vector"; -import { BaseItem, enumItemType, enumItemTypeToLayer } from "../base_item"; +import { BaseItem, itemTypeLayerMap } from "../base_item"; import { ItemEjectorComponent } from "../components/item_ejector"; import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; -import { enumLayer } from "../root"; + +/** @typedef {import("../root").Layer} Layer **/ const logger = createLogger("systems/ejector"); @@ -257,7 +258,7 @@ export class ItemEjectorSystem extends GameSystemWithFilter { // TODO: Kinda hacky. How to solve this properly? Don't want to go through inheritance hell. // Also its just a few cases (hope it stays like this .. :x). - const itemLayer = enumItemTypeToLayer[item.getItemType()]; + const itemLayer = itemTypeLayerMap[item.getItemType()]; const beltComp = receiver.components.Belt; if (beltComp) { @@ -338,14 +339,14 @@ export class ItemEjectorSystem extends GameSystemWithFilter { /** * Draws the given layer * @param {DrawParameters} parameters - * @param {enumLayer} layer + * @param {Layer} layer */ drawLayer(parameters, layer) { this.forEachMatchingEntityOnScreen(parameters, this.drawSingleEntity.bind(this, layer)); } /** - * @param {enumLayer} layer + * @param {Layer} layer * @param {DrawParameters} parameters * @param {Entity} entity */ diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index 5bebfed7..62e13c4e 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -1,5 +1,5 @@ import { globalConfig } from "../../core/config"; -import { BaseItem, enumItemType } from "../base_item"; +import { BaseItem } from "../base_item"; import { enumColorMixingResults, enumInvertedColors } from "../colors"; import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; import { Entity } from "../entity"; @@ -359,14 +359,14 @@ export class ItemProcessorSystem extends GameSystemWithFilter { case enumItemProcessorTypes.advancedProcessor: { const item = items[0].item; - if (item.getItemType() === enumItemType.color) { + if (item.getItemType() === "color") { const colorItem = /** @type {ColorItem} */ (items[0].item); const newColor = enumInvertedColors[colorItem.color]; outItems.push({ item: new ColorItem(newColor), requiredSlot: 0, }); - } else if (item.getItemType() === enumItemType.shape) { + } else if (item.getItemType() === "shape") { const shapeItem = /** @type {ShapeItem} */ (items[0].item); const newItem = this.root.shapeDefinitionMgr.shapeActionInvertColors( shapeItem.definition diff --git a/src/js/game/systems/miner.js b/src/js/game/systems/miner.js index f317d0d1..b87ed6e2 100644 --- a/src/js/game/systems/miner.js +++ b/src/js/game/systems/miner.js @@ -6,7 +6,6 @@ import { MinerComponent } from "../components/miner"; import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; import { MapChunkView } from "../map_chunk_view"; -import { enumLayer } from "../root"; export class MinerSystem extends GameSystemWithFilter { constructor(root) { @@ -75,7 +74,7 @@ export class MinerSystem extends GameSystemWithFilter { const ejectingDirection = staticComp.localDirectionToWorld(ejectingSlot.direction); const targetTile = ejectingPos.add(enumDirectionToVector[ejectingDirection]); - const targetContents = this.root.map.getTileContent(targetTile, enumLayer.regular); + const targetContents = this.root.map.getTileContent(targetTile, "regular"); // Check if we are connected to another miner and thus do not eject directly if (targetContents) { diff --git a/src/js/game/systems/static_map_entity.js b/src/js/game/systems/static_map_entity.js index 886291a6..d721fd9c 100644 --- a/src/js/game/systems/static_map_entity.js +++ b/src/js/game/systems/static_map_entity.js @@ -4,7 +4,6 @@ import { globalConfig } from "../../core/config"; import { MapChunkView } from "../map_chunk_view"; import { Loader } from "../../core/loader"; import { enumDirection } from "../../core/vector"; -import { enumLayer } from "../root"; export class StaticMapEntitySystem extends GameSystem { constructor(root) { diff --git a/src/js/game/systems/storage.js b/src/js/game/systems/storage.js index 7f946e5b..a77ca9eb 100644 --- a/src/js/game/systems/storage.js +++ b/src/js/game/systems/storage.js @@ -4,7 +4,6 @@ import { Entity } from "../entity"; import { DrawParameters } from "../../core/draw_parameters"; import { formatBigNumber, lerp } from "../../core/utils"; import { Loader } from "../../core/loader"; -import { enumLayer } from "../root"; export class StorageSystem extends GameSystemWithFilter { constructor(root) { @@ -23,7 +22,7 @@ export class StorageSystem extends GameSystemWithFilter { const ejectorComp = entity.components.ItemEjector; /* FIXME: WIRES */ - const nextSlot = ejectorComp.getFirstFreeSlot(enumLayer.regular); + const nextSlot = ejectorComp.getFirstFreeSlot("regular"); if (nextSlot !== null) { if (ejectorComp.tryEject(nextSlot, storageComp.storedItem)) { storageComp.storedCount--; diff --git a/src/js/game/systems/underground_belt.js b/src/js/game/systems/underground_belt.js index f5e1b0ab..b9cd3ee6 100644 --- a/src/js/game/systems/underground_belt.js +++ b/src/js/game/systems/underground_belt.js @@ -13,7 +13,6 @@ import { enumUndergroundBeltMode, UndergroundBeltComponent } from "../components import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; import { fastArrayDelete } from "../../core/utils"; -import { enumLayer } from "../root"; const logger = createLogger("tunnels"); @@ -298,7 +297,7 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { ) { currentTile = currentTile.add(searchVector); - const potentialReceiver = this.root.map.getTileContent(currentTile, enumLayer.regular); + const potentialReceiver = this.root.map.getTileContent(currentTile, "regular"); if (!potentialReceiver) { // Empty tile continue; diff --git a/src/js/game/systems/wired_pins.js b/src/js/game/systems/wired_pins.js index 853568ef..935008d5 100644 --- a/src/js/game/systems/wired_pins.js +++ b/src/js/game/systems/wired_pins.js @@ -5,7 +5,6 @@ import { Vector } from "../../core/vector"; import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins"; import { Entity } from "../entity"; import { GameSystemWithFilter } from "../game_system_with_filter"; -import { enumLayer } from "../root"; import { STOP_PROPAGATION } from "../../core/signal"; import { drawRotatedSprite } from "../../core/draw_utils"; @@ -43,7 +42,7 @@ export class WiredPinsSystem extends GameSystemWithFilter { // If this entity is placed on the wires layer, make sure we don't // place it above a pin - if (entity.layer === enumLayer.wires) { + if (entity.layer === "wires") { for (let x = rect.x; x < rect.x + rect.w; ++x) { for (let y = rect.y; y < rect.y + rect.h; ++y) { // Find which entities are in same tiles of both layers @@ -108,7 +107,7 @@ export class WiredPinsSystem extends GameSystemWithFilter { } // Check if there is any entity on that tile (Wired pins are always on the wires layer) - const collidingEntity = this.root.map.getLayerContentXY(worldPos.x, worldPos.y, enumLayer.wires); + const collidingEntity = this.root.map.getLayerContentXY(worldPos.x, worldPos.y, "wires"); // If there's an entity, and it can't get removed -> That's a collision if (collidingEntity && !collidingEntity.components.ReplaceableMapEntity) { @@ -133,7 +132,7 @@ export class WiredPinsSystem extends GameSystemWithFilter { for (let i = 0; i < pinsComp.slots.length; ++i) { const slot = pinsComp.slots[i]; const worldPos = entity.components.StaticMapEntity.localTileToWorld(slot.pos); - const collidingEntity = this.root.map.getLayerContentXY(worldPos.x, worldPos.y, enumLayer.wires); + const collidingEntity = this.root.map.getLayerContentXY(worldPos.x, worldPos.y, "wires"); if (collidingEntity) { assertAlways( collidingEntity.components.ReplaceableMapEntity, diff --git a/src/js/savegame/serialization_data_types.js b/src/js/savegame/serialization_data_types.js index 86b177c1..a951272e 100644 --- a/src/js/savegame/serialization_data_types.js +++ b/src/js/savegame/serialization_data_types.js @@ -460,7 +460,7 @@ export class TypeEnum extends BaseDataType { */ constructor(enumeration = {}) { super(); - this.availableValues = Object.keys(enumeration); + this.availableValues = Object.values(enumeration); } serialize(value) { diff --git a/src/js/savegame/serializer_internal.js b/src/js/savegame/serializer_internal.js index 8df6f6e4..885e0c6e 100644 --- a/src/js/savegame/serializer_internal.js +++ b/src/js/savegame/serializer_internal.js @@ -1,6 +1,6 @@ import { gComponentRegistry } from "../core/global_registries"; import { Entity } from "../game/entity"; -import { enumLayer, GameRoot } from "../game/root"; +import { GameRoot, layers } from "../game/root"; // Internal serializer methods export class SerializerInternal { @@ -41,7 +41,7 @@ export class SerializerInternal { this.deserializeComponents(entity, payload.components); entity.layer = payload.layer; - if (!enumLayer[payload.layer]) { + if (!layers.includes(payload.layer)) { assert(false, "Invalid layer: " + payload.layer); }