DEADSOFTWARE

config: save player teams
[d2df-sdl.git] / src / game / g_console.pas
index c779409eaa4ecc070b5ddf844b941f1e4c16c7be..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
@@ -957,6 +987,8 @@ begin
   AddCommand('g_language', SystemCommands);
 
   AddCommand('bind', BindCommands);
+  AddCommand('bindrep', BindCommands);
+  AddCommand('bindunrep', BindCommands);
   AddCommand('bindlist', BindCommands);
   AddCommand('unbind', BindCommands);
   AddCommand('unbindall', BindCommands);
@@ -1000,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);
@@ -1007,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);
@@ -1122,6 +1158,8 @@ 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');
@@ -1819,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;
@@ -1914,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
@@ -2034,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);
@@ -2050,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
@@ -2082,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);
@@ -2095,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