// read in a new mission file from disk int CFREDDoc::load_mission(char *pathname) { char name[512], *old_name; int i, j, k, ob; int used_pool[MAX_WEAPON_TYPES]; waypoint_list *wptr; object *objp; Parse_viewer_pos = view_pos; Parse_viewer_orient = view_orient; // activate the localizer hash table fhash_flush(); clear_mission(); Fred_found_unknown_ship_during_parsing = 0; if (parse_main(pathname)) { sprintf(name, "Unable to load the file \"%s\"", pathname); Fred_view_wnd->MessageBox(name); create_new_mission(); return -1; } if(Fred_found_unknown_ship_during_parsing){ Fred_view_wnd->MessageBox("Fred encountered unknown ship/weapon classes when parsing the mission file. This may be due to mission disk data you do not have"); } Fred_found_unknown_ship_during_parsing = 0; for (i=0; i<Num_waypoint_lists; i++) { wptr = &Waypoint_lists[i]; for (j=0; j<wptr->count; j++){ ob = obj_create(OBJ_WAYPOINT, -1, i * 65536 + j, NULL, &wptr->waypoints[j], 0.0f, OF_RENDERS); } } obj_merge_created_list(); objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if (objp->flags & OF_PLAYER_SHIP) { Assert(objp->type == OBJ_SHIP); objp->type = OBJ_START; // Player_starts++; } objp = GET_NEXT(objp); } for (i=0; i<num_wings; i++) { for (j=0; j<Wings[i].wave_count; j++) { ob = Ships[Wings[i].ship_index[j]].objnum; wing_objects[i][j] = ob; Ships[Wings[i].ship_index[j]].wingnum = i; Ships[Wings[i].ship_index[j]].arrival_cue = Locked_sexp_false; } // fix old ship names for ships in wings if needed while (j--) { if ( (Objects[wing_objects[i][j]].type == OBJ_SHIP) || (Objects[wing_objects[i][j]].type == OBJ_START) ) { // don't change player ship names sprintf(name, "%s %d", Wings[i].name, j + 1); old_name = Ships[Wings[i].ship_index[j]].ship_name; if (stricmp(name, old_name)) { // need to fix name update_sexp_references(old_name, name); ai_update_goal_references(REF_TYPE_SHIP, old_name, name); for (k=0; k<Num_reinforcements; k++) if (!stricmp(old_name, Reinforcements[k].name)) { Assert(strlen(name) < NAME_LENGTH); strcpy(Reinforcements[k].name, name); } strcpy(Ships[Wings[i].ship_index[j]].ship_name, name); } } } } generate_weaponry_usage_list(used_pool); for ( j = 0; j < Num_teams; j++ ) { for (i=0; i<Num_weapon_types; i++) { Team_data[j].weaponry_pool[i] -= used_pool[i]; // convert weaponry_pool to be extras available beyond the current ships weapons if (Team_data[j].weaponry_pool[i] < 0) Team_data[j].weaponry_pool[i] = 0; } } Assert(Mission_palette >= 0); Assert(Mission_palette <= 98); if (The_mission.flags & MISSION_FLAG_SUBSPACE) { strcpy(name, NOX("gamepalette-subspace")); } else { strcpy(name, "gamepalette1-01"); // sprintf(name, NOX("gamepalette1-%02d"), Mission_palette + 1); } palette_load_table(name); // go through all ships and translate their alternate name indices objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { // if this is a ship, check it, and mark its possible alternate name down in the auxiliary array if(((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->instance >= 0) && (Ships[objp->instance].alt_type_index >= 0)){ mission_parse_lookup_alt_index(Ships[objp->instance].alt_type_index, Fred_alt_names[objp->instance]); // also zero it Ships[objp->instance].alt_type_index = -1; } objp = GET_NEXT(objp); } view_pos = Parse_viewer_pos; view_orient = Parse_viewer_orient; set_modified(0); return 0; }
int CFREDDoc::load_mission(char *pathname, int flags) { // make sure we're in the correct working directory!!!!!! chdir(Fred_base_dir); char name[512], *old_name; int i, j, k, ob; int used_pool[MAX_WEAPON_TYPES]; object *objp; Parse_viewer_pos = view_pos; Parse_viewer_orient = view_orient; // activate the localizer hash table fhash_flush(); clear_mission(); if (parse_main(pathname, flags)) { if (flags & MPF_IMPORT_FSM) { sprintf(name, "Unable to import the file \"%s\".", pathname); Fred_view_wnd->MessageBox(name); } else { sprintf(name, "Unable to load the file \"%s\".", pathname); Fred_view_wnd->MessageBox(name); } create_new_mission(); return -1; } if ((Num_unknown_ship_classes > 0) || (Num_unknown_weapon_classes > 0) || (Num_unknown_loadout_classes > 0)) { if (flags & MPF_IMPORT_FSM) { char msg[256]; sprintf(msg, "Fred encountered unknown ship/weapon classes when importing \"%s\" (path \"%s\"). You will have to manually edit the converted mission to correct this.", The_mission.name, pathname); Fred_view_wnd->MessageBox(msg); } else { Fred_view_wnd->MessageBox("Fred encountered unknown ship/weapon classes when parsing the mission file. This may be due to mission disk data you do not have."); } } obj_merge_created_list(); objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if (objp->flags[Object::Object_Flags::Player_ship]) { Assert(objp->type == OBJ_SHIP); objp->type = OBJ_START; // Player_starts++; } objp = GET_NEXT(objp); } for (i = 0; i < Num_wings; i++) { for (j = 0; j < Wings[i].wave_count; j++) { ob = Ships[Wings[i].ship_index[j]].objnum; wing_objects[i][j] = ob; Ships[Wings[i].ship_index[j]].wingnum = i; Ships[Wings[i].ship_index[j]].arrival_cue = Locked_sexp_false; } // fix old ship names for ships in wings if needed while (j--) { if ((Objects[wing_objects[i][j]].type == OBJ_SHIP) || (Objects[wing_objects[i][j]].type == OBJ_START)) { // don't change player ship names wing_bash_ship_name(name, Wings[i].name, j + 1); old_name = Ships[Wings[i].ship_index[j]].ship_name; if (stricmp(name, old_name)) { // need to fix name update_sexp_references(old_name, name); ai_update_goal_references(REF_TYPE_SHIP, old_name, name); update_texture_replacements(old_name, name); for (k = 0; k < Num_reinforcements; k++) if (!strcmp(old_name, Reinforcements[k].name)) { Assert(strlen(name) < NAME_LENGTH); strcpy_s(Reinforcements[k].name, name); } strcpy_s(Ships[Wings[i].ship_index[j]].ship_name, name); } } } } for (i = 0; i < Num_teams; i++) { generate_weaponry_usage_list(i, used_pool); for (j = 0; j < Team_data[i].num_weapon_choices; j++) { // The amount used in wings is always set by a static loadout entry so skip any that were set by Sexp variables if ((!strlen(Team_data[i].weaponry_pool_variable[j])) && (!strlen(Team_data[i].weaponry_amount_variable[j]))) { // convert weaponry_pool to be extras available beyond the current ships weapons Team_data[i].weaponry_count[j] -= used_pool[Team_data[i].weaponry_pool[j]]; if (Team_data[i].weaponry_count[j] < 0) { Team_data[i].weaponry_count[j] = 0; } // zero the used pool entry used_pool[Team_data[i].weaponry_pool[j]] = 0; } } // double check the used pool is empty for (j = 0; j < MAX_WEAPON_TYPES; j++) { if (used_pool[j] != 0) { Warning(LOCATION, "%s is used in wings of team %d but was not in the loadout. Fixing now", Weapon_info[j].name, i + 1); // add the weapon as a new entry Team_data[i].weaponry_pool[Team_data[i].num_weapon_choices] = j; Team_data[i].weaponry_count[Team_data[i].num_weapon_choices] = used_pool[j]; strcpy_s(Team_data[i].weaponry_amount_variable[Team_data[i].num_weapon_choices], ""); strcpy_s(Team_data[i].weaponry_pool_variable[Team_data[i].num_weapon_choices++], ""); } } } Assert(Mission_palette >= 0); Assert(Mission_palette <= 98); // RT, don't need this anymore #if 0 if (The_mission.flags[Mission::Mission_Flags::Subspace]) { strcpy_s(name, NOX("gamepalette-subspace")); } else { strcpy_s(name, "gamepalette1-01"); // sprintf(name, NOX("gamepalette1-%02d"), Mission_palette + 1); } palette_load_table(name); #endif // go through all ships and translate their callsign and alternate name indices objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { // if this is a ship, check it, and mark its possible alternate name down in the auxiliary array if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->instance >= 0)) { if (Ships[objp->instance].alt_type_index >= 0) { mission_parse_lookup_alt_index(Ships[objp->instance].alt_type_index, Fred_alt_names[objp->instance]); // also zero it Ships[objp->instance].alt_type_index = -1; } if (Ships[objp->instance].callsign_index >= 0) { mission_parse_lookup_callsign_index(Ships[objp->instance].callsign_index, Fred_callsigns[objp->instance]); // also zero it Ships[objp->instance].callsign_index = -1; } } objp = GET_NEXT(objp); } view_pos = Parse_viewer_pos; view_orient = Parse_viewer_orient; set_modified(0); stars_post_level_init(); recreate_dialogs(); return 0; }