/* -------------- MB_SELECTION Message -------------- */ static void SelectionMsg(WINDOW wnd, PARAM p1, PARAM p2) { int wd, mx, my; MENU *mnu; if (!p2) { ActiveMenuBar->ActiveSelection = -1; SendMessage(wnd, PAINT, 0, 0); } Selecting = TRUE; mnu = ActiveMenu+(int)p1; if (mnu->PrepMenu != NULL) (*(mnu->PrepMenu))(GetDocFocus(), mnu); wd = MenuWidth(mnu->Selections); if (p2) { int brd = GetRight(wnd); mx = GetLeft(mwnd) + WindowWidth(mwnd) - 1; if (mx + wd > brd) mx = brd - wd; my = GetTop(mwnd) + mwnd->selection; } else { int offset = menu[(int)p1].x1 - 4 * (int)p1; if (mwnd != NULL) SendMessage(mwnd, CLOSE_WINDOW, 0, 0); ActiveMenuBar->ActiveSelection = (int) p1; if (offset > WindowWidth(wnd)-wd) offset = WindowWidth(wnd)-wd; mx = GetLeft(wnd)+offset; my = GetTop(wnd)+1; } mwnd = CreateWindow(POPDOWNMENU, NULL, mx, my, MenuHeight(mnu->Selections), wd, NULL, wnd, NULL, SHADOW); if (!p2) { Selecting = FALSE; SendMessage(wnd, PAINT, 0, 0); Selecting = TRUE; } if (mnu->Selections[0].SelectionTitle != NULL) { SendMessage(mwnd, BUILD_SELECTIONS, (PARAM) mnu, 0); SendMessage(mwnd, SETFOCUS, TRUE, 0); SendMessage(mwnd, SHOW_WINDOW, 0, 0); } Selecting = FALSE; }
/* ------- Build a system menu -------- */ void BuildSystemMenu(WINDOW wnd) { int lf, tp, ht, wd; WINDOW SystemMenuWnd; SystemMenu.PullDown[0].Selections[6].Accelerator = (GetClass(wnd) == APPLICATION) ? ALT_F4 : CTRL_F4; lf = GetLeft(wnd)+1; tp = GetTop(wnd)+1; ht = MenuHeight(SystemMenu.PullDown[0].Selections); wd = MenuWidth(SystemMenu.PullDown[0].Selections); if (lf+wd > SCREENWIDTH-1) lf = (SCREENWIDTH-1) - wd; if (tp+ht > SCREENHEIGHT-2) tp = (SCREENHEIGHT-2) - ht; SystemMenuWnd = CreateWindow(POPDOWNMENU, NULL, lf,tp,ht,wd,NULL,wnd,SystemMenuProc, 0); #ifdef INCLUDE_RESTORE if (wnd->condition == ISRESTORED) DeactivateCommand(&SystemMenu, ID_SYSRESTORE); else ActivateCommand(&SystemMenu, ID_SYSRESTORE); #endif if (TestAttribute(wnd, MOVEABLE) #ifdef INCLUDE_MAXIMIZE && wnd->condition != ISMAXIMIZED #endif ) ActivateCommand(&SystemMenu, ID_SYSMOVE); else DeactivateCommand(&SystemMenu, ID_SYSMOVE); if (wnd->condition != ISRESTORED || TestAttribute(wnd, SIZEABLE) == FALSE) DeactivateCommand(&SystemMenu, ID_SYSSIZE); else ActivateCommand(&SystemMenu, ID_SYSSIZE); #ifdef INCLUDE_MINIMIZE if (wnd->condition == ISMINIMIZED || TestAttribute(wnd, MINMAXBOX) == FALSE) DeactivateCommand(&SystemMenu, ID_SYSMINIMIZE); else ActivateCommand(&SystemMenu, ID_SYSMINIMIZE); #endif #ifdef INCLUDE_MAXIMIZE if (wnd->condition != ISRESTORED || TestAttribute(wnd, MINMAXBOX) == FALSE) DeactivateCommand(&SystemMenu, ID_SYSMAXIMIZE); else ActivateCommand(&SystemMenu, ID_SYSMAXIMIZE); #endif SendMessage(SystemMenuWnd, BUILD_SELECTIONS, (PARAM) &SystemMenu.PullDown[0], 0); SendMessage(SystemMenuWnd, SETFOCUS, TRUE, 0); SendMessage(SystemMenuWnd, SHOW_WINDOW, 0, 0); }
int SelectControls(int cmd) { static int index = 0; int x, y; if (cmd == CMD_ESC) return MODE_MAIN; if (AnyButton(cmd) || Left(cmd) || Right(cmd)) { PlaySound(rand() % SND_COUNT, 0, 255); switch (index) { case 0: ChangeControl(&gPlayer1Data, &gPlayer2Data); break; case 1: ChangeControl(&gPlayer2Data, &gPlayer1Data); break; case 2: gOptions.swapButtonsJoy1 = !gOptions.swapButtonsJoy1; break; case 3: gOptions.swapButtonsJoy2 = !gOptions.swapButtonsJoy2; break; case 4: return MODE_KEYS; case 5: InitSticks(); AutoCalibrate(); break; default: return MODE_MAIN; } } if (Up(cmd)) { index--; if (index < 0) index = CONTROLS_COUNT - 1; PlaySound(SND_SWITCH, 0, 255); } else if (Down(cmd)) { index++; if (index >= CONTROLS_COUNT) index = 0; PlaySound(SND_SWITCH, 0, 255); } TextStringSpecial("Configure Controls:", TEXT_XCENTER | TEXT_TOP, 0, (SCREEN_WIDTH / 12)); x = CenterX(MenuWidth(controlsMenu, CONTROLS_COUNT)); y = CenterY(MenuHeight(controlsMenu, CONTROLS_COUNT)); DisplayMenuAt(x - 20, y, controlsMenu, CONTROLS_COUNT, index); x += MenuWidth(controlsMenu, CONTROLS_COUNT); x += 10; DisplayControl(x, y, gPlayer1Data.controls); DisplayControl(x, y + TextHeight(), gPlayer2Data.controls); TextStringAt(x, y + 2 * TextHeight(), gOptions.swapButtonsJoy1 ? "Yes" : "No"); TextStringAt(x, y + 3 * TextHeight(), gOptions.swapButtonsJoy2 ? "Yes" : "No"); return MODE_CONTROLS; }
int SelectVolume(int cmd) { static int index = 0; char s[10]; int x, y; if (cmd == CMD_ESC) return MODE_MAIN; if (AnyButton(cmd) && index == VOLUME_COUNT - 1) return MODE_MAIN; if (Left(cmd)) { switch (index) { case 0: if (FXVolume() > 8) SetFXVolume(FXVolume() - 8); break; case 1: if (MusicVolume() > 8) SetMusicVolume(MusicVolume() - 8); break; case 2: if (FXChannels() > 2) SetFXChannels(FXChannels() - 2); break; case 3: break; } PlaySound(SND_SWITCH, 0, 255); } else if (Right(cmd)) { switch (index) { case 0: if (FXVolume() < 64) SetFXVolume(FXVolume() + 8); break; case 1: if (MusicVolume() < 64) SetMusicVolume(MusicVolume() + 8); break; case 2: if (FXChannels() < 8) SetFXChannels(FXChannels() + 2); break; case 3: break; } PlaySound(SND_SWITCH, 0, 255); } else if (Up(cmd)) { index--; if (index < 0) index = VOLUME_COUNT - 1; PlaySound(SND_SWITCH, 0, 255); } else if (Down(cmd)) { index++; if (index >= VOLUME_COUNT) index = 0; PlaySound(SND_SWITCH, 0, 255); } TextStringSpecial("Configure Sound:", TEXT_XCENTER | TEXT_TOP, 0, (SCREEN_WIDTH / 12)); x = CenterX(MenuWidth(volumeMenu, VOLUME_COUNT)); y = CenterY(MenuHeight(volumeMenu, VOLUME_COUNT)); DisplayMenuAt(x - 20, y, volumeMenu, VOLUME_COUNT, index); x += MenuWidth(volumeMenu, VOLUME_COUNT); x += 10; sprintf(s, "%d", FXVolume() / 8); TextStringAt(x, y, s); sprintf(s, "%d", MusicVolume() / 8); TextStringAt(x, y + TextHeight(), s); sprintf(s, "%d", FXChannels()); TextStringAt(x, y + 2 * TextHeight(), s); TextStringAt(x, y + 3 * TextHeight(), "No"); return MODE_VOLUME; }
int SelectOptions(int cmd) { static int index = 0; char s[10]; int x, y; if (cmd == CMD_ESC) return MODE_MAIN; if (AnyButton(cmd) || Left(cmd) || Right(cmd)) { switch (index) { case 0: gOptions.playersHurt = !gOptions.playersHurt; PlaySound(SND_KILL, 0, 255); break; case 1: gOptions.displayFPS = !gOptions.displayFPS; PlaySound(SND_FLAMER, 0, 255); break; case 2: gOptions.displayTime = !gOptions.displayTime; PlaySound(SND_LAUNCH, 0, 255); break; case 3: if (gOptions.copyMode == COPY_REPMOVSD) gOptions.copyMode = COPY_DEC_JNZ; else gOptions.copyMode = COPY_REPMOVSD; PlaySound(SND_EXPLOSION, 0, 255); break; case 4: if (Left(cmd) && gOptions.brightness > -10) gOptions.brightness--; else if (Right(cmd) && gOptions.brightness < 10) gOptions.brightness++; else break; PlaySound(SND_POWERGUN, 0, 255); PaletteAdjust(); break; case 5: if (gOptions.xSplit == 0) { gOptions.xSplit = SPLIT_X; gOptions.ySplit = SPLIT_Y; } else { gOptions.xSplit = gOptions.ySplit = 0; } PlaySound(SND_KILL3, 0, 255); break; case 6: if (Left(cmd)) { if (Button1(cmd) && Button2(cmd)) gCampaign.seed -= 1000; else if (Button1(cmd)) gCampaign.seed -= 10; else if (Button2(cmd)) gCampaign.seed -= 100; else gCampaign.seed--; } else if (Right(cmd)) { if (Button1(cmd) && Button2(cmd)) gCampaign.seed += 1000; else if (Button1(cmd)) gCampaign.seed += 10; else if (Button2(cmd)) gCampaign.seed += 100; else gCampaign.seed++; } break; case 7: if (Left(cmd)) { if (gOptions.difficulty > DIFFICULTY_VERYEASY) gOptions.difficulty--; } else if (Right(cmd)) { if (gOptions.difficulty < DIFFICULTY_VERYHARD) gOptions.difficulty++; } if (gOptions.difficulty > DIFFICULTY_VERYHARD) gOptions.difficulty = DIFFICULTY_VERYHARD; if (gOptions.difficulty < DIFFICULTY_VERYEASY) gOptions.difficulty = DIFFICULTY_VERYEASY; break; case 8: gOptions.slowmotion = !gOptions.slowmotion; break; case 9: if (Left(cmd)) { if (gOptions.density > 25) gOptions.density -= 25; } else if (Right(cmd)) { if (gOptions.density < 200) gOptions.density += 25; } break; case 10: if (Left(cmd)) { if (gOptions.npcHp > 25) gOptions.npcHp -= 25; } else if (Right(cmd)) { if (gOptions.npcHp < 200) gOptions.npcHp += 25; } break; case 11: if (Left(cmd)) { if (gOptions.playerHp > 25) gOptions.playerHp -= 25; } else if (Right(cmd)) { if (gOptions.playerHp < 200) gOptions.playerHp += 25; } break; case 12: Gfx_HintToggle(HINT_FULLSCREEN); InitVideo(); break; case 13: { GFX_Mode *m = NULL; if (Left(cmd)) { m = Gfx_ModePrev(); } else if (Right(cmd)) { m = Gfx_ModeNext(); } if (m) { debug(D_NORMAL, "new mode? %d x %d\n", m->w, m->h); Gfx_SetHint(HINT_WIDTH, m->w); Gfx_SetHint(HINT_HEIGHT, m->h); } } break; case 14: { int fac = Gfx_GetHint(HINT_SCALEFACTOR); if (Left(cmd)) { fac--; } else if (Right(cmd)) { fac++; } if (fac >= 1 && fac <= 4) { Gfx_SetHint(HINT_SCALEFACTOR, (const int)fac); InitVideo(); } } break; default: PlaySound(SND_BANG, 0, 255); return MODE_MAIN; } } if (Up(cmd)) { index--; if (index < 0) index = OPTIONS_COUNT - 1; PlaySound(SND_SWITCH, 0, 255); } else if (Down(cmd)) { index++; if (index >= OPTIONS_COUNT) index = 0; PlaySound(SND_SWITCH, 0, 255); } TextStringSpecial("Game Options:", TEXT_XCENTER | TEXT_TOP, 0, (SCREEN_WIDTH / 12)); x = CenterX(MenuWidth(optionsMenu, OPTIONS_COUNT)); y = CenterY(MenuHeight(optionsMenu, OPTIONS_COUNT)); DisplayMenuAt(x - 20, y, optionsMenu, OPTIONS_COUNT, index); x += MenuWidth(optionsMenu, OPTIONS_COUNT); x += 10; TextStringAt(x, y, gOptions.playersHurt ? "Yes" : "No"); TextStringAt(x, y + TextHeight(), gOptions.displayFPS ? "On" : "Off"); TextStringAt(x, y + 2 * TextHeight(), gOptions.displayTime ? "On" : "Off"); TextStringAt(x, y + 3 * TextHeight(), gOptions.copyMode == COPY_REPMOVSD ? "rep movsd" : "dec/jnz"); sprintf(s, "%d", gOptions.brightness); TextStringAt(x, y + 4 * TextHeight(), s); TextStringAt(x, y + 5 * TextHeight(), gOptions.xSplit ? "No" : "Yes"); sprintf(s, "%u", gCampaign.seed); TextStringAt(x, y + 6 * TextHeight(), s); switch (gOptions.difficulty) { case DIFFICULTY_VERYEASY: strcpy(s, "Easiest"); break; case DIFFICULTY_EASY: strcpy(s, "Easy"); break; case DIFFICULTY_HARD: strcpy(s, "Hard"); break; case DIFFICULTY_VERYHARD: strcpy(s, "Very hard"); break; default: strcpy(s, "Normal"); break; } TextStringAt(x, y + 7 * TextHeight(), s); TextStringAt(x, y + 8 * TextHeight(), gOptions.slowmotion ? "Yes" : "No"); sprintf(s, "%u%%", gOptions.density); TextStringAt(x, y + 9 * TextHeight(), s); sprintf(s, "%u%%", gOptions.npcHp); TextStringAt(x, y + 10 * TextHeight(), s); sprintf(s, "%u%%", gOptions.playerHp); TextStringAt(x, y + 11 * TextHeight(), s); sprintf(s, "%s", Gfx_GetHint(HINT_FULLSCREEN) ? "Yes" : "No"); TextStringAt(x, y + 12 * TextHeight(), s); sprintf(s, "%dx%d", Gfx_GetHint(HINT_WIDTH), Gfx_GetHint(HINT_HEIGHT)); TextStringAt(x, y + 13 * TextHeight(), s); sprintf(s, "%dx", Gfx_GetHint(HINT_SCALEFACTOR)); TextStringAt(x, y + 14 * TextHeight(), s); return MODE_OPTIONS; }