You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

100 lines
2.3 KiB

  1. //Imports
  2. const spellBaseTemplate = require('../spells/spellTemplate');
  3. //Helpers
  4. const getItemEffect = item => {
  5. return item.effects.find(e => (e.type === 'castSpellOnHit'));
  6. };
  7. const doesEventMatch = (firedEvent, eventCondition) => {
  8. if (
  9. !firedEvent ||
  10. (
  11. eventCondition.targetNotSelf === false &&
  12. firedEvent.target === firedEvent.source
  13. )
  14. )
  15. return false;
  16. const foundNonMatch = Object.entries(eventCondition).some(([k, v]) => {
  17. if (v !== null && typeof(v) === 'object') {
  18. if (!doesEventMatch(firedEvent[k], v))
  19. return true;
  20. return false;
  21. }
  22. return firedEvent[k] !== v;
  23. });
  24. return !foundNonMatch;
  25. };
  26. const shouldApplyEffect = (itemEffect, firedEvent, firedEventName) => {
  27. const { rolls: { chance, combatEvent: { [firedEventName]: eventCondition } } } = itemEffect;
  28. if (!eventCondition || !doesEventMatch(firedEvent, eventCondition))
  29. return false;
  30. if (chance !== undefined && Math.random() * 100 >= chance)
  31. return false;
  32. return true;
  33. };
  34. const handler = (obj, item, event, firedEventName) => {
  35. const itemEffect = getItemEffect(item);
  36. if (!shouldApplyEffect(itemEffect, event, firedEventName))
  37. return;
  38. const { rolls: { castSpell, castTarget } } = itemEffect;
  39. const spellConfig = extend({}, castSpell);
  40. spellConfig.noEvents = true;
  41. const scaleDamage = spellConfig.scaleDamage;
  42. delete spellConfig.scaleDamage;
  43. if (scaleDamage) {
  44. if (scaleDamage.s_useOriginal) {
  45. scaleDamage.s_useOriginal.forEach(s => {
  46. spellConfig[s] = event.spell[s];
  47. });
  48. }
  49. if (scaleDamage.percentage)
  50. spellConfig.damage *= (scaleDamage.percentage / 100);
  51. }
  52. const spellName = 'spell' + spellConfig.type.replace(/./, spellConfig.type.toUpperCase()[0]);
  53. const spellTemplate = require(`../spells/${spellName}`);
  54. const builtSpell = extend({ obj }, spellBaseTemplate, spellTemplate, spellConfig);
  55. let target = event.target;
  56. if (castTarget === 'self')
  57. target = obj;
  58. else if (castTarget === 'none')
  59. target = undefined;
  60. builtSpell.cast({ target });
  61. };
  62. //Effect
  63. module.exports = {
  64. events: {
  65. afterGiveHp: function (item, event) {
  66. handler(this, item, event, 'afterGiveHp');
  67. },
  68. afterDealDamage: function (item, event) {
  69. handler(this, item, event, 'afterDealDamage');
  70. },
  71. afterPositionChange: function (item, event) {
  72. handler(this, item, event, 'afterPositionChange');
  73. }
  74. }
  75. };