From 14eaa2d9aace6807f92087f7cdae8b79754b8c86 Mon Sep 17 00:00:00 2001 From: Sense101 <67970865+Sense101@users.noreply.github.com> Date: Fri, 16 Apr 2021 13:06:07 +0100 Subject: [PATCH] changed belt reader to make it more precise --- src/js/game/components/belt_reader.js | 2 ++ src/js/game/systems/belt_reader.js | 45 ++++++++++++--------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/js/game/components/belt_reader.js b/src/js/game/components/belt_reader.js index d451bab5..4eeb76a9 100644 --- a/src/js/game/components/belt_reader.js +++ b/src/js/game/components/belt_reader.js @@ -40,5 +40,7 @@ export class BeltReaderComponent extends Component { * @type {number} */ this.lastThroughputComputation = 0; + + this.lastRemovedItemTime = 0; } } diff --git a/src/js/game/systems/belt_reader.js b/src/js/game/systems/belt_reader.js index 5cde34ca..9ffb3ca3 100644 --- a/src/js/game/systems/belt_reader.js +++ b/src/js/game/systems/belt_reader.js @@ -16,45 +16,40 @@ export class BeltReaderSystem extends GameSystemWithFilter { const entity = this.allEntities[i]; const readerComp = entity.components.BeltReader; + const lastItemTimes = readerComp.lastItemTimes; const pinsComp = entity.components.WiredPins; // Remove outdated items - while (readerComp.lastItemTimes[0] < minimumTime) { - readerComp.lastItemTimes.shift(); + while (lastItemTimes[0] < minimumTime) { + readerComp.lastRemovedItemTime = lastItemTimes.shift(); } - - pinsComp.slots[1].value = readerComp.lastItem; - if ( - (readerComp.lastItemTimes[readerComp.lastItemTimes.length - 1] || 0) > - minimumTimeForThroughput - ) { - pinsComp.slots[0].value = BOOL_TRUE_SINGLETON; - } else { - pinsComp.slots[0].value = BOOL_FALSE_SINGLETON; - if (entity.components.ItemEjector.canEjectOnSlot(0)) { - readerComp.lastItem = null; - } - } - + if (now - readerComp.lastThroughputComputation > 0.5) { // Compute throughput readerComp.lastThroughputComputation = now; + const oneItem = lastItemTimes.length == 1; let throughput = 0; - if (readerComp.lastItemTimes.length < 2) { - throughput = 0; - } else { - let averageSpacing = 0; - let averageSpacingNum = 0; - for (let i = 0; i < readerComp.lastItemTimes.length - 1; ++i) { - averageSpacing += readerComp.lastItemTimes[i + 1] - readerComp.lastItemTimes[i]; + if (lastItemTimes.length > 0) { + let averageSpacing = oneItem ? lastItemTimes[0] - readerComp.lastRemovedItemTime : 0; + let averageSpacingNum = oneItem ? 1 : 0; + for (let i = 0; i < lastItemTimes.length - 1; ++i) { + averageSpacing += lastItemTimes[i + 1] - lastItemTimes[i]; ++averageSpacingNum; } - throughput = 1 / (averageSpacing / averageSpacingNum); + throughput = 1 / (averageSpacing / averageSpacingNum) + 0.01; } - readerComp.lastThroughput = Math.min(globalConfig.beltSpeedItemsPerSecond * 23.9, throughput); + readerComp.lastThroughput = Math.min(globalConfig.beltSpeedItemsPerSecond, throughput); + } + + if (readerComp.lastThroughput > 0) { + pinsComp.slots[0].value = BOOL_TRUE_SINGLETON; + pinsComp.slots[1].value = readerComp.lastItem; + } else { + pinsComp.slots[0].value = BOOL_FALSE_SINGLETON; + pinsComp.slots[1].value = null; } } }