diff --git a/src/js/game/components/miner.js b/src/js/game/components/miner.js index 57de7e2f..74a4b616 100644 --- a/src/js/game/components/miner.js +++ b/src/js/game/components/miner.js @@ -12,6 +12,7 @@ export class MinerComponent extends Component { } static getSchema() { + // cachedMinedItem is not serialized. return { lastMiningTime: types.ufloat, chainable: types.bool, @@ -25,8 +26,6 @@ export class MinerComponent extends Component { }); } - /** - */ constructor({ chainable = false }) { super(); this.lastMiningTime = 0; @@ -38,6 +37,11 @@ export class MinerComponent extends Component { * @type {Array} */ this.itemChainBuffer = []; + + /** + * @type {BaseItem} + */ + this.cachedMinedItem = null; } /** diff --git a/src/js/game/systems/miner.js b/src/js/game/systems/miner.js index 78223516..b195e6ab 100644 --- a/src/js/game/systems/miner.js +++ b/src/js/game/systems/miner.js @@ -24,11 +24,17 @@ export class MinerSystem extends GameSystemWithFilter { // Check if miner is above an actual tile const minerComp = entity.components.Miner; - const staticComp = entity.components.StaticMapEntity; - const tileBelow = this.root.map.getLowerLayerContentXY(staticComp.origin.x, staticComp.origin.y); - if (!tileBelow) { - continue; + if (!minerComp.cachedMinedItem) { + const staticComp = entity.components.StaticMapEntity; + const tileBelow = this.root.map.getLowerLayerContentXY( + staticComp.origin.x, + staticComp.origin.y + ); + if (!tileBelow) { + continue; + } + minerComp.cachedMinedItem = tileBelow; } // First, try to get rid of chained items @@ -40,20 +46,9 @@ export class MinerSystem extends GameSystemWithFilter { } if (this.root.time.isIngameTimerExpired(minerComp.lastMiningTime, 1 / miningSpeed)) { - const lowerLayerItem = this.root.map.getLowerLayerContentXY( - staticComp.origin.x, - staticComp.origin.y - ); - - // TODO: Should not be required actually - if (!lowerLayerItem) { - // Nothing below; - continue; - } - - if (this.tryPerformMinerEject(entity, lowerLayerItem)) { + if (this.tryPerformMinerEject(entity, minerComp.cachedMinedItem)) { // Analytics hook - this.root.signals.itemProduced.dispatch(lowerLayerItem); + this.root.signals.itemProduced.dispatch(minerComp.cachedMinedItem); // Actually mine minerComp.lastMiningTime = this.root.time.now(); @@ -114,18 +109,17 @@ export class MinerSystem extends GameSystemWithFilter { if (entity && entity.components.Miner) { const staticComp = entity.components.StaticMapEntity; + const minerComp = entity.components.Miner; if (!staticComp.shouldBeDrawn(parameters)) { continue; } + if (!minerComp.cachedMinedItem) { + continue; + } - const lowerLayerItem = this.root.map.getLowerLayerContentXY( - staticComp.origin.x, - staticComp.origin.y - ); - - if (lowerLayerItem) { + if (minerComp.cachedMinedItem) { const padding = 3; - parameters.context.fillStyle = lowerLayerItem.getBackgroundColorAsResource(); + parameters.context.fillStyle = minerComp.cachedMinedItem.getBackgroundColorAsResource(); parameters.context.fillRect( staticComp.origin.x * globalConfig.tileSize + padding, staticComp.origin.y * globalConfig.tileSize + padding, @@ -134,8 +128,8 @@ export class MinerSystem extends GameSystemWithFilter { ); } - if (lowerLayerItem) { - lowerLayerItem.draw( + if (minerComp.cachedMinedItem) { + minerComp.cachedMinedItem.draw( (0.5 + staticComp.origin.x) * globalConfig.tileSize, (0.5 + staticComp.origin.y) * globalConfig.tileSize, parameters