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.
 
 
 

215 lines
4.6 KiB

  1. define([
  2. 'js/system/events',
  3. 'js/system/client',
  4. 'ui/factory',
  5. 'html!ui/templates/characters/template',
  6. 'html!ui/templates/characters/templateListItem',
  7. 'css!ui/templates/characters/styles'
  8. ], function (
  9. events,
  10. client,
  11. uiFactory,
  12. template,
  13. templateListItem,
  14. styles
  15. ) {
  16. return {
  17. tpl: template,
  18. centered: true,
  19. characterInfo: {},
  20. selected: null,
  21. deleteCount: 0,
  22. postRender: function () {
  23. this.find('.btnPlay').on('click', this.onPlayClick.bind(this));
  24. this.find('.btnNew').on('click', this.onNewClick.bind(this));
  25. this.find('.btnDelete')
  26. .on('click', this.onDeleteClick.bind(this))
  27. .on('mouseleave', this.onDeleteReset.bind(this));
  28. this.getCharacters();
  29. },
  30. onPlayClick: function () {
  31. let char = this.selected;
  32. if (!char)
  33. return;
  34. this.el.addClass('disabled');
  35. client.request({
  36. cpn: 'auth',
  37. method: 'play',
  38. data: {
  39. name: this.selected
  40. },
  41. callback: this.onPlay.bind(this)
  42. });
  43. },
  44. onPlay: function () {
  45. this.el.removeClass('disabled');
  46. this.el.remove();
  47. events.emit('onEnterGame');
  48. },
  49. onNewClick: function () {
  50. uiFactory.build('createCharacter', {});
  51. this.el.remove();
  52. },
  53. getCharacters: function () {
  54. this.el.addClass('disabled');
  55. client.request({
  56. cpn: 'auth',
  57. method: 'getCharacterList',
  58. callback: this.onGetCharacters.bind(this)
  59. });
  60. },
  61. onGetCharacters: function (characters) {
  62. this.find('.sprite').css('background', '');
  63. this.find('.info div').html('');
  64. this.el.removeClass('disabled');
  65. let list = this.find('.left')
  66. .empty();
  67. characters
  68. .sort(function (a, b) {
  69. return (b.level - a.level);
  70. })
  71. .forEach(function (c, i) {
  72. let name = c.name;
  73. if (c.level != null)
  74. name += '<font class="color-yellowB"> (' + c.level + ')</font>';
  75. let html = templateListItem
  76. .replace('$NAME$', name);
  77. let li = $(html)
  78. .appendTo(list);
  79. li.on('click', this.onCharacterClick.bind(this, c.name));
  80. if (i == 0)
  81. li.click();
  82. }, this);
  83. },
  84. onCharacterClick: function (name, e) {
  85. this.el.addClass('disabled');
  86. let el = $(e.target);
  87. el.parent().find('.selected').removeClass('selected');
  88. el.addClass('selected');
  89. let charInfo = this.characterInfo[name];
  90. if (charInfo) {
  91. this.onGetCharacter(name, charInfo);
  92. return;
  93. }
  94. client.request({
  95. cpn: 'auth',
  96. method: 'getCharacter',
  97. data: {
  98. name: name
  99. },
  100. callback: this.onGetCharacter.bind(this, name)
  101. });
  102. },
  103. onGetCharacter: function (name, result) {
  104. this.find('.button').removeClass('disabled');
  105. let spriteY = ~~(result.cell / 8);
  106. let spirteX = result.cell - (spriteY * 8);
  107. spirteX = -(spirteX * 8);
  108. spriteY = -(spriteY * 8);
  109. let spritesheet = result.sheetName;
  110. if (spritesheet == 'characters')
  111. spritesheet = '../../../images/characters.png';
  112. this.find('.sprite')
  113. .css('background', 'url("' + spritesheet + '") ' + spirteX + 'px ' + spriteY + 'px')
  114. .show();
  115. this.find('.name').html(name);
  116. let stats = result.components.find(function (c) {
  117. return (c.type == 'stats');
  118. });
  119. if (stats) {
  120. this.find('.class').html(
  121. 'Lvl ' + stats.values.level +
  122. ' ' +
  123. result.class[0].toUpperCase() + result.class.substr(1)
  124. );
  125. } else
  126. this.find('.class').html('');
  127. this.el.removeClass('disabled');
  128. this.characterInfo[name] = result;
  129. this.selected = name;
  130. let prophecies = result.components.find(function (c) {
  131. return (c.type == 'prophecies');
  132. });
  133. if ((prophecies) && (prophecies.list.indexOf('hardcore') > -1))
  134. this.find('.name').html(name + ' (hc)');
  135. this.find('.btnPlay').removeClass('disabled');
  136. if (result.permadead) {
  137. this.find('.name').html(name + ' (hc - rip)');
  138. this.find('.btnPlay').addClass('disabled');
  139. }
  140. },
  141. setMessage: function (msg) {
  142. this.find('.message').html(msg);
  143. },
  144. onDeleteClick: function () {
  145. if (!this.selected)
  146. return;
  147. if (this.deleteCount < 3) {
  148. this.deleteCount++;
  149. this.setMessage('click delete ' + (4 - this.deleteCount) + ' more time' + ((this.deleteCount == 3) ? '' : 's') + ' to confirm');
  150. this.find('.btnDelete')
  151. .removeClass('deleting')
  152. .addClass('deleting')
  153. .html('delete (' + (4 - this.deleteCount) + ')');
  154. return;
  155. }
  156. this.onDeleteReset();
  157. this.el.addClass('disabled');
  158. client.request({
  159. cpn: 'auth',
  160. method: 'deleteCharacter',
  161. data: {
  162. name: this.selected
  163. },
  164. callback: this.onGetCharacters.bind(this)
  165. });
  166. },
  167. onDeleteReset: function () {
  168. this.setMessage('');
  169. this.deleteCount = 0;
  170. this.find('.btnDelete')
  171. .removeClass('deleting')
  172. .html('delete');
  173. }
  174. };
  175. });