r3-legacy/src/game-lib-entity.js

233 lines
5.5 KiB
JavaScript
Raw Normal View History

2016-11-28 15:05:02 +01:00
/**
2017-01-06 16:53:53 +01:00
* Runtime Entity
2017-01-05 19:34:28 +01:00
* @param apiEntity GameLib.D3.API.Entity
* @constructor
*/
2017-01-06 16:53:53 +01:00
GameLib.Entity = function (
2016-12-09 20:32:09 +01:00
apiEntity
2016-11-28 15:05:02 +01:00
) {
if (GameLib.Utils.UndefinedOrNull(apiEntity)) {
apiEntity = {};
}
if (apiEntity instanceof GameLib.Entity) {
return apiEntity;
}
2016-12-15 14:53:39 +01:00
GameLib.API.Entity.call(
2016-12-09 20:32:09 +01:00
this,
2016-12-15 14:53:39 +01:00
apiEntity.id,
apiEntity.name,
2017-05-22 15:42:05 +02:00
apiEntity.components,
apiEntity.parentEntity,
apiEntity.parentEntityManager
2016-12-09 20:32:09 +01:00
);
2017-01-19 17:50:11 +01:00
this.componentToCreate = 0;
2017-06-16 15:49:53 +02:00
GameLib.Component.call(
this,
GameLib.Component.COMPONENT_ENTITY,
{
'components' : [GameLib.Component],
'activeComponent' : GameLib.Component
}
);
2016-12-12 17:24:05 +01:00
};
2016-12-15 14:53:39 +01:00
GameLib.Entity.prototype = Object.create(GameLib.API.Entity.prototype);
GameLib.Entity.prototype.constructor = GameLib.Entity;
2016-12-12 17:24:05 +01:00
/**
2016-12-15 14:53:39 +01:00
* Creates an entity instance
2016-12-12 17:24:05 +01:00
*/
2016-12-15 14:53:39 +01:00
GameLib.Entity.prototype.createInstance = function() {
/**
* FUCK ecsjs and tiny-ecs - no client-side support and shitty code (only takes constructors as args)
*/
return null;
};
/**
* Adds a component to this entity through the instance (should notify the entity manager instance)
* @param component
*/
GameLib.Entity.prototype.addComponent = function(component) {
this.components.push(component);
2017-05-16 11:50:06 +02:00
/**
* Here we will dig into this component - find all its 'parentEntity' members - and update them accordingly
*/
component.buildIdToObject();
2017-06-23 14:31:41 +02:00
/**
* Also add the child components of this component as components of this entity
*/
for (var property in component.idToObject) {
2017-06-23 14:31:41 +02:00
if (component.idToObject.hasOwnProperty(property) &&
component.idToObject[property] !== component &&
component.idToObject[property] instanceof GameLib.Component &&
this.components.indexOf(component.idToObject[property] === -1)
) {
this.components.push(component.idToObject[property]);
component.idToObject[property].parentEntity = this;
}
}
/**
* Finally, we are the boss component - update my parent entity
* @type {GameLib.Entity}
*/
component.parentEntity = this;
2017-05-16 11:50:06 +02:00
};
/**
* Returns all components of type 'constructor'
* @param constructor
*/
2017-05-16 11:50:06 +02:00
GameLib.Entity.prototype.getComponents = function(constructor) {
var components = this.components.reduce(
function(result, component) {
if (component instanceof constructor) {
result.push(component);
}
return result;
},
[]
);
return components;
};
/**
* Returns the first component or null
* @param constructor
*/
GameLib.Entity.prototype.getFirstComponent = function(constructor) {
2017-05-16 11:50:06 +02:00
var components = this.getComponents(constructor);
2017-01-19 17:50:11 +01:00
if (components.length > 0) {
return components[0];
2017-01-19 17:50:11 +01:00
}
return null;
};
/**
* Returns true when this entity has a certain component, false otherwise
* @param constructor
*/
GameLib.Entity.prototype.hasComponent = function(constructor) {
var has = this.components.reduce(
function(result, component) {
if (component instanceof constructor) {
result = true;
}
return result;
},
false
);
return has;
2017-01-02 17:05:40 +01:00
};
/**
*
* @param component
*/
GameLib.Entity.prototype.removeComponent = function(component) {
if (GameLib.Utils.UndefinedOrNull(component)) {
component = this.activeComponent;
}
/**
* We also had added all the child components of this component, so we remove them first
*/
for (var property in component.idToObject) {
if (component.idToObject.hasOwnProperty(property)) {
if (component.idToObject[property] instanceof GameLib.Component) {
if (component.idToObject[property].parentEntity === this) {
var childIndex = this.components.indexOf(component.idToObject[property]);
if (childIndex !== -1) {
this.components.splice(childIndex, 1);
component.idToObject[property].parentEntity = null;
}
}
}
}
}
2017-06-06 11:25:02 +02:00
/**
* Now we remove the boss entity
* @type {null}
*/
component.parentEntity = null;
2017-01-02 17:05:40 +01:00
return true;
2016-12-09 20:32:09 +01:00
};
/**
2016-12-15 14:53:39 +01:00
* Updates an entity instance
2016-12-09 20:32:09 +01:00
*/
2016-12-15 14:53:39 +01:00
GameLib.Entity.prototype.updateInstance = function() {
this.instance = this.createInstance(true);
};
2016-12-12 17:24:05 +01:00
2016-12-15 14:53:39 +01:00
/**
* Converts a GameLib.Entity to GameLib.API.Entity
* @returns {GameLib.API.Entity}
*/
2017-05-16 14:51:57 +02:00
GameLib.Entity.prototype.toApiObject = function() {
2016-12-15 14:53:39 +01:00
2017-06-02 13:52:29 +02:00
var apiComponents = this.components.reduce(
function(result, component) {
if (typeof component.toApiObject === 'function') {
result.push(component.toApiObject());
} else {
console.log('ignored runtime component : ' + component.name);
}
return result;
},
[]
);
return new GameLib.API.Entity(
this.id,
this.name,
2017-05-22 15:42:05 +02:00
apiComponents,
2017-06-02 13:52:29 +02:00
GameLib.Utils.IdOrNull(this.parentEntity),
GameLib.Utils.IdOrNull(this.parentEntityManager)
);
2016-12-09 20:32:09 +01:00
};
/**
2017-06-25 13:31:24 +02:00
* Entity from Object
2016-12-09 20:32:09 +01:00
* @param objectEntity Object
2017-06-25 13:31:24 +02:00
* @param parentEntityManager GameLib.D3.EntityManager
* @returns {GameLib.Entity}
2016-12-09 20:32:09 +01:00
* @constructor
*/
2017-06-25 13:31:24 +02:00
GameLib.Entity.FromObject = function(objectEntity, parentEntityManager) {
2017-06-14 14:21:57 +02:00
var apiEntity = GameLib.API.Entity.FromObject(objectEntity);
2016-12-15 14:53:39 +01:00
2017-06-25 13:31:24 +02:00
var entity = new GameLib.Entity(
apiEntity
);
2017-06-25 13:31:24 +02:00
if (GameLib.Utils.UndefinedOrNull(parentEntityManager)) {
return entity;
}
parentEntityManager.addEntity(entity);
return entity;
2016-11-01 09:43:36 +01:00
};