about summary refs log tree commit diff stats
path: root/html/tower/js/mechanics.js
diff options
context:
space:
mode:
Diffstat (limited to 'html/tower/js/mechanics.js')
-rw-r--r--html/tower/js/mechanics.js46
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;