define([ 'js/rendering/renderer', 'js/system/events', 'js/misc/physics', 'js/sound/sound' ], function ( renderer, events, physics, sound ) { return { type: 'player', oldPos: { x: 0, y: 0 }, init: function () { const obj = this.obj; obj.addComponent('keyboardMover'); obj.addComponent('mouseMover'); if (isMobile) obj.addComponent('touchMover'); obj.addComponent('serverActions'); obj.addComponent('pather'); this.hookEvent('onRespawn', this.onRespawn.bind(this)); events.emit('onGetPortrait', obj.portrait); }, extend: function (blueprint) { const { collisionChanges, mapChanges } = blueprint; delete blueprint.collisionChanges; delete blueprint.mapChanges; if (collisionChanges) collisionChanges.forEach(c => physics.setCollision(c)); if (mapChanges) { mapChanges.forEach(({ x, y, mapCellString }) => { renderer.updateMapAtPosition(x, y, mapCellString); }); } }, update: function () { const obj = this.obj; const x = obj.x; const y = obj.y; let oldPos = this.oldPos; if ((oldPos.x === x) && (oldPos.y === y)) return; oldPos.x = x; oldPos.y = y; sound.update(x, y); this.positionCamera(x, y); }, positionCamera: function (x, y, instant) { renderer.setPosition({ x: (x - (renderer.width / (scale * 2))) * scale, y: (y - (renderer.height / (scale * 2))) * scale }, instant); }, onRespawn: function ({ x, y }) { this.positionCamera(x, y, true); sound.update(x, y); }, destroy: function () { this.unhookEvents(); } }; });