Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

370 righe
8.4 KiB

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