void loop_SetVideoPlaybackMode(void) { videoMode += 1; paused = true; video = true; gameTimeStop(); pie_SetFogStatus(false); audio_StopAll(); wzShowMouse(false); screen_StopBackDrop(); pie_ScreenFlip(CLEAR_BLACK); }
/*! * Activation (focus change) eventhandler */ static void handleActiveEvent(SDL_ActiveEvent * activeEvent) { // Ignore focus loss through SDL_APPMOUSEFOCUS, since it mostly happens accidentialy // active.state is a bitflag! Mixed events (eg. APPACTIVE|APPMOUSEFOCUS) will thus not be ignored. if ( activeEvent->state == SDL_APPMOUSEFOCUS ) { setMouseScroll(activeEvent->gain); return; } if ( activeEvent->gain == 1 ) { debug( LOG_NEVER, "WM_SETFOCUS"); if (focusState != FOCUS_IN) { focusState = FOCUS_IN; // Don't pause in multiplayer! if (war_GetPauseOnFocusLoss() && !NetPlay.bComms) { gameTimeStart(); audio_ResumeAll(); cdAudio_Resume(); } // enable scrolling setScrollPause(false); resetScroll(); } } else { debug( LOG_NEVER, "WM_KILLFOCUS"); if (focusState != FOCUS_OUT) { focusState = FOCUS_OUT; // Don't pause in multiplayer! if (war_GetPauseOnFocusLoss() && !NetPlay.bComms) { gameTimeStop(); audio_PauseAll(); cdAudio_Pause(); } /* Have to tell the input system that we've lost focus */ inputLooseFocus(); // stop scrolling setScrollPause(true); } } }
/*sets which states need to be paused when the intelligence screen is up*/ void setIntelligencePauseState(void) { if (!bMultiPlayer) { //need to clear mission widgets from being shown on intel screen clearMissionWidgets(); gameTimeStop(); setGameUpdatePause(true); if(!bInTutorial) { // Don't pause the scripts or the console if the tutorial is running. setScriptPause(true); setConsolePause(true); } setScrollPause(true); screen_RestartBackDrop(); } }
// //////////////////////////////////////////////////// static BOOL _addLoadSave(BOOL bLoad,CHAR *sSearchPath,CHAR *sExtension, CHAR *title) { W_FORMINIT sFormInit; W_BUTINIT sButInit; W_LABINIT sLabInit; UDWORD slotCount; static STRING sSlots[10][64]; STRING sTemp[255]; WIN32_FIND_DATA found; HANDLE dir; mode = bLoad; if(GetCurrentDirectory(255,(char*)&sTemp) == 0) { return FALSE; // failed, directory probably didn't exist. } if ((bLoadSaveMode == LOAD_INGAME) || (bLoadSaveMode == SAVE_INGAME)) { if (!bMultiPlayer || (NetPlay.bComms ==0)) { gameTimeStop(); if(GetGameMode() == GS_NORMAL) { BOOL radOnScreen = radarOnScreen; // Only do this in main game. bRender3DOnly = TRUE; radarOnScreen = FALSE; displayWorld(); // Just display the 3d, no interface pie_UploadDisplayBuffer(DisplayBuffer); // Upload the current display back buffer into system memory. iV_ScaleBitmapRGB(DisplayBuffer,iV_GetDisplayWidth(), iV_GetDisplayHeight(),2,2,2); // Make it darker. radarOnScreen = radOnScreen; bRender3DOnly = FALSE; } setGamePauseStatus( TRUE ); setGameUpdatePause(TRUE); setScriptPause(TRUE); setScrollPause(TRUE); setConsolePause(TRUE); } forceHidePowerBar(); intRemoveReticule(); } CreateDirectory(sSearchPath,NULL); // create the directory required... fails if already there, so no problem. widgCreateScreen(&psRequestScreen); // init the screen. widgSetTipFont(psRequestScreen,WFont); /* add a form to place the tabbed form on */ memset(&sFormInit, 0, sizeof(W_FORMINIT)); sFormInit.formID = 0; sFormInit.id = LOADSAVE_FORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = (SWORD)(LOADSAVE_X); sFormInit.y = (SWORD)(LOADSAVE_Y); sFormInit.width = LOADSAVE_W; sFormInit.height = LOADSAVE_H; sFormInit.disableChildren = TRUE; sFormInit.pDisplay = intOpenPlainForm; widgAddForm(psRequestScreen, &sFormInit); // Add Banner sFormInit.formID = LOADSAVE_FORM; sFormInit.id = LOADSAVE_BANNER; sFormInit.x = LOADSAVE_HGAP; sFormInit.y = LOADSAVE_VGAP; sFormInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); sFormInit.height = LOADSAVE_BANNER_DEPTH; sFormInit.disableChildren = FALSE; sFormInit.pDisplay = displayLoadBanner; sFormInit.pUserData = (VOID *)bLoad; widgAddForm(psRequestScreen, &sFormInit); // Add Banner Label memset(&sLabInit, 0, sizeof(W_LABINIT)); sLabInit.formID = LOADSAVE_BANNER; sLabInit.id = LOADSAVE_LABEL; sLabInit.style = WLAB_ALIGNCENTRE; sLabInit.x = 0; sLabInit.y = 4; sLabInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); //LOADSAVE_W; sLabInit.height = 20; sLabInit.pText = title; sLabInit.FontID = WFont; widgAddLabel(psRequestScreen, &sLabInit); // add cancel. memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_BANNER; sButInit.x = 4; sButInit.y = 3; sButInit.width = iV_GetImageWidth(IntImages,IMAGE_NRUTER); sButInit.height = iV_GetImageHeight(IntImages,IMAGE_NRUTER); sButInit.pUserData = (void*)PACKDWORD_TRI(0,IMAGE_NRUTER , IMAGE_NRUTER); sButInit.id = LOADSAVE_CANCEL; sButInit.style = WBUT_PLAIN; sButInit.pTip = strresGetString(psStringRes, STR_MISC_CLOSE); sButInit.FontID = WFont; sButInit.pDisplay = intDisplayImageHilight; widgAddButton(psRequestScreen, &sButInit); // add slots memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_FORM; sButInit.style = WBUT_PLAIN; sButInit.width = LOADENTRY_W; sButInit.height = LOADENTRY_H; sButInit.pDisplay = displayLoadSlot; sButInit.FontID = WFont; for(slotCount = 0; slotCount< 10 ; slotCount++) { sButInit.id = slotCount+LOADENTRY_START; if(slotCount<5) { sButInit.x = LOADSAVE_HGAP; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2*LOADSAVE_VGAP)) + ( slotCount*(LOADSAVE_VGAP+LOADENTRY_H))); } else { sButInit.x = (2*LOADSAVE_HGAP)+LOADENTRY_W; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount-5) *(LOADSAVE_VGAP+LOADENTRY_H))); } widgAddButton(psRequestScreen, &sButInit); } // fill slots. slotCount = 0; sprintf(sTemp,"%s*.%s",sSearchPath,sExtension); // form search string. strcpy(sPath,sSearchPath); // setup locals. strcpy(sExt,sExtension); dir =FindFirstFile(sTemp,&found); if(dir != INVALID_HANDLE_VALUE) { while( TRUE ) { /* Set the tip and add the button */ found.cFileName[strlen(found.cFileName) -4 ] = '\0'; // chop extension strcpy(sSlots[slotCount],found.cFileName); //store it! ((W_BUTTON *)widgGetFromID(psRequestScreen,LOADENTRY_START+slotCount))->pTip = sSlots[slotCount]; ((W_BUTTON *)widgGetFromID(psRequestScreen,LOADENTRY_START+slotCount))->pText = sSlots[slotCount]; slotCount++; // goto next but. if(!FindNextFile(dir,&found ) || slotCount == 10 )// only show upto 10 entrys. { break; } } } FindClose(dir); bLoadSaveUp = TRUE; return TRUE; }
// //////////////////////////////////////////////////////////////////////////// bool addLoadSave(LOADSAVE_MODE savemode, const char *title) { bool bLoad = true; char NewSaveGamePath[PATH_MAX] = {'\0'}; bLoadSaveMode = savemode; UDWORD slotCount; static char sSlotCaps[totalslots][totalslotspace]; static char sSlotTips[totalslots][totalslotspace]; char **i, **files; switch(savemode) { case LOAD_FRONTEND_MISSION: case LOAD_INGAME_MISSION: case LOAD_MISSIONEND: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "campaign"); break; case LOAD_FRONTEND_SKIRMISH: case LOAD_INGAME_SKIRMISH: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "skirmish"); break; case SAVE_MISSIONEND: case SAVE_INGAME_MISSION: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "campaign"); bLoad = false; break; case SAVE_INGAME_SKIRMISH: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "skirmish"); bLoad = false; break; default: ASSERT("Invalid load/save mode!", "Invalid load/save mode!"); ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "campaign"); break; } mode = bLoad; debug(LOG_SAVE, "called (%d, %s)", bLoad, title); if ((bLoadSaveMode == LOAD_INGAME_MISSION) || (bLoadSaveMode == SAVE_INGAME_MISSION) || (bLoadSaveMode == LOAD_INGAME_SKIRMISH) || (bLoadSaveMode == SAVE_INGAME_SKIRMISH)) { if (!bMultiPlayer || (NetPlay.bComms ==0)) { gameTimeStop(); if(GetGameMode() == GS_NORMAL) { bool radOnScreen = radarOnScreen; // Only do this in main game. bRender3DOnly = true; radarOnScreen = false; displayWorld(); // Just display the 3d, no interface radarOnScreen = radOnScreen; bRender3DOnly = false; } setGamePauseStatus( true ); setGameUpdatePause(true); setScriptPause(true); setScrollPause(true); setConsolePause(true); } forceHidePowerBar(); intRemoveReticule(); } psRequestScreen = new W_SCREEN; WIDGET *parent = psRequestScreen->psForm; /* add a form to place the tabbed form on */ // we need the form to be long enough for all resolutions, so we take the total number of items * height // and * the gaps, add the banner, and finally, the fudge factor ;) IntFormAnimated *loadSaveForm = new IntFormAnimated(parent); loadSaveForm->id = LOADSAVE_FORM; loadSaveForm->setGeometry(LOADSAVE_X, LOADSAVE_Y, LOADSAVE_W, slotsInColumn*(LOADENTRY_H + LOADSAVE_HGAP) + LOADSAVE_BANNER_DEPTH + 20); // Add Banner W_FORMINIT sFormInit; sFormInit.formID = LOADSAVE_FORM; sFormInit.id = LOADSAVE_BANNER; sFormInit.x = LOADSAVE_HGAP; sFormInit.y = LOADSAVE_VGAP; sFormInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); sFormInit.height = LOADSAVE_BANNER_DEPTH; sFormInit.pDisplay = displayLoadBanner; sFormInit.UserData = bLoad; widgAddForm(psRequestScreen, &sFormInit); // Add Banner Label W_LABINIT sLabInit; sLabInit.formID = LOADSAVE_BANNER; sLabInit.FontID = font_large; sLabInit.id = LOADSAVE_LABEL; sLabInit.style = WLAB_ALIGNCENTRE; sLabInit.x = 0; sLabInit.y = 0; sLabInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); //LOADSAVE_W; sLabInit.height = LOADSAVE_BANNER_DEPTH; //This looks right -Q sLabInit.pText = title; widgAddLabel(psRequestScreen, &sLabInit); // add cancel. W_BUTINIT sButInit; sButInit.formID = LOADSAVE_BANNER; sButInit.x = 8; sButInit.y = 10; sButInit.width = iV_GetImageWidth(IntImages,IMAGE_NRUTER); sButInit.height = iV_GetImageHeight(IntImages,IMAGE_NRUTER); sButInit.UserData = PACKDWORD_TRI(0,IMAGE_NRUTER , IMAGE_NRUTER); sButInit.id = LOADSAVE_CANCEL; sButInit.style = WBUT_PLAIN; sButInit.pTip = _("Close"); sButInit.pDisplay = intDisplayImageHilight; widgAddButton(psRequestScreen, &sButInit); // add slots sButInit = W_BUTINIT(); sButInit.formID = LOADSAVE_FORM; sButInit.style = WBUT_PLAIN; sButInit.width = LOADENTRY_W; sButInit.height = LOADENTRY_H; sButInit.pDisplay = displayLoadSlot; for(slotCount = 0; slotCount< totalslots; slotCount++) { sButInit.id = slotCount+LOADENTRY_START; if(slotCount < slotsInColumn) { sButInit.x = 22 + LOADSAVE_HGAP; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2*LOADSAVE_VGAP)) + ( slotCount*(LOADSAVE_VGAP+LOADENTRY_H))); } else if (slotCount >= slotsInColumn && (slotCount < (slotsInColumn *2))) { sButInit.x = 22 + (2*LOADSAVE_HGAP + LOADENTRY_W); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } else { sButInit.x = 22 + (3*LOADSAVE_HGAP + (2*LOADENTRY_W)); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } widgAddButton(psRequestScreen, &sButInit); } // fill slots. slotCount = 0; debug(LOG_SAVE, "Searching \"%s\" for savegames", NewSaveGamePath); // add savegame filenames minus extensions to buttons files = PHYSFS_enumerateFiles(NewSaveGamePath); for (i = files; *i != NULL; ++i) { W_BUTTON *button; char savefile[256]; time_t savetime; struct tm *timeinfo; // See if this filename contains the extension we're looking for if (!strstr(*i, sExt)) { // If it doesn't, move on to the next filename continue; } button = (W_BUTTON*)widgGetFromID(psRequestScreen, LOADENTRY_START + slotCount); debug(LOG_SAVE, "We found [%s]", *i); /* Figure save-time */ snprintf(savefile, sizeof(savefile), "%s/%s", NewSaveGamePath, *i); savetime = PHYSFS_getLastModTime(savefile); timeinfo = localtime(&savetime); strftime(sSlotTips[slotCount], sizeof(sSlotTips[slotCount]), "%x %X", timeinfo); /* Set the button-text */ (*i)[strlen(*i) - 4] = '\0'; // remove .gam extension sstrcpy(sSlotCaps[slotCount], *i); //store it! /* Add button */ button->pTip = sSlotTips[slotCount]; button->pText = sSlotCaps[slotCount]; slotCount++; // goto next but... if (slotCount == totalslots) { break; } } PHYSFS_freeList(files); bLoadSaveUp = true; 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; }
//**************************************************************************************** // Load menu/save menu? //***************************************************************************************** static BOOL _addLoadSave(BOOL bLoad, const char *sSearchPath, const char *sExtension, const char *title) { W_FORMINIT sFormInit; W_BUTINIT sButInit; W_LABINIT sLabInit; UDWORD slotCount; // removed hardcoded values! change with the defines above! -Q static char sSlotCaps[totalslots][totalslotspace]; static char sSlotTips[totalslots][totalslotspace]; char **i, **files; const char* checkExtension; mode = bLoad; debug(LOG_SAVE, "called (%d, %s, %s, %s)", bLoad, sSearchPath, sExtension, title); if ((bLoadSaveMode == LOAD_INGAME) || (bLoadSaveMode == SAVE_INGAME)) { if (!bMultiPlayer || (NetPlay.bComms ==0)) { gameTimeStop(); if(GetGameMode() == GS_NORMAL) { BOOL radOnScreen = radarOnScreen; // Only do this in main game. bRender3DOnly = true; radarOnScreen = false; displayWorld(); // Just display the 3d, no interface pie_UploadDisplayBuffer(); // Upload the current display back buffer into system memory. radarOnScreen = radOnScreen; bRender3DOnly = false; } setGamePauseStatus( true ); setGameUpdatePause(true); setScriptPause(true); setScrollPause(true); setConsolePause(true); } forceHidePowerBar(); intRemoveReticule(); } (void) PHYSFS_mkdir(sSearchPath); // just in case psRequestScreen = widgCreateScreen(); // init the screen widgSetTipFont(psRequestScreen,font_regular); /* add a form to place the tabbed form on */ memset(&sFormInit, 0, sizeof(W_FORMINIT)); sFormInit.formID = 0; //this adds the blue background, and the "box" behind the buttons -Q sFormInit.id = LOADSAVE_FORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = (SWORD) LOADSAVE_X; sFormInit.y = (SWORD) LOADSAVE_Y; sFormInit.width = LOADSAVE_W; // we need the form to be long enough for all resolutions, so we take the total number of items * height // and * the gaps, add the banner, and finally, the fudge factor ;) sFormInit.height = (slotsInColumn * LOADENTRY_H + LOADSAVE_HGAP* slotsInColumn)+ LOADSAVE_BANNER_DEPTH+20; sFormInit.disableChildren = true; sFormInit.pDisplay = intOpenPlainForm; widgAddForm(psRequestScreen, &sFormInit); // Add Banner sFormInit.formID = LOADSAVE_FORM; sFormInit.id = LOADSAVE_BANNER; sFormInit.x = LOADSAVE_HGAP; sFormInit.y = LOADSAVE_VGAP; sFormInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); sFormInit.height = LOADSAVE_BANNER_DEPTH; sFormInit.disableChildren = false; sFormInit.pDisplay = displayLoadBanner; sFormInit.UserData = bLoad; widgAddForm(psRequestScreen, &sFormInit); // Add Banner Label memset(&sLabInit, 0, sizeof(W_LABINIT)); sLabInit.formID = LOADSAVE_BANNER; sLabInit.id = LOADSAVE_LABEL; sLabInit.style = WLAB_ALIGNCENTRE; sLabInit.x = 0; sLabInit.y = 3; sLabInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); //LOADSAVE_W; sLabInit.height = LOADSAVE_BANNER_DEPTH; //This looks right -Q sLabInit.pText = title; sLabInit.FontID = font_regular; widgAddLabel(psRequestScreen, &sLabInit); // add cancel. memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_BANNER; sButInit.x = 8; sButInit.y = 8; sButInit.width = iV_GetImageWidth(IntImages,IMAGE_NRUTER); sButInit.height = iV_GetImageHeight(IntImages,IMAGE_NRUTER); sButInit.UserData = PACKDWORD_TRI(0,IMAGE_NRUTER , IMAGE_NRUTER); sButInit.id = LOADSAVE_CANCEL; sButInit.style = WBUT_PLAIN; sButInit.pTip = _("Close"); sButInit.FontID = font_regular; sButInit.pDisplay = intDisplayImageHilight; widgAddButton(psRequestScreen, &sButInit); // add slots memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_FORM; sButInit.style = WBUT_PLAIN; sButInit.width = LOADENTRY_W; sButInit.height = LOADENTRY_H; sButInit.pDisplay = displayLoadSlot; sButInit.FontID = font_regular; for(slotCount = 0; slotCount< totalslots; slotCount++) { sButInit.id = slotCount+LOADENTRY_START; if(slotCount < slotsInColumn) { sButInit.x = 22 + LOADSAVE_HGAP; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2*LOADSAVE_VGAP)) + ( slotCount*(LOADSAVE_VGAP+LOADENTRY_H))); } else if (slotCount >= slotsInColumn && (slotCount < (slotsInColumn *2))) { sButInit.x = 22 + (2*LOADSAVE_HGAP + LOADENTRY_W); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } else { sButInit.x = 22 + (3*LOADSAVE_HGAP + (2*LOADENTRY_W)); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } widgAddButton(psRequestScreen, &sButInit); } // fill slots. slotCount = 0; sstrcpy(sPath, sSearchPath); // setup locals. sstrcpy(sExt, sExtension); debug(LOG_SAVE, "Searching \"%s\" for savegames", sSearchPath); // Check for an extension like ".ext", not "ext" sasprintf((char**)&checkExtension, ".%s", sExtension); // add savegame filenames minus extensions to buttons files = PHYSFS_enumerateFiles(sSearchPath); for (i = files; *i != NULL; ++i) { W_BUTTON *button; char savefile[256]; time_t savetime; // See if this filename contains the extension we're looking for if (!strstr(*i, checkExtension)) { // If it doesn't, move on to the next filename continue; } button = (W_BUTTON*)widgGetFromID(psRequestScreen, LOADENTRY_START + slotCount); debug(LOG_SAVE, "We found [%s]", *i); /* Figure save-time */ snprintf(savefile, sizeof(savefile), "%s/%s", sSearchPath, *i); savetime = PHYSFS_getLastModTime(savefile); sstrcpy(sSlotTips[slotCount], ctime(&savetime)); /* Set the button-text */ (*i)[strlen(*i) - 4] = '\0'; // remove .gam extension sstrcpy(sSlotCaps[slotCount], *i); //store it! /* Add button */ button->pTip = sSlotTips[slotCount]; button->pText = sSlotCaps[slotCount]; slotCount++; // goto next but... if (slotCount == totalslots) { break; } } PHYSFS_freeList(files); bLoadSaveUp = true; return true; }