/**
* Represents each action taken by a player.
* @constructor
* @param {Engine} engine - The game engine associated with the action.
* @param {Entity} entity - The entity associated with the action.
* @param {Entity} player - The player who requested the action.
* @param {Object} options - The arguments associated with the action.
*/
function Action(engine, entity, player, options) {
/**
* The game engine associated with the action.
* @var {Engine}
*/
this.engine = engine;
/**
* The entity associated with the action.
* @var {Entity}
*/
this.entity = entity;
/**
* The player who requested the action.
* Note that a player is an entity with a player component.
* It defaults to {@link PlayerComponent},
* but it can be changed by {@link TurnEngine}.
* @var {Entity}
*/
this.player = player;
/**
* The arguments associated with the action.
* @var {Object}
*/
this.options = options;
/**
* The result of the action.
* It should be null if it hasn't run yet.
* @var {Object}
*/
this.result = null;
}
/**
* Runs the action and applies changes to the engine.
* @param {Engine} engine - The game engine to assign.
* @throws Will throw an error if {@link action#run} is not implemented.
*/
Action.prototype.run = function(engine) {
throw new Error('Action.run is not implemented');
}
/**
* Serializes the action.
* @returns {Object} The serialized Action object
*/
Action.prototype.serialize = function() {
return {
name: this.name,
entity: this.entity ? this.entity.id : null,
player: this.player ? this.player.id : null,
options: this.options,
result: this.result
};
}
/**
* Deserializes the action.
* @static
* @param {Engine} engine - The game engine.
* @param {Object} object - Serialized Action object.
* @returns {Action} The deserialized Action object
*/
Action.deserialize = function(engine, action) {
var obj = engine.a(action.name, engine.e(action.entity),
engine.e(action.player), action.options);
obj.result = action.result;
return obj;
}
/**
* Creates a new Action class that has given function as {@link Action#run}.
* @static
* @param {Function} func - The function to use as {@link Action#run}.
* @param {Function} constructor - The function to use as constructor.
* @param {Function} [classObj=Action] - The class to extend from.
* @returns {Action} A new class that has specified function and class.
*/
Action.scaffold = function(func, constructor, classObj) {
classObj = classObj || Action;
var newClass = function(engine, entity, player, options) {
classObj.call(this, engine, entity, player, options);
if(constructor) {
constructor.call(this, engine, entity, player, options);
}
}
newClass.prototype = Object.create(classObj.prototype);
newClass.prototype.constructor = classObj;
newClass.prototype.run = func;
return newClass;
}
if(typeof module !== 'undefined') {
module.exports = Action;
}