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; } } }