static void InitializeFade(boolean fadeIn) { unsigned i; Palette = Z_Malloc(768*sizeof(fixed_t), PU_STATIC, 0); PaletteDelta = Z_Malloc(768*sizeof(fixed_t), PU_STATIC, 0); RealPalette = Z_Malloc(768*sizeof(byte), PU_STATIC, 0); if(fadeIn) { memset(RealPalette, 0, 768*sizeof(byte)); for(i = 0; i < 768; i++) { Palette[i] = 0; PaletteDelta[i] = FixedDiv((*((byte *)W_CacheLumpName("playpal", PU_CACHE)+i))<<FRACBITS, 70*FRACUNIT); } } else { for(i = 0; i < 768; i++) { RealPalette[i] = *((byte *)W_CacheLumpName("playpal", PU_CACHE)+i); Palette[i] = RealPalette[i]<<FRACBITS; PaletteDelta[i] = FixedDiv(Palette[i], -70*FRACUNIT); } } I_SetPalette(RealPalette); }
static void F_InitUnderWater(void) { # ifdef _WATCOMC_ memset((byte *)0xa0000, 0, SCREENWIDTH * SCREENHEIGHT); /* pcscreen */ # endif /* DOS */ I_SetPalette((byte *)W_CacheLumpName("E2PAL", PU_CACHE)); }
void MN_DrawInfo(void) { I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); V_DrawRawScreen(W_CacheLumpNum(W_GetNumForName("TITLE") + InfoType, PU_CACHE)); // V_DrawPatch(0, 0, W_CacheLumpNum(W_GetNumForName("TITLE")+InfoType, // PU_CACHE)); }
void MN_DrawInfo(void) { I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); memcpy(screen, (byte *)W_CacheLumpNum(W_GetNumForName("TITLE")+InfoType, PU_CACHE), SCREENWIDTH*SCREENHEIGHT); // V_DrawPatch(0, 0, W_CacheLumpNum(W_GetNumForName("TITLE")+InfoType, // PU_CACHE)); }
static void FadePic(void) { unsigned i; for(i = 0; i < 768; i++) { Palette[i] += PaletteDelta[i]; RealPalette[i] = Palette[i]>>FRACBITS; } I_SetPalette(RealPalette); }
void IN_Start(void) { I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); IN_LoadPics(); IN_InitStats(); intermission = true; interstate = -1; skipintermission = false; intertime = 0; oldintertime = 0; AM_Stop(); S_StartSong(mus_intr, true); }
void IN_Start(void) { int i; I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); InitStats(); LoadPics(); intermission = true; interstate = 0; skipintermission = false; intertime = 0; AM_Stop(); for (i = 0; i < MAXPLAYERS; i++) { players[i].messageTics = 0; players[i].message[0] = 0; } SN_StopAllSequences(); }
void D_Display (void) { static boolean viewactivestate = false; static boolean menuactivestate = false; static boolean inhelpscreensstate = false; static boolean fullscreen = false; static gamestate_t oldgamestate = -1; static int borderdrawcount; int nowtime; int tics; int wipestart; int y; boolean done; boolean wipe; boolean redrawsbar; if (nodrawers) return; // for comparative timing / profiling redrawsbar = false; // change the view size if needed if (setsizeneeded) { R_ExecuteSetViewSize (); oldgamestate = -1; // force background redraw borderdrawcount = 3; } // save the current screen if about to wipe if (gamestate != wipegamestate) { wipe = true; wipe_StartScreen(0, 0, SCREENWIDTH, SCREENHEIGHT); } else wipe = false; if (gamestate == GS_LEVEL && gametic) HU_Erase(); // do buffered drawing switch (gamestate) { case GS_LEVEL: if (!gametic) break; if (automapactive) AM_Drawer (); if (wipe || (viewheight != 200 && fullscreen) ) redrawsbar = true; if (inhelpscreensstate && !inhelpscreens) redrawsbar = true; // just put away the help screen ST_Drawer (viewheight == 200, redrawsbar ); fullscreen = viewheight == 200; break; case GS_INTERMISSION: WI_Drawer (); break; case GS_FINALE: F_Drawer (); break; case GS_DEMOSCREEN: D_PageDrawer (); break; } // draw buffered stuff to screen I_UpdateNoBlit (); // draw the view directly if (gamestate == GS_LEVEL && !automapactive && gametic) R_RenderPlayerView (&players[displayplayer]); if (gamestate == GS_LEVEL && gametic) HU_Drawer (); // clean up border stuff if (gamestate != oldgamestate && gamestate != GS_LEVEL) I_SetPalette (W_CacheLumpName ("PLAYPAL",PU_CACHE)); // see if the border needs to be initially drawn if (gamestate == GS_LEVEL && oldgamestate != GS_LEVEL) { viewactivestate = false; // view was not active R_FillBackScreen (); // draw the pattern into the back screen } // see if the border needs to be updated to the screen if (gamestate == GS_LEVEL && !automapactive && scaledviewwidth != 320) { if (menuactive || menuactivestate || !viewactivestate) borderdrawcount = 3; if (borderdrawcount) { R_DrawViewBorder (); // erase old menu stuff borderdrawcount--; } } menuactivestate = menuactive; viewactivestate = viewactive; inhelpscreensstate = inhelpscreens; oldgamestate = wipegamestate = gamestate; // draw pause pic if (paused) { if (automapactive) y = 4; else y = viewwindowy+4; V_DrawPatchDirect(viewwindowx+(scaledviewwidth-68)/2, y,0,W_CacheLumpName ("M_PAUSE", PU_CACHE)); } // menus go directly to the screen M_Drawer (); // menu is drawn even on top of everything NetUpdate (); // send out any new accumulation // normal update if (!wipe) { I_FinishUpdate (); // page flip or blit buffer return; } // wipe update wipe_EndScreen(0, 0, SCREENWIDTH, SCREENHEIGHT); wipestart = I_GetTime () - 1; do { do { nowtime = I_GetTime (); tics = nowtime - wipestart; } while (!tics); wipestart = nowtime; done = wipe_ScreenWipe(wipe_Melt , 0, 0, SCREENWIDTH, SCREENHEIGHT, tics); I_UpdateNoBlit (); M_Drawer (); // menu is drawn even on top of wipes I_FinishUpdate (); // page flip or blit buffer } while (!done); }
void I_InitGraphics(void) { SDL_Event dummy; byte *doompal; char *env; // Pass through the XSCREENSAVER_WINDOW environment variable to // SDL_WINDOWID, to embed the SDL window into the Xscreensaver // window. env = getenv("XSCREENSAVER_WINDOW"); if (env != NULL) { char winenv[30]; int winid; sscanf(env, "0x%x", &winid); M_snprintf(winenv, sizeof(winenv), "SDL_WINDOWID=%i", winid); putenv(winenv); } SetSDLVideoDriver(); SetWindowPositionVars(); if (SDL_Init(SDL_INIT_VIDEO) < 0) { I_Error("Failed to initialize video: %s", SDL_GetError()); } // Set up title and icon. Windows cares about the ordering; this // has to be done before the call to SDL_SetVideoMode. I_InitWindowTitle(); I_InitWindowIcon(); // Warning to OS X users... though they might never see it :( #ifdef __MACOSX__ if (fullscreen) { printf("Some old versions of OS X might crash in fullscreen mode.\n" "If this happens to you, switch back to windowed mode.\n"); } #endif // // Enter into graphics mode. // // When in screensaver mode, run full screen and auto detect // screen dimensions (don't change video mode) // if (screensaver_mode) { SetVideoMode(NULL, 0, 0); } else { int w, h; if (autoadjust_video_settings) { I_AutoAdjustSettings(); } w = screen_width; h = screen_height; screen_mode = I_FindScreenMode(w, h); if (screen_mode == NULL) { I_Error("I_InitGraphics: Unable to find a screen mode small " "enough for %ix%i", w, h); } if (w != screen_mode->width || h != screen_mode->height) { printf("I_InitGraphics: %s (%ix%i within %ix%i)\n", WindowBoxType(screen_mode, w, h), screen_mode->width, screen_mode->height, w, h); } SetVideoMode(screen_mode, w, h); } // Start with a clear black screen // (screen will be flipped after we set the palette) SDL_FillRect(screenbuffer, NULL, 0); // Set the palette doompal = W_CacheLumpName(DEH_String("PLAYPAL"), PU_CACHE); I_SetPalette(doompal); SDL_SetColors(screenbuffer, palette, 0, 256); CreateCursors(); UpdateFocus(); UpdateGrab(); // On some systems, it takes a second or so for the screen to settle // after changing modes. We include the option to add a delay when // setting the screen mode, so that the game doesn't start immediately // with the player unable to see anything. if (fullscreen && !screensaver_mode) { SDL_Delay(startup_delay); } // Check if we have a native surface we can use // If we have to lock the screen, draw to a buffer and copy // Likewise if the screen pitch is not the same as the width // If we have to multiply, drawing is done to a separate 320x200 buf native_surface = screen == screenbuffer && !SDL_MUSTLOCK(screen) && screen_mode == &mode_scale_1x && screen->pitch == SCREENWIDTH && aspect_ratio_correct; // If not, allocate a buffer and copy from that buffer to the // screen when we do an update if (native_surface) { I_VideoBuffer = (unsigned char *) screen->pixels; I_VideoBuffer += (screen->h - SCREENHEIGHT) / 2; } else { I_VideoBuffer = (unsigned char *) Z_Malloc (SCREENWIDTH * SCREENHEIGHT, PU_STATIC, NULL); } V_RestoreBuffer(); // Clear the screen to black. memset(I_VideoBuffer, 0, SCREENWIDTH * SCREENHEIGHT); // We need SDL to give us translated versions of keys as well SDL_EnableUNICODE(1); // Repeat key presses - this is what Vanilla Doom does // Not sure about repeat rate - probably dependent on which DOS // driver is used. This is good enough though. SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); // clear out any events waiting at the start and center the mouse while (SDL_PollEvent(&dummy)); initialized = true; // Call I_ShutdownGraphics on quit I_AtExit(I_ShutdownGraphics, true); }
void D_Display(fixed_t frac) { static boolean automapstate = false; static boolean menuactivestate = false; static boolean inhelpscreensstate = false; static boolean oldviewheight = 0; int y; switch (gamestate) { case GS_LEVEL: if (!gametic) break; if (HU_Erase() || (inhelpscreensstate && !inhelpscreens) || (automapstate && !automapactive) || (menuactivestate && !menuactive) || (viewheight != oldviewheight) || gamestate != GS_LEVEL) { if (!automapactive) R_FillScreenBorder(); ST_Drawer(viewheight == 200, true); } else { ST_Drawer(viewheight == 200, false); } if (automapactive) AM_Drawer(); else R_RenderPlayerView(&players[displayplayer], frac); HU_Drawer(); break; case GS_INTERMISSION: WI_Drawer(); break; case GS_FINALE: F_Drawer(); break; case GS_DEMOSCREEN: D_PageDrawer(); break; } // clean up border stuff if (gamestate != oldgamestate && gamestate != GS_LEVEL) I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); oldviewheight = viewheight; menuactivestate = menuactive; automapstate = automapactive; inhelpscreensstate = inhelpscreens; // draw pause pic if (paused) { if (automapactive) y = 4; else y = viewwindowy + 4; V_DrawPatchDirect(viewwindowx + (scaledviewwidth - 68) / 2, y, 0, W_CacheLumpName("M_PAUSE", PU_CACHE)); } }
boolean MN_Responder(event_t * event) { int charTyped; int key; int i; MenuItem_t *item; extern boolean automapactive; extern void D_StartTitle(void); extern void G_CheckDemoStatus(void); char *textBuffer; // In testcontrols mode, none of the function keys should do anything // - the only key is escape to quit. if (testcontrols) { if (event->type == ev_quit || (event->type == ev_keydown && (event->data1 == key_menu_activate || event->data1 == key_menu_quit))) { I_Quit(); return true; } return false; } // "close" button pressed on window? if (event->type == ev_quit) { // First click on close = bring up quit confirm message. // Second click = confirm quit. if (!MenuActive && askforquit && typeofask == 1) { G_CheckDemoStatus(); I_Quit(); } else { SCQuitGame(0); S_StartSound(NULL, sfx_chat); } return true; } // Allow the menu to be activated from a joystick button if a button // is bound for joybmenu. if (event->type == ev_joystick) { if (joybmenu >= 0 && (event->data1 & (1 << joybmenu)) != 0) { MN_ActivateMenu(); return true; } } if (event->type != ev_keydown) { return false; } key = event->data1; charTyped = event->data2; if (InfoType) { if (gamemode == shareware) { InfoType = (InfoType + 1) % 5; } else { InfoType = (InfoType + 1) % 4; } if (key == KEY_ESCAPE) { InfoType = 0; } if (!InfoType) { paused = false; MN_DeactivateMenu(); SB_state = -1; //refresh the statbar BorderNeedRefresh = true; } S_StartSound(NULL, sfx_dorcls); return (true); //make the info screen eat the keypress } if ((ravpic && key == KEY_F1) || (key != 0 && key == key_menu_screenshot)) { G_ScreenShot(); return (true); } if (askforquit) { if (key == key_menu_confirm) { switch (typeofask) { case 1: G_CheckDemoStatus(); I_Quit(); return false; case 2: players[consoleplayer].messageTics = 0; //set the msg to be cleared players[consoleplayer].message = NULL; paused = false; I_SetPalette(W_CacheLumpName ("PLAYPAL", PU_CACHE)); D_StartTitle(); // go to intro/demo mode. break; case 3: P_SetMessage(&players[consoleplayer], "QUICKSAVING....", false); FileMenuKeySteal = true; SCSaveGame(quicksave - 1); BorderNeedRefresh = true; break; case 4: P_SetMessage(&players[consoleplayer], "QUICKLOADING....", false); SCLoadGame(quickload - 1); BorderNeedRefresh = true; break; default: break; } askforquit = false; typeofask = 0; return true; } else if (key == key_menu_abort || key == KEY_ESCAPE) { players[consoleplayer].messageTics = 1; //set the msg to be cleared askforquit = false; typeofask = 0; paused = false; UpdateState |= I_FULLSCRN; BorderNeedRefresh = true; return true; } return false; // don't let the keys filter thru } if (!MenuActive && !chatmodeon) { if (key == key_menu_decscreen) { if (automapactive) { // Don't screen size in automap return (false); } SCScreenSize(LEFT_DIR); S_StartSound(NULL, sfx_keyup); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return (true); } else if (key == key_menu_incscreen) { if (automapactive) { // Don't screen size in automap return (false); } SCScreenSize(RIGHT_DIR); S_StartSound(NULL, sfx_keyup); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return (true); } else if (key == key_menu_help) // F1 { SCInfo(0); // start up info screens MenuActive = true; return (true); } else if (key == key_menu_save) // F2 (save game) { if (gamestate == GS_LEVEL && !demoplayback) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &SaveMenu; CurrentItPos = CurrentMenu->oldItPos; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed } return true; } else if (key == key_menu_load) // F3 (load game) { if (SCNetCheck(2)) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed } return true; } else if (key == key_menu_volume) // F4 (volume) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &Options2Menu; CurrentItPos = CurrentMenu->oldItPos; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed return true; } else if (key == key_menu_detail) // F5 (detail) { // F5 isn't used in Heretic. (detail level) return true; } else if (key == key_menu_qsave) // F6 (quicksave) { if (gamestate == GS_LEVEL && !demoplayback) { if (!quicksave || quicksave == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &SaveMenu; CurrentItPos = CurrentMenu->oldItPos; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed quicksave = -1; P_SetMessage(&players[consoleplayer], "CHOOSE A QUICKSAVE SLOT", true); } else { askforquit = true; typeofask = 3; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_chat); } } return true; } else if (key == key_menu_endgame) // F7 (end game) { if (gamestate == GS_LEVEL && !demoplayback) { S_StartSound(NULL, sfx_chat); SCEndGame(0); } return true; } else if (key == key_menu_messages) // F8 (toggle messages) { SCMessages(0); return true; } else if (key == key_menu_qload) // F9 (quickload) { if (!quickload || quickload == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed quickload = -1; P_SetMessage(&players[consoleplayer], "CHOOSE A QUICKLOAD SLOT", true); } else { askforquit = true; if (!netgame && !demoplayback) { paused = true; } typeofask = 4; S_StartSound(NULL, sfx_chat); } return true; } else if (key == key_menu_quit) // F10 (quit) { if (gamestate == GS_LEVEL) { SCQuitGame(0); S_StartSound(NULL, sfx_chat); } return true; } else if (key == key_menu_gamma) // F11 (gamma correction) { usegamma++; if (usegamma > 4) { usegamma = 0; } I_SetPalette((byte *) W_CacheLumpName("PLAYPAL", PU_CACHE)); return true; } } if (!MenuActive) { if (key == key_menu_activate || gamestate == GS_DEMOSCREEN || demoplayback) { MN_ActivateMenu(); return (true); } return (false); } if (!FileMenuKeySteal) { item = &CurrentMenu->items[CurrentItPos]; if (key == key_menu_down) // Next menu item { do { if (CurrentItPos + 1 > CurrentMenu->itemCount - 1) { CurrentItPos = 0; } else { CurrentItPos++; } } while (CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, sfx_switch); return (true); } else if (key == key_menu_up) // Previous menu item { do { if (CurrentItPos == 0) { CurrentItPos = CurrentMenu->itemCount - 1; } else { CurrentItPos--; } } while (CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, sfx_switch); return (true); } else if (key == key_menu_left) // Slider left { if (item->type == ITT_LRFUNC && item->func != NULL) { item->func(LEFT_DIR); S_StartSound(NULL, sfx_keyup); } return (true); } else if (key == key_menu_right) // Slider right { if (item->type == ITT_LRFUNC && item->func != NULL) { item->func(RIGHT_DIR); S_StartSound(NULL, sfx_keyup); } return (true); } else if (key == key_menu_forward) // Activate item (enter) { if (item->type == ITT_SETMENU) { SetMenu(item->menu); } else if (item->func != NULL) { CurrentMenu->oldItPos = CurrentItPos; if (item->type == ITT_LRFUNC) { item->func(RIGHT_DIR); } else if (item->type == ITT_EFUNC) { if (item->func(item->option)) { if (item->menu != MENU_NONE) { SetMenu(item->menu); } } } } S_StartSound(NULL, sfx_dorcls); return (true); } else if (key == key_menu_activate) // Toggle menu { MN_DeactivateMenu(); return (true); } else if (key == key_menu_back) // Go back to previous menu { S_StartSound(NULL, sfx_switch); if (CurrentMenu->prevMenu == MENU_NONE) { MN_DeactivateMenu(); } else { SetMenu(CurrentMenu->prevMenu); } return (true); } else if (charTyped != 0) { // Jump to menu item based on first letter: for (i = 0; i < CurrentMenu->itemCount; i++) { if (CurrentMenu->items[i].text) { if (toupper(charTyped) == toupper(DEH_String(CurrentMenu->items[i].text)[0])) { CurrentItPos = i; return (true); } } } } return (false); } else { // Editing file names #ifndef USE_VIRTUALKEYBOARD textBuffer = &SlotText[currentSlot][slotptr]; if (key == KEY_BACKSPACE) { if (slotptr) { *textBuffer-- = 0; *textBuffer = ASCII_CURSOR; slotptr--; } return (true); } if (key == KEY_ESCAPE) { memset(SlotText[currentSlot], 0, SLOTTEXTLEN + 2); M_StringCopy(SlotText[currentSlot], oldSlotText, sizeof(SlotText[currentSlot])); SlotStatus[currentSlot]--; MN_DeactivateMenu(); return (true); } if (key == KEY_ENTER) { SlotText[currentSlot][slotptr] = 0; // clear the cursor item = &CurrentMenu->items[CurrentItPos]; CurrentMenu->oldItPos = CurrentItPos; if (item->type == ITT_EFUNC) { item->func(item->option); if (item->menu != MENU_NONE) { SetMenu(item->menu); } } return (true); } if (slotptr < SLOTTEXTLEN && key != KEY_BACKSPACE) { if (isalpha(charTyped)) { *textBuffer++ = toupper(charTyped); *textBuffer = ASCII_CURSOR; slotptr++; return (true); } if (isdigit(charTyped) || charTyped == ' ' || charTyped == ',' || charTyped == '.' || charTyped == '-' || charTyped == '!') { *textBuffer++ = charTyped; *textBuffer = ASCII_CURSOR; slotptr++; return (true); } } #else if (key == KEY_BBUTTON) { memset(SlotText[currentSlot], 0, SLOTTEXTLEN + 2); M_StringCopy(SlotText[currentSlot], oldSlotText, sizeof(SlotText[currentSlot])); SlotStatus[currentSlot]--; MN_DeactivateMenu(); return (true); } if (key == KEY_ABUTTON) { SlotText[currentSlot][slotptr] = 0; // clear the cursor item = &CurrentMenu->items[CurrentItPos]; CurrentMenu->oldItPos = CurrentItPos; if (item->type == ITT_EFUNC) { item->func(item->option); if (item->menu != MENU_NONE) { SetMenu(item->menu); } } return (true); } #endif return (true); } return (false); }
void D_Display(void) { static boolean viewactivestate = false; static boolean menuactivestate = false; static boolean pausedstate = false; static gamestate_t oldgamestate = (gamestate_t)(-1); static int borderdrawcount; int nowtime; int tics; int wipestart; boolean done; // change the view size if needed if (setsizeneeded) { R_ExecuteSetViewSize(); oldgamestate = (gamestate_t)(-1); // force background redraw borderdrawcount = 3; } // save the current screen if about to wipe if ((wipe = (gamestate != wipegamestate || forcewipe))) { wipe_StartScreen(); if (forcewipe) forcewipe = false; else menuactive = false; } if (gamestate != GS_LEVEL) { if (gamestate != oldgamestate) I_SetPalette((byte *)W_CacheLumpName("PLAYPAL", PU_CACHE)); switch (gamestate) { case GS_INTERMISSION: WI_Drawer(); break; case GS_FINALE: F_Drawer(); break; case GS_DEMOSCREEN: D_PageDrawer(); break; } } else if (gametic) { HU_Erase(); ST_Drawer(viewheight == SCREENHEIGHT, true); // draw the view directly R_RenderPlayerView(&players[displayplayer]); if (automapactive) AM_Drawer(); // see if the border needs to be initially drawn if (oldgamestate != GS_LEVEL) { viewactivestate = false; // view was not active R_FillBackScreen(); // draw the pattern into the back screen } // see if the border needs to be updated to the screen if (!automapactive) { if (scaledviewwidth != SCREENWIDTH) { if (menuactive || menuactivestate || !viewactivestate || paused || pausedstate || message_on) borderdrawcount = 3; if (borderdrawcount) { R_DrawViewBorder(); // erase old menu stuff borderdrawcount--; } } if (graphicdetail == LOW) V_LowGraphicDetail(0, viewheight2); } HU_Drawer(); } menuactivestate = menuactive; viewactivestate = viewactive; oldgamestate = wipegamestate = gamestate; // draw pause pic if ((pausedstate = paused)) { M_DarkBackground(); if (M_PAUSE) { patch_t *patch = W_CacheLumpName("M_PAUSE", PU_CACHE); if (widescreen) V_DrawPatchWithShadow((ORIGINALWIDTH - patch->width) / 2, viewwindowy / 2 + (viewheight / 2 - patch->height) / 2, 0, patch, false); else V_DrawPatchWithShadow((ORIGINALWIDTH - patch->width) / 2, (ORIGINALHEIGHT - patch->height) / 2, 0, patch, false); } else { if (widescreen) M_DrawCenteredString(viewwindowy / 2 + (viewheight / 2 - 16) / 2, "Paused"); else M_DrawCenteredString((ORIGINALHEIGHT - 16) / 2, "Paused"); } } // menus go directly to the screen M_Drawer(); // menu is drawn even on top of everything // normal update if (!wipe) { I_FinishUpdate(); // page flip or blit buffer return; } // wipe update wipe_EndScreen(); wipestart = I_GetTime() - 1; do { do { nowtime = I_GetTime(); tics = nowtime - wipestart; I_Sleep(1); } while (tics <= 0); wipestart = nowtime; done = wipe_ScreenWipe(tics); blurred = false; M_Drawer(); // menu is drawn even on top of wipes I_FinishUpdate(); // page flip or blit buffer } while (!done); }
void D_Display (void) { static boolean viewactivestate = false; static boolean menuactivestate = false; static boolean inhelpscreensstate = false; static boolean popupactivestate = false; // [STRIFE] static boolean fullscreen = false; static gamestate_t oldgamestate = -1; static int borderdrawcount; int nowtime; int tics; int wipestart; int y; boolean done; boolean wipe; boolean redrawsbar; if (nodrawers) return; // for comparative timing / profiling redrawsbar = false; // change the view size if needed if (setsizeneeded) { R_ExecuteSetViewSize (); oldgamestate = -1; // force background redraw borderdrawcount = 3; } // save the current screen if about to wipe if (gamestate != wipegamestate) { wipe = true; wipe_StartScreen(0, 0, SCREENWIDTH, SCREENHEIGHT); } else wipe = false; if (gamestate == GS_LEVEL && gametic) HU_Erase(); // do buffered drawing switch (gamestate) { case GS_LEVEL: if (!gametic) break; if (automapactive) AM_Drawer (); if (wipe || (viewheight != 200 && fullscreen) ) redrawsbar = true; // haleyjd 08/29/10: [STRIFE] Always redraw sbar if menu is/was active if (menuactivestate || (inhelpscreensstate && !inhelpscreens)) redrawsbar = true; // just put away the help screen ST_Drawer (viewheight == 200, redrawsbar ); fullscreen = viewheight == 200; break; // haleyjd 08/23/2010: [STRIFE] No intermission /* case GS_INTERMISSION: WI_Drawer (); break; */ case GS_FINALE: F_Drawer (); break; case GS_DEMOSCREEN: D_PageDrawer (); break; default: break; } // draw buffered stuff to screen I_UpdateNoBlit (); // draw the view directly if (gamestate == GS_LEVEL && !automapactive && gametic) R_RenderPlayerView (&players[displayplayer]); // clean up border stuff if (gamestate != oldgamestate && gamestate != GS_LEVEL) I_SetPalette (W_CacheLumpName (DEH_String("PLAYPAL"),PU_CACHE)); // see if the border needs to be initially drawn if (gamestate == GS_LEVEL && oldgamestate != GS_LEVEL) { viewactivestate = false; // view was not active R_FillBackScreen (); // draw the pattern into the back screen } // see if the border needs to be updated to the screen if (gamestate == GS_LEVEL && !automapactive && scaledviewwidth != 320) { if (menuactive || menuactivestate || !viewactivestate) { borderdrawcount = 3; popupactivestate = false; } if (borderdrawcount) { R_DrawViewBorder (); // erase old menu stuff borderdrawcount--; } } if (testcontrols) { // Box showing current mouse speed V_DrawMouseSpeedBox(testcontrols_mousespeed); } menuactivestate = menuactive; viewactivestate = viewactive; inhelpscreensstate = inhelpscreens; oldgamestate = wipegamestate = gamestate; // haleyjd 20120208: [STRIFE] Rogue moved this down to below border drawing if (gamestate == GS_LEVEL && gametic) { HU_Drawer (); if(ST_DrawExternal()) popupactivestate = true; else if(popupactivestate) { popupactivestate = false; menuactivestate = 1; } } // draw pause pic if (paused) { if (automapactive) y = 4; else y = viewwindowy+4; V_DrawPatchDirect(viewwindowx + (scaledviewwidth - 68) / 2, y, W_CacheLumpName (DEH_String("M_PAUSE"), PU_CACHE)); } // menus go directly to the screen M_Drawer (); // menu is drawn even on top of everything NetUpdate (); // send out any new accumulation // normal update if (!wipe) { I_FinishUpdate (); // page flip or blit buffer return; } // wipe update wipe_EndScreen(0, 0, SCREENWIDTH, SCREENHEIGHT); wipestart = I_GetTime () - 1; do { do { nowtime = I_GetTime (); tics = nowtime - wipestart; I_Sleep(1); } while (tics < 3); // haleyjd 08/23/2010: [STRIFE] Changed from == 0 to < 3 // haleyjd 08/26/10: [STRIFE] Changed to use ColorXForm wipe. wipestart = nowtime; done = wipe_ScreenWipe(wipe_ColorXForm , 0, 0, SCREENWIDTH, SCREENHEIGHT, tics); I_UpdateNoBlit (); M_Drawer (); // menu is drawn even on top of wipes I_FinishUpdate (); // page flip or blit buffer } while (!done); }
void I_InitGraphics(void) { SDL_Event dummy; byte *doompal; int flags = 0; char *env; // Pass through the XSCREENSAVER_WINDOW environment variable to // SDL_WINDOWID, to embed the SDL window into the Xscreensaver // window. env = getenv("XSCREENSAVER_WINDOW"); if (env != NULL) { char winenv[30]; int winid; sscanf(env, "0x%x", &winid); sprintf(winenv, "SDL_WINDOWID=%i", winid); putenv(winenv); } SetSDLVideoDriver(); if (SDL_Init(SDL_INIT_VIDEO) < 0) { I_Error("Failed to initialize video: %s", SDL_GetError()); } // Check for command-line video-related parameters. CheckCommandLine(); doompal = W_CacheLumpName (DEH_String("PLAYPAL"),PU_CACHE); if (screensaver_mode) { windowwidth = 0; windowheight = 0; } else { if (autoadjust_video_settings) { I_AutoAdjustSettings(); } windowwidth = screen_width; windowheight = screen_height; screen_mode = I_FindScreenMode(windowwidth, windowheight); if (screen_mode == NULL) { I_Error("I_InitGraphics: Unable to find a screen mode small " "enough for %ix%i", windowwidth, windowheight); } if (windowwidth != screen_mode->width || windowheight != screen_mode->height) { printf("I_InitGraphics: %s (%ix%i within %ix%i)\n", WindowBoxType(screen_mode, windowwidth, windowheight), screen_mode->width, screen_mode->height, windowwidth, windowheight); } // Generate lookup tables before setting the video mode. if (screen_mode->InitMode != NULL) { screen_mode->InitMode(doompal); } } // Set up title and icon. Windows cares about the ordering; this // has to be done before the call to SDL_SetVideoMode. I_SetWindowCaption(); #if !SDL_VERSION_ATLEAST(1, 3, 0) I_SetWindowIcon(); #endif // Set the video mode. flags |= SDL_SWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF; if (fullscreen) { flags |= SDL_FULLSCREEN; } screen = SDL_SetVideoMode(windowwidth, windowheight, 8, flags); if (screen == NULL) { I_Error("Error setting video mode: %s\n", SDL_GetError()); } // Start with a clear black screen // (screen will be flipped after we set the palette) if (SDL_LockSurface(screen) >= 0) { byte *screenpixels; int y; screenpixels = (byte *) screen->pixels; for (y=0; y<screen->h; ++y) memset(screenpixels + screen->pitch * y, 0, screen->w); SDL_UnlockSurface(screen); } // Set the palette I_SetPalette(doompal); SDL_SetColors(screen, palette, 0, 256); CreateCursors(); UpdateFocus(); UpdateGrab(); // In screensaver mode, now find a screen_mode to use. if (screensaver_mode) { screen_mode = I_FindScreenMode(screen->w, screen->h); if (screen_mode == NULL) { I_Error("I_InitGraphics: Unable to find a screen mode small " "enough for %ix%i", screen->w, screen->h); } // Generate lookup tables before setting the video mode. if (screen_mode->InitMode != NULL) { screen_mode->InitMode(doompal); } } // On some systems, it takes a second or so for the screen to settle // after changing modes. We include the option to add a delay when // setting the screen mode, so that the game doesn't start immediately // with the player unable to see anything. if (fullscreen && !screensaver_mode) { SDL_Delay(startup_delay); } // Check if we have a native surface we can use // If we have to lock the screen, draw to a buffer and copy // Likewise if the screen pitch is not the same as the width // If we have to multiply, drawing is done to a separate 320x200 buf native_surface = !SDL_MUSTLOCK(screen) && screen_mode == &mode_scale_1x && screen->pitch == SCREENWIDTH && aspect_ratio_correct; // If not, allocate a buffer and copy from that buffer to the // screen when we do an update if (native_surface) { screens[0] = (unsigned char *) screen->pixels; screens[0] += (screen->h - SCREENHEIGHT) / 2; } else { screens[0] = (unsigned char *) Z_Malloc (SCREENWIDTH * SCREENHEIGHT, PU_STATIC, NULL); } // "Loading from disk" icon LoadDiskImage(); // Clear the screen to black. memset(screens[0], 0, SCREENWIDTH * SCREENHEIGHT); // We need SDL to give us translated versions of keys as well SDL_EnableUNICODE(1); // Repeat key presses - this is what Vanilla Doom does // Not sure about repeat rate - probably dependent on which DOS // driver is used. This is good enough though. SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); // clear out any events waiting at the start and center the mouse while (SDL_PollEvent(&dummy)); if (usemouse && !nomouse && (fullscreen || grabmouse)) { CenterMouse(); } initialized = true; }
boolean MN_Responder(event_t *event) { int key; int i; MenuItem_t *item; extern boolean automapactive; static boolean shiftdown; extern void D_StartTitle(void); extern void G_CheckDemoStatus(void); char *textBuffer; if(event->data1 == KEY_RSHIFT) { shiftdown = (event->type == ev_keydown); } if(event->type != ev_keydown) { return(false); } key = event->data1; if(InfoType) { if(shareware) { InfoType = (InfoType+1)%5; } else { InfoType = (InfoType+1)%4; } if(key == KEY_ESCAPE) { InfoType = 0; } if(!InfoType) { paused = false; MN_DeactivateMenu(); SB_state = -1; //refresh the statbar BorderNeedRefresh = true; } S_StartSound(NULL, sfx_dorcls); return(true); //make the info screen eat the keypress } if(ravpic && key == KEY_F1) { G_ScreenShot(); return(true); } if(askforquit) { switch(key) { case 'y': if(askforquit) { switch(typeofask) { case 1: G_CheckDemoStatus(); I_Quit(); break; case 2: players[consoleplayer].messageTics = 0; //set the msg to be cleared players[consoleplayer].message = NULL; typeofask = 0; askforquit = false; paused = false; I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); D_StartTitle(); // go to intro/demo mode. break; case 3: P_SetMessage(&players[consoleplayer], "QUICKSAVING....", false); FileMenuKeySteal = true; SCSaveGame(quicksave-1); askforquit = false; typeofask = 0; BorderNeedRefresh = true; return true; case 4: P_SetMessage(&players[consoleplayer], "QUICKLOADING....", false); SCLoadGame(quickload-1); askforquit = false; typeofask = 0; BorderNeedRefresh = true; return true; default: return true; // eat the 'y' keypress } } return false; case 'n': case KEY_ESCAPE: if(askforquit) { players[consoleplayer].messageTics = 1; //set the msg to be cleared askforquit = false; typeofask = 0; paused = false; UpdateState |= I_FULLSCRN; BorderNeedRefresh = true; return true; } return false; } return false; // don't let the keys filter thru } if(MenuActive == false && !chatmodeon) { switch(key) { case KEY_MINUS: if(automapactive) { // Don't screen size in automap return(false); } SCScreenSize(LEFT_DIR); S_StartSound(NULL, sfx_keyup); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return(true); case KEY_EQUALS: if(automapactive) { // Don't screen size in automap return(false); } SCScreenSize(RIGHT_DIR); S_StartSound(NULL, sfx_keyup); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return(true); #ifndef __NeXT__ case KEY_F1: // help screen SCInfo(0); // start up info screens MenuActive = true; return(true); case KEY_F2: // save game if(gamestate == GS_LEVEL && !demoplayback) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &SaveMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed } return true; case KEY_F3: // load game if(SCNetCheck(2)) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed } return true; case KEY_F4: // volume MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &Options2Menu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed return true; case KEY_F5: // F5 isn't used in Heretic. (detail level) return true; case KEY_F6: // quicksave if(gamestate == GS_LEVEL && !demoplayback) { if(!quicksave || quicksave == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &SaveMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed quicksave = -1; P_SetMessage(&players[consoleplayer], "CHOOSE A QUICKSAVE SLOT", true); } else { askforquit = true; typeofask = 3; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_chat); } } return true; case KEY_F7: // endgame if(gamestate == GS_LEVEL && !demoplayback) { S_StartSound(NULL, sfx_chat); SCEndGame(0); } return true; case KEY_F8: // toggle messages SCMessages(0); return true; case KEY_F9: // quickload if(!quickload || quickload == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed quickload = -1; P_SetMessage(&players[consoleplayer], "CHOOSE A QUICKLOAD SLOT", true); } else { askforquit = true; if(!netgame && !demoplayback) { paused = true; } typeofask = 4; S_StartSound(NULL, sfx_chat); } return true; case KEY_F10: // quit if(gamestate == GS_LEVEL) { SCQuitGame(0); S_StartSound(NULL, sfx_chat); } return true; case KEY_F11: // F11 - gamma mode correction usegamma++; if(usegamma > 4) { usegamma = 0; } I_SetPalette((byte *)W_CacheLumpName("PLAYPAL", PU_CACHE)); return true; #endif } } if(MenuActive == false) { if(key == KEY_ESCAPE || gamestate == GS_DEMOSCREEN || demoplayback) { MN_ActivateMenu(); return(true); } return(false); } if(!FileMenuKeySteal) { item = &CurrentMenu->items[CurrentItPos]; switch(key) { case KEY_DOWNARROW: do { if(CurrentItPos+1 > CurrentMenu->itemCount-1) { CurrentItPos = 0; } else { CurrentItPos++; } } while(CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, sfx_switch); return(true); break; case KEY_UPARROW: do { if(CurrentItPos == 0) { CurrentItPos = CurrentMenu->itemCount-1; } else { CurrentItPos--; } } while(CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, sfx_switch); return(true); break; case KEY_LEFTARROW: if(item->type == ITT_LRFUNC && item->func != NULL) { item->func(LEFT_DIR); S_StartSound(NULL, sfx_keyup); } return(true); break; case KEY_RIGHTARROW: if(item->type == ITT_LRFUNC && item->func != NULL) { item->func(RIGHT_DIR); S_StartSound(NULL, sfx_keyup); } return(true); break; case KEY_ENTER: if(item->type == ITT_SETMENU) { SetMenu(item->menu); } else if(item->func != NULL) { CurrentMenu->oldItPos = CurrentItPos; if(item->type == ITT_LRFUNC) { item->func(RIGHT_DIR); } else if(item->type == ITT_EFUNC) { if(item->func(item->option)) { if(item->menu != MENU_NONE) { SetMenu(item->menu); } } } } S_StartSound(NULL, sfx_dorcls); return(true); break; case KEY_ESCAPE: MN_DeactivateMenu(); return(true); case KEY_BACKSPACE: S_StartSound(NULL, sfx_switch); if(CurrentMenu->prevMenu == MENU_NONE) { MN_DeactivateMenu(); } else { SetMenu(CurrentMenu->prevMenu); } return(true); default: for(i = 0; i < CurrentMenu->itemCount; i++) { if(CurrentMenu->items[i].text) { if(toupper(key) == toupper(CurrentMenu->items[i].text[0])) { CurrentItPos = i; return(true); } } } break; } return(false); } else { // Editing file names textBuffer = &SlotText[currentSlot][slotptr]; if(key == KEY_BACKSPACE) { if(slotptr) { *textBuffer-- = 0; *textBuffer = ASCII_CURSOR; slotptr--; } return(true); } if(key == KEY_ESCAPE) { memset(SlotText[currentSlot], 0, SLOTTEXTLEN+2); strcpy(SlotText[currentSlot], oldSlotText); SlotStatus[currentSlot]--; MN_DeactivateMenu(); return(true); } if(key == KEY_ENTER) { SlotText[currentSlot][slotptr] = 0; // clear the cursor item = &CurrentMenu->items[CurrentItPos]; CurrentMenu->oldItPos = CurrentItPos; if(item->type == ITT_EFUNC) { item->func(item->option); if(item->menu != MENU_NONE) { SetMenu(item->menu); } } return(true); } if(slotptr < SLOTTEXTLEN && key != KEY_BACKSPACE) { if((key >= 'a' && key <= 'z')) { *textBuffer++ = key-32; *textBuffer = ASCII_CURSOR; slotptr++; return(true); } if(((key >= '0' && key <= '9') || key == ' ' || key == ',' || key == '.' || key == '-') && !shiftdown) { *textBuffer++ = key; *textBuffer = ASCII_CURSOR; slotptr++; return(true); } if(shiftdown && key == '1') { *textBuffer++ = '!'; *textBuffer = ASCII_CURSOR; slotptr++; return(true); } } return(true); } return(false); }
void I_InitGraphics(void) { SDL_Event dummy; byte *doompal; char *env; // Pass through the XSCREENSAVER_WINDOW environment variable to // SDL_WINDOWID, to embed the SDL window into the Xscreensaver // window. env = getenv("XSCREENSAVER_WINDOW"); if (env != NULL) { char winenv[30]; int winid; sscanf(env, "0x%x", &winid); M_snprintf(winenv, sizeof(winenv), "SDL_WINDOWID=%i", winid); putenv(winenv); } SetSDLVideoDriver(); if (SDL_Init(SDL_INIT_VIDEO) < 0) { I_Error("Failed to initialize video: %s", SDL_GetError()); } // When in screensaver mode, run full screen and auto detect // screen dimensions (don't change video mode) if (screensaver_mode) { fullscreen = true; } if (aspect_ratio_correct == 1) { actualheight = SCREENHEIGHT_4_3; } else { actualheight = SCREENHEIGHT; } // Create the game window; this may switch graphic modes depending // on configuration. AdjustWindowSize(); SetVideoMode(); // Start with a clear black screen // (screen will be flipped after we set the palette) SDL_FillRect(screenbuffer, NULL, 0); // Set the palette doompal = W_CacheLumpName(DEH_String("PLAYPAL"), PU_CACHE); I_SetPalette(doompal); SDL_SetPaletteColors(screenbuffer->format->palette, palette, 0, 256); // SDL2-TODO UpdateFocus(); UpdateGrab(); // On some systems, it takes a second or so for the screen to settle // after changing modes. We include the option to add a delay when // setting the screen mode, so that the game doesn't start immediately // with the player unable to see anything. if (fullscreen && !screensaver_mode) { SDL_Delay(startup_delay); } // The actual 320x200 canvas that we draw to. This is the pixel buffer of // the 8-bit paletted screen buffer that gets blit on an intermediate // 32-bit RGBA screen buffer that gets loaded into a texture that gets // finally rendered into our window or full screen in I_FinishUpdate(). I_VideoBuffer = screenbuffer->pixels; V_RestoreBuffer(); // Clear the screen to black. memset(I_VideoBuffer, 0, SCREENWIDTH * SCREENHEIGHT * sizeof(*I_VideoBuffer)); // clear out any events waiting at the start and center the mouse while (SDL_PollEvent(&dummy)); initialized = true; // Call I_ShutdownGraphics on quit I_AtExit(I_ShutdownGraphics, true); }