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.
 
 
 

118 lines
2.6 KiB

  1. define([
  2. 'js/system/events',
  3. 'html!ui/templates/target/template',
  4. 'css!ui/templates/target/styles'
  5. ], function (
  6. events,
  7. template,
  8. styles
  9. ) {
  10. return {
  11. tpl: template,
  12. target: null,
  13. lastHp: null,
  14. lastMana: null,
  15. lastLevel: null,
  16. postRender: function () {
  17. this.onEvent('onSetTarget', this.onSetTarget.bind(this));
  18. this.onEvent('onDeath', this.onSetTarget.bind(this, null));
  19. },
  20. onContextMenu: function (e) {
  21. let target = this.target;
  22. //This is kind of a hack. We check if the target has a prophecies component since we can't check for
  23. // target.player (only the logged-in player has a player component)
  24. if ((e.button != 2) || (!target) || (!target.dialogue) || (target == window.player) || (target.prophecies))
  25. return;
  26. let context = [
  27. target.name,
  28. '----------', {
  29. text: 'talk',
  30. callback: this.onTalk.bind(this)
  31. }
  32. ];
  33. events.emit('onContextMenu', context, e.event);
  34. e.event.preventDefault;
  35. return false;
  36. },
  37. onTalk: function () {
  38. window.player.dialogue.talk(this.target);
  39. },
  40. onSetTarget: function (target, e) {
  41. this.target = target;
  42. if (!this.target) {
  43. this.lastHp = null;
  44. this.lastMana = null;
  45. this.lastLevel = null;
  46. this.el.hide();
  47. } else {
  48. let el = this.el;
  49. el.find('.infoName').html(target.name);
  50. el.find('.infoLevel')
  51. .html('(' + target.stats.values.level + ')')
  52. .removeClass('high-level');
  53. let crushing = (target.stats.values.level - 5 >= window.player.stats.values.level);
  54. if (crushing)
  55. el.find('.infoLevel').addClass('high-level');
  56. el.show();
  57. }
  58. if ((e) && (e.button == 2) && (this.target))
  59. this.onContextMenu(e);
  60. },
  61. buildBar: function (barIndex, value, max) {
  62. let box = this.el.find('.statBox').eq(barIndex);
  63. let w = ~~((value / max) * 100);
  64. box.find('[class^="stat"]').css('width', w + '%');
  65. box.find('.text').html(Math.floor(value) + '/' + Math.floor(max));
  66. },
  67. update: function () {
  68. let target = this.target;
  69. if (!target)
  70. return;
  71. if (target.destroyed) {
  72. this.onSetTarget();
  73. return;
  74. }
  75. let stats = target.stats.values;
  76. if (stats.level != this.lastLevel) {
  77. this.el.find('.infoLevel')
  78. .html('(' + stats.level + ')')
  79. .removeClass('high-level');
  80. let crushing = (stats.level - 5 >= window.player.stats.level);
  81. if (crushing)
  82. this.el.find('.infoLevel').addClass('high-level');
  83. }
  84. if (stats.hp != this.lastHp) {
  85. this.buildBar(0, stats.hp, stats.hpMax);
  86. this.lastHp = stats.hp;
  87. }
  88. if (stats.mana != this.lastMana) {
  89. this.buildBar(1, stats.mana, stats.manaMax);
  90. this.lastMana = stats.mana;
  91. }
  92. }
  93. };
  94. });