VOID PAL_SetPalette( INT iPaletteNum, BOOL fNight ) /*++ Purpose: Set the screen palette to the specified one. Parameters: [IN] iPaletteNum - number of the palette. [IN] fNight - whether use the night palette or not. Return value: None. --*/ { SDL_Color *p = PAL_GetPalette(iPaletteNum, fNight); if (p != NULL) { VIDEO_SetPalette(p); } }
static VOID PAL_DialogWaitForKey( VOID ) /*++ Purpose: Wait for player to press a key after showing a dialog. Parameters: None. Return value: None. --*/ { PAL_LARGE SDL_Color palette[256]; SDL_Color *pCurrentPalette, t; int i; // // get the current palette // pCurrentPalette = PAL_GetPalette(gpGlobals->wNumPalette, gpGlobals->fNightPalette); memcpy(palette, pCurrentPalette, sizeof(palette)); if (g_TextLib.bDialogPosition != kDialogCenterWindow && g_TextLib.bDialogPosition != kDialogCenter) { // // show the icon // LPCBITMAPRLE p = PAL_SpriteGetFrame(g_TextLib.bufDialogIcons, g_TextLib.bIcon); if (p != NULL) { SDL_Rect rect; rect.x = PAL_X(g_TextLib.posIcon); rect.y = PAL_Y(g_TextLib.posIcon); rect.w = 16; rect.h = 16; PAL_RLEBlitToSurface(p, gpScreen, g_TextLib.posIcon); VIDEO_UpdateScreen(&rect); } } PAL_ClearKeyState(); while (TRUE) { UTIL_Delay(100); if (g_TextLib.bDialogPosition != kDialogCenterWindow && g_TextLib.bDialogPosition != kDialogCenter) { // // palette shift // t = palette[0xF9]; for (i = 0xF9; i < 0xFE; i++) { palette[i] = palette[i + 1]; } palette[0xFE] = t; VIDEO_SetPalette(palette); } if (g_InputState.dwKeyPress != 0) { break; } } if (g_TextLib.bDialogPosition != kDialogCenterWindow && g_TextLib.bDialogPosition != kDialogCenter) { PAL_SetPalette(gpGlobals->wNumPalette, gpGlobals->fNightPalette); } PAL_ClearKeyState(); g_TextLib.fUserSkip = FALSE; }
VOID PAL_FadeIn( INT iPaletteNum, BOOL fNight, INT iDelay ) /*++ Purpose: Fade in the screen to the specified palette. Parameters: [IN] iPaletteNum - number of the palette. [IN] fNight - whether use the night palette or not. [IN] iDelay - delay time for each step. Return value: None. --*/ { int i, j; UINT time; SDL_Color *palette; PAL_LARGE SDL_Color newpalette[256]; // // Get the new palette... // palette = PAL_GetPalette(iPaletteNum, fNight); // // Start fading in... // time = SDL_GetTicks() + iDelay * 10 * 60; while (TRUE) { // // Set the current palette... // j = (int)(time - SDL_GetTicks()) / iDelay / 10; if (j < 0) { break; } j = 60 - j; for (i = 0; i < 256; i++) { newpalette[i].r = (palette[i].r * j) >> 6; newpalette[i].g = (palette[i].g * j) >> 6; newpalette[i].b = (palette[i].b * j) >> 6; } VIDEO_SetPalette(newpalette); UTIL_Delay(10); } VIDEO_SetPalette(palette); }
VOID PAL_SceneFade( INT iPaletteNum, BOOL fNight, INT iStep ) /*++ Purpose: Fade in or fade out the screen. Update the scene during the process. Parameters: [IN] iPaletteNum - number of the palette. [IN] fNight - whether use the night palette or not. [IN] iStep - positive to fade in, nagative to fade out. Return value: None. --*/ { SDL_Color *palette, newpalette[256]; int i, j; DWORD time; palette = PAL_GetPalette(iPaletteNum, fNight); if (palette == NULL) { return; } if (iStep == 0) { iStep = 1; } gpGlobals->fNeedToFadeIn = FALSE; if (iStep > 0) { for (i = 0; i < 64; i += iStep) { time = SDL_GetTicks() + 100; // // Generate the scene // PAL_ClearKeyState(); g_InputState.dir = kDirUnknown; g_InputState.prevdir = kDirUnknown; PAL_GameUpdate(FALSE); PAL_MakeScene(); VIDEO_UpdateScreen(NULL); // // Calculate the current palette... // for (j = 0; j < 256; j++) { newpalette[j].r = (palette[j].r * i) >> 6; newpalette[j].g = (palette[j].g * i) >> 6; newpalette[j].b = (palette[j].b * i) >> 6; } VIDEO_SetPalette(newpalette); PAL_ProcessEvent(); while (!SDL_TICKS_PASSED(SDL_GetTicks(), time)) { PAL_ProcessEvent(); SDL_Delay(5); } } } else { for (i = 63; i >= 0; i += iStep)
VOID PAL_FadeOut( INT iDelay ) /*++ Purpose: Fadeout screen to black from the specified palette. Parameters: [IN] iPaletteNum - number of the palette. [IN] fNight - whether use the night palette or not. [IN] iDelay - delay time for each step. Return value: None. --*/ { int i, j; UINT time; PAL_LARGE SDL_Color palette[256]; PAL_LARGE SDL_Color newpalette[256]; // // Get the original palette... // for (i = 0; i < 256; i++) { palette[i] = VIDEO_GetPalette()[i]; } // // Start fading out... // time = SDL_GetTicks() + iDelay * 10 * 60; while (TRUE) { // // Set the current palette... // j = (int)(time - SDL_GetTicks()) / iDelay / 10; if (j < 0) { break; } for (i = 0; i < 256; i++) { newpalette[i].r = (palette[i].r * j) >> 6; newpalette[i].g = (palette[i].g * j) >> 6; newpalette[i].b = (palette[i].b * j) >> 6; } VIDEO_SetPalette(newpalette); UTIL_Delay(10); } memset(newpalette, 0, sizeof(newpalette)); VIDEO_SetPalette(newpalette); }