// //////////////////////////////////////////////////////////////////////////// bool loadConfig() { QSettings ini(PHYSFS_getWriteDir() + QString("/") + fileName, QSettings::IniFormat); if (ini.status() != QSettings::NoError) { debug(LOG_ERROR, "Could not open configuration file \"%s\"", fileName); return false; } debug(LOG_WZ, "Reading configuration from %s", ini.fileName().toUtf8().constData()); if (ini.contains("voicevol")) sound_SetUIVolume(ini.value("voicevol").toDouble() / 100.0); if (ini.contains("fxvol")) sound_SetEffectsVolume(ini.value("fxvol").toDouble() / 100.0); if (ini.contains("cdvol")) sound_SetMusicVolume(ini.value("cdvol").toDouble() / 100.0); if (ini.contains("music_enabled")) war_SetMusicEnabled(ini.value("music_enabled").toBool()); if (ini.contains("language")) setLanguage(ini.value("language").toString().toUtf8().constData()); if (ini.contains("nomousewarp")) setMouseWarp(ini.value("nomousewarp").toBool()); if (ini.contains("notexturecompression")) wz_texture_compression = GL_RGBA; showFPS = ini.value("showFPS", false).toBool(); scroll_speed_accel = ini.value("scroll", DEFAULTSCROLL).toInt(); setShakeStatus(ini.value("shake", false).toBool()); setDrawShadows(ini.value("shadows", true).toBool()); war_setSoundEnabled(ini.value("sound", true).toBool()); setInvertMouseStatus(ini.value("mouseflip", true).toBool()); setRightClickOrders(ini.value("RightClickOrders", false).toBool()); setMiddleClickRotate(ini.value("MiddleClickRotate", false).toBool()); rotateRadar = ini.value("rotateRadar", true).toBool(); war_SetPauseOnFocusLoss(ini.value("PauseOnFocusLoss", false).toBool()); NETsetMasterserverName(ini.value("masterserver_name", "lobby.wz2100.net").toString().toUtf8().constData()); iV_font(ini.value("fontname", "DejaVu Sans").toString().toUtf8().constData(), ini.value("fontface", "Book").toString().toUtf8().constData(), ini.value("fontfacebold", "Bold").toString().toUtf8().constData()); NETsetMasterserverPort(ini.value("masterserver_port", MASTERSERVERPORT).toInt()); NETsetGameserverPort(ini.value("gameserver_port", GAMESERVERPORT).toInt()); war_SetFMVmode((FMV_MODE)ini.value("FMVmode", FMV_FULLSCREEN).toInt()); war_setScanlineMode((SCANLINE_MODE)ini.value("scanlines", SCANLINES_OFF).toInt()); seq_SetSubtitles(ini.value("subtitles", true).toBool()); setDifficultyLevel((DIFFICULTY_LEVEL)ini.value("difficulty", DL_NORMAL).toInt()); war_SetSPcolor(ini.value("colour", 0).toInt()); // default is green (0) war_setMPcolour(ini.value("colourMP", -1).toInt()); // default is random (-1) sstrcpy(game.name, ini.value("gameName", _("My Game")).toString().toUtf8().constData()); sstrcpy(sPlayer, ini.value("playerName", _("Player")).toString().toUtf8().constData()); // Set a default map to prevent hosting games without a map. sstrcpy(game.map, "Sk-Rush"); game.hash.setZero(); game.maxPlayers = 4; game.power = ini.value("power", LEV_MED).toInt(); game.base = ini.value("base", CAMP_BASE).toInt(); game.alliance = ini.value("alliance", NO_ALLIANCES).toInt(); game.scavengers = ini.value("scavengers", false).toBool(); memset(&ingame.phrases, 0, sizeof(ingame.phrases)); for (int i = 1; i < 5; i++) { QString key("phrase" + QString::number(i)); if (ini.contains(key)) sstrcpy(ingame.phrases[i], ini.value(key).toString().toUtf8().constData()); } bEnemyAllyRadarColor = ini.value("radarObjectMode").toBool(); radarDrawMode = (RADAR_DRAW_MODE)ini.value("radarTerrainMode", RADAR_MODE_DEFAULT).toInt(); radarDrawMode = (RADAR_DRAW_MODE)MIN(NUM_RADAR_MODES - 1, radarDrawMode); // restrict to allowed values if (ini.contains("textureSize")) setTextureSize(ini.value("textureSize").toInt()); NetPlay.isUPNP = ini.value("UPnP", true).toBool(); if (ini.contains("FSAA")) war_setFSAA(ini.value("FSAA").toInt()); // Leave this to false, some system will fail and they can't see the system popup dialog! war_setFullscreen(ini.value("fullscreen", false).toBool()); war_SetTrapCursor(ini.value("trapCursor", false).toBool()); // this should be enabled on all systems by default war_SetVsync(ini.value("vsync", true).toBool()); // 640x480 is minimum that we will support int width = ini.value("width", 640).toInt(); int height = ini.value("height", 480).toInt(); if (width < 640 || height < 480) // sanity check { width = 640; height = 480; } pie_SetVideoBufferWidth(width); pie_SetVideoBufferHeight(height); war_SetWidth(width); war_SetHeight(height); if (ini.contains("bpp")) pie_SetVideoBufferDepth(ini.value("bpp").toInt()); return true; }
static GAMECODE renderLoop() { if (bMultiPlayer && !NetPlay.isHostAlive && NetPlay.bComms && !NetPlay.isHost) { intAddInGamePopup(); } audio_Update(); wzShowMouse(true); INT_RETVAL intRetVal = INT_NONE; CURSOR cursor = CURSOR_DEFAULT; if (!paused) { /* Run the in game interface and see if it grabbed any mouse clicks */ if (!rotActive && getWidgetsStatus() && dragBox3D.status != DRAG_DRAGGING && wallDrag.status != DRAG_DRAGGING) { intRetVal = intRunWidgets(); // Send droid orders, if any. (Should do between intRunWidgets() calls, to avoid droid orders getting mixed up, in the case of multiple orders given while the game freezes due to net lag.) sendQueuedDroidInfo(); } //don't process the object lists if paused or about to quit to the front end if (!gameUpdatePaused() && intRetVal != INT_QUIT) { if (dragBox3D.status != DRAG_DRAGGING && wallDrag.status != DRAG_DRAGGING && (intRetVal == INT_INTERCEPT || (radarOnScreen && CoordInRadar(mouseX(), mouseY()) && radarPermitted))) { // Using software cursors (when on) for these menus due to a bug in SDL's SDL_ShowCursor() wzSetCursor(CURSOR_DEFAULT); } #ifdef DEBUG // check all flag positions for duplicate delivery points checkFactoryFlags(); #endif //handles callbacks for positioning of DP's process3DBuilding(); processDeliveryRepos(); //ajl. get the incoming netgame messages and process them. // FIXME Previous comment is deprecated. multiPlayerLoop does some other weird stuff, but not that anymore. if (bMultiPlayer) { multiPlayerLoop(); } for (unsigned i = 0; i < MAX_PLAYERS; i++) { for (DROID *psCurr = apsDroidLists[i]; psCurr; psCurr = psCurr->psNext) { // Don't copy the next pointer - if droids somehow get destroyed in the graphics rendering loop, who cares if we crash. calcDroidIllumination(psCurr); } } } if (!consolePaused()) { /* Process all the console messages */ updateConsoleMessages(); } if (!scrollPaused() && dragBox3D.status != DRAG_DRAGGING && intMode != INT_INGAMEOP) { cursor = scroll(); zoom(); } } else // paused { // Using software cursors (when on) for these menus due to a bug in SDL's SDL_ShowCursor() wzSetCursor(CURSOR_DEFAULT); if (dragBox3D.status != DRAG_DRAGGING) { cursor = scroll(); zoom(); } if (InGameOpUp || isInGamePopupUp) // ingame options menu up, run it! { WidgetTriggers const &triggers = widgRunScreen(psWScreen); unsigned widgval = triggers.empty() ? 0 : triggers.front().widget->id; // Just use first click here, since the next click could be on another menu. intProcessInGameOptions(widgval); if (widgval == INTINGAMEOP_QUIT_CONFIRM || widgval == INTINGAMEOP_POPUP_QUIT) { if (gamePaused()) { kf_TogglePauseMode(); } intRetVal = INT_QUIT; } } if (bLoadSaveUp && runLoadSave(true) && strlen(sRequestResult)) { debug(LOG_NEVER, "Returned %s", sRequestResult); if (bRequestLoad) { loopMissionState = LMS_LOADGAME; NET_InitPlayers(); // otherwise alliances were not cleared sstrcpy(saveGameName, sRequestResult); } else { char msgbuffer[256] = {'\0'}; if (saveInMissionRes()) { if (saveGame(sRequestResult, GTYPE_SAVE_START)) { sstrcpy(msgbuffer, _("GAME SAVED: ")); sstrcat(msgbuffer, sRequestResult); addConsoleMessage(msgbuffer, LEFT_JUSTIFY, NOTIFY_MESSAGE); } else { ASSERT(false, "Mission Results: saveGame Failed"); sstrcpy(msgbuffer, _("Could not save game!")); addConsoleMessage(msgbuffer, LEFT_JUSTIFY, NOTIFY_MESSAGE); deleteSaveGame(sRequestResult); } } else if (bMultiPlayer || saveMidMission()) { if (saveGame(sRequestResult, GTYPE_SAVE_MIDMISSION))//mid mission from [esc] menu { sstrcpy(msgbuffer, _("GAME SAVED: ")); sstrcat(msgbuffer, sRequestResult); addConsoleMessage(msgbuffer, LEFT_JUSTIFY, NOTIFY_MESSAGE); } else { ASSERT(!"saveGame(sRequestResult, GTYPE_SAVE_MIDMISSION) failed", "Mid Mission: saveGame Failed"); sstrcpy(msgbuffer, _("Could not save game!")); addConsoleMessage(msgbuffer, LEFT_JUSTIFY, NOTIFY_MESSAGE); deleteSaveGame(sRequestResult); } } else { ASSERT(false, "Attempt to save game with incorrect load/save mode"); } } } } /* Check for quit */ bool quitting = false; if (intRetVal == INT_QUIT) { if (!loop_GetVideoStatus()) { //quitting from the game to the front end //so get a new backdrop quitting = true; pie_LoadBackDrop(SCREEN_RANDOMBDROP); } } if (!loop_GetVideoStatus() && !quitting) { if (!gameUpdatePaused()) { if (dragBox3D.status != DRAG_DRAGGING && wallDrag.status != DRAG_DRAGGING && intRetVal != INT_INTERCEPT) { ProcessRadarInput(); } processInput(); //no key clicks or in Intelligence Screen if (!isMouseOverRadar() && intRetVal == INT_NONE && !InGameOpUp && !isInGamePopupUp) { CURSOR cursor2 = processMouseClickInput(); cursor = cursor2 == CURSOR_DEFAULT? cursor : cursor2; } displayWorld(); } wzPerfBegin(PERF_GUI, "User interface"); /* Display the in game interface */ pie_SetDepthBufferStatus(DEPTH_CMP_ALWAYS_WRT_ON); pie_SetFogStatus(false); if (bMultiPlayer && bDisplayMultiJoiningStatus) { intDisplayMultiJoiningStatus(bDisplayMultiJoiningStatus); setWidgetsStatus(false); } if (getWidgetsStatus()) { intDisplayWidgets(); } pie_SetDepthBufferStatus(DEPTH_CMP_LEQ_WRT_ON); pie_SetFogStatus(true); wzPerfEnd(PERF_GUI); } wzSetCursor(cursor); pie_GetResetCounts(&loopPieCount, &loopPolyCount); if (!quitting) { /* Check for toggling display mode */ if ((keyDown(KEY_LALT) || keyDown(KEY_RALT)) && keyPressed(KEY_RETURN)) { war_setFullscreen(!war_getFullscreen()); wzToggleFullscreen(); } } // deal with the mission state switch (loopMissionState) { case LMS_CLEAROBJECTS: missionDestroyObjects(); setScriptPause(true); loopMissionState = LMS_SETUPMISSION; break; case LMS_NORMAL: // default break; case LMS_SETUPMISSION: setScriptPause(false); if (!setUpMission(nextMissionType)) { return GAMECODE_QUITGAME; } break; case LMS_SAVECONTINUE: // just wait for this to be changed when the new mission starts break; case LMS_NEWLEVEL: //nextMissionType = MISSION_NONE; nextMissionType = LDS_NONE; return GAMECODE_NEWLEVEL; break; case LMS_LOADGAME: return GAMECODE_LOADGAME; break; default: ASSERT(false, "unknown loopMissionState"); break; } int clearMode = 0; if (getDrawShadows()) { clearMode |= CLEAR_SHADOW; } if (quitting || loopMissionState == LMS_SAVECONTINUE) { pie_SetFogStatus(false); clearMode = CLEAR_BLACK; } pie_ScreenFlip(clearMode);//gameloopflip if (quitting) { /* Check for toggling display mode */ if ((keyDown(KEY_LALT) || keyDown(KEY_RALT)) && keyPressed(KEY_RETURN)) { war_setFullscreen(!war_getFullscreen()); wzToggleFullscreen(); } return GAMECODE_QUITGAME; } else if (loop_GetVideoStatus()) { audio_StopAll(); return GAMECODE_PLAYVIDEO; } return GAMECODE_CONTINUE; }
/** * Second half of command line parsing. See ParseCommandLineEarly() for * the first half. Note that render mode must come before resolution flag. * \param argc number of arguments given * \param argv string array of the arguments * \return Returns true on success, false on error */ bool ParseCommandLine(int argc, const char **argv) { poptContext poptCon = poptGetContext(NULL, argc, argv, getOptionsTable(), 0); int iOption; /* loop through command line */ while ((iOption = poptGetNextOpt(poptCon)) > 0) { const char *token; CLI_OPTIONS option = (CLI_OPTIONS)iOption; switch (option) { case CLI_DEBUG: case CLI_DEBUGFILE: case CLI_FLUSHDEBUGSTDERR: case CLI_CONFIGDIR: case CLI_HELP: case CLI_VERSION: // These options are parsed in ParseCommandLineEarly() already, so ignore them break; case CLI_NOASSERT: kf_NoAssert(); break; // NOTE: The sole purpose of this is to test the crash handler. case CLI_CRASH: CauseCrash = true; NetPlay.bComms = false; sstrcpy(aLevelName, "CAM_3A"); SetGameMode(GS_NORMAL); break; case CLI_DATADIR: // retrieve the quoted path name token = poptGetOptArg(poptCon); if (token == NULL) { qFatal("Unrecognised datadir"); } sstrcpy(datadir, token); break; case CLI_FULLSCREEN: war_setFullscreen(true); break; case CLI_CONNECTTOIP: //get the ip we want to connect with, and go directly to join screen. token = poptGetOptArg(poptCon); if (token == NULL) { qFatal("No IP/hostname given"); } sstrcpy(iptoconnect, token); break; case CLI_HOSTLAUNCH: // go directly to host screen, bypass all others. hostlaunch = true; break; case CLI_GAME: // retrieve the game name token = poptGetOptArg(poptCon); if (token == NULL || (strcmp(token, "CAM_1A") && strcmp(token, "CAM_2A") && strcmp(token, "CAM_3A") && strcmp(token, "TUTORIAL3") && strcmp(token, "FASTPLAY"))) { qFatal("The game parameter requires one of the following keywords:" "CAM_1A, CAM_2A, CAM_3A, TUTORIAL3, or FASTPLAY."); } NetPlay.bComms = false; bMultiPlayer = false; bMultiMessages = false; NetPlay.players[0].allocated = true; if (!strcmp(token, "CAM_1A") || !strcmp(token, "CAM_2A") || !strcmp(token, "CAM_3A")) { game.type = CAMPAIGN; } else { game.type = SKIRMISH; // tutorial is skirmish for some reason } sstrcpy(aLevelName, token); SetGameMode(GS_NORMAL); break; case CLI_MOD_GLOB: { unsigned int i; // retrieve the file name token = poptGetOptArg(poptCon); if (token == NULL) { qFatal("Missing mod name?"); } // Find an empty place in the global_mods list for (i = 0; i < 100 && global_mods[i] != NULL; ++i) {} if (i >= 100 || global_mods[i] != NULL) { qFatal("Too many mods registered! Aborting!"); } global_mods[i] = strdup(token); break; } case CLI_MOD_CA: { unsigned int i; // retrieve the file name token = poptGetOptArg(poptCon); if (token == NULL) { qFatal("Missing mod name?"); } // Find an empty place in the campaign_mods list for (i = 0; i < 100 && campaign_mods[i] != NULL; ++i) {} if (i >= 100 || campaign_mods[i] != NULL) { qFatal("Too many mods registered! Aborting!"); } campaign_mods[i] = strdup(token); break; } case CLI_MOD_MP: { unsigned int i; // retrieve the file name token = poptGetOptArg(poptCon); if (token == NULL) { qFatal("Missing mod name?"); } for (i = 0; i < 100 && multiplay_mods[i] != NULL; ++i) {} if (i >= 100 || multiplay_mods[i] != NULL) { qFatal("Too many mods registered! Aborting!"); } multiplay_mods[i] = strdup(token); break; } case CLI_RESOLUTION: { unsigned int width, height; token = poptGetOptArg(poptCon); if (sscanf(token, "%ix%i", &width, &height) != 2) { qFatal("Invalid parameter specified (format is WIDTHxHEIGHT, e.g. 800x600)"); } if (width < 640) { debug(LOG_ERROR, "Screen width < 640 unsupported, using 640"); width = 640; } if (height < 480) { debug(LOG_ERROR, "Screen height < 480 unsupported, using 480"); height = 480; } // tell the display system of the desired resolution pie_SetVideoBufferWidth(width); pie_SetVideoBufferHeight(height); // and update the configuration war_SetWidth(width); war_SetHeight(height); break; } case CLI_SAVEGAME: // retrieve the game name token = poptGetOptArg(poptCon); if (token == NULL) { qFatal("Unrecognised savegame name"); } snprintf(saveGameName, sizeof(saveGameName), "%s/%s", SaveGamePath, token); SetGameMode(GS_SAVEGAMELOAD); break; case CLI_WINDOW: war_setFullscreen(false); break; case CLI_SHADOWS: setDrawShadows(true); break; case CLI_NOSHADOWS: setDrawShadows(false); break; case CLI_SOUND: war_setSoundEnabled(true); break; case CLI_NOSOUND: war_setSoundEnabled(false); break; case CLI_TEXTURECOMPRESSION: wz_texture_compression = GL_COMPRESSED_RGBA_ARB; break; case CLI_NOTEXTURECOMPRESSION: wz_texture_compression = GL_RGBA; break; }; } return true; }
// ///////////////// ///////////////////////////////////////////////// // Main Front end game loop. TITLECODE titleLoop(void) { TITLECODE RetCode = TITLECODE_CONTINUE; pie_SetDepthBufferStatus(DEPTH_CMP_ALWAYS_WRT_ON); pie_SetFogStatus(false); screen_RestartBackDrop(); wzShowMouse(true); // When we first init the game, firstcall is true. if (firstcall) { firstcall = false; // First check to see if --host was given as a command line option, if not, // then check --join and if neither, run the normal game menu. if (hostlaunch) { NetPlay.bComms = true; // use network = true NetPlay.isUPNP_CONFIGURED = false; NetPlay.isUPNP_ERROR = false; ingame.bHostSetup = true; bMultiPlayer = true; bMultiMessages = true; NETinit(true); NETdiscoverUPnPDevices(); game.type = SKIRMISH; changeTitleMode(MULTIOPTION); hostlaunch = false; // reset the bool to default state. } else if (strlen(iptoconnect)) { NetPlay.bComms = true; // use network = true NETinit(true); joinGame(iptoconnect, 0); } else { changeTitleMode(TITLE); // normal game, run main title screen. } // Using software cursors (when on) for these menus due to a bug in SDL's SDL_ShowCursor() wzSetCursor(CURSOR_DEFAULT); } if (titleMode != MULTIOPTION && titleMode != MULTILIMIT && titleMode != STARTGAME) { screen_disableMapPreview(); } switch (titleMode) // run relevant title screen code. { // MULTIPLAYER screens case PROTOCOL: runConnectionScreen(); // multiplayer connection screen. break; case MULTIOPTION: runMultiOptions(); break; case GAMEFIND: runGameFind(); break; case MULTI: runMultiPlayerMenu(); break; case MULTILIMIT: runLimitScreen(); break; case KEYMAP: runKeyMapEditor(); break; case TITLE: runTitleMenu(); break; case CAMPAIGNS: runCampaignSelector(); break; case SINGLE: runSinglePlayerMenu(); break; case TUTORIAL: runTutorialMenu(); break; case CREDITS: runCreditsScreen(); break; case OPTIONS: runOptionsMenu(); break; case GAME: runGameOptionsMenu(); break; case GRAPHICS_OPTIONS: runGraphicsOptionsMenu(); break; case AUDIO_OPTIONS: runAudioOptionsMenu(); break; case VIDEO_OPTIONS: runVideoOptionsMenu(); break; case MOUSE_OPTIONS: runMouseOptionsMenu(); break; case QUIT: RetCode = TITLECODE_QUITGAME; break; case STARTGAME: case LOADSAVEGAME: if (titleMode == LOADSAVEGAME) { RetCode = TITLECODE_SAVEGAMELOAD; } else { RetCode = TITLECODE_STARTGAME; } return RetCode; // don't flip! case SHOWINTRO: pie_SetFogStatus(false); pie_ScreenFlip(CLEAR_BLACK); changeTitleMode(TITLE); RetCode = TITLECODE_SHOWINTRO; break; default: debug(LOG_FATAL, "unknown title screen mode"); abort(); } NETflush(); // Send any pending network data. audio_Update(); pie_SetFogStatus(false); pie_ScreenFlip(CLEAR_BLACK);//title loop if ((keyDown(KEY_LALT) || keyDown(KEY_RALT)) && keyPressed(KEY_RETURN)) { war_setFullscreen(!war_getFullscreen()); wzToggleFullscreen(); } return RetCode; }
bool runVideoOptionsMenu(void) { //SDL_Rect **modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); HACK modes[] = {{1920, 1200}, {1920, 1080}, {1680, 1050}, {1600, 1200}, {1440, 900}, {1280, 1024}, {1280, 960}, {1280, 800}, {1280, 720}, {1024, 768}, {800, 600}, {720, 576}, {720, 480}, {640, 480}, {0, 0}}; UDWORD id = widgRunScreen(psWScreen); int level; switch (id) { case FRONTEND_WINDOWMODE: case FRONTEND_WINDOWMODE_R: if (war_getFullscreen()) { war_setFullscreen(false); widgSetString(psWScreen, FRONTEND_WINDOWMODE_R, _("Windowed")); } else { war_setFullscreen(true); widgSetString(psWScreen, FRONTEND_WINDOWMODE_R, _("Fullscreen")); } break; case FRONTEND_FSAA: case FRONTEND_FSAA_R: switch (level = war_getFSAA()) { case FSAA_OFF: war_setFSAA((FSAA_LEVEL)(level + 1)); widgSetString(psWScreen, FRONTEND_FSAA_R, "2X"); break; case FSAA_2X: war_setFSAA((FSAA_LEVEL)(level + 1)); widgSetString(psWScreen, FRONTEND_FSAA_R, "4X"); break; case FSAA_4X: war_setFSAA((FSAA_LEVEL)(level + 1)); widgSetString(psWScreen, FRONTEND_FSAA_R, "8X"); break; case FSAA_8X: war_setFSAA((FSAA_LEVEL)(level + 1)); widgSetString(psWScreen, FRONTEND_FSAA_R, _("Off")); break; default: // we can't check what the max level the card is capable of, without first creating that level, and testing. ASSERT(!"invalid FSAA level ?", "Invalid FSAA level: %u", (unsigned int)level); addTextButton(FRONTEND_FSAA_R, FRONTEND_POS5M-55, FRONTEND_POS6Y, _("Unsupported"), 0); break; } break; case FRONTEND_RESOLUTION: case FRONTEND_RESOLUTION_R: { int current, count, oldcurrent; // Get the current mode offset for (count = 0, current = 0; modes[count]; count++) { if (war_GetWidth() == modes[count]->w && war_GetHeight() == modes[count]->h) { current = count; } } // Increment and clip if required // Hide resolutions lower than Warzone can support oldcurrent = current; do { if (!mouseReleased(MOUSE_RMB)) { if (--current < 0) current = count - 1; } else { if (++current == count) current = 0; } } while ((modes[current]->w < 640 || modes[current]->h < 480) && current != oldcurrent); // Set the new width and height (takes effect on restart) war_SetWidth(modes[current]->w); war_SetHeight(modes[current]->h); // Generate the textual representation of the new width and height snprintf(resolution, WIDG_MAXSTR, "%d x %d", modes[current]->w, modes[current]->h); // Update the widget widgSetString(psWScreen, FRONTEND_RESOLUTION_R, resolution); break; } case FRONTEND_TRAP: case FRONTEND_TRAP_R: if (war_GetTrapCursor()) { war_SetTrapCursor(false); widgSetString(psWScreen, FRONTEND_TRAP_R, _("Off")); } else { war_SetTrapCursor(true); widgSetString(psWScreen, FRONTEND_TRAP_R, _("On")); } break; case FRONTEND_TEXTURESZ: case FRONTEND_TEXTURESZ_R: { int newTexSize = getTextureSize() * 2; // Clip such that 128 <= size <= 2048 if (newTexSize > 2048) { newTexSize = 128; } // Set the new size setTextureSize(newTexSize); // Generate the string representation of the new size snprintf(textureSize, WIDG_MAXSTR, "%d", newTexSize); // Update the widget widgSetString(psWScreen, FRONTEND_TEXTURESZ_R, textureSize); break; } case FRONTEND_VSYNC: case FRONTEND_VSYNC_R: { if (war_GetVsync()) { war_SetVsync(false); widgSetString(psWScreen, FRONTEND_VSYNC_R, _("Off")); } else { war_SetVsync(true); widgSetString(psWScreen, FRONTEND_VSYNC_R, _("On")); } break; } case FRONTEND_QUIT: changeTitleMode(OPTIONS); break; default: break; } if (CancelPressed()) { changeTitleMode(OPTIONS); } widgDisplayScreen(psWScreen); return true; }
// //////////////////////////////////////////////////////////////////////////// bool loadConfig() { WzConfig ini(fileName); if (ini.status() != QSettings::NoError) { debug(LOG_ERROR, "Could not open configuration file \"%s\"", fileName); return false; } debug(LOG_WZ, "Reading configuration from %s", ini.fileName().toUtf8().constData()); if (ini.contains("voicevol")) sound_SetUIVolume(ini.value("voicevol").toDouble() / 100.0); if (ini.contains("fxvol")) sound_SetEffectsVolume(ini.value("fxvol").toDouble() / 100.0); if (ini.contains("cdvol")) sound_SetMusicVolume(ini.value("cdvol").toDouble() / 100.0); if (ini.contains("music_enabled")) war_SetMusicEnabled(ini.value("music_enabled").toBool()); if (ini.contains("language")) setLanguage(ini.value("language").toString().toUtf8().constData()); if (ini.contains("nomousewarp")) setMouseWarp(ini.value("nomousewarp").toBool()); showFPS = ini.value("showFPS", false).toBool(); scroll_speed_accel = ini.value("scroll", DEFAULTSCROLL).toInt(); setShakeStatus(ini.value("shake", false).toBool()); setDrawShadows(ini.value("shadows", true).toBool()); war_setSoundEnabled(ini.value("sound", true).toBool()); setInvertMouseStatus(ini.value("mouseflip", true).toBool()); setRightClickOrders(ini.value("RightClickOrders", false).toBool()); setMiddleClickRotate(ini.value("MiddleClickRotate", false).toBool()); rotateRadar = ini.value("rotateRadar", true).toBool(); war_SetPauseOnFocusLoss(ini.value("PauseOnFocusLoss", false).toBool()); NETsetMasterserverName(ini.value("masterserver_name", "lobby.wz2100.net").toString().toUtf8().constData()); iV_font(ini.value("fontname", "DejaVu Sans").toString().toUtf8().constData(), ini.value("fontface", "Book").toString().toUtf8().constData(), ini.value("fontfacebold", "Bold").toString().toUtf8().constData()); NETsetMasterserverPort(ini.value("masterserver_port", MASTERSERVERPORT).toInt()); NETsetGameserverPort(ini.value("gameserver_port", GAMESERVERPORT).toInt()); war_SetFMVmode((FMV_MODE)ini.value("FMVmode", FMV_FULLSCREEN).toInt()); war_setScanlineMode((SCANLINE_MODE)ini.value("scanlines", SCANLINES_OFF).toInt()); seq_SetSubtitles(ini.value("subtitles", true).toBool()); setDifficultyLevel((DIFFICULTY_LEVEL)ini.value("difficulty", DL_NORMAL).toInt()); war_SetFog(ini.value("visfog", true).toBool()); war_SetSPcolor(ini.value("colour", 0).toInt()); // default is green (0) sstrcpy(game.name, ini.value("gameName", _("My Game")).toString().toUtf8().constData()); sstrcpy(sPlayer, ini.value("playerName", _("Player")).toString().toUtf8().constData()); if (ini.contains("mapName") && ini.contains("maxPlayers")) { sstrcpy(game.map, ini.value("mapName").toString().toUtf8().constData()); game.maxPlayers = ini.value("maxPlayers").toInt(); // FIXME: horrible kluge, MUST match map above } else { // Set a default map to prevent hosting games without a map. sstrcpy(game.map, "Sk-Rush"); game.maxPlayers = 4; } game.power = ini.value("power", LEV_MED).toInt(); game.fog = ini.value("fog").toBool(); game.base = ini.value("base", CAMP_BASE).toInt(); game.alliance = ini.value("alliance", NO_ALLIANCES).toInt(); memset(&ingame.phrases, 0, sizeof(ingame.phrases)); for (int i = 1; i < 5; i++) { QString key("phrase" + QString::number(i)); if (ini.contains(key)) sstrcpy(ingame.phrases[i], ini.value(key).toString().toUtf8().constData()); } bEnemyAllyRadarColor = ini.value("radarObjectMode").toBool(); radarDrawMode = (RADAR_DRAW_MODE)ini.value("radarTerrainMode", RADAR_MODE_DEFAULT).toInt(); if (ini.contains("textureSize")) setTextureSize(ini.value("textureSize").toInt()); NetPlay.isUPNP = ini.value("UPnP", true).toBool(); if (ini.contains("FSAA")) war_setFSAA(ini.value("FSAA").toInt()); war_setFullscreen(ini.value("fullscreen", true).toBool()); war_SetTrapCursor(ini.value("trapCursor", false).toBool()); war_SetVsync(ini.value("vsync", true).toBool()); int width = ini.value("width", 0).toInt(); int height = ini.value("height", 0).toInt(); if (width < 640 || height < 480) // sanity check { height = width = 0; } pie_SetVideoBufferWidth(width); pie_SetVideoBufferHeight(height); war_SetWidth(width); war_SetHeight(height); if (ini.contains("bpp")) pie_SetVideoBufferDepth(ini.value("bpp").toInt()); setFramerateLimit(ini.value("framerate", 60).toInt()); return true; }
// //////////////////////////////////////////////////////////////////////////// bool loadConfig(void) { int val; char sBuf[255]; bool bad_resolution = false; if (!openWarzoneKey()) { return false; } // options screens. // ////////////////////////// // ////////////////////////// // voice vol if(getWarzoneKeyNumeric("voicevol", &val)) { sound_SetUIVolume((float)val / 100.0);//was val } // ////////////////////////// // fx vol if(getWarzoneKeyNumeric("fxvol", &val)) { sound_SetEffectsVolume((float)val / 100.0);//was val } // ////////////////////////// // cdvol if(getWarzoneKeyNumeric("cdvol", &val)) { sound_SetMusicVolume((float)val / 100.0); } if (getWarzoneKeyNumeric("debugmode", &val)) { bAllowDebugMode = val; } else { #ifdef DEBUG bAllowDebugMode = true; #else bAllowDebugMode = false; #endif setWarzoneKeyNumeric("debugmode", bAllowDebugMode); } if (getWarzoneKeyNumeric("music_enabled", &val)) { war_SetMusicEnabled(val); } if (getWarzoneKeyString("language", sBuf)) { setLanguage(sBuf); } if (getWarzoneKeyNumeric("showFPS", &val)) { showFPS = val; } else { showFPS = false; setWarzoneKeyNumeric("showFPS", false); } // ////////////////////////// // scroll if(getWarzoneKeyNumeric("scroll", &val)) { scroll_speed_accel = val; } else { scroll_speed_accel = DEFAULTSCROLL; setWarzoneKeyNumeric("scroll", DEFAULTSCROLL); } // ////////////////////////// // screen shake if(getWarzoneKeyNumeric("shake", &val)) { setShakeStatus(val); } else { setShakeStatus(false); setWarzoneKeyNumeric("shake", false); } // ////////////////////////// // draw shadows if(getWarzoneKeyNumeric("shadows", &val)) { setDrawShadows(val); } else { setDrawShadows(true); setWarzoneKeyNumeric("shadows", true); } // ////////////////////////// // enable sound if(getWarzoneKeyNumeric("sound", &val)) { war_setSoundEnabled( val ); } else { war_setSoundEnabled( true ); setWarzoneKeyNumeric( "sound", true ); } // ////////////////////////// // invert mouse if(getWarzoneKeyNumeric("mouseflip", &val)) { setInvertMouseStatus(val); } else { setInvertMouseStatus(true); setWarzoneKeyNumeric("mouseflip", true); } // ////////////////////////// // mouse buttons if (getWarzoneKeyNumeric("RightClickOrders", &val)) { setRightClickOrders(val); } else { setRightClickOrders(false); setWarzoneKeyNumeric("RightClickOrders", false); } if (getWarzoneKeyNumeric("MiddleClickRotate", &val)) { setMiddleClickRotate(val); } else { setMiddleClickRotate(false); setWarzoneKeyNumeric("MiddleClickRotate", false); } // ////////////////////////// // rotate radar if(getWarzoneKeyNumeric("rotateRadar", &val)) { rotateRadar = val; } else { rotateRadar = true; setWarzoneKeyNumeric("rotateRadar", rotateRadar); } if (getWarzoneKeyNumeric("PauseOnFocusLoss", &val)) { war_SetPauseOnFocusLoss(val); } else { war_SetPauseOnFocusLoss(false); setWarzoneKeyNumeric("PauseOnFocusLoss", false); } if (getWarzoneKeyString("masterserver_name", sBuf)) { NETsetMasterserverName(sBuf); if (strcasecmp(sBuf, "lobby.wz2100.net") != 0) { debug(LOG_ERROR, "We are not using lobby.wz2100.net, for the master server name, we are using %s instead?", sBuf); } } else { NETsetMasterserverName("lobby.wz2100.net"); setWarzoneKeyString("masterserver_name", NETgetMasterserverName()); } if (getWarzoneKeyString("fontname", sBuf) && strcmp(sBuf,"Lucida Grande")) { iV_font(sBuf, NULL, NULL); } else { iV_font("DejaVu Sans", NULL, NULL); setWarzoneKeyString("fontname", "DejaVu Sans"); } if (getWarzoneKeyString("fontface", sBuf) && strcmp(sBuf,"Normal")) { iV_font(NULL, sBuf, NULL); } else { iV_font(NULL, "Book", NULL); setWarzoneKeyString("fontface", "Book"); } if (getWarzoneKeyString("fontfacebold", sBuf)) { iV_font(NULL, NULL, sBuf); } else { iV_font(NULL, NULL, "Bold"); setWarzoneKeyString("fontfacebold", "Bold"); } if (getWarzoneKeyNumeric("masterserver_port", &val)) { NETsetMasterserverPort(val); if (val != MASTERSERVERPORT) { debug(LOG_ERROR, "We are not using port %d (which is the default Master server port), we are using %d?", MASTERSERVERPORT, val); } } else { NETsetMasterserverPort(MASTERSERVERPORT); setWarzoneKeyNumeric("masterserver_port", NETgetMasterserverPort()); } if (getWarzoneKeyNumeric("gameserver_port", &val)) { NETsetGameserverPort(val); if (val != GAMESERVERPORT) { debug(LOG_ERROR, "We are not using port %d (which is the default Game server port), we are using %d?", GAMESERVERPORT, val); } } else { NETsetGameserverPort(GAMESERVERPORT); setWarzoneKeyNumeric("gameserver_port", NETgetGameserverPort()); } // ////////////////////////// // sequences if (getWarzoneKeyNumeric("FMVmode", &val)) { war_SetFMVmode((FMV_MODE)val); } else { war_SetFMVmode(FMV_FULLSCREEN); } // ////////////////////////// // subtitles if(getWarzoneKeyNumeric("subtitles", &val)) { seq_SetSubtitles(val); } else { seq_SetSubtitles(true); } // ////////////////////////// // difficulty if(getWarzoneKeyNumeric("difficulty", &val)) { setDifficultyLevel((DIFFICULTY_LEVEL)val); } else { setDifficultyLevel(DL_NORMAL); setWarzoneKeyNumeric("difficulty", DL_NORMAL); } // ////////////////////////// // use vis fog if(getWarzoneKeyNumeric("visfog", &val)) { if(val) { war_SetFog(false); } else { war_SetFog(true); } } else { war_SetFog(true); setWarzoneKeyNumeric("visfog", 0); } // ////////////////////////// // favourite colour if(!bMultiPlayer) { if(getWarzoneKeyNumeric("colour", &val)) { war_SetSPcolor(val); } else { war_SetSPcolor(0); //default is green (0) setWarzoneKeyNumeric("colour", 0); } } // ///////////////////////// // multiplayer stuff. // ///////////////////////// // game name if (getWarzoneKeyString("gameName", sBuf)) { sstrcpy(game.name, sBuf); } else { setWarzoneKeyString("gameName", "My Game"); } // player name // must _not_ be an empty string if (getWarzoneKeyString("playerName", sBuf) && *sBuf != '\0') { sstrcpy(sPlayer, sBuf); } else { setWarzoneKeyString("playerName", _("Player")); sstrcpy(sPlayer, _("Player")); } // map name if(getWarzoneKeyString("mapName", sBuf)) { /* FIXME: Get rid of storing the max-player count in the config * file. Instead we should parse the map *before* * showing the skirmish/multiplayer setup screen. */ if (getWarzoneKeyNumeric("maxPlayers", &val)) { sstrcpy(game.map, sBuf); game.maxPlayers = val; } else { debug(LOG_WARNING, "Invalid or not found maxPlayers parameter for map %s", game.map); debug(LOG_WARNING, "Reseting map to default parameters."); // we don't have maxPlayers set, so fall back to defaults. game.maxPlayers = 4; //4 is for the DEFAULTSKIRMISHMAP map (rush) sstrcpy(game.map, DEFAULTSKIRMISHMAP); setWarzoneKeyString("mapName", game.map); setWarzoneKeyNumeric("maxPlayers",game.maxPlayers); } } else { sstrcpy(game.map, DEFAULTSKIRMISHMAP); setWarzoneKeyString("mapName", game.map); } // power if(getWarzoneKeyNumeric("power", &val)) { game.power = val; } else { game.power = LEV_MED; setWarzoneKeyNumeric("power", game.power); } // fog if(getWarzoneKeyNumeric("fog", &val)) { game.fog= val; } else { game.fog= true; setWarzoneKeyNumeric("fog", game.fog); } //base if(getWarzoneKeyNumeric("base", &val)) { game.base =(UBYTE)val; } else { game.base = CAMP_BASE; setWarzoneKeyNumeric("base", game.base); } //alliance if(getWarzoneKeyNumeric("alliance", &val)) { game.alliance =(UBYTE)val; } else { game.alliance = NO_ALLIANCES; setWarzoneKeyNumeric("alliance", game.alliance); } // favourite phrases if(getWarzoneKeyString("phrase0", ingame.phrases[0])) { getWarzoneKeyString("phrase1", ingame.phrases[1]); getWarzoneKeyString("phrase2", ingame.phrases[2]); getWarzoneKeyString("phrase3", ingame.phrases[3]); getWarzoneKeyString("phrase4", ingame.phrases[4]); } else { memset(&ingame.phrases, 0, sizeof(ingame.phrases)); setWarzoneKeyString("phrase0", ingame.phrases[0]); setWarzoneKeyString("phrase1", ingame.phrases[1]); setWarzoneKeyString("phrase2", ingame.phrases[2]); setWarzoneKeyString("phrase3", ingame.phrases[3]); setWarzoneKeyString("phrase4", ingame.phrases[4]); } // enemy/allies radar view if(getWarzoneKeyNumeric("radarObjectMode", &val)) { bEnemyAllyRadarColor =(bool)val; } else { bEnemyAllyRadarColor = false; setWarzoneKeyNumeric("radarObjectMode", (SDWORD)bEnemyAllyRadarColor); } // mini-map terrain mode if(getWarzoneKeyNumeric("radarTerrainMode", &val)) { radarDrawMode = (RADAR_DRAW_MODE)val; if(radarDrawMode >= NUM_RADAR_MODES) { ASSERT(!"wrong mini-map mode", "loadConfig: wrong mini-map mode: %d", radarDrawMode); radarDrawMode = RADAR_MODE_DEFAULT; } } else { radarDrawMode = RADAR_MODE_DEFAULT; setWarzoneKeyNumeric("radarTerrainMode", radarDrawMode); } // texture size if (getWarzoneKeyNumeric("textureSize", &val)) { setTextureSize(val); } else { setWarzoneKeyNumeric("textureSize", getTextureSize()); } // UPnP detection if (getWarzoneKeyNumeric("UPnP", &val)) { NetPlay.isUPNP = val; } else { setWarzoneKeyNumeric("UPnP", 1); NetPlay.isUPNP = 1; } if (getWarzoneKeyNumeric("FSAA", &val)) { war_setFSAA(val); } else { setWarzoneKeyNumeric("FSAA", war_getFSAA()); } if( getWarzoneKeyNumeric("fullscreen", &val) ) { war_setFullscreen(val); } else { // If no setting is found go to fullscreen by default setWarzoneKeyNumeric("fullscreen", true); war_setFullscreen(true); } if (getWarzoneKeyNumeric("ColouredCursor", &val)) { war_SetColouredCursor(val); } else { #ifdef WZ_OS_MAC // Mac OS X doesn't support normal cursors war_SetColouredCursor(true); setWarzoneKeyNumeric("ColouredCursor", true); #else war_SetColouredCursor(false); setWarzoneKeyNumeric("ColouredCursor", false); #endif } if (getWarzoneKeyNumeric("trapCursor", &val)) { war_SetTrapCursor(val); } else { war_SetTrapCursor(false); } if (getWarzoneKeyNumeric("vsync", &val)) { war_SetVsync(val); } else { war_SetVsync(true); } // now load the desired res.. // note that we only do this if we havent changed renderer.. if (getWarzoneKeyNumeric("width", &val) && val >= 640) { pie_SetVideoBufferWidth(val); war_SetWidth(val); } else { bad_resolution = true; } if (getWarzoneKeyNumeric("height", &val) && val >= 400) { pie_SetVideoBufferHeight(val); war_SetHeight(val); } else { bad_resolution = true; } if (bad_resolution) { // If we have an invalid or incomplete resolution specified // fall back to the defaults. war_SetWidth(0); war_SetHeight(0); } if (getWarzoneKeyNumeric("bpp", &val)) { pie_SetVideoBufferDepth(val); } if (getWarzoneKeyNumeric("framerate", &val)) { setFramerateLimit(val); } return closeWarzoneKey(); }
bool runVideoOptionsMenu(void) { SDL_Rect **modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); UDWORD id = widgRunScreen(psWScreen); switch (id) { case FRONTEND_WINDOWMODE: case FRONTEND_WINDOWMODE_R: if (war_getFullscreen()) { war_setFullscreen(false); widgSetString(psWScreen, FRONTEND_WINDOWMODE_R, _("Windowed")); } else { war_setFullscreen(true); widgSetString(psWScreen, FRONTEND_WINDOWMODE_R, _("Fullscreen")); } break; case FRONTEND_RESOLUTION: case FRONTEND_RESOLUTION_R: { int current, count, oldcurrent; // Get the current mode offset for (count = 0, current = 0; modes[count]; count++) { if (war_GetWidth() == modes[count]->w && war_GetHeight() == modes[count]->h) { current = count; } } // Increment and clip if required // Hide resolutions lower than Warzone can support oldcurrent = current; do { if (!mouseReleased(MOUSE_RMB)) { if (--current < 0) current = count - 1; } else { if (++current == count) current = 0; } } while ((modes[current]->w < 640 || modes[current]->h < 480) && current != oldcurrent); // Set the new width and height (takes effect on restart) war_SetWidth(modes[current]->w); war_SetHeight(modes[current]->h); // Generate the textual representation of the new width and height snprintf(resolution, WIDG_MAXSTR, "%d x %d", modes[current]->w, modes[current]->h); // Update the widget widgSetString(psWScreen, FRONTEND_RESOLUTION_R, resolution); break; } case FRONTEND_TRAP: case FRONTEND_TRAP_R: if (war_GetTrapCursor()) { war_SetTrapCursor(false); widgSetString(psWScreen, FRONTEND_TRAP_R, _("Off")); } else { war_SetTrapCursor(true); widgSetString(psWScreen, FRONTEND_TRAP_R, _("On")); } break; case FRONTEND_TEXTURESZ: case FRONTEND_TEXTURESZ_R: { int newTexSize = getTextureSize() * 2; // Clip such that 128 <= size <= 2048 if (newTexSize > 2048) { newTexSize = 128; } // Set the new size setTextureSize(newTexSize); // Generate the string representation of the new size snprintf(textureSize, WIDG_MAXSTR, "%d", newTexSize); // Update the widget widgSetString(psWScreen, FRONTEND_TEXTURESZ_R, textureSize); break; } case FRONTEND_VSYNC: case FRONTEND_VSYNC_R: { if (war_GetVsync()) { war_SetVsync(false); widgSetString(psWScreen, FRONTEND_VSYNC_R, _("Off")); } else { war_SetVsync(true); widgSetString(psWScreen, FRONTEND_VSYNC_R, _("On")); } break; } case FRONTEND_QUIT: changeTitleMode(OPTIONS); break; default: break; } if (CancelPressed()) { changeTitleMode(OPTIONS); } widgDisplayScreen(psWScreen); return true; }
/** * Second half of command line parsing. See ParseCommandLineEarly() for * the first half. Note that render mode must come before resolution flag. * \param argc number of arguments given * \param argv string array of the arguments * \return Returns true on success, false on error */ bool ParseCommandLine(int argc, const char **argv) { poptContext poptCon = poptGetContext(nullptr, argc, argv, getOptionsTable(), 0); int iOption; /* loop through command line */ while ((iOption = poptGetNextOpt(poptCon)) > 0) { const char *token; CLI_OPTIONS option = (CLI_OPTIONS)iOption; switch (option) { case CLI_DEBUG: case CLI_DEBUGFILE: case CLI_FLUSHDEBUGSTDERR: case CLI_CONFIGDIR: case CLI_HELP: case CLI_HELP_ALL: case CLI_VERSION: // These options are parsed in ParseCommandLineEarly() already, so ignore them break; case CLI_NOASSERT: kf_NoAssert(); break; // NOTE: The sole purpose of this is to test the crash handler. case CLI_CRASH: CauseCrash = true; NetPlay.bComms = false; sstrcpy(aLevelName, "CAM_3A"); SetGameMode(GS_NORMAL); break; case CLI_DATADIR: // retrieve the quoted path name token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("Unrecognised datadir"); } sstrcpy(datadir, token); break; case CLI_FULLSCREEN: war_setFullscreen(true); break; case CLI_CONNECTTOIP: //get the ip we want to connect with, and go directly to join screen. token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("No IP/hostname given"); } sstrcpy(iptoconnect, token); break; case CLI_HOSTLAUNCH: // go directly to host screen, bypass all others. hostlaunch = 1; break; case CLI_GAME: // retrieve the game name token = poptGetOptArg(poptCon); if (token == nullptr || (strcmp(token, "CAM_1A") && strcmp(token, "CAM_2A") && strcmp(token, "CAM_3A") && strcmp(token, "TUTORIAL3") && strcmp(token, "FASTPLAY"))) { qFatal("The game parameter requires one of the following keywords:" "CAM_1A, CAM_2A, CAM_3A, TUTORIAL3, or FASTPLAY."); } NetPlay.bComms = false; bMultiPlayer = false; bMultiMessages = false; for (int i = 0; i < MAX_PLAYERS; i++) { NET_InitPlayer(i, true, false); } //NET_InitPlayer deallocates Player 0, who must be allocated so that a later invocation of processDebugMappings does not trigger DEBUG mode NetPlay.players[0].allocated = true; if (!strcmp(token, "CAM_1A") || !strcmp(token, "CAM_2A") || !strcmp(token, "CAM_3A")) { game.type = CAMPAIGN; } else { game.type = SKIRMISH; // tutorial is skirmish for some reason } sstrcpy(aLevelName, token); SetGameMode(GS_NORMAL); break; case CLI_MOD_GLOB: { // retrieve the file name token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("Missing mod name?"); } global_mods.push_back(token); break; } case CLI_MOD_CA: { // retrieve the file name token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("Missing mod name?"); } campaign_mods.push_back(token); break; } case CLI_MOD_MP: { // retrieve the file name token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("Missing mod name?"); } multiplay_mods.push_back(token); break; } case CLI_RESOLUTION: { unsigned int width, height; token = poptGetOptArg(poptCon); if (sscanf(token, "%ix%i", &width, &height) != 2) { qFatal("Invalid parameter specified (format is WIDTHxHEIGHT, e.g. 800x600)"); } if (width < 640) { debug(LOG_ERROR, "Screen width < 640 unsupported, using 640"); width = 640; } if (height < 480) { debug(LOG_ERROR, "Screen height < 480 unsupported, using 480"); height = 480; } // tell the display system of the desired resolution pie_SetVideoBufferWidth(width); pie_SetVideoBufferHeight(height); // and update the configuration war_SetWidth(width); war_SetHeight(height); break; } case CLI_LOADSKIRMISH: // retrieve the game name token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("Unrecognised skirmish savegame name"); } snprintf(saveGameName, sizeof(saveGameName), "%s/skirmish/%s.gam", SaveGamePath, token); SPinit(); bMultiPlayer = true; game.type = SKIRMISH; // tutorial is skirmish for some reason SetGameMode(GS_SAVEGAMELOAD); break; case CLI_LOADCAMPAIGN: // retrieve the game name token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("Unrecognised campaign savegame name"); } snprintf(saveGameName, sizeof(saveGameName), "%s/campaign/%s.gam", SaveGamePath, token); SPinit(); SetGameMode(GS_SAVEGAMELOAD); break; case CLI_WINDOW: war_setFullscreen(false); break; case CLI_SHADOWS: setDrawShadows(true); break; case CLI_NOSHADOWS: setDrawShadows(false); break; case CLI_SOUND: war_setSoundEnabled(true); break; case CLI_NOSOUND: war_setSoundEnabled(false); break; case CLI_TEXTURECOMPRESSION: wz_texture_compression = true; break; case CLI_NOTEXTURECOMPRESSION: wz_texture_compression = false; break; case CLI_AUTOGAME: wz_autogame = true; break; case CLI_SAVEANDQUIT: token = poptGetOptArg(poptCon); if (token == nullptr || !strchr(token, '/')) { qFatal("Bad savegame name (needs to be a full path)"); } wz_saveandquit = token; break; case CLI_SKIRMISH: hostlaunch = 2; token = poptGetOptArg(poptCon); if (token == nullptr) { qFatal("Bad test key"); } wz_test = token; break; }; } return true; }
BOOL loadRenderMode(void) { SDWORD val; bool bad_resolution = false; if( !openWarzoneKey() ) { return false; } if (getWarzoneKeyNumeric("FSAA", &val)) { war_setFSAA(val); } else { setWarzoneKeyNumeric("FSAA", war_getFSAA()); } if( getWarzoneKeyNumeric("fullscreen", &val) ) { war_setFullscreen(val); } else { // If no setting is found go to fullscreen by default setWarzoneKeyNumeric("fullscreen", true); war_setFullscreen(true); } if (getWarzoneKeyNumeric("ColouredCursor", &val)) { war_SetColouredCursor(val); } else { #ifdef WZ_OS_MAC // Mac OS X doesn't support normal cursors war_SetColouredCursor(true); setWarzoneKeyNumeric("ColouredCursor", true); #else war_SetColouredCursor(false); setWarzoneKeyNumeric("ColouredCursor", false); #endif } if (getWarzoneKeyNumeric("trapCursor", &val)) { war_SetTrapCursor(val); } else { war_SetTrapCursor(false); } if (getWarzoneKeyNumeric("vsync", &val)) { war_SetVsync(val); } else { war_SetVsync(true); } // now load the desired res.. // note that we only do this if we havent changed renderer.. if (getWarzoneKeyNumeric("width", &val) && val >= 640) { pie_SetVideoBufferWidth(val); war_SetWidth(val); } else { bad_resolution = true; } if (getWarzoneKeyNumeric("height", &val) && val >= 400) { pie_SetVideoBufferHeight(val); war_SetHeight(val); } else { bad_resolution = true; } if (bad_resolution) { // If we have an invalid or incomplete resolution specified // fall back to the defaults. war_SetWidth(0); war_SetHeight(0); } if (getWarzoneKeyNumeric("bpp", &val)) { pie_SetVideoBufferDepth(val); } return closeWarzoneKey(); }