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.
 
 
 

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