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.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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 src="res/data/layout.js" type="text/javascript"></script>
  10. <script type="text/javascript">
  11. $(function() {
  12. var thisLevel;
  13. $.fn.rotate = function(rot) {
  14. this.data('rotation', rot);
  15. return this.css('-webkit-transform', 'rotate(' + rot + 'deg)')
  16. .css('-moz-transform', 'rotate(' + rot + 'deg')
  17. .css('-o-transform', 'rotate(' + rot + 'deg')
  18. .css('transform', 'rotate(' + rot + 'deg');
  19. };
  20. $.fn.offsetFrom = function(el) {
  21. var offset = this.offset();
  22. var otherOffset = $(el).offset();
  23. return {top: offset.top - otherOffset.top, left: offset.left - otherOffset.left};
  24. }
  25. $.fn.offsetCentre = function() {
  26. var offset = this.offset();
  27. return {top: offset.top + this.height() / 2, left: offset.left + this.width() / 2};
  28. }
  29. function createBaseElForTower(key) {
  30. var type = towers[key];
  31. return $('<img>')
  32. .attr('src', type.image)
  33. .attr('alt', type.name)
  34. .data('type', key)
  35. .addClass('tower');
  36. }
  37. function createElForTower(tower) {
  38. return createBaseElForTower(tower.type)
  39. .data('tower', tower)
  40. .draggable({
  41. start: function(evt) {
  42. return !evt.shiftKey;
  43. },
  44. stop: function() {
  45. $(this).data('tower').position = adjustMapOffset($(this).offsetFrom('#mapcontainer'), thisLevel, 1);
  46. }
  47. })
  48. .css('position', 'absolute')
  49. .offset(adjustMapOffset(tower.position, thisLevel))
  50. .rotate(tower.rotation)
  51. .dblclick(function() {
  52. layout.towers = $.grep(layout.towers, function(value) { return value != tower; });
  53. $(this).remove();
  54. })
  55. .mousedown(function(e) {
  56. if (!e.shiftKey) {
  57. return;
  58. }
  59. var el = $(this);
  60. var centre = el.offsetCentre();
  61. var mouseX = e.pageX - centre.left, mouseY = e.pageY - centre.top;
  62. var initialMouseAngle = Math.atan2(mouseY, mouseX);
  63. var initialRotation = el.data('rotation');
  64. var moveHandler = function(evt) {
  65. var mouseX = evt.pageX - centre.left, mouseY = evt.pageY - centre.top;
  66. var newMouseAngle = Math.atan2(mouseY, mouseX);
  67. var mouseDelta = newMouseAngle - initialMouseAngle;
  68. var rotation = initialRotation + newMouseAngle * (180 / Math.PI);
  69. tower.rotation = rotation;
  70. el.rotate(rotation);
  71. };
  72. var upHandler = function() {
  73. $(document).unbind('mousemove', moveHandler);
  74. $(document).unbind('mouseup', upHandler);
  75. };
  76. $(document).mousemove(moveHandler);
  77. $(document).mouseup(upHandler);
  78. return false;
  79. });
  80. }
  81. function adjustMapOffset(towerOffset, level, reverse) {
  82. var res = $.extend({}, towerOffset);
  83. if (level.offsets && !reverse) {
  84. res.left += level.offsets.left;
  85. res.top += level.offsets.top;
  86. }
  87. if (level.scale) {
  88. if (reverse) {
  89. res.left /= level.scale.left;
  90. res.top /= level.scale.top;
  91. } else {
  92. res.left *= level.scale.left;
  93. res.top *= level.scale.top;
  94. }
  95. }
  96. if (level.offsets && reverse) {
  97. res.left -= level.offsets.left;
  98. res.top -= level.offsets.top;
  99. }
  100. return res;
  101. }
  102. $.each(towers, function(key) {
  103. createBaseElForTower(key, this).appendTo($('#palette'));
  104. });
  105. $('.tower,.core').draggable({
  106. helper: 'clone',
  107. containment: 'document',
  108. stop: function(evt, ui) {
  109. if (!$(this).data('type')) {
  110. return;
  111. }
  112. var tower = {
  113. type: $(this).data('type'),
  114. rotation: 0,
  115. position: adjustMapOffset(ui.helper.offsetFrom('#mapcontainer'), thisLevel, 1)
  116. };
  117. layout.towers.push(tower);
  118. createElForTower(tower).appendTo($('#mapcontainer'));
  119. }
  120. });
  121. thisLevel = levels[layout.level - 1];
  122. $('#mapcontainer').css('background-image', 'url("' + thisLevel.minimap + '")');
  123. $.each(layout.towers, function() {
  124. createElForTower(this).appendTo($('#mapcontainer'));
  125. });
  126. });
  127. </script>
  128. <style type="text/css">
  129. body {
  130. font-family: sans-serif;
  131. margin: 0;
  132. padding: 0;
  133. }
  134. #header, #header h1 {
  135. margin: 0;
  136. padding: 0;
  137. }
  138. #header {
  139. padding: 10px 20px;
  140. background-image: linear-gradient(bottom, rgb(255,255,255) 28%, rgb(244,245,242) 64%);
  141. background-image: -o-linear-gradient(bottom, rgb(255,255,255) 28%, rgb(244,245,242) 64%);
  142. background-image: -moz-linear-gradient(bottom, rgb(255,255,255) 28%, rgb(244,245,242) 64%);
  143. background-image: -webkit-linear-gradient(bottom, rgb(255,255,255) 28%, rgb(244,245,242) 64%);
  144. background-image: -ms-linear-gradient(bottom, rgb(255,255,255) 28%, rgb(244,245,242) 64%);
  145. background-image: -webkit-gradient(
  146. linear,
  147. left bottom,
  148. left top,
  149. color-stop(0.28, rgb(255,255,255)),
  150. color-stop(0.64, rgb(244,245,242))
  151. );
  152. border-bottom: 1px solid rgb(244, 245, 242);
  153. }
  154. #header img {
  155. vertical-align: bottom;
  156. }
  157. #header span {
  158. display: inline-block;
  159. padding-bottom: 10px;
  160. margin-left: 20px;
  161. color: #300;
  162. }
  163. #sidebar {
  164. float: left;
  165. width: 200px;
  166. padding: 10px;
  167. min-height: 1024px;
  168. border-right: 1px solid rgb(244, 245, 242);
  169. }
  170. #palette {
  171. text-align: center;
  172. }
  173. #palette h2 {
  174. margin: 0;
  175. color: #300;
  176. }
  177. #palette p {
  178. font-size: x-small;
  179. margin-top: 0;
  180. }
  181. #mapcontainer {
  182. position: relative;
  183. width: 1024px;
  184. height: 1024px;
  185. margin-left: 221px;
  186. }
  187. .tower, .core { width: 40px; height: 40px; }
  188. </style>
  189. </head>
  190. <body>
  191. <div id="header">
  192. <h1><img src="res/images/dd-logo.png" alt="Dungeon Defenders"><span>Layout Editor</span></h1>
  193. </div>
  194. <div id="sidebar">
  195. <div id="palette">
  196. <h2>Palette</h2>
  197. <p>Drag and drop towers onto the map</p>
  198. </div>
  199. <img src="res/images/coreIcon.png" alt="core" class="core">
  200. </div>
  201. <div id="mapcontainer"></div>
  202. </body>
  203. </html>