VOID PAL_GameMain( VOID ) /*++ Purpose: The game entry routine. Parameters: None. Return value: None. --*/ { DWORD dwTime; // // Show the opening menu. // gpGlobals->bCurrentSaveSlot = (BYTE)PAL_OpeningMenu(); // // Initialize game data and set the flags to load the game resources. // PAL_InitGameData(gpGlobals->bCurrentSaveSlot); // // Run the main game loop. // dwTime = SDL_GetTicks(); while (TRUE) { // // Do some initialization at game start. // if (gpGlobals->fGameStart) { PAL_GameStart(); gpGlobals->fGameStart = FALSE; } // // Load the game resources if needed. // PAL_LoadResources(); // // Clear the input state of previous frame. // PAL_ClearKeyState(); // // Wait for the time of one frame. Accept input here. // PAL_ProcessEvent(); while (SDL_GetTicks() <= dwTime) { PAL_ProcessEvent(); SDL_Delay(1); } // // Set the time of the next frame. // dwTime = SDL_GetTicks() + FRAME_TIME; // // Run the main frame routine. // PAL_StartFrame(); } }
static BOOL PAL_SystemMenu( VOID ) /*++ Purpose: Show the system menu. Parameters: None. Return value: TRUE if user made some operations in the menu, FALSE if user cancelled. --*/ { LPBOX lpMenuBox; WORD wReturnValue; int iSlot, i, iSavedTimes; FILE *fp; const SDL_Rect rect = {40, 60, 100, 135}; // // Create menu items // #ifdef PAL_CLASSIC MENUITEM rgSystemMenuItem[5] = { // value label enabled pos { 1, SYSMENU_LABEL_SAVE, TRUE, PAL_XY(53, 72) }, { 2, SYSMENU_LABEL_LOAD, TRUE, PAL_XY(53, 72 + 18) }, { 3, SYSMENU_LABEL_MUSIC, TRUE, PAL_XY(53, 72 + 36) }, { 4, SYSMENU_LABEL_SOUND, TRUE, PAL_XY(53, 72 + 54) }, { 5, SYSMENU_LABEL_QUIT, TRUE, PAL_XY(53, 72 + 72) }, }; #else MENUITEM rgSystemMenuItem[6] = { // value label enabled pos { 1, SYSMENU_LABEL_SAVE, TRUE, PAL_XY(53, 72) }, { 2, SYSMENU_LABEL_LOAD, TRUE, PAL_XY(53, 72 + 18) }, { 3, SYSMENU_LABEL_MUSIC, TRUE, PAL_XY(53, 72 + 36) }, { 4, SYSMENU_LABEL_SOUND, TRUE, PAL_XY(53, 72 + 54) }, { 5, SYSMENU_LABEL_BATTLEMODE, TRUE, PAL_XY(53, 72 + 72) }, { 6, SYSMENU_LABEL_QUIT, TRUE, PAL_XY(53, 72 + 90) }, }; #endif // // Create the menu box. // #ifdef PAL_CLASSIC lpMenuBox = PAL_CreateBox(PAL_XY(40, 60), 4, 3, 0, TRUE); #else lpMenuBox = PAL_CreateBox(PAL_XY(40, 60), 5, 3, 0, TRUE); #endif VIDEO_UpdateScreen(&rect); // // Perform the menu. // #ifdef PAL_CLASSIC wReturnValue = PAL_ReadMenu(PAL_SystemMenu_OnItemChange, rgSystemMenuItem, 5, gpGlobals->iCurSystemMenuItem, MENUITEM_COLOR); #else wReturnValue = PAL_ReadMenu(PAL_SystemMenu_OnItemChange, rgSystemMenuItem, 6, gpGlobals->iCurSystemMenuItem, MENUITEM_COLOR); #endif if (wReturnValue == MENUITEM_VALUE_CANCELLED) { // // User cancelled the menu // PAL_DeleteBox(lpMenuBox); VIDEO_UpdateScreen(&rect); return FALSE; } switch (wReturnValue) { case 1: // // Save game // iSlot = PAL_SaveSlotMenu(gpGlobals->bCurrentSaveSlot); if (iSlot != MENUITEM_VALUE_CANCELLED) { gpGlobals->bCurrentSaveSlot = (BYTE)iSlot; iSavedTimes = 0; for (i = 1; i <= 5; i++) { fp = fopen(va("%s%d%s", PAL_SAVE_PREFIX, i, ".rpg"), "rb"); if (fp != NULL) { WORD wSavedTimes; fread(&wSavedTimes, sizeof(WORD), 1, fp); fclose(fp); wSavedTimes = SWAP16(wSavedTimes); if ((int)wSavedTimes > iSavedTimes) { iSavedTimes = wSavedTimes; } } } PAL_SaveGame(va("%s%d%s", PAL_SAVE_PREFIX, iSlot, ".rpg"), iSavedTimes + 1); } break; case 2: // // Load game // iSlot = PAL_SaveSlotMenu(gpGlobals->bCurrentSaveSlot); if (iSlot != MENUITEM_VALUE_CANCELLED) { PAL_PlayMUS(0, FALSE, 1); PAL_FadeOut(1); PAL_InitGameData(iSlot); } break; case 3: // // Music // g_fNoMusic = !PAL_SwitchMenu(!g_fNoMusic); #ifdef PAL_HAS_NATIVEMIDI if (g_fUseMidi) { if (g_fNoMusic) { PAL_PlayMUS(0, FALSE, 0); } else { PAL_PlayMUS(gpGlobals->wNumMusic, TRUE, 0); } } #endif break; case 4: // // Sound // g_fNoSound = !PAL_SwitchMenu(!g_fNoSound); break; #ifndef PAL_CLASSIC case 5: // // Battle Mode // PAL_BattleSpeedMenu(); break; case 6: #else case 5: #endif // // Quit // if (PAL_ConfirmMenu()) { PAL_PlayMUS(0, FALSE, 2); PAL_FadeOut(2); PAL_Shutdown(); exit(0); } break; } PAL_DeleteBox(lpMenuBox); return TRUE; }