📄 menu.pas
字号:
M_DrawCursor(xoffset - 25, ystart + (m_main_cursor * 40) + 11, (cls.realtime div 100) mod NUM_CURSOR_FRAMES);
re.DrawGetPicSize(@w, @h, 'm_main_plaque');
re.DrawPic(xoffset - 30 - w, ystart, 'm_main_plaque');
re.DrawPic(xoffset - 30 - w, ystart + h + 5, 'm_main_logo');
end;
function M_Main_Key(key: Integer): PChar;
var
sound: PChar;
begin
sound := menu_move_sound;
Result := sound;
case key of
K_ESCAPE: M_PopMenu();
K_KP_DOWNARROW, K_DOWNARROW:
begin
Inc(m_main_cursor);
if (m_main_cursor >= MAIN_ITEMS) then
m_main_cursor := 0;
exit; // return sound;
end;
K_KP_UPARROW, K_UPARROW:
begin
Dec(m_main_cursor);
if (m_main_cursor < 0) then
m_main_cursor := MAIN_ITEMS - 1;
exit; // return sound;
end;
K_KP_ENTER, K_ENTER:
begin
m_entersound := true;
case m_main_cursor of
0: M_Menu_Game_f();
1: M_Menu_Multiplayer_f();
2: M_Menu_Options_f();
3: M_Menu_Video_f();
4: M_Menu_Quit_f();
end;
end;
end;
Result := nil;
end;
procedure M_Menu_Main_f;
begin
M_PushMenu(M_Main_Draw, M_Main_Key);
end;
{
====================================
MULTIPLAYER MENU
====================================
}
var
s_multiplayer_menu: menuframework_s;
s_join_network_server_action,
s_start_network_server_action,
s_player_setup_action: menuaction_s;
procedure Multiplayer_MenuDraw;
begin
M_Banner('m_banner_multiplayer');
Menu_AdjustCursor(@s_multiplayer_menu, 1);
Menu_Draw(@s_multiplayer_menu);
end;
procedure PlayerSetupFunc(Unused: Pointer);
begin
M_Menu_PlayerConfig_f();
end;
procedure JoinNetworkServerFunc(Unused: Pointer);
begin
M_Menu_JoinServer_f();
end;
procedure StartNetworkServerFunc(Unused: Pointer);
begin
M_Menu_StartServer_f();
end;
procedure Multiplayer_MenuInit;
begin
s_multiplayer_menu.x := viddef.width div 2 - 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, @s_join_network_server_action);
Menu_AddItem(@s_multiplayer_menu, @s_start_network_server_action);
Menu_AddItem(@s_multiplayer_menu, @s_player_setup_action);
Menu_SetStatusBar(@s_multiplayer_menu, nil);
Menu_Center(@s_multiplayer_menu);
end;
function Multiplayer_MenuKey(Key: Integer): PChar;
begin
result := Default_MenuKey(@s_multiplayer_menu, key);
end;
procedure M_Menu_Multiplayer_f;
begin
Multiplayer_MenuInit();
M_PushMenu(Multiplayer_MenuDraw, Multiplayer_MenuKey);
end;
{
====================================
KEYS MENU
====================================
}
const
BindNames : array[0..23,0..1] of PChar =
(
('+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'),
(nil, nil) // was (0,0); ... null entry at end
);
var
keys_cursor: Integer;
bind_grab: Integer; // static
s_keys_menu: menuframework_s; // static
s_keys_attack_action,
s_keys_change_weapon_action,
s_keys_walk_forward_action,
s_keys_backpedal_action,
s_keys_turn_left_action,
s_keys_turn_right_action,
s_keys_run_action,
s_keys_step_left_action,
s_keys_step_right_action,
s_keys_sidestep_action,
s_keys_look_up_action,
s_keys_look_down_action,
s_keys_center_view_action,
s_keys_mouse_look_action,
s_keys_keyboard_look_action,
s_keys_move_up_action,
s_keys_move_down_action,
s_keys_inventory_action,
s_keys_inv_use_action,
s_keys_inv_drop_action,
s_keys_inv_prev_action,
s_keys_inv_next_action,
s_keys_help_computer_action: menuaction_s; // all static
procedure M_UnbindCommand(command: PChar); // static
var
j, l: Integer;
b: PChar;
begin
l := strlen(command);
for j := 0 to 255 do
begin
b := keybindings[j];
if b = nil then
continue;
if (strncmp(b, command, l)=0) then
Key_SetBinding(j, '');
end;
end;
procedure M_FindKeysForCommand(command: PChar; twokeys: PIntegerArray); // static
var
count, j, l: Integer;
b: PChar;
begin
twokeys^[0] := -1;
twokeys^[1] := -1;
l := strlen(command);
count := 0;
for j := 0 to 255 do
begin
b := keybindings[j];
if b = nil then
continue;
if strncmp(b, command, l)=0 then
begin
twokeys[count] := j;
Inc(count);
if (count = 2) then
break;
end;
end;
end;
procedure KeyCursorDrawFunc(menu: menuframework_p); // static
begin
if (bind_grab <> 0) then
re.DrawChar(menu^.x, menu^.y + menu^.cursor * 9, Byte('='))
else
re.DrawChar(menu^.x, menu^.y + menu^.cursor * 9, 12 + (Sys_Milliseconds() div 250) and 1);
end;
procedure DrawKeyBindingFunc(Self: Pointer); // static
var
keys: array[0..1] of integer;
a: menuaction_p;
x: Integer;
Name: PChar;
begin
a := menuaction_p(self);
M_FindKeysForCommand(bindnames[a^.generic.localdata[0]][0], @keys);
if (keys[0] = -1) then
begin
Menu_DrawString(a^.generic.x + a^.generic.parent^.x + 16, a^.generic.y +
a^.generic.parent^.y, '???');
end
else
begin
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) then
begin
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]));
end;
end;
end;
procedure KeyBindingFunc(Self: Pointer); // static
var
keys: array[0..1] of integer;
a: menuaction_p;
begin
a := menuaction_p(self);
M_FindKeysForCommand(bindnames[a^.generic.localdata[0]][0], @keys);
if (keys[1] <> -1) then
M_UnbindCommand(bindnames[a^.generic.localdata[0]][0]);
bind_grab := Integer(True);
Menu_SetStatusBar(@s_keys_menu, 'press a key or button for this action');
end;
procedure Keys_MenuInit; // static
var
i, y: Integer;
begin
y := 0;
i := 0;
s_keys_menu.x := viddef.width div 2;
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;
inc(y, 9);
s_keys_change_weapon_action.generic.y := y;
s_keys_change_weapon_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_walk_forward_action.generic.y := y;
s_keys_walk_forward_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_backpedal_action.generic.y := y;
s_keys_backpedal_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_turn_left_action.generic.y := y;
s_keys_turn_left_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_turn_right_action.generic.y := y;
s_keys_turn_right_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_run_action.generic.y := y;
s_keys_run_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_step_left_action.generic.y := y;
s_keys_step_left_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_step_right_action.generic.y := y;
s_keys_step_right_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_sidestep_action.generic.y := y;
s_keys_sidestep_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_look_up_action.generic.y := y;
s_keys_look_up_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_look_down_action.generic.y := y;
s_keys_look_down_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
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;
inc(y, 9);
s_keys_center_view_action.generic.y := y;
s_keys_center_view_action.generic.ownerdraw := DrawKeyBindingFunc;
inc(i);
s_keys_center_view_action.generic.localdata[0] := i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -