25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

145 lines
2.7 KiB

  1. define([
  2. '../config/eventPhases/phaseTemplate'
  3. ], function(
  4. phaseTemplate
  5. ) {
  6. return {
  7. configs: null,
  8. init: function(instance) {
  9. this.instance = instance;
  10. var configs = null;
  11. try {
  12. configs = require('../config/maps/' + this.instance.map.name + '/events');
  13. }
  14. catch (e) {}
  15. if (!configs)
  16. return;
  17. this.configs = extend(true, [], configs);
  18. this.configs.forEach(c => (c.ttl = 5));
  19. },
  20. update: function() {
  21. var configs = this.configs;
  22. if (!configs)
  23. return;
  24. var cLen = configs.length;
  25. for (var i = 0; i < cLen; i++) {
  26. var c = configs[i];
  27. if (c.event) {
  28. this.updateEvent(c.event);
  29. continue;
  30. }
  31. else if (c.ttl > 0) {
  32. c.ttl--;
  33. continue;
  34. }
  35. c.event = this.startEvent(c);
  36. }
  37. },
  38. startEvent: function(config) {
  39. var event = {
  40. config: config,
  41. phases: [],
  42. participators: [],
  43. objects: [],
  44. nextPhase: 0
  45. };
  46. return event;
  47. },
  48. updateEvent: function(event) {
  49. var objects = event.objects;
  50. var oLen = objects.length;
  51. for (var i = 0; i < oLen; i++) {
  52. if (objects[i].destroyed) {
  53. objects.splice(i, 1);
  54. i--;
  55. oLen--;
  56. }
  57. }
  58. var currentPhases = event.phases;
  59. var cLen = currentPhases.length;
  60. var stillBusy = false;
  61. for (var i = 0; i < cLen; i++) {
  62. var phase = currentPhases[i];
  63. if (phase.end)
  64. continue
  65. else {
  66. stillBusy = true;
  67. phase.update();
  68. }
  69. }
  70. if (stillBusy)
  71. return;
  72. var config = event.config;
  73. var phases = config.phases;
  74. var pLen = phases.length;
  75. for (var i = event.nextPhase; i < pLen; i++) {
  76. var p = phases[i];
  77. var phaseFile = 'phase' + p.type[0].toUpperCase() + p.type.substr(1);
  78. var typeTemplate = require('config/eventPhases/' + phaseFile);
  79. var phase = extend(true, {
  80. instance: this.instance,
  81. event: event
  82. }, phaseTemplate, typeTemplate, p);
  83. event.phases.push(phase);
  84. phase.init();
  85. event.nextPhase = i + 1;
  86. if (!p.auto)
  87. break;
  88. }
  89. },
  90. getCloseEvents: function(obj) {
  91. var x = obj.x;
  92. var y = obj.y;
  93. var configs = this.configs;
  94. if (!configs)
  95. return;
  96. var cLen = configs.length;
  97. var result = [];
  98. for (var i = 0; i < cLen; i++) {
  99. var event = configs[i].event;
  100. if (!event)
  101. continue;
  102. else if (event.participators.some(p => (p == obj)))
  103. continue;
  104. var distance = event.config.distance;
  105. var objects = event.objects;
  106. var oLen = objects.length;
  107. for (var j = 0; j < oLen; j++) {
  108. var o = objects[j];
  109. if ((Math.abs(x - o.x) < distance) && (Math.abs(y - o.y) < distance)) {
  110. event.participators.push(obj);
  111. result.push(event);
  112. break;
  113. }
  114. }
  115. }
  116. return result;
  117. }
  118. };
  119. });