From 88b12c685dc3e222555debf63c69985d94eec6b5 Mon Sep 17 00:00:00 2001 From: EmeraldBlock Date: Wed, 24 Nov 2021 00:05:13 -0600 Subject: [PATCH] optional belt length for acceptors/ejectors --- src/js/game/buildings/balancer.js | 15 ++++++++++++--- src/js/game/buildings/reader.js | 2 ++ src/js/game/components/item_acceptor.js | 3 +++ src/js/game/components/item_ejector.js | 6 ++++-- src/js/game/systems/acceptor_belt.js | 9 +++++++-- src/js/game/systems/ejector_belt.js | 9 +++++++-- 6 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/js/game/buildings/balancer.js b/src/js/game/buildings/balancer.js index fceae40a..42b54e82 100644 --- a/src/js/game/buildings/balancer.js +++ b/src/js/game/buildings/balancer.js @@ -152,16 +152,18 @@ export class MetaBalancerBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], + beltLength: 0.5, }, { pos: new Vector(1, 0), directions: [enumDirection.bottom], + beltLength: 0.5, }, ]); entity.components.ItemEjector.setSlots([ - { pos: new Vector(0, 0), direction: enumDirection.top }, - { pos: new Vector(1, 0), direction: enumDirection.top }, + { pos: new Vector(0, 0), direction: enumDirection.top, beltLength: 0.5 }, + { pos: new Vector(1, 0), direction: enumDirection.top, beltLength: 0.5 }, ]); break; @@ -172,6 +174,7 @@ export class MetaBalancerBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], + beltLength: 0.5, }, { pos: new Vector(0, 0), @@ -180,11 +183,14 @@ export class MetaBalancerBuilding extends MetaBuilding { ? enumDirection.left : enumDirection.right, ], + // distance to edge of perpendicular belt, ignoring border width + // see generate_belt_sprites.js + beltLength: 23.5 / 192, }, ]); entity.components.ItemEjector.setSlots([ - { pos: new Vector(0, 0), direction: enumDirection.top }, + { pos: new Vector(0, 0), direction: enumDirection.top, beltLength: 0.5 }, ]); break; @@ -195,6 +201,7 @@ export class MetaBalancerBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], + beltLength: 0.5, }, ]); @@ -202,6 +209,7 @@ export class MetaBalancerBuilding extends MetaBuilding { { pos: new Vector(0, 0), direction: enumDirection.top, + beltLength: 0.5, }, { pos: new Vector(0, 0), @@ -209,6 +217,7 @@ export class MetaBalancerBuilding extends MetaBuilding { variant === enumBalancerVariants.splitterInverse ? enumDirection.left : enumDirection.right, + beltLength: 23.5 / 192, }, ]); diff --git a/src/js/game/buildings/reader.js b/src/js/game/buildings/reader.js index 0af95b6d..dfbb7b03 100644 --- a/src/js/game/buildings/reader.js +++ b/src/js/game/buildings/reader.js @@ -75,6 +75,7 @@ export class MetaReaderBuilding extends MetaBuilding { { pos: new Vector(0, 0), directions: [enumDirection.bottom], + beltLength: 0.5, }, ], }) @@ -86,6 +87,7 @@ export class MetaReaderBuilding extends MetaBuilding { { pos: new Vector(0, 0), direction: enumDirection.top, + beltLength: 0.5, }, ], }) diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js index 354f9024..3827f08f 100644 --- a/src/js/game/components/item_acceptor.js +++ b/src/js/game/components/item_acceptor.js @@ -6,6 +6,7 @@ import { Component } from "../component"; /** @typedef {{ * pos: Vector, * directions: enumDirection[], + * beltLength?: number, * filter?: ItemType * }} ItemAcceptorSlot */ @@ -20,6 +21,7 @@ import { Component } from "../component"; /** @typedef {{ * pos: Vector, * directions: enumDirection[], + * beltLength?: number, * filter?: ItemType * }} ItemAcceptorSlotConfig */ @@ -65,6 +67,7 @@ export class ItemAcceptorComponent extends Component { this.slots.push({ pos: slot.pos, directions: slot.directions, + beltLength: slot.beltLength, // Which type of item to accept (shape | color | all) @see ItemType filter: slot.filter, diff --git a/src/js/game/components/item_ejector.js b/src/js/game/components/item_ejector.js index bfc54cd8..1a993dd0 100644 --- a/src/js/game/components/item_ejector.js +++ b/src/js/game/components/item_ejector.js @@ -10,6 +10,7 @@ import { typeItemSingleton } from "../item_resolver"; * @typedef {{ * pos: Vector, * direction: enumDirection, + * beltLength?: number, * item: BaseItem, * lastItem: BaseItem, * progress: number?, @@ -39,7 +40,7 @@ export class ItemEjectorComponent extends Component { /** * * @param {object} param0 - * @param {Array<{pos: Vector, direction: enumDirection }>=} param0.slots The slots to eject on + * @param {Array<{pos: Vector, direction: enumDirection, beltLength?: number }>=} param0.slots The slots to eject on * @param {boolean=} param0.renderFloatingItems Whether to render items even if they are not connected */ constructor({ slots = [], renderFloatingItems = true }) { @@ -58,7 +59,7 @@ export class ItemEjectorComponent extends Component { } /** - * @param {Array<{pos: Vector, direction: enumDirection }>} slots The slots to eject on + * @param {Array<{pos: Vector, direction: enumDirection, beltLength?: number }>} slots The slots to eject on */ setSlots(slots) { /** @type {Array} */ @@ -68,6 +69,7 @@ export class ItemEjectorComponent extends Component { this.slots.push({ pos: slot.pos, direction: slot.direction, + beltLength: slot.beltLength, item: null, lastItem: null, progress: 0, diff --git a/src/js/game/systems/acceptor_belt.js b/src/js/game/systems/acceptor_belt.js index f8e2e3e4..9efa36aa 100644 --- a/src/js/game/systems/acceptor_belt.js +++ b/src/js/game/systems/acceptor_belt.js @@ -43,8 +43,13 @@ export class AcceptorBeltSystem extends GameSystemWithFilter { const staticComp = entity.components.StaticMapEntity; for (let i = 0; i < acceptorComp.slots.length; ++i) { + // skips both missing and 0 belt lengths + if (!acceptorComp.slots[i].beltLength) { + continue; + } + // Extract underlay parameters - const { pos, directions } = acceptorComp.slots[i]; + const { pos, directions, beltLength } = acceptorComp.slots[i]; const transformedPos = staticComp.localTileToWorld(pos); const destX = transformedPos.x * globalConfig.tileSize; const destY = transformedPos.y * globalConfig.tileSize; @@ -73,7 +78,7 @@ export class AcceptorBeltSystem extends GameSystemWithFilter { const worldDirection = staticComp.localDirectionToWorld(direction); const angle = enumDirectionToAngle[enumInvertedDirections[worldDirection]]; - const clipRect = new Rectangle(0, 0.5, 1, 0.5); + const clipRect = new Rectangle(0, 1 - beltLength, 1, beltLength); // Actually draw the sprite const x = destX + globalConfig.halfTileSize; diff --git a/src/js/game/systems/ejector_belt.js b/src/js/game/systems/ejector_belt.js index 18ef4981..0955e570 100644 --- a/src/js/game/systems/ejector_belt.js +++ b/src/js/game/systems/ejector_belt.js @@ -43,8 +43,13 @@ export class EjectorBeltSystem extends GameSystemWithFilter { const staticComp = entity.components.StaticMapEntity; for (let i = 0; i < ejectorComp.slots.length; ++i) { + // skips both missing and 0 belt lengths + if (!ejectorComp.slots[i].beltLength) { + continue; + } + // Extract underlay parameters - const { pos, direction } = ejectorComp.slots[i]; + const { pos, direction, beltLength } = ejectorComp.slots[i]; const transformedPos = staticComp.localTileToWorld(pos); const destX = transformedPos.x * globalConfig.tileSize; const destY = transformedPos.y * globalConfig.tileSize; @@ -70,7 +75,7 @@ export class EjectorBeltSystem extends GameSystemWithFilter { const worldDirection = staticComp.localDirectionToWorld(direction); const angle = enumDirectionToAngle[worldDirection]; - const clipRect = new Rectangle(0, 0, 1, 0.5); + const clipRect = new Rectangle(0, 0, 1, beltLength); // Actually draw the sprite const x = destX + globalConfig.halfTileSize;