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