define([ 'js/system/events', 'js/rendering/renderer' ], function ( events, renderer ) { const hpBarPadding = scaleMult; const hpBarHeight = scaleMult; return { type: 'stats', values: null, hpSprite: null, hpSpriteInner: null, init: function (blueprint) { if (this.obj.self) events.emit('onGetStats', this.values); if (this.obj.has('serverId')) events.emit('onGetPartyStats', this.obj.serverId, this.values); let obj = this.obj; this.hpSprite = renderer.buildRectangle({ layerName: 'effects', x: obj.x * scale, y: obj.y * scale, w: 1, h: 1, color: 0x802343 }); this.hpSpriteInner = renderer.buildRectangle({ x: 0, y: 0, w: 1, h: 1, layerName: 'effects', color: 0xd43346 }); this.updateHpSprite(); }, updateHpSprite: function () { const { obj: { x, y, dead, sprite } } = this; if (dead) return; //By default, hp sprites are 10px higher than the owner object's sprite. Keeping in // mind that bigger sprites always have their 'origin' in the bottom middle tile const spriteHeight = sprite ? sprite.height : scale; const spriteWidth = sprite ? sprite.width : scale; const xOffset = -(spriteWidth - scale) / 2; const yOffset = -(spriteHeight - scale) - (scaleMult * 2); const hpBarWidth = spriteWidth - (hpBarPadding * 2); const newX = (x * scale) + hpBarPadding + xOffset; const newY = (y * scale) + yOffset; renderer.moveRectangle({ sprite: this.hpSprite, x: newX, y: newY, w: hpBarWidth, h: hpBarHeight }); renderer.moveRectangle({ sprite: this.hpSpriteInner, x: newX, y: newY, w: (this.values.hp / this.values.hpMax) * hpBarWidth, h: hpBarHeight }); const isVisible = (this.values.hp < this.values.hpMax) && (!sprite || sprite.visible); this.hpSprite.visible = isVisible; this.hpSpriteInner.visible = isVisible; }, extend: function (blueprint) { let bValues = blueprint.values || {}; let values = this.values; for (let b in bValues) values[b] = bValues[b]; if (this.obj.self) events.emit('onGetStats', this.values, blueprint); if (this.obj.has('serverId')) events.emit('onGetPartyStats', this.obj.serverId, this.values); this.updateHpSprite(); }, destroy: function () { renderer.destroyObject({ sprite: this.hpSprite, layerName: 'effects' }); renderer.destroyObject({ sprite: this.hpSpriteInner, layerName: 'effects' }); } }; });