diff --git a/res_raw/sprites/buildings/sorter.png b/res_raw/sprites/buildings/sorter.png new file mode 100644 index 00000000..c207da44 Binary files /dev/null and b/res_raw/sprites/buildings/sorter.png differ diff --git a/src/js/core/config.js b/src/js/core/config.js index 953af4e7..cc8ad817 100644 --- a/src/js/core/config.js +++ b/src/js/core/config.js @@ -58,6 +58,7 @@ export const globalConfig = { rotaterCCW: 1 / 1, painter: 1 / 6, painterDouble: 1 / 8, + sorter: 1 / 1, painterQuad: 1 / 8, mixer: 1 / 5, stacker: 1 / 6, diff --git a/src/js/game/buildings/sorter.js b/src/js/game/buildings/sorter.js new file mode 100644 index 00000000..3905b75e --- /dev/null +++ b/src/js/game/buildings/sorter.js @@ -0,0 +1,85 @@ +import { globalConfig } from "../../core/config"; +import { enumDirection, Vector } from "../../core/vector"; +import { ItemAcceptorComponent, enumItemAcceptorItemFilter } from "../components/item_acceptor"; +import { ItemEjectorComponent } from "../components/item_ejector"; +import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; +import { Entity } from "../entity"; +import { MetaBuilding } from "../meta_building"; +import { GameRoot } from "../root"; +import { enumHubGoalRewards } from "../tutorial_goals"; +import { T } from "../../translations"; +import { formatItemsPerSecond } from "../../core/utils"; + +export class MetaMixerBuilding extends MetaBuilding { + constructor() { + super("sorter"); + } + + getDimensions() { + return new Vector(2, 1); + } + + getSilhouetteColor() { + return "#ff6000"; + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + return true;//root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_sorter); + } + + /** + * @param {GameRoot} root + * @param {string} variant + * @returns {Array<[string, string]>} + */ + getAdditionalStatistics(root, variant) { + const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.sorter); + return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]]; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.sorter, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [ + { + pos: new Vector(0, 0), + direction: enumDirection.left, + }, + { + pos: new Vector(0, 0), + direction: enumDirection.top, + }, + //{ + // pos: new Vector(0, 0), + // direction: enumDirection.right, + //}, + ], + }) + ); + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.shape, + }, + ], + }) + ); + } +} diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js index eab51ae2..d27d18d5 100644 --- a/src/js/game/components/item_processor.js +++ b/src/js/game/components/item_processor.js @@ -7,6 +7,7 @@ import { gItemRegistry } from "../../core/global_registries"; /** @enum {string} */ export const enumItemProcessorTypes = { splitter: "splitter", + sorter: "sorter", cutter: "cutter", cutterQuad: "cutterQuad", rotater: "rotater", diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index d3f68c04..1c291cb5 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -117,6 +117,32 @@ export class ItemProcessorSystem extends GameSystemWithFilter { break; } + // SORTER + case enumItemProcessorTypes.sorter: { + const inputItem = /** @type {ShapeItem} */ (items[0].item); + trackProduction = false; + const availableSlots = entity.components.ItemEjector.slots.length - 1; + assert(inputItem instanceof ShapeItem, "Input for sorting is not a shape"); + console.log(inputItem.serialize) + if (inputItem.serialize() == "CuCuCuCu") { + let nextSlot = processorComp.nextOutputSlot++ % availableSlots; + for (let i = 0; i < items.length; ++i) { + outItems.push({ + item: items[i].item, + requiredSlot: 1, + }); + } + } else { + for (let i = 0; i < items.length; ++i) { + outItems.push({ + item: items[i].item, + requiredSlot: 0, + }); + } + } + break; + } + // CUTTER case enumItemProcessorTypes.cutter: { const inputItem = /** @type {ShapeItem} */ (items[0].item); diff --git a/src/js/game/tutorial_goals.js b/src/js/game/tutorial_goals.js index b2f5b0ef..1ef5817a 100644 --- a/src/js/game/tutorial_goals.js +++ b/src/js/game/tutorial_goals.js @@ -17,11 +17,12 @@ export const enumHubGoalRewards = { reward_rotater_ccw: "reward_rotater_ccw", reward_miner_chainable: "reward_miner_chainable", reward_underground_belt_tier_2: "reward_underground_belt_tier_2", + reward_storage: "reward_storage", reward_splitter_compact: "reward_splitter_compact", reward_cutter_quad: "reward_cutter_quad", reward_painter_double: "reward_painter_double", + reward_sorter: "reward_sorter", reward_painter_quad: "reward_painter_quad", - reward_storage: "reward_storage", reward_freeplay: "reward_freeplay",