/* =========================================================================== Copyright (C) 1997-2001 Id Software, Inc. This file is part of Quake 2 source code. Quake 2 source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Quake 2 source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Quake 2 source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // ui_dmoptions.c -- DM options menu #include #ifdef _WIN32 #include #endif #include "../client/client.h" #include "ui_local.h" /* ============================================================================= DMOPTIONS BOOK MENU ============================================================================= */ static char dmoptions_statusbar[128]; static menuframework_s s_dmoptions_menu; static menulist_s s_friendlyfire_box; static menulist_s s_falls_box; static menulist_s s_weapons_stay_box; static menulist_s s_instant_powerups_box; static menulist_s s_powerups_box; static menulist_s s_health_box; static menulist_s s_spawn_farthest_box; static menulist_s s_teamplay_box; static menulist_s s_samelevel_box; static menulist_s s_force_respawn_box; static menulist_s s_armor_box; static menulist_s s_allow_exit_box; static menulist_s s_infinite_ammo_box; static menulist_s s_fixed_fov_box; static menulist_s s_quad_drop_box; //Xatrix static menulist_s s_quadfire_drop_box; //ROGUE static menulist_s s_no_mines_box; static menulist_s s_no_nukes_box; static menulist_s s_stack_double_box; static menulist_s s_no_spheres_box; // CTF static menulist_s s_ctf_forceteam_box; static menulist_s s_ctf_armor_protect_box; static menulist_s s_ctf_notechs_box; static menuaction_s s_dmoptions_back_action; extern menulist_s s_rules_box; #define DF_CTF_FORCEJOIN 131072 #define DF_ARMOR_PROTECT 262144 #define DF_CTF_NO_TECH 524288 qboolean CTF_menumode (void) { if ( (FS_RoguePath() && s_rules_box.curvalue >= 3) || (!FS_RoguePath() && s_rules_box.curvalue >= 2) ) return true; return false; } static void DMFlagCallback ( void *self ) { menulist_s *f = ( menulist_s * ) self; int flags; int bit = 0; flags = Cvar_VariableValue( "dmflags" ); if ( f == &s_friendlyfire_box ) { if ( f->curvalue ) flags &= ~DF_NO_FRIENDLY_FIRE; else flags |= DF_NO_FRIENDLY_FIRE; goto setvalue; } else if ( f == &s_falls_box ) { if ( f->curvalue ) flags &= ~DF_NO_FALLING; else flags |= DF_NO_FALLING; goto setvalue; } else if ( f == &s_weapons_stay_box ) { bit = DF_WEAPONS_STAY; } else if ( f == &s_instant_powerups_box ) { bit = DF_INSTANT_ITEMS; } else if ( f == &s_allow_exit_box ) { bit = DF_ALLOW_EXIT; } else if ( f == &s_powerups_box ) { if ( f->curvalue ) flags &= ~DF_NO_ITEMS; else flags |= DF_NO_ITEMS; goto setvalue; } else if ( f == &s_health_box ) { if ( f->curvalue ) flags &= ~DF_NO_HEALTH; else flags |= DF_NO_HEALTH; goto setvalue; } else if ( f == &s_spawn_farthest_box ) { bit = DF_SPAWN_FARTHEST; } else if ( f == &s_teamplay_box ) { if ( f->curvalue == 1 ) { flags |= DF_SKINTEAMS; flags &= ~DF_MODELTEAMS; } else if ( f->curvalue == 2 ) { flags |= DF_MODELTEAMS; flags &= ~DF_SKINTEAMS; } else { flags &= ~( DF_MODELTEAMS | DF_SKINTEAMS ); } goto setvalue; } else if ( f == &s_samelevel_box ) { bit = DF_SAME_LEVEL; } else if ( f == &s_force_respawn_box ) { bit = DF_FORCE_RESPAWN; } else if ( f == &s_armor_box ) { if ( f->curvalue ) flags &= ~DF_NO_ARMOR; else flags |= DF_NO_ARMOR; goto setvalue; } else if ( f == &s_infinite_ammo_box ) { bit = DF_INFINITE_AMMO; } else if ( f == &s_fixed_fov_box ) { bit = DF_FIXED_FOV; } else if ( f == &s_quad_drop_box ) { bit = DF_QUAD_DROP; } // Knightmare added else if (FS_ModType("xatrix")) { if ( f == &s_quadfire_drop_box) { bit = DF_QUADFIRE_DROP; } } //======= //ROGUE else if (FS_RoguePath()) { if ( f == &s_no_mines_box) { bit = DF_NO_MINES; } else if ( f == &s_no_nukes_box) { bit = DF_NO_NUKES; } else if ( f == &s_stack_double_box) { bit = DF_NO_STACK_DOUBLE; } else if ( f == &s_no_spheres_box) { bit = DF_NO_SPHERES; } } //ROGUE //======= // Knightmare added- CTF flags else if ( CTF_menumode() ) { if ( f == &s_ctf_forceteam_box) { bit = DF_CTF_FORCEJOIN; } else if ( f == &s_ctf_armor_protect_box) { bit = DF_ARMOR_PROTECT; } else if ( f == &s_ctf_notechs_box) { bit = DF_CTF_NO_TECH; } } if ( f ) { if ( f->curvalue == 0 ) flags &= ~bit; else flags |= bit; } setvalue: Cvar_SetValue ("dmflags", flags); Com_sprintf( dmoptions_statusbar, sizeof( dmoptions_statusbar ), "dmflags = %d", flags ); } void DMOptions_MenuInit( void ) { static const char *yes_no_names[] = { "no", "yes", 0 }; static const char *teamplay_names[] = { "disabled", "by skin", "by model", 0 }; int dmflags = Cvar_VariableValue( "dmflags" ); int y = 0; s_dmoptions_menu.x = SCREEN_WIDTH*0.5; // s_dmoptions_menu.x = viddef.width * 0.50; s_dmoptions_menu.y = SCREEN_HEIGHT*0.5 - 80; s_dmoptions_menu.nitems = 0; s_falls_box.generic.type = MTYPE_SPINCONTROL; s_falls_box.generic.textSize = MENU_FONT_SIZE; s_falls_box.generic.x = 0; s_falls_box.generic.y = y; // 0 s_falls_box.generic.name = "falling damage"; s_falls_box.generic.callback = DMFlagCallback; s_falls_box.itemnames = yes_no_names; s_falls_box.curvalue = ( dmflags & DF_NO_FALLING ) == 0; s_weapons_stay_box.generic.type = MTYPE_SPINCONTROL; s_weapons_stay_box.generic.textSize = MENU_FONT_SIZE; s_weapons_stay_box.generic.x = 0; s_weapons_stay_box.generic.y = y += MENU_LINE_SIZE; s_weapons_stay_box.generic.name = "weapons stay"; s_weapons_stay_box.generic.callback = DMFlagCallback; s_weapons_stay_box.itemnames = yes_no_names; s_weapons_stay_box.curvalue = ( dmflags & DF_WEAPONS_STAY ) != 0; s_instant_powerups_box.generic.type = MTYPE_SPINCONTROL; s_instant_powerups_box.generic.textSize = MENU_FONT_SIZE; s_instant_powerups_box.generic.x = 0; s_instant_powerups_box.generic.y = y += MENU_LINE_SIZE; s_instant_powerups_box.generic.name = "instant powerups"; s_instant_powerups_box.generic.callback = DMFlagCallback; s_instant_powerups_box.itemnames = yes_no_names; s_instant_powerups_box.curvalue = ( dmflags & DF_INSTANT_ITEMS ) != 0; s_powerups_box.generic.type = MTYPE_SPINCONTROL; s_powerups_box.generic.textSize = MENU_FONT_SIZE; s_powerups_box.generic.x = 0; s_powerups_box.generic.y = y += MENU_LINE_SIZE; s_powerups_box.generic.name = "allow powerups"; s_powerups_box.generic.callback = DMFlagCallback; s_powerups_box.itemnames = yes_no_names; s_powerups_box.curvalue = ( dmflags & DF_NO_ITEMS ) == 0; s_health_box.generic.type = MTYPE_SPINCONTROL; s_health_box.generic.textSize = MENU_FONT_SIZE; s_health_box.generic.x = 0; s_health_box.generic.y = y += MENU_LINE_SIZE; s_health_box.generic.callback = DMFlagCallback; s_health_box.generic.name = "allow health"; s_health_box.itemnames = yes_no_names; s_health_box.curvalue = ( dmflags & DF_NO_HEALTH ) == 0; s_armor_box.generic.type = MTYPE_SPINCONTROL; s_armor_box.generic.textSize = MENU_FONT_SIZE; s_armor_box.generic.x = 0; s_armor_box.generic.y = y += MENU_LINE_SIZE; s_armor_box.generic.name = "allow armor"; s_armor_box.generic.callback = DMFlagCallback; s_armor_box.itemnames = yes_no_names; s_armor_box.curvalue = ( dmflags & DF_NO_ARMOR ) == 0; s_spawn_farthest_box.generic.type = MTYPE_SPINCONTROL; s_spawn_farthest_box.generic.textSize = MENU_FONT_SIZE; s_spawn_farthest_box.generic.x = 0; s_spawn_farthest_box.generic.y = y += MENU_LINE_SIZE; s_spawn_farthest_box.generic.name = "spawn farthest"; s_spawn_farthest_box.generic.callback = DMFlagCallback; s_spawn_farthest_box.itemnames = yes_no_names; s_spawn_farthest_box.curvalue = ( dmflags & DF_SPAWN_FARTHEST ) != 0; s_samelevel_box.generic.type = MTYPE_SPINCONTROL; s_samelevel_box.generic.textSize = MENU_FONT_SIZE; s_samelevel_box.generic.x = 0; s_samelevel_box.generic.y = y += MENU_LINE_SIZE; s_samelevel_box.generic.name = "same map"; s_samelevel_box.generic.callback = DMFlagCallback; s_samelevel_box.itemnames = yes_no_names; s_samelevel_box.curvalue = ( dmflags & DF_SAME_LEVEL ) != 0; s_force_respawn_box.generic.type = MTYPE_SPINCONTROL; s_force_respawn_box.generic.textSize = MENU_FONT_SIZE; s_force_respawn_box.generic.x = 0; s_force_respawn_box.generic.y = y += MENU_LINE_SIZE; s_force_respawn_box.generic.name = "force respawn"; s_force_respawn_box.generic.callback = DMFlagCallback; s_force_respawn_box.itemnames = yes_no_names; s_force_respawn_box.curvalue = ( dmflags & DF_FORCE_RESPAWN ) != 0; s_teamplay_box.generic.type = MTYPE_SPINCONTROL; s_teamplay_box.generic.textSize = MENU_FONT_SIZE; s_teamplay_box.generic.x = 0; s_teamplay_box.generic.y = y += MENU_LINE_SIZE; s_teamplay_box.generic.name = "teamplay"; s_teamplay_box.generic.callback = DMFlagCallback; s_teamplay_box.itemnames = teamplay_names; s_teamplay_box.curvalue = (dmflags & DF_SKINTEAMS) ? 1 : ((dmflags & DF_MODELTEAMS) ? 2 : 0); s_allow_exit_box.generic.type = MTYPE_SPINCONTROL; s_allow_exit_box.generic.textSize = MENU_FONT_SIZE; s_allow_exit_box.generic.x = 0; s_allow_exit_box.generic.y = y += MENU_LINE_SIZE; s_allow_exit_box.generic.name = "allow exit"; s_allow_exit_box.generic.callback = DMFlagCallback; s_allow_exit_box.itemnames = yes_no_names; s_allow_exit_box.curvalue = ( dmflags & DF_ALLOW_EXIT ) != 0; s_infinite_ammo_box.generic.type = MTYPE_SPINCONTROL; s_infinite_ammo_box.generic.textSize = MENU_FONT_SIZE; s_infinite_ammo_box.generic.x = 0; s_infinite_ammo_box.generic.y = y += MENU_LINE_SIZE; s_infinite_ammo_box.generic.name = "infinite ammo"; s_infinite_ammo_box.generic.callback = DMFlagCallback; s_infinite_ammo_box.itemnames = yes_no_names; s_infinite_ammo_box.curvalue = ( dmflags & DF_INFINITE_AMMO ) != 0; s_fixed_fov_box.generic.type = MTYPE_SPINCONTROL; s_fixed_fov_box.generic.textSize = MENU_FONT_SIZE; s_fixed_fov_box.generic.x = 0; s_fixed_fov_box.generic.y = y += MENU_LINE_SIZE; s_fixed_fov_box.generic.name = "fixed FOV"; s_fixed_fov_box.generic.callback = DMFlagCallback; s_fixed_fov_box.itemnames = yes_no_names; s_fixed_fov_box.curvalue = ( dmflags & DF_FIXED_FOV ) != 0; s_quad_drop_box.generic.type = MTYPE_SPINCONTROL; s_quad_drop_box.generic.textSize = MENU_FONT_SIZE; s_quad_drop_box.generic.x = 0; s_quad_drop_box.generic.y = y += MENU_LINE_SIZE; s_quad_drop_box.generic.name = "quad drop"; s_quad_drop_box.generic.callback = DMFlagCallback; s_quad_drop_box.itemnames = yes_no_names; s_quad_drop_box.curvalue = ( dmflags & DF_QUAD_DROP ) != 0; s_friendlyfire_box.generic.type = MTYPE_SPINCONTROL; s_friendlyfire_box.generic.textSize = MENU_FONT_SIZE; s_friendlyfire_box.generic.x = 0; s_friendlyfire_box.generic.y = y += MENU_LINE_SIZE; s_friendlyfire_box.generic.name = "friendly fire"; s_friendlyfire_box.generic.callback = DMFlagCallback; s_friendlyfire_box.itemnames = yes_no_names; s_friendlyfire_box.curvalue = ( dmflags & DF_NO_FRIENDLY_FIRE ) == 0; // Knightmare added if (FS_ModType("xatrix")) { s_quadfire_drop_box.generic.type = MTYPE_SPINCONTROL; s_quadfire_drop_box.generic.textSize = MENU_FONT_SIZE; s_quadfire_drop_box.generic.x = 0; s_quadfire_drop_box.generic.y = y += MENU_LINE_SIZE; s_quadfire_drop_box.generic.name = "dualfire drop"; s_quadfire_drop_box.generic.callback = DMFlagCallback; s_quadfire_drop_box.itemnames = yes_no_names; s_quadfire_drop_box.curvalue = ( dmflags & DF_QUADFIRE_DROP ) != 0; } //============ //ROGUE // Knightmare 12/23/2001 else if (FS_RoguePath()) { s_no_mines_box.generic.type = MTYPE_SPINCONTROL; s_no_mines_box.generic.textSize = MENU_FONT_SIZE; s_no_mines_box.generic.x = 0; s_no_mines_box.generic.y = y += MENU_LINE_SIZE; s_no_mines_box.generic.name = "remove mines"; s_no_mines_box.generic.callback = DMFlagCallback; s_no_mines_box.itemnames = yes_no_names; s_no_mines_box.curvalue = ( dmflags & DF_NO_MINES ) != 0; s_no_nukes_box.generic.type = MTYPE_SPINCONTROL; s_no_nukes_box.generic.textSize = MENU_FONT_SIZE; s_no_nukes_box.generic.x = 0; s_no_nukes_box.generic.y = y += MENU_LINE_SIZE; s_no_nukes_box.generic.name = "remove nukes"; s_no_nukes_box.generic.callback = DMFlagCallback; s_no_nukes_box.itemnames = yes_no_names; s_no_nukes_box.curvalue = ( dmflags & DF_NO_NUKES ) != 0; s_stack_double_box.generic.type = MTYPE_SPINCONTROL; s_stack_double_box.generic.textSize = MENU_FONT_SIZE; s_stack_double_box.generic.x = 0; s_stack_double_box.generic.y = y += MENU_LINE_SIZE; s_stack_double_box.generic.name = "2x/4x stacking off"; s_stack_double_box.generic.callback = DMFlagCallback; s_stack_double_box.itemnames = yes_no_names; s_stack_double_box.curvalue = ( dmflags & DF_NO_STACK_DOUBLE ) != 0; s_no_spheres_box.generic.type = MTYPE_SPINCONTROL; s_no_spheres_box.generic.textSize = MENU_FONT_SIZE; s_no_spheres_box.generic.x = 0; s_no_spheres_box.generic.y = y += MENU_LINE_SIZE; s_no_spheres_box.generic.name = "remove spheres"; s_no_spheres_box.generic.callback = DMFlagCallback; s_no_spheres_box.itemnames = yes_no_names; s_no_spheres_box.curvalue = ( dmflags & DF_NO_SPHERES ) != 0; } //ROGUE //============ // Knightmare added else if (CTF_menumode()) { s_ctf_forceteam_box.generic.type = MTYPE_SPINCONTROL; s_ctf_forceteam_box.generic.textSize = MENU_FONT_SIZE; s_ctf_forceteam_box.generic.x = 0; s_ctf_forceteam_box.generic.y = y += MENU_LINE_SIZE; s_ctf_forceteam_box.generic.name = "force team join"; s_ctf_forceteam_box.generic.callback = DMFlagCallback; s_ctf_forceteam_box.itemnames = yes_no_names; s_ctf_forceteam_box.curvalue = ( dmflags & DF_CTF_FORCEJOIN ) != 0; s_ctf_armor_protect_box.generic.type = MTYPE_SPINCONTROL; s_ctf_armor_protect_box.generic.textSize = MENU_FONT_SIZE; s_ctf_armor_protect_box.generic.x = 0; s_ctf_armor_protect_box.generic.y = y += MENU_LINE_SIZE; s_ctf_armor_protect_box.generic.name = "team armor protect"; s_ctf_armor_protect_box.generic.callback = DMFlagCallback; s_ctf_armor_protect_box.itemnames = yes_no_names; s_ctf_armor_protect_box.curvalue = ( dmflags & DF_ARMOR_PROTECT ) != 0; s_ctf_notechs_box.generic.type = MTYPE_SPINCONTROL; s_ctf_notechs_box.generic.textSize = MENU_FONT_SIZE; s_ctf_notechs_box.generic.x = 0; s_ctf_notechs_box.generic.y = y += MENU_LINE_SIZE; s_ctf_notechs_box.generic.name = "disable techs"; s_ctf_notechs_box.generic.callback = DMFlagCallback; s_ctf_notechs_box.itemnames = yes_no_names; s_ctf_notechs_box.curvalue = ( dmflags & DF_CTF_NO_TECH ) != 0; } s_dmoptions_back_action.generic.type = MTYPE_ACTION; s_dmoptions_back_action.generic.textSize = MENU_FONT_SIZE; s_dmoptions_back_action.generic.flags = QMF_LEFT_JUSTIFY; s_dmoptions_back_action.generic.x = 0; s_dmoptions_back_action.generic.y = y += 3*MENU_LINE_SIZE; s_dmoptions_back_action.generic.name = " back"; s_dmoptions_back_action.generic.callback = UI_BackMenu; Menu_AddItem( &s_dmoptions_menu, &s_falls_box ); Menu_AddItem( &s_dmoptions_menu, &s_weapons_stay_box ); Menu_AddItem( &s_dmoptions_menu, &s_instant_powerups_box ); Menu_AddItem( &s_dmoptions_menu, &s_powerups_box ); Menu_AddItem( &s_dmoptions_menu, &s_health_box ); Menu_AddItem( &s_dmoptions_menu, &s_armor_box ); Menu_AddItem( &s_dmoptions_menu, &s_spawn_farthest_box ); Menu_AddItem( &s_dmoptions_menu, &s_samelevel_box ); Menu_AddItem( &s_dmoptions_menu, &s_force_respawn_box ); Menu_AddItem( &s_dmoptions_menu, &s_teamplay_box ); Menu_AddItem( &s_dmoptions_menu, &s_allow_exit_box ); Menu_AddItem( &s_dmoptions_menu, &s_infinite_ammo_box ); Menu_AddItem( &s_dmoptions_menu, &s_fixed_fov_box ); Menu_AddItem( &s_dmoptions_menu, &s_quad_drop_box ); Menu_AddItem( &s_dmoptions_menu, &s_friendlyfire_box ); // Xatrix if (FS_ModType("xatrix")) Menu_AddItem( &s_dmoptions_menu, &s_quadfire_drop_box ); // Rogue else if (FS_RoguePath()) { Menu_AddItem( &s_dmoptions_menu, &s_no_mines_box ); Menu_AddItem( &s_dmoptions_menu, &s_no_nukes_box ); Menu_AddItem( &s_dmoptions_menu, &s_stack_double_box ); Menu_AddItem( &s_dmoptions_menu, &s_no_spheres_box ); } // CTF else if (CTF_menumode()) { Menu_AddItem( &s_dmoptions_menu, &s_ctf_forceteam_box ); Menu_AddItem( &s_dmoptions_menu, &s_ctf_armor_protect_box ); Menu_AddItem( &s_dmoptions_menu, &s_ctf_notechs_box ); } Menu_AddItem( &s_dmoptions_menu, &s_dmoptions_back_action ); // Menu_Center( &s_dmoptions_menu ); // set the original dmflags statusbar DMFlagCallback( 0 ); Menu_SetStatusBar( &s_dmoptions_menu, dmoptions_statusbar ); } void DMOptions_MenuDraw(void) { Menu_DrawBanner( "m_banner_start_server" ); // added Menu_Draw( &s_dmoptions_menu ); } const char *DMOptions_MenuKey( int key ) { return Default_MenuKey( &s_dmoptions_menu, key ); } void M_Menu_DMOptions_f (void) { DMOptions_MenuInit(); UI_PushMenu( DMOptions_MenuDraw, DMOptions_MenuKey ); }