diff --git a/public/assets/gui/frame_yellow.png b/public/assets/gui/frame_yellow.png new file mode 100644 index 0000000..48de567 Binary files /dev/null and b/public/assets/gui/frame_yellow.png differ diff --git a/public/assets/json/Towers.json b/public/assets/json/Towers.json index 02ad5a8..82a558e 100644 --- a/public/assets/json/Towers.json +++ b/public/assets/json/Towers.json @@ -4,6 +4,7 @@ "behaviour": "BasicTowerBehaviour", "sprite": "basic_tower", "texture": null, + "projectile": "white", "projectileTextures": [], "projectileTexturesArrayLength": 5, "description": "The building block of society, nothing more basic exists.", @@ -22,6 +23,121 @@ "behaviour": "CircleTowerBehaviour", "sprite": "circle_tower", "texture": null, + "projectile": "blue", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "If you feel a little circular.", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Electric Tower", + "behaviour": "ElectricTowerBehaviour", + "sprite": "electric_tower", + "texture": null, + "projectile": "yellow", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "Think of something", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Quick Tower", + "behaviour": "QuickTowerBehaviour", + "sprite": "quick_tower", + "texture": null, + "projectile": "blue", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Strong Tower", + "behaviour": "StrongTowerBehaviour", + "sprite": "strong_tower", + "texture": null, + "projectile": "white", + "projectileTextures": [], + "projectileTexturesArrayLength": 5, + "description": "", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Rail Tower", + "behaviour": "RailTowerBehaviour", + "sprite": "rail_tower", + "texture": null, + "projectile": "red", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "If you feel a little circular.", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Trapper Tower", + "behaviour": "TrapperTowerBehaviour", + "sprite": "trapper_tower", + "texture": null, + "projectile": "stone", + "projectileTextures": [], + "projectileTexturesArrayLength": 2, + "description": "If you feel a little circular.", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Advanced Tower", + "behaviour": "AdvancedTowerBehaviour", + "sprite": "advanced_tower", + "texture": null, + "projectile": "red", "projectileTextures": [], "projectileTexturesArrayLength": 4, "description": "If you feel a little circular.", diff --git a/public/assets/projectiles/blue/0.png b/public/assets/projectiles/blue/0.png new file mode 100644 index 0000000..5a6892c Binary files /dev/null and b/public/assets/projectiles/blue/0.png differ diff --git a/public/assets/projectiles/blue/1.png b/public/assets/projectiles/blue/1.png new file mode 100644 index 0000000..32ac758 Binary files /dev/null and b/public/assets/projectiles/blue/1.png differ diff --git a/public/assets/projectiles/blue/2.png b/public/assets/projectiles/blue/2.png new file mode 100644 index 0000000..8f646e3 Binary files /dev/null and b/public/assets/projectiles/blue/2.png differ diff --git a/public/assets/projectiles/blue/3.png b/public/assets/projectiles/blue/3.png new file mode 100644 index 0000000..5a6892c Binary files /dev/null and b/public/assets/projectiles/blue/3.png differ diff --git a/public/assets/projectiles/red/0.png b/public/assets/projectiles/red/0.png new file mode 100644 index 0000000..a707566 Binary files /dev/null and b/public/assets/projectiles/red/0.png differ diff --git a/public/assets/projectiles/red/1.png b/public/assets/projectiles/red/1.png new file mode 100644 index 0000000..6fa70ad Binary files /dev/null and b/public/assets/projectiles/red/1.png differ diff --git a/public/assets/projectiles/red/2.png b/public/assets/projectiles/red/2.png new file mode 100644 index 0000000..488b1f0 Binary files /dev/null and b/public/assets/projectiles/red/2.png differ diff --git a/public/assets/projectiles/red/3.png b/public/assets/projectiles/red/3.png new file mode 100644 index 0000000..a707566 Binary files /dev/null and b/public/assets/projectiles/red/3.png differ diff --git a/public/assets/projectiles/stone/0.png b/public/assets/projectiles/stone/0.png new file mode 100644 index 0000000..774f930 Binary files /dev/null and b/public/assets/projectiles/stone/0.png differ diff --git a/public/assets/projectiles/stone/1.png b/public/assets/projectiles/stone/1.png new file mode 100644 index 0000000..553f463 Binary files /dev/null and b/public/assets/projectiles/stone/1.png differ diff --git a/public/assets/projectiles/basic_tower/0.png b/public/assets/projectiles/white/0.png similarity index 100% rename from public/assets/projectiles/basic_tower/0.png rename to public/assets/projectiles/white/0.png diff --git a/public/assets/projectiles/basic_tower/1.png b/public/assets/projectiles/white/1.png similarity index 100% rename from public/assets/projectiles/basic_tower/1.png rename to public/assets/projectiles/white/1.png diff --git a/public/assets/projectiles/basic_tower/2.png b/public/assets/projectiles/white/2.png similarity index 100% rename from public/assets/projectiles/basic_tower/2.png rename to public/assets/projectiles/white/2.png diff --git a/public/assets/projectiles/basic_tower/3.png b/public/assets/projectiles/white/3.png similarity index 100% rename from public/assets/projectiles/basic_tower/3.png rename to public/assets/projectiles/white/3.png diff --git a/public/assets/projectiles/basic_tower/4.png b/public/assets/projectiles/white/4.png similarity index 100% rename from public/assets/projectiles/basic_tower/4.png rename to public/assets/projectiles/white/4.png diff --git a/public/assets/projectiles/circle_tower/0.png b/public/assets/projectiles/yellow/0.png similarity index 100% rename from public/assets/projectiles/circle_tower/0.png rename to public/assets/projectiles/yellow/0.png diff --git a/public/assets/projectiles/circle_tower/1.png b/public/assets/projectiles/yellow/1.png similarity index 100% rename from public/assets/projectiles/circle_tower/1.png rename to public/assets/projectiles/yellow/1.png diff --git a/public/assets/projectiles/circle_tower/2.png b/public/assets/projectiles/yellow/2.png similarity index 100% rename from public/assets/projectiles/circle_tower/2.png rename to public/assets/projectiles/yellow/2.png diff --git a/public/assets/projectiles/circle_tower/3.png b/public/assets/projectiles/yellow/3.png similarity index 100% rename from public/assets/projectiles/circle_tower/3.png rename to public/assets/projectiles/yellow/3.png diff --git a/public/assets/towers/advanced_tower.png b/public/assets/towers/advanced_tower.png new file mode 100644 index 0000000..50f838b Binary files /dev/null and b/public/assets/towers/advanced_tower.png differ diff --git a/public/assets/towers/circle_tower.png b/public/assets/towers/circle_tower.png index 4ec30e0..1265739 100644 Binary files a/public/assets/towers/circle_tower.png and b/public/assets/towers/circle_tower.png differ diff --git a/public/assets/towers/electric_tower.png b/public/assets/towers/electric_tower.png new file mode 100644 index 0000000..fb788c7 Binary files /dev/null and b/public/assets/towers/electric_tower.png differ diff --git a/public/assets/towers/quick_tower.png b/public/assets/towers/quick_tower.png new file mode 100644 index 0000000..1f9e89f Binary files /dev/null and b/public/assets/towers/quick_tower.png differ diff --git a/public/assets/towers/rail_tower.png b/public/assets/towers/rail_tower.png new file mode 100644 index 0000000..535d2a0 Binary files /dev/null and b/public/assets/towers/rail_tower.png differ diff --git a/public/assets/towers/strong_tower.png b/public/assets/towers/strong_tower.png new file mode 100644 index 0000000..ffefec4 Binary files /dev/null and b/public/assets/towers/strong_tower.png differ diff --git a/public/assets/towers/trapper_tower.png b/public/assets/towers/trapper_tower.png new file mode 100644 index 0000000..4ca9dd9 Binary files /dev/null and b/public/assets/towers/trapper_tower.png differ diff --git a/src/classes/Assets.ts b/src/classes/Assets.ts index 0212684..efcc4d8 100644 --- a/src/classes/Assets.ts +++ b/src/classes/Assets.ts @@ -17,6 +17,7 @@ export default class GameAssets { public static RedBackground: PIXI.Texture; public static GreenBackground: PIXI.Texture; public static BlueBackground: PIXI.Texture; + public static YellowBackground: PIXI.Texture; public static Button01Texture: PIXI.Texture; public static Button02Texture: PIXI.Texture; public static ButtonSmallTexture: PIXI.Texture; @@ -105,6 +106,7 @@ export default class GameAssets { this.Load('./assets/gui/frame_red.png').then((texture) => (this.RedBackground = 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_yellow.png').then((texture) => (this.YellowBackground = 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/main_background.jpg').then((texture) => (this.MainBackground = texture)), @@ -186,7 +188,7 @@ export default class GameAssets { for (let idx = 0; idx < this.Towers.length; idx++) { const tower = this.Towers[idx]; for (let i = 0; i < tower.projectileTexturesArrayLength; i++) { - const projTexture = await this.Load(`./assets/projectiles/${tower.sprite}/${i}.png`); + const projTexture = await this.Load(`./assets/projectiles/${tower.projectile}/${i}.png`); tower.projectileTextures[i] = projTexture; } tower.texture = await this.Load(`./assets/towers/${tower.sprite}.png`); diff --git a/src/classes/Definitions.ts b/src/classes/Definitions.ts index 4af3c63..9eef7e5 100644 --- a/src/classes/Definitions.ts +++ b/src/classes/Definitions.ts @@ -56,6 +56,7 @@ export type TowerDefinition = { behaviour: string; sprite: string; description: string; + projectile: string; texture: PIXI.Texture; projectileTextures: PIXI.Texture[]; projectileTexturesArrayLength: number; @@ -123,4 +124,10 @@ export enum GemType { export enum TowerType { Basic = 0, Circle = 1, + Electric = 2, + Quick = 3, + Strong = 4, + Rail = 5, + Trapper = 6, + Advanced = 7, } diff --git a/src/classes/game/Tower.ts b/src/classes/game/Tower.ts index 265b4e3..b9f6d45 100644 --- a/src/classes/game/Tower.ts +++ b/src/classes/game/Tower.ts @@ -7,7 +7,16 @@ import { TowerBehaviours } from './TowerManager'; import Projectile, { calculateAngleToPoint } from './Projectile'; import Creep from './Creep'; import Gem from './Gem'; -import { BasicTowerBehaviour, CircleTowerBehaviour } from './TowerBehaviours'; +import { + AdvancedTowerBehaviour, + BasicTowerBehaviour, + CircleTowerBehaviour, + ElectricTowerBehaviour, + QuickTowerBehaviour, + RailTowerBehaviour, + StrongTowerBehaviour, + TrapperTowerBehaviour, +} from './TowerBehaviours'; export function distance(x1, y1, x2, y2) { return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); @@ -143,6 +152,12 @@ export class Tower extends GameObject { } if (this.behaviour == TowerBehaviours.BasicTowerBehaviour) BasicTowerBehaviour(this, elapsedMS); if (this.behaviour == TowerBehaviours.CircleTowerBehaviour) CircleTowerBehaviour(this, elapsedMS); + if (this.behaviour == TowerBehaviours.ElectricTowerBehaviour) ElectricTowerBehaviour(this, elapsedMS); + if (this.behaviour == TowerBehaviours.QuickTowerBehaviour) QuickTowerBehaviour(this, elapsedMS); + if (this.behaviour == TowerBehaviours.StrongTowerBehaviour) StrongTowerBehaviour(this, elapsedMS); + if (this.behaviour == TowerBehaviours.RailTowerBehaviour) RailTowerBehaviour(this, elapsedMS); + if (this.behaviour == TowerBehaviours.TrapperTowerBehaviour) TrapperTowerBehaviour(this, elapsedMS); + if (this.behaviour == TowerBehaviours.AdvancedTowerBehaviour) AdvancedTowerBehaviour(this, elapsedMS); } public destroy(): void { diff --git a/src/classes/game/TowerBehaviours.ts b/src/classes/game/TowerBehaviours.ts index 8867844..435739a 100644 --- a/src/classes/game/TowerBehaviours.ts +++ b/src/classes/game/TowerBehaviours.ts @@ -112,3 +112,111 @@ export function CircleTowerBehaviour(tower: Tower, elapsedMS: number) { } } } + +export function ElectricTowerBehaviour(tower: Tower, elapsedMS: number) { + computeGemImprovements(tower); + projectileCheck(tower, elapsedMS); + + if (tower.millisecondsUntilNextShot > 0) + tower.millisecondsUntilNextShot -= elapsedMS * Engine.GameScene.gameSpeedMultiplier; + let creepsInRange = tower.GetCreepsInRange(); + if (creepsInRange.length > 0) { + let focus = creepsInRange[0]; + if (tower.millisecondsUntilNextShot <= 0) { + let x = tower.column * Engine.GridCellSize + Engine.GridCellSize / 2; + let y = tower.row * Engine.GridCellSize + Engine.GridCellSize / 2; + tower.millisecondsUntilNextShot = tower.computedCooldown; + tower.Shoot(calculateAngleToPoint(x, y, focus.x, focus.y)); + } + } +} + +export function QuickTowerBehaviour(tower: Tower, elapsedMS: number) { + computeGemImprovements(tower); + projectileCheck(tower, elapsedMS); + + if (tower.millisecondsUntilNextShot > 0) + tower.millisecondsUntilNextShot -= elapsedMS * Engine.GameScene.gameSpeedMultiplier; + let creepsInRange = tower.GetCreepsInRange(); + if (creepsInRange.length > 0) { + let focus = creepsInRange[0]; + if (tower.millisecondsUntilNextShot <= 0) { + let x = tower.column * Engine.GridCellSize + Engine.GridCellSize / 2; + let y = tower.row * Engine.GridCellSize + Engine.GridCellSize / 2; + tower.millisecondsUntilNextShot = tower.computedCooldown; + tower.Shoot(calculateAngleToPoint(x, y, focus.x, focus.y)); + } + } +} + +export function StrongTowerBehaviour(tower: Tower, elapsedMS: number) { + computeGemImprovements(tower); + projectileCheck(tower, elapsedMS); + + if (tower.millisecondsUntilNextShot > 0) + tower.millisecondsUntilNextShot -= elapsedMS * Engine.GameScene.gameSpeedMultiplier; + let creepsInRange = tower.GetCreepsInRange(); + if (creepsInRange.length > 0) { + let focus = creepsInRange[0]; + if (tower.millisecondsUntilNextShot <= 0) { + let x = tower.column * Engine.GridCellSize + Engine.GridCellSize / 2; + let y = tower.row * Engine.GridCellSize + Engine.GridCellSize / 2; + tower.millisecondsUntilNextShot = tower.computedCooldown; + tower.Shoot(calculateAngleToPoint(x, y, focus.x, focus.y)); + } + } +} + +export function RailTowerBehaviour(tower: Tower, elapsedMS: number) { + computeGemImprovements(tower); + projectileCheck(tower, elapsedMS); + + if (tower.millisecondsUntilNextShot > 0) + tower.millisecondsUntilNextShot -= elapsedMS * Engine.GameScene.gameSpeedMultiplier; + let creepsInRange = tower.GetCreepsInRange(); + if (creepsInRange.length > 0) { + let focus = creepsInRange[0]; + if (tower.millisecondsUntilNextShot <= 0) { + let x = tower.column * Engine.GridCellSize + Engine.GridCellSize / 2; + let y = tower.row * Engine.GridCellSize + Engine.GridCellSize / 2; + tower.millisecondsUntilNextShot = tower.computedCooldown; + tower.Shoot(calculateAngleToPoint(x, y, focus.x, focus.y)); + } + } +} + +export function TrapperTowerBehaviour(tower: Tower, elapsedMS: number) { + computeGemImprovements(tower); + projectileCheck(tower, elapsedMS); + + if (tower.millisecondsUntilNextShot > 0) + tower.millisecondsUntilNextShot -= elapsedMS * Engine.GameScene.gameSpeedMultiplier; + let creepsInRange = tower.GetCreepsInRange(); + if (creepsInRange.length > 0) { + let focus = creepsInRange[0]; + if (tower.millisecondsUntilNextShot <= 0) { + let x = tower.column * Engine.GridCellSize + Engine.GridCellSize / 2; + let y = tower.row * Engine.GridCellSize + Engine.GridCellSize / 2; + tower.millisecondsUntilNextShot = tower.computedCooldown; + tower.Shoot(calculateAngleToPoint(x, y, focus.x, focus.y)); + } + } +} + +export function AdvancedTowerBehaviour(tower: Tower, elapsedMS: number) { + computeGemImprovements(tower); + projectileCheck(tower, elapsedMS); + + if (tower.millisecondsUntilNextShot > 0) + tower.millisecondsUntilNextShot -= elapsedMS * Engine.GameScene.gameSpeedMultiplier; + let creepsInRange = tower.GetCreepsInRange(); + if (creepsInRange.length > 0) { + let focus = creepsInRange[0]; + if (tower.millisecondsUntilNextShot <= 0) { + let x = tower.column * Engine.GridCellSize + Engine.GridCellSize / 2; + let y = tower.row * Engine.GridCellSize + Engine.GridCellSize / 2; + tower.millisecondsUntilNextShot = tower.computedCooldown; + tower.Shoot(calculateAngleToPoint(x, y, focus.x, focus.y)); + } + } +} diff --git a/src/classes/game/TowerManager.ts b/src/classes/game/TowerManager.ts index 922492a..daeb8aa 100644 --- a/src/classes/game/TowerManager.ts +++ b/src/classes/game/TowerManager.ts @@ -9,6 +9,12 @@ import { GridEvents, TowerEvents } from '../Events'; export enum TowerBehaviours { BasicTowerBehaviour = 'BasicTowerBehaviour', CircleTowerBehaviour = 'CircleTowerBehaviour', + ElectricTowerBehaviour = 'ElectricTowerBehaviour', + QuickTowerBehaviour = 'QuickTowerBehaviour', + StrongTowerBehaviour = 'StrongTowerBehaviour', + RailTowerBehaviour = 'RailTowerBehaviour', + TrapperTowerBehaviour = 'TrapperTowerBehaviour', + AdvancedTowerBehaviour = 'AdvancedTowerBehaviour', } export default class TowerManager { diff --git a/src/classes/gui/TowerTab.ts b/src/classes/gui/TowerTab.ts index fefd096..d0c7d03 100644 --- a/src/classes/gui/TowerTab.ts +++ b/src/classes/gui/TowerTab.ts @@ -122,10 +122,82 @@ export default class TowerTab extends GuiObject { 70, this.container, GameAssets.RedBackground, - 'Basic Tower', + GameAssets.Towers[0].name, GameAssets.Towers[0].texture ) ); + this.towerButtons.push( + new TowerButton( + 1, + 0, + 70, + 70, + this.container, + GameAssets.RedBackground, + GameAssets.Towers[1].name, + GameAssets.Towers[1].texture + ) + ); + this.towerButtons.push( + new TowerButton( + 2, + 0, + 70, + 70, + this.container, + GameAssets.BlueBackground, + GameAssets.Towers[2].name, + GameAssets.Towers[2].texture + ) + ); + this.towerButtons.push( + new TowerButton( + 3, + 0, + 70, + 70, + this.container, + GameAssets.BlueBackground, + GameAssets.Towers[3].name, + GameAssets.Towers[3].texture + ) + ); + this.towerButtons.push( + new TowerButton( + 0, + 1, + 70, + 70, + this.container, + GameAssets.GreenBackground, + GameAssets.Towers[4].name, + GameAssets.Towers[4].texture + ) + ); + this.towerButtons.push( + new TowerButton( + 1, + 1, + 70, + 70, + this.container, + GameAssets.GreenBackground, + GameAssets.Towers[5].name, + GameAssets.Towers[5].texture + ) + ); + this.towerButtons.push( + new TowerButton( + 2, + 1, + 70, + 70, + this.container, + GameAssets.YellowBackground, + GameAssets.Towers[6].name, + GameAssets.Towers[6].texture + ) + ); this.towerButtons.push( new TowerButton( 3, @@ -133,9 +205,9 @@ export default class TowerTab extends GuiObject { 70, 70, this.container, - GameAssets.GreenBackground, - 'Circle Tower', - GameAssets.Towers[1].texture + GameAssets.YellowBackground, + GameAssets.Towers[7].name, + GameAssets.Towers[7].texture ) ); }