diff --git a/README.md b/README.md new file mode 100644 index 0000000..dfe58a0 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# Alien Rush + +## Project Description + +Alien Rush is a tower defense game built with Phaser 3, where players must defend against waves of alien enemies by strategically placing towers on a grid-based map. The core gameplay revolves around managing resources (gold), selecting appropriate tower types for different enemy threats, and upgrading defenses to survive increasingly difficult waves. + +The game features multiple levels with varying layouts and difficulty progression, including: + +- A main menu system +- Interactive gameplay where players place towers on a grid +- Enemy wave management with different enemy types and behaviors +- Resource management (gold) for purchasing and upgrading towers +- Visual interface showing tower placement options, upgrade menus, and game stats +- Core defense mechanics that decrease when enemies reach the end of paths + +![Alien Rush Screenshot](alien-rush.png) + +## Technologies Used + +This project uses: + +- **JavaScript/ES6+** - Primary programming language for all game logic and functionality +- **Phaser 3** - Game framework providing rendering, physics, input handling, and scene management +- **HTML5 Canvas** - For game rendering and display +- **JSON** - Level data storage with tile-based map configurations + +The codebase follows modern JavaScript practices using ES6 modules for organization. The project structure leverages Phaser's scene system to separate concerns between menu, gameplay, and UI elements. + +## File Structure + +``` +. +├── assets/ # Game assets including maps and images +│ ├── level1.json # First level map data +│ ├── level2.json # Second level map data +│ ├── level3.json # Third level map data +│ └── level4.json # Fourth level map data (incomplete) +├── index.html # Main HTML entry point +├── src/ # Source code directory +│ ├── main.js # Game initialization and configuration +│ ├── scenes/ # Phaser scene classes +│ │ ├── level.js # Core gameplay scene with grid logic +│ │ ├── menu.js # Menu system scene +│ │ └── uiScene.js # User interface management +│ ├── support/ # Game logic helper classes +│ │ ├── enemies.js # Enemy spawning and behavior management +│ │ ├── interfaceManager.js # UI interaction handling +│ │ ├── towerAnims.js # Tower animation setup +│ │ ├── towerManager.js # Tower placement, upgrading, and attack logic +│ │ └── waveManager.js # Wave scheduling and enemy spawn management +└── src/EasyStar.js # Pathfinding library (external dependency) +``` + +The codebase is organized around Phaser's scene system where each major game component has its own dedicated file. The `main.js` initializes the game with configuration, while scenes handle different aspects of gameplay (menu, level, UI). Support files contain specialized logic for enemies, towers, and waves that are utilized by the main scenes. diff --git a/alien-rush.png b/alien-rush.png new file mode 100644 index 0000000..11cff77 Binary files /dev/null and b/alien-rush.png differ diff --git a/assets/level4.json b/assets/level4.json new file mode 100644 index 0000000..e63ff0f --- /dev/null +++ b/assets/level4.json @@ -0,0 +1,112 @@ +{ "compressionlevel":-1, + "height":12, + "infinite":false, + "layers":[ + { + "data":[7, 7, 7, 7, 7, 7, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 11, 11, 11, 7, 7, 7, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 7, 7, 11, 7, 11, 11, 11, 11, 2684354566, 1, 1, 1, 1, 1610612742, 11, 7, 7, 7, + 7, 7, 11, 7, 11, 7, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 11, 7, 7, 7, + 7, 11, 11, 7, 11, 11, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 11, 7, 7, 7, + 7, 11, 7, 7, 7, 11, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 7, 11, 11, 11, 7, 11, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 7, 7, 7, 11, 7, 11, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 7, 7, 7, 11, 11, 11, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1610612748, 2, 2, 2, 2, 2, 2684354572, 7, 7, 7, 7], + "height":12, + "id":1, + "name":"main", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":18, + "x":0, + "y":0 + }, + { + "data":[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, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, + 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 16, 16, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 16, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":12, + "id":2, + "name":"platforms", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":18, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":200, + "tilesets":[ + { + "columns":5, + "firstgid":1, + "image":"terrain2.png", + "imageheight":1000, + "imagewidth":1000, + "margin":0, + "name":"terrain2", + "spacing":0, + "tilecount":25, + "tileheight":200, + "tiles":[ + { + "id":1, + "properties":[ + { + "name":"collides", + "type":"bool", + "value":true + }] + }, + { + "id":3, + "properties":[ + { + "name":"collides", + "type":"bool", + "value":true + }] + }, + { + "id":6, + "properties":[ + { + "name":"collides", + "type":"bool", + "value":true + }] + }, + { + "id":11, + "properties":[ + { + "name":"collides", + "type":"bool", + "value":true + }] + }], + "tilewidth":200 + }], + "tilewidth":200, + "type":"map", + "version":"1.10", + "width":18 +} \ No newline at end of file diff --git a/assets/tilesets/level4.tmx b/assets/tilesets/level4.tmx new file mode 100644 index 0000000..9fd626d --- /dev/null +++ b/assets/tilesets/level4.tmx @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +7,7,7,7,7,7,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +11,11,11,7,7,7,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +7,7,11,7,11,11,11,11,2684354566,1,1,1,1,1610612742,11,7,7,7, +7,7,11,7,11,7,7,1610612748,2,2,2,2,2,2684354572,11,7,7,7, +7,11,11,7,11,11,7,1610612748,2,2,2,2,2,2684354572,11,7,7,7, +7,11,7,7,7,11,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +7,11,11,11,7,11,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +7,7,7,11,7,11,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +7,7,7,11,11,11,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +7,7,7,7,7,7,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +7,7,7,7,7,7,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7, +7,7,7,7,7,7,7,1610612748,2,2,2,2,2,2684354572,7,7,7,7 + + + + +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,0,0,0,0,0,16,0,0,0,0,0, +0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,16,0,0,0,0,0,0,16,0,0,0,0,0, +0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,16,16,16,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,0,0,0,0,0,0, +0,0,16,0,16,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,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,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,0,0,0,0,0,0,0,0,0,0 + + + diff --git a/src/scenes/level.js b/src/scenes/level.js index 6975ee2..3cf7f55 100644 --- a/src/scenes/level.js +++ b/src/scenes/level.js @@ -13,6 +13,7 @@ export class Level extends Phaser.Scene { 1: 'terrain', 2: 'terrain', 3: 'terrain2', + 4: 'terrain2', } } diff --git a/src/support/waveConfig.js b/src/support/waveConfig.js index 2621b10..631a988 100644 --- a/src/support/waveConfig.js +++ b/src/support/waveConfig.js @@ -718,5 +718,245 @@ export const WAVE_CONFIG = { basic4: 20 } } + }, + // Level + 4: { + //Spawn Point + spawnX: 0, + spawnY: 1, + endX: 14, + endY: 4, + // Wave + 1: { + // Schedule + 1: { + begin: 0, + basic1: 5, + }, + 2: { + begin: 15, + basic1: 8, + }, + 3: { + begin: 30, + basic1: 10, + } + }, + // Wave + 2: { + // Schedule + 1: { + begin: 0, + basic1: 8, + basic2: 1 + }, + 2: { + begin: 15, + basic1: 5, + basic2: 2 + }, + 3: { + begin: 30, + basic1: 5, + basic2: 4 + } + }, + // Wave + 3: { + // Schedule + 1: { + begin: 0, + basic2: 5 + }, + 2: { + begin: 15, + basic2: 6 + }, + 3: { + begin: 30, + basic2: 8, + basic3: 1 + } + }, + // Wave + 4: { + // Schedule + 1: { + begin: 0, + basic1: 10, + basic3: 2, + }, + 2: { + begin: 15, + basic1: 8, + basic2: 3, + basic3: 2 + }, + 3: { + begin: 30, + basic3: 4 + } + }, + //Wave + 5: { + //Schedule + 1: { + begin: 0, + basic1: 10, + basic2: 2, + basic3: 1 + }, + 2: { + begin: 15, + advanced1: 1, + }, + 3: { + begin: 25, + basic1: 8, + basic2: 3, + basic3: 2 + }, + 4: { + begin: 35, + basic1: 25 + }, + 5: { + begin: 40, + advanced1: 1 + } + }, + //Wave + 6: { + //Schedule + 1: { + begin: 0, + basic2: 10, + advanced2: 1 + }, + 2: { + begin: 15, + basic1: 20, + }, + 3: { + begin: 25, + basic3: 6, + advanced1: 1 + }, + 4: { + begin: 35, + advanced2: 1 + } + }, + //Wave + 7: { + //Schedule + 1: { + begin: 0, + medium1: 5, + basic3: 5 + }, + 2: { + begin: 15, + basic2: 10, + basic4: 2, + advanced1: 1 + }, + 3: { + begin: 25, + medium1: 6, + medium2: 2 + }, + 4: { + begin: 35, + advanced2: 1 + } + }, + //Wave + 8: { + //Schedule + 1: { + begin: 0, + advanced2: 1, + basic4: 20 + }, + 2: { + begin: 25, + basic2: 10, + medium2: 6, + }, + 3: { + begin: 35, + medium2: 5, + basic4: 15 + }, + 4: { + begin: 45, + advanced1: 1, + basic3: 10 + } + }, + //Wave + 9: { + //Schedule + 1: { + begin: 0, + advanced3: 1, + medium1: 4, + basic4: 6 + }, + 2: { + begin: 25, + basic3: 10, + medium2: 6, + }, + 3: { + begin: 40, + advanced3: 2, + basic4: 15 + }, + 4: { + begin: 55, + medium1: 4, + medium2: 4, + basic4: 20 + } + }, + //Wave + 10: { + //Schedule + 1: { + begin: 0, + advanced3: 2, + advanced1: 2, + medium1: 4, + basic4: 4, + basic3: 4 + }, + 2: { + begin: 25, + advanced2: 2, + medium2: 4, + basic2: 10 + }, + 3: { + begin: 45, + advanced3: 4, + basic4: 20 + }, + 4: { + begin: 50, + advanced1: 1, + advanced2: 1, + basic3: 10, + medium1: 20, + medium2: 10 + }, + 4: { + begin: 60, + medium1: 10, + medium2: 10, + basic4: 20 + } + } } } \ No newline at end of file