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.
 
 
 

71 lines
1.3 KiB

  1. let cpnDeathStopper = {
  2. type: 'deathStopper',
  3. percentage: 0,
  4. end: false,
  5. events: {
  6. beforeTakeDamage: function ({ damage }) {
  7. let statValues = this.obj.stats.values;
  8. let minHp = statValues.hpMax * this.percentage;
  9. if (statValues.hp - damage.amount < minHp) {
  10. this.end = true;
  11. damage.amount = Math.max(0, statValues.hp - minHp);
  12. }
  13. }
  14. }
  15. };
  16. module.exports = {
  17. mobs: null,
  18. init: function () {
  19. if (!this.mobs.push)
  20. this.mobs = [this.mobs];
  21. let mobs = this.mobs;
  22. let percentage = this.percentage;
  23. let objects = this.instance.objects.objects;
  24. let oLen = objects.length;
  25. for (let i = 0; i < oLen; i++) {
  26. let o = objects[i];
  27. let index = mobs.indexOf(o.id);
  28. if (index === -1)
  29. continue;
  30. if (percentage) {
  31. let cpn = extend({}, cpnDeathStopper, {
  32. percentage: percentage
  33. });
  34. o.components.push(cpn);
  35. cpn.obj = o;
  36. }
  37. mobs.splice(index, 1, o);
  38. }
  39. },
  40. update: function () {
  41. let mobs = this.mobs;
  42. let mLen = mobs.length;
  43. for (let i = 0; i < mLen; i++) {
  44. let m = mobs[i];
  45. let destroyed = m.destroyed;
  46. if (!destroyed) {
  47. let deathStopper = m.components.find(c => (c.type === 'deathStopper'));
  48. if (deathStopper)
  49. destroyed = deathStopper.end;
  50. }
  51. if (destroyed) {
  52. mobs.splice(i, 1);
  53. mLen--;
  54. i--;
  55. }
  56. }
  57. if (mobs.length === 0)
  58. this.end = true;
  59. }
  60. };