📄 menu.c
字号:
}
return NULL;
}
void M_Menu_Main_f (void)
{
M_PushMenu (M_Main_Draw, M_Main_Key);
}
/*
=======================================================================
MULTIPLAYER MENU
=======================================================================
*/
static menuframework_s s_multiplayer_menu;
static menuaction_s s_join_network_server_action;
static menuaction_s s_start_network_server_action;
static menuaction_s s_player_setup_action;
static void Multiplayer_MenuDraw (void)
{
M_Banner( "m_banner_multiplayer" );
Menu_AdjustCursor( &s_multiplayer_menu, 1 );
Menu_Draw( &s_multiplayer_menu );
}
static void PlayerSetupFunc( void *unused )
{
M_Menu_PlayerConfig_f();
}
static void JoinNetworkServerFunc( void *unused )
{
M_Menu_JoinServer_f();
}
static void StartNetworkServerFunc( void *unused )
{
M_Menu_StartServer_f ();
}
void Multiplayer_MenuInit( void )
{
s_multiplayer_menu.x = viddef.width * 0.50 - 64;
s_multiplayer_menu.nitems = 0;
s_join_network_server_action.generic.type = MTYPE_ACTION;
s_join_network_server_action.generic.flags = QMF_LEFT_JUSTIFY;
s_join_network_server_action.generic.x = 0;
s_join_network_server_action.generic.y = 0;
s_join_network_server_action.generic.name = " join network server";
s_join_network_server_action.generic.callback = JoinNetworkServerFunc;
s_start_network_server_action.generic.type = MTYPE_ACTION;
s_start_network_server_action.generic.flags = QMF_LEFT_JUSTIFY;
s_start_network_server_action.generic.x = 0;
s_start_network_server_action.generic.y = 10;
s_start_network_server_action.generic.name = " start network server";
s_start_network_server_action.generic.callback = StartNetworkServerFunc;
s_player_setup_action.generic.type = MTYPE_ACTION;
s_player_setup_action.generic.flags = QMF_LEFT_JUSTIFY;
s_player_setup_action.generic.x = 0;
s_player_setup_action.generic.y = 20;
s_player_setup_action.generic.name = " player setup";
s_player_setup_action.generic.callback = PlayerSetupFunc;
Menu_AddItem( &s_multiplayer_menu, ( void * ) &s_join_network_server_action );
Menu_AddItem( &s_multiplayer_menu, ( void * ) &s_start_network_server_action );
Menu_AddItem( &s_multiplayer_menu, ( void * ) &s_player_setup_action );
Menu_SetStatusBar( &s_multiplayer_menu, NULL );
Menu_Center( &s_multiplayer_menu );
}
const char *Multiplayer_MenuKey( int key )
{
return Default_MenuKey( &s_multiplayer_menu, key );
}
void M_Menu_Multiplayer_f( void )
{
Multiplayer_MenuInit();
M_PushMenu( Multiplayer_MenuDraw, Multiplayer_MenuKey );
}
/*
=======================================================================
KEYS MENU
=======================================================================
*/
char *bindnames[][2] =
{
{"+attack", "attack"},
{"weapnext", "next weapon"},
{"+forward", "walk forward"},
{"+back", "backpedal"},
{"+left", "turn left"},
{"+right", "turn right"},
{"+speed", "run"},
{"+moveleft", "step left"},
{"+moveright", "step right"},
{"+strafe", "sidestep"},
{"+lookup", "look up"},
{"+lookdown", "look down"},
{"centerview", "center view"},
{"+mlook", "mouse look"},
{"+klook", "keyboard look"},
{"+moveup", "up / jump"},
{"+movedown", "down / crouch"},
{"inven", "inventory"},
{"invuse", "use item"},
{"invdrop", "drop item"},
{"invprev", "prev item"},
{"invnext", "next item"},
{"cmd help", "help computer" },
{ 0, 0 }
};
int keys_cursor;
static int bind_grab;
static menuframework_s s_keys_menu;
static menuaction_s s_keys_attack_action;
static menuaction_s s_keys_change_weapon_action;
static menuaction_s s_keys_walk_forward_action;
static menuaction_s s_keys_backpedal_action;
static menuaction_s s_keys_turn_left_action;
static menuaction_s s_keys_turn_right_action;
static menuaction_s s_keys_run_action;
static menuaction_s s_keys_step_left_action;
static menuaction_s s_keys_step_right_action;
static menuaction_s s_keys_sidestep_action;
static menuaction_s s_keys_look_up_action;
static menuaction_s s_keys_look_down_action;
static menuaction_s s_keys_center_view_action;
static menuaction_s s_keys_mouse_look_action;
static menuaction_s s_keys_keyboard_look_action;
static menuaction_s s_keys_move_up_action;
static menuaction_s s_keys_move_down_action;
static menuaction_s s_keys_inventory_action;
static menuaction_s s_keys_inv_use_action;
static menuaction_s s_keys_inv_drop_action;
static menuaction_s s_keys_inv_prev_action;
static menuaction_s s_keys_inv_next_action;
static menuaction_s s_keys_help_computer_action;
static void M_UnbindCommand (char *command)
{
int j;
int l;
char *b;
l = strlen(command);
for (j=0 ; j<256 ; j++)
{
b = keybindings[j];
if (!b)
continue;
if (!strncmp (b, command, l) )
Key_SetBinding (j, "");
}
}
static void M_FindKeysForCommand (char *command, int *twokeys)
{
int count;
int j;
int l;
char *b;
twokeys[0] = twokeys[1] = -1;
l = strlen(command);
count = 0;
for (j=0 ; j<256 ; j++)
{
b = keybindings[j];
if (!b)
continue;
if (!strncmp (b, command, l) )
{
twokeys[count] = j;
count++;
if (count == 2)
break;
}
}
}
static void KeyCursorDrawFunc( menuframework_s *menu )
{
if ( bind_grab )
re.DrawChar( menu->x, menu->y + menu->cursor * 9, '=' );
else
re.DrawChar( menu->x, menu->y + menu->cursor * 9, 12 + ( ( int ) ( Sys_Milliseconds() / 250 ) & 1 ) );
}
static void DrawKeyBindingFunc( void *self )
{
int keys[2];
menuaction_s *a = ( menuaction_s * ) self;
M_FindKeysForCommand( bindnames[a->generic.localdata[0]][0], keys);
if (keys[0] == -1)
{
Menu_DrawString( a->generic.x + a->generic.parent->x + 16, a->generic.y + a->generic.parent->y, "???" );
}
else
{
int x;
const char *name;
name = Key_KeynumToString (keys[0]);
Menu_DrawString( a->generic.x + a->generic.parent->x + 16, a->generic.y + a->generic.parent->y, name );
x = strlen(name) * 8;
if (keys[1] != -1)
{
Menu_DrawString( a->generic.x + a->generic.parent->x + 24 + x, a->generic.y + a->generic.parent->y, "or" );
Menu_DrawString( a->generic.x + a->generic.parent->x + 48 + x, a->generic.y + a->generic.parent->y, Key_KeynumToString (keys[1]) );
}
}
}
static void KeyBindingFunc( void *self )
{
menuaction_s *a = ( menuaction_s * ) self;
int keys[2];
M_FindKeysForCommand( bindnames[a->generic.localdata[0]][0], keys );
if (keys[1] != -1)
M_UnbindCommand( bindnames[a->generic.localdata[0]][0]);
bind_grab = true;
Menu_SetStatusBar( &s_keys_menu, "press a key or button for this action" );
}
static void Keys_MenuInit( void )
{
int y = 0;
int i = 0;
s_keys_menu.x = viddef.width * 0.50;
s_keys_menu.nitems = 0;
s_keys_menu.cursordraw = KeyCursorDrawFunc;
s_keys_attack_action.generic.type = MTYPE_ACTION;
s_keys_attack_action.generic.flags = QMF_GRAYED;
s_keys_attack_action.generic.x = 0;
s_keys_attack_action.generic.y = y;
s_keys_attack_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_attack_action.generic.localdata[0] = i;
s_keys_attack_action.generic.name = bindnames[s_keys_attack_action.generic.localdata[0]][1];
s_keys_change_weapon_action.generic.type = MTYPE_ACTION;
s_keys_change_weapon_action.generic.flags = QMF_GRAYED;
s_keys_change_weapon_action.generic.x = 0;
s_keys_change_weapon_action.generic.y = y += 9;
s_keys_change_weapon_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_change_weapon_action.generic.localdata[0] = ++i;
s_keys_change_weapon_action.generic.name = bindnames[s_keys_change_weapon_action.generic.localdata[0]][1];
s_keys_walk_forward_action.generic.type = MTYPE_ACTION;
s_keys_walk_forward_action.generic.flags = QMF_GRAYED;
s_keys_walk_forward_action.generic.x = 0;
s_keys_walk_forward_action.generic.y = y += 9;
s_keys_walk_forward_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_walk_forward_action.generic.localdata[0] = ++i;
s_keys_walk_forward_action.generic.name = bindnames[s_keys_walk_forward_action.generic.localdata[0]][1];
s_keys_backpedal_action.generic.type = MTYPE_ACTION;
s_keys_backpedal_action.generic.flags = QMF_GRAYED;
s_keys_backpedal_action.generic.x = 0;
s_keys_backpedal_action.generic.y = y += 9;
s_keys_backpedal_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_backpedal_action.generic.localdata[0] = ++i;
s_keys_backpedal_action.generic.name = bindnames[s_keys_backpedal_action.generic.localdata[0]][1];
s_keys_turn_left_action.generic.type = MTYPE_ACTION;
s_keys_turn_left_action.generic.flags = QMF_GRAYED;
s_keys_turn_left_action.generic.x = 0;
s_keys_turn_left_action.generic.y = y += 9;
s_keys_turn_left_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_turn_left_action.generic.localdata[0] = ++i;
s_keys_turn_left_action.generic.name = bindnames[s_keys_turn_left_action.generic.localdata[0]][1];
s_keys_turn_right_action.generic.type = MTYPE_ACTION;
s_keys_turn_right_action.generic.flags = QMF_GRAYED;
s_keys_turn_right_action.generic.x = 0;
s_keys_turn_right_action.generic.y = y += 9;
s_keys_turn_right_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_turn_right_action.generic.localdata[0] = ++i;
s_keys_turn_right_action.generic.name = bindnames[s_keys_turn_right_action.generic.localdata[0]][1];
s_keys_run_action.generic.type = MTYPE_ACTION;
s_keys_run_action.generic.flags = QMF_GRAYED;
s_keys_run_action.generic.x = 0;
s_keys_run_action.generic.y = y += 9;
s_keys_run_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_run_action.generic.localdata[0] = ++i;
s_keys_run_action.generic.name = bindnames[s_keys_run_action.generic.localdata[0]][1];
s_keys_step_left_action.generic.type = MTYPE_ACTION;
s_keys_step_left_action.generic.flags = QMF_GRAYED;
s_keys_step_left_action.generic.x = 0;
s_keys_step_left_action.generic.y = y += 9;
s_keys_step_left_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_step_left_action.generic.localdata[0] = ++i;
s_keys_step_left_action.generic.name = bindnames[s_keys_step_left_action.generic.localdata[0]][1];
s_keys_step_right_action.generic.type = MTYPE_ACTION;
s_keys_step_right_action.generic.flags = QMF_GRAYED;
s_keys_step_right_action.generic.x = 0;
s_keys_step_right_action.generic.y = y += 9;
s_keys_step_right_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_step_right_action.generic.localdata[0] = ++i;
s_keys_step_right_action.generic.name = bindnames[s_keys_step_right_action.generic.localdata[0]][1];
s_keys_sidestep_action.generic.type = MTYPE_ACTION;
s_keys_sidestep_action.generic.flags = QMF_GRAYED;
s_keys_sidestep_action.generic.x = 0;
s_keys_sidestep_action.generic.y = y += 9;
s_keys_sidestep_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_sidestep_action.generic.localdata[0] = ++i;
s_keys_sidestep_action.generic.name = bindnames[s_keys_sidestep_action.generic.localdata[0]][1];
s_keys_look_up_action.generic.type = MTYPE_ACTION;
s_keys_look_up_action.generic.flags = QMF_GRAYED;
s_keys_look_up_action.generic.x = 0;
s_keys_look_up_action.generic.y = y += 9;
s_keys_look_up_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_look_up_action.generic.localdata[0] = ++i;
s_keys_look_up_action.generic.name = bindnames[s_keys_look_up_action.generic.localdata[0]][1];
s_keys_look_down_action.generic.type = MTYPE_ACTION;
s_keys_look_down_action.generic.flags = QMF_GRAYED;
s_keys_look_down_action.generic.x = 0;
s_keys_look_down_action.generic.y = y += 9;
s_keys_look_down_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_look_down_action.generic.localdata[0] = ++i;
s_keys_look_down_action.generic.name = bindnames[s_keys_look_down_action.generic.localdata[0]][1];
s_keys_center_view_action.generic.type = MTYPE_ACTION;
s_keys_center_view_action.generic.flags = QMF_GRAYED;
s_keys_center_view_action.generic.x = 0;
s_keys_center_view_action.generic.y = y += 9;
s_keys_center_view_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_center_view_action.generic.localdata[0] = ++i;
s_keys_center_view_action.generic.name = bindnames[s_keys_center_view_action.generic.localdata[0]][1];
s_keys_mouse_look_action.generic.type = MTYPE_ACTION;
s_keys_mouse_look_action.generic.flags = QMF_GRAYED;
s_keys_mouse_look_action.generic.x = 0;
s_keys_mouse_look_action.generic.y = y += 9;
s_keys_mouse_look_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_mouse_look_action.generic.localdata[0] = ++i;
s_keys_mouse_look_action.generic.name = bindnames[s_keys_mouse_look_action.generic.localdata[0]][1];
s_keys_keyboard_look_action.generic.type = MTYPE_ACTION;
s_keys_keyboard_look_action.generic.flags = QMF_GRAYED;
s_keys_keyboard_look_action.generic.x = 0;
s_keys_keyboard_look_action.generic.y = y += 9;
s_keys_keyboard_look_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_keyboard_look_action.generic.localdata[0] = ++i;
s_keys_keyboard_look_action.generic.name = bindnames[s_keys_keyboard_look_action.generic.localdata[0]][1];
s_keys_move_up_action.generic.type = MTYPE_ACTION;
s_keys_move_up_action.generic.flags = QMF_GRAYED;
s_keys_move_up_action.generic.x = 0;
s_keys_move_up_action.generic.y = y += 9;
s_keys_move_up_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_move_up_action.generic.localdata[0] = ++i;
s_keys_move_up_action.generic.name = bindnames[s_keys_move_up_action.generic.localdata[0]][1];
s_keys_move_down_action.generic.type = MTYPE_ACTION;
s_keys_move_down_action.generic.flags = QMF_GRAYED;
s_keys_move_down_action.generic.x = 0;
s_keys_move_down_action.generic.y = y += 9;
s_keys_move_down_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_move_down_action.generic.localdata[0] = ++i;
s_keys_move_down_action.generic.name = bindnames[s_keys_move_down_action.generic.localdata[0]][1];
s_keys_inventory_action.generic.type = MTYPE_ACTION;
s_keys_inventory_action.generic.flags = QMF_GRAYED;
s_keys_inventory_action.generic.x = 0;
s_keys_inventory_action.generic.y = y += 9;
s_keys_inventory_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_inventory_action.generic.localdata[0] = ++i;
s_keys_inventory_action.generic.name = bindnames[s_keys_inventory_action.generic.localdata[0]][1];
s_keys_inv_use_action.generic.type = MTYPE_ACTION;
s_keys_inv_use_action.generic.flags = QMF_GRAYED;
s_keys_inv_use_action.generic.x = 0;
s_keys_inv_use_action.generic.y = y += 9;
s_keys_inv_use_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_inv_use_action.generic.localdata[0] = ++i;
s_keys_inv_use_action.generic.name = bindnames[s_keys_inv_use_action.generic.localdata[0]][1];
s_keys_inv_drop_action.generic.type = MTYPE_ACTION;
s_keys_inv_drop_action.generic.flags = QMF_GRAYED;
s_keys_inv_drop_action.generic.x = 0;
s_keys_inv_drop_action.generic.y = y += 9;
s_keys_inv_drop_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_inv_drop_action.generic.localdata[0] = ++i;
s_keys_inv_drop_action.generic.name = bindnames[s_keys_inv_drop_action.generic.localdata[0]][1];
s_keys_inv_prev_action.generic.type = MTYPE_ACTION;
s_keys_inv_prev_action.generic.flags = QMF_GRAYED;
s_keys_inv_prev_action.generic.x = 0;
s_keys_inv_prev_action.generic.y = y += 9;
s_keys_inv_prev_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_inv_prev_action.generic.localdata[0] = ++i;
s_keys_inv_prev_action.generic.name = bindnames[s_keys_inv_prev_action.generic.localdata[0]][1];
s_keys_inv_next_action.generic.type = MTYPE_ACTION;
s_keys_inv_next_action.generic.flags = QMF_GRAYED;
s_keys_inv_next_action.generic.x = 0;
s_keys_inv_next_action.generic.y = y += 9;
s_keys_inv_next_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_inv_next_action.generic.localdata[0] = ++i;
s_keys_inv_next_action.generic.name = bindnames[s_keys_inv_next_action.generic.localdata[0]][1];
s_keys_help_computer_action.generic.type = MTYPE_ACTION;
s_keys_help_computer_action.generic.flags = QMF_GRAYED;
s_keys_help_computer_action.generic.x = 0;
s_keys_help_computer_action.generic.y = y += 9;
s_keys_help_computer_action.generic.ownerdraw = DrawKeyBindingFunc;
s_keys_help_computer_action.generic.localdata[0] = ++i;
s_keys_help_computer_action.generic.name = bindnames[s_keys_help_computer_action.generic.localdata[0]][1];
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_attack_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_change_weapon_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_walk_forward_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_backpedal_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_turn_left_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_turn_right_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_run_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_step_left_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_step_right_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_sidestep_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_look_up_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_look_down_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_center_view_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_mouse_look_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_keyboard_look_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_move_up_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_move_down_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_inventory_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_inv_use_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_inv_drop_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_inv_prev_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_inv_next_action );
Menu_AddItem( &s_keys_menu, ( void * ) &s_keys_help_computer_action );
Menu_SetStatusBar( &s_keys_menu, "enter to change, backspace to clear" );
Menu_Center( &s_keys_menu );
}
static void Keys_MenuDraw (void)
{
Menu_AdjustCursor( &s_keys_menu, 1 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -