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.

341 lines
7.5 KiB

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