diff --git a/src/js/game/buildings/buffer.js b/src/js/game/buildings/buffer.js new file mode 100644 index 00000000..5992f914 --- /dev/null +++ b/src/js/game/buildings/buffer.js @@ -0,0 +1,73 @@ +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"; + +export class MetaBufferBuilding extends MetaBuilding { + constructor() { + super("buffer"); + } + + getSilhouetteColor() { + return "#621940"; + } + + getDimensions() { + return new Vector(3, 3); + } + + /** + * @param {GameRoot} root + */ + getIsUnlocked(root) { + // TODO: Add as level reward + // return root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_stacker); + return true; + } + + /** + * Creates the entity at the given location + * @param {Entity} entity + */ + setupEntityComponents(entity) { + // TODO: Use custom component here to allow for smooth output + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.buffer, + }) + ); + + entity.addComponent( + new ItemEjectorComponent({ + slots: [{ pos: new Vector(1, 0), direction: enumDirection.top }], + }) + ); + + // TODO: Replace item filters with custom filter to only allow one type of item to be collected. + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 1), + directions: [enumDirection.left], + filter: enumItemAcceptorItemFilter.any, + }, + { + pos: new Vector(1, 2), + directions: [enumDirection.bottom], + filter: enumItemAcceptorItemFilter.any, + }, + { + pos: new Vector(2, 1), + directions: [enumDirection.right], + filter: enumItemAcceptorItemFilter.any, + }, + ], + }) + ); + } +} diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js index d5546d4b..1102d33e 100644 --- a/src/js/game/components/item_acceptor.js +++ b/src/js/game/components/item_acceptor.js @@ -11,6 +11,7 @@ import { types } from "../../savegame/serialization"; export const enumItemAcceptorItemFilter = { shape: "shape", color: "color", + any: "any", none: null, }; @@ -20,6 +21,7 @@ export const enumItemAcceptorItemFilter = { * filter?: enumItemAcceptorItemFilter * }} ItemAcceptorSlot */ +// TODO: Make changes in ItemAcceptor to allow buffer to only accept specific items export class ItemAcceptorComponent extends Component { static getId() { return "ItemAcceptor"; diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js index 0c4e90c6..fd1b253d 100644 --- a/src/js/game/components/item_processor.js +++ b/src/js/game/components/item_processor.js @@ -18,6 +18,7 @@ export const enumItemProcessorTypes = { painterDouble: "painterDouble", painterQuad: "painterQuad", hub: "hub", + buffer: "buffer", }; export class ItemProcessorComponent extends Component { diff --git a/src/js/game/hub_goals.js b/src/js/game/hub_goals.js index def2946a..57341050 100644 --- a/src/js/game/hub_goals.js +++ b/src/js/game/hub_goals.js @@ -379,6 +379,7 @@ export class HubGoals extends BasicSerializableObject { switch (processorType) { case enumItemProcessorTypes.trash: case enumItemProcessorTypes.hub: + case enumItemProcessorTypes.buffer: return 1e30; case enumItemProcessorTypes.splitter: return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt * 2; diff --git a/translations/base-en.yaml b/translations/base-en.yaml index b7ee1536..be838ccb 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -286,6 +286,11 @@ buildings: name: &trash Destroyed description: Accepts inputs from all sides and destroys them. Forever. + buffer: + name: &buffer Item Buffer + description: Stores a large amount of a single type of item. + + storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: Cutting Shapes @@ -391,6 +396,7 @@ keybindings: mixer: *mixer painter: *painter trash: *trash + buffer: *buffer abortBuildingPlacement: Abort Placement rotateWhilePlacing: Rotate