Frontend for viewing Dungeon Defender layouts
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.

viewer.js 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. $(function() {
  2. var thisLevel;
  3. function updateDefenseUnits() {
  4. var used = 0;
  5. $.each(layout.towers, function() {
  6. used += towers[this.type].units;
  7. });
  8. $('#du_used').text(used);
  9. var hasClass = $('#du_wrapper').hasClass('over');
  10. $('#du_wrapper').removeClass('over');
  11. if (used > thisLevel.du) {
  12. $('#du_wrapper').addClass('over');
  13. if (!hasClass) {
  14. $('#du_wrapper').effect('pulsate', {times: 2}, 'fast');
  15. }
  16. }
  17. }
  18. function createBaseElForTower(key) {
  19. var type = towers[key];
  20. return $('<img>')
  21. .attr('src', type.image)
  22. .attr('alt', type.name)
  23. .data('type', key)
  24. .addClass(type.class.toLowerCase())
  25. .addClass('tower');
  26. }
  27. function createElForTower(tower) {
  28. return createBaseElForTower(tower.type)
  29. .data('tower', tower)
  30. .draggable({
  31. start: function(evt) {
  32. return !evt.shiftKey;
  33. },
  34. stop: function() {
  35. $(this).data('tower').position = adjustMapOffset($(this).offsetFrom('#mapcontainer'), thisLevel, 1);
  36. }
  37. })
  38. .css('position', 'absolute')
  39. .offset(adjustMapOffset(tower.position, thisLevel))
  40. .rotate(tower.rotation)
  41. .dblclick(function() {
  42. layout.towers = $.grep(layout.towers, function(value) { return value != tower; });
  43. $(this).remove();
  44. updateDefenseUnits();
  45. })
  46. .mousedown(function(e) {
  47. if (!e.shiftKey) {
  48. return;
  49. }
  50. var el = $(this);
  51. var centre = el.offsetCentre();
  52. var mouseX = e.pageX - centre.left, mouseY = e.pageY - centre.top;
  53. var initialMouseAngle = Math.atan2(mouseY, mouseX);
  54. var initialRotation = tower.rotation;
  55. var moveHandler = function(evt) {
  56. var mouseX = evt.pageX - centre.left, mouseY = evt.pageY - centre.top;
  57. var newMouseAngle = Math.atan2(mouseY, mouseX);
  58. var mouseDelta = newMouseAngle - initialMouseAngle;
  59. var rotation = initialRotation + newMouseAngle * (180 / Math.PI);
  60. tower.rotation = rotation;
  61. el.rotate(rotation);
  62. };
  63. var upHandler = function() {
  64. $(document).unbind('mousemove', moveHandler);
  65. $(document).unbind('mouseup', upHandler);
  66. };
  67. $(document).mousemove(moveHandler);
  68. $(document).mouseup(upHandler);
  69. return false;
  70. });
  71. }
  72. function adjustMapOffset(towerOffset, level, reverse) {
  73. var res = $.extend({}, towerOffset);
  74. if (level.offsets && !reverse) {
  75. res.left += level.offsets.left;
  76. res.top += level.offsets.top;
  77. }
  78. if (level.scale) {
  79. if (reverse) {
  80. res.left /= level.scale.left;
  81. res.top /= level.scale.top;
  82. } else {
  83. res.left *= level.scale.left;
  84. res.top *= level.scale.top;
  85. }
  86. }
  87. if (level.offsets && reverse) {
  88. res.left -= level.offsets.left;
  89. res.top -= level.offsets.top;
  90. }
  91. return res;
  92. }
  93. $.each(towers, function(key) {
  94. createBaseElForTower(key, this).appendTo($('#palette'));
  95. });
  96. $('.tower,.core').draggable({
  97. helper: 'clone',
  98. containment: 'document',
  99. stop: function(evt, ui) {
  100. if (!$(this).data('type')) {
  101. return;
  102. }
  103. var tower = {
  104. type: $(this).data('type'),
  105. rotation: 0,
  106. position: adjustMapOffset(ui.helper.offsetFrom('#mapcontainer'), thisLevel, 1)
  107. };
  108. layout.towers.push(tower);
  109. createElForTower(tower).appendTo($('#mapcontainer'));
  110. updateDefenseUnits();
  111. }
  112. });
  113. function updateLayout() {
  114. thisLevel = levels[layout.level - 1];
  115. $('#mapcontainer').css('background-image', 'url("' + thisLevel.minimap + '")');
  116. $('#notecontent').val(layout.notes);
  117. $.each(layout.towers, function() {
  118. createElForTower(this).appendTo($('#mapcontainer'));
  119. updateDefenseUnits();
  120. });
  121. $('#du_total').text(thisLevel.du);
  122. }
  123. function getLayout(id) {
  124. $.getScript('res/data/layouts/' + id + '.js', updateLayout);
  125. }
  126. getLayout(parseInt(getURLParameter('id')) || 13934);
  127. });