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.

index.html 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Dungeon Defenders Viewer</title>
  5. <script src="res/js/jquery-1.7.1.min.js" type="text/javascript"></script>
  6. <script src="res/js/jquery-ui-1.8.17.custom.min.js" type="text/javascript"></script>
  7. <script src="res/data/levels.js" type="text/javascript"></script>
  8. <script src="res/data/towers.js" type="text/javascript"></script>
  9. <script type="text/javascript">
  10. $(function() {
  11. var thisLevel;
  12. $.fn.rotate = function(rot) {
  13. return this.css('-webkit-transform', 'rotate(' + rot + 'deg)')
  14. .css('-moz-transform', 'rotate(' + rot + 'deg')
  15. .css('-o-transform', 'rotate(' + rot + 'deg')
  16. .css('-ms-transform', 'rotate(' + rot + 'deg')
  17. .css('transform', 'rotate(' + rot + 'deg');
  18. };
  19. $.fn.offsetFrom = function(el) {
  20. var offset = this.offset();
  21. var otherOffset = $(el).offset();
  22. return {top: offset.top - otherOffset.top, left: offset.left - otherOffset.left};
  23. }
  24. $.fn.offsetCentre = function() {
  25. var offset = this.offset();
  26. return {top: offset.top + this.height() / 2, left: offset.left + this.width() / 2};
  27. }
  28. function updateDefenseUnits() {
  29. var used = 0;
  30. $.each(layout.towers, function() {
  31. used += towers[this.type].units;
  32. });
  33. $('#du_used').text(used);
  34. var hasClass = $('#du_wrapper').hasClass('over');
  35. $('#du_wrapper').removeClass('over');
  36. if (used > thisLevel.du) {
  37. $('#du_wrapper').addClass('over');
  38. if (!hasClass) {
  39. $('#du_wrapper').effect('pulsate', {times: 2}, 'fast');
  40. }
  41. }
  42. }
  43. function getURLParameter(name) {
  44. return decodeURIComponent((location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]);
  45. }
  46. function createBaseElForTower(key) {
  47. var type = towers[key];
  48. return $('<img>')
  49. .attr('src', type.image)
  50. .attr('alt', type.name)
  51. .data('type', key)
  52. .addClass(type.class.toLowerCase())
  53. .addClass('tower');
  54. }
  55. function createElForTower(tower) {
  56. return createBaseElForTower(tower.type)
  57. .data('tower', tower)
  58. .draggable({
  59. start: function(evt) {
  60. return !evt.shiftKey;
  61. },
  62. stop: function() {
  63. $(this).data('tower').position = adjustMapOffset($(this).offsetFrom('#mapcontainer'), thisLevel, 1);
  64. }
  65. })
  66. .css('position', 'absolute')
  67. .offset(adjustMapOffset(tower.position, thisLevel))
  68. .rotate(tower.rotation)
  69. .dblclick(function() {
  70. layout.towers = $.grep(layout.towers, function(value) { return value != tower; });
  71. $(this).remove();
  72. updateDefenseUnits();
  73. })
  74. .mousedown(function(e) {
  75. if (!e.shiftKey) {
  76. return;
  77. }
  78. var el = $(this);
  79. var centre = el.offsetCentre();
  80. var mouseX = e.pageX - centre.left, mouseY = e.pageY - centre.top;
  81. var initialMouseAngle = Math.atan2(mouseY, mouseX);
  82. var initialRotation = tower.rotation;
  83. var moveHandler = function(evt) {
  84. var mouseX = evt.pageX - centre.left, mouseY = evt.pageY - centre.top;
  85. var newMouseAngle = Math.atan2(mouseY, mouseX);
  86. var mouseDelta = newMouseAngle - initialMouseAngle;
  87. var rotation = initialRotation + newMouseAngle * (180 / Math.PI);
  88. tower.rotation = rotation;
  89. el.rotate(rotation);
  90. };
  91. var upHandler = function() {
  92. $(document).unbind('mousemove', moveHandler);
  93. $(document).unbind('mouseup', upHandler);
  94. };
  95. $(document).mousemove(moveHandler);
  96. $(document).mouseup(upHandler);
  97. return false;
  98. });
  99. }
  100. function adjustMapOffset(towerOffset, level, reverse) {
  101. var res = $.extend({}, towerOffset);
  102. if (level.offsets && !reverse) {
  103. res.left += level.offsets.left;
  104. res.top += level.offsets.top;
  105. }
  106. if (level.scale) {
  107. if (reverse) {
  108. res.left /= level.scale.left;
  109. res.top /= level.scale.top;
  110. } else {
  111. res.left *= level.scale.left;
  112. res.top *= level.scale.top;
  113. }
  114. }
  115. if (level.offsets && reverse) {
  116. res.left -= level.offsets.left;
  117. res.top -= level.offsets.top;
  118. }
  119. return res;
  120. }
  121. $.each(towers, function(key) {
  122. createBaseElForTower(key, this).appendTo($('#palette'));
  123. });
  124. $('.tower,.core').draggable({
  125. helper: 'clone',
  126. containment: 'document',
  127. stop: function(evt, ui) {
  128. if (!$(this).data('type')) {
  129. return;
  130. }
  131. var tower = {
  132. type: $(this).data('type'),
  133. rotation: 0,
  134. position: adjustMapOffset(ui.helper.offsetFrom('#mapcontainer'), thisLevel, 1)
  135. };
  136. layout.towers.push(tower);
  137. createElForTower(tower).appendTo($('#mapcontainer'));
  138. updateDefenseUnits();
  139. }
  140. });
  141. function updateLayout() {
  142. thisLevel = levels[layout.level - 1];
  143. $('#mapcontainer').css('background-image', 'url("' + thisLevel.minimap + '")');
  144. $('#notecontent').val(layout.notes);
  145. $.each(layout.towers, function() {
  146. createElForTower(this).appendTo($('#mapcontainer'));
  147. updateDefenseUnits();
  148. });
  149. $('#du_total').text(thisLevel.du);
  150. }
  151. function getLayout(id) {
  152. $.getScript('res/data/layouts/' + id + '.js', updateLayout);
  153. }
  154. getLayout(parseInt(getURLParameter('id')) || 13934);
  155. });
  156. </script>
  157. <link rel="stylesheet" type="text/css" href="res/style.css">
  158. </head>
  159. <body>
  160. <div id="header">
  161. <h1><img src="res/images/dd-logo.png" alt="Dungeon Defenders"><span>Layout Editor</span></h1>
  162. </div>
  163. <div id="sidebar">
  164. <div id="palette">
  165. <h2>Palette</h2>
  166. <p>Drag and drop towers onto the map</p>
  167. </div>
  168. <div id="stats">
  169. <h2>Stats</h2>
  170. <p id="du_wrapper">Defense Units: <span id="du_used">0</span>/<span id="du_total">0</span></p>
  171. </div>
  172. <div id="notes">
  173. <h2>Notes</h2>
  174. <textarea id="notecontent"></textarea>
  175. </div>
  176. <img src="res/images/coreIcon.png" alt="core" class="core">
  177. </div>
  178. <div id="mapcontainer"></div>
  179. </body>
  180. </html>