void pilotfile_convert::plr_import_red_alert() { int idx, j; char name[35]; if (fver >= 242) { return; } // have to read it, but don't need any of it ... int num_slots = cfread_int(cfp); if ( (num_slots < 0) || (num_slots >= 32) ) { throw "Data check failure in red-alert!"; } if ( !num_slots ) { return; } for (idx = 0; idx < num_slots; idx++) { cfread_string(name, sizeof(name) - 1, cfp); cfread_float(cfp); cfread_string_len(name, sizeof(name), cfp); // subsystem hits for (j = 0; j < 64; j++) { cfread_float(cfp); } // aggregate hits for (j = 0; j < 12; j++) { cfread_float(cfp); } // weapons for (j = 0; j < 12; j++) { cfread_string_len(name, sizeof(name), cfp); cfread_int(cfp); } } }
void pilotfile::csg_read_settings() { // sound/voice/music Master_sound_volume = cfread_float(cfp); Master_event_music_volume = cfread_float(cfp); Master_voice_volume = cfread_float(cfp); audiostream_set_volume_all(Master_voice_volume, ASF_VOICE); audiostream_set_volume_all(Master_event_music_volume, ASF_EVENTMUSIC); if (Master_event_music_volume > 0.0f) { Event_music_enabled = 1; } else { Event_music_enabled = 0; } Briefing_voice_enabled = cfread_int(cfp); // skill level Game_skill_level = cfread_int(cfp); // input options Use_mouse_to_fly = cfread_int(cfp); Mouse_sensitivity = cfread_int(cfp); Joy_sensitivity = cfread_int(cfp); Joy_dead_zone_size = cfread_int(cfp); if (csg_ver < 3) { // detail int dummy __UNUSED = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); dummy = cfread_int(cfp); } }
void pilotfile::plr_read_settings() { // sound/voice/music Master_sound_volume = cfread_float(cfp); Master_event_music_volume = cfread_float(cfp); Master_voice_volume = cfread_float(cfp); audiostream_set_volume_all(Master_voice_volume, ASF_VOICE); audiostream_set_volume_all(Master_event_music_volume, ASF_EVENTMUSIC); if (Master_event_music_volume > 0.0f) { Event_music_enabled = 1; } else { Event_music_enabled = 0; } Briefing_voice_enabled = cfread_int(cfp); // skill level Game_skill_level = cfread_int(cfp); // input options Use_mouse_to_fly = cfread_int(cfp); Mouse_sensitivity = cfread_int(cfp); Joy_sensitivity = cfread_int(cfp); Dead_zone_size = cfread_int(cfp); // detail Detail.setting = cfread_int(cfp); Detail.nebula_detail = cfread_int(cfp); Detail.detail_distance = cfread_int(cfp); Detail.hardware_textures = cfread_int(cfp); Detail.num_small_debris = cfread_int(cfp); Detail.num_particles = cfread_int(cfp); Detail.num_stars = cfread_int(cfp); Detail.shield_effects = cfread_int(cfp); Detail.lighting = cfread_int(cfp); Detail.targetview_model = cfread_int(cfp); Detail.planets_suns = cfread_int(cfp); Detail.weapon_extras = cfread_int(cfp); }
void pilotfile::csg_read_redalert() { int idx, i, j, list_size = 0; int count; char t_string[MAX_FILENAME_LEN+NAME_LENGTH+1] = { '\0' }; float hit; wep_t weapons; if ( !m_have_info ) { throw "RedAlert before Info!"; } list_size = cfread_int(cfp); if (list_size <= 0) { return; } cfread_string_len(t_string, MAX_FILENAME_LEN, cfp); Red_alert_precursor_mission = t_string; for (idx = 0; idx < list_size; idx++) { red_alert_ship_status ras; cfread_string_len(t_string, NAME_LENGTH, cfp); ras.name = t_string; ras.hull = cfread_float(cfp); // ship class, index into ship_list[] i = cfread_int(cfp); if ( (i >= (int)ship_list.size()) || (i < RED_ALERT_LOWEST_VALID_SHIP_CLASS) ) { mprintf(("CSG => Parse Warning: Invalid value for red alert ship index (%d), emptying slot.\n", i)); ras.ship_class = RED_ALERT_DESTROYED_SHIP_CLASS; } else if ( (i < 0 ) && (i >= RED_ALERT_LOWEST_VALID_SHIP_CLASS) ) { // ship destroyed/exited ras.ship_class = i; } else { ras.ship_class = ship_list[i].index; } // subsystem hits count = cfread_int(cfp); for (j = 0; j < count; j++) { hit = cfread_float(cfp); ras.subsys_current_hits.push_back( hit ); } // subsystem aggregate hits count = cfread_int(cfp); for (j = 0; j < count; j++) { hit = cfread_float(cfp); ras.subsys_aggregate_current_hits.push_back( hit ); } // primary weapon loadout and status count = cfread_int(cfp); for (j = 0; j < count; j++) { i = cfread_int(cfp); weapons.index = weapon_list[i].index; weapons.count = cfread_int(cfp); // triggering this means something is really fubar if (weapons.index < 0) { continue; } ras.primary_weapons.push_back( weapons ); } // secondary weapon loadout and status count = cfread_int(cfp); for (j = 0; j < count; j++) { i = cfread_int(cfp); weapons.index = weapon_list[i].index; weapons.count = cfread_int(cfp); // triggering this means something is really fubar if (weapons.index < 0) { continue; } ras.secondary_weapons.push_back( weapons ); } // this is quite likely a *bad* thing if it doesn't happen if (ras.ship_class >= RED_ALERT_LOWEST_VALID_SHIP_CLASS) { Red_alert_wingman_status.push_back( ras ); } } }
void pilotfile_convert::plr_import() { char name[35]; int idx; unsigned int plr_id = cfread_uint(cfp); if (plr_id != 0x46505346) { throw "Invalid file signature!"; } fver = cfread_uint(cfp); if ( (fver != 142) && (fver != 242) ) { throw "Unsupported file version!"; } // multi flag plr->is_multi = (int)cfread_ubyte(cfp); // rank plr->rank = cfread_int(cfp); // mainhall, don't need it if (fver < 242) { cfread_ubyte(cfp); } plr->tips = cfread_int(cfp); if ( (plr->tips < 0) || (plr->tips > 1) ) { throw "Data check failure!"; } cfread_string_len(plr->image_filename, sizeof(plr->image_filename), cfp); cfread_string_len(plr->squad_name, sizeof(plr->squad_name), cfp); cfread_string_len(plr->squad_filename, sizeof(plr->squad_filename), cfp); cfread_string_len(plr->current_campaign, sizeof(plr->current_campaign), cfp); cfread_string_len(plr->last_ship_flown, sizeof(plr->last_ship_flown), cfp); // controls plr_import_controls(); // hud config plr_import_hud(); // cutscenes, don't need it if (fver < 242) { cfread_int(cfp); } // volume stuff plr->sound_volume = cfread_float(cfp); plr->music_volume = cfread_float(cfp); plr->voice_volume = cfread_float(cfp); // detail settings plr_import_detail(); // recent missions, don't need it int num_missions = cfread_int(cfp); for (idx = 0; idx < num_missions; idx++) { cfread_string_len(name, sizeof(name), cfp); } // stats, will skip if fver < 242 plr_import_stats(); plr->skill_level = cfread_int(cfp); if ( (plr->skill_level < 0) || (plr->skill_level > 4) ) { throw "Data check failure!"; } // extra joystick stuff for (idx = 0; idx < 5; idx++) { plr->joy_axis_map_to[idx] = cfread_int(cfp); plr->joy_invert_axis[idx] = cfread_int(cfp); } // flags plr->save_flags = cfread_int(cfp); // loadout, will skip if fver < 242 plr_import_loadout(); // multiplayer plr_import_multiplayer(); // two briefing related values plr->readyroom_listing_mode = cfread_int(cfp); Briefing_voice_enabled = cfread_int(cfp); plr->net_protocol = cfread_int(cfp); // protocol must be set to something if (plr->net_protocol == NET_NONE) { plr->net_protocol = NET_TCP; } else if ( (plr->net_protocol < 0) || (plr->net_protocol > NET_VMT) ) { throw "Data check failure!"; } // red alert status, will skip if fver < 242 (and should be empty if multi) plr_import_red_alert(); // briefing auto-advance plr->auto_advance = cfread_int(cfp); if ( (plr->auto_advance < 0) || (plr->auto_advance > 1) ) { throw "Data check failure!"; } // some input options plr->Use_mouse_to_fly = cfread_int(cfp); plr->Mouse_sensitivity = cfread_int(cfp); plr->Joy_sensitivity = cfread_int(cfp); plr->Dead_zone_size = cfread_int(cfp); // variables plr_import_variables(); // and... we're done! :) }
float pilot::BinaryFileHandler::readFloat(const char*) { return cfread_float(_cfp); }
void pilotfile_convert::csg_import_red_alert() { int idx, i, j; int count; char t_string[35] = { '\0' }; float val; wep_t weapons; count = cfread_int(cfp); if (count <= 0) { return; } csg->wingman_status.reserve( count ); cfread_string(t_string, sizeof(t_string)-1, cfp); csg->precursor_mission = t_string; int ship_list_size = (int)csg->ship_list.size(); int weapon_list_size = (int)csg->weapon_list.size(); for (idx = 0; idx < count; idx++) { red_alert_ship_status ras; // ship name cfread_string(t_string, sizeof(t_string)-1, cfp); ras.name = t_string; ras.hull = cfread_float(cfp); ras.ship_class = cfread_int(cfp); if (ras.ship_class >= ship_list_size) { throw std::runtime_error("Data failure (RedAlert-ship)!"); } // system status ras.subsys_current_hits.reserve(64); for (j = 0; j < 64; j++) { val = cfread_float(cfp); ras.subsys_current_hits.push_back( val ); } ras.subsys_aggregate_current_hits.reserve(12); for (j = 0; j < 12; j++) { val = cfread_float(cfp); ras.subsys_aggregate_current_hits.push_back( val ); } // loadout ras.primary_weapons.reserve(3); for (j = 0; j < 3; j++) { i = cfread_int(cfp); if (i >= weapon_list_size || i < -1) { throw std::runtime_error("Data check failure (RedAlert-weapon)!"); } else if (i >= 0) { weapons.index = csg->weapon_list[i].index; } else { weapons.index = -1; } weapons.count = cfread_int(cfp); if (weapons.index >= 0) { ras.primary_weapons.push_back( weapons ); } } ras.secondary_weapons.reserve(4); for (j = 0; j < 4; j++) { i = cfread_int(cfp); if (i >= weapon_list_size || i < -1) { throw std::runtime_error("Data check failure (RedAlert-weapon)!"); } else if (i >= 0) { weapons.index = csg->weapon_list[i].index; } else { weapons.index = -1; } weapons.count = cfread_int(cfp); if (weapons.index >= 0) { ras.secondary_weapons.push_back( weapons ); } } // add to list csg->wingman_status.push_back( ras ); } }