diff --git a/src/game/g_console.pas b/src/game/g_console.pas
index d3059549107a05b8fa58b92df8bbb916880f7109..b2194ba719e6e5127995bd8dc9453628556a1356 100644 (file)
--- a/src/game/g_console.pas
+++ b/src/game/g_console.pas
ACTION_SCORES = 6;
ACTION_ACTIVATE = 7;
ACTION_STRAFE = 8;
- ACTION_WEAPNEXT = 9;
- ACTION_WEAPPREV = 10;
FIRST_ACTION = ACTION_JUMP;
- LAST_ACTION = ACTION_WEAPPREV;
+ LAST_ACTION = ACTION_STRAFE;
procedure g_Console_Init;
procedure g_Console_SysInit;
function g_Console_Action (action: Integer): Boolean;
function g_Console_MatchBind (key: Integer; down: AnsiString; up: AnsiString = ''): Boolean;
function g_Console_FindBind (n: Integer; down: AnsiString; up: AnsiString = ''): Integer;
-procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = '');
+procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = ''; rep: Boolean = False);
procedure g_Console_ProcessBind (key: Integer; down: Boolean);
+procedure g_Console_ProcessBindRepeat (key: Integer);
procedure g_Console_ResetBinds;
procedure conwriteln (const s: AnsiString; show: Boolean=false);
function conParseFloat (var res: Single; const s: AnsiString): Boolean;
const
- defaultConfigScript = 'dfconfig.cfg';
+ {$IFDEF HEADLESS}
+ defaultConfigScript = 'dfserver.cfg';
+ {$ELSE}
+ defaultConfigScript = 'dfconfig.cfg';
+ {$ENDIF}
var
gConsoleShow: Boolean = false; // True - êîíñîëü îòêðûòà èëè îòêðûâàåòñÿ
uses
g_textures, g_main, e_graphics, e_input, g_game, g_gfx, g_player, g_items,
SysUtils, g_basic, g_options, Math, g_touch, e_res,
- g_menu, g_gui, g_language, g_net, g_netmsg, e_log, conbuf;
+ g_menu, g_gui, g_language, g_net, g_netmsg, e_log, conbuf, g_weapons;
const
autoexecScript = 'autoexec.cfg';
end;
gInputBinds: Array [0..e_MaxInputKeys - 1] of record
+ rep: Boolean;
down, up: SSArray;
end;
menu_toggled: BOOLEAN; (* hack for menu controls *)
begin
g_Console_Add('bind <key> <down action> [up action]')
end;
+ 'bindrep':
+ // bindrep <key>
+ if Length(p) = 2 then
+ begin
+ key := LowerCase(p[1]);
+ i := 0;
+ while (i < e_MaxInputKeys) and (key <> LowerCase(e_KeyNames[i])) do inc(i);
+ if i < e_MaxInputKeys then
+ gInputBinds[i].rep := True
+ else
+ g_Console_Add('bindrep: "' + p[1] + '" is not a key')
+ end
+ else
+ g_Console_Add('bindrep <key>');
+ 'bindunrep':
+ // bindunrep <key>
+ if Length(p) = 2 then
+ begin
+ key := LowerCase(p[1]);
+ i := 0;
+ while (i < e_MaxInputKeys) and (key <> LowerCase(e_KeyNames[i])) do inc(i);
+ if i < e_MaxInputKeys then
+ gInputBinds[i].rep := False
+ else
+ g_Console_Add('bindunrep: "' + p[1] + '" is not a key')
+ end
+ else
+ g_Console_Add('bindunrep <key>');
'bindlist':
for i := 0 to e_MaxInputKeys - 1 do
if (gInputBinds[i].down <> nil) or (gInputBinds[i].up <> nil) then
AddCommand('g_language', SystemCommands);
AddCommand('bind', BindCommands);
+ AddCommand('bindrep', BindCommands);
+ AddCommand('bindunrep', BindCommands);
AddCommand('bindlist', BindCommands);
AddCommand('unbind', BindCommands);
AddCommand('unbindall', BindCommands);
AddCommand('p2_color', PlayerSettingsCVars);
AddCommand('p1_model', PlayerSettingsCVars);
AddCommand('p2_model', PlayerSettingsCVars);
+ AddCommand('p1_team', PlayerSettingsCVars);
+ AddCommand('p2_team', PlayerSettingsCVars);
+ AddCommand('p1_autoswitch', PlayerSettingsCVars);
+ AddCommand('p2_autoswitch', PlayerSettingsCVars);
+ AddCommand('p1_switch_empty', PlayerSettingsCVars);
+ AddCommand('p2_switch_empty', PlayerSettingsCVars);
+ AddCommand('p1_skip_fist', PlayerSettingsCVars);
+ AddCommand('p2_skip_fist', PlayerSettingsCVars);
+ AddCommand('p1_priority_kastet', PlayerSettingsCVars);
+ AddCommand('p2_priority_kastet', PlayerSettingsCVars);
+ AddCommand('p1_priority_saw', PlayerSettingsCVars);
+ AddCommand('p2_priority_saw', PlayerSettingsCVars);
+ AddCommand('p1_priority_pistol', PlayerSettingsCVars);
+ AddCommand('p2_priority_pistol', PlayerSettingsCVars);
+ AddCommand('p1_priority_shotgun1', PlayerSettingsCVars);
+ AddCommand('p2_priority_shotgun1', PlayerSettingsCVars);
+ AddCommand('p1_priority_shotgun2', PlayerSettingsCVars);
+ AddCommand('p2_priority_shotgun2', PlayerSettingsCVars);
+ AddCommand('p1_priority_chaingun', PlayerSettingsCVars);
+ AddCommand('p2_priority_chaingun', PlayerSettingsCVars);
+ AddCommand('p1_priority_rocketlauncher', PlayerSettingsCVars);
+ AddCommand('p2_priority_rocketlauncher', PlayerSettingsCVars);
+ AddCommand('p1_priority_plasma', PlayerSettingsCVars);
+ AddCommand('p2_priority_plasma', PlayerSettingsCVars);
+ AddCommand('p1_priority_bfg', PlayerSettingsCVars);
+ AddCommand('p2_priority_bfg', PlayerSettingsCVars);
+ AddCommand('p1_priority_super', PlayerSettingsCVars);
+ AddCommand('p2_priority_super', PlayerSettingsCVars);
+ AddCommand('p1_priority_flamethrower', PlayerSettingsCVars);
+ AddCommand('p2_priority_flamethrower', PlayerSettingsCVars);
+ AddCommand('p1_priority_berserk', PlayerSettingsCVars);
+ AddCommand('p2_priority_berserk', PlayerSettingsCVars);
AddCommand('g_max_particles', GameCVars);
AddCommand('g_max_shells', GameCVars);
AddCommand('g_max_corpses', GameCVars);
AddCommand('g_gamemode', GameCVars);
AddCommand('g_friendlyfire', GameCVars);
+ AddCommand('g_friendly_hit_trace', GameCVars);
+ AddCommand('g_friendly_hit_projectile', GameCVars);
+ AddCommand('g_friendly_absorb_damage', GameCVars);
AddCommand('g_weaponstay', GameCVars);
AddCommand('g_allow_exit', GameCVars);
AddCommand('g_dm_keys', GameCVars);
AddCommand('g_allow_monsters', GameCVars);
+ AddCommand('g_allow_dropflag', GameCVars);
+ AddCommand('g_throw_flag', GameCVars);
AddCommand('g_bot_vsmonsters', GameCVars);
AddCommand('g_bot_vsplayers', GameCVars);
+ AddCommand('g_max_bots', GameCVars); // intentionally not whitelisted
AddCommand('g_scorelimit', GameCVars);
AddCommand('g_timelimit', GameCVars);
AddCommand('g_maxlives', GameCVars);
AddCommand('bot_removeall', GameCommands);
AddCommand('chat', GameCommands);
AddCommand('teamchat', GameCommands);
+ AddCommand('announce', GameCommands);
+ AddCommand('an', GameCommands);
AddCommand('game', GameCommands);
AddCommand('host', GameCommands);
AddCommand('map', GameCommands);
AddCommand('ready', GameCommands);
AddCommand('kick', GameCommands);
AddCommand('kick_id', GameCommands);
+ AddCommand('kick_pid', GameCommands);
AddCommand('ban', GameCommands);
- AddCommand('permban', GameCommands);
AddCommand('ban_id', GameCommands);
+ AddCommand('ban_pid', GameCommands);
+ AddCommand('permban', GameCommands);
AddCommand('permban_id', GameCommands);
+ AddCommand('permban_pid', GameCommands);
+ AddCommand('permban_ip', GameCommands);
AddCommand('unban', GameCommands);
AddCommand('connect', GameCommands);
AddCommand('disconnect', GameCommands);
AddCommand('clientlist', GameCommands);
AddCommand('event', GameCommands);
AddCommand('screenshot', GameCommands);
+ AddCommand('weapnext', GameCommands);
+ AddCommand('weapprev', GameCommands);
AddCommand('weapon', GameCommands);
+ AddCommand('dropflag', GameCommands);
+ AddCommand('p1_weapnext', GameCommands);
+ AddCommand('p1_weapprev', GameCommands);
AddCommand('p1_weapon', GameCommands);
+ AddCommand('p1_weapbest', GameCommands);
+ AddCommand('p1_dropflag', GameCommands);
+ AddCommand('p2_weapnext', GameCommands);
+ AddCommand('p2_weapprev', GameCommands);
AddCommand('p2_weapon', GameCommands);
+ AddCommand('p2_weapbest', GameCommands);
+ AddCommand('p2_dropflag', GameCommands);
AddCommand('god', GameCheats);
AddCommand('notarget', GameCheats);
AddAction('scores', ACTION_SCORES);
AddAction('activate', ACTION_ACTIVATE);
AddAction('strafe', ACTION_STRAFE);
- AddAction('weapnext', ACTION_WEAPNEXT);
- AddAction('weapprev', ACTION_WEAPPREV);
WhitelistCommand('say');
WhitelistCommand('tell');
WhitelistCommand('endmap');
WhitelistCommand('restart');
WhitelistCommand('kick');
+ WhitelistCommand('kick_pid');
WhitelistCommand('ban');
+ WhitelistCommand('ban_pid');
WhitelistCommand('centerprint');
WhitelistCommand('addbot');
WhitelistCommand('g_gamemode');
WhitelistCommand('g_friendlyfire');
+ WhitelistCommand('g_friendly_hit_trace');
+ WhitelistCommand('g_friendly_hit_projectile');
+ WhitelistCommand('g_friendly_absorb_damage');
WhitelistCommand('g_weaponstay');
WhitelistCommand('g_allow_exit');
WhitelistCommand('g_dm_keys');
Result := gConsoleShow
end;
-procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = '');
+procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = ''; rep: Boolean = False);
begin
//e_LogWritefln('bind "%s" "%s" <%s>', [LowerCase(e_KeyNames[key]), cmd, key]);
ASSERT(key >= 0);
ASSERT(key < e_MaxInputKeys);
if key > 0 then
begin
+ gInputBinds[key].rep := rep;
gInputBinds[key].down := ParseAlias(down);
gInputBinds[key].up := ParseAlias(up);
end;
i := 0;
while (n >= 1) and (i < e_MaxInputKeys) do
begin
- if g_Console_MatchBind(i, down, up) then
+ if (i < VK_FIRSTKEY) or (i > VK_LASTKEY) then (* never show virtual keys in gui *)
begin
- result := i;
- dec(n)
+ if g_Console_MatchBind(i, down, up) then
+ begin
+ result := i;
+ dec(n)
+ end;
end;
inc(i)
end;
menu_toggled := False
end;
+procedure g_Console_ProcessBindRepeat (key: Integer);
+ var i: Integer;
+begin
+ if gConsoleShow or gChatShow or (g_ActiveWindow <> nil) then
+ begin
+ KeyPress(key); // key repeat in menus and shit
+ Exit;
+ end;
+ if BindsAllowed(key) and gInputBinds[key].rep then
+ begin
+ for i := 0 to High(gInputBinds[key].down) do
+ g_Console_Process(gInputBinds[key].down[i], True);
+ end;
+end;
+
procedure g_Console_ResetBinds;
var i: Integer;
begin
g_Console_BindKey(IK_SPACE, '+p1_jump', '-p1_jump');
g_Console_BindKey(IK_H, '+p1_attack', '-p1_attack');
g_Console_BindKey(IK_J, '+p1_activate', '-p1_activate');
- g_Console_BindKey(IK_E, '+p1_weapnext', '-p1_weapnext');
- g_Console_BindKey(IK_Q, '+p1_weapprev', '-p1_weapprev');
g_Console_BindKey(IK_ALT, '+p1_strafe', '-p1_strafe');
+ g_Console_BindKey(IK_E, 'p1_weapnext', '', True);
+ g_Console_BindKey(IK_Q, 'p1_weapprev', '', True);
+ g_Console_BindKey(IK_R, 'p1_dropflag', '');
g_Console_BindKey(IK_1, 'p1_weapon 1');
g_Console_BindKey(IK_2, 'p1_weapon 2');
g_Console_BindKey(IK_3, 'p1_weapon 3');
g_Console_BindKey(e_JoyButtonToKey(i, 2), '+p' + IntToStr(i mod 2 + 1) + '_jump', '-p' + IntToStr(i mod 2 + 1) + '_jump');
g_Console_BindKey(e_JoyButtonToKey(i, 0), '+p' + IntToStr(i mod 2 + 1) + '_attack', '-p' + IntToStr(i mod 2 + 1) + '_attack');
g_Console_BindKey(e_JoyButtonToKey(i, 3), '+p' + IntToStr(i mod 2 + 1) + '_activate', '-p' + IntToStr(i mod 2 + 1) + '_activate');
- g_Console_BindKey(e_JoyButtonToKey(i, 1), '+p' + IntToStr(i mod 2 + 1) + '_weapnext', '-p' + IntToStr(i mod 2 + 1) + '_weapnext');
- g_Console_BindKey(e_JoyButtonToKey(i, 4), '+p' + IntToStr(i mod 2 + 1) + '_weapprev', '-p' + IntToStr(i mod 2 + 1) + '_weapprev');
g_Console_BindKey(e_JoyButtonToKey(i, 7), '+p' + IntToStr(i mod 2 + 1) + '_strafe', '-p' + IntToStr(i mod 2 + 1) + '_strafe');
+ g_Console_BindKey(e_JoyButtonToKey(i, 1), 'p' + IntToStr(i mod 2 + 1) + '_weapnext', '', True);
+ g_Console_BindKey(e_JoyButtonToKey(i, 4), 'p' + IntToStr(i mod 2 + 1) + '_weapprev', '', True);
g_Console_BindKey(e_JoyButtonToKey(i, 10), 'togglemenu');
end;
g_Console_BindKey(VK_JUMP, '+jump', '-jump');
g_Console_BindKey(VK_FIRE, '+attack', '-attack');
g_Console_BindKey(VK_OPEN, '+activate', '-activate');
- g_Console_BindKey(VK_NEXT, '+weapnext', '-weapnext');
- g_Console_BindKey(VK_PREV, '+weapprev', '-weapprev');
g_Console_BindKey(VK_STRAFE, '+strafe', '-strafe');
+ g_Console_BindKey(VK_NEXT, 'weapnext', '', True);
+ g_Console_BindKey(VK_PREV, 'weapprev', '', True);
g_Console_BindKey(VK_0, 'weapon 1');
g_Console_BindKey(VK_1, 'weapon 2');
g_Console_BindKey(VK_2, 'weapon 3');
WriteLn(f, name, IfThen(LongBool(gsGameFlags and flag), 1, 0));
end;
+ function FormatTeam(team: Byte): string;
+ begin
+ if team = TEAM_BLUE then
+ result := 'blue'
+ else
+ result := 'red';
+ end;
+
begin
AssignFile(f, filename);
Rewrite(f);
if Length(gInputBinds[i].up) > 0 then
Write(f, ' ', QuoteStr(GetCommandString(gInputBinds[i].up)));
WriteLn(f, '');
+ if gInputBinds[i].rep then
+ WriteLn(f, 'bindrep ', e_KeyNames[i]);
end;
// lang
WriteLn(f, 'g_warmup_time ', gsWarmupTime);
WriteFlag('g_friendlyfire ', GAME_OPTION_TEAMDAMAGE);
+ WriteFlag('g_friendly_hit_trace ', GAME_OPTION_TEAMHITTRACE);
+ WriteFlag('g_friendly_hit_projectile ', GAME_OPTION_TEAMHITPROJECTILE);
WriteFlag('g_allow_exit ', GAME_OPTION_ALLOWEXIT);
WriteFlag('g_allow_monsters ', GAME_OPTION_MONSTERS);
+ WriteFlag('g_allow_dropflag ', GAME_OPTION_ALLOWDROPFLAG);
+ WriteFlag('g_throw_flag ', GAME_OPTION_THROWFLAG);
WriteFlag('g_dm_keys ', GAME_OPTION_DMKEYS);
WriteFlag('g_weaponstay ', GAME_OPTION_WEAPONSTAY);
WriteFlag('g_bot_vsmonsters ', GAME_OPTION_BOTVSMONSTER);
WriteLn(f, 'p1_name ', QuoteStr(Name));
WriteLn(f, 'p1_color ', Color.R, ' ', Color.G, ' ', Color.B);
WriteLn(f, 'p1_model ', QuoteStr(Model));
+ WriteLn(f, 'p1_team ', FormatTeam(Team));
+ WriteLn(f, 'p1_autoswitch ', WeaponSwitch);
+ WriteLn(f, 'p1_switch_empty ', SwitchToEmpty);
+ WriteLn(f, 'p1_priority_kastet ', Max(0, WeaponPreferences[WEAPON_KASTET]));
+ WriteLn(f, 'p1_priority_saw ', Max(0, WeaponPreferences[WEAPON_SAW]));
+ WriteLn(f, 'p1_priority_pistol ', Max(0, WeaponPreferences[WEAPON_PISTOL]));
+ WriteLn(f, 'p1_priority_shotgun1 ', Max(0, WeaponPreferences[WEAPON_SHOTGUN1]));
+ WriteLn(f, 'p1_priority_shotgun2 ', Max(0, WeaponPreferences[WEAPON_SHOTGUN2] ));
+ WriteLn(f, 'p1_priority_chaingun ', Max(0, WeaponPreferences[WEAPON_CHAINGUN]));
+ WriteLn(f, 'p1_priority_rocketlauncher ', Max(0, WeaponPreferences[WEAPON_ROCKETLAUNCHER]));
+ WriteLn(f, 'p1_priority_plasma ', Max(0, WeaponPreferences[WEAPON_PLASMA]));
+ WriteLn(f, 'p1_priority_bfg ', Max(0, WeaponPreferences[WEAPON_BFG]));
+ WriteLn(f, 'p1_priority_super ', Max(0, WeaponPreferences[WEAPON_SUPERPULEMET]));
+ WriteLn(f, 'p1_priority_flamethrower ', Max(0, WeaponPreferences[WEAPON_FLAMETHROWER]));
+ WriteLn(f, 'p1_priority_berserk ', Max(0, WeaponPreferences[WP_LAST+1]));
+ //
end;
with gPlayer2Settings do
begin
WriteLn(f, 'p2_name ', QuoteStr(Name));
WriteLn(f, 'p2_color ', Color.R, ' ', Color.G, ' ', Color.B);
WriteLn(f, 'p2_model ', QuoteStr(Model));
+ WriteLn(f, 'p2_team ', FormatTeam(Team));
+ WriteLn(f, 'p2_autoswitch ', WeaponSwitch);
+ WriteLn(f, 'p2_switch_empty ', SwitchToEmpty);
+ WriteLn(f, 'p2_priority_kastet ', Max(0, WeaponPreferences[WEAPON_KASTET]));
+ WriteLn(f, 'p2_priority_saw ', Max(0, WeaponPreferences[WEAPON_SAW]));
+ WriteLn(f, 'p2_priority_pistol ', Max(0, WeaponPreferences[WEAPON_PISTOL]));
+ WriteLn(f, 'p2_priority_shotgun1 ', Max(0, WeaponPreferences[WEAPON_SHOTGUN1]));
+ WriteLn(f, 'p2_priority_shotgun2 ', Max(0, WeaponPreferences[WEAPON_SHOTGUN1]));
+ WriteLn(f, 'p2_priority_chaingun ', Max(0, WeaponPreferences[WEAPON_CHAINGUN]));
+ WriteLn(f, 'p2_priority_rocketlauncher ', Max(0, WeaponPreferences[WEAPON_ROCKETLAUNCHER]));
+ WriteLn(f, 'p2_priority_plasma ', Max(0, WeaponPreferences[WEAPON_PLASMA]));
+ WriteLn(f, 'p2_priority_bfg ', Max(0, WeaponPreferences[WEAPON_BFG]));
+ WriteLn(f, 'p2_priority_super ', Max(0, WeaponPreferences[WEAPON_SUPERPULEMET]));
+ WriteLn(f, 'p2_priority_flamethrower ', Max(0, WeaponPreferences[WEAPON_FLAMETHROWER]));
+ WriteLn(f, 'p2_priority_berserk ', Max(0, WeaponPreferences[WP_LAST+1]));
end;
// all cvars