示例#1
0
void StartServer_MenuInit (void)
{
	static const char *dm_coop_names[] =
	{
		"deathmatch",
		"cooperative",
		0
	};
	char *buffer;
	char *s;
	int length;
	int i;
	float y;

    // initialize list of maps once, reuse it afterwards (=> it isn't freed)
    if (mapnames == NULL)
    {
		// load the list of map names
		if ((length = FS_LoadFile("maps.lst", (void **)&buffer)) == -1)
			Com_Error (ERR_DROP, "couldn't find maps.lst\n");
	
		s = buffer;	
		i = 0;
	
		while (i < length)
		{
			if (s[i] == '\r')
				nummaps++;	
			i++;
		}
	
		if (nummaps == 0)
			Com_Error (ERR_DROP, "no maps in maps.lst\n");	
		mapnames = malloc (sizeof (char *) * (nummaps + 1));
		memset (mapnames, 0, sizeof (char *) * (nummaps + 1));
	
		s = buffer;
	
		for (i = 0; i < nummaps; i++)
		{
			char shortname[MAX_TOKEN_CHARS];
			char longname[MAX_TOKEN_CHARS];
			char scratch[200];
			int	j, l;
	
			strcpy (shortname, COM_Parse (&s));
			l = strlen (shortname);
	
			for (j = 0; j < l; j++)
				shortname[j] = toupper (shortname[j]);
	
			strcpy (longname, COM_Parse (&s));
			Com_sprintf (scratch, sizeof (scratch), "%s\n%s", longname, shortname);
	
			mapnames[i] = malloc (strlen (scratch) + 1);
			strcpy (mapnames[i], scratch);
		}

		// levelshot found table
		if (levelshotvalid)
			free(levelshotvalid);
		levelshotvalid = malloc(sizeof(byte) * (nummaps + 1));
		memset(levelshotvalid, 0, sizeof(byte) * (nummaps + 1));

		// register null levelshot
		if (levelshotvalid[nummaps] == M_UNSET)
		{
			if (RE_Draw_RegisterPic("levelshots/unknownmap.png"))
				levelshotvalid[nummaps] = M_FOUND;
			else
				levelshotvalid[nummaps] = M_MISSING;
		}

		mapnames[nummaps] = 0;

		FS_FreeFile (buffer);
    }

	// initialize the menu stuff
	memset(&s_startserver_menu, 0, sizeof(s_startserver_menu));
	s_startserver_menu.x = (int)(SCREEN_WIDTH * 0.50f) - 140;
	s_startserver_menu.nitems = 0;

	y = 0;
	s_startmap_list.generic.type = MTYPE_SPINCONTROL;
	s_startmap_list.generic.x = 0;
	s_startmap_list.generic.y = y;
	s_startmap_list.generic.name = "initial map";
    s_startmap_list.itemnames = (const char **)mapnames;

	y += 2 * MENU_LINE_SIZE;
	s_rules_box.generic.type = MTYPE_SPINCONTROL;
	s_rules_box.generic.x = 0;
	s_rules_box.generic.y = y;
	s_rules_box.generic.name = "rules";
	s_rules_box.itemnames = dm_coop_names;
	if (Cvar_VariableValue ("coop"))
		s_rules_box.curvalue = 1;
	else
		s_rules_box.curvalue = 0;
	s_rules_box.generic.callback = RulesChangeFunc;

	y += 2 * MENU_LINE_SIZE;
	s_timelimit_field.generic.type = MTYPE_FIELD;
	s_timelimit_field.generic.name = "time limit";
	s_timelimit_field.generic.flags = QMF_NUMBERSONLY;
	s_timelimit_field.generic.x	= 0;
	s_timelimit_field.generic.y	= y;
	s_timelimit_field.generic.statusbar = "0 = no limit";
	s_timelimit_field.length = 4;
	s_timelimit_field.visible_length = 4;
	strcpy (s_timelimit_field.buffer, Cvar_VariableString ("timelimit"));
	s_timelimit_field.cursor = strlen(s_timelimit_field.buffer);

	y += 2 * MENU_LINE_SIZE;
	s_fraglimit_field.generic.type = MTYPE_FIELD;
	s_fraglimit_field.generic.name = "frag limit";
	s_fraglimit_field.generic.flags = QMF_NUMBERSONLY;
	s_fraglimit_field.generic.x	= 0;
	s_fraglimit_field.generic.y	= y;
	s_fraglimit_field.generic.statusbar = "0 = no limit";
	s_fraglimit_field.length = 4;
	s_fraglimit_field.visible_length = 4;
	strcpy (s_fraglimit_field.buffer, Cvar_VariableString ("fraglimit"));
	s_fraglimit_field.cursor = strlen(s_fraglimit_field.buffer);

	// maxclients determines the maximum number of players that can join
	// the game. If maxclients is only "1" then we should default the menu
	// option to 8 players, otherwise use whatever its current value is.
	// Clamping will be done when the server is actually started.
	y += 2 * MENU_LINE_SIZE;
	s_maxclients_field.generic.type = MTYPE_FIELD;
	s_maxclients_field.generic.name = "max players";
	s_maxclients_field.generic.flags = QMF_NUMBERSONLY;
	s_maxclients_field.generic.x = 0;
	s_maxclients_field.generic.y = y;
	s_maxclients_field.generic.statusbar = NULL;
	s_maxclients_field.length = 3;
	s_maxclients_field.visible_length = 3;
	if (Cvar_VariableValue ("maxclients") == 1)
		strcpy (s_maxclients_field.buffer, "8");
	else
		strcpy (s_maxclients_field.buffer, Cvar_VariableString ("maxclients"));
	s_maxclients_field.cursor = strlen(s_maxclients_field.buffer);

	y += 2 * MENU_LINE_SIZE;
	s_hostname_field.generic.type = MTYPE_FIELD;
	s_hostname_field.generic.name = "hostname";
	s_hostname_field.generic.x = 0;
	s_hostname_field.generic.y = y;
	s_hostname_field.generic.statusbar = NULL;
	s_hostname_field.length = 12;
	s_hostname_field.visible_length = 12;
	strcpy (s_hostname_field.buffer, Cvar_VariableString ("hostname"));
	s_hostname_field.cursor = strlen(s_hostname_field.buffer);

	y += 2 * MENU_LINE_SIZE;
	s_startserver_dmoptions_action.generic.type = MTYPE_ACTION;
	s_startserver_dmoptions_action.generic.name	= S_COLOR_BLUE " deathmatch flags";
	s_startserver_dmoptions_action.generic.flags = QMF_LEFT_JUSTIFY;
	s_startserver_dmoptions_action.generic.x = 0;
	s_startserver_dmoptions_action.generic.y = y;
	s_startserver_dmoptions_action.generic.statusbar = NULL;
	s_startserver_dmoptions_action.generic.callback = DMOptionsFunc;

	y += 3 * MENU_LINE_SIZE;
	s_startserver_start_action.generic.type = MTYPE_ACTION;
	s_startserver_start_action.generic.name	= S_COLOR_BLUE " begin";
	s_startserver_start_action.generic.flags = QMF_LEFT_JUSTIFY;
	s_startserver_start_action.generic.x = 0;
	s_startserver_start_action.generic.y = y;
	s_startserver_start_action.generic.callback = StartServerActionFunc;

	s_startserver_menu.draw = StartServer_MenuDraw;
	s_startserver_menu.key = NULL;

	Menu_AddItem (&s_startserver_menu, &s_startmap_list);
	Menu_AddItem (&s_startserver_menu, &s_rules_box);
	Menu_AddItem (&s_startserver_menu, &s_timelimit_field);
	Menu_AddItem (&s_startserver_menu, &s_fraglimit_field);
	Menu_AddItem (&s_startserver_menu, &s_maxclients_field);
	Menu_AddItem (&s_startserver_menu, &s_hostname_field);
	Menu_AddItem (&s_startserver_menu, &s_startserver_dmoptions_action);
	Menu_AddItem (&s_startserver_menu, &s_startserver_start_action);

	Menu_Center (&s_startserver_menu);

	// call this now to set proper inital state
	RulesChangeFunc (NULL);
}
示例#2
0
void StartServer_MenuInit( void )
{
	static const char *dm_coop_names[] =
	{
		"deathmatch",
		"cooperative",
		0
	};
//=======
//PGM
	static const char *dm_coop_names_rogue[] =
	{
		"deathmatch",
		"cooperative",
		"tag",
//		"deathball",
		0
	};

	int x = 0, y = 0;

	memset(&s_startserver_menu, 0, sizeof(s_startserver_menu));
	// initialize the menu stuff
	//s_startserver_menu.x = viddef.width * 0.50;
	s_startserver_menu.x = 0;
	s_startserver_menu.y = 0;
	s_startserver_menu.nitems = 0;

	/*s_startmap_list.generic.type = MTYPE_SPINCONTROL;
	s_startmap_list.generic.x	= 0;
	s_startmap_list.generic.y	= 0;
	s_startmap_list.generic.name	= "initial map";
	s_startmap_list.itemnames = (const char **)mapnames;*/

	maplist.generic.type		= MTYPE_LIST;
	maplist.generic.flags		= QMF_LEFT_JUSTIFY;
	maplist.generic.name		= NULL;
	maplist.generic.callback	= NULL;
	maplist.generic.x			= 20;
	maplist.generic.y			= 30;
	//maplist.width				= viddef.width - 40;
	maplist.width				= (viddef.width - 40) / 2;
	maplist.height				= viddef.height - 110;
	MenuList_Init(&maplist);

	x = maplist.width + 20 + ((viddef.width - maplist.width - 20)/ 2);
	y = 30;

	Build_MapList();

	s_rules_box.generic.type = MTYPE_SPINCONTROL;
	s_rules_box.generic.flags	= QMF_LEFT_JUSTIFY;
	s_rules_box.generic.cursor_offset = 24;
	s_rules_box.generic.x	= x;
	s_rules_box.generic.y	= y+20;
	s_rules_box.generic.name	= "rules";
	
//PGM - rogue games only available with rogue DLL.
	if(Developer_searchpath() == 2)
		s_rules_box.itemnames = dm_coop_names_rogue;
	else
		s_rules_box.itemnames = dm_coop_names;
//PGM

	if (Cvar_VariableIntValue("coop"))
		s_rules_box.curvalue = 1;
	else
		s_rules_box.curvalue = 0;
	s_rules_box.generic.callback = RulesChangeFunc;

	s_timelimit_field.generic.type = MTYPE_FIELD;
	s_timelimit_field.generic.name = "time limit";
	s_timelimit_field.generic.flags = QMF_NUMBERSONLY;
	s_timelimit_field.generic.x	= x;
	s_timelimit_field.generic.y	= y+36;
	s_timelimit_field.generic.statusbar = "0 = no limit";
	s_timelimit_field.length = 3;
	s_timelimit_field.visible_length = 3;
	strcpy( s_timelimit_field.buffer, Cvar_VariableString("timelimit") );

	s_fraglimit_field.generic.type = MTYPE_FIELD;
	s_fraglimit_field.generic.name = "frag limit";
	s_fraglimit_field.generic.flags = QMF_NUMBERSONLY;
	s_fraglimit_field.generic.x	= x;
	s_fraglimit_field.generic.y	= y+54;
	s_fraglimit_field.generic.statusbar = "0 = no limit";
	s_fraglimit_field.length = 3;
	s_fraglimit_field.visible_length = 3;
	strcpy( s_fraglimit_field.buffer, Cvar_VariableString("fraglimit") );

	/*
	** maxclients determines the maximum number of players that can join
	** the game.  If maxclients is only "1" then we should default the menu
	** option to 8 players, otherwise use whatever its current value is. 
	** Clamping will be done when the server is actually started.
	*/
	s_maxclients_field.generic.type = MTYPE_FIELD;
	s_maxclients_field.generic.name = "max players";
	s_maxclients_field.generic.flags = QMF_NUMBERSONLY;
	s_maxclients_field.generic.x	= x;
	s_maxclients_field.generic.y	= y+72;
	s_maxclients_field.generic.statusbar = NULL;
	s_maxclients_field.length = 3;
	s_maxclients_field.visible_length = 3;
	if (Cvar_VariableIntValue( "maxclients" ) == 1)
		strcpy( s_maxclients_field.buffer, "8" );
	else 
		strcpy( s_maxclients_field.buffer, Cvar_VariableString("maxclients") );

	s_hostname_field.generic.type = MTYPE_FIELD;
	s_hostname_field.generic.name = "hostname";
	s_hostname_field.generic.flags = 0;
	s_hostname_field.generic.x	= x;
	s_hostname_field.generic.y	= y+90;
	s_hostname_field.generic.statusbar = NULL;
	s_hostname_field.length = 12;
	s_hostname_field.visible_length = 12;
	strcpy( s_hostname_field.buffer, Cvar_VariableString("hostname") );

	s_startserver_dmoptions_action.generic.type = MTYPE_ACTION;
	s_startserver_dmoptions_action.generic.name	= " deathmatch flags";
	s_startserver_dmoptions_action.generic.flags= QMF_LEFT_JUSTIFY;
	s_startserver_dmoptions_action.generic.x	= x+24;
	s_startserver_dmoptions_action.generic.y	= y+108;
	s_startserver_dmoptions_action.generic.statusbar = NULL;
	s_startserver_dmoptions_action.generic.callback = DMOptionsFunc;

	s_startserver_start_action.generic.type = MTYPE_ACTION;
	s_startserver_start_action.generic.name	= " begin";
	s_startserver_start_action.generic.flags= QMF_LEFT_JUSTIFY;
	s_startserver_start_action.generic.x	= x+24;
	s_startserver_start_action.generic.y	= y+128;
	s_startserver_start_action.generic.callback = StartServerActionFunc;

	s_startserver_menu.draw = NULL;
	s_startserver_menu.key = StartServer_MenuKey;

//	Menu_AddItem( &s_startserver_menu, &s_startmap_list );
	Menu_AddItem( &s_startserver_menu, &maplist );
	Menu_AddItem( &s_startserver_menu, &s_rules_box );
	Menu_AddItem( &s_startserver_menu, &s_timelimit_field );
	Menu_AddItem( &s_startserver_menu, &s_fraglimit_field );
	Menu_AddItem( &s_startserver_menu, &s_maxclients_field );
	Menu_AddItem( &s_startserver_menu, &s_hostname_field );
	Menu_AddItem( &s_startserver_menu, &s_startserver_dmoptions_action );
	Menu_AddItem( &s_startserver_menu, &s_startserver_start_action );

	//Menu_Center( &s_startserver_menu );

	// call this now to set proper inital state
	RulesChangeFunc ( NULL );
}