Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

168 lignes
3.4 KiB

  1. const getTargetPos = (physics, obj, m, pushback) => {
  2. let targetPos = {
  3. x: m.x,
  4. y: m.y
  5. };
  6. let dx = m.x - obj.x;
  7. let dy = m.y - obj.y;
  8. while ((dx === 0) && (dy === 0)) {
  9. dx = ~~(Math.random() * 2) - 1;
  10. dy = ~~(Math.random() * 2) - 1;
  11. }
  12. dx = ~~(dx / Math.abs(dx));
  13. dy = ~~(dy / Math.abs(dy));
  14. for (let l = 0; l < pushback; l++) {
  15. if (physics.isTileBlocking(targetPos.x + dx, targetPos.y + dy)) {
  16. if (physics.isTileBlocking(targetPos.x + dx, targetPos.y)) {
  17. if (physics.isTileBlocking(targetPos.x, targetPos.y + dy))
  18. break;
  19. else {
  20. dx = 0;
  21. targetPos.y += dy;
  22. }
  23. } else {
  24. dy = 0;
  25. targetPos.x += dx;
  26. }
  27. } else {
  28. targetPos.x += dx;
  29. targetPos.y += dy;
  30. }
  31. }
  32. return targetPos;
  33. };
  34. module.exports = {
  35. type: 'fireblast',
  36. targetGround: true,
  37. targetPlayerPos: true,
  38. radius: 2,
  39. pushback: 4,
  40. damage: 1,
  41. cast: function (action) {
  42. let obj = this.obj;
  43. let { x, y, instance: { physics, syncer } } = obj;
  44. let radius = this.radius;
  45. const particleEvent = {
  46. source: this,
  47. particleConfig: extend({}, this.particles)
  48. };
  49. obj.fireEvent('beforeSpawnParticles', particleEvent);
  50. for (let i = x - radius; i <= x + radius; i++) {
  51. for (let j = y - radius; j <= y + radius; j++) {
  52. if (!physics.hasLos(~~x, ~~y, ~~i, ~~j))
  53. continue;
  54. let effect = {
  55. x: i,
  56. y: j,
  57. components: [{
  58. type: 'particles',
  59. ttl: 10,
  60. blueprint: particleEvent.particleConfig
  61. }]
  62. };
  63. if ((i !== x) || (j !== y))
  64. syncer.queue('onGetObject', effect, -1);
  65. let mobs = physics.getCell(i, j);
  66. let mLen = mobs.length;
  67. for (let k = 0; k < mLen; k++) {
  68. let m = mobs[k];
  69. //Maybe we killed something?
  70. if (!m) {
  71. mLen--;
  72. continue;
  73. } else if (!m.aggro || !m.effects)
  74. continue;
  75. else if (!obj.aggro.canAttack(m))
  76. continue;
  77. const targetPos = getTargetPos(physics, obj, m, this.pushback);
  78. let distance = Math.max(Math.abs(m.x - targetPos.x), Math.abs(m.y - targetPos.y));
  79. let ttl = distance * 125;
  80. m.clearQueue();
  81. let damage = this.getDamage(m);
  82. m.stats.takeDamage(damage, 1, obj);
  83. if (m.destroyed)
  84. continue;
  85. const eventMsg = {
  86. success: true,
  87. targetPos
  88. };
  89. m.fireEvent('beforePositionChange', eventMsg);
  90. if (!eventMsg.success)
  91. continue;
  92. const targetEffect = m.effects.addEffect({
  93. type: 'stunned',
  94. silent: true
  95. });
  96. //If targetEffect is undefined, it means that the target has become resistant
  97. if (!targetEffect)
  98. continue;
  99. this.sendAnimation({
  100. id: m.id,
  101. components: [{
  102. type: 'moveAnimation',
  103. targetX: targetPos.x,
  104. targetY: targetPos.y,
  105. ttl: ttl
  106. }]
  107. });
  108. this.queueCallback(this.endEffect.bind(this, m, targetPos, targetEffect), ttl, null, m);
  109. }
  110. }
  111. }
  112. this.sendBump({
  113. x: x,
  114. y: y - 1
  115. });
  116. return true;
  117. },
  118. endEffect: function (target, targetPos, targetEffect) {
  119. target.effects.removeEffect(targetEffect.id);
  120. target.instance.physics.removeObject(target, target.x, target.y);
  121. target.x = targetPos.x;
  122. target.y = targetPos.y;
  123. let syncer = target.syncer;
  124. syncer.o.x = targetPos.x;
  125. syncer.o.y = targetPos.y;
  126. target.instance.physics.addObject(target, target.x, target.y);
  127. const moveEvent = {
  128. newPos: targetPos,
  129. source: this
  130. };
  131. target.fireEvent('afterPositionChange', moveEvent);
  132. }
  133. };