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.

224 lines
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. //if (c.name == 'Rivenrime')
  89. // li.click();
  90. }, this);
  91. },
  92. onCharacterClick: function(name, e) {
  93. this.el.addClass('disabled');
  94. var el = $(e.target);
  95. el.parent().find('.selected').removeClass('selected');
  96. el.addClass('selected');
  97. var charInfo = this.characterInfo[name];
  98. if (charInfo) {
  99. this.onGetCharacter(name, charInfo);
  100. return;
  101. }
  102. client.request({
  103. cpn: 'auth',
  104. method: 'getCharacter',
  105. data: {
  106. name: name
  107. },
  108. callback: this.onGetCharacter.bind(this, name)
  109. });
  110. },
  111. onGetCharacter: function(name, result) {
  112. this.find('.button').removeClass('disabled');
  113. var spriteY = ~~(result.cell / 8);
  114. var spirteX = result.cell - (spriteY * 8);
  115. spirteX = -(spirteX * 32);
  116. spriteY = -(spriteY * 32);
  117. this.find('.sprite')
  118. .css('background', 'url("../../../images/charas.png") ' + spirteX + 'px ' + spriteY + 'px')
  119. .show();
  120. this.find('.name').html(name);
  121. var stats = result.components.find(function(c) {
  122. return (c.type == 'stats');
  123. });
  124. if (stats) {
  125. this.find('.class').html(
  126. 'Lvl ' + stats.values.level +
  127. ' ' +
  128. result.class[0].toUpperCase() + result.class.substr(1)
  129. );
  130. }
  131. else {
  132. this.find('.class').html('');
  133. }
  134. this.el.removeClass('disabled');
  135. this.characterInfo[name] = result;
  136. this.selected = name;
  137. var prophecies = result.components.find(function(c) {
  138. return (c.type == 'prophecies');
  139. });
  140. if ((prophecies) && (prophecies.list.indexOf('hardcore') > -1))
  141. this.find('.name').html(name + ' (hc)');
  142. this.find('.btnPlay').removeClass('disabled');
  143. if (result.permadead) {
  144. this.find('.name').html(name + ' (hc - rip)');
  145. this.find('.btnPlay').addClass('disabled');
  146. }
  147. this.find('.btnPlay').click();
  148. },
  149. setMessage: function(msg) {
  150. this.find('.message').html(msg);
  151. },
  152. onDeleteClick: function() {
  153. if (!this.selected)
  154. return;
  155. if (this.deleteCount < 3) {
  156. this.deleteCount++;
  157. this.setMessage('click delete ' + (4 - this.deleteCount) + ' more time' + ((this.deleteCount == 3) ? '' : 's') + ' to confirm');
  158. this.find('.btnDelete')
  159. .removeClass('deleting')
  160. .addClass('deleting')
  161. .html('delete (' + (4 - this.deleteCount) + ')')
  162. return;
  163. }
  164. this.onDeleteReset();
  165. this.el.addClass('disabled');
  166. client.request({
  167. cpn: 'auth',
  168. method: 'deleteCharacter',
  169. data: {
  170. name: this.selected
  171. },
  172. callback: this.onGetCharacters.bind(this)
  173. });
  174. },
  175. onDeleteReset: function() {
  176. this.setMessage('');
  177. this.deleteCount = 0;
  178. this.find('.btnDelete')
  179. .removeClass('deleting')
  180. .html('delete');
  181. }
  182. };
  183. });