/*! * Shutdown/cleanup after the game loop * Would stop the timer */ static void stopGameLoop(void) { if (gameLoopStatus != GAMECODE_NEWLEVEL) { clearBlueprints(); initLoadingScreen(true); // returning to f.e. do a loader.render not active pie_EnableFog(false); // dont let the normal loop code set status on fogStatus = 0; if (gameLoopStatus != GAMECODE_LOADGAME) { if (!levReleaseAll()) { debug(LOG_ERROR, "levReleaseAll failed!"); } } closeLoadingScreen(); reloadMPConfig(); } // Disable cursor trapping if (war_GetTrapCursor()) { wzReleaseMouse(); } gameInitialised = false; }
// load up a single wrf file static bool levLoadSingleWRF(const char* name) { // free the old data if (!levReleaseAll()) { return false; } // create the dummy level data if (sSingleWRF.pName) { free(sSingleWRF.pName); } memset(&sSingleWRF, 0, sizeof(LEVEL_DATASET)); sSingleWRF.pName = strdup(name); // load up the WRF if (!stageOneInitialise()) { return false; } // load the data debug(LOG_WZ, "Loading %s ...", name); if (!resLoad(name, 0)) { return false; } if (!stageThreeInitialise()) { return false; } psCurrLevel = &sSingleWRF; return true; }
static void levTestLoad(const char* level) { static char savegameName[80]; bool retval; retval = levLoadData(level, NULL, GTYPE_SCENARIO_START); ASSERT(retval, "levLoadData failed selftest"); ASSERT(checkResearchStats(), "checkResearchStats failed selftest"); ASSERT(checkStructureStats(), "checkStructureStats failed selftest"); fprintf(stdout, "\t\tLoaded: %s\n", level); strcpy(savegameName, "selftest/"); PHYSFS_mkdir(savegameName); strcat(savegameName, level); strcat(savegameName, ".gam"); retval = saveGame(savegameName, GTYPE_SAVE_START); ASSERT(retval, "saveGame failed selftest"); strcpy(savegameName, "selftest/"); // we need to recreate string, because saveGame clobbered it strcat(savegameName, level); strcat(savegameName, ".gam"); retval = levReleaseAll(); assert(retval == true); fprintf(stdout, "\t\tSaved: %s\n", savegameName); }
// load up the data for a level bool levLoadData(const char* name, char *pSaveName, GAME_TYPE saveType) { LEVEL_DATASET *psNewLevel, *psBaseData, *psChangeLevel; SDWORD i; bool bCamChangeSaveGame; debug(LOG_WZ, "Loading level %s (%s, type %d)", name, pSaveName, (int)saveType); if (saveType == GTYPE_SAVE_START || saveType == GTYPE_SAVE_MIDMISSION) { if (!levReleaseAll()) { debug(LOG_ERROR, "Failed to unload old data"); return false; } } levelLoadType = saveType; // find the level dataset psNewLevel = levFindDataSet(name); if (psNewLevel == NULL) { debug(LOG_WZ, "Dataset %s not found - trying to load as WRF", name); return levLoadSingleWRF(name); } debug(LOG_WZ, "** Data set found is %s type %d", psNewLevel->pName, (int)psNewLevel->type); /* Keep a copy of the present level name */ sstrcpy(currentLevelName, name); bCamChangeSaveGame = false; if (pSaveName && saveType == GTYPE_SAVE_START) { if (psNewLevel->psChange != NULL) { bCamChangeSaveGame = true; debug(LOG_WZ, "** CAMCHANGE FOUND"); } } // select the change dataset if there is one psChangeLevel = NULL; if (((psNewLevel->psChange != NULL) && (psCurrLevel != NULL)) || bCamChangeSaveGame) { //store the level name debug(LOG_WZ, "Found CAMCHANGE dataset"); psChangeLevel = psNewLevel; psNewLevel = psNewLevel->psChange; } // ensure the correct dataset is loaded if (psNewLevel->type == LDS_CAMPAIGN) { debug(LOG_ERROR, "Cannot load a campaign dataset (%s)", psNewLevel->pName); return false; } else { if (psCurrLevel != NULL) { if ((psCurrLevel->psBaseData != psNewLevel->psBaseData) || (psCurrLevel->type < LDS_NONE && psNewLevel->type >= LDS_NONE) || (psCurrLevel->type >= LDS_NONE && psNewLevel->type < LDS_NONE)) { // there is a dataset loaded but it isn't the correct one debug(LOG_WZ, "Incorrect base dataset loaded (%p != %p, %d - %d)", psCurrLevel->psBaseData, psNewLevel->psBaseData, (int)psCurrLevel->type, (int)psNewLevel->type); if (!levReleaseAll()) // this sets psCurrLevel to NULL { return false; } } else { debug(LOG_WZ, "Correct base dataset already loaded."); } } // setup the correct dataset to load if necessary if (psCurrLevel == NULL) { if (psNewLevel->psBaseData != NULL) { debug(LOG_WZ, "Setting base dataset to load: %s", psNewLevel->psBaseData->pName); } psBaseData = psNewLevel->psBaseData; } else { debug(LOG_WZ, "No base dataset to load"); psBaseData = NULL; } } setCurrentMap(psNewLevel->pName, psNewLevel->players); if (!rebuildSearchPath(psNewLevel->dataDir, true)) { return false; } // reset the old mission data if necessary if (psCurrLevel != NULL) { debug(LOG_WZ, "Reseting old mission data"); if (!levReleaseMissionData()) { return false; } } // need to free the current map and droids etc for a save game if ((psBaseData == NULL) && (pSaveName != NULL)) { if (!saveGameReset()) { return false; } } // initialise if necessary if (psNewLevel->type == LDS_COMPLETE || //psNewLevel->type >= LDS_MULTI_TYPE_START || psBaseData != NULL) { debug(LOG_WZ, "Calling stageOneInitialise!"); if (!stageOneInitialise()) { return false; } } // load up a base dataset if necessary if (psBaseData != NULL) { debug(LOG_WZ, "Loading base dataset %s", psBaseData->pName); for(i=0; i<LEVEL_MAXFILES; i++) { if (psBaseData->apDataFiles[i]) { // load the data debug(LOG_WZ, "Loading [directory: %s] %s ...", PHYSFS_getRealDir(psBaseData->apDataFiles[i]), psBaseData->apDataFiles[i]); if (!resLoad(psBaseData->apDataFiles[i], i)) { return false; } } } } if (psNewLevel->type == LDS_CAMCHANGE) { if (!campaignReset()) { return false; } } if (psNewLevel->game == -1) //no .gam file to load - BETWEEN missions (for Editor games only) { ASSERT( psNewLevel->type == LDS_BETWEEN, "levLoadData: only BETWEEN missions do not need a .gam file" ); debug(LOG_WZ, "No .gam file for level: BETWEEN mission"); if (pSaveName != NULL) { if (psBaseData != NULL) { if (!stageTwoInitialise()) { return false; } } //set the mission type before the saveGame data is loaded if (saveType == GTYPE_SAVE_MIDMISSION) { debug(LOG_WZ, "Init mission stuff"); if (!startMissionSave(psNewLevel->type)) { return false; } debug(LOG_NEVER, "dataSetSaveFlag"); dataSetSaveFlag(); } debug(LOG_NEVER, "Loading savegame: %s", pSaveName); if (!loadGame(pSaveName, false, true,true)) { return false; } } if ((pSaveName == NULL) || (saveType == GTYPE_SAVE_START)) { debug(LOG_NEVER, "Start mission - no .gam"); if (!startMission((LEVEL_TYPE)psNewLevel->type, NULL)) { return false; } } } //we need to load up the save game data here for a camchange if (bCamChangeSaveGame) { if (pSaveName != NULL) { if (psBaseData != NULL) { if (!stageTwoInitialise()) { return false; } } debug(LOG_NEVER, "loading savegame: %s", pSaveName); if (!loadGame(pSaveName, false, true,true)) { return false; } if (!campaignReset()) { return false; } } } // load the new data debug(LOG_NEVER, "Loading mission dataset: %s", psNewLevel->pName); for(i=0; i < LEVEL_MAXFILES; i++) { if (psNewLevel->game == i) { // do some more initialising if necessary if (psNewLevel->type == LDS_COMPLETE || psNewLevel->type >= LDS_MULTI_TYPE_START || (psBaseData != NULL && !bCamChangeSaveGame)) { if (!stageTwoInitialise()) { return false; } } // load a savegame if there is one - but not if already done so if (pSaveName != NULL && !bCamChangeSaveGame) { //set the mission type before the saveGame data is loaded if (saveType == GTYPE_SAVE_MIDMISSION) { debug(LOG_WZ, "Init mission stuff"); if (!startMissionSave(psNewLevel->type)) { return false; } debug(LOG_NEVER, "dataSetSaveFlag"); dataSetSaveFlag(); } debug(LOG_NEVER, "Loading save game %s", pSaveName); if (!loadGame(pSaveName, false, true,true)) { return false; } } if ((pSaveName == NULL) || (saveType == GTYPE_SAVE_START)) { // load the game debug(LOG_WZ, "Loading scenario file %s", psNewLevel->apDataFiles[i]); switch (psNewLevel->type) { case LDS_COMPLETE: case LDS_CAMSTART: debug(LOG_WZ, "LDS_COMPLETE / LDS_CAMSTART"); if (!startMission(LDS_CAMSTART, psNewLevel->apDataFiles[i])) { return false; } break; case LDS_BETWEEN: debug(LOG_WZ, "LDS_BETWEEN"); if (!startMission(LDS_BETWEEN, psNewLevel->apDataFiles[i])) { return false; } break; case LDS_MKEEP: debug(LOG_WZ, "LDS_MKEEP"); if (!startMission(LDS_MKEEP, psNewLevel->apDataFiles[i])) { return false; } break; case LDS_CAMCHANGE: debug(LOG_WZ, "LDS_CAMCHANGE"); if (!startMission(LDS_CAMCHANGE, psNewLevel->apDataFiles[i])) { return false; } break; case LDS_EXPAND: debug(LOG_WZ, "LDS_EXPAND"); if (!startMission(LDS_EXPAND, psNewLevel->apDataFiles[i])) { return false; } break; case LDS_EXPAND_LIMBO: debug(LOG_WZ, "LDS_LIMBO"); if (!startMission(LDS_EXPAND_LIMBO, psNewLevel->apDataFiles[i])) { return false; } break; case LDS_MCLEAR: debug(LOG_WZ, "LDS_MCLEAR"); if (!startMission(LDS_MCLEAR, psNewLevel->apDataFiles[i])) { return false; } break; case LDS_MKEEP_LIMBO: debug(LOG_WZ, "LDS_MKEEP_LIMBO"); if (!startMission(LDS_MKEEP_LIMBO, psNewLevel->apDataFiles[i])) { return false; } break; default: ASSERT( psNewLevel->type >= LDS_MULTI_TYPE_START, "levLoadData: Unexpected mission type" ); debug(LOG_WZ, "default (MULTIPLAYER)"); if (!startMission(LDS_CAMSTART, psNewLevel->apDataFiles[i])) { return false; } break; } } } else if (psNewLevel->apDataFiles[i]) { // load the data debug(LOG_WZ, "Loading %s", psNewLevel->apDataFiles[i]); if (!resLoad(psNewLevel->apDataFiles[i], i + CURRENT_DATAID)) { return false; } } } if (pSaveName != NULL) { //load MidMission Extras if (!loadMissionExtras(pSaveName, psNewLevel->type)) { return false; } } if (bMultiPlayer) { loadMultiScripts(); } if (pSaveName != NULL && saveType == GTYPE_SAVE_MIDMISSION) { //load script stuff // load the event system state here for a save game debug(LOG_SAVE, "Loading script system state"); if (!loadScriptState(pSaveName)) { return false; } } if (!stageThreeInitialise()) { return false; } dataClearSaveFlag(); //this enables us to to start cam2/cam3 without going via a save game and get the extra droids //in from the script-controlled Transporters if (!pSaveName && psNewLevel->type == LDS_CAMSTART) { eventFireCallbackTrigger((TRIGGER_TYPE)CALL_NO_REINFORCEMENTS_LEFT); } //restore the level name for comparisons on next mission load up if (psChangeLevel == NULL) { psCurrLevel = psNewLevel; } else { psCurrLevel = psChangeLevel; } { // Copy this info to be used by the crash handler for the dump file char buf[256]; ssprintf(buf, "Current Level/map is %s", psCurrLevel->pName); addDumpInfo(buf); } return true; }
int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nShowCmd) // show state of window { FRAME_STATUS frameRet; BOOL quit = FALSE; BOOL Restart = FALSE; BOOL paused = FALSE;//, firstTime = TRUE; BOOL bGlide = FALSE; BOOL bVidMem = FALSE; SDWORD dispBitDepth = DISP_BITDEPTH; SDWORD introVideoControl = 3; GAMECODE loopStatus; iColour* psPaletteBuffer; SDWORD pSize; (void)nShowCmd; // (void)lpCmdLine; (void)hPrevInstance; // initialise all the command line states clStartWindowed = FALSE; clIntroVideo = FALSE; // save debugging info to disk DBOUTPUTFILE("debug.txt"); if (!pie_CheckForDX6()) { DBERROR(("Unable to create DirectX 6 interface.\nPlease ensure DirectX 6 or later is installed.")); return -1; } war_SetDefaultStates(); war_SetRendMode(REND_MODE_HAL); if (InitGlideDLL()) // In ivis02/3dfxdyn.c - returns FALSE if no glide2x.dll is not found { bGlideFound = TRUE; war_SetRendMode(REND_MODE_GLIDE);//default to glide this will be over writen by Registry or Command line if found } init://jump here from the end if re_initialising // initialise memory stuff, moved out of frameinit by ajl. if (!memInitialise()) { return FALSE; } if (!blkInitialise()) { return FALSE; } loadRenderMode();//get the registry entry for clRendMode bDisableLobby = FALSE; // parse the command line // if (bDisableLobby || !NetPlay.bLobbyLaunched) // { if(!reInit) { if(!ParseCommandLine(lpCmdLine,bGlideFound)) { return -1; } } // } // find out if the lobby stuff has been disabled // bDisableLobby = checkDisableLobby(); if (!bDisableLobby && !lobbyInitialise()) // ajl. Init net stuff. Lobby can modify startup conditions like commandline. { return -1; } reInit = FALSE;//just so we dont restart again #ifdef USE_FILE_PATH _chdir(FILE_PATH); #endif //always start windowed toggle to fullscreen later if (war_GetRendMode() == REND_MODE_HAL) { bGlide = FALSE; bVidMem = TRUE; dispBitDepth = DISP_HARDBITDEPTH; } else if (war_GetRendMode() == REND_MODE_REF) { bGlide = FALSE; bVidMem = TRUE; dispBitDepth = DISP_HARDBITDEPTH; } else if (war_GetRendMode() == REND_MODE_RGB) { bGlide = FALSE; bVidMem = FALSE; dispBitDepth = DISP_HARDBITDEPTH; } else if (war_GetRendMode() == REND_MODE_GLIDE) { bGlide = TRUE; bVidMem = FALSE; dispBitDepth = DISP_HARDBITDEPTH; } else { bGlide = FALSE; bVidMem = FALSE; dispBitDepth = DISP_BITDEPTH; } // frameDDEnumerate(); if (!frameInitialise(hInstance, "Warzone 2100", DISP_WIDTH,DISP_HEIGHT,dispBitDepth, !clStartWindowed, bVidMem, bGlide)) { return -1; } if (!wdgLoadAllWDGCatalogs()) { return -1; } pie_SetFogStatus(FALSE); pie_ScreenFlip(CLEAR_BLACK); pie_ScreenFlip(CLEAR_BLACK); if (war_GetRendMode() == REND_MODE_GLIDE) { dbg_SetMessageBoxCallback(fxMBCallback); dbg_SetErrorBoxCallback(fxMBCallback); dbg_SetAssertCallback(fxMBCallback); } if(gameStatus == GS_VIDEO_MODE) { introVideoControl = 0;//play video gameStatus = GS_TITLE_SCREEN; } //load palette psPaletteBuffer = (iColour*)MALLOC(256 * sizeof(iColour)+1); if (psPaletteBuffer == NULL) { DBERROR(("Out of memory")); return -1; } if (!loadFileToBuffer("palette.bin", (UBYTE*)psPaletteBuffer, (256 * sizeof(iColour)+1),(UDWORD*)&pSize)) { DBERROR(("Couldn't load palette data")); return -1; } pal_AddNewPalette(psPaletteBuffer); FREE(psPaletteBuffer); if (war_GetRendMode() == REND_MODE_GLIDE) { pie_LoadBackDrop(SCREEN_RANDOMBDROP,TRUE); } else { pie_LoadBackDrop(SCREEN_RANDOMBDROP,FALSE); } pie_SetFogStatus(FALSE); pie_ScreenFlip(CLEAR_BLACK); quit = FALSE; /* check CDROM drive available */ if ( cdspan_CheckCDAvailable() == FALSE ) { DBERROR( ("Cannot detect CDROM drive\n") ); quit = TRUE; } if (!systemInitialise()) { return -1; } // If windowed mode not requested then toggle to full screen. Doing // it here rather than in the call to frameInitialise fixes a problem // where machines with an NVidia and a 3DFX would kill the 3dfx display. (Definitly a HACK, PD) /* if(!clStartWindowed) { screenToggleMode(); } */ //set all the pause states to false setAllPauseStates(FALSE); while (!quit) { // Do the game mode specific initialisation. switch(gameStatus) { case GS_TITLE_SCREEN: screen_RestartBackDrop(); if (!frontendInitialise("wrf\\frontend.wrf")) { goto exit; } frontendInitialised = TRUE; frontendInitVars(); //if intro required set up the video if (introVideoControl <= 1) { seq_ClearSeqList(); seq_AddSeqToList("eidos-logo.rpl",NULL, NULL, FALSE,0); seq_AddSeqToList("pumpkin.rpl",NULL, NULL, FALSE,0); seq_AddSeqToList("titles.rpl",NULL, NULL, FALSE,0); seq_AddSeqToList("devastation.rpl",NULL,"devastation.txa", FALSE,0); seq_StartNextFullScreenVideo(); introVideoControl = 2; } break; case GS_SAVEGAMELOAD: screen_RestartBackDrop(); gameStatus = GS_NORMAL; // load up a save game if (!loadGameInit(saveGameName,FALSE)) { goto exit; } /*if (!levLoadData(pLevelName, saveGameName)) { return -1; }*/ screen_StopBackDrop(); break; case GS_NORMAL: if (!levLoadData(pLevelName, NULL, 0)) { goto exit; } //after data is loaded check the research stats are valid if (!checkResearchStats()) { DBERROR(("Invalid Research Stats")); goto exit; } //and check the structure stats are valid if (!checkStructureStats()) { DBERROR(("Invalid Structure Stats")); goto exit; } //set a flag for the trigger/event system to indicate initialisation is complete gameInitialised = TRUE; screen_StopBackDrop(); break; case GS_VIDEO_MODE: DBERROR(("Video_mode no longer valid")); if (introVideoControl == 0) { videoInitialised = TRUE; } break; default: DBERROR(("Unknown game status on startup!")); } DBPRINTF(("Entering main loop\n")); Restart = FALSE; //firstTime = TRUE; while (!Restart) { frameRet = frameUpdate(); if (pie_GetRenderEngine() == ENGINE_D3D) { if ( frameRet == FRAME_SETFOCUS ) { D3DTestCooperativeLevel( TRUE ); } else { D3DTestCooperativeLevel( FALSE ); } } switch (frameRet) { case FRAME_KILLFOCUS: paused = TRUE; gameTimeStop(); if (pie_GetRenderEngine() == ENGINE_GLIDE) { if (!gl_Deactivate()) { quit = TRUE; Restart = TRUE; } } mixer_SaveIngameVols(); mixer_RestoreWinVols(); audio_StopAll(); break; case FRAME_SETFOCUS: paused = FALSE; gameTimeStart(); if (!dispModeChange()) { quit = TRUE; Restart = TRUE; } if (pie_GetRenderEngine() == ENGINE_GLIDE) { if (!gl_Reactivate()) { quit = TRUE; Restart = TRUE; } } else if (pie_GetRenderEngine() == ENGINE_D3D) { dtm_RestoreTextures(); } mixer_SaveWinVols(); mixer_RestoreIngameVols(); break; case FRAME_QUIT: quit = TRUE; Restart = TRUE; break; } lastStatus = gameStatus; if ((!paused) && (!quit)) { switch(gameStatus) { case GS_TITLE_SCREEN: pie_SetSwirlyBoxes(TRUE); if (loop_GetVideoStatus()) { videoLoop(); } else { switch(titleLoop()) { case TITLECODE_QUITGAME: DBPRINTF(("TITLECODE_QUITGAME\n")); Restart = TRUE; quit = TRUE; break; // case TITLECODE_ATTRACT: // DBPRINTF(("TITLECODE_ATTRACT\n")); // break; case TITLECODE_SAVEGAMELOAD: DBPRINTF(("TITLECODE_SAVEGAMELOAD\n")); gameStatus = GS_SAVEGAMELOAD; Restart = TRUE; break; case TITLECODE_STARTGAME: DBPRINTF(("TITLECODE_STARTGAME\n")); gameStatus = GS_NORMAL; Restart = TRUE; break; case TITLECODE_SHOWINTRO: DBPRINTF(("TITLECODE_SHOWINTRO\n")); seq_ClearSeqList(); seq_AddSeqToList("eidos-logo.rpl",NULL,NULL, FALSE,0); seq_AddSeqToList("pumpkin.rpl",NULL,NULL, FALSE,0); seq_AddSeqToList("titles.rpl",NULL,NULL, FALSE,0); seq_AddSeqToList("devastation.rpl",NULL,"devastation.txa", FALSE,0); seq_StartNextFullScreenVideo(); introVideoControl = 2;//play the video but dont init the sound system break; case TITLECODE_CONTINUE: break; default: DBERROR(("Unknown code returned by titleLoop")); } } pie_SetSwirlyBoxes(FALSE); break; /* case GS_SAVEGAMELOAD: if (loopNewLevel) { //the start of a campaign/expand mission DBPRINTF(("GAMECODE_NEWLEVEL\n")); loopNewLevel = FALSE; // gameStatus is unchanged, just loading additional data Restart = TRUE; } break; */ case GS_NORMAL: if (loop_GetVideoStatus()) { videoLoop(); } else { loopStatus = gameLoop(); switch(loopStatus) { case GAMECODE_QUITGAME: DBPRINTF(("GAMECODE_QUITGAME\n")); gameStatus = GS_TITLE_SCREEN; Restart = TRUE; /*#ifdef NON_INTERACT quit = TRUE; #endif*/ if(NetPlay.bLobbyLaunched) { // changeTitleMode(QUIT); quit = TRUE; } break; case GAMECODE_FASTEXIT: DBPRINTF(("GAMECODE_FASTEXIT\n")); Restart = TRUE; quit = TRUE; break; case GAMECODE_LOADGAME: DBPRINTF(("GAMECODE_LOADGAME\n")); Restart = TRUE; gameStatus = GS_SAVEGAMELOAD; break; case GAMECODE_PLAYVIDEO: DBPRINTF(("GAMECODE_PLAYVIDEO\n")); //dont schange mode any more gameStatus = GS_VIDEO_MODE; Restart = FALSE; break; case GAMECODE_NEWLEVEL: DBPRINTF(("GAMECODE_NEWLEVEL\n")); // gameStatus is unchanged, just loading additional data Restart = TRUE; break; case GAMECODE_RESTARTGAME: DBPRINTF(("GAMECODE_RESTARTGAME\n")); Restart = TRUE; break; case GAMECODE_CONTINUE: break; default: DBERROR(("Unknown code returned by gameLoop")); } } break; case GS_VIDEO_MODE: DBERROR(("Video_mode no longer valid")); if (loop_GetVideoStatus()) { videoLoop(); } else { if (introVideoControl <= 1) { seq_ClearSeqList(); seq_AddSeqToList("factory.rpl",NULL,NULL, FALSE,0); seq_StartNextFullScreenVideo();//"sequences\\factory.rpl","sequences\\factory.wav"); introVideoControl = 2; } else { DBPRINTF(("VIDEO_QUIT\n")); if (introVideoControl == 2)//finished playing intro video { gameStatus = GS_TITLE_SCREEN; if (videoInitialised) { Restart = TRUE; } introVideoControl = 3; } else { gameStatus = GS_NORMAL; } } } break; default: DBERROR(("Weirdy game status I'm afraid!!")); break; } gameTimeUpdate(); } } // End of !Restart loop. // Do game mode specific shutdown. switch(lastStatus) { case GS_TITLE_SCREEN: if (!frontendShutdown()) { goto exit; } frontendInitialised = FALSE; break; /* case GS_SAVEGAMELOAD: //get the next level to load up gameStatus = GS_NORMAL; break;*/ case GS_NORMAL: if (loopStatus != GAMECODE_NEWLEVEL) { initLoadingScreen(TRUE,FALSE); // returning to f.e. do a loader.render not active pie_EnableFog(FALSE);//dont let the normal loop code set status on fogStatus = 0; if (loopStatus != GAMECODE_LOADGAME) { levReleaseAll(); } } gameInitialised = FALSE; break; case GS_VIDEO_MODE: DBERROR(("Video_mode no longer valid")); if (videoInitialised) { videoInitialised = FALSE; } break; default: DBERROR(("Unknown game status on shutdown!")); break; } } // End of !quit loop. DBPRINTF(("Shuting down application\n")); systemShutdown(); pal_ShutDown(); frameShutDown(); ShutdownGlideDLL(); if (reInit) goto init; PostQuitMessage(0); return 0; exit: DBPRINTF(("Shutting down after fail\n")); systemShutdown(); pal_ShutDown(); frameShutDown(); ShutdownGlideDLL(); PostQuitMessage(1); return 1; }