about summary refs log tree commit diff stats
path: root/html/broughlike
diff options
context:
space:
mode:
authorelioat <elioat@tilde.institute>2024-10-27 11:30:52 -0400
committerelioat <elioat@tilde.institute>2024-10-27 11:30:52 -0400
commit07f6f719e065f11c0addc8fc5ace587d40cd445b (patch)
treec1293e8662470c55eb3b3d4a4fe9131f34a31462 /html/broughlike
parent7f9750cf1e593a02a5c454044172b8f2f451bf4e (diff)
downloadtour-07f6f719e065f11c0addc8fc5ace587d40cd445b.tar.gz
*
Diffstat (limited to 'html/broughlike')
-rw-r--r--html/broughlike/index.html41
1 files changed, 34 insertions, 7 deletions
diff --git a/html/broughlike/index.html b/html/broughlike/index.html
index e0028a0..c530919 100644
--- a/html/broughlike/index.html
+++ b/html/broughlike/index.html
@@ -67,8 +67,10 @@
             pentagon: 'blueviolet', 
             player: 'rgba(0, 237, 209, ',
             enemy: 'rgba(255, 155, 28, ',
+            boss: 'rgba(255, 14, 0, ',
             combatDotPlayer: '#00edd1',
-            combatDotEnemy: '#ff731c'
+            combatDotEnemy: '#ff731c',
+            combatDotBoss: '#b70030'
         };
 
         const GRID_SIZE = 6;
@@ -76,6 +78,7 @@
         const PLAYER_MAX_HEALTH = 16;
         const PLAYER_BASE_DAMAGE = 1;
         const ENEMY_CHASE_DISTANCE = 4;
+        const ENEMY_BOSS_OCCURRENCE = 10;
         const MIN_ENEMIES_ON_LEVEL = 1;
         const MAX_ENEMIES_ON_LEVEL = 4;
         const MAX_ENEMY_HEALTH = 7;
@@ -133,8 +136,8 @@
             // Generate between 0 and MAX_ENEMIES_ON_LEVEL enemies if the player's score is 4 or lower
             // Generate between MIN_ENEMIES_ON_LEVEL and MAX_ENEMIES_ON_LEVEL enemies if the player's score is 5 or higher
             const numEnemies = player.score > 4 
-                ? Math.floor(Math.random() * (MAX_ENEMIES_ON_LEVEL - MIN_ENEMIES_ON_LEVEL + 1)) + MIN_ENEMIES_ON_LEVEL 
-                : Math.floor(Math.random() * (MAX_ENEMIES_ON_LEVEL + 1));
+            ? Math.floor(Math.random() * (MAX_ENEMIES_ON_LEVEL - MIN_ENEMIES_ON_LEVEL + 1)) + MIN_ENEMIES_ON_LEVEL 
+            : Math.floor(Math.random() * (MAX_ENEMIES_ON_LEVEL + 1));
             for (let i = 0; i < numEnemies; i++) {
                 let enemyX, enemyY;
                 do {
@@ -146,11 +149,33 @@
                     walls.some(wall => wall.x === enemyX && wall.y === enemyY)
                 );
                 enemies.push({
+                    color: COLORS.enemy,
                     x: enemyX,
                     y: enemyY,
                     health: Math.floor(Math.random() * (MAX_ENEMY_HEALTH - MIN_ENEMY_HEALTH + 1)) + MIN_ENEMY_HEALTH
                 });
             }
+
+            // Generate a boss enemy every ENEMY_BOSS_OCCURRENCE levels
+            if (player.score % ENEMY_BOSS_OCCURRENCE === 0 && player.score > 0) {
+                let bossX, bossY;
+                do {
+                    bossX = Math.floor(Math.random() * GRID_SIZE);
+                    bossY = Math.floor(Math.random() * GRID_SIZE);
+                } while (
+                    (bossX === player.x && bossY === player.y) ||
+                    (bossX === exit.x && bossY === exit.y) ||
+                    walls.some(wall => wall.x === bossX && wall.y === bossY) ||
+                    enemies.some(enemy => enemy.x === bossX && enemy.y === bossY)
+                );
+                enemies.push({
+                    isBoss: true,
+                    color: COLORS.boss,
+                    x: bossX,
+                    y: bossY,
+                    health: MAX_ENEMY_HEALTH + 2
+                });
+            }
         }
 
         function generateWallsNaive() {
@@ -463,7 +488,7 @@
 
                 ctx.beginPath();
                 ctx.arc(x, y, radius, 0, 2 * Math.PI);
-                ctx.fillStyle = `${COLORS.enemy}${opacity})`;
+                ctx.fillStyle = `${enemy.color}${opacity})`;
                 ctx.fill();
 
                 drawCharacterBorder(x, y, radius, damageTaken);
@@ -579,7 +604,9 @@
                 const distanceToPlayer = Math.abs(enemy.x - player.x) + Math.abs(enemy.y - player.y);
                 const distanceToExit = Math.abs(enemy.x - exit.x) + Math.abs(enemy.y - exit.y);
         
-                const target = distanceToPlayer <= ENEMY_CHASE_DISTANCE ? player : exit;
+                // If the enemy is closer to the exit than the player, move towards the exit
+                // Bosses are more aggressive about chasing the player
+                const target = distanceToPlayer <= (enemy.isBoss ? ENEMY_CHASE_DISTANCE + 2 : ENEMY_CHASE_DISTANCE) ? player : exit;
                 const path = findPath(enemy, target);
         
                 if (path.length > 1) {
@@ -683,7 +710,7 @@
 
             enemy.health = enemy.health - player.damage;
             player.totalDamageDone++;
-            addCombatDots(cellX, cellY, COLORS.combatDotEnemy); // Add dots for enemy damage
+            addCombatDots(cellX, cellY, enemy.isBoss ? COLORS.combatDotBoss : COLORS.combatDotEnemy); // Add dots for enemy damage
             console.log("Player hit! Enemy health: " + enemy.health);
 
             if (combatAnimationEnabled) {
@@ -729,7 +756,7 @@
             if (player.x === exit.x && player.y === exit.y) {
                 player.score += 1;
                 player.damage = PLAYER_BASE_DAMAGE;
-                console.group("Level complete! " + player.score);
+                console.groupCollapsed("Level complete! " + player.score);
                 console.log("Score: " + player.score);
                 console.log("Current health: " + player.health);
                 console.log("Distance Traveled: " + player.cellsTraveled);