From 02ad9e30618c7c7a80f2f798dd01aa5e723879e4 Mon Sep 17 00:00:00 2001 From: Jasper Meggitt Date: Tue, 19 May 2020 16:28:46 -0700 Subject: [PATCH] Add buffer functionality --- res/ui/building_icons/buffer.png | Bin 0 -> 3930 bytes res_raw/sprites/blueprints/buffer.png | Bin 0 -> 31646 bytes res_raw/sprites/buildings/buffer.png | Bin 0 -> 31646 bytes src/js/game/buildings/buffer.js | 6 +++ src/js/game/component_registry.js | 2 + src/js/game/components/item_buffer.js | 42 +++++++++++++++ src/js/game/components/item_processor.js | 8 ++- src/js/game/entity_components.js | 5 ++ src/js/game/game_system_manager.js | 6 +++ src/js/game/hud/parts/buildings_toolbar.js | 2 + src/js/game/key_action_mapper.js | 1 + src/js/game/meta_building_registry.js | 2 + src/js/game/systems/item_buffer.js | 57 +++++++++++++++++++++ src/js/game/systems/item_processor.js | 54 +++++++++++++++---- 14 files changed, 172 insertions(+), 13 deletions(-) create mode 100644 res/ui/building_icons/buffer.png create mode 100644 res_raw/sprites/blueprints/buffer.png create mode 100644 res_raw/sprites/buildings/buffer.png create mode 100644 src/js/game/components/item_buffer.js create mode 100644 src/js/game/systems/item_buffer.js diff --git a/res/ui/building_icons/buffer.png b/res/ui/building_icons/buffer.png new file mode 100644 index 0000000000000000000000000000000000000000..e8304d30896d575c62d0431d6956489c136b8936 GIT binary patch literal 3930 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 Bl9m7f literal 0 HcmV?d00001 diff --git a/res_raw/sprites/blueprints/buffer.png b/res_raw/sprites/blueprints/buffer.png new file mode 100644 index 0000000000000000000000000000000000000000..715d53155dfd18639355b9e46eafd50dc193f586 GIT binary patch literal 31646 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 diff --git a/src/js/game/entity_components.js b/src/js/game/entity_components.js index 5b58264b..550f8c3a 100644 --- a/src/js/game/entity_components.js +++ b/src/js/game/entity_components.js @@ -9,6 +9,8 @@ import { ReplaceableMapEntityComponent } from "./components/replaceable_map_enti import { UndergroundBeltComponent } from "./components/underground_belt"; import { UnremovableComponent } from "./components/unremovable"; import { HubComponent } from "./components/hub"; +import { BufferComponent } from "./components/item_buffer"; + /* typehints:end */ /** @@ -52,6 +54,9 @@ export class EntityComponentStorage { /** @type {HubComponent} */ this.Hub; + /** @type {BufferComponent} */ + this.Buffer; + /* typehints:end */ } } diff --git a/src/js/game/game_system_manager.js b/src/js/game/game_system_manager.js index 7cde296e..0f33dc26 100644 --- a/src/js/game/game_system_manager.js +++ b/src/js/game/game_system_manager.js @@ -12,6 +12,7 @@ import { UndergroundBeltSystem } from "./systems/underground_belt"; import { HubSystem } from "./systems/hub"; import { StaticMapEntitySystem } from "./systems/static_map_entity"; import { ItemAcceptorSystem } from "./systems/item_acceptor"; +import { BufferSystem } from "./systems/item_buffer"; const logger = createLogger("game_system_manager"); @@ -52,6 +53,9 @@ export class GameSystemManager { /** @type {ItemAcceptorSystem} */ itemAcceptor: null, + /** @type {BufferSystem} */ + itemBuffer: null, + /* typehints:end */ }; this.systemUpdateOrder = []; @@ -88,6 +92,8 @@ export class GameSystemManager { add("itemAcceptor", ItemAcceptorSystem); + add("itemBuffer", BufferSystem); + logger.log("📦 There are", this.systemUpdateOrder.length, "game systems"); } diff --git a/src/js/game/hud/parts/buildings_toolbar.js b/src/js/game/hud/parts/buildings_toolbar.js index f7a21a1b..79dc635e 100644 --- a/src/js/game/hud/parts/buildings_toolbar.js +++ b/src/js/game/hud/parts/buildings_toolbar.js @@ -12,6 +12,7 @@ import { MetaSplitterBuilding } from "../../buildings/splitter"; import { MetaStackerBuilding } from "../../buildings/stacker"; import { MetaTrashBuilding } from "../../buildings/trash"; import { MetaUndergroundBeltBuilding } from "../../buildings/underground_belt"; +import { MetaBufferBuilding } from "../../buildings/buffer"; import { MetaBuilding } from "../../meta_building"; import { BaseHUDPart } from "../base_hud_part"; import { KEYMAPPINGS } from "../../key_action_mapper"; @@ -27,6 +28,7 @@ const toolbarBuildings = [ MetaMixerBuilding, MetaPainterBuilding, MetaTrashBuilding, + MetaBufferBuilding, ]; export class HUDBuildingsToolbar extends BaseHUDPart { diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index 6aff0e88..95faf099 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -44,6 +44,7 @@ export const KEYMAPPINGS = { mixer: { keyCode: key("8") }, painter: { keyCode: key("9") }, trash: { keyCode: key("0") }, + buffer: { keyCode: key("-") }, }, placement: { diff --git a/src/js/game/meta_building_registry.js b/src/js/game/meta_building_registry.js index 450a9743..47b982b8 100644 --- a/src/js/game/meta_building_registry.js +++ b/src/js/game/meta_building_registry.js @@ -10,6 +10,7 @@ import { MetaStackerBuilding } from "./buildings/stacker"; import { MetaTrashBuilding } from "./buildings/trash"; import { MetaUndergroundBeltBuilding } from "./buildings/underground_belt"; import { MetaHubBuilding } from "./buildings/hub"; +import { MetaBufferBuilding } from "./buildings/buffer"; export function initMetaBuildingRegistry() { gMetaBuildingRegistry.register(MetaSplitterBuilding); @@ -23,4 +24,5 @@ export function initMetaBuildingRegistry() { gMetaBuildingRegistry.register(MetaBeltBaseBuilding); gMetaBuildingRegistry.register(MetaUndergroundBeltBuilding); gMetaBuildingRegistry.register(MetaHubBuilding); + gMetaBuildingRegistry.register(MetaBufferBuilding); } diff --git a/src/js/game/systems/item_buffer.js b/src/js/game/systems/item_buffer.js new file mode 100644 index 00000000..30ef1770 --- /dev/null +++ b/src/js/game/systems/item_buffer.js @@ -0,0 +1,57 @@ +import { GameSystemWithFilter } from "../game_system_with_filter"; +import { BufferComponent } from "../components/item_buffer"; +import { DrawParameters } from "../../core/draw_parameters"; +import { Entity } from "../entity"; +import { formatBigNumber } from "../../core/utils"; +import { Loader } from "../../core/loader"; + +export class BufferSystem extends GameSystemWithFilter { + constructor(root) { + super(root, [BufferComponent]); + + this.bufferSprite = Loader.getSprite("sprites/buildings/buffer.png"); + } + + draw(parameters) { + this.forEachMatchingEntityOnScreen(parameters, this.drawEntity.bind(this)); + } + + /** + * @param {DrawParameters} parameters + * @param {Entity} entity + */ + drawEntity(parameters, entity) { + const context = parameters.context; + const staticComp = entity.components.StaticMapEntity; + const bufferContents = entity.components.Buffer; + + if (!staticComp.shouldBeDrawn(parameters)) { + return; + } + + const pos = staticComp.getTileSpaceBounds().getCenter().toWorldSpace(); + + // Background + staticComp.drawSpriteOnFullEntityBounds(parameters, this.bufferSprite, 2.2); + + bufferContents.definition.draw(pos.x, pos.y - 5, parameters, 20); + + const textOffsetX = 2; + const textOffsetY = -6; + + context.font = "bold 10px GameFont"; + context.fillStyle = "#64666e"; + context.textAlign = "left"; + context.fillText("" + formatBigNumber(bufferContents.itemCount), pos.x + textOffsetX, pos.y + textOffsetY); + + context.font = "10px GameFont"; + context.fillStyle = "#a4a6b0"; + context.fillText( + "/ " + formatBigNumber(bufferContents.storageLimit), + pos.x + textOffsetX, + pos.y + textOffsetY + 13 + ); + + context.textAlign = "left"; + } +} diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index d3f68c04..e3188d25 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -23,7 +23,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { // First of all, process the current recipe processorComp.secondsUntilEject = Math_max( 0, - processorComp.secondsUntilEject - this.root.dynamicTickrate.deltaSeconds + processorComp.secondsUntilEject - this.root.dynamicTickrate.deltaSeconds, ); // Check if we have any finished items we can eject @@ -64,11 +64,11 @@ export class ItemProcessorSystem extends GameSystemWithFilter { } } + const inputs = processorComp.inputSlots.length >= processorComp.inputsPerCharge; + const outputs = processorComp.itemsToEject.length > 0; // Check if we have an empty queue and can start a new charge - if (processorComp.itemsToEject.length === 0) { - if (processorComp.inputSlots.length >= processorComp.inputsPerCharge) { - this.startNewCharge(entity); - } + if (inputs && !outputs || processorComp.chargeWhenBlocked && (inputs || !outputs)) { + this.startNewCharge(entity); } } } @@ -94,7 +94,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { processorComp.secondsUntilEject = 1 / baseSpeed; /** @type {Array<{item: BaseItem, requiredSlot?: number, preferredSlot?: number}>} */ - const outItems = []; + const outItems = processorComp.itemsToEject; // Whether to track the production towards the analytics let trackProduction = true; @@ -196,7 +196,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const stackedDefinition = this.root.shapeDefinitionMgr.shapeActionStack( lowerItem.definition, - upperItem.definition + upperItem.definition, ); outItems.push({ item: new ShapeItem(stackedDefinition), @@ -244,7 +244,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith( shapeItem.definition, - colorItem.color + colorItem.color, ); outItems.push({ @@ -267,12 +267,12 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const colorizedDefinition1 = this.root.shapeDefinitionMgr.shapeActionPaintWith( shapeItem1.definition, - colorItem.color + colorItem.color, ); const colorizedDefinition2 = this.root.shapeDefinitionMgr.shapeActionPaintWith( shapeItem2.definition, - colorItem.color + colorItem.color, ); outItems.push({ item: new ShapeItem(colorizedDefinition1), @@ -302,7 +302,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith4Colors( shapeItem.definition, - [colorItem2.color, colorItem3.color, colorItem4.color, colorItem1.color] + [colorItem2.color, colorItem3.color, colorItem4.color, colorItem1.color], ); outItems.push({ @@ -328,6 +328,38 @@ export class ItemProcessorSystem extends GameSystemWithFilter { break; } + case enumItemProcessorTypes.buffer: { + let buffer = entity.components.Buffer; + + for (let i = 0; i < items.length; ++i) { + const inputItem = /** @type {ShapeItem} */ (items[i].item); + assert(inputItem instanceof ShapeItem, "Input is not a shape"); + // TODO: Validate item type + + if (buffer.itemCount < buffer.storageLimit) { + buffer.itemCount++; + } + + if (buffer.definition == null) { + buffer.definition = inputItem.definition; + } + } + + // const rotatedDefinition = this.root.shapeDefinitionMgr.shapeActionRotateCW(inputDefinition); + + if (outItems.length === 0 && buffer.itemCount > 0) { + buffer.itemCount--; + outItems.push({ + item: new ShapeItem(buffer.definition), + }); + + if (buffer.itemCount === 0) { + buffer.definition = null; + } + } + break; + } + default: assertAlways(false, "Unkown item processor type: " + processorComp.type); }