📄 menu.c
字号:
Menu_Draw( &s_keys_menu );
}
static const char *Keys_MenuKey( int key )
{
menuaction_s *item = ( menuaction_s * ) Menu_ItemAtCursor( &s_keys_menu );
if ( bind_grab )
{
if ( key != K_ESCAPE && key != '`' )
{
char cmd[1024];
Com_sprintf (cmd, sizeof(cmd), "bind \"%s\" \"%s\"\n", Key_KeynumToString(key), bindnames[item->generic.localdata[0]][0]);
Cbuf_InsertText (cmd);
}
Menu_SetStatusBar( &s_keys_menu, "enter to change, backspace to clear" );
bind_grab = false;
return menu_out_sound;
}
switch ( key )
{
case K_KP_ENTER:
case K_ENTER:
KeyBindingFunc( item );
return menu_in_sound;
case K_BACKSPACE: // delete bindings
case K_DEL: // delete bindings
case K_KP_DEL:
M_UnbindCommand( bindnames[item->generic.localdata[0]][0] );
return menu_out_sound;
default:
return Default_MenuKey( &s_keys_menu, key );
}
}
void M_Menu_Keys_f (void)
{
Keys_MenuInit();
M_PushMenu( Keys_MenuDraw, Keys_MenuKey );
}
/*
=======================================================================
CONTROLS MENU
=======================================================================
*/
static cvar_t *win_noalttab;
extern cvar_t *in_joystick;
static menuframework_s s_options_menu;
static menuaction_s s_options_defaults_action;
static menuaction_s s_options_customize_options_action;
static menuslider_s s_options_sensitivity_slider;
static menulist_s s_options_freelook_box;
static menulist_s s_options_noalttab_box;
static menulist_s s_options_alwaysrun_box;
static menulist_s s_options_invertmouse_box;
static menulist_s s_options_lookspring_box;
static menulist_s s_options_lookstrafe_box;
static menulist_s s_options_crosshair_box;
static menuslider_s s_options_sfxvolume_slider;
static menulist_s s_options_joystick_box;
static menulist_s s_options_cdvolume_box;
static menulist_s s_options_quality_list;
static menulist_s s_options_compatibility_list;
static menulist_s s_options_console_action;
static void CrosshairFunc( void *unused )
{
Cvar_SetValue( "crosshair", s_options_crosshair_box.curvalue );
}
static void JoystickFunc( void *unused )
{
Cvar_SetValue( "in_joystick", s_options_joystick_box.curvalue );
}
static void CustomizeControlsFunc( void *unused )
{
M_Menu_Keys_f();
}
static void AlwaysRunFunc( void *unused )
{
Cvar_SetValue( "cl_run", s_options_alwaysrun_box.curvalue );
}
static void FreeLookFunc( void *unused )
{
Cvar_SetValue( "freelook", s_options_freelook_box.curvalue );
}
static void MouseSpeedFunc( void *unused )
{
Cvar_SetValue( "sensitivity", s_options_sensitivity_slider.curvalue / 2.0F );
}
static void NoAltTabFunc( void *unused )
{
Cvar_SetValue( "win_noalttab", s_options_noalttab_box.curvalue );
}
static float ClampCvar( float min, float max, float value )
{
if ( value < min ) return min;
if ( value > max ) return max;
return value;
}
static void ControlsSetMenuItemValues( void )
{
s_options_sfxvolume_slider.curvalue = Cvar_VariableValue( "s_volume" ) * 10;
s_options_cdvolume_box.curvalue = !Cvar_VariableValue("cd_nocd");
s_options_quality_list.curvalue = !Cvar_VariableValue( "s_loadas8bit" );
s_options_sensitivity_slider.curvalue = ( sensitivity->value ) * 2;
Cvar_SetValue( "cl_run", ClampCvar( 0, 1, cl_run->value ) );
s_options_alwaysrun_box.curvalue = cl_run->value;
s_options_invertmouse_box.curvalue = m_pitch->value < 0;
Cvar_SetValue( "lookspring", ClampCvar( 0, 1, lookspring->value ) );
s_options_lookspring_box.curvalue = lookspring->value;
Cvar_SetValue( "lookstrafe", ClampCvar( 0, 1, lookstrafe->value ) );
s_options_lookstrafe_box.curvalue = lookstrafe->value;
Cvar_SetValue( "freelook", ClampCvar( 0, 1, freelook->value ) );
s_options_freelook_box.curvalue = freelook->value;
Cvar_SetValue( "crosshair", ClampCvar( 0, 3, crosshair->value ) );
s_options_crosshair_box.curvalue = crosshair->value;
Cvar_SetValue( "in_joystick", ClampCvar( 0, 1, in_joystick->value ) );
s_options_joystick_box.curvalue = in_joystick->value;
s_options_noalttab_box.curvalue = win_noalttab->value;
}
static void ControlsResetDefaultsFunc( void *unused )
{
Cbuf_AddText ("exec default.cfg\n");
Cbuf_Execute();
ControlsSetMenuItemValues();
}
static void InvertMouseFunc( void *unused )
{
Cvar_SetValue( "m_pitch", -m_pitch->value );
}
static void LookspringFunc( void *unused )
{
Cvar_SetValue( "lookspring", !lookspring->value );
}
static void LookstrafeFunc( void *unused )
{
Cvar_SetValue( "lookstrafe", !lookstrafe->value );
}
static void UpdateVolumeFunc( void *unused )
{
Cvar_SetValue( "s_volume", s_options_sfxvolume_slider.curvalue / 10 );
}
static void UpdateCDVolumeFunc( void *unused )
{
Cvar_SetValue( "cd_nocd", !s_options_cdvolume_box.curvalue );
}
static void ConsoleFunc( void *unused )
{
/*
** the proper way to do this is probably to have ToggleConsole_f accept a parameter
*/
extern void Key_ClearTyping( void );
if ( cl.attractloop )
{
Cbuf_AddText ("killserver\n");
return;
}
Key_ClearTyping ();
Con_ClearNotify ();
M_ForceMenuOff ();
cls.key_dest = key_console;
}
static void UpdateSoundQualityFunc( void *unused )
{
if ( s_options_quality_list.curvalue )
{
Cvar_SetValue( "s_khz", 22 );
Cvar_SetValue( "s_loadas8bit", false );
}
else
{
Cvar_SetValue( "s_khz", 11 );
Cvar_SetValue( "s_loadas8bit", true );
}
Cvar_SetValue( "s_primary", s_options_compatibility_list.curvalue );
M_DrawTextBox( 8, 120 - 48, 36, 3 );
M_Print( 16 + 16, 120 - 48 + 8, "Restarting the sound system. This" );
M_Print( 16 + 16, 120 - 48 + 16, "could take up to a minute, so" );
M_Print( 16 + 16, 120 - 48 + 24, "please be patient." );
// the text box won't show up unless we do a buffer swap
re.EndFrame();
CL_Snd_Restart_f();
}
void Options_MenuInit( void )
{
static const char *cd_music_items[] =
{
"disabled",
"enabled",
0
};
static const char *quality_items[] =
{
"low", "high", 0
};
static const char *compatibility_items[] =
{
"max compatibility", "max performance", 0
};
static const char *yesno_names[] =
{
"no",
"yes",
0
};
static const char *crosshair_names[] =
{
"none",
"cross",
"dot",
"angle",
0
};
win_noalttab = Cvar_Get( "win_noalttab", "0", CVAR_ARCHIVE );
/*
** configure controls menu and menu items
*/
s_options_menu.x = viddef.width / 2;
s_options_menu.y = viddef.height / 2 - 58;
s_options_menu.nitems = 0;
s_options_sfxvolume_slider.generic.type = MTYPE_SLIDER;
s_options_sfxvolume_slider.generic.x = 0;
s_options_sfxvolume_slider.generic.y = 0;
s_options_sfxvolume_slider.generic.name = "effects volume";
s_options_sfxvolume_slider.generic.callback = UpdateVolumeFunc;
s_options_sfxvolume_slider.minvalue = 0;
s_options_sfxvolume_slider.maxvalue = 10;
s_options_sfxvolume_slider.curvalue = Cvar_VariableValue( "s_volume" ) * 10;
s_options_cdvolume_box.generic.type = MTYPE_SPINCONTROL;
s_options_cdvolume_box.generic.x = 0;
s_options_cdvolume_box.generic.y = 10;
s_options_cdvolume_box.generic.name = "CD music";
s_options_cdvolume_box.generic.callback = UpdateCDVolumeFunc;
s_options_cdvolume_box.itemnames = cd_music_items;
s_options_cdvolume_box.curvalue = !Cvar_VariableValue("cd_nocd");
s_options_quality_list.generic.type = MTYPE_SPINCONTROL;
s_options_quality_list.generic.x = 0;
s_options_quality_list.generic.y = 20;;
s_options_quality_list.generic.name = "sound quality";
s_options_quality_list.generic.callback = UpdateSoundQualityFunc;
s_options_quality_list.itemnames = quality_items;
s_options_quality_list.curvalue = !Cvar_VariableValue( "s_loadas8bit" );
s_options_compatibility_list.generic.type = MTYPE_SPINCONTROL;
s_options_compatibility_list.generic.x = 0;
s_options_compatibility_list.generic.y = 30;
s_options_compatibility_list.generic.name = "sound compatibility";
s_options_compatibility_list.generic.callback = UpdateSoundQualityFunc;
s_options_compatibility_list.itemnames = compatibility_items;
s_options_compatibility_list.curvalue = Cvar_VariableValue( "s_primary" );
s_options_sensitivity_slider.generic.type = MTYPE_SLIDER;
s_options_sensitivity_slider.generic.x = 0;
s_options_sensitivity_slider.generic.y = 50;
s_options_sensitivity_slider.generic.name = "mouse speed";
s_options_sensitivity_slider.generic.callback = MouseSpeedFunc;
s_options_sensitivity_slider.minvalue = 2;
s_options_sensitivity_slider.maxvalue = 22;
s_options_alwaysrun_box.generic.type = MTYPE_SPINCONTROL;
s_options_alwaysrun_box.generic.x = 0;
s_options_alwaysrun_box.generic.y = 60;
s_options_alwaysrun_box.generic.name = "always run";
s_options_alwaysrun_box.generic.callback = AlwaysRunFunc;
s_options_alwaysrun_box.itemnames = yesno_names;
s_options_invertmouse_box.generic.type = MTYPE_SPINCONTROL;
s_options_invertmouse_box.generic.x = 0;
s_options_invertmouse_box.generic.y = 70;
s_options_invertmouse_box.generic.name = "invert mouse";
s_options_invertmouse_box.generic.callback = InvertMouseFunc;
s_options_invertmouse_box.itemnames = yesno_names;
s_options_lookspring_box.generic.type = MTYPE_SPINCONTROL;
s_options_lookspring_box.generic.x = 0;
s_options_lookspring_box.generic.y = 80;
s_options_lookspring_box.generic.name = "lookspring";
s_options_lookspring_box.generic.callback = LookspringFunc;
s_options_lookspring_box.itemnames = yesno_names;
s_options_lookstrafe_box.generic.type = MTYPE_SPINCONTROL;
s_options_lookstrafe_box.generic.x = 0;
s_options_lookstrafe_box.generic.y = 90;
s_options_lookstrafe_box.generic.name = "lookstrafe";
s_options_lookstrafe_box.generic.callback = LookstrafeFunc;
s_options_lookstrafe_box.itemnames = yesno_names;
s_options_freelook_box.generic.type = MTYPE_SPINCONTROL;
s_options_freelook_box.generic.x = 0;
s_options_freelook_box.generic.y = 100;
s_options_freelook_box.generic.name = "free look";
s_options_freelook_box.generic.callback = FreeLookFunc;
s_options_freelook_box.itemnames = yesno_names;
s_options_crosshair_box.generic.type = MTYPE_SPINCONTROL;
s_options_crosshair_box.generic.x = 0;
s_options_crosshair_box.generic.y = 110;
s_options_crosshair_box.generic.name = "crosshair";
s_options_crosshair_box.generic.callback = CrosshairFunc;
s_options_crosshair_box.itemnames = crosshair_names;
/*
s_options_noalttab_box.generic.type = MTYPE_SPINCONTROL;
s_options_noalttab_box.generic.x = 0;
s_options_noalttab_box.generic.y = 110;
s_options_noalttab_box.generic.name = "disable alt-tab";
s_options_noalttab_box.generic.callback = NoAltTabFunc;
s_options_noalttab_box.itemnames = yesno_names;
*/
s_options_joystick_box.generic.type = MTYPE_SPINCONTROL;
s_options_joystick_box.generic.x = 0;
s_options_joystick_box.generic.y = 120;
s_options_joystick_box.generic.name = "use joystick";
s_options_joystick_box.generic.callback = JoystickFunc;
s_options_joystick_box.itemnames = yesno_names;
s_options_customize_options_action.generic.type = MTYPE_ACTION;
s_options_customize_options_action.generic.x = 0;
s_options_customize_options_action.generic.y = 140;
s_options_customize_options_action.generic.name = "customize controls";
s_options_customize_options_action.generic.callback = CustomizeControlsFunc;
s_options_defaults_action.generic.type = MTYPE_ACTION;
s_options_defaults_action.generic.x = 0;
s_options_defaults_action.generic.y = 150;
s_options_defaults_action.generic.name = "reset defaults";
s_options_defaults_action.generic.callback = ControlsResetDefaultsFunc;
s_options_console_action.generic.type = MTYPE_ACTION;
s_options_console_action.generic.x = 0;
s_options_console_action.generic.y = 160;
s_options_console_action.generic.name = "go to console";
s_options_console_action.generic.callback = ConsoleFunc;
ControlsSetMenuItemValues();
Menu_AddItem( &s_options_menu, ( void * ) &s_options_sfxvolume_slider );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_cdvolume_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_quality_list );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_compatibility_list );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_sensitivity_slider );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_alwaysrun_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_invertmouse_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_lookspring_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_lookstrafe_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_freelook_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_crosshair_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_joystick_box );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_customize_options_action );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_defaults_action );
Menu_AddItem( &s_options_menu, ( void * ) &s_options_console_action );
}
void Options_MenuDraw (void)
{
M_Banner( "m_banner_options" );
Menu_AdjustCursor( &s_options_menu, 1 );
Menu_Draw( &s_options_menu );
}
const char *Options_MenuKey( int key )
{
return Default_MenuKey( &s_options_menu, key );
}
void M_Menu_Options_f (void)
{
Options_MenuInit();
M_PushMenu ( Options_MenuDraw, Options_MenuKey );
}
/*
=======================================================================
VIDEO MENU
=======================================================================
*/
void M_Menu_Video_f (void)
{
VID_MenuInit();
M_PushMenu( VID_MenuDraw, VID_MenuKey );
}
/*
=============================================================================
END GAME MENU
=============================================================================
*/
static int credits_start_time;
static const char **credits;
static char *creditsIndex[256];
static char *creditsBuffer;
static const char *idcredits[] =
{
"+QUAKE II BY ID SOFTWARE",
"",
"+PROGRAMMING",
"John Carmack",
"John Cash",
"Brian Hook",
"",
"+ART",
"Adrian Carmack",
"Kevin Cloud",
"Paul Steed",
"",
"+LEVEL DESIGN",
"Tim Willits",
"American McGee",
"Christian Antkow",
"Paul Jaquays",
"Brandon James",
"",
"+BIZ",
"Todd Hollenshead",
"Barrett (Bear) Alexander",
"Donna Jackson",
"",
"",
"+SPECIAL THANKS",
"Ben Donges for beta testing",
"",
"",
"",
"",
"",
"",
"+ADDITIONAL SUPPORT",
"",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -