void pilotfile::csg_read_missions() { int i, j, idx, list_size; cmission *missionp; if ( !m_have_info ) { throw "Missions before Info!"; } for (i = 0; i < Campaign.num_missions_completed; i++) { idx = cfread_int(cfp); missionp = &Campaign.missions[idx]; missionp->completed = 1; // flags missionp->flags = cfread_int(cfp); // goals missionp->num_goals = cfread_int(cfp); if (missionp->num_goals > 0) { missionp->goals = (mgoal *) vm_malloc( missionp->num_goals * sizeof(mgoal) ); Verify( missionp->goals != NULL ); memset( missionp->goals, 0, missionp->num_goals * sizeof(mgoal) ); for (j = 0; j < missionp->num_goals; j++) { cfread_string_len(missionp->goals[j].name, NAME_LENGTH, cfp); missionp->goals[j].status = cfread_char(cfp); } } // events missionp->num_events = cfread_int(cfp); if (missionp->num_events > 0) { missionp->events = (mevent *) vm_malloc( missionp->num_events * sizeof(mevent) ); Verify( missionp->events != NULL ); memset( missionp->events, 0, missionp->num_events * sizeof(mevent) ); for (j = 0; j < missionp->num_events; j++) { cfread_string_len(missionp->events[j].name, NAME_LENGTH, cfp); missionp->events[j].status = cfread_char(cfp); } } // variables missionp->num_variables = cfread_int(cfp); if (missionp->num_variables > 0) { missionp->variables = (sexp_variable *) vm_malloc( missionp->num_variables * sizeof(sexp_variable) ); Verify( missionp->variables != NULL ); memset( missionp->variables, 0, missionp->num_variables * sizeof(sexp_variable) ); for (j = 0; j < missionp->num_variables; j++) { missionp->variables[j].type = cfread_int(cfp); cfread_string_len(missionp->variables[j].text, TOKEN_LENGTH, cfp); cfread_string_len(missionp->variables[j].variable_name, TOKEN_LENGTH, cfp); } } // scoring stats missionp->stats.score = cfread_int(cfp); missionp->stats.rank = cfread_int(cfp); missionp->stats.assists = cfread_int(cfp); missionp->stats.kill_count = cfread_int(cfp); missionp->stats.kill_count_ok = cfread_int(cfp); missionp->stats.bonehead_kills = cfread_int(cfp); missionp->stats.p_shots_fired = cfread_uint(cfp); missionp->stats.p_shots_hit = cfread_uint(cfp); missionp->stats.p_bonehead_hits = cfread_uint(cfp); missionp->stats.s_shots_fired = cfread_uint(cfp); missionp->stats.s_shots_hit = cfread_uint(cfp); missionp->stats.s_bonehead_hits = cfread_uint(cfp); // ship kills (scoring) list_size = (int)ship_list.size(); for (j = 0; j < list_size; j++) { idx = cfread_int(cfp); if (ship_list[j].index >= 0) { missionp->stats.kills[ship_list[j].index] = idx; } } // medals (scoring) list_size = (int)medals_list.size(); for (j = 0; j < list_size; j++) { idx = cfread_int(cfp); if (medals_list[j].index >= 0) { missionp->stats.medal_counts[medals_list[j].index] = idx; } } } }
void pilotfile_convert::csg_import_missions(bool inferno) { cmission_conv_t miss; int idx, j; int count; int list_size = 0, k; scoring_conv_t t_score; scoring_conv_INF_t t_inf_score; Assert( sizeof(scoring_conv_t) == SCORING_SIZE ); Assert( sizeof(scoring_conv_INF_t) == SCORING_INF_SIZE ); int ship_list_size = (int)csg->ship_list.size(); int num_missions = cfread_int(cfp); csg->missions.reserve(num_missions); for (idx = 0; idx < num_missions; idx++) { miss.index = cfread_int(cfp); // goals count = cfread_int(cfp); if (count > 0) { mgoal n_goal; miss.goals.reserve(count); for (j = 0; j < count; j++) { memset(&n_goal, 0, sizeof(mgoal)); cfread_string_len(n_goal.name, sizeof(n_goal.name), cfp); n_goal.status = cfread_char(cfp); miss.goals.push_back( n_goal ); } } // events count = cfread_int(cfp); if (count > 0) { mevent n_event; miss.events.reserve(count); for (j = 0; j < count; j++) { memset(&n_event, 0, sizeof(mevent)); cfread_string_len(n_event.name, sizeof(n_event.name), cfp); n_event.status = cfread_char(cfp); miss.events.push_back( n_event ); } } // variables count = cfread_int(cfp); if (count > 0) { sexp_variable n_variable; miss.variables.reserve(count); for (j = 0; j < count; j++) { memset(&n_variable, 0, sizeof(sexp_variable)); n_variable.type = cfread_int(cfp); cfread_string_len(n_variable.text, sizeof(n_variable.text), cfp); cfread_string_len(n_variable.variable_name, sizeof(n_variable.variable_name), cfp); miss.variables.push_back( n_variable ); } } // stats miss.stats.ship_kills = csg->ship_list; miss.stats.medals_earned = csg->medals_list; if (inferno) { cfread(&t_inf_score, sizeof(scoring_conv_INF_t), 1, cfp); for (j = 0; j < ship_list_size; j++) { miss.stats.ship_kills[j].val = INTEL_INT(t_inf_score.kills[j]); } miss.stats.score = INTEL_INT(t_inf_score.score); miss.stats.rank = INTEL_INT(t_inf_score.rank); miss.stats.assists = INTEL_INT(t_inf_score.assists); miss.stats.kill_count = INTEL_INT(t_inf_score.kill_count); miss.stats.kill_count_ok = INTEL_INT(t_inf_score.kill_count_ok); miss.stats.p_shots_fired = INTEL_INT(t_inf_score.p_shots_fired); miss.stats.s_shots_fired = INTEL_INT(t_inf_score.s_shots_fired); miss.stats.p_shots_hit = INTEL_INT(t_inf_score.p_shots_hit); miss.stats.s_shots_hit = INTEL_INT(t_inf_score.s_shots_hit); miss.stats.p_bonehead_hits = INTEL_INT(t_inf_score.p_bonehead_hits); miss.stats.s_bonehead_hits = INTEL_INT(t_inf_score.s_bonehead_hits); miss.stats.bonehead_kills = INTEL_INT(t_inf_score.bonehead_kills); for (j = 0; j < 18; j++) { miss.stats.medals_earned[j].val = INTEL_INT(t_inf_score.medals[j]); } } else { cfread(&t_score, sizeof(scoring_conv_t), 1, cfp); for (j = 0; j < ship_list_size; j++) { miss.stats.ship_kills[j].val = INTEL_INT(t_score.kills[j]); } miss.stats.score = INTEL_INT(t_score.score); miss.stats.rank = INTEL_INT(t_score.rank); miss.stats.assists = INTEL_INT(t_score.assists); miss.stats.kill_count = INTEL_INT(t_score.kill_count); miss.stats.kill_count_ok = INTEL_INT(t_score.kill_count_ok); miss.stats.p_shots_fired = INTEL_INT(t_score.p_shots_fired); miss.stats.s_shots_fired = INTEL_INT(t_score.s_shots_fired); miss.stats.p_shots_hit = INTEL_INT(t_score.p_shots_hit); miss.stats.s_shots_hit = INTEL_INT(t_score.s_shots_hit); miss.stats.p_bonehead_hits = INTEL_INT(t_score.p_bonehead_hits); miss.stats.s_bonehead_hits = INTEL_INT(t_score.s_bonehead_hits); miss.stats.bonehead_kills = INTEL_INT(t_score.bonehead_kills); for (j = 0; j < 18; j++) { miss.stats.medals_earned[j].val = INTEL_INT(t_score.medals[j]); } } // flags miss.flags = cfread_int(cfp); // now add to list csg->missions.push_back( miss ); } // finally, convert old mission variables to proper campaign variables for (idx = 0; idx < num_missions; idx++) { count = (int)csg->missions[idx].variables.size(); for (j = 0; j < count; j++) { bool add_it = true; list_size = (int)csg->variables.size(); for (k = 0; k < list_size; k++) { if ( !stricmp(csg->variables[k].variable_name, csg->missions[idx].variables[j].variable_name) ) { csg->variables[k] = csg->missions[idx].variables[j]; add_it = false; break; } } if (add_it) { csg->variables.push_back( csg->missions[idx].variables[j] ); } } } }