Working on missions

This commit is contained in:
Dalibor Čarapić 2025-02-07 11:44:41 +01:00
parent 93da72f55c
commit 465b420461
24 changed files with 1196 additions and 25 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 116 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],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 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": [
[
[8, 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]
]
]
},
"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,99 @@
{
"name": "The Turn",
"description": "A winding path presents new defensive challenges. Watch out for quick enemies!",
"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],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 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],
[5, 8],
[6, 8],
[7, 8],
[8, 8],
[9, 8],
[10, 8],
[11, 8],
[12, 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]
]
]
},
"rounds": [
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 1000,
"creeps": [0, 0, 0, 0]
},
{
"firstCreepSpawnTick": 5000,
"spawnIntervalTicks": 800,
"creeps": [1, 1, 1]
}
],
"offeredGems": [0, 1]
},
{
"waves": [
{
"firstCreepSpawnTick": 500,
"spawnIntervalTicks": 800,
"creeps": [0, 1, 0, 1, 0]
},
{
"firstCreepSpawnTick": 5000,
"spawnIntervalTicks": 600,
"creeps": [1, 1, 1, 1]
}
],
"offeredGems": [0, 1, 2]
}
]
}

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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 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": [
[
[8, 0],
[8, 1],
[8, 2],
[8, 3],
[8, 4],
[8, 5],
[8, 6],
[8, 7],
[8, 8],
[7, 8],
[6, 8],
[5, 8],
[4, 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]
],
[
[8, 0],
[8, 1],
[8, 2],
[8, 3],
[8, 4],
[8, 5],
[8, 6],
[8, 7],
[8, 8],
[9, 8],
[10, 8],
[11, 8],
[12, 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]
]
]
},
"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,191 @@
{
"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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 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],
[13, 4],
[14, 4],
[15, 4],
[16, 4],
[16, 5],
[16, 6],
[16, 7],
[16, 8],
[16, 9],
[16, 10],
[16, 11],
[16, 12],
[16, 13],
[16, 14],
[16, 15],
[16, 16],
[16, 17],
[16, 18],
[16, 19],
[16, 20],
[16, 21],
[16, 22],
[16, 23],
[16, 24]
],
[
[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],
[4, 13],
[4, 14],
[4, 15],
[4, 16],
[4, 17],
[4, 18],
[4, 19],
[4, 20],
[4, 21],
[4, 22],
[4, 23],
[4, 24]
],
[
[0, 12],
[1, 12],
[2, 12],
[3, 12],
[4, 12],
[5, 12],
[6, 12],
[7, 12],
[8, 12],
[9, 12],
[10, 12],
[11, 12],
[12, 12],
[13, 12],
[14, 12],
[15, 12],
[16, 12],
[16, 13],
[16, 14],
[16, 15],
[16, 16],
[16, 17],
[16, 18],
[16, 19],
[16, 20],
[16, 21],
[16, 22],
[16, 23],
[16, 24]
]
]
},
"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]
},
{
"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,202 @@
{
"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": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 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, 3],
[1, 3],
[2, 3],
[3, 3],
[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],
[8, 13],
[8, 14],
[8, 15],
[8, 16],
[8, 17],
[8, 18],
[8, 19],
[8, 20],
[8, 21],
[8, 22],
[8, 23],
[8, 24]
],
[
[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],
[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]
],
[
[0, 13],
[1, 13],
[2, 13],
[3, 13],
[4, 13],
[4, 14],
[4, 15],
[4, 16],
[4, 17],
[4, 18],
[4, 19],
[4, 20],
[5, 20],
[6, 20],
[7, 20],
[8, 20],
[9, 20],
[10, 20],
[11, 20],
[12, 20],
[13, 20],
[14, 20],
[15, 20],
[16, 20],
[16, 21],
[16, 22],
[16, 23],
[16, 24]
]
]
},
"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,221 @@
{
"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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 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": [
[
[8, 0],
[8, 1],
[8, 2],
[8, 3],
[8, 4],
[8, 5],
[8, 6],
[8, 7],
[8, 8],
[7, 8],
[6, 8],
[5, 8],
[4, 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]
],
[
[8, 0],
[8, 1],
[8, 2],
[8, 3],
[8, 4],
[8, 5],
[8, 6],
[8, 7],
[8, 8],
[9, 8],
[10, 8],
[11, 8],
[12, 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]
],
[
[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],
[16, 9],
[16, 10],
[16, 11],
[16, 12],
[16, 13],
[16, 14],
[16, 15],
[16, 16],
[16, 17],
[16, 18],
[16, 19],
[16, 20],
[16, 21],
[16, 22],
[16, 23],
[16, 24]
]
]
},
"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

@ -3,8 +3,10 @@
"height": 4300, "height": 4300,
"width": 2 "width": 2
}, },
"activeFile": "Mission011.tmx", "activeFile": "tiled/02_the_turn.tmx",
"expandedProjectPaths": [ "expandedProjectPaths": [
"assets/missions",
"tiled",
"." "."
], ],
"file.lastUsedOpenFilter": "All Files (*)", "file.lastUsedOpenFilter": "All Files (*)",
@ -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,13 +38,61 @@
"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.5,
"scaleInEditor": 1 "scaleInEditor": 1
},
"tiled/01_first_steps.tmx": {
"scale": 1.6494375,
"selectedLayer": 0,
"viewCenter": {
"x": 799.9696866355956,
"y": 544.1248910613466
}
},
"tiled/02_the_turn.tmx": {
"scale": 1.6494375,
"selectedLayer": 0,
"viewCenter": {
"x": 799.9696866355956,
"y": 544.1248910613466
}
},
"tiled/03_fork_in_the_road.tmx": {
"scale": 1.6494375,
"selectedLayer": 0,
"viewCenter": {
"x": 799.9696866355956,
"y": 544.1248910613466
}
},
"tiled/04_crossroads.tmx": {
"scale": 1.6494375,
"selectedLayer": 0,
"viewCenter": {
"x": 799.9696866355956,
"y": 544.1248910613466
}
},
"tiled/05_the_maze.tmx": {
"scale": 1.6494375,
"selectedLayer": 0,
"viewCenter": {
"x": 799.9696866355956,
"y": 544.1248910613466
}
},
"tiled/Mission01.tmx": {
"scale": 0.5,
"selectedLayer": 0,
"viewCenter": {
"x": 799,
"y": 543
}
} }
}, },
"last.externalTilesetPath": "/home/koneko/Programing/js/towerdefense/public", "last.externalTilesetPath": "/home/koneko/Programing/js/towerdefense/public",
@ -50,17 +100,22 @@
"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", "Mission011.tmx",
"Mission011.tmx" "tiled/Mission01.tmx",
"tiled/02_the_turn.tmx",
"tiled/01_first_steps.tmx"
], ],
"project": "maps.tiled-project", "project": "maps.tiled-project",
"recentFiles": [ "recentFiles": [
"Tileset.tsx",
"Mission011.tmx", "Mission011.tmx",
"tiled/Mission01.tmx",
"tiled/01_first_steps.tmx",
"tiled/02_the_turn.tmx",
"Tileset.tsx",
"Mission01.tmx", "Mission01.tmx",
"/home/koneko/dumping/tiles/TiledTDThree64.tmx" "C:/home/koneko/dumping/tiles/TiledTDThree64.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,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
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,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,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,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
18,18,18,18,18,18,18,18,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,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,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
18,18,18,18,18,18,18,18,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,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,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
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,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
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,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,18,18,18,18,18,18,18,18,18
</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,
18,18,18,18,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
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,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
18,18,18,18,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,18,18,18,18,18,
15,15,15,15,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,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,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
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,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,18,18,18,18,18,18,18,18,18,
15,15,15,15,15,15,15,15,15,15,15,15,18,15,15,15,18,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

@ -35,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[];
@ -152,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/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');
} }
private static async LoadTowers() { private static async LoadTowers() {
@ -172,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

@ -13,12 +13,18 @@ export default class HighScoreDialog extends ModalDialogBase {
private dialogCaption: PIXI.Text; private dialogCaption: PIXI.Text;
private highScore: HighScoreManager; private highScore: HighScoreManager;
constructor(missionName: string, nextMissionAvailable: boolean) { constructor(missionName: string, retryPossible: boolean, nextMissionAvailable: boolean) {
super( super(
nextMissionAvailable [
? [HighScoreDialogButtons.Retry, HighScoreDialogButtons.NextMission, HighScoreDialogButtons.MainMenu] ...(retryPossible ? [HighScoreDialogButtons.Retry] : []),
: [HighScoreDialogButtons.Retry, HighScoreDialogButtons.MainMenu], ...(nextMissionAvailable ? [HighScoreDialogButtons.NextMission] : []),
nextMissionAvailable ? HighScoreDialogButtons.NextMission : HighScoreDialogButtons.Retry, HighScoreDialogButtons.MainMenu,
],
retryPossible
? HighScoreDialogButtons.Retry
: nextMissionAvailable
? HighScoreDialogButtons.NextMission
: HighScoreDialogButtons.MainMenu,
HighScoreDialogButtons.MainMenu HighScoreDialogButtons.MainMenu
); );
this.highScore = new HighScoreManager(missionName); this.highScore = new HighScoreManager(missionName);

View File

@ -247,7 +247,11 @@ export class GameScene extends Scene {
private async ShowEndgameDialog(lost) { private async ShowEndgameDialog(lost) {
const endGameDialog = new EndGameDialog(this.mission.name, this.MissionStats, lost); const endGameDialog = new EndGameDialog(this.mission.name, this.MissionStats, lost);
await endGameDialog.show(); await endGameDialog.show();
const highScore = new HighScoreDialog(this.mission.name, this.missionIndex + 1 < GameAssets.Missions.length); const highScore = new HighScoreDialog(
this.mission.name,
lost,
!lost && this.missionIndex + 1 < GameAssets.Missions.length
);
const result = await highScore.show(); const result = await highScore.show();
if (result === HighScoreDialogButtons.MainMenu) { if (result === HighScoreDialogButtons.MainMenu) {
this.ReturnToMain(); this.ReturnToMain();