⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.pas

📁 雷神之锤2(Quake2)Delphi源码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  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 + -