VOID MO_once(void) { i4 state; if( MO_classes == NULL ) { /* tricky recursion problem here -- i_sem wants to do an attach, but we aren't ready. This means no monitoring of MO_sem, sigh. FIXME. */ state = MO_disabled; MO_disabled = MO_DISABLE; (VOID) MUi_semaphore( &MO_sem ); MUn_semaphore( &MO_sem, "MO" ); MO_semcnt = 0; MO_disabled = (state) ? TRUE : FALSE; (VOID) MO_mutex(); MUn_semaphore( &MO_sem, "MO" ); MO_classes = SPinit( &MOclass_tree, STcompare ); MO_instances = SPinit( &MOinstance_tree, MO_instance_compare ); MO_strings = SPinit( &MOstring_tree, STcompare ); MO_monitors = SPinit( &MOmonitor_tree, MO_mon_compare ); (VOID) MO_unmutex(); /* MO classes */ (void) MOclassdef( MAXI2, MO_cdefs ); (void) MOclassdef( MAXI2, MO_mem_classes ); (void) MOclassdef( MAXI2, MO_meta_classes ); (void) MOclassdef( MAXI2, MO_mon_classes ); (void) MOclassdef( MAXI2, MO_str_classes ); (void) MOclassdef( MAXI4, MO_tree_classes ); /* tables */ MO_classes->name = "mo_classes"; MO_instances->name = "mo_instances"; MO_strings->name = "mo_strings"; MO_monitors->name = "mo_monitors"; (void) MOsptree_attach( MO_classes ); (void) MOsptree_attach( MO_instances ); (void) MOsptree_attach( MO_strings ); (void) MOsptree_attach( MO_monitors ); } }
bool runSinglePlayerMenu(void) { UDWORD id; if(bLoadSaveUp) { if(runLoadSave(false))// check for file name. { loadOK(); } } else if (challengesUp) { runChallenges(); } else { id = widgRunScreen(psWScreen); // Run the current set of widgets switch(id) { case FRONTEND_NEWGAME: SPinit(); frontEndNewGame(); break; case FRONTEND_LOADCAM2: SPinit(); sstrcpy(aLevelName, "CAM_2A"); changeTitleMode(STARTGAME); initLoadingScreen(true); break; case FRONTEND_LOADCAM3: SPinit(); sstrcpy(aLevelName, "CAM_3A"); changeTitleMode(STARTGAME); initLoadingScreen(true); break; case FRONTEND_LOADGAME: SPinit(); addLoadSave(LOAD_FRONTEND, _("Load Saved Game")); // change mode when loadsave returns break; case FRONTEND_SKIRMISH: SPinit(); ingame.bHostSetup = true; lastTitleMode = SINGLE; changeTitleMode(MULTIOPTION); break; case FRONTEND_QUIT: changeTitleMode(TITLE); break; case FRONTEND_CHALLENGES: SPinit(); addChallenges(); break; default: break; } if(CancelPressed()) { changeTitleMode(TITLE); } } if (!bLoadSaveUp && !challengesUp) // if save/load screen is up { widgDisplayScreen(psWScreen); // show the widgets currently running } if (bLoadSaveUp) // if save/load screen is up { displayLoadSave(); } else if (challengesUp) { displayChallenges(); } 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; }