diff --git a/common/npc.js b/common/npc.js index 5a80e43..0850331 100644 --- a/common/npc.js +++ b/common/npc.js @@ -11,13 +11,18 @@ class NPC { this.you = you || uuidv4(); this.type = 'NPC'; - + this.immortal = true; } handleTick(game) { let { entities } = game; - let rEntity = entities[Math.floor(Math.random() * entities.length)]; + let rEntity, i = 0; + + while ((!rEntity || rEntity.type != 'Player') && i < 100) { + rEntity = entities[Math.floor(Math.random() * entities.length)]; + i++; + } this.vel.x += (rEntity.pos.x - this.pos.x) * 0.0001; this.vel.y += (rEntity.pos.y - this.pos.y) * 0.0001; diff --git a/common/player.js b/common/player.js index 5dce097..65f6748 100644 --- a/common/player.js +++ b/common/player.js @@ -68,6 +68,8 @@ class Player { ent.ticks++; + let velness = Math.sqrt(ent.vel.x ** 2 + ent.vel.y ** 2); + for (let target of entities) { if (target.you == ent.you) continue; @@ -79,7 +81,7 @@ class Player { dp /= Math.sqrt(dist + 0.1); if (Math.sqrt(dist) < 128 && 1 / dp < -0.2) { - if (target.type == 'NPC') { + if (target.type == 'NPC' && velness > 0.2) { ent.isMenu = true; } if (target.immortal) continue; diff --git a/static/js/index.js b/static/js/index.js index cce4539..bec2c99 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -13,7 +13,7 @@ const legalTypes = { Player, NPC } -const options = [ +const emojis = [ 'Troll', 'Exit', 'Elec Piano Loop', @@ -98,19 +98,24 @@ class Game extends GameBasic { ctx.restore(); if (player.health <= 0 || player.isMenu) { - ctx.fillStyle = 'rgba(0,0,0,0.5)'; - ctx.fillRect(0, 0, cs, cs); - ctx.fillStyle = 'rgb(255,255,255)'; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.font = "bold 48px sans-serif"; - if (player.health <= 0) ctx.fillText('You died! Click to respawn', cs / 2, cs / 2); - if (player.isMenu) { - let r = Math.floor(Math.abs(player.rot / 1.2) % options.length); - ctx.fillText(`Click to react ${options[r]}`, cs / 2, cs / 2) - ctx.font = "bold 16px sans-serif"; - ctx.fillText(`Wait for options ${options.join(', ')}`, cs / 2, cs / 2 + 50) - } + this.doMenu(); + } + } + doMenu() { + let { ctx, player } = this; + + ctx.fillStyle = 'rgba(0,0,0,0.5)'; + ctx.fillRect(0, 0, cs, cs); + ctx.fillStyle = 'rgb(255,255,255)'; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.font = "bold 48px sans-serif"; + if (player.health <= 0) ctx.fillText('You died! Click to respawn', cs / 2, cs / 2); + if (player.isMenu) { + let r = Math.floor(Math.abs(player.rot / 1.2) % emojis.length); + ctx.fillText(`Click to react ${emojis[r]}`, cs / 2, cs / 2) + ctx.font = "bold 16px sans-serif"; + ctx.fillText(`Wait for emojis ${emojis.join(', ')}`, cs / 2, cs / 2 + 50) } } click() { @@ -121,7 +126,7 @@ class Game extends GameBasic { this.player = new Player(false, true); this.entities.push(this.player); } else if (player.isMenu) { - player.r = Math.floor(Math.abs(player.rot / 1.2) % options.length); + player.r = Math.floor(Math.abs(player.rot / 1.2) % emojis.length); player.isMenu = false; this.sync(); } else { @@ -147,7 +152,7 @@ class Game extends GameBasic { let type = (Object.keys(legalTypes).indexOf(x.type) == -1) ? Player : legalTypes[x.type]; x.handleTick = type.prototype.handleTick; if (x.r != 1) { - let a = new Audio(`assets/${options[x.r]}.wav`); + let a = new Audio(`assets/${emojis[x.r]}.wav`); a.addEventListener('ended', () => { if (x.you == you) { that.player.playing = false;