2019-03-26 17:04:44 -05:00
|
|
|
import * as I from 'immutable';
|
|
|
|
|
2019-03-27 01:52:24 -05:00
|
|
|
import {compose} from '@avocado/core';
|
|
|
|
import {create as createEntity, EntityList} from '@avocado/entity';
|
|
|
|
import {EventEmitter, Property} from '@avocado/mixins';
|
2019-04-07 11:43:50 -05:00
|
|
|
import {Synchronized} from '@avocado/state';
|
2019-03-28 12:31:41 -05:00
|
|
|
|
|
|
|
import {Tiles} from './tiles';
|
2019-03-25 23:39:44 -05:00
|
|
|
|
2019-03-27 01:52:24 -05:00
|
|
|
const decorate = compose(
|
|
|
|
EventEmitter,
|
|
|
|
Property('tilesetUri', {
|
|
|
|
track: true,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
2019-04-07 11:43:50 -05:00
|
|
|
export class Layer extends decorate(Synchronized) {
|
2019-03-25 23:39:44 -05:00
|
|
|
|
|
|
|
constructor() {
|
2019-03-27 16:18:27 -05:00
|
|
|
super();
|
2019-03-26 17:04:44 -05:00
|
|
|
this.entityList = new EntityList();
|
2019-03-27 01:52:24 -05:00
|
|
|
this.tiles = new Tiles();
|
|
|
|
// Listeners.
|
|
|
|
this.onEntityAddedToLayer = this.onEntityAddedToLayer.bind(this);
|
|
|
|
this.onEntityRemovedFromLayer = this.onEntityRemovedFromLayer.bind(this);
|
|
|
|
this.entityList.on('entityAdded', this.onEntityAddedToLayer);
|
|
|
|
this.entityList.on('entityRemoved', this.onEntityRemovedFromLayer);
|
2019-03-27 19:25:00 -05:00
|
|
|
this.onTileDataChanged = this.onTileDataChanged.bind(this);
|
|
|
|
this.tiles.on('dataChanged', this.onTileDataChanged);
|
2019-03-27 01:52:24 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
addEntity(entity) {
|
|
|
|
this.entityList.addEntity(entity);
|
|
|
|
}
|
|
|
|
|
|
|
|
destroy() {
|
|
|
|
this.entityList.destroy();
|
|
|
|
this.entityList.off('entityAdded', this.onEntityAddedToLayer);
|
|
|
|
this.entityList.off('entityRemoved', this.onEntityRemovedFromLayer);
|
2019-03-25 23:39:44 -05:00
|
|
|
}
|
|
|
|
|
2019-03-27 17:36:57 -05:00
|
|
|
findEntity(uuid) {
|
|
|
|
return this.entityList.findEntity(uuid);
|
|
|
|
}
|
|
|
|
|
2019-03-25 23:39:44 -05:00
|
|
|
fromJSON(json) {
|
2019-03-27 01:52:24 -05:00
|
|
|
if (json.entities) {
|
|
|
|
json.entities.forEach((entityJSON) => {
|
|
|
|
const entity = createEntity();
|
|
|
|
this.entityList.addEntity(entity.fromJSON(entityJSON));
|
|
|
|
});
|
|
|
|
}
|
2019-03-25 23:39:44 -05:00
|
|
|
if (json.tiles) {
|
2019-03-27 01:52:24 -05:00
|
|
|
this.tiles.fromJSON(json.tiles)
|
2019-03-25 23:39:44 -05:00
|
|
|
}
|
|
|
|
if (json.tilesetUri) {
|
|
|
|
this.tilesetUri = json.tilesetUri;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2019-03-27 01:52:24 -05:00
|
|
|
onEntityAddedToLayer(entity) {
|
|
|
|
entity.addTrait('layered');
|
|
|
|
entity.layer = this;
|
|
|
|
this.emit('entityAdded', entity)
|
|
|
|
}
|
|
|
|
|
|
|
|
onEntityRemovedFromLayer(entity) {
|
|
|
|
if (entity.is('layered')) {
|
|
|
|
entity.removeTrait('layered');
|
|
|
|
}
|
|
|
|
this.emit('entityRemoved', entity);
|
|
|
|
}
|
|
|
|
|
2019-03-27 19:25:00 -05:00
|
|
|
onTileDataChanged() {
|
|
|
|
this.emit('tileDataChanged');
|
|
|
|
}
|
|
|
|
|
2019-03-27 01:52:24 -05:00
|
|
|
removeEntity(entity) {
|
|
|
|
this.entityList.removeEntity(entity);
|
|
|
|
}
|
|
|
|
|
2019-03-27 19:25:00 -05:00
|
|
|
setTileAt(x, y, tile) {
|
|
|
|
this.tiles.setTileAt(x, y, tile);
|
|
|
|
}
|
|
|
|
|
2019-04-07 11:43:50 -05:00
|
|
|
synchronizedChildren() {
|
|
|
|
return [
|
|
|
|
'entityList',
|
|
|
|
'tiles',
|
|
|
|
'tilesetUri',
|
|
|
|
];
|
2019-03-26 17:04:44 -05:00
|
|
|
}
|
|
|
|
|
2019-03-27 17:39:34 -05:00
|
|
|
visibleEntities(query) {
|
|
|
|
return this.entityList.visibleEntities(query);
|
|
|
|
}
|
|
|
|
|
2019-03-27 01:52:24 -05:00
|
|
|
}
|