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.
 
 
 

161 lines
3.0 KiB

  1. define([
  2. 'js/components/components',
  3. 'js/rendering/renderer',
  4. 'js/system/events'
  5. ], function (
  6. components,
  7. renderer,
  8. events
  9. ) {
  10. let scale = 40;
  11. let scaleMult = 5;
  12. return {
  13. components: [],
  14. offsetX: 0,
  15. offsetY: 0,
  16. eventCallbacks: {},
  17. addComponent: function (type, options) {
  18. let c = this[type];
  19. if ((!c) || (options.new)) {
  20. let template = components.getTemplate(type);
  21. if (!template)
  22. return;
  23. c = $.extend(true, {}, template);
  24. c.obj = this;
  25. for (let o in options)
  26. c[o] = options[o];
  27. //Only use component to initialize other components?
  28. if ((c.init) && (c.init(options)))
  29. return null;
  30. this[c.type] = c;
  31. this.components.push(c);
  32. return c;
  33. }
  34. if (c.extend)
  35. c.extend(options);
  36. return c;
  37. },
  38. removeComponent: function (type) {
  39. let cpn = this[type];
  40. if (!cpn)
  41. return;
  42. this.components.spliceWhere(function (c) {
  43. return (c == cpn);
  44. });
  45. delete this[type];
  46. },
  47. update: function () {
  48. let components = this.components;
  49. let len = components.length;
  50. for (let i = 0; i < len; i++) {
  51. let c = components[i];
  52. if (c.update)
  53. c.update();
  54. if (c.destroyed) {
  55. if (c.destroy)
  56. c.destroy();
  57. components.splice(i, 1);
  58. i--;
  59. len--;
  60. delete this[c.type];
  61. }
  62. }
  63. },
  64. on: function (event, callback) {
  65. let list = this.eventCallbacks[event] || (this.eventCallbacks[event] = []);
  66. list.push(events.on(event, callback));
  67. },
  68. setSpritePosition: function () {
  69. if (!this.sprite)
  70. return;
  71. this.sprite.x = (this.x * scale) + (this.flipX ? scale : 0) + this.offsetX;
  72. let oldY = this.sprite.x;
  73. this.sprite.y = (this.y * scale) + this.offsetY;
  74. if (this.sprite.width > scale) {
  75. if (this.flipX)
  76. this.sprite.x += scale;
  77. else
  78. this.sprite.x -= scale;
  79. this.sprite.y -= (scale * 2);
  80. }
  81. if (oldY != this.sprite.y)
  82. renderer.reorder();
  83. this.sprite.scale.x = (this.flipX ? -scaleMult : scaleMult);
  84. ['nameSprite', 'chatSprite'].forEach(function (s, i) {
  85. let sprite = this[s];
  86. if (!sprite)
  87. return;
  88. let yAdd = scale;
  89. if (i == 1) {
  90. yAdd *= -0.8;
  91. yAdd -= (this.chatter.msg.split('\r\n').length - 1) * scale * 0.8;
  92. }
  93. sprite.x = (this.x * scale) + (scale / 2) - (sprite.width / 2);
  94. sprite.y = (this.y * scale) + yAdd;
  95. }, this);
  96. if (this.stats)
  97. this.stats.updateHpSprite();
  98. },
  99. destroy: function () {
  100. if (this.sprite)
  101. renderer.destroyObject(this);
  102. if (this.nameSprite) {
  103. renderer.destroyObject({
  104. layerName: 'effects',
  105. sprite: this.nameSprite
  106. });
  107. }
  108. let components = this.components;
  109. let cLen = components.length;
  110. for (let i = 0; i < cLen; i++) {
  111. let c = components[i];
  112. if (c.destroy)
  113. c.destroy();
  114. }
  115. this.destroyed = true;
  116. this.offEvents();
  117. },
  118. offEvents: function () {
  119. if (this.pather)
  120. this.pather.onDeath();
  121. for (var e in this.eventCallbacks) {
  122. this.eventCallbacks[e].forEach(function (c) {
  123. events.off(e, c);
  124. }, this);
  125. }
  126. }
  127. };
  128. });