Merge pull request #17 from koneko/main

align
This commit is contained in:
Koneko 2025-02-08 18:30:47 +01:00 committed by GitHub
commit 343d66597c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
123 changed files with 2642 additions and 256 deletions

View File

@ -4,7 +4,7 @@ List of things to implement following the "release" of the minimum viable produc
## Creeps ## Creeps
- [ ] Elemental resistances/attunement - [x] Elemental resistances/attunement
- [x] Proper animation via PNG sequence - [x] Proper animation via PNG sequence
- [x] More variety in Creeps - [x] More variety in Creeps
- [x] Health bar - [x] Health bar
@ -29,4 +29,4 @@ List of things to implement following the "release" of the minimum viable produc
- [ ] Add sound effects - [ ] Add sound effects
- [ ] Tutorial image/mission - [ ] Tutorial image/mission
- [ ] Pause menu - [ ] Pause menu
- [ ] Score screen when winning/losing map - [x] Score screen when winning/losing map

View File

@ -2,11 +2,10 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <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" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css" />
<link href="https://fonts.googleapis.com/css?family=Aclonica" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css?family=Aclonica" rel="stylesheet" />
<title>Bastion App</title> <title>Bastion: The Watcher's Lament</title>
</head> </head>
<body> <body>
<script type="module" src="/src/main.ts"></script> <script type="module" src="/src/main.ts"></script>

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"?> <?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"> <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> </tileset>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -5,7 +5,7 @@
"textureArrayLength": 12, "textureArrayLength": 12,
"stats": { "stats": {
"health": 5, "health": 5,
"speed": 6, "speed": 4,
"special": null, "special": null,
"resistance": { "resistance": {
"physical": 0, "physical": 0,
@ -19,10 +19,10 @@
{ {
"name": "quick", "name": "quick",
"textures": [], "textures": [],
"textureArrayLength": 12, "textureArrayLength": 8,
"stats": { "stats": {
"health": 7, "health": 2,
"speed": 2.4, "speed": 6,
"special": null, "special": null,
"resistance": { "resistance": {
"physical": 0, "physical": 0,
@ -38,8 +38,8 @@
"textures": [], "textures": [],
"textureArrayLength": 12, "textureArrayLength": 12,
"stats": { "stats": {
"health": 7, "health": 12,
"speed": 2.4, "speed": 2,
"special": null, "special": null,
"resistance": { "resistance": {
"physical": 0, "physical": 0,

View File

@ -2,6 +2,7 @@
{ {
"name": "Fire Gem", "name": "Fire Gem",
"description": "Forged from molten lava, the Fire Gem imbues your tower's attacks and adds 50% extra fire damage. It can be merged with any gem and is common. This text shouldn't be long.", "description": "Forged from molten lava, the Fire Gem imbues your tower's attacks and adds 50% extra fire damage. It can be merged with any gem and is common. This text shouldn't be long.",
"color": "red",
"type": "Fire", "type": "Fire",
"totalLevels": 2, "totalLevels": 2,
"textures": [], "textures": [],
@ -11,7 +12,7 @@
"genericImprovements": [ "genericImprovements": [
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0.5, "rangeUp": 0.5,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -19,7 +20,7 @@
}, },
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0.5, "rangeUp": 0.5,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -30,14 +31,14 @@
{ {
"physical": 0, "physical": 0,
"divine": 0, "divine": 0,
"fire": 0.5, "fire": 0.25,
"ice": 0, "ice": 0,
"frostfire": 0 "frostfire": 0
}, },
{ {
"physical": 0, "physical": 0,
"divine": 0, "divine": 0,
"fire": 0.5, "fire": 0.25,
"ice": 0, "ice": 0,
"frostfire": 0 "frostfire": 0
} }
@ -46,6 +47,7 @@
{ {
"name": "Yeti Gem", "name": "Yeti Gem",
"description": "Yeti gem description. Something something, write this while drunk or something.", "description": "Yeti gem description. Something something, write this while drunk or something.",
"color": "#32e4fc",
"type": "Yeti", "type": "Yeti",
"totalLevels": 2, "totalLevels": 2,
"textures": [], "textures": [],
@ -55,7 +57,7 @@
"genericImprovements": [ "genericImprovements": [
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0.5, "rangeUp": 0.5,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -63,7 +65,7 @@
}, },
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0.5, "rangeUp": 0.5,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -90,6 +92,7 @@
{ {
"name": "Titalium Gem", "name": "Titalium Gem",
"description": "Titalium gem description. Something something zombie creeps working for you something something.", "description": "Titalium gem description. Something something zombie creeps working for you something something.",
"color": "pink",
"type": "Titalium", "type": "Titalium",
"totalLevels": 3, "totalLevels": 3,
"textures": [], "textures": [],
@ -99,7 +102,7 @@
"genericImprovements": [ "genericImprovements": [
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0.5, "rangeUp": 0.5,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -107,7 +110,7 @@
}, },
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0, "rangeUp": 0,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -115,7 +118,7 @@
}, },
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0, "rangeUp": 0,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -149,6 +152,7 @@
{ {
"name": "Soulforge Gem", "name": "Soulforge Gem",
"description": "Soulforge gem description, have to write later.", "description": "Soulforge gem description, have to write later.",
"color": "gray",
"type": "Soulforge", "type": "Soulforge",
"totalLevels": 2, "totalLevels": 2,
"textures": [], "textures": [],
@ -158,7 +162,7 @@
"genericImprovements": [ "genericImprovements": [
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0.5, "rangeUp": 0.5,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,
@ -166,7 +170,7 @@
}, },
{ {
"damageUp": 2, "damageUp": 2,
"attackSpeedUp": 100, "attackSpeedUp": 10,
"rangeUp": 0.5, "rangeUp": 0.5,
"timeToLiveUp": 0, "timeToLiveUp": 0,
"pierceUp": 1, "pierceUp": 1,

View File

@ -9,26 +9,30 @@
"description": "The building block of society, nothing more basic exists.", "description": "The building block of society, nothing more basic exists.",
"stats": { "stats": {
"damage": 2, "damage": 2,
"cooldown": 60, "cooldown": 120,
"gemSlotsAmount": 2, "gemSlotsAmount": 2,
"cost": 100, "cost": 100,
"range": 3 "range": 3,
"timeToLive": 120,
"pierce": 1
} }
}, },
{ {
"name": "Circle Tower", "name": "Circle Tower",
"behaviour": "BasicTowerBehaviour", "behaviour": "CircleTowerBehaviour",
"sprite": "circle_tower", "sprite": "circle_tower",
"texture": null, "texture": null,
"projectileTextures": [], "projectileTextures": [],
"projectileTexturesArrayLength": 4, "projectileTexturesArrayLength": 4,
"description": "If you feel a little circular.", "description": "If you feel a little circular.",
"stats": { "stats": {
"damage": 6, "damage": 2,
"cooldown": 180, "cooldown": 120,
"gemSlotsAmount": 3, "gemSlotsAmount": 3,
"cost": 125, "cost": 125,
"range": 3 "range": 2,
"timeToLive": 8,
"pierce": 30
} }
} }
] ]

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,76 @@
{
"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]
},
{
"firstCreepSpawnTick": 4000,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0]
}
],
"offeredGems": [0, 1]
}
]
}

View File

@ -0,0 +1,128 @@
{
"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": 1000,
"creeps": [0, 0, 0, 0, 0]
}
],
"offeredGems": [0, 0, 0, 0]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [1, 1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [2, 2, 2, 2, 2]
}
],
"offeredGems": [0, 1, 2, 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, 0, 0, 0]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [1, 1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2, 3]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [2, 2, 2, 2, 2]
}
],
"offeredGems": [0, 1, 2, 3]
}
]
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -3,9 +3,11 @@
"height": 4300, "height": 4300,
"width": 2 "width": 2
}, },
"activeFile": "Mission011.tmx", "activeFile": "tiled/07_final_stretch.tmx",
"expandedProjectPaths": [ "expandedProjectPaths": [
"." ".",
"tiled",
"assets/missions"
], ],
"file.lastUsedOpenFilter": "All Files (*)", "file.lastUsedOpenFilter": "All Files (*)",
"fileStates": { "fileStates": {
@ -16,7 +18,7 @@
"scaleInDock": 0.33, "scaleInDock": 0.33,
"scaleInEditor": 1 "scaleInEditor": 1
}, },
"/home/koneko/dumping/tiles/TiledTDThree64.tmx": { "C:/home/koneko/dumping/tiles/TiledTDThree64.tmx": {
"scale": 0.187625, "scale": 0.187625,
"selectedLayer": 0, "selectedLayer": 0,
"viewCenter": { "viewCenter": {
@ -36,31 +38,118 @@
"scale": 0.5, "scale": 0.5,
"selectedLayer": 0, "selectedLayer": 0,
"viewCenter": { "viewCenter": {
"x": 570, "x": 959,
"y": 448 "y": 543
} }
}, },
"Tileset.tsx": { "Tileset.tsx": {
"scaleInDock": 0.5, "scaleInDock": 0.75,
"scaleInEditor": 1 "scaleInEditor": 1
},
"tiled/01_first_steps..tmx": {
"scale": 1,
"selectedLayer": 0,
"viewCenter": {
"x": 975,
"y": 640.5
}
},
"tiled/01_first_steps.tmx": {
"scale": 0.33,
"selectedLayer": 0,
"viewCenter": {
"x": 639.3939393939394,
"y": 433.33333333333326
}
},
"tiled/02_the_turn.tmx": {
"scale": 0.33,
"selectedLayer": 0,
"viewCenter": {
"x": 869.6969696969697,
"y": 203.03030303030323
}
},
"tiled/03_fork_in_the_road.tmx": {
"scale": 0.33,
"selectedLayer": 0,
"viewCenter": {
"x": 2693.9393939393935,
"y": 239.3939393939395
}
},
"tiled/04_crossroads.tmx": {
"scale": 1,
"selectedLayer": 0,
"viewCenter": {
"x": 646.5,
"y": 543
}
},
"tiled/05_the_maze.tmx": {
"scale": 0.5,
"selectedLayer": 0,
"viewCenter": {
"x": 896,
"y": 406
}
},
"tiled/06_multiple_fronts.tmx": {
"scale": 0.75,
"selectedLayer": 0,
"viewCenter": {
"x": 873.3333333333333,
"y": 474.6666666666666
}
},
"tiled/07_final_stretch.tmx": {
"scale": 0.5,
"selectedLayer": 0,
"viewCenter": {
"x": 971,
"y": 270
}
},
"tiled/Mission01.tmx": {
"scale": 1,
"selectedLayer": 0,
"viewCenter": {
"x": 833,
"y": 629
}
} }
}, },
"last.exportedFilePath": "C:/Work/Projects/Matej/towerdefense/public/tiled",
"last.externalTilesetPath": "/home/koneko/Programing/js/towerdefense/public", "last.externalTilesetPath": "/home/koneko/Programing/js/towerdefense/public",
"map.height": 17, "map.height": 17,
"map.lastUsedExportFilter": "All Files (*)",
"map.lastUsedFormat": "tmx", "map.lastUsedFormat": "tmx",
"map.tileHeight": 64, "map.tileHeight": 64,
"map.tileWidth": 64, "map.tileWidth": 64,
"map.width": 30, "map.width": 25,
"openFiles": [ "openFiles": [
"Tileset.tsx", "tiled/04_crossroads.tmx",
"Mission011.tmx" "tiled/05_the_maze.tmx",
"tiled/01_first_steps.tmx",
"tiled/02_the_turn.tmx",
"tiled/03_fork_in_the_road.tmx",
"tiled/06_multiple_fronts.tmx",
"tiled/07_final_stretch.tmx"
], ],
"project": "maps.tiled-project", "project": "maps.tiled-project",
"recentFiles": [ "recentFiles": [
"Tileset.tsx", "tiled/04_crossroads.tmx",
"tiled/05_the_maze.tmx",
"tiled/01_first_steps.tmx",
"tiled/02_the_turn.tmx",
"tiled/03_fork_in_the_road.tmx",
"tiled/06_multiple_fronts.tmx",
"tiled/07_final_stretch.tmx",
"tiled/Mission01.tmx",
"tiled/01_first_steps..tmx",
"Mission011.tmx", "Mission011.tmx",
"Mission01.tmx", "Tileset.tsx",
"/home/koneko/dumping/tiles/TiledTDThree64.tmx" "Mission01.tmx"
], ],
"tileset.lastUsedFilter": "Tiled tileset files (*.tsx *.xml)" "tileset.lastUsedFilter": "Tiled tileset files (*.tsx *.xml)"
} }

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.2" orientation="orthogonal" renderorder="right-down" width="25" height="17" tilewidth="64" tileheight="64" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="../Tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="25" height="17">
<data encoding="csv">
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
</data>
</layer>
</map>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.2" orientation="orthogonal" renderorder="right-down" width="25" height="17" tilewidth="64" tileheight="64" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="../Tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="25" height="17">
<data encoding="csv">
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
4,4,4,4,4,4,4,4,4,4,4,4,4,5,15,15,15,15,15,15,15,15,15,15,15,
18,18,18,18,18,18,18,18,18,18,18,18,18,19,15,15,15,15,15,3,4,4,4,4,4,
32,32,32,32,32,32,32,32,32,32,32,7,18,19,15,15,15,15,15,17,18,18,18,18,18,
15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,17,18,6,32,32,32,
15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,17,18,19,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,17,18,19,15,15,15,
15,15,3,4,4,4,4,4,4,4,4,21,18,19,15,15,15,15,15,17,18,19,15,15,15,
15,15,17,18,18,18,18,18,18,18,18,18,18,19,15,15,15,15,15,17,18,19,15,15,15,
15,15,17,18,6,32,32,32,32,32,32,32,32,33,15,15,15,15,15,17,18,19,15,15,15,
15,15,17,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,15,15,
15,15,17,18,20,4,4,4,4,4,4,4,4,4,4,4,4,4,4,21,18,19,15,15,15,
15,15,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,15,15,15,
15,15,31,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,33,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
</data>
</layer>
</map>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.2" orientation="orthogonal" renderorder="right-down" width="25" height="17" tilewidth="64" tileheight="64" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="../Tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="25" height="17">
<data encoding="csv">
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
15,15,15,15,15,15,15,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
15,15,15,15,15,15,15,17,18,6,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
4,4,4,4,4,4,4,21,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
18,18,18,18,18,18,18,18,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
32,32,32,32,32,32,32,7,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,17,18,20,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
15,15,15,15,15,15,15,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
15,15,15,15,15,15,15,31,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
</data>
</layer>
</map>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.2" orientation="orthogonal" renderorder="right-down" width="25" height="17" tilewidth="64" tileheight="64" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="../Tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="25" height="17">
<data encoding="csv">
15,15,15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,3,4,4,4,4,4,4,21,18,19,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,17,18,18,18,18,18,18,18,18,19,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,17,18,6,32,32,32,32,32,32,33,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,17,18,20,4,4,4,4,5,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,17,18,18,18,18,18,18,19,15,15,15,15,15,3,4,4,4,4,4,
15,15,15,15,15,15,31,32,32,32,32,7,18,19,15,15,15,15,15,17,18,18,18,18,18,
15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,17,18,6,32,32,32,
15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,17,18,19,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,17,18,20,4,4,4,4,4,21,18,19,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,17,18,18,18,18,18,18,18,18,18,19,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,31,32,32,7,18,6,32,32,32,32,33,15,15,15,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,21,18,19,15,15,15,15,15,15,15,15,
18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,15,15,15,15,15,15,15,15,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,33,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
</data>
</layer>
</map>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.2" orientation="orthogonal" renderorder="right-down" width="25" height="17" tilewidth="64" tileheight="64" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="../Tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="25" height="17">
<data encoding="csv">
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,15,15,15,15,15,15,
18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,15,15,15,15,15,15,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,7,18,19,15,15,15,15,15,15,
15,3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,17,18,19,15,15,15,15,15,15,
15,17,18,18,18,18,18,18,18,18,18,18,18,18,18,19,17,18,19,15,15,15,15,15,15,
15,17,18,6,32,32,32,32,32,32,32,32,32,7,18,19,17,18,19,15,15,15,15,15,15,
15,17,18,19,15,15,15,15,15,15,15,15,15,17,18,20,21,18,20,4,4,4,4,5,15,
15,17,18,19,15,15,15,15,15,15,15,15,15,17,18,18,18,18,18,18,18,18,18,20,4,
15,17,18,19,3,4,4,4,4,4,4,5,15,17,18,6,7,18,6,32,32,7,18,18,18,
15,17,18,19,17,18,18,18,18,18,18,19,15,17,18,19,17,18,19,15,15,31,32,32,32,
15,17,18,19,17,18,6,32,32,7,18,20,4,21,18,19,17,18,19,15,15,15,15,15,15,
15,17,18,19,17,18,19,15,15,17,18,18,18,18,18,19,17,18,19,15,15,15,15,15,15,
15,17,18,19,17,18,19,15,15,31,32,32,32,32,32,33,17,18,19,15,15,15,15,15,15,
15,17,18,19,17,18,20,4,4,4,4,4,4,4,4,4,21,18,19,15,15,15,15,15,15,
4,21,18,19,17,18,18,18,18,18,18,18,18,18,18,18,18,18,19,15,15,15,15,15,15,
18,18,18,19,31,32,32,32,32,32,32,32,32,32,32,32,32,32,33,15,15,15,15,15,15,
32,32,32,33,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
</data>
</layer>
</map>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.1" orientation="orthogonal" renderorder="right-down" width="25" height="17" tilewidth="64" tileheight="64" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="../Tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="25" height="17">
<data encoding="csv">
15,15,15,15,17,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,3,4,4,21,18,19,15,15,15,15,15,3,4,4,4,4,4,4,4,4,4,5,15,15,
15,17,18,18,18,18,19,15,15,15,15,15,17,18,18,18,18,18,18,18,18,18,19,15,15,
15,17,18,6,32,32,33,15,15,15,15,15,17,18,6,32,32,32,32,32,7,18,19,15,15,
15,17,18,19,15,15,15,15,15,15,15,15,17,18,19,15,15,15,15,15,17,18,20,4,4,
15,17,18,20,4,4,4,4,4,4,4,4,21,18,19,15,15,15,15,15,17,18,18,18,18,
15,17,18,18,18,18,18,18,18,18,18,18,18,18,19,15,15,15,15,15,31,32,32,32,32,
15,31,32,32,32,32,32,32,32,32,32,32,32,32,33,15,15,15,15,15,15,15,15,15,15,
4,4,4,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
18,18,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
32,7,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,17,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,17,18,19,15,15,15,15,15,15,3,4,4,4,4,4,4,4,5,15,15,15,15,15,15,
15,17,18,19,15,15,15,15,15,15,17,18,18,18,18,18,18,18,20,4,4,4,4,4,4,
15,17,18,20,4,4,4,4,4,4,21,18,6,32,32,32,7,18,18,18,18,18,18,18,18,
15,17,18,18,18,18,18,18,18,18,18,18,19,15,15,15,31,32,32,32,32,32,32,32,32,
15,31,32,32,32,32,32,32,32,32,32,32,33,15,15,15,15,15,15,15,15,15,15,15,15
</data>
</layer>
</map>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.1" orientation="orthogonal" renderorder="right-down" width="25" height="17" tilewidth="64" tileheight="64" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="../Tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="25" height="17">
<data encoding="csv">
15,17,18,19,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,18,19,15,
15,17,18,19,15,3,4,4,4,4,4,5,15,3,4,4,4,4,4,5,15,17,18,19,15,
15,17,18,19,15,17,18,18,18,18,18,19,15,17,18,18,18,18,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,6,32,7,18,19,15,17,18,6,32,7,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,17,18,19,15,
15,17,18,20,4,21,18,19,15,17,18,20,4,21,18,19,15,17,18,20,4,21,18,19,15,
15,17,18,18,18,18,18,19,15,17,18,18,18,18,18,19,15,17,18,18,18,18,18,19,15,
15,31,32,32,32,32,32,33,15,31,32,32,32,32,32,33,15,31,32,32,32,32,32,33,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
</data>
</layer>
</map>

View File

@ -24,6 +24,7 @@ export default class GameAssets {
public static SwordsTexture: PIXI.Texture; public static SwordsTexture: PIXI.Texture;
public static TitleTexture: PIXI.Texture; public static TitleTexture: PIXI.Texture;
public static BannerGemsmith: PIXI.Texture; public static BannerGemsmith: PIXI.Texture;
public static EndScreenDialog: PIXI.Texture;
public static PlayIconTexture: PIXI.Texture; public static PlayIconTexture: PIXI.Texture;
public static PauseIconTexture: PIXI.Texture; public static PauseIconTexture: PIXI.Texture;
@ -34,7 +35,7 @@ export default class GameAssets {
public static PlusIconTexture: PIXI.Texture; public static PlusIconTexture: PIXI.Texture;
public static GemAmountIcons: PIXI.Texture[] = []; public static GemAmountIcons: PIXI.Texture[] = [];
public static Missions: MissionDefinition[]; public static Missions: MissionDefinition[] = [];
public static MissionBackgrounds: PIXI.Texture[] = []; public static MissionBackgrounds: PIXI.Texture[] = [];
public static Towers: TowerDefinition[]; public static Towers: TowerDefinition[];
public static Creeps: CreepDefinition[]; public static Creeps: CreepDefinition[];
@ -96,6 +97,7 @@ export default class GameAssets {
this.Load('./assets/gui/frame_green.png').then((texture) => (this.GreenBackground = texture)), this.Load('./assets/gui/frame_green.png').then((texture) => (this.GreenBackground = texture)),
this.Load('./assets/gui/frame_blue.png').then((texture) => (this.BlueBackground = texture)), this.Load('./assets/gui/frame_blue.png').then((texture) => (this.BlueBackground = texture)),
this.Load('./assets/gui/banner_01.png').then((texture) => (this.BannerGemsmith = texture)), this.Load('./assets/gui/banner_01.png').then((texture) => (this.BannerGemsmith = texture)),
this.Load('./assets/gui/note.png').then((texture) => (this.EndScreenDialog = texture)),
this.Load('./assets/gui/heart.png').then((texture) => (this.HealthTexture = texture)), this.Load('./assets/gui/heart.png').then((texture) => (this.HealthTexture = texture)),
this.Load('./assets/gui/money.png').then((texture) => (this.GoldTexture = texture)), this.Load('./assets/gui/money.png').then((texture) => (this.GoldTexture = texture)),
this.Load('./assets/gui/wave.png').then((texture) => (this.WaveTexture = texture)), this.Load('./assets/gui/wave.png').then((texture) => (this.WaveTexture = texture)),
@ -150,7 +152,13 @@ export default class GameAssets {
private static async LoadMissions() { private static async LoadMissions() {
// When adding missions, make sure to keep order. // When adding missions, make sure to keep order.
GameAssets.Missions = [await this.LoadMission('./assets/missions/mission_01.json')]; await this.LoadMission('./assets/missions/01_first_steps.json');
await this.LoadMission('./assets/missions/02_the_turn.json');
await this.LoadMission('./assets/missions/03_fork_in_the_road.json');
await this.LoadMission('./assets/missions/04_crossroads.json');
await this.LoadMission('./assets/missions/05_the_maze.json');
await this.LoadMission('./assets/missions/06_multiple_fronts.json');
await this.LoadMission('./assets/missions/07_final_stretch.json');
} }
private static async LoadTowers() { private static async LoadTowers() {
@ -170,13 +178,8 @@ export default class GameAssets {
private static async LoadMission(missionUrl: string) { private static async LoadMission(missionUrl: string) {
const res = await fetch(missionUrl); const res = await fetch(missionUrl);
const mission = await res.json(); const mission = await res.json();
await this.LoadBackground(mission.mapImage.url); console.log(`Loading mission: ${missionUrl} [${mission.name} / ${mission.mapImage.url}]`);
return mission; GameAssets.Missions.push(mission);
} GameAssets.MissionBackgrounds.push(await this.Load(mission.mapImage.url));
private static async LoadBackground(backgroundUrl: string) {
let index = this.MissionBackgrounds.length - 1;
if (index == -1) index = 0;
this.MissionBackgrounds[index] = await this.Load(backgroundUrl);
} }
} }

View File

@ -22,6 +22,7 @@ export class Engine {
public static NotificationManager: NotificationManager; public static NotificationManager: NotificationManager;
public static GameScene: GameScene; public static GameScene: GameScene;
public static latestCommit: string; public static latestCommit: string;
public static latestGemId = 0;
public static GridCellSize: number = 64; public static GridCellSize: number = 64;
public static GridColumns: number = 25; public static GridColumns: number = 25;
@ -30,9 +31,12 @@ export class Engine {
public static MouseY: number = 0; public static MouseY: number = 0;
public static TestSuite() { public static TestSuite() {
let params = new URLSearchParams(location.href);
if (params.entries().next().value[1] != 'game') return;
Engine.NotificationManager.Notify('Loaded testing suite.', 'danger'); Engine.NotificationManager.Notify('Loaded testing suite.', 'danger');
Engine.TowerManager.ToggleChoosingTowerLocation('RESET'); Engine.TowerManager.ToggleChoosingTowerLocation('RESET');
Engine.TowerManager.PlaceTower(GameAssets.Towers[1], 8, 10, GameAssets.Towers[0].behaviour, true); Engine.TowerManager.PlaceTower(GameAssets.Towers[1], 6, 10, GameAssets.Towers[1].behaviour, true);
for (let i = 0; i < 29; i++) { for (let i = 0; i < 29; i++) {
this.GameScene.MissionStats.giveGem(new Gem(i % 4), true); this.GameScene.MissionStats.giveGem(new Gem(i % 4), true);
} }
@ -41,7 +45,6 @@ export class Engine {
export default class GameMaster { export default class GameMaster {
public currentScene: Scene; public currentScene: Scene;
private GameObjects: GameObject[] = [];
constructor() { constructor() {
Engine.GameMaster = this; Engine.GameMaster = this;
@ -61,9 +64,6 @@ export default class GameMaster {
if (this.currentScene) { if (this.currentScene) {
this.currentScene.destroy(); this.currentScene.destroy();
} }
this.GameObjects.forEach((element) => {
element.destroy();
});
this.currentScene = newScene; this.currentScene = newScene;
this.currentScene.init(); this.currentScene.init();
} }

View File

@ -68,11 +68,14 @@ export type TowerStatsDefinition = {
gemSlotsAmount: number; gemSlotsAmount: number;
cost: number; cost: number;
range: number; range: number;
timeToLive: number;
pierce: number;
}; };
export type GemDefinition = { export type GemDefinition = {
name: string; name: string;
description: string; description: string;
color: PIXI.ColorSource;
type: GemType; type: GemType;
totalLevels: number; totalLevels: number;
textures: PIXI.Texture[]; textures: PIXI.Texture[];
@ -92,7 +95,7 @@ export type GenericGemImprovement = {
gemValueUp: number; gemValueUp: number;
}; };
export type PathDefinition = [[row: number, column: number]]; export type PathDefinition = [[column: number, row: number]];
export enum TerrainType { export enum TerrainType {
Restricted = 0, Restricted = 0,

View File

@ -24,6 +24,7 @@ export default abstract class GameObject {
} }
public copyContainerToBB() { public copyContainerToBB() {
if (this.container == null) return null;
this.bb.x = this.container.x; this.bb.x = this.container.x;
this.bb.y = this.container.y; this.bb.y = this.container.y;
this.bb.width = this.container.width; this.bb.width = this.container.width;

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