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.
 
 
 

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