Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

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