void CameraInput(Camera *camera, const int cmd, const int lastCmd) { // Control the camera if (camera->spectateMode == SPECTATE_NONE) { return; } // Arrows: pan camera // CMD1/2: choose next player to follow if (CMD_HAS_DIRECTION(cmd)) { camera->spectateMode = SPECTATE_FREE; const int pan = PAN_SPEED; if (cmd & CMD_LEFT) camera->lastPosition.x -= pan; else if (cmd & CMD_RIGHT) camera->lastPosition.x += pan; if (cmd & CMD_UP) camera->lastPosition.y -= pan; else if (cmd & CMD_DOWN) camera->lastPosition.y += pan; } else if ((AnyButton(cmd) && !AnyButton(lastCmd)) || camera->FollowNextPlayer) { // Can't follow if there are no players if (GetNumPlayers(PLAYER_ALIVE_OR_DYING, false, false) == 0) { return; } camera->spectateMode = SPECTATE_FOLLOW; // Find index of player int playerIndex = -1; CA_FOREACH(const PlayerData, p, gPlayerDatas) if (p->UID == camera->FollowPlayerUID) { playerIndex = _ca_index; break; } CA_FOREACH_END() // Get the next player by index that has an actor in the game const int d = (cmd & CMD_BUTTON1) ? 1 : -1; for (int i = playerIndex + d;; i += d) { i = CLAMP_OPPOSITE(i, 0, (int)gPlayerDatas.size - 1); // Check if clamping made us hit the termination condition if (i == playerIndex) break; const PlayerData *p = CArrayGet(&gPlayerDatas, i); if (IsPlayerAliveOrDying(p)) { // Follow this player camera->FollowPlayerUID = p->UID; camera->FollowNextPlayer = false; break; } } } }
menu_t *MenuProcessButtonCmd(menu_t *menu, int cmd) { if (AnyButton(cmd) || (!MenuTypeLeftRightMoves(menu->type) && (Left(cmd) || Right(cmd)))) { menu_t *subMenu = &menu->u.normal.subMenus[menu->u.normal.index]; switch (subMenu->type) { case MENU_TYPE_NORMAL: case MENU_TYPE_OPTIONS: case MENU_TYPE_CAMPAIGNS: case MENU_TYPE_KEYS: return subMenu; case MENU_TYPE_CAMPAIGN_ITEM: MenuLoadCampaign(&subMenu->u.campaign); return subMenu; // caller will check if subMenu type is CAMPAIGN_ITEM case MENU_TYPE_BACK: return menu->parentMenu; case MENU_TYPE_QUIT: return subMenu; // caller will check if subMenu type is QUIT case MENU_TYPE_RETURN: return subMenu; default: MenuActivate(subMenu, cmd); break; } } return NULL; }
menu_t *MenuProcessButtonCmd(MenuSystem *ms, menu_t *menu, int cmd) { if (AnyButton(cmd) || Left(cmd) || Right(cmd)) { // Ignore if menu contains no submenus if (menu->u.normal.subMenus.size == 0) { return NULL; } menu_t *subMenu = CArrayGet(&menu->u.normal.subMenus, menu->u.normal.index); // Only allow menu switching on button 1 switch (subMenu->type) { case MENU_TYPE_NORMAL: case MENU_TYPE_OPTIONS: case MENU_TYPE_KEYS: case MENU_TYPE_CUSTOM: if (subMenu->u.normal.isSubmenusAlt ? (cmd & CMD_RIGHT) : (cmd & CMD_BUTTON1)) { return subMenu; } break; case MENU_TYPE_CAMPAIGN_ITEM: if (cmd & CMD_BUTTON1) { CampaignLoad(&gCampaign, &subMenu->u.campaign); return subMenu; // caller will check if subMenu type is CAMPAIGN_ITEM } break; case MENU_TYPE_BACK: if (cmd & CMD_BUTTON1) { return menu->parentMenu; } break; case MENU_TYPE_QUIT: if (cmd & CMD_BUTTON1) { return subMenu; // caller will check if subMenu type is QUIT } break; case MENU_TYPE_RETURN: if (cmd & CMD_BUTTON1) { return subMenu; } break; default: MenuActivate(ms, subMenu, cmd); break; } } return NULL; }
int HandleKey(int *done, int cmd) { static int lastKey = 0; static int lastCmd = 0; static int pauseHeld = NO; int key = GetKeyDown(); pauseHeld = (((lastCmd & CMD_BUTTON4) != 0 && (cmd & CMD_BUTTON4) != 0) ? YES : NO); lastCmd = cmd; // Quit on press of Home button if ((cmd & CMD_ESC) != 0) { *done = YES; return keyEsc; } if ((key == gOptions.mapKey || (cmd & CMD_BUTTON3) != 0) && !gCampaign.dogFight) { DisplayAutoMap(0); } // Handle pausing/unpausing with joystick if (((cmd & CMD_BUTTON4) != 0) && !gOptions.twoPlayers && !pauseHeld) { if (gameIsPaused) { gameIsPaused = NO; } else { gameIsPaused = YES; escExits = NO; } } else if (gameIsPaused && AnyButton(cmd)) gameIsPaused = NO; if (key == lastKey) return 0; lastKey = key; if (!key) return 0; // Handle pausing/unpausing/exiting with keyboard if (key == keyEsc) { if (gameIsPaused && escExits) *done = YES; else if (!gameIsPaused) { gameIsPaused = YES; escExits = YES; } } else gameIsPaused = NO; // if (key >= key1 && key <= key0) // ToggleTrack( key - key1); return key; }
menu_t *MenuProcessButtonCmd(MenuSystem *ms, menu_t *menu, int cmd) { if (AnyButton(cmd) || (!MenuTypeLeftRightMoves(menu->type) && (Left(cmd) || Right(cmd)))) { menu_t *subMenu = &menu->u.normal.subMenus[menu->u.normal.index]; // Only allow menu switching on button 1 switch (subMenu->type) { case MENU_TYPE_NORMAL: case MENU_TYPE_OPTIONS: case MENU_TYPE_CAMPAIGNS: case MENU_TYPE_KEYS: case MENU_TYPE_CUSTOM: if (cmd & CMD_BUTTON1) { return subMenu; } break; case MENU_TYPE_CAMPAIGN_ITEM: if (cmd & CMD_BUTTON1) { MenuLoadCampaign(&subMenu->u.campaign); return subMenu; // caller will check if subMenu type is CAMPAIGN_ITEM } break; case MENU_TYPE_BACK: if (cmd & CMD_BUTTON1) { return menu->parentMenu; } break; case MENU_TYPE_QUIT: if (cmd & CMD_BUTTON1) { return subMenu; // caller will check if subMenu type is QUIT } break; case MENU_TYPE_RETURN: if (cmd & CMD_BUTTON1) { return subMenu; } break; default: MenuActivate(ms, subMenu, cmd); break; } } return NULL; }
int SelectKeys(int cmd) { static int index = 12; if (cmd == CMD_ESC) return MODE_CONTROLS; if (AnyButton(cmd)) { PlaySound(rand() % SND_COUNT, 0, 255); switch (index) { case 0: case 1: case 2: case 3: case 4: case 5: HighlightKey(index); ChangeKey(&gPlayer1Data, &gPlayer2Data, index); break; case 6: case 7: case 8: case 9: case 10: case 11: HighlightKey(index); ChangeKey(&gPlayer2Data, &gPlayer1Data, index - 6); break; case 12: HighlightKey(index); ChangeMapKey(&gPlayer1Data, &gPlayer2Data); break; default: return MODE_CONTROLS; } } else if (index > 0 && Up(cmd)) { index--; PlaySound(SND_SWITCH, 0, 255); } else if (index < 13 && Down(cmd)) { index++; PlaySound(SND_SWITCH, 0, 255); } ShowAllKeys(index, -1); return MODE_KEYS; }
static int SelectMain(int cmd) { static int index = 0; if (cmd == CMD_ESC) { if (index != MODE_QUIT) index = MODE_QUIT; else return MODE_QUIT; } if (AnyButton(cmd)) { switch (index) { case 0: gCampaign.dogFight = 0; gOptions.twoPlayers = 0; return MODE_CAMPAIGN; case 1: gCampaign.dogFight = 0; gOptions.twoPlayers = 1; return MODE_CAMPAIGN; case 2: gCampaign.dogFight = 1; return MODE_DOGFIGHT; } return index; } if (Left(cmd) || Up(cmd)) { index--; if (index < 0) index = MAIN_COUNT - 1; PlaySound(SND_SWITCH, 0, 255); } else if (Right(cmd) || Down(cmd)) { index++; if (index >= MAIN_COUNT) index = 0; PlaySound(SND_SWITCH, 0, 255); } DrawTPic((SCREEN_WIDTH - PicWidth(gPics[PIC_LOGO])) / 2, (SCREEN_HEIGHT / 12), gPics[PIC_LOGO], gCompiledPics[PIC_LOGO]); TextStringSpecial("Classic: " CDOGS_VERSION, TEXT_TOP | TEXT_LEFT, 20, 20); TextStringSpecial("SDL Port: " CDOGS_SDL_VERSION, TEXT_TOP | TEXT_RIGHT, 20, 20); DisplayMenuAtCenter(mainMenu, MAIN_COUNT, index); return MODE_MAIN; }
static GameLoopResult MissionBriefingUpdate(void *data) { MissionBriefingData *mData = data; // Check for player input; if any then skip to the end of the briefing int cmds[MAX_LOCAL_PLAYERS]; memset(cmds, 0, sizeof cmds); GetPlayerCmds(&gEventHandlers, &cmds); for (int i = 0; i < MAX_LOCAL_PLAYERS; i++) { if (AnyButton(cmds[i])) { // If the typewriter is still going, skip to end if (mData->TypewriterCount <= (int)strlen(mData->Description)) { strcpy(mData->TypewriterBuf, mData->Description); mData->TypewriterCount = strlen(mData->Description); return UPDATE_RESULT_DRAW; } // Otherwise, exit out of loop return UPDATE_RESULT_EXIT; } } // Check if anyone pressed escape if (EventIsEscape(&gEventHandlers, cmds, GetMenuCmd(&gEventHandlers))) { mData->IsOK = false; return UPDATE_RESULT_EXIT; } // Update the typewriter effect if (mData->TypewriterCount <= (int)strlen(mData->Description)) { mData->TypewriterBuf[mData->TypewriterCount] = mData->Description[mData->TypewriterCount]; mData->TypewriterCount++; return UPDATE_RESULT_DRAW; } return UPDATE_RESULT_OK; }
static int PlayerListInput(int cmd, void *data) { // Input: up/down scrolls list // CMD 1/2: exit PlayerList *pl = data; // Note: players can leave due to network disconnection // Update our lists CA_FOREACH(const int, playerUID, pl->playerUIDs) const PlayerData *p = PlayerDataGetByUID(*playerUID); if (p == NULL) { CArrayDelete(&pl->playerUIDs, _ca_index); _ca_index--; } CA_FOREACH_END() if (cmd == CMD_DOWN) { SoundPlay(&gSoundDevice, StrSound("door")); pl->scroll++; } else if (cmd == CMD_UP) { SoundPlay(&gSoundDevice, StrSound("door")); pl->scroll--; } else if (AnyButton(cmd)) { SoundPlay(&gSoundDevice, StrSound("pickup")); return 1; } // Scroll wrap-around pl->scroll = CLAMP_OPPOSITE(pl->scroll, 0, PlayerListMaxScroll(pl)); return 0; }
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 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 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; }
int SelectCampaign(int dogFight, int cmd) { static int campaignIndex = 0; static int dogfightIndex = 0; int count, x, y, i, j; struct FileEntry *list = dogFight ? dogfightList : campaignList; char *prefix = dogFight ? "dogfights/" : "missions/"; int *index = dogFight ? &dogfightIndex : &campaignIndex; struct FileEntry *f; for (count = 0, f = list; f != NULL; f = f->next, count++); if (cmd == CMD_ESC) return MODE_MAIN; if (AnyButton(cmd)) { for (i = 0, f = list; f != NULL && i < *index; f = f->next, i++); if (f && f->name[0]) { if (customSetting.missions) free(customSetting.missions); if (customSetting.characters) free(customSetting.characters); memset(&customSetting, 0, sizeof(customSetting)); if (LoadCampaign(GetDataFilePath(join(prefix,f->name)), &customSetting, 0, 0) == CAMPAIGN_OK) gCampaign.setting = &customSetting; else SetupBuiltin(dogFight, 0); } else if (f) SetupBuiltin(dogFight, f->data); else { SetupBuiltin(dogFight, 0); } // gCampaign.seed = 0; PlaySound(SND_HAHAHA, 0, 255); printf(">> Entering MODE_PLAY\n"); return MODE_PLAY; } if (Left(cmd) || Up(cmd)) { (*index)--; if (*index < 0) *index = count - 1; PlaySound(SND_SWITCH, 0, 255); } else if (Right(cmd) || Down(cmd)) { (*index)++; if (*index >= count) *index = 0; PlaySound(SND_SWITCH, 0, 255); } if (dogFight) TextStringSpecial("Select a dogfight scenario:", TEXT_TOP | TEXT_XCENTER, 0, (SCREEN_WIDTH / 12)); else TextStringSpecial("Select a campaign:", TEXT_TOP | TEXT_XCENTER, 0, (SCREEN_WIDTH / 12)); x = CenterX(240); y = CenterY(12 * TextHeight()); #define ARROW_UP "\036" #define ARROW_DOWN "\037" for (i = 0, f = list; f != NULL && i <= *index - 12; f = f->next, i++); if (i) DisplayMenuItem(CenterX(TextWidth(ARROW_UP)), y - 2 - TextHeight(), ARROW_UP, 0); for (j = 0; f != NULL && j < 12; f = f->next, i++, j++) { DisplayMenuItem(CenterX(TextWidth(f->info)), y, f->info, i == *index); if (i == *index) { char s[255]; if (strlen(f->name) == 0) sprintf(s, "( Internal )"); else sprintf(s, "( %s )", f->name); TextStringSpecial(s, TEXT_XCENTER | TEXT_BOTTOM, 0, (SCREEN_WIDTH / 12)); } y += TextHeight(); } if (f) DisplayMenuItem(CenterX(TextWidth(ARROW_DOWN)), y + 2, ARROW_DOWN, 0); return dogFight ? MODE_DOGFIGHT : MODE_CAMPAIGN; }