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.
 
 
 

229 lines
5.0 KiB

  1. define([
  2. 'js/system/events',
  3. 'js/system/client',
  4. 'html!ui/templates/createCharacter/template',
  5. 'css!ui/templates/createCharacter/styles',
  6. 'ui/factory',
  7. 'js/system/globals'
  8. ], function (
  9. events,
  10. client,
  11. template,
  12. styles,
  13. uiFactory,
  14. globals
  15. ) {
  16. return {
  17. tpl: template,
  18. centered: true,
  19. classSprites: null,
  20. class: null,
  21. costume: 0,
  22. skinId: null,
  23. prophecies: [],
  24. beforeRender: function () {
  25. const { clientConfig: { logoPath } } = globals;
  26. if (!logoPath)
  27. return;
  28. const tempEl = $(this.tpl);
  29. tempEl.find('.logo').attr('src', logoPath);
  30. this.tpl = tempEl.prop('outerHTML');
  31. },
  32. postRender: function () {
  33. this.getSkins();
  34. uiFactory.build('tooltips');
  35. this.find('.txtClass')
  36. .on('click', this.changeClass.bind(this))
  37. .on('mousemove', this.onClassHover.bind(this))
  38. .on('mouseleave', this.onClassUnhover.bind(this));
  39. this.find('.skinBox .btn').on('click', this.changeCostume.bind(this));
  40. this.find('.btnBack').on('click', this.back.bind(this));
  41. this.find('.btnCreate').on('click', this.create.bind(this));
  42. this.find('.prophecy')
  43. .on('click', this.onProphecyClick.bind(this))
  44. .on('mousemove', this.onProphecyHover.bind(this))
  45. .on('mouseleave', this.onProphecyUnhover.bind(this));
  46. },
  47. getSkins: function () {
  48. this.el.addClass('disabled');
  49. client.request({
  50. cpn: 'auth',
  51. method: 'getSkinList',
  52. data: {
  53. },
  54. callback: this.onGetSkins.bind(this)
  55. });
  56. },
  57. onGetSkins: function (result) {
  58. this.el.removeClass('disabled');
  59. this.classSprites = result;
  60. this.costume = 0;
  61. this.class = 'owl';
  62. this.find('.txtClass').html('Owl');
  63. this.changeCostume();
  64. },
  65. onProphecyHover: function (e) {
  66. let el = $(e.target);
  67. let pos = {
  68. x: e.clientX + 25,
  69. y: e.clientY
  70. };
  71. let text = el.attr('tooltip');
  72. events.emit('onShowTooltip', text, el[0], pos);
  73. $('.uiTooltips .tooltip').addClass('bright');
  74. },
  75. onProphecyUnhover: function (e) {
  76. let el = $(e.target);
  77. events.emit('onHideTooltip', el[0]);
  78. },
  79. onProphecyClick: function (e) {
  80. let el = $(e.target);
  81. let pName = el.attr('prophecy');
  82. if (el.hasClass('active')) {
  83. this.prophecies.spliceWhere(function (p) {
  84. return (p === pName);
  85. });
  86. el.removeClass('active');
  87. } else {
  88. this.prophecies.push(pName);
  89. el.addClass('active');
  90. }
  91. },
  92. clear: function () {
  93. this.prophecies = [];
  94. this.find('.prophecy').removeClass('active');
  95. },
  96. back: function () {
  97. this.clear();
  98. this.destroy();
  99. uiFactory.build('characters', {});
  100. },
  101. create: function () {
  102. this.el.addClass('disabled');
  103. const eCreateCharacter = {
  104. name: this.find('.txtName').val(),
  105. class: this.class,
  106. skinId: this.skinId,
  107. prophecies: this.prophecies
  108. };
  109. events.emit('beforeCreateCharacter', eCreateCharacter);
  110. client.request({
  111. cpn: 'auth',
  112. method: 'createCharacter',
  113. data: eCreateCharacter,
  114. callback: this.onCreate.bind(this)
  115. });
  116. },
  117. onCreate: function (result) {
  118. this.el.removeClass('disabled');
  119. if (!result) {
  120. this.clear();
  121. this.destroy();
  122. } else
  123. this.el.find('.message').html(result);
  124. },
  125. onClassHover: function (e) {
  126. let el = $(e.target);
  127. let pos = {
  128. x: e.clientX + 25,
  129. y: e.clientY
  130. };
  131. let text = ({
  132. owl: 'The wise Owl guides you; granting you the focus needed to cast spells. <br /><br />Upon level up, you gain 1 Intellect.',
  133. bear: 'The towering Bear strenghtens you; lending force to your blows. <br /><br />Upon level up, you gain 1 Strength.',
  134. lynx: 'The nimble Lynx hastens you; allowing your strikes to land true. <br /><br />Upon level up, you gain 1 Dexterity.'
  135. })[this.class];
  136. events.emit('onShowTooltip', text, el[0], pos, 200);
  137. $('.uiTooltips .tooltip').addClass('bright');
  138. },
  139. onClassUnhover: function (e) {
  140. let el = $(e.target);
  141. events.emit('onHideTooltip', el[0]);
  142. },
  143. changeClass: function (e) {
  144. let el = $(e.target);
  145. let classes = ['owl', 'bear', 'lynx'];
  146. let nextIndex = (classes.indexOf(this.class) + 1) % classes.length;
  147. let newClass = classes[nextIndex];
  148. el.html(newClass[0].toUpperCase() + newClass.substr(1));
  149. this.class = newClass;
  150. this.onClassHover(e);
  151. },
  152. changeCostume: function (e) {
  153. let delta = e ? ~~$(e.target).attr('delta') : 0;
  154. let spriteList = this.classSprites;
  155. if (!spriteList)
  156. return;
  157. this.costume = (this.costume + delta) % spriteList.length;
  158. if (this.costume < 0)
  159. this.costume = spriteList.length - 1;
  160. this.skinId = spriteList[this.costume].id;
  161. $('.txtCostume').html(spriteList[this.costume].name);
  162. this.setSprite();
  163. },
  164. setSprite: function () {
  165. let classSprite = this.classSprites[this.costume];
  166. let costume = classSprite.sprite.split(',');
  167. let spirteX = -costume[0] * 8;
  168. let spriteY = -costume[1] * 8;
  169. let spritesheet = classSprite.spritesheet || '../../../images/characters.png';
  170. this.find('.sprite')
  171. .css('background', 'url("' + spritesheet + '") ' + spirteX + 'px ' + spriteY + 'px');
  172. }
  173. };
  174. });