diff options
Diffstat (limited to 'html/tower/js/mechanics.js')
-rw-r--r-- | html/tower/js/mechanics.js | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/html/tower/js/mechanics.js b/html/tower/js/mechanics.js index 2430ca0..d172025 100644 --- a/html/tower/js/mechanics.js +++ b/html/tower/js/mechanics.js @@ -38,17 +38,32 @@ function updateEnemies() { return false; } - // Projectile collision detection + // Projectile collision detection and damage application const hitByProjectile = gameState.projectiles.some(projectile => { + // Calculate current projectile position based on lifetime + const age = performance.now() - projectile.createdAt; + const progress = Math.min(age / projectile.lifetime, 1); + + const currentX = projectile.startPos.x + (projectile.targetPos.x - projectile.startPos.x) * progress; + const currentY = projectile.startPos.y + (projectile.targetPos.y - projectile.startPos.y) * progress; + const distance = Math.hypot( - enemy.position.x - projectile.startPos.x, - enemy.position.y - projectile.startPos.y + enemy.position.x - currentX, + enemy.position.y - currentY ); - return distance < 0.5; + + if (distance < 0.5) { + // Apply damage when projectile hits + enemy.currentHealth -= projectile.damage; + return true; + } + return false; }); - if (hitByProjectile) { + if (enemy.currentHealth <= 0) { gameState.awardEnemyDestroyed(); + // Create death particles + gameState.particles.push(...createDeathParticles(enemy, cellSize)); return false; } @@ -75,13 +90,21 @@ function updateEnemies() { // Remove projectiles that hit enemies gameState.projectiles = gameState.projectiles.filter(projectile => { + const age = performance.now() - projectile.createdAt; + if (age >= projectile.lifetime) return false; + + const progress = age / projectile.lifetime; + const currentX = projectile.startPos.x + (projectile.targetPos.x - projectile.startPos.x) * progress; + const currentY = projectile.startPos.y + (projectile.targetPos.y - projectile.startPos.y) * progress; + const hitEnemy = gameState.enemies.some(enemy => { const distance = Math.hypot( - enemy.position.x - projectile.startPos.x, - enemy.position.y - projectile.startPos.y + enemy.position.x - currentX, + enemy.position.y - currentY ); return distance < 0.5; }); + return !hitEnemy; }); } @@ -218,18 +241,19 @@ function handleTowerAttack(tower, target, projectiles, particles, timestamp, cel // Create projectile projectiles.push({ - startPos: tower.position, - targetPos: target.position, + startPos: { ...tower.position }, + targetPos: { ...target.position }, createdAt: timestamp, lifetime: 300, - towerType: tower.type + towerType: tower.type, + damage: tower.damage }); // Process special abilities if (tower.special === 'slow') { handleSlowEffect(target, tower, timestamp, particles, cellSize); } else if (tower.special === 'aoe') { - handleAOEEffect(target, tower, enemies, particles, cellSize); + handleAOEEffect(target, tower, gameState.enemies, particles, cellSize); } tower.lastAttackTime = timestamp; |