diff --git a/public/assets/maps/01_first_steps.png b/public/assets/maps/01_first_steps.png
new file mode 100644
index 0000000..4cedff4
Binary files /dev/null and b/public/assets/maps/01_first_steps.png differ
diff --git a/public/assets/maps/02_the_turn.png b/public/assets/maps/02_the_turn.png
new file mode 100644
index 0000000..cd12c7c
Binary files /dev/null and b/public/assets/maps/02_the_turn.png differ
diff --git a/public/assets/maps/03_fork_in_the_road.png b/public/assets/maps/03_fork_in_the_road.png
new file mode 100644
index 0000000..46a7266
Binary files /dev/null and b/public/assets/maps/03_fork_in_the_road.png differ
diff --git a/public/assets/maps/04_crossroads.png b/public/assets/maps/04_crossroads.png
new file mode 100644
index 0000000..d7d2993
Binary files /dev/null and b/public/assets/maps/04_crossroads.png differ
diff --git a/public/assets/maps/05_the_maze.png b/public/assets/maps/05_the_maze.png
new file mode 100644
index 0000000..63db43b
Binary files /dev/null and b/public/assets/maps/05_the_maze.png differ
diff --git a/public/assets/maps/06_multiple_fronts.png b/public/assets/maps/06_multiple_fronts.png
new file mode 100644
index 0000000..bb81ed9
Binary files /dev/null and b/public/assets/maps/06_multiple_fronts.png differ
diff --git a/public/assets/maps/mission_01.png b/public/assets/maps/mission_01.png
index 6d14258..cd31cf8 100644
Binary files a/public/assets/maps/mission_01.png and b/public/assets/maps/mission_01.png differ
diff --git a/public/assets/missions/01_first_steps.json b/public/assets/missions/01_first_steps.json
new file mode 100644
index 0000000..6ace830
--- /dev/null
+++ b/public/assets/missions/01_first_steps.json
@@ -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]
+ }
+ ]
+}
diff --git a/public/assets/missions/02_the_turn.json b/public/assets/missions/02_the_turn.json
new file mode 100644
index 0000000..6e4e207
--- /dev/null
+++ b/public/assets/missions/02_the_turn.json
@@ -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]
+ }
+ ]
+}
diff --git a/public/assets/missions/03_fork_in_the_road.json b/public/assets/missions/03_fork_in_the_road.json
new file mode 100644
index 0000000..ff4b9e7
--- /dev/null
+++ b/public/assets/missions/03_fork_in_the_road.json
@@ -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]
+ }
+ ]
+}
diff --git a/public/assets/missions/04_crossroads.json b/public/assets/missions/04_crossroads.json
new file mode 100644
index 0000000..75f356f
--- /dev/null
+++ b/public/assets/missions/04_crossroads.json
@@ -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]
+ }
+ ]
+}
diff --git a/public/assets/missions/05_the_maze.json b/public/assets/missions/05_the_maze.json
new file mode 100644
index 0000000..7db8bb5
--- /dev/null
+++ b/public/assets/missions/05_the_maze.json
@@ -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]
+ }
+ ]
+}
diff --git a/public/assets/missions/06_multiple_fronts.json b/public/assets/missions/06_multiple_fronts.json
new file mode 100644
index 0000000..2de19b2
--- /dev/null
+++ b/public/assets/missions/06_multiple_fronts.json
@@ -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]
+ }
+ ]
+}
diff --git a/public/maps.tiled-session b/public/maps.tiled-session
index abcd439..41809c3 100644
--- a/public/maps.tiled-session
+++ b/public/maps.tiled-session
@@ -3,8 +3,10 @@
"height": 4300,
"width": 2
},
- "activeFile": "Mission011.tmx",
+ "activeFile": "tiled/02_the_turn.tmx",
"expandedProjectPaths": [
+ "assets/missions",
+ "tiled",
"."
],
"file.lastUsedOpenFilter": "All Files (*)",
@@ -16,7 +18,7 @@
"scaleInDock": 0.33,
"scaleInEditor": 1
},
- "/home/koneko/dumping/tiles/TiledTDThree64.tmx": {
+ "C:/home/koneko/dumping/tiles/TiledTDThree64.tmx": {
"scale": 0.187625,
"selectedLayer": 0,
"viewCenter": {
@@ -36,13 +38,61 @@
"scale": 0.5,
"selectedLayer": 0,
"viewCenter": {
- "x": 570,
- "y": 448
+ "x": 959,
+ "y": 543
}
},
"Tileset.tsx": {
"scaleInDock": 0.5,
"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",
@@ -50,17 +100,22 @@
"map.lastUsedFormat": "tmx",
"map.tileHeight": 64,
"map.tileWidth": 64,
- "map.width": 30,
+ "map.width": 25,
"openFiles": [
- "Tileset.tsx",
- "Mission011.tmx"
+ "Mission011.tmx",
+ "tiled/Mission01.tmx",
+ "tiled/02_the_turn.tmx",
+ "tiled/01_first_steps.tmx"
],
"project": "maps.tiled-project",
"recentFiles": [
- "Tileset.tsx",
"Mission011.tmx",
+ "tiled/Mission01.tmx",
+ "tiled/01_first_steps.tmx",
+ "tiled/02_the_turn.tmx",
+ "Tileset.tsx",
"Mission01.tmx",
- "/home/koneko/dumping/tiles/TiledTDThree64.tmx"
+ "C:/home/koneko/dumping/tiles/TiledTDThree64.tmx"
],
"tileset.lastUsedFilter": "Tiled tileset files (*.tsx *.xml)"
}
diff --git a/public/tiled/01_first_steps.tmx b/public/tiled/01_first_steps.tmx
new file mode 100644
index 0000000..fd54ac7
--- /dev/null
+++ b/public/tiled/01_first_steps.tmx
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/public/tiled/02_the_turn.tmx b/public/tiled/02_the_turn.tmx
new file mode 100644
index 0000000..bc35bf9
--- /dev/null
+++ b/public/tiled/02_the_turn.tmx
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/public/tiled/03_fork_in_the_road.tmx b/public/tiled/03_fork_in_the_road.tmx
new file mode 100644
index 0000000..330bcc7
--- /dev/null
+++ b/public/tiled/03_fork_in_the_road.tmx
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/public/tiled/04_crossroads.tmx b/public/tiled/04_crossroads.tmx
new file mode 100644
index 0000000..e7082d2
--- /dev/null
+++ b/public/tiled/04_crossroads.tmx
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/public/tiled/05_the_maze.tmx b/public/tiled/05_the_maze.tmx
new file mode 100644
index 0000000..e5e0771
--- /dev/null
+++ b/public/tiled/05_the_maze.tmx
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/public/tiled/06_multiple_fronts.tmx b/public/tiled/06_multiple_fronts.tmx
new file mode 100644
index 0000000..051a5d0
--- /dev/null
+++ b/public/tiled/06_multiple_fronts.tmx
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/public/tiled/Mission01.tmx b/public/tiled/Mission01.tmx
new file mode 100644
index 0000000..17914fa
--- /dev/null
+++ b/public/tiled/Mission01.tmx
@@ -0,0 +1,25 @@
+
+
diff --git a/src/classes/Assets.ts b/src/classes/Assets.ts
index ea3f2c5..1abebbf 100644
--- a/src/classes/Assets.ts
+++ b/src/classes/Assets.ts
@@ -35,7 +35,7 @@ export default class GameAssets {
public static PlusIconTexture: PIXI.Texture;
public static GemAmountIcons: PIXI.Texture[] = [];
- public static Missions: MissionDefinition[];
+ public static Missions: MissionDefinition[] = [];
public static MissionBackgrounds: PIXI.Texture[] = [];
public static Towers: TowerDefinition[];
public static Creeps: CreepDefinition[];
@@ -152,7 +152,13 @@ export default class GameAssets {
private static async LoadMissions() {
// 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() {
@@ -172,13 +178,8 @@ export default class GameAssets {
private static async LoadMission(missionUrl: string) {
const res = await fetch(missionUrl);
const mission = await res.json();
- await this.LoadBackground(mission.mapImage.url);
- return mission;
- }
-
- private static async LoadBackground(backgroundUrl: string) {
- let index = this.MissionBackgrounds.length - 1;
- if (index == -1) index = 0;
- this.MissionBackgrounds[index] = await this.Load(backgroundUrl);
+ console.log(`Loading mission: ${missionUrl} [${mission.name} / ${mission.mapImage.url}]`);
+ GameAssets.Missions.push(mission);
+ GameAssets.MissionBackgrounds.push(await this.Load(mission.mapImage.url));
}
}
diff --git a/src/classes/gui/HighScoreDialog.ts b/src/classes/gui/HighScoreDialog.ts
index 082631a..6a3220b 100644
--- a/src/classes/gui/HighScoreDialog.ts
+++ b/src/classes/gui/HighScoreDialog.ts
@@ -13,12 +13,18 @@ export default class HighScoreDialog extends ModalDialogBase {
private dialogCaption: PIXI.Text;
private highScore: HighScoreManager;
- constructor(missionName: string, nextMissionAvailable: boolean) {
+ constructor(missionName: string, retryPossible: boolean, nextMissionAvailable: boolean) {
super(
- nextMissionAvailable
- ? [HighScoreDialogButtons.Retry, HighScoreDialogButtons.NextMission, HighScoreDialogButtons.MainMenu]
- : [HighScoreDialogButtons.Retry, HighScoreDialogButtons.MainMenu],
- nextMissionAvailable ? HighScoreDialogButtons.NextMission : HighScoreDialogButtons.Retry,
+ [
+ ...(retryPossible ? [HighScoreDialogButtons.Retry] : []),
+ ...(nextMissionAvailable ? [HighScoreDialogButtons.NextMission] : []),
+ HighScoreDialogButtons.MainMenu,
+ ],
+ retryPossible
+ ? HighScoreDialogButtons.Retry
+ : nextMissionAvailable
+ ? HighScoreDialogButtons.NextMission
+ : HighScoreDialogButtons.MainMenu,
HighScoreDialogButtons.MainMenu
);
this.highScore = new HighScoreManager(missionName);
diff --git a/src/scenes/Game.ts b/src/scenes/Game.ts
index 92d90f6..3ad74e3 100644
--- a/src/scenes/Game.ts
+++ b/src/scenes/Game.ts
@@ -247,7 +247,11 @@ export class GameScene extends Scene {
private async ShowEndgameDialog(lost) {
const endGameDialog = new EndGameDialog(this.mission.name, this.MissionStats, lost);
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();
if (result === HighScoreDialogButtons.MainMenu) {
this.ReturnToMain();