diff --git a/CREDITS b/CREDITS index 3e1875f..7079775 100644 --- a/CREDITS +++ b/CREDITS @@ -1,3 +1,6 @@ +Tombstone image from Scary PNGs by Vecteezy +https://www.vecteezy.com/free-png/scary + Huge Thanks to Python for being the programming language used in this app. https://www.python.org/ diff --git a/static/graphics/tombstone.png b/static/graphics/tombstone.png new file mode 100644 index 0000000..81b3eba Binary files /dev/null and b/static/graphics/tombstone.png differ diff --git a/static/js/pumpkin_memory.js b/static/js/pumpkin_memory.js index 9f8872c..e8f5645 100644 --- a/static/js/pumpkin_memory.js +++ b/static/js/pumpkin_memory.js @@ -67,15 +67,30 @@ function setup_game() { revealed = []; } + let best_time = Number(localStorage.getItem("pumpkin_memory_best_time")) || 99999; + let first_time = best_time == 99999; + + const best_time_display = (best_time == 99999) ? "None" : `${best_time}s`; const elapsed = performance.now() - start; - const timer_label = create_label(520, 5, `Time spent: ${(elapsed / 1000).toFixed(1)} s`); + const timer_label = create_label(520, 5, `Time spent: ${(elapsed / 1000).toFixed(1)}s Best Time: ${best_time_display}`); + const timer_interval_id = setInterval(() => { const elapsed = performance.now() - start; - timer_label.text = `Time spent: ${(elapsed / 1000).toFixed(1)} s` + if (first_time) { + best_time = (elapsed / 1000).toFixed(1); + } + + timer_label.text = `Time spent: ${(elapsed / 1000).toFixed(1)}s Best Time: ${best_time}s` }, 100); if (pumpkin_pairs == found_pairs.length - 1) { - create_label(520, 320, `You win!\nTime took: ${(elapsed / 1000).toFixed(1)} s`, 48); + const elapsed = performance.now() - start; + if ((elapsed / 1000).toFixed(1) < best_time) { + best_time = (elapsed / 1000).toFixed(1); + } + localStorage.setItem(`memory_best_${pumpkin_pairs}`, best_time); + + create_label(520, 320, `You win!\nTime took: ${(elapsed / 1000).toFixed(1)} s Best Time: ${best_time_display}`, 48); return; } diff --git a/static/js/pumpkin_roll.js b/static/js/pumpkin_roll.js index 8992e7a..b69eb0b 100644 --- a/static/js/pumpkin_roll.js +++ b/static/js/pumpkin_roll.js @@ -1,6 +1,27 @@ +function spawn_tombstone() { + const tombstone_width = 150; + const tombstone_height = 150; + const tombstone_sprite = add([ + sprite("tombstone"), + pos(1280 - tombstone_width, 720 - tombstone_height), + scale(0.05), + area(), + "tombstone" + ]); + + tombstone_sprite.onUpdate(() => { + tombstone_sprite.pos.x -= 300 * dt(); + + if (tombstone_sprite.pos.x <= -tombstone_width) { + destroy(tombstone_sprite); + } + }) + return tombstone_sprite; +} + function setup_game() { loadSprite("pumpkin", "/static/graphics/pumpkin.png"); - loadSprite("gravestone", "/static/gravestone.png") + loadSprite("tombstone", "/static/graphics/tombstone.png"); const SETTINGS = { "Graphics": { "Anti-Aliasing": {"type": "bool", "default": true}, @@ -17,22 +38,81 @@ function setup_game() { "Controller Enabled": {"type": "bool", "default": true} } }; + const GRAVITY = 1500; + const JUMP_VELOCITY = -1300; + const GROUND_Y = 670; scene("play", () => { + let score = 0; + let high_score = localStorage.getItem("pumpkin_roll_highscore"); + let game_over = false; + let tombstones = []; + let last_tombstone_spawn = performance.now(); + + const score_label = create_label(480, 10, `Score: ${score} High Score: ${high_score}`); + + if (high_score == null) { + high_score = 0; + } + let pumpkin_sprite = add([ sprite("pumpkin"), pos(50, 670), anchor("center"), - rotate(0) + rotate(0), + area(), + "pumpkin" ]) - - setInterval(() => { - pumpkin_sprite.angle = (pumpkin_sprite.angle + dt() * 720) % 360; - }, 100) - onKeyPress("jump", () => { + pumpkin_sprite.isJumping = false; + create_button(5, 5, 150, 75, "Back", color(127, 127, 127), color(0, 0, 0, 0), scene_lambda("main_menu")) + + onCollide("pumpkin", "tombstone", () => { + if (game_over) return; + game_over = true; + + for (let tombstone of tombstones) { + destroy(tombstone); + } + + create_label(520, 320, `Game Over!\nScore: ${Math.floor(score)}\nHigh Score: ${high_score}`, 48); }) + + pumpkin_sprite.onUpdate(() => { + if (game_over) return; + score += 60 * dt(); + + if (Math.floor(score) > high_score) { + high_score = Math.floor(score); + localStorage.setItem("pumpkin_roll_highscore", high_score); + } + + score_label.text = `Score: ${Math.floor(score)} High Score: ${high_score}`; + + if ((performance.now() - last_tombstone_spawn) >= 2000) { + last_tombstone_spawn = performance.now(); + tombstones.push(spawn_tombstone()); + } + + if (isKeyDown("space") && !pumpkin_sprite.isJumping) { + pumpkin_sprite.vy = JUMP_VELOCITY; + pumpkin_sprite.isJumping = true; + } + + pumpkin_sprite.angle = (pumpkin_sprite.angle + dt() * 270) % 360; + + if (!pumpkin_sprite.isJumping) return; + + pumpkin_sprite.vy += GRAVITY * dt(); + pumpkin_sprite.pos.y += pumpkin_sprite.vy * dt(); + + if (pumpkin_sprite.pos.y >= GROUND_Y) { + pumpkin_sprite.pos.y = GROUND_Y; + pumpkin_sprite.isJumping = false; + pumpkin_sprite.vy = 0; + } + }); }) return ["Pumpkin Roll", SETTINGS];