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); } } };