DEADSOFTWARE

config: save player teams
[d2df-sdl.git] / src / game / g_console.pas
index c38b476408f08dc42aba24a0b6ca04e000fc4e06..a6fa9c42e78673a7434f7cf500d22a601a5a5ee0 100644 (file)
@@ -56,6 +56,7 @@ function  g_Console_MatchBind (key: Integer; down: AnsiString; up: AnsiString =
 function  g_Console_FindBind (n: Integer; down: AnsiString; up: AnsiString = ''): Integer;
 procedure g_Console_BindKey (key: Integer; down: AnsiString; up: AnsiString = '');
 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);
@@ -152,6 +153,7 @@ var
                             end;
 
   gInputBinds: Array [0..e_MaxInputKeys - 1] of record
+    rep: Boolean;
     down, up: SSArray;
   end;
   menu_toggled: BOOLEAN; (* hack for menu controls *)
@@ -830,6 +832,34 @@ begin
     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
@@ -953,9 +983,12 @@ begin
   AddCommand('quit', SystemCommands);
   AddCommand('exit', SystemCommands);
   AddCommand('r_reset', SystemCommands);
+  AddCommand('r_maxfps', SystemCommands);
   AddCommand('g_language', SystemCommands);
 
   AddCommand('bind', BindCommands);
+  AddCommand('bindrep', BindCommands);
+  AddCommand('bindunrep', BindCommands);
   AddCommand('bindlist', BindCommands);
   AddCommand('unbind', BindCommands);
   AddCommand('unbindall', BindCommands);
@@ -999,6 +1032,8 @@ begin
   AddCommand('p2_color', PlayerSettingsCVars);
   AddCommand('p1_model', PlayerSettingsCVars);
   AddCommand('p2_model', PlayerSettingsCVars);
+  AddCommand('p1_team', PlayerSettingsCVars);
+  AddCommand('p2_team', PlayerSettingsCVars);
 
   AddCommand('g_max_particles', GameCVars);
   AddCommand('g_max_shells', GameCVars);
@@ -1006,6 +1041,8 @@ begin
   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_weaponstay', GameCVars);
   AddCommand('g_allow_exit', GameCVars);
   AddCommand('g_dm_keys', GameCVars);
@@ -1048,10 +1085,14 @@ begin
   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);
@@ -1104,7 +1145,9 @@ begin
   WhitelistCommand('endmap');
   WhitelistCommand('restart');
   WhitelistCommand('kick');
+  WhitelistCommand('kick_pid');
   WhitelistCommand('ban');
+  WhitelistCommand('ban_pid');
   WhitelistCommand('centerprint');
 
   WhitelistCommand('addbot');
@@ -1115,15 +1158,20 @@ begin
 
   WhitelistCommand('g_gamemode');
   WhitelistCommand('g_friendlyfire');
+  WhitelistCommand('g_friendly_hit_trace');
+  WhitelistCommand('g_friendly_hit_projectile');
   WhitelistCommand('g_weaponstay');
   WhitelistCommand('g_allow_exit');
+  WhitelistCommand('g_dm_keys');
   WhitelistCommand('g_allow_monsters');
+  WhitelistCommand('g_bot_vsmonsters');
+  WhitelistCommand('g_bot_vsplayers');
   WhitelistCommand('g_scorelimit');
   WhitelistCommand('g_timelimit');
-  WhitelistCommand('g_dm_keys');
+  WhitelistCommand('g_maxlives');
+  WhitelistCommand('g_warmup_time');
   WhitelistCommand('g_spawn_invul');
   WhitelistCommand('g_item_respawn_time');
-  WhitelistCommand('g_warmup_time');
 
   g_Console_ResetBinds;
   g_Console_ReadConfig(gConfigScript);
@@ -1809,6 +1857,7 @@ begin
   ASSERT(key < e_MaxInputKeys);
   if key > 0 then
   begin
+    gInputBinds[key].rep := False;
     gInputBinds[key].down := ParseAlias(down);
     gInputBinds[key].up := ParseAlias(up);
   end;
@@ -1904,6 +1953,21 @@ begin
   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
@@ -2024,6 +2088,14 @@ procedure g_Console_WriteConfig (filename: String);
     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);
@@ -2040,6 +2112,8 @@ begin
       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
@@ -2072,6 +2146,8 @@ begin
   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_dm_keys ', GAME_OPTION_DMKEYS);
@@ -2085,12 +2161,14 @@ begin
     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));
   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));
   end;
 
   // all cvars
@@ -2129,6 +2207,7 @@ begin
     end
   end;
 
+  WriteLn(f, 'r_maxfps ', gMaxFPS);
   WriteLn(f, 'r_reset');
   CloseFile(f)
 end;