let
game_tick = 0,
game_time = 0.016,
game_real_time_last,
game_message_timeout = 0,
game_entities,
game_entities_enemies,
game_entities_friendly,
game_entity_player,
game_map_index,
game_jump_to_next_level,
game_init = (map_index) => {
ts.style.display = 'none',
game_entities = [];
game_entities_enemies = [];
game_entities_friendly = [];
game_map_index = map_index;
map_init(map_data[game_map_index]);
},
game_next_level = () => {
game_jump_to_next_level = 1;
},
game_spawn = (type, pos, p1, p2) => {
let entity = new (type)(pos, p1, p2)
game_entities.push(entity);
return entity;
},
game_show_message = (text) => {
msg.textContent = text;
msg.style.display = 'block';
clearTimeout(game_message_timeout);
game_message_timeout = setTimeout(()=>msg.style.display = 'none', 2000);
},
title_show_message = (msg, sub = '') => {
ts.innerHTML = '
'+msg+'
' + sub;
ts.style.display = 'block';
},
game_run = (time_now) => {
requestAnimationFrame(game_run);
time_now *= 0.001;
game_tick = Math.min((time_now - (game_real_time_last||time_now)),0.05);
game_real_time_last = time_now;
game_time += game_tick;
r_prepare_frame(0.1, 0.2, 0.5);
// Update and render entities
let alive_entities = [];
for (let entity of game_entities) {
if (!entity._dead) {
entity._update();
alive_entities.push(entity);
}
}
game_entities = alive_entities;
map_draw();
r_end_frame();
// Reset mouse movement and buttons that should be pressed, not held.
mouse_x = mouse_y = 0;
keys[key_next] = keys[key_prev] = 0;
if (game_jump_to_next_level) {
game_jump_to_next_level = 0;
game_map_index++;
if (game_map_index == 2) {
title_show_message('THE END', 'THANKS FOR PLAYING ❤');
h.textContent = a.textContent = '';
game_entity_player._dead = 1;
// Set camera position for end screen
r_camera = vec3(1856,784,2272);
r_camera_yaw = 0;
r_camera_pitch = 0.5;
}
else {
game_init(game_map_index);
}
}
};