您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

216 行
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. var 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. var 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. var name = c.name;
  73. if (c.level != null)
  74. name += '<font class="color-yellowB"> (' + c.level + ')</font>'
  75. var html = templateListItem
  76. .replace('$NAME$', name);
  77. var 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. var el = $(e.target);
  87. el.parent().find('.selected').removeClass('selected');
  88. el.addClass('selected');
  89. var 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. var spriteY = ~~(result.cell / 8);
  106. var spirteX = result.cell - (spriteY * 8);
  107. spirteX = -(spirteX * 8);
  108. spriteY = -(spriteY * 8);
  109. var 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. var 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. }
  128. this.el.removeClass('disabled');
  129. this.characterInfo[name] = result;
  130. this.selected = name;
  131. var prophecies = result.components.find(function (c) {
  132. return (c.type == 'prophecies');
  133. });
  134. if ((prophecies) && (prophecies.list.indexOf('hardcore') > -1))
  135. this.find('.name').html(name + ' (hc)');
  136. this.find('.btnPlay').removeClass('disabled');
  137. if (result.permadead) {
  138. this.find('.name').html(name + ' (hc - rip)');
  139. this.find('.btnPlay').addClass('disabled');
  140. }
  141. },
  142. setMessage: function (msg) {
  143. this.find('.message').html(msg);
  144. },
  145. onDeleteClick: function () {
  146. if (!this.selected)
  147. return;
  148. if (this.deleteCount < 3) {
  149. this.deleteCount++;
  150. this.setMessage('click delete ' + (4 - this.deleteCount) + ' more time' + ((this.deleteCount == 3) ? '' : 's') + ' to confirm');
  151. this.find('.btnDelete')
  152. .removeClass('deleting')
  153. .addClass('deleting')
  154. .html('delete (' + (4 - this.deleteCount) + ')')
  155. return;
  156. }
  157. this.onDeleteReset();
  158. this.el.addClass('disabled');
  159. client.request({
  160. cpn: 'auth',
  161. method: 'deleteCharacter',
  162. data: {
  163. name: this.selected
  164. },
  165. callback: this.onGetCharacters.bind(this)
  166. });
  167. },
  168. onDeleteReset: function () {
  169. this.setMessage('');
  170. this.deleteCount = 0;
  171. this.find('.btnDelete')
  172. .removeClass('deleting')
  173. .html('delete');
  174. }
  175. };
  176. });