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.
 
 
 

351 lines
7.4 KiB

  1. define([
  2. 'js/objects/objBase',
  3. 'js/system/events',
  4. 'js/rendering/renderer'
  5. ], function(
  6. objBase,
  7. events,
  8. renderer
  9. ) {
  10. var scale = 40;
  11. return {
  12. showNames: false,
  13. objects: [],
  14. dirty: false,
  15. init: function() {
  16. events.on('onKeyDown', this.onKeyDown.bind(this));
  17. events.on('onGetObject', this.onGetObject.bind(this));
  18. events.on('onRezone', this.onRezone.bind(this));
  19. events.on('onChangeHoverTile', this.getLocation.bind(this));
  20. },
  21. getLocation: function(x, y) {
  22. var objects = this.objects;
  23. var oLen = objects.length;
  24. var closest = 999;
  25. var mob = null;
  26. for (var i = 0; i < oLen; i++) {
  27. var o = objects[i];
  28. if ((!o.stats) || (o.nonSelectable))
  29. continue;
  30. var dx = Math.abs(o.x - x);
  31. if ((dx < 3) && (dx < closest)) {
  32. var dy = Math.abs(o.y - y);
  33. if ((dy < 3) && (dy < closest)) {
  34. mob = o;
  35. closest = Math.max(dx, dy);
  36. }
  37. }
  38. }
  39. events.emit('onMobHover', mob);
  40. },
  41. getClosest: function(x, y, maxDistance, reverse, fromMob, callback) {
  42. var objects = this.objects;
  43. var oLen = objects.length;
  44. var list = objects.filter(function(o) {
  45. if ((!o.stats) || (o.nonSelectable) || (o == window.player))
  46. return false;
  47. var dx = Math.abs(o.x - x);
  48. if (dx < maxDistance) {
  49. var dy = Math.abs(o.y - y);
  50. if (dy < maxDistance)
  51. return true;
  52. }
  53. });
  54. if (list.length == 0)
  55. return null;
  56. list.sort(function(a, b) {
  57. var aDistance = Math.max(Math.abs(x - a.x), Math.abs(y - a.y));
  58. var bDistance = Math.max(Math.abs(x - b.x), Math.abs(y - b.y));
  59. return (aDistance - bDistance);
  60. });
  61. if (!fromMob)
  62. return list[0];
  63. var fromIndex = list.firstIndex(function(l) {
  64. return (l.id == fromMob.id);
  65. });
  66. if (reverse) {
  67. fromIndex = (fromIndex === 0 ? list.length : fromIndex) - 1;
  68. } else {
  69. fromIndex = (fromIndex + 1) % list.length;
  70. }
  71. return list[fromIndex];
  72. },
  73. onRezone: function(oldZone) {
  74. var objects = this.objects;
  75. var oLen = objects.length
  76. for (var i = 0; i < oLen; i++) {
  77. var o = objects[i];
  78. if (oldZone == null)
  79. o.destroy();
  80. else if ((o.zoneId == oldZone) && (o.player == null))
  81. o.destroy();
  82. }
  83. window.player.offEvents();
  84. },
  85. onGetObject: function(obj) {
  86. this.dirty = true;
  87. //Things like attacks don't have ids
  88. var exists = null;
  89. if (obj.id != null) {
  90. exists = this.objects.find(function(o) {
  91. return ((o.id == obj.id) && (!o.destroyed));
  92. });
  93. }
  94. if (!exists)
  95. exists = this.buildObject(obj);
  96. else {
  97. this.updateObject(exists, obj);
  98. }
  99. },
  100. buildObject: function(template) {
  101. var obj = $.extend(true, {}, objBase);
  102. var components = template.components || [];
  103. delete template.components;
  104. for (var p in template) {
  105. var value = template[p];
  106. var type = typeof(value);
  107. if (type == 'object') {
  108. } else
  109. obj[p] = value;
  110. }
  111. if (obj.sheetName) {
  112. obj.sprite = renderer.buildObject(obj);
  113. if (template.hidden)
  114. obj.sprite.visible = false;
  115. }
  116. components.forEach(function(c) {
  117. //Map ids to objects
  118. var keys = Object.keys(c).filter(function(k) {
  119. return ((k.indexOf('id') == 0) && (k.length > 2));
  120. });
  121. keys.forEach(function(k) {
  122. var value = c[k];
  123. var newKey = k.substr(2, k.length).toLowerCase();
  124. c[newKey] = this.objects.find(function(o) {
  125. return (o.id == value);
  126. });
  127. delete c[k];
  128. }, this);
  129. obj.addComponent(c.type, c);
  130. }, this);
  131. this.objects.push(obj);
  132. if (obj.self) {
  133. events.emit('onGetPlayer', obj);
  134. window.player = obj;
  135. renderer.setPosition({
  136. x: (obj.x - (renderer.width / (scale * 2))) * scale,
  137. y: (obj.y - (renderer.height / (scale * 2))) * scale
  138. }, true);
  139. }
  140. if ((obj.name) && (obj.sprite)) {
  141. obj.nameSprite = renderer.buildText({
  142. layerName: 'effects',
  143. text: obj.name,
  144. x: (obj.x * scale) + (scale / 2),
  145. y: (obj.y * scale) + scale
  146. });
  147. obj.nameSprite.visible = this.showNames;
  148. }
  149. return obj;
  150. },
  151. updateObject: function(obj, template) {
  152. var components = template.components || [];
  153. components.forEach(function(c) {
  154. //Map ids to objects
  155. var keys = Object.keys(c).filter(function(k) {
  156. return ((k.indexOf('id') == 0) && (k.length > 2));
  157. });
  158. keys.forEach(function(k) {
  159. var value = c[k];
  160. var newKey = k.substr(2, k.length).toLowerCase();
  161. c[newKey] = this.objects.find(function(o) {
  162. return (o.id == value);
  163. });
  164. delete c[k];
  165. }, this);
  166. obj.addComponent(c.type, c);
  167. }, this);
  168. delete template.components;
  169. var oldX = obj.x;
  170. var sprite = obj.sprite;
  171. var moved = false;
  172. for (var p in template) {
  173. var value = template[p];
  174. var type = typeof(value);
  175. if (type != 'object')
  176. obj[p] = value;
  177. if ((p == 'x') || (p == 'y'))
  178. moved = true;
  179. if (sprite) {
  180. if (p == 'x') {
  181. if (obj.x < oldX)
  182. obj.flipX = true;
  183. else if (obj.x > oldX)
  184. obj.flipX = false;
  185. }
  186. }
  187. }
  188. if (moved)
  189. obj.setSpritePosition();
  190. if (((template.sheetName) || (template.cell)) && (sprite))
  191. renderer.setSprite(obj);
  192. if (sprite) {
  193. if (template.hidden != null) {
  194. sprite.visible = !template.hidden;
  195. }
  196. }
  197. if ((template.x != 0) || (template.y != 0)) {
  198. if (obj.stats)
  199. obj.stats.updateHpSprite();
  200. }
  201. if ((!obj.sprite) && (template.sheetName))
  202. obj.sprite = renderer.buildObject(obj);
  203. if ((!obj.nameSprite) && (template.name)) {
  204. obj.nameSprite = renderer.buildText({
  205. layerName: 'effects',
  206. text: template.name,
  207. x: (obj.x * scale) + (scale / 2),
  208. y: (obj.y * scale) + scale
  209. });
  210. obj.nameSprite.visible = this.showNames;
  211. }
  212. obj.setSpritePosition();
  213. },
  214. update: function() {
  215. var objects = this.objects;
  216. var len = objects.length;
  217. for (var i = 0; i < len; i++) {
  218. var o = objects[i];
  219. if (o.destroyed) {
  220. o.destroy();
  221. objects.splice(i, 1);
  222. i--;
  223. len--;
  224. continue;
  225. }
  226. o.update();
  227. if (o.dirty)
  228. this.dirty = true;
  229. }
  230. },
  231. render: function() {
  232. canvas.renderMap();
  233. var objects = this.objects;
  234. var len = objects.length;
  235. var showNames = this.showNames;
  236. var ctx = canvas.layers.effects.ctx;
  237. if (showNames) {
  238. ctx.font = '14px bitty';
  239. ctx.strokeStyle = 'rgb(0, 0, 0)';
  240. }
  241. for (var i = 0; i < len; i++) {
  242. var o = objects[i];
  243. o.render();
  244. if (o.stats) {
  245. var yOffset = 12;
  246. if (o.isChampion)
  247. yOffset = 18;
  248. ctx.globalAlpha = 1;
  249. var statValues = o.stats.values;
  250. var hp = statValues.hp;
  251. var hpMax = statValues.hpMax;
  252. if (hp < hpMax) {
  253. ctx.fillStyle = 'rgb(0, 0, 0)';
  254. ctx.fillRect(o.x * scale, (o.y * scale) - yOffset, scale, 4);
  255. var w = (hp / hpMax) * scale;
  256. ctx.fillStyle = '#cf0056';
  257. ctx.fillRect(o.x * scale, (o.y * scale) - yOffset, w, 4);
  258. }
  259. }
  260. if ((!showNames) || (!o.name))
  261. continue;
  262. //OPTIMIZE: Don't wanna set this every time
  263. ctx.globalAlpha = 1;
  264. ctx.fillStyle = 'rgb(255, 255, 255)';
  265. canvas.renderOutlineText('effects', o.name, (o.x * scale) + (scale / 2), ((o.y + 1) * scale) + (scale / 4), true);
  266. }
  267. },
  268. onKeyDown: function(key) {
  269. if (key == 'v') {
  270. this.showNames = !this.showNames;
  271. var showNames = this.showNames;
  272. var objects = this.objects;
  273. var oLen = objects.length;
  274. for (var i = 0; i < oLen; i++) {
  275. var ns = objects[i].nameSprite;
  276. if (!ns)
  277. continue;
  278. ns.visible = showNames;
  279. }
  280. }
  281. }
  282. };
  283. });