diff --git a/js/game.js b/js/game.js index 79d1700..ad8f6c0 100644 --- a/js/game.js +++ b/js/game.js @@ -62,6 +62,7 @@ function createInitialState() { let state = createInitialState(); let saveEligible = false; +let scoreSavedThisRun = false; window.addEventListener('keydown', (e) => { if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) e.preventDefault(); @@ -79,6 +80,7 @@ restartBtnEl.addEventListener('click', () => { deathScreenEl.classList.add('hidden'); saveScoreFormEl.classList.add('hidden'); saveEligible = false; + scoreSavedThisRun = false; }); saveScoreFormEl.addEventListener('submit', async (e) => { @@ -93,6 +95,7 @@ saveScoreFormEl.addEventListener('submit', async (e) => { }); saveEligible = false; + scoreSavedThisRun = true; saveScoreFormEl.classList.add('hidden'); await populateLeaderboard(); }); @@ -174,8 +177,8 @@ async function populateLeaderboard() { }); const qualifies = scores.length < 10 || state.score > (scores[scores.length - 1]?.score ?? -1); - saveEligible = qualifies; - saveScoreFormEl.classList.toggle('hidden', !qualifies); + saveEligible = qualifies && !scoreSavedThisRun; + saveScoreFormEl.classList.toggle('hidden', !saveEligible); } async function kill(reason) { @@ -224,16 +227,31 @@ function updateAnts(dt) { } } +const PTERODACTYL_LANES = [ + // low lane: standing dino collides, ducking dino should pass underneath + { y: groundY - 80, height: 28 } +]; + +function getPterodactylHitbox(flyer) { + return { + x: flyer.x + 6, + y: flyer.y + 5, + width: flyer.width - 12, + height: flyer.height - 10 + }; +} + function updatePterodactyls(dt) { if (state.score <= 100) return; state.pteroSpawnTimer -= dt; if (state.pteroSpawnTimer <= 0) { + const lane = PTERODACTYL_LANES[Math.floor(Math.random() * PTERODACTYL_LANES.length)]; state.pterodactyls.push({ x: state.cameraX + canvas.width + 80, - y: groundY - (state.player.standingHeight - 24), + y: lane.y, width: 54, - height: 26, + height: lane.height, vx: -280 }); state.pteroSpawnTimer = 2.2; @@ -242,7 +260,7 @@ function updatePterodactyls(dt) { const p = state.player; for (const flyer of state.pterodactyls) { flyer.x += flyer.vx * dt; - if (intersects(p, flyer)) applyHit('Pterodactyl collision. Duck next time!'); + if (intersects(p, getPterodactylHitbox(flyer))) applyHit('Pterodactyl collision. Duck next time!'); } state.pterodactyls = state.pterodactyls.filter((f) => f.x + f.width > state.cameraX - 150); }