-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.html
1312 lines (1266 loc) · 82.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" href="css/incTower.css" type="text/css">
<link rel="stylesheet" href="css/jquery-ui.min.css" type="text/css">
<link href='https://fonts.googleapis.com/css?family=PT+Sans+Narrow' rel='stylesheet' type='text/css'>
<link rel="stylesheet" type="text/css" href="css/jstree-themes/proton/style.min.css">
<link rel="shortcut icon" href="favicon.ico"/>
<title>Incremental Tower Defense</title>
<script type="text/html" id="skillTemplate">
<li>
<span data-bind="text: $root.skillAttributes[skill].fullName"></span>
<span data-bind="if: $root.skillAttributes[skill].grants">
<ul data-bind="template: { name: 'skillTemplate', foreach: $root.possibleGrants(skill) , as: 'skill' }">
</ul>
</span>
</li>
</script>
<script type="text/html" id="panel-template">
<div class="panel" data-bind="css: { expanded: $component.expanded, collapsed: !$component.expanded() }">
<div class="header" data-bind="click: function () { $component.expanded(!expanded()) }"><span
class="arrow"></span><span data-bind="text: header"></span></div>
<div class="content" data-bind="if: $component.expanded()">
<div data-bind="template: { nodes: $componentTemplateNodes, data: $root }" class="inner-content"></div>
</div>
</div>
</script>
</head>
<body>
<div class="topnav">
<span class="header"><a href="http://inctower.reddit.com" target="_blank">Incremental Tower Defense<span
class="version" data-bind="text: version"></span></a></span>
<span class="toplinks">
<button data-bind="click: function () { $root.showHelp(); }">Help <span
data-bind="if: $root.unreadHelps() > 0"><span data-bind="text: $root.unreadHelps()"
class="unread"></span></span></button>
<button data-bind="click: function () { $root.showReddit(); }">Reddit</button>
<button data-bind="click: function () { $root.showChangelog(); }">Changelog</button>
<button data-bind="click: function () { $root.showSkills(); }">Skills</button>
<button data-bind="click: function () { $root.showSaves(); }">Saves</button>
<button data-bind="click: function () { $root.showCredits(); }">Credits</button>
<button data-bind="click: function () { $root.showOptions(); }">Options</button>
</span>
</div>
<div id="center">
<div id="gameContainer"></div>
</div>
<div id="right_container">
<div id="right">
<div id="buyBlockActive"
data-bind="visible: cursor() !== false && cursor().type === 'buy' && cursor().param === 'block'">
<p>Click on the map to place your block.</p>
<button data-bind="click: function () { incTower.clearCursor(); }">Cancel</button>
</div>
<div id="sellToolActive" data-bind="visible: cursor() !== false && cursor().type === 'sell'">
<p>Click on a tower or block to sell it.</p>
<button data-bind="click: function () { incTower.clearCursor(); }">Cancel</button>
</div>
<div id="buyTowerActive"
data-bind="visible: cursor() !== false && cursor().type === 'buy' && cursor().param !== 'block'">
<p>Click on a tile with a block to build your tower.</p>
<button data-bind="click: function () { incTower.clearCursor(); }">Cancel</button>
</div>
<div data-bind="visible: cursor() !== false && cursor().type === 'spell'">
<p>Hover over the map to see the area of effect of your spell, click to cast.</p>
<button data-bind="click: function () { incTower.clearCursor(); }">Cancel</button>
</div>
<panel params="header: 'Basic'">
<div><b>Wave:</b> <span data-bind="text: wave"></span> <span data-bind="if: incTower.wave() > 1"><button
data-bind="click: function () { incTower.prevWave(); }" class="tooltip"
data-tooltip="Go back to the previous wave.">⏪</button></span>
<span data-bind="if: incTower.paused()"><button class="tooltip"
data-bind="click: function () { incTower.resumeGame(); }"
data-tooltip="Resume the game.">⏵</button></span>
<span data-bind="if: !incTower.paused()"><button
data-bind="click: function () { incTower.pauseGame(); }" class="tooltip"
data-tooltip="Pause the game.">⏸</button></span>
<span data-bind="if: incTower.wave() < incTower.maxWave()"><button
data-bind="click: function () { incTower.toMaxWave(); }" class="tooltip"
data-tooltip="Go back to the highest wave you've previously reached.">⏩</button></span>
</div>
<div><button
data-bind="click: function () { incTower.farmMode(!incTower.farmMode()); }" class="tooltip" data-tooltip="Progress mode is the default, it automatically advances to the next wave when you have killed all enemies. Farm mode allows you to stay on the same wave even after having killed all enemies. Note: Farm mode is ignored on your highest wave (you will always advance).">
<span data-bind="if: incTower.farmMode()">Farming: Switch to Progress</span>
<span data-bind="if: !incTower.farmMode()">Progress: Switch to Farming</span>
</button>
</div>
<div id="goldText"><b>Gold:</b> <span data-bind="text: humanizeNumber(gold())"></span></div>
<div data-bind="if: prestigePoints() > 0 || prestigePointsNext() > 0"><b>Prestige</b>: <span
data-bind="text: prestigePoints(), attr: {'data-tooltip': incTower.describePrestige(prestigePoints(), false) }"
class="tooltip"></span> <span
data-bind="if: prestigePointsNext() > 0"><b>(Next Reset:</b> +<span
data-bind="text: prestigePointsNext(), attr: {'data-tooltip': incTower.describePrestige(prestigePointsNext(), true) }"
class="tooltip"></span><b>)</b> <button
data-bind="click: function () { incTower.prestigeReset(); }">Prestige Reset</button></span>
</div>
<span data-bind="if: incTower.activeSkill()">
<b>Currently Training:</b> <span
data-bind="text: getActiveSkillName(), attr: {'data-tooltip': incTower.describeSkill(incTower.activeSkill()) }"
class="tooltip"></span>.
<div class="progressBar">
<div class="bar positive" data-bind="style: {width: percentageUntilSkillUp() + '%' }"><span
class="text">Skill up <span
data-bind="text: timeUntilSkillUp(incTower.secondsUntilSkillUp())"></span></span></div>
<div class="bar negative" data-bind="style: {width: (100 - percentageUntilSkillUp()) + '%' }"><span
class="text">Skill up <span
data-bind="text: timeUntilSkillUp(incTower.secondsUntilSkillUp())"></span></span></div>
</div>
</span>
<span data-bind="if: !incTower.activeSkill()">
<b>Skill Points:</b> <span
data-bind="text: humanizeNumber(skillPoints())"
class="tooltip"
data-tooltip="Skill points naturally accrue over time may also be gained through other means. Points can be spent on skills and when there are items in the skill queue all skill points will go directly to those skills instead of accruing."></span>.
</span>
</panel>
<panel params="header: 'Actions'">
<button data-bind="click: function () { incTower.buyBlock(); }" class="tooltip icon-btn"
data-tooltip="Build a Block. Blocks allow you to control the flow of monsters through the map, a block is also a required platform for building towers.">
<div class="keybind">Q</div>
<div class="icon" style="background: url(img/block.png);"></div>
<span data-bind="text: humanizeNumber(incTower.blockCost())"></span>g
</button>
<!-- ko foreach: availableTowers -->
<button data-bind="click: function () { $root.buyTower($data); }, attr: { 'data-tooltip': $root.towerAttributes[$data].describe() }"
class="tooltip icon-btn">
<div class="keybind" data-bind="text: $root.towerKeybindLetter($index())"></div>
<div class="icon"
data-bind="style: { background: $root.towerIconCSS($data) }"></div>
<span data-bind="text: $root.humanizeNumber($root.towerCost($data))"></span>g
</button>
<!-- /ko -->
<button data-bind="click: function () { incTower.sellTool(); }" class="tooltip icon-btn"
data-tooltip="Sell towers and blocks.">
<div class="keybind">S</div>
<div class="icon" style="background: url(img/sell.png);"></div>
</button>
<button data-bind="click: function () { cheapestUpgrade(); }, attr: { 'data-tooltip': incTower.tooltipUpgradeLeast() }"
class="tooltip icon-btn">
<div class="keybind">L</div>
<div class="icon" style="background: url(img/upgrade-least.png);"></div>
</button>
<button data-bind="click: function () { cheapestUpgradeAll(); }" class="tooltip icon-btn"
data-tooltip="Upgrade all towers using ALL gold.">
<div class="icon" style="background: url(img/upgrade-all.png);"></div>
</button>
<!-- ko foreach: availableActions -->
<button data-bind="click: function () { $root.castAction($data); }, attr: { 'data-tooltip': $root.actionAttributes[$data].describe() }"
class="tooltip icon-btn">
<div class="keybind" data-bind="text: $root.actionAttributes[$data].keybind"></div>
<div class="icon"
data-bind="style: { background: $root.actionIconCSS($data) }"></div>
</button>
<!-- /ko -->
</panel>
<div data-bind="if: incTower.maxMana().gt(0)">
<panel params="header: 'Magic'">
<div class="progressBar tooltip"
data-bind="visible: incTower.maxMana().gt(0), attr: { 'data-tooltip': incTower.describeManaRegeneration() }"
style="display: inline-block;">
<div class="mana bar positive" data-bind="style: {width: percentageMaxMana() + '%' }"><span
class="text">Mana: <span data-bind="text: humanizeNumber(incTower.mana())"></span> / <span
data-bind="text: humanizeNumber(incTower.maxMana())"></span></span></div>
<div class="mana bar negative" data-bind="style: {width: (100 - percentageMaxMana()) + '%' }"><span
class="text">Mana: <span data-bind="text: humanizeNumber(incTower.mana())"></span> / <span
data-bind="text: humanizeNumber(incTower.maxMana())"></span></span></div>
</div>
<div>Spell Level: <span
data-bind="text: incTower.spellLevel, attr: {'data-tooltip': incTower.describeSpellLevel() }"
class="tooltip"></span>
</div>
<div data-bind="if: availableSpells().length > 0" class="flex" style="width: 100%;">
<!-- ko foreach: availableSpells -->
<button data-bind="click: function () { $root.castSpell($data); }, attr: { 'data-tooltip': $root.spellAttributes[$data].describe() }"
class="tooltip icon-btn">
<div class="keybind" data-bind="text: $root.spellKeybindLetter($index())"></div>
<div class="icon" style="border: 1px solid black;"
data-bind="style: { background: $root.spellIconCSS($data) }"></div>
<span data-bind="text: $root.humanizeNumber($root.spellAttributes[$data].trueManaCost())"></span>
Mana
</button>
<!-- /ko -->
</div>
</panel>
</div>
<div data-bind="if: currentlySelected()">
<panel params="header: 'Currently Selected'">
<div id="selectedTower" data-bind="if: currentlySelected() && currentlySelected().tower">
<div style="float: right; width: 50%; background-color: lightgrey; padding: 0 0.5em;"
data-bind="html: $root.describeTower(currentlySelected())"></div>
<!--<p><b>Currently Selected Tower:</b></p>-->
<div>Level: <span data-bind="text: currentlySelected().level()"></span></div>
<div>Damage: <span data-bind="text: humanizeNumber(currentlySelected().totalDamage())"></span></div>
<div>Range: <span data-bind="text: humanizeNumber(currentlySelected().trueRange())"></span></div>
<div>Attack Delay: <span data-bind="text: (currentlySelected().fireTime()/1000).toFixed(2)"></span>
</div>
<div data-bind="if: currentlySelected().ammoType() != false">
Ammo Type:
<select data-bind="
options: $root.towerAttributes[currentlySelected().towerType].ammoTypes,
value: currentlySelected().ammoType,
optionsText: function (ammo) {
return $root.ammoAttributes[ammo].name;
}
"></select>
<button data-bind="click: function () { currentlySelected().updateAllAmmo(); }" class="tooltip"
data-tooltip="Set the ammo type for each tower of this type to the currently selected Ammo.">
Update Ammo for <span data-bind="text: _.capitalize(currentlySelected().towerType)"></span>
Towers
</button>
</div>
<button data-bind="click: function () { currentlySelected().payToUpgrade(); }">Upgrade (<span
data-bind="text: humanizeNumber(currentlySelected().upgradeCost())"></span>g)
</button>
<button data-bind="click: function () { currentlySelected().sell(); }">Sell (<span
data-bind="text: humanizeNumber(currentlySelected().goldSpent().times(incTower.sellTowerPer()))"></span>g)
</button>
<div data-bind="if: currentlySelected().buffs().length > 0">
<b>Buffs:</b><br>
<span data-bind="foreach: currentlySelected().buffCounts()">
<b><span data-bind="text: $data.type"></span>: </b> <span
data-bind="text: $data.amount"></span><br>
</span>
</div>
</div>
<div id="selectedEnemy" data-bind="if: currentlySelected() && currentlySelected().enemy">
<!--<p><b>Currently Selected Enemy:</b></p>-->
<div>Health: <span data-bind="text: humanizeNumber(currentlySelected().health())"></span> / <span
data-bind="text: humanizeNumber(currentlySelected().maxHealth)"></span></div>
<div>Gold Value: <span data-bind="text: humanizeNumber(currentlySelected().goldValue())"></span>
</div>
<div data-bind="if: currentlySelected().sortedPowers && currentlySelected().sortedPowers.length > 0">
Powers:
<span data-bind="foreach: currentlySelected().sortedPowers">
<span data-bind="text: $root.bossPowers[$data.power].name, attr: {'data-tooltip': $root.bossPowers[$data.power].describe($data.level)}"
style="text-transform: capitalize;" class="tooltip"></span>
</span>
</div>
<div data-bind="if: currentlySelected().elementalInstability().gt(0)">Instability: <span
data-bind="text: humanizeNumber(currentlySelected().elementalInstability())" class="tooltip"
data-tooltip="Elemental Instability accrues from a portion of elemental tower hits, when elemental rune reactions occur any damage portion is normally calculated from its instability."></span>
</div>
</div>
</panel>
</div>
<panel params="header: 'Adv. Stats'">
<div>Average DPS (5 min rolling): <span data-bind="text: humanizeNumber($root.avgDPS())"></span></div>
<div>Highest DPS: <span data-bind="text: humanizeNumber($root.highestDPS())"></span></div>
<div>Average GPS (5 min rolling): <span data-bind="text: humanizeNumber($root.avgGPS())"></span></div>
</panel>
</div>
</div>
<div id="credits" title="Credits">
<p>The basis for this whole project started as clone of <a
href="https://github.com/theodufay/phaser-tower-defense" target="_blank">this GitHub repo</a>. I used
this initial code to teach myself about Phaser.io and many of the enemy sprites and the terrain tiles are
from this original project.</p>
<p>The number suffixes for large numbers were directly stolen from <a href="https://swarmsim.github.io/"
target="_blank">Swarm Simulator (a
fantastic game).</a></p>
<p>The elemental icons used for the elemental towers comes from <a
href="http://pixabay.com/en/air-earth-elements-fire-symbol-147719/" target="_blank">this collection on
pixabay</a>.</p>
<p>The images used for the blocks came from <a href="http://opengameart.org/content/dungeon-crawl-32x32-tiles"
target="_blank">yet another Open Game Art collection</a>.</p>
<p>The rock/boulder sprites that fall from the sky when the earth tower activates can be found <a
href="http://opengameart.org/content/rocks" target="_blank">here</a></p>
<p>The zombie and skeleton enemy sprites are from <a
href="http://opengameart.org/content/zombie-and-skeleton-32x48" target="_blank">here</a>.</p>
<p>The goblin sprite comes from <a
href="http://opengameart.org/content/tower-defense-prototyping-assets-4-monsters-some-tiles-a-background-image"
target="_blank">this Open Game Art collection</a>.</p>
<p>Eye of the Storm and Frost Shatter spell icons from <a
href="http://opengameart.org/content/painterly-spell-icons-part-4">here</a>.</p>
<p>Mana Burst, Smolder, and Seismic Rupture spell icons were made by HorrorPen and can be found <a
href="http://opengameart.org/content/random-rpg-icons-part-1">here</a>.</p>
<p>Icon for the blueprints/templating action was made by Ofer Lehr (and cropped by me) was found <a
href="https://thenounproject.com/term/blueprint/1050/">here</a>.</p>
<p>Radar sweep icon which is used by the sensor array tower made by <a
href="http://lorcblog.blogspot.com/">Lorc</a> and hosted on <a
href="http://game-icons.net/lorc/originals/radar-sweep.html">game-icons.net</a>. It has been shrunk down
and colorized for my purposes.</p>
<p>Beetle sprite (with recolors) by Stephen "Redshrike" Challener hosted <a
href="http://opengameart.org/content/lpc-beetle"> on OpenGameArt.org</a>.</p>
<p>Farm animals (cow, chicken, sheep, llama, pig) done by Daniel Eddeland, some of these sprites were resized by
me but otherwise unaltered. The original submission is available at <a
href="http://opengameart.org/content/lpc-style-farm-animals">OpenGameArt</a>.</p>
<p>Red and green fairy sprites by Lunovox can be found <a
href="http://opengameart.org/content/sprite-de-fada-fairy">here</a>.</p>
<p>Black golem, blue golem, floating skull, red wizard, turtle, and dark wizard sprites by Stephen Challener
(Redshrike), hosted by OpenGameArt.org <a
href="http://opengameart.org/content/16x16-16x24-32x32-rpg-enemies-updated">here</a> and <a
href="http://opengameart.org/content/a-load-of-overworld-34-rpg-sprites">here</a>.</p>
<p>Proton theme for jstree from <a href="https://github.com/orangehill/jstree-bootstrap-theme">Orange Hill
Development</a>.</p>
<p>Arcane Orb icon and bullet from <a href="http://www.amon.co">Amon</a> on <a
href="https://opengameart.org/content/magic-orbs">OpenGameArt</a>.</p>
<p>Blood icon (used by shrapnel towers) created by Sémhur can be found <a
href="https://commons.wikimedia.org/wiki/File:Blood_drop.svg">here</a>.</p>
<p>Positive sound (used on skill up) from Lokif, found <a href="https://opengameart.org/content/gui-sound-effects">here</a>
</p>
<p>Music: Dark, Earth Is All We Have, Heaven Sings, High Stakes, Low Chances, and Theme Crystalized written and
produced by Ove Melaa ([email protected]). Found <a
href="https://opengameart.org/content/oves-essential-game-audio-pack-collection-160-files-updated">here</a>.</a>
</p>
<p>Music: Crystal Cave by cynicmusic found <a href="https://opengameart.org/content/crystal-cave-song18">here</a>.
</p>
<p>Music: Battle Theme A by cynicmusic found <a href="https://opengameart.org/content/battle-theme-a">here</a>.</p>
<p>Music: Observing the Star by yd found <a href="https://opengameart.org/content/another-space-background-track">here</a>.
</p>
<p>Music: Mystical Theme by Alexandr Zhelanov (<a href="https://soundcloud.com/alexandr-zhelanov">SoundCloud</a>)
found <a href="https://opengameart.org/content/mystical-theme">here</a>.</p>
<p>Music: Heroic Minority by Alexandr Zhelanov (<a href="https://soundcloud.com/alexandr-zhelanov">SoundCloud</a>)
found <a href="https://opengameart.org/content/heroic-minority">here</a>.</p>
<p>Music: Winds Of Stories by HorrorPen found <a href="https://opengameart.org/content/winds-of-stories">here</a>.
</p>
<p>Music: No More Magic by HorrorPen found <a href="https://opengameart.org/content/no-more-magic">here</a>.</p>
<p>Music: Cyberpunk Moonlight Sonata by Jotn found <a
href="https://opengameart.org/content/cyberpunk-moonlight-sonata">here</a>.</p>
<p>Music: Sci-Fi from <a href="http://www.bensound.com">BenSound.com</a>, found <a
href="https://www.bensound.com/royalty-free-music/track/sci-fi">here</a>.</p>
<p>Music: We're Leaving Now from Nico Maximilian, found <a
href="https://www.jamendo.com/track/1448049/we-re-leaving-now">here</a>.</p>
<p>Tileset by Leonard Pabin found <a href="https://opengameart.org/content/whispers-of-avalon-grassland-tileset">on
OpenGameArt.org</a>.</p>
<p>Power Lightning icon icon which is used by the support tower and power generator support ammo made by <a
href="http://lorcblog.blogspot.com/">Lorc</a> and hosted on <a
href="http://game-icons.net/lorc/originals/power-lightning.html">game-icons.net</a>. It has been shrunk down
and colorized for my purposes.</p>
<p>Spell casting animation by rubberduck found on <a
href="https://opengameart.org/content/25-special-effects-rendered-with-blender">OpenGameArt</a>.</p>
<p>Most fonts are a bitmap version of PF Tempesta Seven by Yusuke Kamiyamane found <a href="https://www.dafont.com/pf-tempesta-seven.font">here</a>. Converted to Bitmap font using <a href="http://kvazars.com/littera/">Littera</a>.</p>
</div>
<div id="save" title="Saves">
<p>Copy and paste the text below to backup your save game.<br>
<textarea id="b64_save" readonly></textarea></p>
<p>If you have a save game you wish to load paste it here:<br>
<textarea id="b64_load"></textarea>
</p>
</div>
<div id="skills" title="Skills">
<input type="radio" name="skillTreeMode" value="tree" data-bind="checked: skillTreeMode"> Tree | <input
type="radio" name="skillTreeMode" value="flat" data-bind="checked: skillTreeMode"> Flat
<div id="skills_tree">
</div>
<div id="skills_desc">
<h3>Description</h3>
<span id="skills_desc_text" data-bind="html: incTower.describeSkill(incTower.UIselectedSkill())"></span>
<span data-bind="if: !incTower.UIselectedSkill()">Click a skill on the left to see its description.</span>
<span data-bind="if: incTower.directlyQueueable(incTower.UIselectedSkill())"><button
id="skill_queue_button">Add to Queue (Costs <span
data-bind="text: incTower.skillDescribeTimeAdded(incTower.UIselectedSkill())"></span>)</button></span>
<span data-bind="if: !incTower.directlyQueueable(incTower.UIselectedSkill()) && !incTower.skillMaxedInQueue(incTower.UIselectedSkill()) && !incTower.skillIsMaxed(incTower.UIselectedSkill())"><button
id="skill_queue_prereqs">Add Prerequisites to Queue</button></span>
</div>
<div id="skills_queue">
<h3>Training Queue</h3>
<p data-bind="if: skillQueue().length > 0">Queue will be exhausted <span
data-bind="text: timeUntilSkillUp(incTower.secondsUntilQueueExhausted())"></span>.</p>
<span data-bind="if: skillQueue().length == 0">No items in queue!</span>
<ul data-bind="foreach: skillQueue" id="sortable_queue">
<li class="ui-state-default" data-bind="attr: {'data-skill': $data[0], 'data-rank': $data[1]}"><span
class="ui-icon ui-icon-arrowthick-2-n-s"></span><span
data-bind="text: $root.skillAttributes[$data[0]].fullName"></span> (Rank <span
data-bind="text: $data[1]"></span>) <span
data-bind="visible: $root.directlyRemovable($data[0], $data[1])" style="float: right;"
class="ui-icon ui-icon-closethick remove-queue"></span></li>
</ul>
<br>
<button data-bind="click: function () { incTower.clearQueue(); }">Clear Queue</button>
</div>
</div>
<div id="help" title="Help">
<p>Selected Help Topic: <select
data-bind="options: availableHelp, optionsText: function (item) { return (incTower.haveReadHelpTopic(item) ? '' : '★') + incTower.helpTopics[item].title; }, value: selectedHelp"></select><br>(★
marks a topic you have not read.)</p>
<div data-bind="if: !selectedHelp()">Select a help topic above to view it.</div>
<div data-bind="if: selectedHelp()">
<p><b data-bind="text: incTower.helpTopics[selectedHelp()].title"></b></p>
<div data-bind="html: incTower.helpTopics[selectedHelp()].body"></div>
</div>
</div>
<div id="options" title="Options">
<p><b>Sound:</b></p>
Master Volume: <select data-bind="value: $root.masterVolume">
<option>10</option>
<option>9</option>
<option>8</option>
<option>7</option>
<option>6</option>
<option>5</option>
<option>4</option>
<option>3</option>
<option>2</option>
<option>1</option>
<option>0</option>
</select><br>
Sound Effect Volume: <select data-bind="value: $root.sfxVolume">
<option>10</option>
<option>9</option>
<option>8</option>
<option>7</option>
<option>6</option>
<option>5</option>
<option>4</option>
<option>3</option>
<option>2</option>
<option>1</option>
<option>0</option>
</select><br>
Music Volume: <select data-bind="value: $root.musicVolume">
<option>10</option>
<option>9</option>
<option>8</option>
<option>7</option>
<option>6</option>
<option>5</option>
<option>4</option>
<option>3</option>
<option>2</option>
<option>1</option>
<option>0</option>
</select><br>
Current Music: <span data-bind="text: currentMusic"></span><br>
Background Sounds: <input type="checkbox" data-bind="checked: $root.backgroundSound">
</div>
<div id="changelog" title="Changelog">
<p>Changelog:</p>
<ul>
<li>Version 0.2.7:
<ul>
<li>2018-11-26: Fixed a bug I introduced which prevented tower blueprinting.</li>
<li>2018-11-25: Replaced most floating texts with a new bitmap font which dramatically reduces the number of draws on Chrome and Firefox (and should therefore hopefully be faster).</li>
<li>2018-11-25: Replaced BigNumber.js with break_infinity.js which in my testing is many times faster in calculating.</li>
</ul>
</li>
<li>Version 0.2.6:
<ul>
<li>2018-11-24: Backend change: I've switched to concatenating all of the game's code again. This should prevent weirdnesses where caching causes parts of new code and parts of old code to load together. Similarly the version number is now in code so you can tell if you've loaded new code based on version number.</li>
<li>2018-11-24: Added tooltip to explain farm/progress modes.</li>
<li>2018-11-24: Farm mode will now automatically be switched off, and you will advance the wave, if you are already on your maximum achieved wave and you kill all the enemies.</li>
<li>2018-11-24: Changed the accounting for alive enemies to hopefully make that logic cheaper to calculate.</li>
<li>2018-11-24: Various speed improvements to reduce recalculation of tower damage.</li>
<li>2018-11-23: Added Power Grid skill which increases damage of towers based on how many neighboring support towers.</li>
<li>2018-11-17: Added Mana-Bond boss power which causes mana damage as the enemy takes damage.</li>
<li>2018-11-17: Added Arcane Mastery infinite skill which increases arcane damage based on current mana.</li>
<li>2018-11-15: Spell damage is now based on average DPS and 1% of max DPS instead of being based on the
sum of all tower damage.
</li>
<li>2018-11-15: Added an advanced stats panel with avg gold/dps (5 minute rolling averages) and max
DPS.
</li>
<li>2018-11-14: Reworked right-hand UI into collapsible panels.</li>
<li>2018-11-13: Adaptive Upgrades can now cause towers to upgrade more than once on a hit.</li>
<li>2018-11-12: Fixed directional shields to randomize their starting angle.</li>
</ul>
</li>
<li>Version 0.2.5:
<ul>
<li>2018-11-11: Added Battery Longevity skill which increases the duration of support tower buffs.</li>
<li>2018-11-11: Added Sniper Ammo skill and Ammo Type which causes heavier damage at a large range in
exchange for a slower reload time.
</li>
<li>2018-11-11: Buffs to towers from support towers will now overwrite weaker buffs of the same type.
</li>
<li>2018-11-11: Prestiging now properly clears unlocked ammo types. (Thanks DougMcCokkin.GG)</li>
<li>2018-11-11: Changed blueprint values to change the base value of towers before exponential growth
rather than adding to them afterwards. (Thanks Duguall)
</li>
<li>2018-11-11: Fixed a bug that caused all clicks to register as selecting a single tower.</li>
<li>2018-11-11: Library Updates: Phaser CE to v2.11.1, jsTree to v3.3.7, Easy Star to v0.4.3, jQuery to
v3.3.1, Lodash to v4.17.10
</li>
<li>2018-01-27: Drastically reduced the number of draw calls made when in WebGL, which should vastly
improve performance for each browser except for IE and Edge.
</li>
<li>2018-01-21: Preferred powers are now spread more evenly among different types of enemies, there are
now no powers which are not preferred by some kind of enemy and no two enemies have the same set of
preferred powers.
</li>
<li>2018-01-21: Added a boss power called steel skinned which reduces burning/bleeding damage by
50%/100% over two ranks.
</li>
<li>2018-01-15: Enemy sprites can now have multiple "preferred powers", so for example a sprite can be
marked to prefer flying and null-zone instead of just preferring flying.
</li>
<li>2018-01-14: Enemies health and gold value is now divided based on pack. Meaning that in the case of
a mixed pack where one has way more enemies that pack will have lower health values per unit.
Previously the health pool was split across all units so one pack with swarm would lower the health
values of the other pack.
</li>
<li>2018-01-14: Added a new enemy power called healer which allows it to intelligently heal an enemy
once every 10 seconds, enemies stop when casting a spell.
</li>
<li>2018-01-13: Relative tower indicators are now based on base damage (before buffs/skills) rather than
the relatively more expensive to calculate total damage.
</li>
<li>2018-01-12: Added the generator ammo type which comes with the skill that unlocks support towers.
Generators buff towers around them to allow them to sometimes fire even in effects such as
null-zone. Generators are immune from the effects of null-zone themselves as well.
</li>
<li>2018-01-12: Fixed a bug where support towers damage bonuses were not being applied.</li>
<li>2018-01-12: The cost difference from kinetic -> elemental -> support has been vastly reduced. In
particular support towers are now 10x cheaper to build.
</li>
<li>2018-01-12: Sensor arrays are now not a separate type but rather an ammo for the new support type.
All blueprint points that were accumulated under sensors will be applied to support towers.
</li>
<li>2018-01-12: Reworked skill code such that a skill can have additional skill pre-requisites beyond
just the parent skills. Sensor Arrays now requires Power Distribution in addition to Sensors because
Sensor Array will soon be an "ammo type" for the generic support tower.
</li>
<li>2018-01-12: Added a new skill called Power Distribution which unlocks the new generic support
tower.
</li>
<li>2018-01-09: There is now a button to update all towers of a given type to its currently selected
ammo.
</li>
<li>2018-01-09: Fixed a bug where tooltips could appear off screen if the browser was not maximized or
had reduced height in general.
</li>
<li>2018-01-07: Added a new boss power called Directional-Shield, enemies spawn a shield 45-270 degrees
around them and are immune to tower shots from those angles.
</li>
<li>2018-01-06: Start zones, end zones, the path, and null zone have been changed to be less intensive
to draw. Nullzones are now more transparent.
</li>
<li>2018-01-06: The game will once again use a worker process to try to stay active in the background.
Will now attempt to call render only once instead of on each delta tick.
</li>
<li>2018-01-06: Optimizations for games with lots of towers: Towers will now remember their last target
and retry that target first rather than constantly scanning for enemies in range. Towers will also
pause scanning based on the distance to the nearest enemy if there are no targets in range.
</li>
</ul>
</li>
<li>Version 0.2.4:
<ul>
<li>2018-01-05: There should in theory be a favicon for the game now.</li>
<li>2018-01-05: Shrapnel towers now have a blood icon.</li>
<li>2018-01-05: Saves now trigger when an enemy hits the edge of the map.</li>
<li>2018-01-05: Saves now store a backup locally when triggered although currently there isn't a way to
access this backup save through the UI.
</li>
<li>2018-01-05: Closing the options menu now triggers a save (so it will remember volume settings on
reload without having to kill a wave).
</li>
<li>2018-01-02: Added a constraint solving engine called csp.js by PrajitR to assist in efficiently
calculating map changes.
</li>
<li>2017-12-30: The game now uses a new tileset by Leonard Pabin. Over time the walking tiles will shift
from grass to desert as an aesthetic effect, note that these changes will be lost on reload.
</li>
<li>2017-12-30: You now start with two blocks, one in the center as usual and another closer to the
default pathing at the start of the game.
</li>
<li>2017-12-29: Added a display of the current playing song to options, you all can let me know which
tracks you like/dislike.
</li>
<li>2017-12-28: Added in a background sounds checkbox to options, by default sounds will not play in the
background.
</li>
<li>2017-12-28: Added in a master volume control that impacts both special effects sounds and music.
</li>
<li>2017-12-28: Added in music with it's own volume control.</li>
<li>2017-12-28: There is now a sound effect when you learn a skill. There is now an options screen where
you can control the sound effect volume, including turning it to 0.
</li>
<li>2017-12-28: Shrapnel ammo now respects effects that reduce damage, like armored and shielded. The
amount of bleeding done is now based on how much direct kinetic damage was done.
</li>
<li>2017-12-28: Save games are now compressed. A save that would've previously taken about 43k
characters now takes 12k characters. There's definitely room for improvement but this should be a
solid start.
</li>
</ul>
</li>
<li>Version 0.2.3:
<ul>
<li>2017-12-26: Prestige points are now awarded at a curve starting at 1 instead of 4. In addition to
encourage deep runs there is an overall multiplier added every 100 waves. E.g. 2x prestige at Wave
201 and above, 3x prestige at 301 and above.
</li>
<li>2017-12-26: Fixed a bug with the previous wave button that decremented two waves instead of one when
in farm mode (Github Issue #8). Thanks desci!
</li>
<li>2017-12-26: Clicking a button or keybind for a tower will now clear the cursor if you do not have a
sufficient amount of gold for that type of tower (Github Issue #8). Thanks desci!
</li>
<li>2017-12-26: There are now white level indicators overlayed on all towers.</li>
<li>2017-12-26: Added Market Connections as a new secondary skill under investment.</li>
<li>2017-12-26: Added a new starting skill and branch called Investment.</li>
<li>2017-12-26: As part of rebalancing skill times anti-coagulants was massively reduced in skill points
cost. The effect has been reduced accordingly from 5% / rank to 1.25% / rank. Meaning that it now
requires level 20 to halt bleeding reduction instead of rank 10, however the skill point cost has
been massively reduced.
</li>
<li>2017-12-21: Fixed a bug preventing stored skill points from being applied to new skill training.
</li>
<li>2017-12-21: Related to the entry below, added the ability for ammo types to have their own bullet
sprites.
</li>
<li>2017-12-21: Added Arcane icon for Arcane Orb ammo on magic towers.</li>
<li>2017-12-21: Upgraded Phaser.js to 2.9.4 (community edition).</li>
<li>2017-08-20: Changed the mana regeneration display to prettify in the numbers.</li>
<li>2017-08-20: Implemented the arcane orb ammo type which grants +1 mana on hit and causes arcane
damage.
</li>
<li>2017-04-29: Upgraded Knockout.js to 3.4.2, BigNumber.js
to 4.0, EasyStar.js to 0.4.1, jsTree to 3.3.3, and moment.js to 2.17.1.
</li>
<li>2017-03-20: It is now possible to not be actively learning a skill, doing so accrues skillpoints
which can then be spent on a skill.
</li>
<li>2017-03-11: The bug where nullzoned enemies were leaving behind their nullzones appears to be
quashed.
</li>
<li>2017-02-05: Along with the previous change the elemental rune reaction system has been folded
into ammo types. Previously runes had a chance every second to proc their reaction which was
subject entirely to RNG. Now there are elemental catalyst ammo types which consume the given
type of elemental rune and cause that reaction.
</li>
<li>2017-01-17: Fire, earth, water, air towers collapsed into elemental towers, previously gained
blueprint points should be converted to the new towers.
</li>
<li>2017-01-14: Significant nerf to prestige. Rather than each point granting 10% increase to learn
rate each point grants 1% and is subjected to diminishing returns after 100% increase. This was
done because these large linear increases meant that after the first prestige, usually
regardless of when you prestiged, all non-infinite skill costs become negligable. This also
encourages deeper runs to counter-act the diminishing returns. To account for this nearly all
skills will be adjusted down, including the scaling of infinite skills.
</li>
<li>2017-01-08: Tweaked tooltips to increase the buffer between the mouse and actual tooltip and
cancel the tooltip if you mouse over the tooltip to prevent tooltips from blocking buttons.
</li>
</ul>
</li>
<li>Version 0.2.2:
<ul>
<li>2017-01-02: For the ammo change below the shrapnel ammo skill has been replaced with a 1 rank
skill that simply grants the ammo type.
</li>
<li>2017-01-02: Upgraded jQuery-UI (for dialogs) to 1.12.1.</li>
<li>2017-01-02: Added a grey box which describes a tower including its general description, support
function if it has one, and ammo if it has it. This replaces the very small support tower
description that existed before.
</li>
<li>2016-12-26: Added an ammo system (currently only for kinetic towers). This allows one tower to
have different modes. Currently there is only regular bullets and shrapnel rounds (which are
learned) for kinetic towers.
</li>
<li>2016-12-17: Finally squashed the IE11/Edge memory leak bug. Apparently the canvas renderer will
not leak in IE but WebGL will.
</li>
<li>2016-12-14: The tooltip library previously being used (qTip) does not support jQuery 3.x so I
have removed it and rewritten tooltips without the library or jQuery.
</li>
<li>2016-12-14: Upgraded jQuery to the 3.x branch. Phaser itself does not support IE8 so this
shouldn't change the compatibility for the game overall
</li>
<li>2016-12-10: Upgraded Knockout.js to 3.4.1</li>
<li>2016-12-02: Added a flat skill mode which allows you to view only skills that you can place
points in without the extra hierarchy information.
</li>
<li>2016-12-02: Fixed bug where stars weren't showing on infinite skills for every 20 ranks.</li>
<li>2016-11-28: Added Proton theme to skills dialog to hopefully make it much clearer if a skill
item can be expandable or not.
</li>
<li>2016-11-20: Placing a block or selling a block now shows what the new path would look like, if
performing that action would change the path.
</li>
</ul>
</li>
<li>Version 0.2.1:
<ul>
<li>2016-11-20: Fixed a bug where sensor towers placed on the edge of the map would cause
errors/freezing.
</li>
<li>2016-11-20: Fixed an issue which caused all save game loads to quit working.</li>
<li>2016-11-20: Changed google font load to HTTPS to avoid mixed content warnings.</li>
<li>2016-09-04: Added a 'fast forward' button to return to the highest wave you've ever witnessed.
</li>
<li>2016-09-04: Revised the previous/pause/play buttons into symbols to save space and added
tooltips
for each.
</li>
<li>2016-09-04: Reduced the scaling on nullzone. Now grants 1 space of dampening at rank 1 and an
additional 0.5 per rank after that.
</li>
<li>2016-07-18: Added generic adjectives and nouns for wave titles and implemented random colors for
their announcement.
</li>
<li>2016-07-10: Added power adjectives and an alternate styling to wave titles.</li>
<li>2016-07-06: Each wave is now introduced with a title generated based on the pack that's
coming.
</li>
<li>2016-06-22: Added 6 new sprites (red wizard, black wizard, black golem, blue golem, flying
skull,
turtle).
</li>
</ul>
</li>
<li>Version 0.2:
<ul>
<li>2016-06-20: Added versions. I've declared all changes that have been live for the past month and
a
half version 0.1, and I dub this version 0.2. The version number now shows next to the title of
the
game.
</li>
<li>2016-06-20: Linked the header and a new button to Reddit. I'm hoping to build up a community
there.
Maybe potentially replacing the woefully inadequate help feature with a reddit wiki.
</li>
<li>2016-06-20: Added code to stop mixtures of certain boss powers from occuring. For example Fast
and Heavy don't make sense together, neither do Heavy and Flying.
</li>
<li>2016-06-20: Updated the teleport tooltip to explain the nerf that had already been made to it
(won't teleport past the furthest enemy).
</li>
<li>2016-06-20: Enemies with the flight power are now more susceptable to the knock back caused by
wind towers (they stay in the air longer). They also have 40% reduced max health. Updated the
tool tip to reflect this.
</li>
<li>2016-06-16: Reworked movement code to be much simpler and allow for diagnal movements for the
newly
implemented flight power. Flight allows enemies to move diagnally and over all blocks and
towers.
</li>
<li>2016-06-16: Removed the path finder plugin. I needed to use a feature of easystar that was not
exposed by it
and it wasn't much code to replace it.
</li>
<li>2016-06-12: Seismic Rupture spell has been added, now each element has at least one spell.
Hooray!
</li>
<li>2016-06-11: Preferred powers can be equal to other powers (it's just guaranteed that if they are
not maxed
out that no other power is greater than them), now they are displayed first in the listing
regardless of
strength so you can see at a glance what the preferred power of a sprite is.
</li>
<li>2016-06-11: Added cow enemy and a new boss power called 'heavy' which slows base movement speed
but makes
the enemy immune to knockbacks and slows (except for total frozen).
</li>
<li>2016-06-10: All rune-addition now runes through the same set of diminishing returns. The chance
of applying
the rune is reduced by the number of runes of that type already on the target, whether that
target recently
experienced an elemental reaction of that type, and whether the target is resistant to that type
(which is
the same as before). This change includes spells.
</li>
<li>2016-06-09: "Normal" (non boss) waves now have boss powers starting at level 25, they will have
half the
number of boss power slots as the boss levels do.
</li>
<li>2016-06-09: Added the armored power which reduces kinetic (normal tower etc.) damage.</li>
<li>2016-06-08: Fixed an issue where elemental resistance skills (fire/water/air/earth/arcane) were
errantly
allowed to roll on bosses without the relevant skills learned, making the boss fights much
easier.
</li>
<li>2016-06-08: When sprites are randomly selected they will be rerolled if their preferred power
shouldn't be
selected (fire-resistant shouldn't roll if the player doesn't have fire affinity for example).
</li>
<li>2016-06-08: Added two new beetle sprites with water-resistant and fire-resistant preferred
powers.
</li>
<li>2016-06-08: A new boss power has been added. Nullzone stops towers within a certain number of
spaces from
firing. The newly added sensor array is meant to be the counter to this power.
</li>
<li>2016-06-01: Selecting a support tower (currently just sensor arrays) will present a blue tooltip
that
explains what exactly it does.
</li>
<li>2016-06-01: Selecting a tower that is under a buff from the sensor array will now show the types
and degree
or buffs it is currently under.
</li>
<li>2016-06-01: Added sensor arrays, currently they buff adjacent (including diagnal) non-support
towers by
granting them a bonus 15% range for 2 seconds when they "fire".
</li>
<li>2016-05-28: All elemental effects should now properly trigger diminishing returns on all enemies
hit, not
just the one that started the reaction.
</li>
<li>2016-05-23: Boss generation is now more likely to favor fewer, stronger powers (although the
'preferred'
power tied to that enemy type is always guaranteed to be the strongest or tied for strongest).
</li>
<li>2016-05-22: The teleport boss power now causes the enemy pack to be at least two units.</li>
<li>2016-05-22: Each type of enemy now has a boss power associated with it.</li>
<li>2016-05-21: There is now a help file available for prestige upon reaching level 100.</li>
<li>2016-05-21: Tooltips now fully destroy themselves upon being hidden.</li>
<li>2016-05-21: Upgrade tooltips will now dynamically update if the skill has upgraded while the
tooltip was
opened.
</li>
<li>2016-05-19: Abandoned web worker implementation of inactive timer, using setInterval instead.
</li>
<li>2016-05-19: Implemented pause/resume buttons, moved it to its own row next to the previous wave
button.
</li>
<li>2016-05-19: The nerf hammer has visited teleport, now teleport can only go as far as one tile
further than
the farthest enemy. If there is only one enemy then it will only be able to teleport one space
at a time
regardless of how strong its teleport power is.
</li>
<li>2016-05-19: Super huge refactoring, broke down a large monolithic chunk of code into 18
modules.
</li>
</ul>
</li>
<li>Version 0.1:
<ul>
<li>2016-05-05: Added RequireJS.</li>
<li>2016-05-05: I'm declaring the IE11 Memory Leak solved, although there appears to be a bug with
IE
development tools that will cause a memory leak if you use the memory profiler.
</li>
<li>2016-05-04: Upgraded jstree to 3.3.0.</li>
<li>2016-05-04: Upgraded jQuery to 1.12.3.</li>
<li>2016-05-03: Upgraded KnockoutJS to 3.4.0.</li>
<li>2016-04-29: Upgraded Phaser to 2.4.7.</li>
<li>2016-04-29: Found another issue with timing which should be fixed now. Now uses
performance.now() if
the browser supports it but falls back to Date.now() otherwise.
</li>
<li>2016-04-29: Renamed Fire Rate to Attack Delay.</li>
<li>2016-04-29: Hopefully also fixed a subtle timing issue that may have caused towers to fire at
the
same time despite having different rates and may have also been involved with the bug some were
experiencing where upgrade all would stop towers from firing.
</li>
<li>2016-04-28: Hopefully addressed issue with upgrade all being slow. In my tests the new upgrade
all
will upgrade 60 level 1 kinetic towers to level 1095 in 200ms, as opposed to the ~50-100s it
would've taken before.
</li>
<li>2016-04-26: Mana Burst was erroneously granting a chance to increase mana pool at high levels of
mana. Now you must cast it at 1/3rd mana for this to occur, the chance scales from 5% at 1/3rd
mana to 100% at close to 0 mana. To compensate for this I have changed mana burst to grant its
additional damage when your mana pool is over 90% full instead of having to be at full mana. The
description has been updated to describe all of these changes.
</li>
<li>2016-04-26: You can no longer sell your last tower or template scrap your last tower.</li>
<li>2016-04-26: Refreshing will no longer grant old towers the benefits of Initial Engineering.</li>
<li>2016-04-26: Escape key will first cancel an action, but if there is no action selected it will
de-select any selected tower/enemy.
</li>
<li>2016-04-26: Removed text that tells the player to press shift to continue the same action, since
actions now repeat by default.
</li>
<li>2016-04-26: Fixed an issue where the blueprint action was allowed after prestige without the
appropriate skill.
</li>
<li>2016-04-25: Fixed issue where selling blocks returned more gold than they cost to buy.</li>
<li>2016-04-25: Fixed issue with prestige not reseting blueprint counts, causing towers to be
unaffordable.
</li>
<li>2016-04-16: Learning tower templates is now a one rank skill which unlocks the
blueprinting/templating action. This action scraps a tower in exchange for blueprint points of
that
tower type. Each blueprint point increases the starting damage of towers of that type by 1 and
gold
cost by 5.
</li>
<li>2016-04-16: There is now a new category of actions called... actions. Currently only tower
templates
uses this.
</li>
<li>2016-04-16: Added hover indicators with text for most actions (except spells), these indicators
also
show where its valid to perform an action.
</li>
<li>2016-03-31: Added Arcane Knowledge skill which gives another method to increase max mana outside
of
using mana burst.
</li>
<li>2016-03-29: The ban hammer had to be made slightly stronger. Saves will no longer respect insane
range or attack speed values, it will treat them as if you built a new tower instead.
</li>
<li>2016-03-27: Added a visual indicator for relative tower power per type.</li>
<li>2016-03-26: The ban hammer has arrived: Upgrading towers no longer reduces fire rate nor does it
increase range.
</li>
<li>2016-03-26: Help system now shows unread messages in the help button instead of popping up a
dialog
box each time a new topic is discovered.
</li>
<li>2016-03-23: Wrote a skills help file in the new system that explains the rank up that occurs
every
20 ranks of non-maxable skills.
</li>
<li>2016-03-23: Migrated the help popups to a new help system, the main difference is now you can go
back and read popups that had come up in the past by clicking the 'Help' button.
</li>
<li>2016-03-21: Skill descriptions now show the list of skills granted at certain ranks.</li>
<li>2016-03-21: Implemented Mana Regeneration (Advanced) which increases mana regeneration as a
percentage.
</li>
<li>2016-03-21: Actions now repeat automatically until canceled instead of requiring a modifier key.
</li>
<li>2016-03-21: Actions now clear the cursor if they would've created the same type of cursor (this
allows keybind double-tap to cancel).
</li>
<li>2016-03-20: The path no longer recalculates at the start of a wave.</li>
<li>2016-03-20: Unbound the 'a' key from upgrade all. It now requires a click.</li>
<li>2016-03-19: Upgrade using all gold now performs upgrades in batches (currently 20 a frame)
instead
of doing all of them at once which was causing freezing.
</li>
<li>2016-03-18: Fixed an issue where previously existing towers weren't being cleaned up on load.
</li>
<li>2016-03-18: Spell level now properly resets on prestige.</li>
<li>2016-03-18: Added the ability to go to a previous wave.</li>
<li>2016-03-18: Directly queueable skills now show the time they'll add to the queue before you
click on
it.
</li>
<li>2016-03-17: Fixed bug with prestige resets not clearing the skill display in the skill tree.
</li>
<li>2016-03-17: Reduced the base cost for magical affinity from 5 minutes to 2 minutes, to hopefully
encourage early interaction with spells.
</li>
<li>2016-03-17: The path (purple line) is only recalculated when a block crosses the current line or
when a new wave starts, this is to minimize the unnecessary path jumps.
</li>
<li>2016-03-16: While writing the instability tooltip I realized that the way instability currently
works there were some spells adding runse that would then do no damage on reaction because only
elemental towers added instability. Now all elemental damage adds a random portion to
instability.
</li>
<li>2016-03-16: Active tooltips are now hidden when the currently selected enemy disappears, this is
to
stop popups from persisting when a boss goes off the edge.
</li>
<li>2016-03-16: Instability now has a tooltip.</li>
<li>2016-03-16: Tentatively declaring the selecting-dead-enemy-bug vanquished.</li>
<li>2016-03-16: Added Wizardry skill, which increases arcane damage, to lead into things like the
mana
regen skill below.
</li>
<li>2016-03-16: Mana regeneration now shows as a tool tip on the mana bar.</li>
<li>2016-03-16: Mana regeneration has been changed from a static 0.001% of max mana (which became
overpowered at high mana) to start at 1 and be increased by the no-max skill called Mana
Regeneration.
</li>