void G_ParseCampaigns( void ) { int numdirs; char filename[128]; char dirlist[1024]; char* dirptr; int i; int dirlen; qboolean mapFound = qfalse; level.campaignCount = 0; level.currentCampaign = -1; memset( &g_campaigns, 0, sizeof( g_campaignInfo_t ) * MAX_CAMPAIGNS ); // get all campaigns from .campaign files numdirs = trap_FS_GetFileList( "scripts", ".campaign", dirlist, 1024 ); dirptr = dirlist; for ( i = 0; i < numdirs && level.campaignCount < MAX_CAMPAIGNS; i++, dirptr += dirlen + 1 ) { dirlen = strlen( dirptr ); strcpy( filename, "scripts/" ); strcat( filename, dirptr ); if ( G_LoadCampaignsFromFile( filename ) ) { mapFound = qtrue; } } if ( g_gametype.integer != GT_WOLF_CAMPAIGN ) { trap_Cvar_Set( "g_oldCampaign", "" ); trap_Cvar_Set( "g_currentCampaign", "" ); trap_Cvar_Set( "g_currentCampaignMap", "0" ); } else if ( !mapFound ) { // map isn't found in the current campaign, see if it's the first map in another campaign for ( i = 0; i < level.campaignCount; i++ ) { if ( !Q_stricmp( g_campaigns[i].mapnames[0], level.rawmapname ) ) { // someone manually specified a /map command, and it's the first map in a campaign trap_Cvar_Set( "g_oldCampaign", g_currentCampaign.string ); trap_Cvar_Set( "g_currentCampaign", g_campaigns[i].shortname ); trap_Cvar_Set( "g_currentCampaignMap", "0" ); level.newCampaign = qtrue; g_campaigns[level.campaignCount].current = 0; level.currentCampaign = i; break; } } if ( i == level.campaignCount ) { char buf[MAX_STRING_CHARS]; // fretn if ( trap_Argc() < 1 ) { // command not found, throw error G_Error( "Usage 'map <mapname>\n'" ); } trap_Argv( 0, buf, sizeof( buf ) ); if ( !buf ) { // command not found, throw error G_Error( "Usage 'map <mapname>\n'" ); } // no campaign found, fallback to GT_WOLF // and reload the map trap_Cvar_Set( "g_gametype", "2" ); trap_SendConsoleCommand( EXEC_APPEND, va( "%s %s", buf, level.rawmapname ) ); } } }
void G_ParseCampaigns(void) { int i; qboolean mapFound = qfalse; level.campaignCount = 0; level.currentCampaign = -1; memset(&g_campaigns, 0, sizeof(g_campaignInfo_t) * MAX_CAMPAIGNS); if (g_gametype.integer != GT_WOLF_CAMPAIGN) { trap_Cvar_Set("g_oldCampaign", ""); trap_Cvar_Set("g_currentCampaign", ""); trap_Cvar_Set("g_currentCampaignMap", "0"); return; } if (g_campaignFile.string[0]) { if (G_LoadCampaignsFromFile(g_campaignFile.string)) { mapFound = qtrue; } } if (!mapFound) { // get all campaigns from .campaign files int dirlen; int numdirs = trap_FS_GetFileList("scripts", ".campaign", bigTextBuffer, sizeof(bigTextBuffer)); char filename[MAX_QPATH]; // was 128 char *dirptr = bigTextBuffer; for (i = 0; i < numdirs; i++, dirptr += dirlen + 1) { // log a warning if server has more than MAX_CAMPAIGNS if (level.campaignCount >= MAX_CAMPAIGNS) { G_LogPrintf("WARNING G_ParseCampaigns: number of campaigns larger then MAX_CAMPAIGNS\n"); break; } dirlen = strlen(dirptr); strcpy(filename, "scripts/"); strcat(filename, dirptr); if (G_LoadCampaignsFromFile(filename)) { mapFound = qtrue; } } } if (!mapFound) { // map isn't found in the current campaign, see if it's the first map in another campaign for (i = 0; i < level.campaignCount; i++) { if (!Q_stricmp(g_campaigns[i].mapnames[0], level.rawmapname)) { // someone manually specified a /map command, and it's the first map in a campaign trap_Cvar_Set("g_currentCampaign", g_campaigns[i].shortname); trap_Cvar_Set("g_currentCampaignMap", "0"); level.newCampaign = qtrue; g_campaigns[level.campaignCount].current = 0; level.currentCampaign = i; break; } } if (i == level.campaignCount) { char buf[MAX_STRING_CHARS]; if (trap_Argc() < 1) // command not found, throw error { G_Error("Usage 'map <mapname>\n'"); } trap_Argv(0, buf, sizeof(buf)); if (!(*buf)) // command not found, throw error { G_Error("Usage 'map <mapname>\n'"); } // no campaign found, fallback to GT_WOLF // and reload the map trap_Cvar_Set("g_gametype", "2"); trap_SendConsoleCommand(EXEC_APPEND, va("%s %s\n", buf, level.rawmapname)); } } }