Compare commits

..

90 Commits
v1.0.0 ... main

Author SHA1 Message Date
64ac63b5ef
bunch more features 2025-03-08 21:01:52 +01:00
185faa42e2 more balance 2025-03-08 21:01:26 +01:00
a3e8be3c18 balanced gems 2025-03-07 01:08:17 +01:00
aec0821dbb statistics 2025-03-06 22:09:59 +01:00
bdeb67e32e
many optimizations, nearing final release 2025-02-27 15:43:43 +01:00
547cccd071 more optimizations 2025-02-27 15:43:13 +01:00
4943c6ba7f spritesheets + more balanced 2025-02-26 15:13:48 +01:00
dd5da90521
Merge pull request #21 from koneko/spritesheet
creeps load as spritesheets now
2025-02-26 11:57:20 +01:00
d6f6e6cf8a creeps load as spritesheets now 2025-02-26 11:56:52 +01:00
07aa3da0b2 gems basic 2025-02-22 23:49:20 +01:00
ca8bf01c78
successfully implement all mechanics 2025-02-22 15:12:58 +01:00
32beb97557 implemented trapper tower 2025-02-22 15:12:17 +01:00
a632da412c strong and debuff tower basic implementation 2025-02-18 23:59:19 +01:00
1c3c9b287f fixed infinite recursion on electric tower 2025-02-18 22:51:59 +01:00
a33912d59d basic railgun 2025-02-18 21:42:40 +01:00
8267ade858
implemented more towers 2025-02-17 23:39:36 +01:00
abde1a6519 slightly more balanced 2025-02-17 23:38:53 +01:00
9d998a45e1 electric tower chains properly 2025-02-17 11:49:44 +01:00
f84108847b implement electric tower and buff tower 2025-02-16 23:15:46 +01:00
9c053ece61 add more towers, change some things 2025-02-12 23:37:51 +01:00
4d98b82f3a push what i have 2025-02-10 23:27:23 +01:00
5b18dd601a
improvement 2025-02-10 20:06:18 +01:00
e5f665a57b dont know what to say 2025-02-10 20:05:40 +01:00
Dalibor Čarapić
00c378374f Nice menu background added 2025-02-10 18:10:02 +01:00
Dalibor Čarapić
a4c90028a9 Pause on window focus loss 2025-02-10 17:28:46 +01:00
Dalibor Čarapić
1d7b4070f6 Implementing fast-forward 2025-02-10 17:20:32 +01:00
Dalibor Čarapić
5e8b91ed81 Implementing fast-forward 2025-02-10 17:10:15 +01:00
Dalibor Čarapić
f1148e1d07 Pause menu 2025-02-10 16:50:26 +01:00
ea2d3b41b2 aabb 2025-02-10 16:39:05 +01:00
f4df06d44f line count 2025-02-09 23:04:59 +01:00
07db180b5d basic pausing 2025-02-09 22:52:10 +01:00
52c67d9b1c add tutorial 2025-02-09 00:45:25 +01:00
343d66597c
Merge pull request #17 from koneko/main
align
2025-02-08 18:30:47 +01:00
1f62c8fdf0
Add more missions, add score screen, improve creeps 2025-02-08 18:29:12 +01:00
2fcca0f21c add resistances, needs more balance 2025-02-08 18:28:15 +01:00
18fe4d7c20 add more content 2025-02-08 01:50:57 +01:00
5b82a24452 update maps 2025-02-07 21:43:42 +01:00
7f27f3aef7 working 2025-02-07 19:51:51 +01:00
8b0a65a205 i have no words 2025-02-07 18:40:37 +01:00
Dalibor Čarapić
d573b34731 Working on missions 2025-02-07 13:39:59 +01:00
Dalibor Čarapić
465b420461 Working on missions 2025-02-07 11:44:41 +01:00
Dalibor Čarapić
93da72f55c Working on end-game menu 2025-02-06 19:51:11 +01:00
Dalibor Čarapić
2e1c73c9dc Working on end-game menu 2025-02-06 18:20:00 +01:00
Dalibor Čarapić
f6879046fa Working on end-game menu 2025-02-05 22:33:32 +01:00
Dalibor Čarapić
13f4c4610e Working on end-game menu 2025-02-05 21:43:16 +01:00
92f196310d
add selling and upgrading gems 2025-02-04 23:43:46 +01:00
5afd58bd67 todos 2025-02-04 23:43:15 +01:00
b819bb8719 add gem selling and leveling 2025-02-04 23:42:47 +01:00
cec7dbb493 initial gem sell and upg 2025-02-04 22:48:51 +01:00
8f5b4c2f90
Add more gems, add basic functionality 2025-02-04 12:50:49 +01:00
bfc73d436f add more gems, next is to add functionality to gems, also need to add way to upgrade gems 2025-02-04 12:50:02 +01:00
9847b8e47d main mechanic minimally implemented 2025-02-04 12:06:28 +01:00
c45d2af796
add drag and drop to gems and number gems 2025-02-03 00:53:29 +01:00
b99c3979cf fix bug 2025-02-03 00:53:06 +01:00
9cdf02823b add drag and drop to slot gems 2025-02-03 00:50:01 +01:00
b3a36b1f35
add gem slots for testing and user feedback 2025-02-02 22:41:27 +01:00
96454a0df0 add more visual feedback to slotting gems 2025-02-02 22:35:26 +01:00
5ecec28870 propely implement slotting and unslotting gems 2025-02-01 22:22:41 +01:00
d3988447a6 add more visual feedback for inventory 2025-01-27 23:42:01 +01:00
5adab98902 seperate events into seperate file 2025-01-27 17:33:26 +01:00
d12d1e1d3c gems are properly awarded, just need to show to the player 2025-01-26 23:16:05 +01:00
5ea6017547 get gems when finishing rounds 2025-01-26 22:26:29 +01:00
2f3bb621c7 i have to think more about it 2025-01-22 13:10:58 +01:00
c57e84633b add gems to gameassets 2025-01-22 12:38:58 +01:00
2647d8cfd2 begin inventory + gems 2025-01-21 13:32:57 +01:00
70218e5425 tower panel begin 2025-01-21 01:09:29 +01:00
132554f100
Add tooltips + icons 2025-01-18 23:49:03 +01:00
56137fa3c0 tooltips final 2025-01-18 23:48:21 +01:00
0f1c32e868 tooltip initial thoughts 2025-01-18 22:07:11 +01:00
d75ea2427c render range preview above cells 2025-01-18 14:01:18 +01:00
55214a67ec
Merge pull request #10 from koneko/dev
pick tower while choosing another
2025-01-17 22:37:05 +01:00
a9f083a81e pick tower while choosing another 2025-01-17 22:25:26 +01:00
e8eb9990dc
better tower functionality
Dev
2025-01-17 21:49:53 +01:00
36a9cacb1c add another "tower", totally not a reskin :) 2025-01-17 21:49:20 +01:00
14ea0a9b23 preview tower on field 2025-01-17 20:56:25 +01:00
f3fdb9f0ae
Merge pull request #8 from koneko/dev
load everything at once
2025-01-17 15:28:52 +01:00
dfd6593c89 load everything at once 2025-01-17 15:28:02 +01:00
bba1f12383
Improve load times
optimize assets
2025-01-17 15:13:39 +01:00
f15ff922cb optimize assets 2025-01-17 15:13:11 +01:00
b372ab8233
Massive progress, id say from 50% to 65% done!
this is great, only gems, their properties and tower interactions and game is effectively done! im very happy!
2025-01-17 00:32:22 +01:00
4a81e7cc18 update todo to reflect work 2025-01-17 00:31:17 +01:00
64795b1ebf add proper asset loading and use for towers + projectiles (also projectile animation) + add health bars 2025-01-17 00:29:51 +01:00
c8bf247104 add 2 other creeps, messing with balance 2025-01-16 21:40:21 +01:00
1da4ef4867
animate creeps, better asset management
Dev
2025-01-16 19:57:44 +01:00
c300abbb66 animate creeps, add better asset management 2025-01-16 19:57:04 +01:00
5bec27c545 Add more assets for consideration 2025-01-13 23:40:27 +01:00
b214b40e63
Fix issues
work
2025-01-13 15:22:22 +01:00
64a5bf35ab work 2025-01-13 15:21:42 +01:00
1bb42c4bf7 avoid using magic numbers 2025-01-12 12:54:43 +01:00
8e0fc77469 add todos 2025-01-12 01:42:46 +01:00
174 changed files with 6947 additions and 635 deletions

View File

@ -12,3 +12,7 @@ The [design document](/docs/design.md) contains the starting idea which was init
## Todos
Todos are available [here](/docs/todos.md) which contain self-made tasks which should get done or are already done.
## Extra documentation
Extra documentation is available [here](/docs)

5
docs/assets.md Normal file
View File

@ -0,0 +1,5 @@
# Assets
List of assets used in the project, all purchased.
https://assetstore.unity.com/packages/2d/gui/icons/gui-megapack-101517
https://magory.itch.io/ultimate-gem-collections

24
docs/content.md Normal file
View File

@ -0,0 +1,24 @@
# How to add new content to the game
A small guide so other people also understand how to add content.
## Tower
1. Update Towers.json by adding to the end of the array.
2. Update TowerType in Defintions.ts
3. Based of the Tower.sprite value, add projectile folder with appropriate projectiles as .png.
4. Based of the Tower.sprite value, add the tower sprite into towers folder as a .png.
5. Add appropriate behaviour in Tower.ts (if statement in update).
6. Add way to spawn via TowerTab.ts button.
## Creep
1. Update Creeps.json by adding to the end of the array.
2. Update CreepType in Defintions.ts
3. Based of the Creep.name value, add creep's walking animations to the same named subfolder in creeps folder.
4. When using creeps in waves, reference them by their index in the CreepType enum.
## Gem
1. Update Gems.json by adding to the end of the array.
2. Update GemType in Defintions.ts and make sure Gem.type is CaSe sensitively the same.

44
docs/linecount.md Normal file
View File

@ -0,0 +1,44 @@
Generated by: `find ./src -name '*.ts' | xargs wc -l`
92 ./src/main.ts
1 ./src/vite-env.d.ts
17 ./src/classes/GameUIConstants.ts
217 ./src/classes/gui/TowerTab.ts
375 ./src/classes/gui/TowerPanel.ts
52 ./src/classes/gui/TextInput.ts
211 ./src/classes/gui/ModalDialog.ts
51 ./src/classes/gui/Sidebar.ts
122 ./src/classes/gui/HighScoreDialog.ts
70 ./src/classes/gui/Button.ts
60 ./src/classes/gui/Gemsmith.ts
154 ./src/classes/gui/EndGameDialog.ts
220 ./src/classes/gui/GemTab.ts
59 ./src/classes/gui/GamePausedDialog.ts
36 ./src/classes/gui/MessageBox.ts
205 ./src/classes/gui/Tooltip.ts
133 ./src/classes/Definitions.ts
77 ./src/classes/game/WaveManager.ts
264 ./src/classes/game/Grid.ts
51 ./src/classes/game/Gem.ts
324 ./src/classes/game/TowerBehaviours.ts
192 ./src/classes/game/Tower.ts
180 ./src/classes/game/MissionStats.ts
100 ./src/classes/game/AnimationManager.ts
239 ./src/classes/game/Creep.ts
47 ./src/classes/game/KeyboardManager.ts
251 ./src/classes/game/Projectile.ts
86 ./src/classes/game/NotificationManager.ts
40 ./src/classes/game/DebrisManager.ts
135 ./src/classes/game/TowerManager.ts
71 ./src/classes/game/HighScoreManager.ts
76 ./src/classes/GuiObject.ts
209 ./src/classes/Assets.ts
52 ./src/classes/GameObject.ts
71 ./src/classes/Bastion.ts
31 ./src/classes/Events.ts
37 ./src/scenes/Scene.ts
17 ./src/scenes/Settings.ts
67 ./src/scenes/HowToPlay.ts
59 ./src/scenes/Main.ts
352 ./src/scenes/Game.ts
27 ./src/scenes/MissionPicker.ts
`5130 total`

View File

@ -2,4 +2,31 @@
List of things to implement following the "release" of the minimum viable product (simple browser tower defense game).
## WILL WRITE AFTER MVP IS DONE.
## Creeps
- [x] Elemental resistances/attunement
- [x] Proper animation via PNG sequence
- [x] More variety in Creeps
- [x] Health bar
## Towers
- [x] Extend projectile into seperate defintion + json file
- [x] Make tower react with slotted gems
- [x] Alter damage based on attunement from slotted gems
- [x] Tower info on click
- [x] Animate projectiles
- [x] Better mouseover tracking when placing tower and showing radius
- [x] Sell tower button
## Gems
- [x] Create Gem definitions
- [x] Make gems affect towers
## Other
- [ ] Add sound effects
- [x] Tutorial image/mission
- [x] Pause menu
- [x] Score screen when winning/losing map

View File

@ -2,11 +2,21 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<link href="https://fonts.googleapis.com/css?family=Aclonica" rel="stylesheet" />
<title>Bastion App</title>
<title>Bastion: The Watchers Lament</title>
<meta property="og:title" content="Bastion: The Watchers Lament" />
<meta
property="og:description"
content="A free, open source, browser based, tower defense game inspired by GemCraft: Frostborn Wrath. Playable NOW on PC!"
/>
<meta property="og:image" content="https://bastion.overflow.fun/favicon.png" />
<meta property="og:url" content="https://bastion.overflow.fun" />
<meta name="twitter:title" content="Bastion: The Watchers Lament" />
<meta
name="twitter:description"
content="A free, open source, browser based, tower defense game inspired by GemCraft: Frostborn Wrath. Playable NOW on PC!"
/>
</head>
<body>
<script type="module" src="/src/main.ts"></script>

584
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "bastion",
"version": "0.0.0",
"dependencies": {
"pixi-spine": "^4.0.4",
"pixi-viewport": "^6.0.3",
"pixi.js": "^8.4.0"
},
@ -407,12 +408,268 @@
"node": ">=12"
}
},
"node_modules/@pixi-spine/base": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@pixi-spine/base/-/base-4.0.3.tgz",
"integrity": "sha512-0bunaWebaDswLFtYZ6whV+ZvgLQ7oANcvbPmIOoVpS/1pOY3Y/GAnWOFbgp3qt9Q/ntLYqNjGve6xq0IqpsTAA==",
"peerDependencies": {
"@pixi/core": "^7.0.0",
"@pixi/display": "^7.0.0",
"@pixi/graphics": "^7.0.0",
"@pixi/mesh": "^7.0.0",
"@pixi/mesh-extras": "^7.0.0",
"@pixi/sprite": "^7.0.0"
}
},
"node_modules/@pixi-spine/loader-base": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@pixi-spine/loader-base/-/loader-base-4.0.4.tgz",
"integrity": "sha512-Grgu+PxiUpgYWpuMRr3h5jrN3ZTnwyXfu3HuYdFb6mbJTTMub4xBPALeui+O+tw0k9RNRAr99pUzu9Rc9XTbAw==",
"peerDependencies": {
"@pixi-spine/base": "^4.0.0",
"@pixi/assets": " ^7.0.0",
"@pixi/core": "^7.0.0"
}
},
"node_modules/@pixi-spine/loader-uni": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@pixi-spine/loader-uni/-/loader-uni-4.0.3.tgz",
"integrity": "sha512-tfhTJrnuog8ObKbbiSG1wV/nIUc3O98WfwS6lCmewaupoMIKF0ujg21MCqXUXJvljQJzU9tbURI+DWu4w9dnnA==",
"peerDependencies": {
"@pixi-spine/base": "^4.0.0",
"@pixi-spine/loader-base": "^4.0.0",
"@pixi-spine/runtime-3.7": "^4.0.0",
"@pixi-spine/runtime-3.8": "^4.0.0",
"@pixi-spine/runtime-4.1": "^4.0.0",
"@pixi/assets": " ^7.0.0",
"@pixi/core": "^7.0.0",
"@pixi/display": "^7.0.0",
"@pixi/graphics": "^7.0.0",
"@pixi/mesh": "^7.0.0",
"@pixi/mesh-extras": "^7.0.0",
"@pixi/sprite": "^7.0.0"
}
},
"node_modules/@pixi-spine/runtime-3.7": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@pixi-spine/runtime-3.7/-/runtime-3.7-4.0.3.tgz",
"integrity": "sha512-zuopKtSqjRc37wjW5xJ64j9DbiBB7rkPMFeldeWBPCbfZiCcFcwSZwZnrcgC+f4HIGo0NeviAvJGM8Hcf3AyeA==",
"license": "SEE SPINE-LICENSE",
"peerDependencies": {
"@pixi-spine/base": "^4.0.0",
"@pixi/core": "^7.0.0"
}
},
"node_modules/@pixi-spine/runtime-3.8": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@pixi-spine/runtime-3.8/-/runtime-3.8-4.0.3.tgz",
"integrity": "sha512-lIhb4jOTon+FVYLO9AIgcB6jf9hC+RLEn8PesaDRibDocQ1htVCkEIhCIU3Mc00fuqIby7lMBsINeS/Th0q3bw==",
"license": "SEE SPINE-LICENSE",
"peerDependencies": {
"@pixi-spine/base": "^4.0.0",
"@pixi/core": "^7.0.0"
}
},
"node_modules/@pixi-spine/runtime-4.0": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@pixi-spine/runtime-4.0/-/runtime-4.0-4.0.3.tgz",
"integrity": "sha512-2Y8qhxRkg/yH/9VylGsRVAd5W+dXVPhHTjFk0RR9wEUzTCkdZ17pE+56s2nESi2X3sYNKkz8FowfaqIvXnVGxw==",
"license": "SEE SPINE-LICENSE",
"peerDependencies": {
"@pixi-spine/base": "^4.0.0",
"@pixi/core": "^7.0.0"
}
},
"node_modules/@pixi-spine/runtime-4.1": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@pixi-spine/runtime-4.1/-/runtime-4.1-4.0.3.tgz",
"integrity": "sha512-jK433snCQMC4FUPiDgyIcxhiatvRNSxqgs0CgHjjQ0l8GlY6gPpkkdThQ6GsFNme1SUZ4uvnWwawXFIGjW1IpQ==",
"license": "SEE SPINE-LICENSE",
"peerDependencies": {
"@pixi-spine/base": "^4.0.0",
"@pixi/core": "^7.0.0"
}
},
"node_modules/@pixi/assets": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.4.2.tgz",
"integrity": "sha512-anxho59H9egZwoaEdM5aLvYyxoz6NCy3CaQIvNHD1bbGg8L16Ih0e26QSBR5fu53jl8OjT6M7s+p6n7uu4+fGA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/css-font-loading-module": "^0.0.12"
},
"peerDependencies": {
"@pixi/core": "7.4.2"
}
},
"node_modules/@pixi/color": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.4.2.tgz",
"integrity": "sha512-av1LOvhHsiaW8+T4n/FgnOKHby55/w7VcA1HzPIHRBtEcsmxvSCDanT1HU2LslNhrxLPzyVx18nlmalOyt5OBg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@pixi/colord": "^2.9.6"
}
},
"node_modules/@pixi/colord": {
"version": "2.9.6",
"resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz",
"integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==",
"license": "MIT"
},
"node_modules/@pixi/constants": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.4.2.tgz",
"integrity": "sha512-N9vn6Wpz5WIQg7ugUg2+SdqD2u2+NM0QthE8YzLJ4tLH2Iz+/TrnPKUJzeyIqbg3sxJG5ZpGGPiacqIBpy1KyA==",
"license": "MIT",
"peer": true
},
"node_modules/@pixi/core": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.4.2.tgz",
"integrity": "sha512-UbMtgSEnyCOFPzbE6ThB9qopXxbZ5GCof2ArB4FXOC5Xi/83MOIIYg5kf5M8689C5HJMhg2SrJu3xLKppF+CMg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@pixi/color": "7.4.2",
"@pixi/constants": "7.4.2",
"@pixi/extensions": "7.4.2",
"@pixi/math": "7.4.2",
"@pixi/runner": "7.4.2",
"@pixi/settings": "7.4.2",
"@pixi/ticker": "7.4.2",
"@pixi/utils": "7.4.2"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/pixijs"
}
},
"node_modules/@pixi/display": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.4.2.tgz",
"integrity": "sha512-DaD0J7gIlNlzO0Fdlby/0OH+tB5LtCY6rgFeCBKVDnzmn8wKW3zYZRenWBSFJ0Psx6vLqXYkSIM/rcokaKviIw==",
"license": "MIT",
"peer": true,
"peerDependencies": {
"@pixi/core": "7.4.2"
}
},
"node_modules/@pixi/extensions": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.4.2.tgz",
"integrity": "sha512-Hmx2+O0yZ8XIvgomHM9GZEGcy9S9Dd8flmtOK5Aa3fXs/8v7xD08+ANQpN9ZqWU2Xs+C6UBlpqlt2BWALvKKKA==",
"license": "MIT",
"peer": true
},
"node_modules/@pixi/graphics": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.4.2.tgz",
"integrity": "sha512-jH4/Tum2RqWzHGzvlwEr7HIVduoLO57Ze705N2zQPkUD57TInn5911aGUeoua7f/wK8cTLGzgB9BzSo2kTdcHw==",
"license": "MIT",
"peer": true,
"peerDependencies": {
"@pixi/core": "7.4.2",
"@pixi/display": "7.4.2",
"@pixi/sprite": "7.4.2"
}
},
"node_modules/@pixi/math": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.4.2.tgz",
"integrity": "sha512-7jHmCQoYk6e0rfSKjdNFOPl0wCcdgoraxgteXJTTHv3r0bMNx2pHD9FJ0VvocEUG7XHfj55O3+u7yItOAx0JaQ==",
"license": "MIT",
"peer": true
},
"node_modules/@pixi/mesh": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.4.2.tgz",
"integrity": "sha512-mEkKyQvvMrYXC3pahvH5WBIKtrtB63WixRr91ANFI7zXD+ESG6Ap6XtxMCJmXDQPwBDNk7SWVMiCflYuchG7kA==",
"license": "MIT",
"peer": true,
"peerDependencies": {
"@pixi/core": "7.4.2",
"@pixi/display": "7.4.2"
}
},
"node_modules/@pixi/mesh-extras": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.4.2.tgz",
"integrity": "sha512-vNR/7wjxjs7sv9fGoKkHyU91ZAD+7EnMHBS5F3CVISlOIFxLi96NNZCB81oUIdky/90pHw40johd/4izR5zTyw==",
"license": "MIT",
"peer": true,
"peerDependencies": {
"@pixi/core": "7.4.2",
"@pixi/mesh": "7.4.2"
}
},
"node_modules/@pixi/runner": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.4.2.tgz",
"integrity": "sha512-LPBpwym4vdyyDY5ucF4INQccaGyxztERyLTY1YN6aqJyyMmnc7iqXlIKt+a0euMBtNoLoxy6MWMvIuZj0JfFPA==",
"license": "MIT",
"peer": true
},
"node_modules/@pixi/settings": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.4.2.tgz",
"integrity": "sha512-pMN+L6aWgvUbwhFIL/BTHKe2ShYGPZ8h9wlVBnFHMtUcJcFLMF1B3lzuvCayZRepOphs6RY0TqvnDvVb585JhQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@pixi/constants": "7.4.2",
"@types/css-font-loading-module": "^0.0.12",
"ismobilejs": "^1.1.0"
}
},
"node_modules/@pixi/sprite": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.4.2.tgz",
"integrity": "sha512-Ccf/OVQsB+HQV0Fyf5lwD+jk1jeU7uSIqEjbxenNNssmEdB7S5qlkTBV2EJTHT83+T6Z9OMOHsreJZerydpjeg==",
"license": "MIT",
"peer": true,
"peerDependencies": {
"@pixi/core": "7.4.2",
"@pixi/display": "7.4.2"
}
},
"node_modules/@pixi/ticker": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.4.2.tgz",
"integrity": "sha512-cAvxCh/KI6IW4m3tp2b+GQIf+DoSj9NNmPJmsOeEJ7LzvruG8Ps7SKI6CdjQob5WbceL1apBTDbqZ/f77hFDiQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@pixi/extensions": "7.4.2",
"@pixi/settings": "7.4.2",
"@pixi/utils": "7.4.2"
}
},
"node_modules/@pixi/utils": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.4.2.tgz",
"integrity": "sha512-aU/itcyMC4TxFbmdngmak6ey4kC5c16Y5ntIYob9QnjNAfD/7GTsYIBnP6FqEAyO1eq0MjkAALxdONuay1BG3g==",
"license": "MIT",
"peer": true,
"dependencies": {
"@pixi/color": "7.4.2",
"@pixi/constants": "7.4.2",
"@pixi/settings": "7.4.2",
"@types/earcut": "^2.1.0",
"earcut": "^2.2.4",
"eventemitter3": "^4.0.0",
"url": "^0.11.0"
}
},
"node_modules/@pixi/utils/node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"license": "MIT",
"peer": true
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.21.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz",
@ -671,12 +928,91 @@
"node": ">=10.0.0"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
"integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
"license": "MIT",
"peer": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/call-bound": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
"integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
"license": "MIT",
"peer": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"peer": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/earcut": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
"integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==",
"license": "ISC"
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"peer": true,
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/esbuild": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
@ -737,12 +1073,110 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"peer": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
"integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
"license": "MIT",
"peer": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0",
"function-bind": "^1.1.2",
"get-proto": "^1.0.0",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"peer": true,
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/ismobilejs": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
"integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==",
"license": "MIT"
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
@ -762,6 +1196,19 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/object-inspect": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/parse-svg-path": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz",
@ -775,6 +1222,30 @@
"dev": true,
"license": "ISC"
},
"node_modules/pixi-spine": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/pixi-spine/-/pixi-spine-4.0.4.tgz",
"integrity": "sha512-XRq1yARVoi4av7RXnd9+P37SWI9+e4/f5yTScZPJGB+sY5VcRYN6BYkBQ+y8nUKI1aJIjlms9z+pGxqikm+eFQ==",
"license": "SEE SPINE-LICENSE",
"dependencies": {
"@pixi-spine/base": "^4.0.3",
"@pixi-spine/loader-base": "^4.0.4",
"@pixi-spine/loader-uni": "^4.0.3",
"@pixi-spine/runtime-3.7": "^4.0.3",
"@pixi-spine/runtime-3.8": "^4.0.3",
"@pixi-spine/runtime-4.0": "^4.0.3",
"@pixi-spine/runtime-4.1": "^4.0.3"
},
"peerDependencies": {
"@pixi/assets": "^7.0.0",
"@pixi/core": "^7.0.0",
"@pixi/display": "^7.0.0",
"@pixi/graphics": "^7.0.0",
"@pixi/mesh": "^7.0.0",
"@pixi/mesh-extras": "^7.0.0",
"@pixi/sprite": "^7.0.0"
}
},
"node_modules/pixi-viewport": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/pixi-viewport/-/pixi-viewport-6.0.3.tgz",
@ -830,6 +1301,29 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
"license": "MIT",
"peer": true
},
"node_modules/qs": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
"license": "BSD-3-Clause",
"peer": true,
"dependencies": {
"side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/rollup": {
"version": "4.21.3",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz",
@ -866,6 +1360,82 @@
"fsevents": "~2.3.2"
}
},
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"license": "MIT",
"peer": true,
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3",
"side-channel-list": "^1.0.0",
"side-channel-map": "^1.0.1",
"side-channel-weakmap": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-list": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"license": "MIT",
"peer": true,
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"license": "MIT",
"peer": true,
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-weakmap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"license": "MIT",
"peer": true,
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3",
"side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@ -890,6 +1460,20 @@
"node": ">=14.17"
}
},
"node_modules/url": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
"integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
"license": "MIT",
"peer": true,
"dependencies": {
"punycode": "^1.4.1",
"qs": "^6.12.3"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/vite": {
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz",

View File

@ -4,7 +4,7 @@
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"dev": "vite --host",
"build": "tsc && vite build",
"preview": "vite preview"
},
@ -13,6 +13,7 @@
"vite": "^5.4.1"
},
"dependencies": {
"pixi-spine": "^4.0.4",
"pixi-viewport": "^6.0.3",
"pixi.js": "^8.4.0"
}

BIN
public/TiledTDThree64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.10" tiledversion="1.11.0" name="TiledTDThree64" tilewidth="64" tileheight="64" tilecount="140" columns="14">
<image source="../../../../dumping/tiles/TiledTDThree64.png" width="896" height="640"/>
<image source="./TiledTDThree64.png" width="896" height="640"/>
</tileset>

View File

@ -1,14 +0,0 @@
[
{
"health": 2,
"speed": 0.04,
"special": null,
"resistance": {
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
}
]

View File

@ -1,15 +0,0 @@
[
{
"name": "Basic Tower",
"behaviour": "BasicTowerBehaviour",
"sprite": "basic_tower",
"description": "The building block of society, nothing more basic exists.",
"stats": {
"damage": 2,
"cooldown": 60,
"gemSlotsAmount": 2,
"cost": 100,
"range": 3
}
}
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@ -0,0 +1,20 @@
const fs = require('fs');
const { exec, execSync } = require('child_process');
let dir = fs.readdirSync('.');
// dir.forEach((item) => {
// const itemPath = `./${item}`;
// if (fs.lstatSync(itemPath).isDirectory()) {
// let subDir = fs.readdirSync(itemPath);
// subDir.forEach(async (subItem) => {
// const subItemPath = `${itemPath}/${subItem}`;
// if (fs.lstatSync(subItemPath).isFile() && subItem.endsWith('.png')) {
// const outputFilePath = `${itemPath}/${subItem.replace('.png', 's.png')}`;
// await execSync(`convert -resize 128x128 -quality 80 ${subItemPath} ${outputFilePath}`);
// fs.unlinkSync(subItemPath);
// fs.renameSync(outputFilePath, subItemPath);
// }
// });
// }
// });
// Disabled for now, dont need to optimize assets.

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

BIN
public/assets/gui/frame_03.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
public/assets/gui/frame_04.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/assets/gui/frame_05.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
public/assets/gui/frame_blue.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
public/assets/gui/frame_inv.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
public/assets/gui/icons/cross.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/assets/gui/icons/home.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
public/assets/gui/icons/pause.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
public/assets/gui/icons/play.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
public/assets/gui/icons/plus.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
public/assets/gui/icons/skull.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
public/assets/gui/note.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 851 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

BIN
public/assets/gui/title01.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,174 @@
[
{
"name": "basic",
"sprite": "wood",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 12,
"stats": {
"health": 2,
"speed": 3,
"special": null,
"resistance": {
"physical": 0.05,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
}
},
{
"name": "quick",
"sprite": "zombie",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 8,
"stats": {
"health": 1,
"speed": 5,
"special": null,
"resistance": {
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
}
},
{
"name": "tank",
"sprite": "skeleton",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 12,
"stats": {
"health": 5,
"speed": 2,
"special": null,
"resistance": {
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
}
},
{
"name": "cloaker",
"sprite": "hood",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 12,
"stats": {
"health": 7,
"speed": 3,
"special": null,
"resistance": {
"physical": 0,
"divine": 1,
"fire": 1,
"ice": 1,
"frostfire": 1
}
}
},
{
"name": "demon",
"sprite": "demon",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 8,
"stats": {
"health": 5,
"speed": 3,
"special": null,
"resistance": {
"physical": 1,
"divine": -0.25,
"fire": 1,
"ice": 1,
"frostfire": 1
}
}
},
{
"name": "maker",
"sprite": "pumpkin",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 11,
"stats": {
"health": 5,
"speed": 3,
"special": null,
"resistance": {
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
}
},
{
"name": "monster",
"sprite": "green",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 12,
"stats": {
"health": 30,
"speed": 1,
"special": null,
"resistance": {
"physical": 0.05,
"divine": 0.05,
"fire": -0.25,
"ice": 0.05,
"frostfire": 0.05
}
}
},
{
"name": "remaker",
"sprite": "orange",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 12,
"stats": {
"health": 2,
"speed": 3,
"special": null,
"resistance": {
"physical": 0.05,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
}
},
{
"name": "elite",
"sprite": "phood",
"tint": "0xffffff",
"textures": [],
"textureArrayLength": 12,
"stats": {
"health": 2,
"speed": 3,
"special": null,
"resistance": {
"physical": 0.05,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
}
}
]

View File

@ -0,0 +1,601 @@
[
{
"name": "Fire Gem",
"description": "Forged from molten lava, the Fire Gem imbues your tower's attacks and add extra fire damage. Well researched and common.",
"color": "red",
"type": "Fire",
"totalLevels": 9,
"textures": [],
"cantCombineWith": [],
"specialCombine": [],
"initialGemValue": 75,
"genericImprovements": [
{
"damageUp": 1,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 100
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 150
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 2,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 250
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 400
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 650
},
{
"damageUp": 2,
"attackSpeedUp": 100,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 750
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 900
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 1000
},
{
"damageUp": 2,
"attackSpeedUp": 250,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 1200
}
],
"gemResistanceModifications": [
{
"physical": 0,
"divine": 0,
"fire": 0.05,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.1,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.15,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.2,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.25,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.3,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.35,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.4,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0.45,
"ice": 0,
"frostfire": 0
}
]
},
{
"name": "Yeti Gem",
"description": "Crafted from the essence of the frozen bears, the Yeti Gem enhances your tower's attacks with the chilling power of ice. It gives ice damage and is known for its rarity.",
"color": "#32e4fc",
"type": "Yeti",
"totalLevels": 8,
"textures": [],
"cantCombineWith": [],
"specialCombine": [],
"initialGemValue": 80,
"genericImprovements": [
{
"damageUp": 1,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 100
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 150
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 2,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 250
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 400
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 650
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 750
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 900
},
{
"damageUp": 2,
"attackSpeedUp": 100,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 1000
}
],
"gemResistanceModifications": [
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.05,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.1,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.15,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.2,
"frostfire": 0
},
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.25,
"frostfire": 0.1
},
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.3,
"frostfire": 0.1
},
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.35,
"frostfire": 0.2
},
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0.4,
"frostfire": 0.25
}
]
},
{
"name": "Titalium Gem",
"description": "Created from distilled creep eyes, the Titalium gem is known for boosting tower range, at the sacrifice for other stats.",
"color": "pink",
"type": "Titalium",
"totalLevels": 7,
"textures": [],
"cantCombineWith": [],
"specialCombine": [],
"initialGemValue": 100,
"genericImprovements": [
{
"damageUp": 1,
"attackSpeedUp": 0,
"rangeUp": 1,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 200
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 1,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 350
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 1,
"timeToLiveUp": 0,
"pierceUp": 2,
"gemValueUp": 450
},
{
"damageUp": 2,
"attackSpeedUp": 200,
"rangeUp": 1,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 600
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 1,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 850
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 900
},
{
"damageUp": 2,
"attackSpeedUp": 0,
"rangeUp": 2,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 900
}
],
"gemResistanceModifications": [
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0.05,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0.1,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0.1,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0.15,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0.2,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0.25,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0.3,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
]
},
{
"name": "Soulforge Gem",
"description": "Made from the wandering souls of the damned, the Soulforge gem accelerates your towers cooldowns and acts as a repellant for all things unholy.",
"color": "gray",
"type": "Soulforge",
"totalLevels": 7,
"textures": [],
"cantCombineWith": [],
"specialCombine": [],
"initialGemValue": 150,
"genericImprovements": [
{
"damageUp": 0,
"attackSpeedUp": 100,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 200
},
{
"damageUp": 0,
"attackSpeedUp": 100,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 350
},
{
"damageUp": 0,
"attackSpeedUp": 150,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 450
},
{
"damageUp": 0,
"attackSpeedUp": 100,
"rangeUp": 1,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 600
},
{
"damageUp": 0,
"attackSpeedUp": 250,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 1,
"gemValueUp": 850
},
{
"damageUp": 0,
"attackSpeedUp": 400,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 900
},
{
"damageUp": 0,
"attackSpeedUp": 500,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 900
}
],
"gemResistanceModifications": [
{
"physical": 0,
"divine": 0.2,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0.3,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0.4,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0.5,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0.6,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0.7,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0.75,
"fire": 0,
"ice": 0,
"frostfire": 0
},
{
"physical": 0,
"divine": 0.8,
"fire": 0,
"ice": 0,
"frostfire": 0
}
]
},
{
"name": "Golden Gem",
"description": "An inherently useless gem, providing no tower buffs, but high in monetary value. Highly sought after by all rich people.",
"color": "gold",
"type": "Gold",
"totalLevels": 1,
"textures": [],
"cantCombineWith": [],
"specialCombine": [],
"initialGemValue": 250,
"genericImprovements": [
{
"damageUp": 0,
"attackSpeedUp": 0,
"rangeUp": 0,
"timeToLiveUp": 0,
"pierceUp": 0,
"gemValueUp": 0
}
],
"gemResistanceModifications": [
{
"physical": 0,
"divine": 0,
"fire": 0,
"ice": 0,
"frostfire": 0
}
]
},
{
"name": "Artifact",
"description": "An insanely rare gem of unknown origin, packed with power. No one knows how it works, yet your towers oddly resonate stronger with it.",
"color": "blue",
"type": "Artifact",
"totalLevels": 1,
"textures": [],
"cantCombineWith": [],
"specialCombine": [],
"initialGemValue": 1000,
"genericImprovements": [
{
"damageUp": 10,
"attackSpeedUp": 100,
"rangeUp": 2,
"timeToLiveUp": 200,
"pierceUp": 3,
"gemValueUp": 0
}
],
"gemResistanceModifications": [
{
"physical": 0.25,
"divine": 0.25,
"fire": 0.25,
"ice": 0.25,
"frostfire": 0.25
}
]
}
]

View File

@ -0,0 +1,154 @@
[
{
"name": "Basic Tower",
"behaviour": "BasicTowerBehaviour",
"sprite": "basic_tower",
"texture": null,
"projectile": "white",
"projectileTextures": [],
"projectileTexturesArrayLength": 5,
"description": "The building block of society, nothing more basic exists.",
"stats": {
"damage": 1,
"cooldown": 1500,
"gemSlotsAmount": 1,
"cost": 25,
"range": 3,
"timeToLive": 20,
"pierce": 1
}
},
{
"name": "Circle Tower",
"behaviour": "CircleTowerBehaviour",
"sprite": "circle_tower",
"texture": null,
"projectile": "blue",
"projectileTextures": [],
"projectileTexturesArrayLength": 4,
"description": "Shoots 8 projectiles in a circle, they may miss.",
"stats": {
"damage": 1,
"cooldown": 2000,
"gemSlotsAmount": 2,
"cost": 55,
"range": 3,
"timeToLive": 18,
"pierce": 5
}
},
{
"name": "Electric Tower",
"behaviour": "ElectricTowerBehaviour",
"sprite": "electric_tower",
"texture": null,
"projectile": "yellow",
"projectileTextures": [],
"projectileTexturesArrayLength": 4,
"description": "Zap zap zap! This towers shots connect to other enemies!",
"stats": {
"damage": 2,
"cooldown": 3500,
"gemSlotsAmount": 2,
"cost": 110,
"range": 3,
"timeToLive": 12,
"pierce": 1
}
},
{
"name": "Buff Tower",
"behaviour": "BuffTowerBehaviour",
"sprite": "buff_tower",
"texture": null,
"projectile": "blue",
"projectileTextures": [],
"projectileTexturesArrayLength": 4,
"description": "Doesn't shoot, instead buffs other towers with some of its power.",
"stats": {
"damage": 3,
"cooldown": 1000,
"gemSlotsAmount": 3,
"cost": 200,
"range": 2.5,
"timeToLive": 15,
"pierce": 5
}
},
{
"name": "Strong Tower",
"behaviour": "StrongTowerBehaviour",
"sprite": "strong_tower",
"texture": null,
"projectile": "white",
"projectileTextures": [],
"projectileTexturesArrayLength": 5,
"description": "Behaves like the Basic Tower, only its shots stop creeps in their tracks!",
"stats": {
"damage": 2,
"cooldown": 2200,
"gemSlotsAmount": 2,
"cost": 80,
"range": 3.25,
"timeToLive": 12,
"pierce": 2
}
},
{
"name": "Rail Tower",
"behaviour": "RailTowerBehaviour",
"sprite": "rail_tower",
"texture": null,
"projectile": "red",
"projectileTextures": [],
"projectileTexturesArrayLength": 4,
"description": "Shoots a quick, high pierce rail projectile at creeps.",
"stats": {
"damage": 5,
"cooldown": 5020,
"gemSlotsAmount": 3,
"cost": 134,
"range": 2.5,
"timeToLive": 12,
"pierce": 10
}
},
{
"name": "Trapper Tower",
"behaviour": "TrapperTowerBehaviour",
"sprite": "trapper_tower",
"texture": null,
"projectile": "stone",
"projectileTextures": [],
"projectileTexturesArrayLength": 1,
"description": "Randomly places expiring traps on the track, instead of attacking creeps.",
"stats": {
"damage": 2,
"cooldown": 2000,
"gemSlotsAmount": 3,
"cost": 150,
"range": 3,
"timeToLive": 400,
"pierce": 3
}
},
{
"name": "Debuff Tower",
"behaviour": "DebuffTowerBehaviour",
"sprite": "debuff_tower",
"texture": null,
"projectile": "red",
"projectileTextures": [],
"projectileTexturesArrayLength": 4,
"description": "On top of a regular attack, this tower gives creeps a debuff, making them take more damage.",
"stats": {
"damage": 2,
"cooldown": 1750,
"gemSlotsAmount": 3,
"cost": 200,
"range": 2.5,
"timeToLive": 12,
"pierce": 2
}
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

View File

@ -0,0 +1,91 @@
{
"name": "First Steps",
"description": "Welcome to your first defense mission. Protect the exit from basic invaders.",
"mapImage": {
"url": "/assets/maps/01_first_steps.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[0, 8],
[1, 8],
[2, 8],
[3, 8],
[4, 8],
[5, 8],
[6, 8],
[7, 8],
[8, 8],
[9, 8],
[10, 8],
[11, 8],
[12, 8],
[13, 8],
[14, 8],
[15, 8],
[16, 8],
[17, 8],
[18, 8],
[19, 8],
[20, 8],
[21, 8],
[22, 8],
[23, 8],
[24, 8]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0, 0]
},
{
"firstCreepSpawnTick": 4000,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0, 0]
}
],
"offeredGems": [0, 1, 0, 1]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
{
"firstCreepSpawnTick": 1000,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}
],
"offeredGems": [0, 1, 0, 1]
}
]
}

View File

@ -0,0 +1,153 @@
{
"name": "The Turn",
"description": "Start using some better strategies for this one.",
"mapImage": {
"url": "/assets/maps/02_the_turn.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1],
[1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1],
[1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1],
[1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1],
[1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1],
[1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[0, 4],
[1, 4],
[2, 4],
[3, 4],
[4, 4],
[5, 4],
[6, 4],
[7, 4],
[8, 4],
[9, 4],
[10, 4],
[11, 4],
[12, 4],
[12, 5],
[12, 6],
[12, 7],
[12, 8],
[12, 9],
[12, 10],
[11, 10],
[10, 10],
[9, 10],
[8, 10],
[7, 10],
[6, 10],
[5, 10],
[4, 10],
[3, 10],
[3, 11],
[3, 12],
[3, 13],
[3, 14],
[4, 14],
[5, 14],
[6, 14],
[7, 14],
[8, 14],
[9, 14],
[10, 14],
[11, 14],
[12, 14],
[13, 14],
[14, 14],
[15, 14],
[16, 14],
[17, 14],
[18, 14],
[19, 14],
[20, 14],
[20, 13],
[20, 12],
[20, 11],
[20, 10],
[20, 9],
[20, 8],
[20, 7],
[20, 6],
[20, 5],
[21, 5],
[22, 5],
[23, 5],
[24, 5]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 500,
"creeps": [0]
}
],
"offeredGems": [0, 0, 0, 0]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 1, 1, 1, 4, 5, 5, 5, 1, 1, 0, 0]
}
],
"offeredGems": [1, 1, 1, 0]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 500,
"creeps": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}
],
"offeredGems": [0, 2, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 100,
"creeps": [1, 1, 1, 1, 1, 1, 1, 1, 1]
}
],
"offeredGems": [0, 2, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [2, 2, 2, 2, 2]
}
],
"offeredGems": [0, 1, 3, 3]
}
]
}

View File

@ -0,0 +1,141 @@
{
"name": "Fork in the Road",
"description": "Multiple paths and heavily armored tank units test your defensive strategy.",
"mapImage": {
"url": "/assets/maps/03_fork_in_the_road.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
[1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[0, 8],
[1, 8],
[2, 8],
[3, 8],
[4, 8],
[5, 8],
[6, 8],
[7, 8],
[8, 8],
[8, 7],
[8, 6],
[8, 5],
[8, 4],
[9, 4],
[10, 4],
[11, 4],
[12, 4],
[13, 4],
[14, 4],
[15, 4],
[16, 4],
[17, 4],
[18, 4],
[19, 4],
[20, 4],
[21, 4],
[22, 4],
[23, 4],
[24, 4]
],
[
[0, 8],
[1, 8],
[2, 8],
[3, 8],
[4, 8],
[5, 8],
[6, 8],
[7, 8],
[8, 8],
[8, 9],
[8, 10],
[8, 11],
[8, 12],
[9, 12],
[10, 12],
[11, 12],
[12, 12],
[13, 12],
[14, 12],
[15, 12],
[16, 12],
[17, 12],
[18, 12],
[19, 12],
[20, 12],
[21, 12],
[22, 12],
[23, 12],
[24, 12]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0, 0]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 800,
"creeps": [1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 900,
"creeps": [2, 0, 0, 2]
},
{
"firstCreepSpawnTick": 5000,
"spawnIntervalTicks": 700,
"creeps": [1, 1, 2, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 800,
"creeps": [2, 1, 0, 2, 1, 0]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 600,
"creeps": [2, 2, 1, 1, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
}
]
}

View File

@ -0,0 +1,169 @@
{
"name": "Crossroads",
"description": "Multiple entry points and intersecting paths require careful tower placement and strategy.",
"mapImage": {
"url": "/assets/maps/04_crossroads.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[0, 13],
[1, 13],
[2, 13],
[3, 13],
[4, 13],
[5, 13],
[6, 13],
[7, 13],
[8, 13],
[9, 13],
[10, 13],
[11, 13],
[12, 13],
[13, 13],
[14, 13],
[15, 13],
[15, 12],
[15, 11],
[15, 10],
[16, 10],
[17, 10],
[18, 10],
[19, 10],
[20, 10],
[20, 9],
[20, 8],
[20, 7],
[20, 6],
[21, 6],
[22, 6],
[23, 6],
[24, 6]
],
[
[14, 0],
[14, 1],
[14, 2],
[13, 2],
[12, 2],
[11, 2],
[10, 2],
[9, 2],
[8, 2],
[7, 2],
[7, 3],
[7, 4],
[7, 5],
[8, 5],
[9, 5],
[10, 5],
[11, 5],
[12, 5],
[12, 6],
[12, 7],
[12, 8],
[12, 9],
[12, 10],
[13, 10],
[14, 10],
[15, 10],
[16, 10],
[17, 10],
[18, 10],
[19, 10],
[20, 10],
[20, 9],
[20, 8],
[20, 7],
[20, 6],
[21, 6],
[22, 6],
[23, 6],
[24, 6]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 1, 0, 0]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 800,
"creeps": [1, 1, 2, 1, 1]
}
],
"offeredGems": [0, 1, 2, 0]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 800,
"creeps": [2, 0, 2, 0, 2, 0]
},
{
"firstCreepSpawnTick": 5000,
"spawnIntervalTicks": 600,
"creeps": [1, 2, 1, 2, 1, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 700,
"creeps": [2, 1, 0, 2, 1, 0, 2]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 500,
"creeps": [2, 2, 1, 1, 2, 2, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 600,
"creeps": [2, 2, 2, 1, 1, 1, 0, 0]
},
{
"firstCreepSpawnTick": 7000,
"spawnIntervalTicks": 400,
"creeps": [2, 2, 2, 2, 1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
}
]
}

View File

@ -0,0 +1,263 @@
{
"name": "The Maze",
"description": "A complex network of paths requires masterful tower placement and timing.",
"mapImage": {
"url": "/assets/maps/05_the_maze.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0],
[1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 0, 0, 9, 0, 0, 0, 0, 9, 9, 9],
[1, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 1, 0, 9, 0, 0, 9, 0, 1, 1, 0, 0, 0, 0],
[1, 0, 9, 0, 0, 9, 0, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 0, 9, 0, 1, 1, 0, 9, 9, 9, 9, 9, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 0, 9, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 1],
[0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 1],
[9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[0, 1],
[1, 1],
[2, 1],
[3, 1],
[4, 1],
[5, 1],
[6, 1],
[7, 1],
[8, 1],
[9, 1],
[10, 1],
[11, 1],
[12, 1],
[13, 1],
[14, 1],
[15, 1],
[16, 1],
[17, 1],
[17, 2],
[17, 3],
[17, 4],
[17, 5],
[17, 6],
[17, 7],
[17, 8],
[17, 9],
[17, 10],
[17, 11],
[17, 12],
[17, 13],
[17, 14],
[16, 14],
[15, 14],
[14, 14],
[13, 14],
[12, 14],
[11, 14],
[10, 14],
[9, 14],
[8, 14],
[7, 14],
[6, 14],
[5, 14],
[5, 13],
[5, 12],
[5, 11],
[5, 10],
[5, 9],
[6, 9],
[7, 9],
[8, 9],
[9, 9],
[10, 9],
[10, 10],
[10, 11],
[11, 11],
[12, 11],
[13, 11],
[14, 11],
[14, 10],
[14, 9],
[14, 8],
[14, 7],
[15, 7],
[16, 7],
[17, 7],
[18, 7],
[19, 7],
[20, 7],
[21, 7],
[22, 7],
[22, 8],
[23, 8],
[24, 8]
],
[
[0, 15],
[1, 15],
[2, 15],
[2, 14],
[2, 13],
[2, 12],
[2, 11],
[2, 10],
[2, 9],
[2, 8],
[2, 7],
[2, 6],
[2, 5],
[2, 4],
[3, 4],
[4, 4],
[5, 4],
[6, 4],
[7, 4],
[8, 4],
[9, 4],
[10, 4],
[11, 4],
[12, 4],
[13, 4],
[14, 4],
[14, 5],
[14, 6],
[14, 7],
[14, 8],
[14, 9],
[14, 10],
[14, 11],
[13, 11],
[12, 11],
[11, 11],
[10, 11],
[10, 10],
[10, 9],
[9, 9],
[8, 9],
[7, 9],
[6, 9],
[5, 9],
[5, 10],
[5, 11],
[5, 12],
[5, 13],
[5, 14],
[6, 14],
[7, 14],
[8, 14],
[9, 14],
[10, 14],
[11, 14],
[12, 14],
[13, 14],
[14, 14],
[15, 14],
[16, 14],
[17, 14],
[17, 13],
[17, 12],
[17, 11],
[17, 10],
[17, 9],
[17, 8],
[17, 7],
[18, 7],
[19, 7],
[20, 7],
[21, 7],
[22, 7],
[22, 8],
[23, 8],
[24, 8]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 800,
"creeps": [0, 1, 0, 1, 0, 1]
},
{
"firstCreepSpawnTick": 5000,
"spawnIntervalTicks": 600,
"creeps": [1, 1, 2, 1, 1, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 700,
"creeps": [2, 0, 2, 1, 2, 0, 2]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 500,
"creeps": [2, 1, 2, 1, 2, 1, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 600,
"creeps": [2, 2, 1, 1, 0, 2, 2, 1]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 400,
"creeps": [2, 2, 2, 1, 1, 1, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 500,
"creeps": [2, 2, 1, 1, 2, 2, 1, 1, 2]
},
{
"firstCreepSpawnTick": 7000,
"spawnIntervalTicks": 300,
"creeps": [2, 2, 2, 1, 1, 1, 2, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 400,
"creeps": [2, 2, 2, 2, 1, 1, 1, 1, 2, 2]
},
{
"firstCreepSpawnTick": 8000,
"spawnIntervalTicks": 250,
"creeps": [2, 2, 2, 2, 2, 1, 1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
}
]
}

View File

@ -0,0 +1,199 @@
{
"name": "Multi-Defense",
"description": "Multiple exits must be defended simultaneously against increasingly difficult waves.",
"mapImage": {
"url": "/assets/maps/06_multiple_fronts.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[1, 1, 1, 1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 0, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1],
[1, 0, 9, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1],
[1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 1, 1, 1, 1, 0, 9, 0, 0, 0],
[1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[9, 9, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9],
[1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[5, 0],
[5, 1],
[5, 2],
[4, 2],
[3, 2],
[2, 2],
[2, 3],
[2, 4],
[2, 5],
[3, 5],
[4, 5],
[5, 5],
[6, 5],
[7, 5],
[8, 5],
[9, 5],
[10, 5],
[11, 5],
[12, 5],
[13, 5],
[13, 4],
[13, 3],
[13, 2],
[14, 2],
[15, 2],
[16, 2],
[17, 2],
[18, 2],
[19, 2],
[20, 2],
[21, 2],
[21, 3],
[21, 4],
[21, 5],
[22, 5],
[23, 5],
[24, 5]
],
[
[0, 9],
[1, 9],
[2, 9],
[2, 10],
[2, 11],
[2, 12],
[2, 13],
[2, 14],
[2, 15],
[3, 15],
[4, 15],
[5, 15],
[6, 15],
[7, 15],
[8, 15],
[9, 15],
[10, 15],
[11, 15],
[11, 14],
[11, 13],
[12, 13],
[13, 13],
[14, 13],
[15, 13],
[16, 13],
[17, 13],
[17, 14],
[18, 14],
[19, 14],
[20, 14],
[21, 14],
[22, 14],
[23, 14],
[24, 14]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 700,
"creeps": [0, 1, 0, 1, 0, 1, 0]
},
{
"firstCreepSpawnTick": 5000,
"spawnIntervalTicks": 500,
"creeps": [1, 1, 2, 1, 1, 2, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 600,
"creeps": [2, 1, 2, 1, 2, 1, 2, 1]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 400,
"creeps": [2, 2, 1, 1, 2, 2, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 500,
"creeps": [2, 2, 1, 1, 2, 2, 1, 1, 2]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 300,
"creeps": [2, 2, 2, 1, 1, 1, 2, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 400,
"creeps": [2, 2, 2, 1, 1, 1, 2, 2, 2, 1]
},
{
"firstCreepSpawnTick": 7000,
"spawnIntervalTicks": 250,
"creeps": [2, 2, 2, 2, 1, 1, 1, 1, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 300,
"creeps": [2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2]
},
{
"firstCreepSpawnTick": 7000,
"spawnIntervalTicks": 200,
"creeps": [2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 250,
"creeps": [2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2]
},
{
"firstCreepSpawnTick": 8000,
"spawnIntervalTicks": 150,
"creeps": [2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
}
]
}

View File

@ -0,0 +1,223 @@
{
"name": "Final Stretch",
"description": "The final map, the longest map, the 7th map.",
"mapImage": {
"url": "/assets/maps/07_final_stretch.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[1, 0, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 9, 9, 9, 9, 0, 1, 0, 9, 9, 9, 9, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 0, 0, 9, 0, 1, 0, 9, 0, 0, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1, 0, 9, 0, 1],
[1, 0, 9, 0, 0, 0, 9, 0, 1, 0, 9, 0, 0, 0, 9, 0, 1, 0, 9, 0, 0, 0, 9, 0, 1],
[1, 0, 9, 9, 9, 9, 9, 0, 1, 0, 9, 9, 9, 9, 9, 0, 1, 0, 9, 9, 9, 9, 9, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[2, 0],
[2, 1],
[2, 2],
[2, 3],
[2, 4],
[2, 5],
[2, 6],
[2, 7],
[2, 8],
[2, 9],
[2, 10],
[2, 11],
[2, 12],
[2, 13],
[2, 14],
[3, 14],
[4, 14],
[5, 14],
[6, 14],
[6, 13],
[6, 12],
[6, 11],
[6, 10],
[6, 9],
[6, 8],
[6, 7],
[6, 6],
[6, 5],
[6, 4],
[6, 3],
[6, 2],
[7, 2],
[8, 2],
[9, 2],
[10, 2],
[10, 3],
[10, 4],
[10, 5],
[10, 6],
[10, 7],
[10, 8],
[10, 9],
[10, 10],
[10, 11],
[10, 12],
[10, 13],
[10, 14],
[11, 14],
[12, 14],
[13, 14],
[14, 14],
[14, 13],
[14, 12],
[14, 11],
[14, 10],
[14, 9],
[14, 8],
[14, 7],
[14, 6],
[14, 5],
[14, 4],
[14, 3],
[14, 2],
[15, 2],
[16, 2],
[17, 2],
[18, 2],
[18, 3],
[18, 4],
[18, 5],
[18, 6],
[18, 7],
[18, 8],
[18, 9],
[18, 10],
[18, 11],
[18, 12],
[18, 13],
[18, 14],
[19, 14],
[20, 14],
[21, 14],
[22, 14],
[22, 13],
[22, 12],
[22, 11],
[22, 10],
[22, 9],
[22, 8],
[22, 7],
[22, 6],
[22, 5],
[22, 4],
[22, 3],
[22, 2],
[22, 1],
[22, 0]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 700,
"creeps": [0, 1, 0, 1, 0, 1, 0]
},
{
"firstCreepSpawnTick": 5000,
"spawnIntervalTicks": 500,
"creeps": [1, 1, 2, 1, 1, 2, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 600,
"creeps": [2, 1, 2, 1, 2, 1, 2, 1]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 400,
"creeps": [2, 2, 1, 1, 2, 2, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 500,
"creeps": [2, 2, 1, 1, 2, 2, 1, 1, 2]
},
{
"firstCreepSpawnTick": 6000,
"spawnIntervalTicks": 300,
"creeps": [2, 2, 2, 1, 1, 1, 2, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 400,
"creeps": [2, 2, 2, 1, 1, 1, 2, 2, 2, 1]
},
{
"firstCreepSpawnTick": 7000,
"spawnIntervalTicks": 250,
"creeps": [2, 2, 2, 2, 1, 1, 1, 1, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 300,
"creeps": [2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2]
},
{
"firstCreepSpawnTick": 7000,
"spawnIntervalTicks": 200,
"creeps": [2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 250,
"creeps": [2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2]
},
{
"firstCreepSpawnTick": 8000,
"spawnIntervalTicks": 150,
"creeps": [2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
}
]
}

View File

@ -1,128 +0,0 @@
{
"name": "Mission 1",
"description": "This is the first mission",
"mapImage": {
"url": "/assets/maps/mission_01.png"
},
"gameMap": {
"rows": 17,
"columns": 25,
"cells": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[
[4, 0],
[4, 1],
[4, 2],
[4, 3],
[4, 4],
[4, 5],
[4, 6],
[4, 7],
[4, 8],
[4, 9],
[4, 10],
[4, 11],
[4, 12],
[5, 12],
[6, 12],
[7, 12],
[8, 12],
[9, 12],
[10, 12],
[10, 11],
[10, 10],
[10, 9],
[10, 8],
[10, 7],
[10, 6],
[10, 5],
[10, 4],
[10, 3],
[11, 3],
[12, 3],
[13, 3],
[14, 3],
[14, 4],
[14, 5],
[14, 6],
[14, 7],
[14, 8],
[14, 9],
[14, 10],
[14, 11],
[14, 12],
[14, 13],
[14, 14],
[14, 15],
[14, 16],
[14, 17],
[14, 18],
[14, 19],
[14, 20],
[13, 20],
[12, 20],
[11, 20],
[10, 20],
[9, 20],
[8, 20],
[7, 20],
[6, 20],
[5, 20],
[5, 21],
[5, 22],
[5, 23],
[5, 24]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0, 0]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0]
}
],
"offeredGems": [0, 1, 2, 3]
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Some files were not shown because too many files have changed in this diff Show More