std::string client::format_transmission_details() const { return typesafe_sprintf("RTT:\nSent: %x (%x)\nReceived: %x (%x)\nLast sent: %x\nLast received: %x", total_packets_sent(), readable_bytesize(total_bytes_sent()), total_packets_received(), readable_bytesize(total_bytes_received()), readable_bytesize(static_cast<unsigned>(sent_size.get_average_units())), readable_bytesize(static_cast<unsigned>(recv_size.get_average_units())) ); }
std::string augs::date_time::how_long_ago(const bool tell_seconds) const { const auto secs = seconds_ago(); const auto mins = secs / 60; const auto hrs = mins / 60; const auto days = hrs / 24; if (mins < 1) { if (tell_seconds) { return typesafe_sprintf("%x seconds ago", secs); } return "A while ago"; } else if (mins == 1) { return typesafe_sprintf("A minute ago", mins); } else if (mins < 60) { return typesafe_sprintf("%x mins ago", mins); } else if (hrs == 1) { return typesafe_sprintf("An hour ago", hrs); } else if (hrs < 24) { return typesafe_sprintf("%x hours ago", hrs); } else if (days == 1) { return typesafe_sprintf("Yesterday", hrs); } return typesafe_sprintf("%x days ago", days); }
void client_setup::init(const config_lua_table& cfg, game_window& window, const std::string recording_filename, const bool use_alternative_port) { const vec2i screen_size = vec2i(window.get_screen_size()); scene_managers::networked_testbed_client().populate_world_with_entities(initial_hypersomnia); session.systems_audiovisual.get<interpolation_system>().interpolation_speed = cfg.interpolation_speed; detailed_step_log = cfg.tickrate <= 2; if (!hypersomnia.load_from_file("save.state")) { hypersomnia.set_fixed_delta(cfg.tickrate); scene.populate_world_with_entities(hypersomnia); } if (cfg.get_input_recording_mode() != input_recording_type::DISABLED) { if (player.try_to_load_or_save_new_session("sessions/", recording_filename)) { timer.set_stepping_speed_multiplier(cfg.recording_replay_speed); } } session.camera.configure_size(screen_size); session.set_master_gain(cfg.sound_effects_volume); session.configure_input(); receiver.jitter_buffer.set_lower_limit(static_cast<unsigned>(cfg.jitter_buffer_ms / hypersomnia.get_fixed_delta().in_milliseconds())); receiver.misprediction_smoothing_multiplier = cfg.misprediction_smoothing_multiplier; const bool is_replaying = player.is_replaying(); LOG("Is client replaying: %x", is_replaying); const auto port = use_alternative_port ? cfg.alternative_port : cfg.connect_port; const std::string readable_ip = typesafe_sprintf("%x:%x", cfg.connect_address, port); LOG("Connecting to: %x", readable_ip); if (is_replaying || client.connect(cfg.connect_address, port, 15000)) { LOG("Connected successfully to %x", readable_ip); augs::stream welcome; augs::write_object(welcome, network_command::CLIENT_WELCOME_MESSAGE); augs::write_object(welcome, use_alternative_port ? cfg.debug_second_nickname : cfg.nickname); client.post_redundant(welcome); timer.reset_timer(); } else { LOG("Connection failed."); } session.reserve_caches_for_entities(3000); }
static std::string list_audio_devices(const ALCchar * const devices) { const ALCchar *device = devices, *next = devices + 1; size_t len = 0; std::string devices_list; devices_list += "Devices list:\n"; while (device && *device != '\0' && next && *next != '\0') { devices_list += typesafe_sprintf("%x\n", device); len = strlen(device); device += (len + 1); next += (len + 2); } return devices_list; }
std::string augs::date_time::get_readable() const { std::tm local_time = *std::localtime(&t); return typesafe_sprintf("%x", std::put_time(&local_time, "%H:%M:%S on %m.%d.%y")); }
std::string create_unpathed_asset_id_command<I>::describe() const { return typesafe_sprintf("Created a new %x", uncapitalize_first(format_field_name(get_type_name_strip_namespace<I>()))); }
std::string fill_with_test_scene_command::describe() const { return typesafe_sprintf("Filled with %x", minimal ? "minimal test scene" : "test scene"); }
void networked_testbed::populate(const logic_step step) { auto& world = step.cosm; const auto crate = prefabs::create_crate(world, vec2(200, 200 + 300), vec2i(100, 100) / 3); const auto crate2 = prefabs::create_crate(world, vec2(400, 200 + 400), vec2i(300, 300)); const auto crate4 = prefabs::create_crate(world, vec2(500, 200 + 0), vec2i(100, 100)); for (int x = -4; x < 4; ++x) { for (int y = -4; y < 4; ++y) { auto obstacle = prefabs::create_crate(world, vec2(2000.f + x * 300.f, -1000.f +2000.f + y * 300.f), vec2i(100, 100)); } } const auto car = prefabs::create_car(world, components::transform(-300, -600, -90)); const auto car2 = prefabs::create_car(world, components::transform(-800, -600, -90)); const auto car3 = prefabs::create_car(world, components::transform(-1300, -600, -90)); const auto motorcycle = prefabs::create_motorcycle(world, components::transform(0, -600, -90)); prefabs::create_motorcycle(world, components::transform(100, -600, -90)); const vec2 bg_size = assets::get_size(assets::texture_id::TEST_BACKGROUND); const int num_floors = 10 * 10; const int side = sqrt(num_floors) / 2; for (int x = -side; x < side; ++x) for (int y = -side; y < side; ++y) { //auto background = world.create_entity("bg[-]"); //ingredients::sprite(background, vec2(-1000, 0) + vec2(x, y) * (bg_size + vec2(1500, 550)), assets::texture_id::TEST_BACKGROUND, white, render_layer::GROUND); //ingredients::standard_static_body(background); auto street = world.create_entity("street[-]"); ingredients::sprite(street, { bg_size * vec2(x, y) }, assets::texture_id::TEST_BACKGROUND, gray1, render_layer::GROUND); //background.add_standard_components(); street.add_standard_components(); } const int num_characters = 6; std::vector<entity_id> new_characters; new_characters.resize(num_characters); auto character = [&](const size_t i) { return i < new_characters.size() ? world[new_characters.at(i)] : world[entity_id()]; }; { { const auto l = world.create_entity("l"); l += components::transform(); auto& light = l += components::light(); light.color = red; l.add_standard_components(); } { const auto l = world.create_entity("l"); l += components::transform(300, 0); auto& light = l += components::light(); light.color = green; l.add_standard_components(); } { const auto l = world.create_entity("l"); l += components::transform(600, 0); auto& light = l += components::light(); light.color = blue; l.add_standard_components(); } { const auto l = world.create_entity("l"); l += components::transform(900, 0); auto& light = l += components::light(); light.color = cyan; l.add_standard_components(); } { const auto l = world.create_entity("l"); l += components::transform(1200, 0); auto& light = l += components::light(); light.color = orange; l.add_standard_components(); } } for (int i = 0; i < num_characters; ++i) { const auto new_character = prefabs::create_character(world, vec2(i * 300.f, 0), vec2(1200, 800), typesafe_sprintf("player%x", i)); new_characters[i] = new_character; if (i == 0) { new_character.get<components::sentience>().health.value = 100; new_character.get<components::sentience>().health.maximum = 100; } if (i == 1) { new_character.get<components::attitude>().parties = party_category::RESISTANCE_CITIZEN; new_character.get<components::attitude>().hostile_parties = party_category::METROPOLIS_CITIZEN; new_character.get<components::attitude>().maximum_divergence_angle_before_shooting = 25; new_character.get<components::sentience>().minimum_danger_amount_to_evade = 20; new_character.get<components::sentience>().health.value = 300; new_character.get<components::sentience>().health.maximum = 300; //ingredients::standard_pathfinding_capability(new_character); //ingredients::soldier_intelligence(new_character); new_character.recalculate_basic_processing_categories(); } if (i == 2) { new_character.get<components::sentience>().health.value = 38; } if (i == 5) { new_character.get<components::attitude>().parties = party_category::METROPOLIS_CITIZEN; new_character.get<components::attitude>().hostile_parties = party_category::RESISTANCE_CITIZEN; new_character.get<components::attitude>().maximum_divergence_angle_before_shooting = 25; new_character.get<components::sentience>().minimum_danger_amount_to_evade = 20; new_character.get<components::sentience>().health.value = 300; new_character.get<components::sentience>().health.maximum = 300; //ingredients::standard_pathfinding_capability(new_character); //ingredients::soldier_intelligence(new_character); new_character.recalculate_basic_processing_categories(); } } if (character(0).alive()) { name_entity(character(0), entity_name::PERSON, L"Attacker"); } prefabs::create_sample_suppressor(world, vec2(300, -500)); const bool many_charges = false; const auto rifle = prefabs::create_sample_rifle(step, vec2(100, -500), prefabs::create_sample_magazine(step, vec2(100, -650), many_charges ? "10" : "0.3", prefabs::create_cyan_charge(world, vec2(0, 0), many_charges ? 1000 : 30))); const auto rifle2 = prefabs::create_sample_rifle(step, vec2(100, -500 + 50), prefabs::create_sample_magazine(step, vec2(100, -650), true ? "10" : "0.3", prefabs::create_cyan_charge(world, vec2(0, 0), true ? 1000 : 30))); prefabs::create_sample_rifle(step, vec2(100, -500 + 100)); prefabs::create_pistol(step, vec2(300, -500 + 50)); const auto pis2 = prefabs::create_pistol(step, vec2(300, 50), prefabs::create_sample_magazine(step, vec2(100, -650), "0.4", prefabs::create_green_charge(world, vec2(0, 0), 40))); const auto submachine = prefabs::create_submachine(step, vec2(500, -500 + 50), prefabs::create_sample_magazine(step, vec2(100 - 50, -650), many_charges ? "10" : "0.5", prefabs::create_pink_charge(world, vec2(0, 0), many_charges ? 500 : 50))); prefabs::create_submachine(step, vec2(0, -1000), prefabs::create_sample_magazine(step, vec2(100 - 50, -650), many_charges ? "10" : "0.5", prefabs::create_pink_charge(world, vec2(0, 0), many_charges ? 500 : 50))); prefabs::create_submachine(step, vec2(150, -1000 + 150), prefabs::create_sample_magazine(step, vec2(100 - 50, -650), many_charges ? "10" : "0.5", prefabs::create_pink_charge(world, vec2(0, 0), many_charges ? 500 : 50))); prefabs::create_submachine(step, vec2(300, -1000 + 300), prefabs::create_sample_magazine(step, vec2(100 - 50, -650), many_charges ? "10" : "0.5", prefabs::create_pink_charge(world, vec2(0, 0), many_charges ? 500 : 50))); prefabs::create_submachine(step, vec2(450, -1000 + 450), prefabs::create_sample_magazine(step, vec2(100 - 50, -650), many_charges ? "10" : "0.5", prefabs::create_pink_charge(world, vec2(0, 0), many_charges ? 500 : 50))); prefabs::create_sample_magazine(step, vec2(100 - 50, -650)); prefabs::create_sample_magazine(step, vec2(100 - 100, -650), "0.30"); //prefabs::create_pink_charge(world, vec2(100, 100)); //prefabs::create_pink_charge(world, vec2(100, -400)); //prefabs::create_pink_charge(world, vec2(150, -400)); //prefabs::create_pink_charge(world, vec2(200, -400)); prefabs::create_cyan_charge(world, vec2(150, -500)); prefabs::create_cyan_charge(world, vec2(200, -500)); prefabs::create_cyan_urban_machete(world, vec2(100, 100)); const auto second_machete = prefabs::create_cyan_urban_machete(world, vec2(0, 0)); const auto backpack = prefabs::create_sample_backpack(world, vec2(200, -650)); prefabs::create_sample_backpack(world, vec2(200, -750)); perform_transfer({ backpack, character(0)[slot_function::SHOULDER_SLOT] }, step); perform_transfer({ submachine, character(0)[slot_function::PRIMARY_HAND] }, step); perform_transfer({ rifle, character(0)[slot_function::SECONDARY_HAND] }, step); if (character(1).alive()) { name_entity(character(1), entity_name::PERSON, L"Enemy"); perform_transfer({ rifle2, character(1)[slot_function::PRIMARY_HAND] }, step); } if (character(2).alive()) { name_entity(character(2), entity_name::PERSON, L"Swordsman"); perform_transfer({ second_machete, character(2)[slot_function::PRIMARY_HAND] }, step); } if (character(3).alive()) { name_entity(character(3), entity_name::PERSON, L"Medic"); perform_transfer({ pis2, character(3)[slot_function::PRIMARY_HAND] }, step); } if (character(5).alive()) { const auto new_item = prefabs::create_submachine(step, vec2(0, -1000), prefabs::create_sample_magazine(step, vec2(100 - 50, -650), true ? "10" : "0.5", prefabs::create_pink_charge(world, vec2(0, 0), true ? 500 : 50))); perform_transfer({ new_item, character(5)[slot_function::PRIMARY_HAND] }, step); } //draw_bodies.push_back(crate2); //draw_bodies.push_back(new_characters[0]); //draw_bodies.push_back(backpack); //world.significant.meta.settings.pathfinding.draw_memorised_walls = 1; //world.significant.meta.settings.pathfinding.draw_undiscovered = 1; characters.assign(new_characters.begin(), new_characters.end()); // _controlfp(0, _EM_OVERFLOW | _EM_ZERODIVIDE | _EM_INVALID | _EM_DENORMAL); }
void determinism_test_setup::process(const config_lua_table& cfg, game_window& window) { const vec2i screen_size = vec2i(window.get_screen_size()); const unsigned cosmoi_count = 1 + cfg.determinism_test_cloned_cosmoi_count; std::vector<cosmos> hypersomnias(cosmoi_count, cosmos(3000)); augs::machine_entropy total_collected_entropy; augs::machine_entropy_player player; augs::fixed_delta_timer timer = augs::fixed_delta_timer(5); std::vector<scene_managers::testbed> testbeds(cosmoi_count); if (augs::file_exists("save.state")) { for (auto& h : hypersomnias) { ensure(h.load_from_file("save.state")); } } else { for (size_t i = 0; i < cosmoi_count; ++i) { hypersomnias[i].set_fixed_delta(cfg.tickrate); testbeds[i].populate_world_with_entities(hypersomnias[i], vec2i(1920, 1080)); } } for (auto& h : hypersomnias) { ensure(h == hypersomnias[0]); } if (cfg.get_input_recording_mode() != input_recording_type::DISABLED) { if (player.try_to_load_or_save_new_session("sessions/", "recorded.inputs")) { timer.set_stepping_speed_multiplier(cfg.recording_replay_speed); } } viewing_session session; session.reserve_caches_for_entities(3000); session.camera.configure_size(screen_size); session.set_interpolation_enabled(false); session.set_master_gain(cfg.sound_effects_volume); for (size_t i = 0; i < cosmoi_count; ++i) { testbeds[i].configure_view(session); } unsigned currently_viewn_cosmos = 0; bool divergence_detected = false; unsigned which_divergent = 0; timer.reset_timer(); while (!should_quit) { augs::machine_entropy new_entropy; new_entropy.local = window.collect_entropy(!cfg.debug_disable_cursor_clipping); if (process_exit_key(new_entropy.local)) break; for (auto& n : new_entropy.local) { if (n.was_any_key_pressed()) { if (n.key == augs::window::event::keys::key::F3) { ++currently_viewn_cosmos; currently_viewn_cosmos %= cosmoi_count; } } } total_collected_entropy += new_entropy; auto steps = timer.count_logic_steps_to_perform(hypersomnias[0].get_fixed_delta()); while (steps--) { if (divergence_detected) { break; } player.advance_player_and_biserialize(total_collected_entropy); for (size_t i = 0; i < cosmoi_count; ++i) { auto& h = hypersomnias[i]; if (i + 1 < cosmoi_count) hypersomnias[i] = hypersomnias[i + 1]; testbeds[i].control_character_selection(total_collected_entropy.local); auto cosmic_entropy_for_this_step = cosmic_entropy(h[testbeds[i].get_selected_character()], total_collected_entropy.local, session.context); renderer::get_current().clear_logic_lines(); h.advance_deterministic_schemata(cosmic_entropy_for_this_step, [](auto) {}, [this, &session](const const_logic_step& step) { session.spread_past_infection(step); } ); } session.resample_state_for_audiovisuals(hypersomnias[0]); auto& first_cosm = hypersomnias[0].reserved_memory_for_serialization; augs::output_stream_reserver first_cosm_reserver; augs::write_object(first_cosm_reserver, hypersomnias[0].significant); first_cosm.reserve(first_cosm_reserver.get_write_pos()); first_cosm.reset_write_pos(); augs::write_object(first_cosm, hypersomnias[0].significant); for (unsigned i = 1; i < cosmoi_count; ++i) { auto& second_cosm = hypersomnias[i].reserved_memory_for_serialization; augs::output_stream_reserver second_cosm_reserver; augs::write_object(second_cosm_reserver, hypersomnias[i].significant); second_cosm.reserve(second_cosm_reserver.get_write_pos()); second_cosm.reset_write_pos(); augs::write_object(second_cosm, hypersomnias[i].significant); if (!(first_cosm == second_cosm)) { divergence_detected = true; which_divergent = i; break; } } total_collected_entropy.clear(); } std::string logged; if (divergence_detected) { logged += typesafe_sprintf("Divergence detected in cosmos: %x (step: %x)\n", which_divergent, hypersomnias[0].get_total_steps_passed()); } logged += typesafe_sprintf("Currently viewn cosmos: %x (F3 to switch)\n", currently_viewn_cosmos); auto& renderer = augs::renderer::get_current(); renderer.clear_current_fbo(); session.view(renderer, hypersomnias[currently_viewn_cosmos], testbeds[currently_viewn_cosmos].get_selected_character(), session.frame_timer.extract_variable_delta(hypersomnias[currently_viewn_cosmos].get_fixed_delta(), timer)); window.swap_buffers(); } }