Browse Source

Concatenate JS files together

master
Chris Smith 12 years ago
parent
commit
df61a881be

+ 14
- 0
build.xml View File

@@ -0,0 +1,14 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project name="DD layout viewer" default="concatenate" basedir=".">
3
+ <description>Compiles and compresses resources.</description>
4
+
5
+ <target name="concatenate" description="Concatenate all js files">
6
+  <concat destfile="res/js/jquery.js">
7
+   <fileset dir="res/js/jquery" includes="*.js" />
8
+  </concat>
9
+  <concat destfile="res/js/viewer.js">
10
+   <fileset dir="res/js/viewer" includes="*.js" />
11
+   <fileset dir="res/data" includes="*.js" />
12
+  </concat>
13
+ </target>
14
+</project>

+ 4
- 7
index.html View File

@@ -2,12 +2,7 @@
2 2
 <html>
3 3
  <head>
4 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.cookie.js" type="text/javascript"></script>
7
-  <script src="res/js/jquery-ui-1.8.17.custom.min.js" type="text/javascript"></script>
8
-  <script src="res/data/levels.js" type="text/javascript"></script>
9
-  <script src="res/data/towers.js" type="text/javascript"></script>
10
-  <script src="res/js/util.js" type="text/javascript"></script>
5
+  <script src="res/js/jquery.js" type="text/javascript"></script>
11 6
   <script src="res/js/viewer.js" type="text/javascript"></script>
12 7
 
13 8
   <link rel="icon" type="image/png" href="res/images/coreIcon.png"/>
@@ -30,8 +25,10 @@
30 25
     <p>Drag and drop towers onto the map</p>
31 26
    </div>
32 27
    <div id="stats">
33
-    <h2>Stats</h2>
28
+    <h2>Information</h2>
34 29
     <p id="du_wrapper">Defense Units: <span id="du_used">0</span>/<span id="du_total">0</span></p>
30
+    <p>Difficulty: <span id="difficulty">Unknown</span></p>
31
+    <p>Type: <span id="type">Unknown</span></p>
35 32
    </div>
36 33
    <div id="notes">
37 34
     <h2>Notes</h2>

+ 405
- 0
res/js/jquery.js
File diff suppressed because it is too large
View File


res/js/jquery-1.7.1.min.js → res/js/jquery/jquery-1.7.1.min.js View File


res/js/jquery-ui-1.8.17.custom.min.js → res/js/jquery/jquery-ui-1.8.17.custom.min.js View File


res/js/jquery.cookie.js → res/js/jquery/jquery.cookie.js View File


+ 194
- 0
res/js/viewer.js View File

@@ -1,3 +1,25 @@
1
+$.fn.rotate = function(rot) {
2
+ return this.css('-webkit-transform', 'rotate(' + rot + 'deg)')
3
+            .css('-moz-transform', 'rotate(' + rot + 'deg')
4
+            .css('-o-transform', 'rotate(' + rot + 'deg')
5
+            .css('-ms-transform', 'rotate(' + rot + 'deg')
6
+            .css('transform', 'rotate(' + rot + 'deg');
7
+};
8
+
9
+$.fn.offsetFrom = function(el) {
10
+ var offset = this.offset();
11
+ var otherOffset = $(el).offset();
12
+ return {top: offset.top - otherOffset.top, left: offset.left - otherOffset.left};
13
+}
14
+
15
+$.fn.offsetCentre = function() {
16
+ var offset = this.offset();
17
+ return {top: offset.top + this.height() / 2, left: offset.left + this.width() / 2};
18
+}
19
+
20
+function getURLParameter(name) {
21
+ return decodeURIComponent((location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]);
22
+}
1 23
 $(function() {
2 24
 
3 25
  // Instructions
@@ -309,3 +331,175 @@ $(function() {
309 331
   updateLayout({level: id, towers:[]});
310 332
  }
311 333
 });
334
+var levels = [
335
+
336
+ {
337
+  name: 'The Deeper Well',
338
+  minimap: 'res/images/minimaps/Level1.png',
339
+  image: 'res/images/levels/Level1.jpg',
340
+  du: 60,
341
+  offsets: {left: 130, top: 65},
342
+  scale: {left: 1.19, top: 1.17},
343
+  towerscape: 0.9,
344
+  cores: [{left: 108, top: 576}]
345
+ },
346
+
347
+ {
348
+  name: 'Foundries and Forges',
349
+  minimap: 'res/images/minimaps/Level2.png',
350
+  image: 'res/images/levels/Level2.jpg',
351
+  du: 80,
352
+  offsets: {left: 80, top: 35},
353
+  scale: {left: 1.35, top: 1.35},
354
+  towerscale: 1,
355
+  cores: [{left: 286, top: 255}]
356
+ },
357
+
358
+ {
359
+  name: 'Magus Quarters',
360
+  minimap: 'res/images/minimaps/Level3.png',
361
+  image: 'res/images/levels/Level3.jpg',
362
+  du: 90,
363
+  offsets: {left: 80, top: 45},
364
+  scale: {left: 1.35, top: 1.35},
365
+  towerscale: 1.2,
366
+  cores: [{left: 283, top: 146}]
367
+ },
368
+
369
+ {
370
+  name: 'Alchemical Laboratory',
371
+  minimap: 'res/images/minimaps/Level4.png',
372
+  image: 'res/images/levels/Level4.jpg',
373
+  du: 85,
374
+  offsets: {left: 280, top: 110},
375
+  scale: {left: 0.92, top: 0.92},
376
+  towerscale: 0.9,
377
+  cores: [{left: 147, top: 422}]
378
+ },
379
+
380
+ {
381
+  name: 'Servants Quarters',
382
+  minimap: 'res/images/minimaps/Level5.png',
383
+  image: 'res/images/levels/Level5.jpg',
384
+  du: 85,
385
+  offsets: {left: 115, top: 120},
386
+  scale: {left: 1.17, top: 1.17},
387
+  towerscale: 0.9,
388
+  cores: [{left: 87, top: 290}, {left: 293, top: 335}]
389
+ },
390
+
391
+ {
392
+  name: 'Castle Armory',
393
+  minimap: 'res/images/minimaps/Level6.png',
394
+  image: 'res/images/levels/Level6.jpg',
395
+  du: 90,
396
+  offsets: {left: 80, top: 45},
397
+  scale: {left: 1.35, top: 1.34},
398
+  towerscale: 1,
399
+  cores: [{left: 234, top: 352}, {left: 341, top: 352}]
400
+ },
401
+
402
+ {
403
+  name: 'Hall of Court',
404
+  minimap: 'res/images/minimaps/Level7.png',
405
+  image: 'res/images/levels/Level7.jpg',
406
+  du: 100,
407
+  offsets: {left: 35, top: 80},
408
+  scale: {left: 1.45, top: 1.45},
409
+  towerscale: 1,
410
+  cores: [{left: 306, top: 264}, {left: 456, top: 264}]
411
+ },
412
+
413
+ {
414
+  name: 'The Throne Room',
415
+  minimap: 'res/images/minimaps/Level8.png',
416
+  image: 'res/images/levels/Level8.jpg',
417
+  du: 100,
418
+  offsets: {left: 18, top: 130},
419
+  scale: {left: 1.6, top: 1.5},
420
+  towerscale: 1,
421
+  cores: [{left: 288, top: 201}, {left: 288, top: 307}]
422
+ },
423
+
424
+ {
425
+  name: 'Royal Gardens',
426
+  minimap: 'res/images/minimaps/RoyalGardens.png',
427
+  image: 'res/images/levels/Level9.jpg',
428
+  du: 130,
429
+  offsets: {left: 170, top: 55},
430
+  scale: {left: 1.2, top: 1.2},
431
+  towerscale: 0.75,
432
+  cores: [{left: 175, top: 359}, {left: 322, top: 243}, {left: 322, top: 480}]
433
+ },
434
+
435
+ {
436
+  name: 'The Ramparts',
437
+  minimap: 'res/images/minimaps/Level9.png',
438
+  image: 'res/images/levels/Level10.jpg',
439
+  du: 110,
440
+  offsets: {left: 142, top: 5},
441
+  scale: {left: 1.08, top: 1.1},
442
+  towerscale: 0.9,
443
+  cores: [{left: 329, top: 540}, {left: 494, top: 300}, {left: 531, top: 330}]
444
+ },
445
+
446
+ {
447
+  name: 'Endless Spires',
448
+  minimap: 'res/images/minimaps/TheSpires.png',
449
+  image: 'res/images/levels/Level11.jpg',
450
+  du: 110,
451
+  offsets: {left: 142, top: 57},
452
+  scale: {left: 1.04, top: 1.04},
453
+  towerscale: 0.65,
454
+  cores: [{left: 420, top: 308}, {left: 424, top: 526}, {left: 262, top: 526}]
455
+ },
456
+
457
+ {
458
+  name: 'The Summit',
459
+  minimap: 'res/images/minimaps/TheSummit.png',
460
+  image: 'res/images/levels/Level12.jpg',
461
+  du: 150,
462
+  offsets: {left: 200, top: 120},
463
+  towerscale: 0.9,
464
+  cores: [{left: 283, top: 362}, {left: 213, top: 548}, {left: 356, top: 547}]
465
+ },
466
+
467
+ {
468
+  name: 'Glitterhelm Caverns',
469
+  minimap: 'res/images/minimaps/caverns_minimap.png',
470
+  image: 'http://placehold.it/200x100',
471
+  du: 165,
472
+  offsets: {left: 90, top: 35},
473
+  scale: {left: 1.3, top: 1.27},
474
+  towerscale: 0.8,
475
+  cores: [{left: 230, top: 134}, {left: 234, top: 444}, {left: 413, top: 419}, {left: 38, top: 569}]
476
+ },
477
+
478
+];
479
+var towers = {
480
+
481
+ 'spike': {name: 'Spike Blockade', image: 'res/images/towers/spikyBlockadeTower_Icon.png', class: 'Squire', units: 3, defaultscale: 1},
482
+ 'bouncer': {name: 'Bouncer Blockade', image: 'res/images/towers/bouncerTower_Icon.png', class: 'Squire', units: 4, defaultscale: 1},
483
+ 'harpoon': {name: 'Harpoon Turret', image: 'res/images/towers/harpoonTower_Icon.png', class: 'Squire', units: 6, defaultscale: 1},
484
+ 'bowling': {name: 'Bowling Ball Turret', image: 'res/images/towers/bowlingBallTower_Icon.png', class: 'Squire', units: 7, defaultscale: 1},
485
+ 'slice': {name: 'Slice N Dice Blockade', image: 'res/images/towers/slicerTower_Icon.png', class: 'Squire', units: 8},
486
+
487
+ 'missile': {name: 'Magic Missile Tower', image: 'res/images/towers/missleTower_Icon.png', class: 'Apprentice', units: 3, defaultscale: 1},
488
+ 'blockade': {name: 'Magic Blockade', image: 'res/images/towers/blockadeTower_Icon.png', class: 'Apprentice', units: 1, defaultscale: 1},
489
+ 'fireball': {name: 'Fireball Tower', image: 'res/images/towers/fireTower_Icon.png', class: 'Apprentice', units: 5, defaultscale: 1},
490
+ 'lightning': {name: 'Lightning Tower', image: 'res/images/towers/lightningTower_Icon.png', class: 'Apprentice', units: 7, defaultscale: 1},
491
+ 'striker': {name: 'Deadly Striker Tower', image: 'res/images/towers/strikerTower_Icon.png', class: 'Apprentice', units: 8, defaultscale: 1},
492
+
493
+ 'ensnare': {name: 'Ensnare Aura', image: 'res/images/towers/stickyGoopAura_Icon.png', class: 'Monk', units: 3, defaultscale: 2.5},
494
+ 'electric': {name: 'Electric Aura', image: 'res/images/towers/deathlyHallowsAura_Icon.png', class: 'Monk', units: 5, defaultscale: 2.5},
495
+ 'healing': {name: 'Healing Aura', image: 'res/images/towers/healingAura_Icon.png', class: 'Monk', units: 5, defaultscale: 2.5},
496
+ 'drain': {name: 'Strength Drain Aura', image: 'res/images/towers/strengthDrainAura_Icon.png', class: 'Monk', units: 6, defaultscale: 2.5},
497
+ 'enrage': {name: 'Enrage Aura', image: 'res/images/towers/enrageAura_Icon.png', class: 'Monk', units: 5, defaultscale: 2.5},
498
+
499
+ 'gas': {name: 'Gas Trap', image: 'res/images/towers/gasTrap_Icon.png', class: 'Huntress', units: 3, defaultscale: 1},
500
+ 'mine': {name: 'Proximity Mine Trap', image: 'res/images/towers/proxMineTrap_Icon.png', class: 'Huntress', units: 3, defaultscale: 1},
501
+ 'inferno': {name: 'Inferno Trap', image: 'res/images/towers/infernoTrap_Icon.png', class: 'Huntress', units: 4, defaultscale: 1},
502
+ 'etheral': {name: 'Etheral Spike Trap', image: 'res/images/towers/etherialSpikeTrap_Icon.png', class: 'Huntress', units: 3, defaultscale: 1},
503
+ 'darkness': {name: 'Darkness Trap', image: 'res/images/towers/darknessTrap_Icon.png', class: 'Huntress', units: 6, defaultscale: 1},
504
+
505
+};

res/js/util.js → res/js/viewer/util.js View File


+ 311
- 0
res/js/viewer/viewer.js View File

@@ -0,0 +1,311 @@
1
+$(function() {
2
+
3
+ // Instructions
4
+ (function() {
5
+  var cookieName = 'hideinstructions';
6
+
7
+  function showInstructions() {
8
+   $.cookie(cookieName, null);
9
+   $('#instructions').show();
10
+   $('#showinstructions').hide();
11
+  }
12
+
13
+  function hideInstructions() {
14
+   $.cookie(cookieName, 1, { expires: 365 });
15
+   $('#instructions').hide();
16
+   $('#showinstructions').show();
17
+  }
18
+
19
+  $('#hideinstructions').click(hideInstructions);
20
+  $('#showinstructions').click(showInstructions);
21
+
22
+  if ($.cookie(cookieName)) {
23
+   hideInstructions();
24
+  }
25
+ })();
26
+
27
+ // Saving
28
+ (function() {
29
+  function saveLayout() {
30
+   _gaq.push(['_trackEvent', 'General', 'Save']);
31
+
32
+   layout.notes = $('#notecontent').val();
33
+
34
+   $('#save_inprogress').show();
35
+   $('#save_done').hide();
36
+   $('#savecontainer').show();
37
+   $('#save_error').hide();
38
+
39
+   $.ajax({
40
+    type: 'POST',
41
+    url: 'res/data/layouts/new',
42
+    data: {layout: JSON.stringify(layout)},
43
+    success: function(res) {
44
+     window.location.hash = res;
45
+     var url = window.location.href;
46
+     $('#link').children().remove();
47
+     $('<a>').attr('href', url).text(url).appendTo($('#link'));
48
+     $('#save_inprogress').hide();
49
+     $('#save_done').show();
50
+    },
51
+    error: function(xhr, status, error) {
52
+     $('#save_error').text('Save failed! Server said: ' + error).show();
53
+    }
54
+   });
55
+  }
56
+
57
+  function closeSave() {
58
+   $('#savecontainer').hide();
59
+  }
60
+
61
+  $('#savelayout').click(saveLayout);
62
+  $('#savemask').click(closeSave);
63
+  $('#saveclose').click(closeSave);
64
+ })();
65
+
66
+ // Layout picker
67
+ (function() {
68
+  $.each(levels, function(key) {
69
+   var name = this.name;
70
+
71
+   $('<button>')
72
+    .append($('<img>').attr('src', this.image))
73
+    .append($('<p>').text(name))
74
+    .click(function() {
75
+     window.location.hash = '';
76
+     _gaq.push(['_trackEvent', 'Level picker', 'Picked', name]);
77
+     showBlankLayout(key + 1);
78
+     closePicker();
79
+    })
80
+    .appendTo($('#layoutpicker .container'));
81
+  });
82
+
83
+  function showPicker() {
84
+   _gaq.push(['_trackEvent', 'Level picker', 'Shown']);
85
+   $('#layoutcontainer').show();
86
+  }
87
+
88
+  function closePicker() {
89
+   $('#layoutcontainer').hide();
90
+  }
91
+
92
+  $('#createlayout').click(showPicker);
93
+  $('#layoutmask').click(closePicker);
94
+  $('#layoutclose').click(closePicker);
95
+ })();
96
+
97
+ // Address management
98
+ (function() {
99
+  function updateFromHash() {
100
+   var id = window.location.hash;
101
+   if (id === '') {
102
+    showBlankLayout(1);
103
+   } else if (id.substr(0,7) == '#blank:') {
104
+    showBlankLayout(parseInt(id.substr(7)));
105
+   } else {
106
+    getLayout(id.substr(1));
107
+   }
108
+  }
109
+
110
+  $(window).bind('hashchange', updateFromHash);
111
+  updateFromHash();
112
+ })();
113
+
114
+ // Palette
115
+ (function() {
116
+  $.each(towers, function(key) {
117
+   createBaseElForTower(key, this).appendTo($('#palette'));
118
+  });
119
+
120
+  $('.tower,.core').draggable({
121
+   helper: 'clone',
122
+   containment: 'document',
123
+   stop: function(evt, ui) {
124
+    if (!$(this).data('type')) {
125
+     return;
126
+    }
127
+
128
+    var tower = {
129
+     type: $(this).data('type'),
130
+     rotation: 0,
131
+     position: adjustMapOffset(ui.helper.offsetFrom('#mapcontainer'), thisLevel, 1)
132
+    };
133
+
134
+    layout.towers.push(tower);
135
+    createElForTower(tower).appendTo($('#mapcontainer'));
136
+    updateDefenseUnits();
137
+   }
138
+  });
139
+ })();
140
+
141
+ var thisLevel;
142
+ var layout;
143
+
144
+ function updateDefenseUnits() {
145
+  var used = 0;
146
+
147
+  $.each(layout.towers, function() {
148
+   used += towers[this.type].units;
149
+  });
150
+
151
+  $('#du_used').text(used);
152
+
153
+  var hasClass = $('#du_wrapper').hasClass('over');
154
+
155
+  $('#du_wrapper').removeClass('over');
156
+  if (used > thisLevel.du) {
157
+   $('#du_wrapper').addClass('over');
158
+   if (!hasClass) {
159
+    $('#du_wrapper').effect('pulsate', {times: 2}, 'fast');
160
+   }
161
+  }
162
+ }
163
+
164
+ function createElForCore() {
165
+  return $('<img>')
166
+    .attr('src', 'res/images/coreIcon.png')
167
+    .attr('alt', 'Core')
168
+    .addClass('core')
169
+    .css('position', 'absolute')
170
+    .css('height', (40 * thisLevel.towerscale) + 'px')
171
+    .css('width', (40 * thisLevel.towerscale) + 'px');
172
+ }
173
+
174
+ function createBaseElForTower(key) {
175
+  var type = towers[key];
176
+
177
+  return $('<img>')
178
+    .attr('src', type.image)
179
+    .attr('alt', type.name)
180
+    .data('type', key)
181
+    .addClass(type.class.toLowerCase())
182
+    .addClass('tower');
183
+ }
184
+
185
+ function createElForTower(tower) {
186
+  return createBaseElForTower(tower.type)
187
+    .data('tower', tower)
188
+    .draggable({
189
+     containment: 'document',
190
+     start: function(evt) {
191
+      return !evt.shiftKey;
192
+     },
193
+     stop: function() {
194
+      var el = $(this);
195
+      el.data('tower').position = adjustMapOffset({top: parseInt(el.css('top')), left: parseInt(el.css('left'))}, thisLevel, 1);
196
+     }
197
+    })
198
+    .css('position', 'absolute')
199
+    .css('height', (40 * thisLevel.towerscale * towers[tower.type].defaultscale) + 'px')
200
+    .css('width', (40 * thisLevel.towerscale * towers[tower.type].defaultscale) + 'px')
201
+    .offset(adjustMapOffset(tower.position, thisLevel))
202
+    .rotate(tower.rotation)
203
+    .dblclick(function() {
204
+     layout.towers = $.grep(layout.towers, function(value) { return value != tower; });
205
+     $(this).remove();
206
+     updateDefenseUnits();
207
+    })
208
+    .mousedown(function(e) {
209
+     if (!e.shiftKey) {
210
+      return;
211
+     }
212
+
213
+     var el = $(this);
214
+     var centre = el.offsetCentre();
215
+     var mouseX = e.pageX - centre.left, mouseY = e.pageY - centre.top;
216
+     var initialMouseAngle = Math.atan2(mouseY, mouseX);
217
+     var initialRotation = tower.rotation;
218
+
219
+     var moveHandler = function(evt) {
220
+       var mouseX = evt.pageX - centre.left, mouseY = evt.pageY - centre.top;
221
+       var newMouseAngle = Math.atan2(mouseY, mouseX);
222
+       var mouseDelta = newMouseAngle - initialMouseAngle;
223
+       var rotation = initialRotation + newMouseAngle * (180 / Math.PI);
224
+       tower.rotation = rotation;
225
+       el.rotate(rotation);
226
+     };
227
+
228
+     var upHandler = function() {
229
+      $(document).unbind('mousemove', moveHandler);
230
+      $(document).unbind('mouseup', upHandler);
231
+     };
232
+
233
+     $(document).mousemove(moveHandler);
234
+     $(document).mouseup(upHandler);
235
+
236
+     return false;
237
+    });
238
+ }
239
+
240
+ function adjustMapOffset(towerOffset, level, reverse) {
241
+  var res = $.extend({}, towerOffset);
242
+
243
+  if (level.offsets && !reverse) {
244
+   res.left += level.offsets.left;
245
+   res.top += level.offsets.top;
246
+  }
247
+
248
+  if (level.scale) {
249
+   if (reverse) {
250
+    res.left /= level.scale.left;
251
+    res.top /= level.scale.top;
252
+   } else {
253
+    res.left *= level.scale.left;
254
+    res.top *= level.scale.top;
255
+   }
256
+  }
257
+
258
+  if (level.offsets && reverse) {
259
+   res.left -= level.offsets.left;
260
+   res.top -= level.offsets.top;
261
+  }
262
+
263
+  return res;
264
+ }
265
+
266
+ function clearLayout() {
267
+  $('#mapcontainer .tower').remove();
268
+  if (layout) {
269
+   layout.towers = [];
270
+  }
271
+ }
272
+
273
+ function clearCores() {
274
+  $('#mapcontainer .core').remove();
275
+ }
276
+
277
+ function updateLayout(data) {
278
+  clearLayout();
279
+  clearCores();
280
+
281
+  layout = data;
282
+  thisLevel = levels[layout.level - 1];
283
+
284
+  $.each(thisLevel.cores, function() {
285
+   createElForCore().offset(adjustMapOffset(this, thisLevel)).appendTo($('#mapcontainer'));
286
+  });
287
+
288
+  _gaq.push(['_setCustomVar', 1, 'Level', thisLevel.name, 1]);
289
+
290
+  $('#mapcontainer').css('background-image', 'url("' + thisLevel.minimap + '")');
291
+
292
+  $('#notecontent').val(layout.notes);
293
+  $.each(layout.towers, function() {
294
+   createElForTower(this).appendTo($('#mapcontainer'));
295
+  });
296
+  updateDefenseUnits();
297
+
298
+  $('#du_total').text(thisLevel.du);
299
+ }
300
+
301
+ function getLayout(id) {
302
+  _gaq.push(['_trackPageview', '/view/' + id]);
303
+  $.getJSON('res/data/layouts/' + id + '.js', updateLayout);
304
+ }
305
+
306
+ function showBlankLayout(id) {
307
+  window.location.hash = 'blank:' + id;
308
+  _gaq.push(['_trackPageview', '/view/blank:' + id]);
309
+  updateLayout({level: id, towers:[]});
310
+ }
311
+});

Loading…
Cancel
Save