// Copyright 2019-2020 Campbell Crowley. All rights reserved.
// Author: Campbell Crowley (dev@campbellcrowley.com)
/**
* @description Manages game action firing and listeners.
*
* @memberof HungryGames
* @inner
*/
class ActionStore {
/**
* @description Create action store.
*/
constructor() {
const Action = require('./Action.js');
/**
* @description Fired as the event message being sent.
* @public
* @type {HungryGames~Action[]}
* @default
*/
this.eventInstant = [
new Action.SendEventMessageAction(),
];
/**
* @description Fired during the event if players get killed.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerDeath = [];
/**
* @description Fired during the event if players get revived.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerRevive = [];
/**
* @description Fired during the event if players get wounded.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerWound = [];
/**
* @description Fired during the event if players get healed.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerHealed = [];
/**
* @description Fired during the event if players kill another player.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerKilled = [];
/**
* @description Fired during the event if players gain weapons.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerGainWeapon = [];
/**
* @description Fired during the event if players lose weapons.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerLoseWeapon = [];
/**
* @description Fired during the event if players use their weapon.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerUseWeapon = [];
/**
* @description Fired during the event if player state is not changed for a
* player.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerUnAffected = [];
/**
* @description Fired during the event for all players.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.eventPlayerAffected = [];
/**
* @description Fired prior to the day starting.
* @public
* @type {HungryGames~Action[]}
* @default
*/
this.dayStart = [
new Action.SendDayStartMessageAction(),
];
/**
* @description Fired after a day has ended. Does not fire if game has
* ended.
* @public
* @type {HungryGames~Action[]}
* @default
*/
this.dayEnd = [
new Action.SendDayEndMessageAction(),
new Action.SendStatusListAction(),
new Action.SendAutoplayingMessageAlertAction(),
];
/**
* @description Fired for all players who end day alive.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.dayPlayerAlive = [];
/**
* @description Fired for all players who end day dead.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.dayPlayerDead = [];
/**
* @description Fired for all players who end day wounded.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.dayPlayerWounded = [];
/**
* @description Fired prior to the game starting.
* @public
* @type {HungryGames~Action[]}
* @default
*/
this.gameStart = [];
/**
* @description Fired after the game has ended.
* @public
* @type {HungryGames~Action[]}
* @default
*/
this.gameEnd = [
new Action.SendVictorAction(),
new Action.SendPlayerRankMessageAction(),
new Action.SendTeamRankMessageAction(),
];
/**
* @description Fired after the game has aborted.
* @public
* @type {HungryGames~Action[]}
* @default
*/
this.gameAbort = [];
/**
* @description Fired for all player who end the game alive.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.gamePlayerAlive = [];
/**
* @description Fired for all player who end the game dead.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.gamePlayerDead = [];
/**
* @description Fired for all player who end the game wounded.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.gamePlayerWounded = [];
/**
* @description Fired for all player who won the game.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.gamePlayerWin = [];
/**
* @description Fired for all player who lost the game.
* @public
* @type {HungryGames~MemberAction[]}
* @default
*/
this.gamePlayerLose = [];
}
/**
* @description Get a serializable version of this class instance. Strips all
* private variables, and all functions. Assumes all public variables are
* serializable if they aren't a function.
* @public
* @returns {object} Serializable version of this instance.
*/
get serializable() {
const all = Object.entries(Object.getOwnPropertyDescriptors(this));
const output = {};
for (const one of all) {
if (typeof one[1].value === 'function' || one[0].startsWith('_')) {
continue;
} else if (one[1].value && one[1].value.serializable) {
output[one[0]] = one[1].value.serializable;
} else if (Array.isArray(one[1].value)) {
output[one[0]] = [];
for (const two in one[1].value) {
if (!one[1].value[two]) continue;
output[one[0]][two] = one[1].value[two].serializable;
}
} else {
output[one[0]] = one[1].value;
}
}
return output;
}
/**
* @description Insert an action for a trigger.
* @public
* @param {string} name The name of the trigger to insert the action.
* @param {HungryGames~Action} action The action to insert.
* @returns {boolean} True if success, false if unable to find trigger by
* given name.
*/
insert(name, action) {
if (!Array.isArray(this[name])) return false;
const Action = require('./Action.js');
while (this[name].find((el) => el.id === action.id)) {
action.id = Action.createID();
}
this[name].push(action);
return true;
}
/**
* @description Remove an action from a trigger.
* @public
* @param {string} name The name of the trigger to remove from.
* @param {string} id The id of the action to remove.
* @returns {?Action} The removed action, or null if unable to find action.
*/
remove(name, id) {
if (!Array.isArray(this[name])) return false;
const index = this[name].findIndex((el) => el.id === id);
if (index < 0) return false;
return this[name].splice(index, 1);
}
/**
* @description Convert a serialized action store back into the object.
* @public
* @static
* @param {Discord~Client} client Client reference for obtaining
* discord object references.
* @param {string} id The Guild ID this action store is for.
* @param {object} obj Parsed data from save file.
* @returns {HungryGames~ActionStore} Parsed object data.
*/
static from(client, id, obj) {
const Action = require('./Action.js');
const out = new ActionStore();
const all = Object.entries(Object.getOwnPropertyDescriptors(out));
for (const one of all) {
if (!Array.isArray(one[1].value)) continue;
out[one[0]] = [];
for (const two in obj[one[0]]) {
if (!obj[one[0]][two]) continue;
const action = Action.from(client, id, obj[one[0]][two]);
if (!action) continue;
out[one[0]][two] = action;
}
}
return out;
}
}
module.exports = ActionStore;