Spam Keybord & Mouse To Change Direction. Difficulty Increases With Time
A fork of EKG Game: Heart Monitor by sebi089
xxxxxxxxxx
// This program might be offensive😳
// It's based on a meme from a spongebob episode, where
// he plays a game on someones heart monitor in a hospital.
// works on phones too btw
var mfont;
var heart_img;
var music_ogg;
var heart_beep;
var heart_tone;
var heart_shock;
const speed = 1; // to cheat, set this lower
var last_jump = 0.0;
var player_dir = -1;
var player_ps = [];
var map_u = [];
var map_d = [];
var noise_seed;
var heart_rate;
var started_t;
var last_rate_update = 0;
var beats;
const max_lifes = 5;
var lifes = 0;
var highscore;
var total_respawns = 0;
function preload() {
mfont = loadFont("arial_bold.ttf");
heart_img = loadImage("heart.png");
music_ogg = loadSound("geometry_dash.ogg");
heart_tone = loadSound("EKG_tone.ogg");
heart_shock = loadSound("electric_shock.ogg");
heart_beep = loadSound("EKG_beep.ogg");
}
let screen_size;
function setup() {
screen_size = min(windowWidth-30, windowHeight-30);
createCanvas(screen_size, screen_size);
frameRate(60);
textFont(mfont);
// p5.js Sound library has a bug where you can call .play() only limited times before wierd sounds appear. Propaply something overflows and all commands accumulate.
// So keep all audio running and only turn volume up when played (and jump to start). There is 1 second of silenece at the end of a sound effect.
music_ogg.loop();
music_ogg.setVolume(0.0);
heart_tone.loop();
heart_tone.setVolume(0.0);
heart_shock.loop();
heart_shock.setVolume(0.0);
heart_beep.loop();
heart_beep.setVolume(0.0);
spawn();
}
function spawn() {
heart_tone.setVolume(0.0);
play_heart_shock();
music_ogg.jump(0.0);
music_ogg.setVolume(1.0);
if(lifes <= 0) {
highscore = 0.0;
noise_seed = random(0, 9999);
lifes = max_lifes;
}
total_respawns++;
player_off = 0.5;
player_dir = -1;
last_jump = 0.0;
player_ps.length = 0;
player_ps.push([0.0, 0.7]);
player_ps.push([0.65, 0.7]);
player_ps.push([0.65, 0.7]);
map_u.length = 0;
map_u.push([0.0, 0.05]);
map_u.push([1.1, 0.05]);
map_d.length = 0;
map_d.push([0.0, 0.95]);
map_d.push([1.1, 0.95]);
heart_rate = 100;
beats = 0;
started_t = millis();
last_rate_update = started_t;
}
function die(px, py, t_now) {
music_ogg.setVolume(0.0);
heart_tone.setVolume(1.0);
player_ps.push([px, py]);
lifes--;
player_dir = 0;
highscore = max(highscore, 4 * t_now);
}
var heart_shock_t = 0;
var heart_beep_t = 0;
function play_heart_shock() {
heart_shock_t = millis();
heart_shock.jump(0.0);
heart_shock.setVolume(1.0);
}
function play_heart_beep() {
heart_beep_t = millis();
heart_beep.jump(0.0);
heart_beep.setVolume(1.0);
}
function update_audio() {
if(millis() - heart_shock_t > 1000.0) heart_shock.setVolume(0.0);
if(millis() - heart_beep_t > 1000.0) heart_beep.setVolume(0.0);
}
function get_t() {
return (millis() - started_t)*0.001*speed;
}
function get_player_y(t_now) {
if(player_dir == 0) return (player_ps[player_ps.length-1])[1];
let p0 = player_ps[player_ps.length - 2];
let y0 = p0[1];
return y0 + (t_now-last_jump) * player_dir;
}
function make_blockie(y) {
let new_y = floor(y*14)/14.0;
if(new_y < 0.02) new_y = 0.02;
else if(new_y > 0.98) new_y = 0.98;
return new_y;
}
function remove_garbage(arr, time) {
newarr = [];
for(let i = 1; i < arr.length;i++)
{
let p0 = arr[i - 1];
let p1 = arr[i];
if(p1[0] > time)
newarr.push([p0[0], p0[1]]);
}
if(arr.length > 0) {
let p_last = arr[arr.length - 1];
newarr.push([p_last[0], p_last[1]]);
}
return newarr;
}
function on_button() {
return mouseX > 0.3 * width && mouseX < 0.7 * width && mouseY > 0.4 * height && mouseY < 0.6 * height;
}
function draw() {
let t_now = get_t();
// move player
let player_latest = [t_now + 0.65, get_player_y(t_now)];
player_ps[player_ps.length - 1] = player_latest;
// player die ouside bound
let player_out = player_latest[1] < 0.02 || player_latest[1] > 0.98;
// player above upper line
for(let i = 1; i < map_u.length;i++) {
let p0 = map_u[i - 1];
let p1 = map_u[i];
if(p0[0] < player_latest[0] && player_latest[0] < p1[0]) {
let l = (player_latest[0] - p0[0]) / (p1[0] - p0[0]);
let line_y = p0[1] + l*(p1[1]-p0[1]);
if(player_latest[1] < line_y) player_out = true;
break;
}
}
// player below lower line
for(let i = 1;i < map_d.length;i++) {
let p0 = map_d[i - 1];
let p1 = map_d[i ];
if(p0[0] < player_latest[0] && player_latest[0] < p1[0]) {
let l = (player_latest[0] - p0[0]) / (p1[0] - p0[0]);
let line_y = p0[1] + l * (p1[1] - p0[1]);
if(player_latest[1] > line_y) player_out = true;
break;
}
}
// player dies then
if(player_dir != 0 && (player_out)) {
die(player_latest[0], player_latest[1], t_now);
}
let noise_speed = 2.0 + 1.0 / (1.0 + 0.015 * t_now);
let noise_space = 0.40 / (1.0 + 0.015 * t_now);
if(noise_space < 0.2) noise_space = 0.2;
// generate upper map generate
let d_dim = 0.034;
let u_last = map_u[map_u.length - 1];
if(u_last[0] - t_now < 1.0) {
if(random(0.0, 5.0) < 1.0) {
let n = floor(random(1, 4));
for(let u = 0; u < n; u++) {
let py = u_last[1]-d_dim*0.5;
if(random(0,5) < 1.0) py += 0.05;
if(random(0,20) < 1.0) py -= 0.2;
map_u.push([u_last[0] + u * 2 * d_dim, u_last[1] + d_dim * 0.5]);
map_u.push([u_last[0] + d_dim + u * 2 * d_dim, py]);
}
}
let last_y = map_u[map_u.length - 1][1];
let add_x = map_u[map_u.length - 1][0] + 0.16;
let add_y = noise(noise_seed + add_x * noise_speed) - noise_space;
map_u.push([add_x, last_y]);
map_u.push([add_x, make_blockie(add_y)]);
}
// generate lower map
let d_last = map_d[map_d.length - 1];
if(d_last[0] - t_now < 1.0) {
if(random(0.0, 5.0) < 1.0) {
let n = floor(random(1, 7));
for(let u = 0; u < n; u++) {
let py = d_last[1] + d_dim * 0.5;
if(random(0,5) < 1.0) py -= 0.05;
if(random(0,20) < 1.0) py += 0.2;
map_d.push([d_last[0] + u * 2 * d_dim, py]);
map_d.push([d_last[0] + d_dim + u * 2 * d_dim, d_last[1] - d_dim * 0.5]);
}
}
let last_y = map_d[map_d.length-1][1];
let add_x = map_d[map_d.length-1][0] + 0.16;
let add_y = noise(noise_seed + add_x*noise_speed) + noise_space;
map_d.push([add_x, last_y]);
map_d.push([add_x, make_blockie(add_y)]);
}
// delete map that is left bind
if(frameCount%30 == 2) map_u = remove_garbage(map_u, t_now);
if(frameCount%30 == 12) player_ps = remove_garbage(player_ps, t_now);
if(frameCount%30 == 22) map_d = remove_garbage(map_d, t_now);
// old looking tube screen
background(75, 121, 144, 255);
fill(0, 36, 60, 255);
let pad = 5.0;
noStroke();
rect(pad, pad, width - 2 * pad, height - 2 * pad, 0.10 * min(width, height));
// render map
stroke(120, 168, 108, 255);
for(let i = 1; i < map_u.length;i++) {
let p0 = map_u[i-1];
let p1 = map_u[i ];
linef(p0[0] - t_now, p0[1], p1[0] - t_now, p1[1]);
}
for(let i = 1; i < map_d.length;i++) {
let p0 = map_d[i - 1];
let p1 = map_d[i ];
linef(p0[0] - t_now, p0[1], p1[0] - t_now, p1[1]);
}
// info render, hearrate, tip
textSize(min(width, height) * 0.07);
fill(209, 43, 29, 255);
strokeWeight(1);
stroke(209, 43, 29, 255);
textAlign(RIGHT, TOP);
if(millis() - last_rate_update > 1000 && player_dir != 0) {
heart_rate = Math.floor(speed * 60.0 * beats / t_now);
last_rate_update = millis();
}
text(""+heart_rate, width - 30, 30);
if(t_now < 1.0 && highscore < 15 && total_respawns < 10 && total_respawns > 0) {
textAlign(LEFT, BOTTOM);
text("Mouse + Keyboard", (0.065) * width, height*0.975);
}
// render respawn screen
if(player_dir == 0) {
noStroke();
fill(0);
rect(0.2 * width, 0.5 * height - 0.5 * 0.05 * min(width, height), 0.6 * width, 30 + 0.05 * min(width, height), 0.03 * 0.4 * min(width, height));
fill(255);
if(on_button())
fill(200);
textAlign(CENTER, CENTER);
noStroke();
textSize(min(width, height)*0.05);
if(lifes > 0)
text("Next Patient", 0.5*width, 0.5*height);
else{
fill(0);
rect(0.2 * width, min(width, height) * 0.05 + 0.5 * height - 0.5 * 0.05 * min(width, height), 0.6 * width, 30 + 0.05 * min(width, height), 0.03 * 0.4 * min(width, height));
fill(255,0,0);
text("Hospital is bankrupt!", 0.5 * width, 0.5 * height);
text("Score: "+floor(highscore), 0.5 * width, 0.5 * height + min(width, height) * 0.05);
}
}
// render hearts
for(let i = 0; i < lifes;i++) image(heart_img, 50+70*i, 50);
// render player
strokeWeight(max(1, screen_size*0.01));
stroke(209, 43, 29, 255);
for(let i = 1; i < player_ps.length;i++) {
let p0 = player_ps[i - 1];
let p1 = player_ps[i ];
linef(p0[0] - t_now, p0[1], p1[0] - t_now, p1[1]);
}
noStroke();
fill(209, 43, 29, 30);
let ulti_player = player_ps[player_ps.length - 1];
for(r = 23.0; r > 0;r -= 1.0) ellipse( (ulti_player[0] - t_now)*width, ulti_player[1] * height, r, r);
update_audio();
}
function linef(x1, y1, x2, y2) {
line(x1*width, y1*height, x2*width, y2*height);
}
function user_input() {
if(player_dir != 0) {
beats++;
let now = get_t();
last_jump = now;
let pp = player_ps[player_ps.length - 1];
player_ps.push([pp[0], pp[1]]);
if(player_dir == 1) player_dir = -1;
else if(player_dir == -1) player_dir = 1;
play_heart_beep();
}else if(on_button()) {
spawn();
}
}
let input_lock = false;
function mouseClicked() {
if(!input_lock) {
input_lock = true;
user_input();
input_lock = false;
}
}
function keyPressed() {
if(!input_lock) {
input_lock = true;
user_input();
input_lock = false;
}
}
document.addEventListener('contextmenu', event => event.preventDefault()); // disable right click menu