您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

153 行
3.5 KiB

  1. let passiveTree = require('../config/passiveTree');
  2. module.exports = {
  3. type: 'passives',
  4. selected: [],
  5. points: 0,
  6. init: function (blueprint) {
  7. this.selected = ((blueprint || {}).selected || []);
  8. this.selected.spliceWhere(s => (passiveTree.nodes.some(n => ((n.id === s) && (n.spiritStart)))));
  9. this.selected.push(passiveTree.nodes.find(n => (n.spiritStart === this.obj.class)).id);
  10. let points = this.calcPoints();
  11. if (points + this.selected.length < this.selected.length) {
  12. this.selected = [];
  13. this.selected.push(passiveTree.nodes.find(n => (n.spiritStart === this.obj.class)).id);
  14. blueprint.selected = this.selected;
  15. points = this.calcPoints();
  16. }
  17. this.points = points;
  18. blueprint.points = points;
  19. let stats = this.obj.stats;
  20. this.selected.forEach(function (id) {
  21. let node = passiveTree.nodes.find(n => (n.id === id));
  22. if (node) {
  23. for (let p in node.stats)
  24. stats.addStat(p, node.stats[p]);
  25. }
  26. });
  27. this.obj.spellbook.calcDps();
  28. },
  29. calcPoints: function () {
  30. let level = this.obj.stats.values.level;
  31. let points = level - this.selected.length + 1;
  32. if (level < consts.maxLevel)
  33. points--;
  34. return points;
  35. },
  36. tickNode: function (msg) {
  37. if (this.points <= 0)
  38. return;
  39. else if (this.selected.some(s => (s === msg.nodeId)))
  40. return;
  41. let nodeId = msg.nodeId;
  42. let node = passiveTree.nodes.find(n => (n.id === nodeId));
  43. if (!node || node.spiritStart)
  44. return;
  45. let linked = passiveTree.links.some(function (l) {
  46. if ((l.from !== node.id) && (l.to !== node.id))
  47. return false;
  48. return (
  49. (this.selected.indexOf(l.from) > -1) ||
  50. (this.selected.indexOf(l.to) > -1)
  51. );
  52. }, this);
  53. if (!linked)
  54. return;
  55. let passiveResult = {
  56. success: true
  57. };
  58. this.obj.fireEvent('onBeforePassivesChange', passiveResult, node);
  59. if (!passiveResult.success)
  60. return;
  61. this.obj.instance.eventEmitter.emit('onBeforePlayerPassivesChange', passiveResult, this.obj, node);
  62. if (!passiveResult.success)
  63. return;
  64. this.points--;
  65. this.obj.syncer.set(true, 'passives', 'points', this.points);
  66. this.selected.push(nodeId);
  67. this.obj.syncer.setArray(true, 'passives', 'tickNodes', nodeId);
  68. let stats = this.obj.stats;
  69. if (node) {
  70. for (let p in node.stats)
  71. stats.addStat(p, node.stats[p]);
  72. }
  73. this.obj.spellbook.calcDps();
  74. },
  75. untickNode: function (msg) {
  76. let passiveResult = {
  77. success: true
  78. };
  79. this.obj.fireEvent('onBeforePassivesChange', passiveResult);
  80. if (!passiveResult.success)
  81. return;
  82. this.obj.instance.eventEmitter.emit('onBeforePlayerPassivesChange', passiveResult, this.obj);
  83. if (!passiveResult.success)
  84. return;
  85. let stats = this.obj.stats;
  86. this.selected.forEach(function (s) {
  87. let node = passiveTree.nodes.find(n => (n.id === s));
  88. if (node.spiritStart)
  89. return;
  90. this.points++;
  91. this.obj.syncer.set(true, 'passives', 'points', this.points);
  92. this.obj.syncer.setArray(true, 'passives', 'untickNodes', node.id);
  93. if (node) {
  94. for (let p in node.stats)
  95. stats.addStat(p, -node.stats[p]);
  96. }
  97. }, this);
  98. this.selected = [];
  99. this.selected.push(passiveTree.nodes.find(n => (n.spiritStart === this.obj.class)).id);
  100. this.obj.spellbook.calcDps();
  101. this.obj.equipment.unequipAttrRqrGear();
  102. },
  103. simplify: function (self) {
  104. if (!self)
  105. return;
  106. return {
  107. type: 'passives',
  108. selected: this.selected,
  109. points: this.points
  110. };
  111. },
  112. events: {
  113. onLevelUp: function (level) {
  114. this.points = this.calcPoints();
  115. this.obj.syncer.set(true, 'passives', 'points', this.points);
  116. }
  117. }
  118. };