int SelectAndLoadMission (int bMulti, int *bAnarchyOnly) { int i, j, nMissions, nDefaultMission, nNewMission = -1; CStack<char*> msnNames (MAX_MISSIONS); CListBox lb; static const char *menuTitles [4]; menuTitles [0] = TXT_NEW_GAME; menuTitles [1] = TXT_NEW_D1GAME; menuTitles [2] = TXT_NEW_D2GAME; menuTitles [3] = TXT_NEW_GAME; if (bAnarchyOnly) *bAnarchyOnly = 0; do { msnNames.Reset (); nMissions = BuildMissionList (1, nNewMission); if (nMissions < 1) return -1; nDefaultMission = 0; for (i = 0; i < nMissions; i++) { msnNames.Push (gameData.missions.list [i].szMissionName); j = MsnHasGameVer (msnNames [i]) ? 4 : 0; if (!stricmp (msnNames [i] + j, gameConfig.szLastMission)) nDefaultMission = i; } gameStates.app.nExtGameStatus = bMulti ? GAMESTAT_START_MULTIPLAYER_MISSION : GAMESTAT_SELECT_MISSION; gameOpts->app.nVersionFilter = NMCLAMP (gameOpts->app.nVersionFilter, 1, 3); nNewMission = lb.ListBox (bMulti ? TXT_MULTI_MISSION : menuTitles [gameOpts->app.nVersionFilter], msnNames, nDefaultMission); GameFlushInputs (); if (nNewMission == -1) return -1; //abort! } while (!gameData.missions.list [nNewMission].nDescentVersion); strcpy (gameConfig.szLastMission, msnNames [nNewMission]); if (!LoadMission (nNewMission)) { MsgBox (NULL, NULL, 1, TXT_OK, TXT_MISSION_ERROR); return -1; } gameStates.app.bD1Mission = (gameData.missions.list [nNewMission].nDescentVersion == 1); gameData.missions.nLastMission = nNewMission; if (bAnarchyOnly) *bAnarchyOnly = gameData.missions.list [nNewMission].bAnarchyOnly; return nNewMission; }