Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

147 linhas
2.9 KiB

  1. define([
  2. ], function(
  3. ) {
  4. return {
  5. type: 'fireblast',
  6. targetGround: true,
  7. radius: 2,
  8. pushback: 4,
  9. cast: function(action) {
  10. var obj = this.obj;
  11. var radius = this.radius;
  12. var x = obj.x;
  13. var y = obj.y;
  14. var physics = obj.instance.physics;
  15. var syncer = obj.instance.syncer;
  16. for (var i = x - radius; i <= x + radius; i++) {
  17. for (var j = y - radius; j <= y + radius; j++) {
  18. if (!physics.hasLos(~~x, ~~y, ~~i, ~~j))
  19. continue;
  20. var effect = {
  21. x: i,
  22. y: j,
  23. components: [{
  24. type: 'particles',
  25. blueprint: this.particles
  26. }]
  27. };
  28. if ((i != x) || (j != y))
  29. syncer.queue('onGetObject', effect);
  30. var mobs = physics.getCell(i, j);
  31. var mLen = mobs.length;
  32. for (var k = 0; k < mLen; k++) {
  33. var m = mobs[k];
  34. //Maybe we killed something?
  35. if (!m) {
  36. mLen--;
  37. continue;
  38. }
  39. if (!m.aggro)
  40. continue;
  41. var isPlayer = !!this.obj.player;
  42. var isTargetPlayer = !!m.player;
  43. if ((!this.obj.aggro.willAttack(m)) && (isPlayer == isTargetPlayer))
  44. continue;
  45. var targetEffect = m.effects.addEffect({
  46. type: 'stunned',
  47. noMsg: true
  48. });
  49. var ttl = 350;
  50. var targetPos = {
  51. x: m.x,
  52. y: m.y
  53. };
  54. //Find out where the mob should end up
  55. var dx = m.x - obj.x;
  56. var dy = m.y - obj.y;
  57. while ((dx == 0) && (dy == 0)) {
  58. dx = ~~(Math.random() * 2) - 1;
  59. dy = ~~(Math.random() * 2) - 1;
  60. }
  61. dx = ~~(dx / Math.abs(dx));
  62. dy = ~~(dy / Math.abs(dy));
  63. for (var l = 0; l < this.pushback; l++) {
  64. if (physics.isTileBlocking(targetPos.x + dx, targetPos.y + dy)) {
  65. if (physics.isTileBlocking(targetPos.x + dx, targetPos.y)) {
  66. if (physics.isTileBlocking(targetPos.x, targetPos.y + dy)) {
  67. break;
  68. } else {
  69. dx = 0;
  70. targetPos.y += dy;
  71. }
  72. } else {
  73. dy = 0;
  74. targetPos.x += dx;
  75. }
  76. } else {
  77. targetPos.x += dx;
  78. targetPos.y += dy;
  79. }
  80. }
  81. m.clearQueue();
  82. this.sendAnimation({
  83. id: m.id,
  84. components: [{
  85. type: 'moveAnimation',
  86. targetX: targetPos.x,
  87. targetY: targetPos.y,
  88. ttl: ttl
  89. }]
  90. });
  91. var damage = this.getDamage(m);
  92. m.stats.takeDamage(damage, 1, obj);
  93. physics.removeObject(m, m.x, m.y);
  94. this.queueCallback(this.endEffect.bind(this, m, targetPos, targetEffect), ttl);
  95. }
  96. }
  97. }
  98. this.sendBump({
  99. x: x,
  100. y: y - 1
  101. });
  102. return true;
  103. },
  104. endEffect: function(target, targetPos, targetEffect) {
  105. target.effects.removeEffect(targetEffect, true);
  106. target.x = targetPos.x;
  107. target.y = targetPos.y;
  108. var syncer = target.syncer;
  109. syncer.o.x = targetPos.x;
  110. syncer.o.y = targetPos.y;
  111. target.instance.physics.addObject(target, target.x, target.y);
  112. }
  113. };
  114. });