static mle *build_mission_list(int anarchy_mode) { mle *mission_list; int top_place; char builtin_mission_filename[FILENAME_LEN]; char search_str[PATH_MAX] = MISSION_DIR; //now search for levels on disk //@@Took out this code because after this routine was called once for //@@a list of single-player missions, a subsequent call for a list of //@@anarchy missions would not scan again, and thus would not find the //@@anarchy-only missions. If we retain the minimum level of install, //@@we may want to put the code back in, having it always scan for all //@@missions, and have the code that uses it sort out the ones it wants. //@@ if (num_missions != -1) { //@@ if (Current_mission_num != 0) //@@ load_mission(0); //set built-in mission as default //@@ return num_missions; //@@ } MALLOC(mission_list, mle, MAX_MISSIONS); num_missions = 0; add_builtin_mission_to_list(mission_list + num_missions, builtin_mission_filename); //read built-in first add_d1_builtin_mission_to_list(mission_list + num_missions); add_missions_to_list(mission_list, search_str, search_str + strlen(search_str), anarchy_mode); // move original missions (in story-chronological order) // to top of mission list top_place = 0; promote(mission_list, "descent", &top_place); // original descent 1 mission promote(mission_list, builtin_mission_filename, &top_place); // d2 or d2demo promote(mission_list, "d2x", &top_place); // vertigo if (num_missions > top_place) qsort(&mission_list[top_place], num_missions - top_place, sizeof(*mission_list), (int (*)( const void *, const void * ))ml_sort_func); if (num_missions > top_place) qsort(&mission_list[top_place], num_missions - top_place, sizeof(*mission_list), (int (*)( const void *, const void * ))ml_sort_func); return mission_list; }
int BuildMissionList(int anarchy_mode, int nSubFolder) { static int num_missions=-1; int count = 0; int top_place, bSubFolder, bHaveSubFolders; //now search for levels on disk //@@Took out this code because after this routine was called once for //@@a list of single-player missions, a subsequent call for a list of //@@anarchy missions would not scan again, and thus would not ffs the //@@anarchy-only missions. If we retain the minimum level of install, //@@we may want to put the code back in, having it always scan for all //@@missions, and have the code that uses it sort out the ones it wants. //@@ if (num_missions != -1) { //@@ if (gameData.missions.nCurrentMission != 0) //@@ LoadMission(0); //set built-in mission as default //@@ return num_missions; //@@ } if (nSubFolder >= 0) { if (strcmp (gameData.missions.list [nSubFolder].mission_name, "[..]")) MoveMsnFolderDown (nSubFolder); else MoveMsnFolderUp (); } bSubFolder = (*gameFolders.szMsnSubFolder != '\0'); if (!bSubFolder && gameOpts->app.bSinglePlayer) { strcpy (gameFolders.szMsnSubFolder, "single/"); // bSubFolder = 1; } if (!bSubFolder) {// || (gameOpts->app.bSinglePlayer && !strcmp (gameFolders.szMsnSubFolder, "single"))) { if (gameOpts->app.nVersionFilter & 2) { add_builtin_mission_to_list(&count); //read built-in first if (gameOpts->app.bSinglePlayer) add_d2x_builtin_mission_to_list(&count); //read built-in first } if (gameOpts->app.nVersionFilter & 1) add_d1_builtin_mission_to_list(&count); } nBuiltIns = count; sprintf (gameFolders.szMissionDirs [0], "%s/%s", gameFolders.szMissionDir, gameFolders.szMsnSubFolder); bHaveSubFolders = 0; if (gameOpts->app.nVersionFilter & 2) { AddMissionsToList(&count, anarchy_mode, 0, bSubFolder, bHaveSubFolders, ML_MISSIONDIR); bHaveSubFolders = 1; } if (gameOpts->app.nVersionFilter & 1) { AddMissionsToList(&count, anarchy_mode, 1, bSubFolder, bHaveSubFolders, ML_MISSIONDIR); bHaveSubFolders = 1; } if (gameFolders.bAltHogDirInited && strcmp (gameFolders.szAltHogDir, gameFolders.szGameDir)) { bHaveSubFolders = 0; sprintf (gameFolders.szMissionDirs [1], "%s/%s%s", gameFolders.szAltHogDir, MISSION_DIR, gameFolders.szMsnSubFolder); if (gameOpts->app.nVersionFilter & 2) { AddMissionsToList(&count, anarchy_mode, 0, bSubFolder, bHaveSubFolders, ML_ALTHOGDIR); bHaveSubFolders = 1; } if (gameOpts->app.nVersionFilter & 1) { AddMissionsToList(&count, anarchy_mode, 1, bSubFolder, bHaveSubFolders, ML_ALTHOGDIR); bHaveSubFolders = 1; } } // move original missions (in story-chronological order) // to top of mission list top_place = 0; if (bSubFolder) { gameData.missions.nBuiltinMission = gameData.missions.nD1BuiltinMission = -1; } else { promote("descent", &top_place, count); // original descent 1 mission gameData.missions.nD1BuiltinMission = top_place - 1; promote(gameData.missions.szBuiltinMissionFilename, &top_place, count); // d2 or d2demo gameData.missions.nBuiltinMission = top_place - 1; promote("d2x", &top_place, count); // vertigo } if (count > top_place) qsort(gameData.missions.list + top_place, count - top_place, sizeof(*gameData.missions.list), (int (_CDECL_ *)( const void *, const void * ))ml_sort_func); if (count > top_place) qsort(gameData.missions.list + top_place, count - top_place, sizeof(*gameData.missions.list), (int (_CDECL_ *)( const void *, const void * ))ml_sort_func); //LoadMission(0); //set built-in mission as default num_missions = count; return count; }