//Imports const spellBaseTemplate = require('../spells/spellTemplate'); //Helpers const getItemEffect = item => { return item.effects.find(e => (e.type === 'castSpellOnHit')); }; const doesEventMatch = (firedEvent, eventCondition) => { if ( !firedEvent || ( eventCondition.targetNotSelf === false && firedEvent.target === firedEvent.source ) ) return false; const foundNonMatch = Object.entries(eventCondition).some(([k, v]) => { if (v !== null && typeof(v) === 'object') { if (!doesEventMatch(firedEvent[k], v)) return true; return false; } return firedEvent[k] !== v; }); return !foundNonMatch; }; const shouldApplyEffect = (itemEffect, firedEvent, firedEventName) => { const { rolls: { chance, combatEvent: { [firedEventName]: eventCondition } } } = itemEffect; if (!eventCondition || !doesEventMatch(firedEvent, eventCondition)) return false; if (chance !== undefined && Math.random() * 100 >= chance) return false; return true; }; const handler = (obj, item, event, firedEventName) => { const itemEffect = getItemEffect(item); if (!shouldApplyEffect(itemEffect, event, firedEventName)) return; const { rolls: { castSpell, castTarget } } = itemEffect; const spellConfig = extend({}, castSpell); spellConfig.noEvents = true; const scaleDamage = spellConfig.scaleDamage; delete spellConfig.scaleDamage; if (scaleDamage) { if (scaleDamage.useOriginal) { scaleDamage.useOriginal.forEach(s => { spellConfig[s] = event.spell[s]; }); } if (scaleDamage.percentage) spellConfig.damage *= (scaleDamage.percentage / 100); } const typeTemplate = { type: spellConfig.type[0].toUpperCase() + spellConfig.type.substr(1), template: null }; obj.instance.eventEmitter.emit('onBeforeGetSpellTemplate', typeTemplate); if (!typeTemplate.template) typeTemplate.template = require('../spells/spell' + typeTemplate.type); const builtSpell = extend({ obj }, spellBaseTemplate, typeTemplate.template, spellConfig); let target = event.target; if (castTarget === 'self') target = obj; else if (castTarget === 'none') target = undefined; //Need to write a generic way to apply these else if (castTarget === '{{event.oldPos}}') target = extend({}, event.oldPos); else if (JSON.stringify(castTarget) === '{"x":"{{event.follower.x}}","y":"{{event.follower.y}}"}') { target = { x: event.follower.x, y: event.follower.y }; } builtSpell.cast({ target }); }; //Effect module.exports = { events: { afterGiveHp: function (item, event) { handler(this, item, event, 'afterGiveHp'); }, afterDealDamage: function (item, event) { handler(this, item, event, 'afterDealDamage'); }, afterPositionChange: function (item, event) { handler(this, item, event, 'afterPositionChange'); }, afterFollowerDeath: function (item, event) { handler(this, item, event, 'afterFollowerDeath'); } } };