DEADSOFTWARE

render: separate server list logic and drawing
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Tue, 8 Jun 2021 03:05:25 +0000 (06:05 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 9 Jun 2023 07:41:59 +0000 (10:41 +0300)
src/game/Doom2DF.lpr
src/game/g_netmaster.pas
src/game/opengl/r_game.pas
src/game/opengl/r_netmaster.pas [new file with mode: 0644]

index 179df4e35cc588c3e711d1efd4c4b910f2d8a692..8ee5396710b5d96c35dd0962b55b6c4f2d79af56 100644 (file)
@@ -159,6 +159,7 @@ uses
   r_items in 'opengl/r_items.pas',
   r_map in 'opengl/r_map.pas',
   r_monsters in 'opengl/r_monsters.pas',
+  r_netmaster in 'opengl/r_netmaster.pas',
   r_panel in 'opengl/r_panel.pas',
   r_weapons in 'opengl/r_weapons.pas',
 
index e6e7a6c5eed31414263719c61717a372ccf56d2f..ba175406ab78a14a15e317d2b949b180b712adc4 100644 (file)
@@ -163,11 +163,15 @@ procedure g_Net_Slist_Pulse (timeout: Integer=0);
 procedure g_Net_Slist_ShutdownAll ();
 
 procedure g_Serverlist_GenerateTable (SL: TNetServerList; var ST: TNetServerTable);
-procedure g_Serverlist_Draw (var SL: TNetServerList; var ST: TNetServerTable);
 procedure g_Serverlist_Control (var SL: TNetServerList; var ST: TNetServerTable);
 
+function GetServerFromTable (Index: Integer; SL: TNetServerList; ST: TNetServerTable): TNetServer;
+
 function GetTimerMS (): Int64;
 
+  var (* private state *)
+    slSelection: Byte = 0;
+    slReadUrgent: Boolean = False;
 
 implementation
 
@@ -183,10 +187,8 @@ var
   NetMEvent: ENetEvent;
   mlist: array of TMasterHost = nil;
 
-  slSelection: Byte = 0;
   slFetched: Boolean = False;
   slDirPressed: Boolean = False;
-  slReadUrgent: Boolean = False;
 
   reportsEnabled: Boolean = true;
 
@@ -1631,158 +1633,6 @@ begin
 end;
 
 
-//==========================================================================
-//
-//  g_Serverlist_Draw
-//
-//==========================================================================
-procedure g_Serverlist_Draw (var SL: TNetServerList; var ST: TNetServerTable);
-var
-  Srv: TNetServer;
-  sy, i, y, mw, mx, l, motdh: Integer;
-  cw: Byte = 0;
-  ch: Byte = 0;
-  ww: Word = 0;
-  hh: Word = 0;
-  ip: AnsiString;
-begin
-  ip := '';
-  sy := 0;
-
-  e_CharFont_GetSize(gMenuFont, _lc[I_NET_SLIST], ww, hh);
-  e_CharFont_Print(gMenuFont, (gScreenWidth div 2) - (ww div 2), 16, _lc[I_NET_SLIST]);
-
-  e_TextureFontGetSize(gStdFont, cw, ch);
-
-  ip := _lc[I_NET_SLIST_HELP];
-  mw := (Length(ip) * cw) div 2;
-
-  motdh := gScreenHeight - 49 - ch * b_Text_LineCount(slMOTD);
-
-  e_DrawFillQuad(16, 64, gScreenWidth-16, motdh, 64, 64, 64, 110);
-  e_DrawQuad(16, 64, gScreenWidth-16, motdh, 255, 127, 0);
-
-  e_TextureFontPrintEx(gScreenWidth div 2 - mw, gScreenHeight-24, ip, gStdFont, 225, 225, 225, 1);
-
-  // MOTD
-  if slMOTD <> '' then
-  begin
-    e_DrawFillQuad(16, motdh, gScreenWidth-16, gScreenHeight-44, 64, 64, 64, 110);
-    e_DrawQuad(16, motdh, gScreenWidth-16, gScreenHeight-44, 255, 127, 0);
-    e_TextureFontPrintFmt(20, motdh + 3, slMOTD, gStdFont, False, True);
-  end;
-
-  // Urgent message
-  if not slReadUrgent and (slUrgent <> '') then
-  begin
-    e_DrawFillQuad(17, 65, gScreenWidth-17, motdh-1, 64, 64, 64, 128);
-    e_DrawFillQuad(gScreenWidth div 2 - 256, gScreenHeight div 2 - 60,
-      gScreenWidth div 2 + 256, gScreenHeight div 2 + 60, 64, 64, 64, 128);
-    e_DrawQuad(gScreenWidth div 2 - 256, gScreenHeight div 2 - 60,
-      gScreenWidth div 2 + 256, gScreenHeight div 2 + 60, 255, 127, 0);
-    e_DrawLine(1, gScreenWidth div 2 - 256, gScreenHeight div 2 - 40,
-      gScreenWidth div 2 + 256, gScreenHeight div 2 - 40, 255, 127, 0);
-    l := Length(_lc[I_NET_SLIST_URGENT]) div 2;
-    e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 - 58,
-      _lc[I_NET_SLIST_URGENT], gStdFont);
-    l := Length(slUrgent) div 2;
-    e_TextureFontPrintFmt(gScreenWidth div 2 - 253, gScreenHeight div 2 - 38,
-      slUrgent, gStdFont, False, True);
-    l := Length(_lc[I_NET_SLIST_URGENT_CONT]) div 2;
-    e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 + 41,
-      _lc[I_NET_SLIST_URGENT_CONT], gStdFont);
-    e_DrawLine(1, gScreenWidth div 2 - 256, gScreenHeight div 2 + 40,
-      gScreenWidth div 2 + 256, gScreenHeight div 2 + 40, 255, 127, 0);
-    Exit;
-  end;
-
-  if SL = nil then
-  begin
-    l := Length(slWaitStr) div 2;
-    e_DrawFillQuad(17, 65, gScreenWidth-17, motdh-1, 64, 64, 64, 128);
-    e_DrawQuad(gScreenWidth div 2 - 192, gScreenHeight div 2 - 10,
-      gScreenWidth div 2 + 192, gScreenHeight div 2 + 11, 255, 127, 0);
-    e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 - ch div 2,
-      slWaitStr, gStdFont);
-    Exit;
-  end;
-
-  y := 90;
-  if (slSelection < Length(ST)) then
-  begin
-    I := slSelection;
-    sy := y + 42 * I - 4;
-    Srv := GetServerFromTable(I, SL, ST);
-    ip := _lc[I_NET_ADDRESS] + ' ' + Srv.IP + ':' + IntToStr(Srv.Port);
-    if Srv.Password then
-      ip := ip + '  ' + _lc[I_NET_SERVER_PASSWORD] + ' ' + _lc[I_MENU_YES]
-    else
-      ip := ip + '  ' + _lc[I_NET_SERVER_PASSWORD] + ' ' + _lc[I_MENU_NO];
-  end else
-    if Length(ST) > 0 then
-      slSelection := 0;
-
-  mw := (gScreenWidth - 188);
-  mx := 16 + mw;
-
-  e_DrawFillQuad(16 + 1, sy, gScreenWidth - 16 - 1, sy + 40, 64, 64, 64, 0);
-  e_DrawLine(1, 16 + 1, sy, gScreenWidth - 16 - 1, sy, 205, 205, 205);
-  e_DrawLine(1, 16 + 1, sy + 41, gScreenWidth - 16 - 1, sy + 41, 255, 255, 255);
-
-  e_DrawLine(1, 16, 85, gScreenWidth - 16, 85, 255, 127, 0);
-  e_DrawLine(1, 16, motdh-20, gScreenWidth-16, motdh-20, 255, 127, 0);
-
-  e_DrawLine(1, mx - 70, 64, mx - 70, motdh, 255, 127, 0);
-  e_DrawLine(1, mx, 64, mx, motdh-20, 255, 127, 0);
-  e_DrawLine(1, mx + 52, 64, mx + 52, motdh-20, 255, 127, 0);
-  e_DrawLine(1, mx + 104, 64, mx + 104, motdh-20, 255, 127, 0);
-
-  e_TextureFontPrintEx(18, 68, 'NAME/MAP', gStdFont, 255, 127, 0, 1);
-  e_TextureFontPrintEx(mx - 68, 68, 'PING', gStdFont, 255, 127, 0, 1);
-  e_TextureFontPrintEx(mx + 2, 68, 'MODE', gStdFont, 255, 127, 0, 1);
-  e_TextureFontPrintEx(mx + 54, 68, 'PLRS', gStdFont, 255, 127, 0, 1);
-  e_TextureFontPrintEx(mx + 106, 68, 'VER', gStdFont, 255, 127, 0, 1);
-
-  y := 90;
-  for I := 0 to High(ST) do
-  begin
-    Srv := GetServerFromTable(I, SL, ST);
-    // Name and map
-    e_TextureFontPrintEx(18, y, Srv.Name, gStdFont, 255, 255, 255, 1);
-    e_TextureFontPrintEx(18, y + 16, Srv.Map, gStdFont, 210, 210, 210, 1);
-
-    // Ping and similar count
-    if (Srv.Ping < 0) or (Srv.Ping > 999) then
-      e_TextureFontPrintEx(mx - 68, y, _lc[I_NET_SLIST_NO_ACCESS], gStdFont, 255, 0, 0, 1)
-    else
-      if Srv.Ping = 0 then
-        e_TextureFontPrintEx(mx - 68, y, '<1' + _lc[I_NET_SLIST_PING_MS], gStdFont, 255, 255, 255, 1)
-      else
-        e_TextureFontPrintEx(mx - 68, y, IntToStr(Srv.Ping) + _lc[I_NET_SLIST_PING_MS], gStdFont, 255, 255, 255, 1);
-
-    if Length(ST[I].Indices) > 1 then
-      e_TextureFontPrintEx(mx - 68, y + 16, '< ' + IntToStr(Length(ST[I].Indices)) + ' >', gStdFont, 210, 210, 210, 1);
-
-    // Game mode
-    e_TextureFontPrintEx(mx + 2, y, g_Game_ModeToText(Srv.GameMode), gStdFont, 255, 255, 255, 1);
-
-    // Players
-    e_TextureFontPrintEx(mx + 54, y, IntToStr(Srv.Players) + '/' + IntToStr(Srv.MaxPlayers), gStdFont, 255, 255, 255, 1);
-    e_TextureFontPrintEx(mx + 54, y + 16, IntToStr(Srv.LocalPl) + '+' + IntToStr(Srv.Bots), gStdFont, 210, 210, 210, 1);
-
-    // Version
-    e_TextureFontPrintEx(mx + 106, y, IntToStr(Srv.Protocol), gStdFont, 255, 255, 255, 1);
-
-    y := y + 42;
-  end;
-
-  e_TextureFontPrintEx(20, motdh-20+3, ip, gStdFont, 205, 205, 205, 1);
-  ip := IntToStr(Length(ST)) + _lc[I_NET_SLIST_SERVERS];
-  e_TextureFontPrintEx(gScreenWidth - 48 - (Length(ip) + 1)*cw,
-    motdh-20+3, ip, gStdFont, 205, 205, 205, 1);
-end;
-
-
 //==========================================================================
 //
 //  g_Serverlist_GenerateTable
index d4e596cdbea6f059b84d1e9e310a40098da426b4..d752fdc5ec818c284faf23aa38a2bdd0ebe86ca2 100644 (file)
@@ -32,7 +32,7 @@ implementation
     g_textures, e_input, e_sound,
     g_language, g_console, g_menu, g_triggers, g_player, g_options, g_monsters, g_map, g_panel, g_window,
     g_items, g_weapons, g_gfx, g_phys, g_net, g_gui, g_netmaster,
-    g_game, r_console, r_gfx, r_items, r_map, r_panel, r_monsters, r_weapons
+    g_game, r_console, r_gfx, r_items, r_map, r_panel, r_monsters, r_weapons, r_netmaster
   ;
 
   var
@@ -1806,7 +1806,7 @@ begin
 //      end;
       r_Game_DrawMenuBackground('MENU_BACKGROUND');
       e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
-      g_Serverlist_Draw(slCurrent, slTable);
+      r_Serverlist_Draw(slCurrent, slTable);
     end;
   end;
 
diff --git a/src/game/opengl/r_netmaster.pas b/src/game/opengl/r_netmaster.pas
new file mode 100644 (file)
index 0000000..c014443
--- /dev/null
@@ -0,0 +1,178 @@
+(* Copyright (C)  Doom 2D: Forever Developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License ONLY.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$INCLUDE ../../shared/a_modes.inc}
+unit r_netmaster;
+
+interface
+
+  uses g_netmaster;
+
+  procedure r_Serverlist_Draw (var SL: TNetServerList; var ST: TNetServerTable);
+
+implementation
+
+  uses
+    SysUtils, Classes, Math,
+    e_graphics,
+    g_basic, g_language, g_game, g_menu
+  ;
+
+procedure r_Serverlist_Draw (var SL: TNetServerList; var ST: TNetServerTable);
+var
+  Srv: TNetServer;
+  sy, i, y, mw, mx, l, motdh: Integer;
+  cw: Byte = 0;
+  ch: Byte = 0;
+  ww: Word = 0;
+  hh: Word = 0;
+  ip: AnsiString;
+begin
+  ip := '';
+  sy := 0;
+
+  e_CharFont_GetSize(gMenuFont, _lc[I_NET_SLIST], ww, hh);
+  e_CharFont_Print(gMenuFont, (gScreenWidth div 2) - (ww div 2), 16, _lc[I_NET_SLIST]);
+
+  e_TextureFontGetSize(gStdFont, cw, ch);
+
+  ip := _lc[I_NET_SLIST_HELP];
+  mw := (Length(ip) * cw) div 2;
+
+  motdh := gScreenHeight - 49 - ch * b_Text_LineCount(slMOTD);
+
+  e_DrawFillQuad(16, 64, gScreenWidth-16, motdh, 64, 64, 64, 110);
+  e_DrawQuad(16, 64, gScreenWidth-16, motdh, 255, 127, 0);
+
+  e_TextureFontPrintEx(gScreenWidth div 2 - mw, gScreenHeight-24, ip, gStdFont, 225, 225, 225, 1);
+
+  // MOTD
+  if slMOTD <> '' then
+  begin
+    e_DrawFillQuad(16, motdh, gScreenWidth-16, gScreenHeight-44, 64, 64, 64, 110);
+    e_DrawQuad(16, motdh, gScreenWidth-16, gScreenHeight-44, 255, 127, 0);
+    e_TextureFontPrintFmt(20, motdh + 3, slMOTD, gStdFont, False, True);
+  end;
+
+  // Urgent message
+  if not slReadUrgent and (slUrgent <> '') then
+  begin
+    e_DrawFillQuad(17, 65, gScreenWidth-17, motdh-1, 64, 64, 64, 128);
+    e_DrawFillQuad(gScreenWidth div 2 - 256, gScreenHeight div 2 - 60,
+      gScreenWidth div 2 + 256, gScreenHeight div 2 + 60, 64, 64, 64, 128);
+    e_DrawQuad(gScreenWidth div 2 - 256, gScreenHeight div 2 - 60,
+      gScreenWidth div 2 + 256, gScreenHeight div 2 + 60, 255, 127, 0);
+    e_DrawLine(1, gScreenWidth div 2 - 256, gScreenHeight div 2 - 40,
+      gScreenWidth div 2 + 256, gScreenHeight div 2 - 40, 255, 127, 0);
+    l := Length(_lc[I_NET_SLIST_URGENT]) div 2;
+    e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 - 58,
+      _lc[I_NET_SLIST_URGENT], gStdFont);
+    l := Length(slUrgent) div 2;
+    e_TextureFontPrintFmt(gScreenWidth div 2 - 253, gScreenHeight div 2 - 38,
+      slUrgent, gStdFont, False, True);
+    l := Length(_lc[I_NET_SLIST_URGENT_CONT]) div 2;
+    e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 + 41,
+      _lc[I_NET_SLIST_URGENT_CONT], gStdFont);
+    e_DrawLine(1, gScreenWidth div 2 - 256, gScreenHeight div 2 + 40,
+      gScreenWidth div 2 + 256, gScreenHeight div 2 + 40, 255, 127, 0);
+    Exit;
+  end;
+
+  if SL = nil then
+  begin
+    l := Length(slWaitStr) div 2;
+    e_DrawFillQuad(17, 65, gScreenWidth-17, motdh-1, 64, 64, 64, 128);
+    e_DrawQuad(gScreenWidth div 2 - 192, gScreenHeight div 2 - 10,
+      gScreenWidth div 2 + 192, gScreenHeight div 2 + 11, 255, 127, 0);
+    e_TextureFontPrint(gScreenWidth div 2 - cw * l, gScreenHeight div 2 - ch div 2,
+      slWaitStr, gStdFont);
+    Exit;
+  end;
+
+  y := 90;
+  if (slSelection < Length(ST)) then
+  begin
+    I := slSelection;
+    sy := y + 42 * I - 4;
+    Srv := GetServerFromTable(I, SL, ST);
+    ip := _lc[I_NET_ADDRESS] + ' ' + Srv.IP + ':' + IntToStr(Srv.Port);
+    if Srv.Password then
+      ip := ip + '  ' + _lc[I_NET_SERVER_PASSWORD] + ' ' + _lc[I_MENU_YES]
+    else
+      ip := ip + '  ' + _lc[I_NET_SERVER_PASSWORD] + ' ' + _lc[I_MENU_NO];
+  end else
+    if Length(ST) > 0 then
+      slSelection := 0;
+
+  mw := (gScreenWidth - 188);
+  mx := 16 + mw;
+
+  e_DrawFillQuad(16 + 1, sy, gScreenWidth - 16 - 1, sy + 40, 64, 64, 64, 0);
+  e_DrawLine(1, 16 + 1, sy, gScreenWidth - 16 - 1, sy, 205, 205, 205);
+  e_DrawLine(1, 16 + 1, sy + 41, gScreenWidth - 16 - 1, sy + 41, 255, 255, 255);
+
+  e_DrawLine(1, 16, 85, gScreenWidth - 16, 85, 255, 127, 0);
+  e_DrawLine(1, 16, motdh-20, gScreenWidth-16, motdh-20, 255, 127, 0);
+
+  e_DrawLine(1, mx - 70, 64, mx - 70, motdh, 255, 127, 0);
+  e_DrawLine(1, mx, 64, mx, motdh-20, 255, 127, 0);
+  e_DrawLine(1, mx + 52, 64, mx + 52, motdh-20, 255, 127, 0);
+  e_DrawLine(1, mx + 104, 64, mx + 104, motdh-20, 255, 127, 0);
+
+  e_TextureFontPrintEx(18, 68, 'NAME/MAP', gStdFont, 255, 127, 0, 1);
+  e_TextureFontPrintEx(mx - 68, 68, 'PING', gStdFont, 255, 127, 0, 1);
+  e_TextureFontPrintEx(mx + 2, 68, 'MODE', gStdFont, 255, 127, 0, 1);
+  e_TextureFontPrintEx(mx + 54, 68, 'PLRS', gStdFont, 255, 127, 0, 1);
+  e_TextureFontPrintEx(mx + 106, 68, 'VER', gStdFont, 255, 127, 0, 1);
+
+  y := 90;
+  for I := 0 to High(ST) do
+  begin
+    Srv := GetServerFromTable(I, SL, ST);
+    // Name and map
+    e_TextureFontPrintEx(18, y, Srv.Name, gStdFont, 255, 255, 255, 1);
+    e_TextureFontPrintEx(18, y + 16, Srv.Map, gStdFont, 210, 210, 210, 1);
+
+    // Ping and similar count
+    if (Srv.Ping < 0) or (Srv.Ping > 999) then
+      e_TextureFontPrintEx(mx - 68, y, _lc[I_NET_SLIST_NO_ACCESS], gStdFont, 255, 0, 0, 1)
+    else
+      if Srv.Ping = 0 then
+        e_TextureFontPrintEx(mx - 68, y, '<1' + _lc[I_NET_SLIST_PING_MS], gStdFont, 255, 255, 255, 1)
+      else
+        e_TextureFontPrintEx(mx - 68, y, IntToStr(Srv.Ping) + _lc[I_NET_SLIST_PING_MS], gStdFont, 255, 255, 255, 1);
+
+    if Length(ST[I].Indices) > 1 then
+      e_TextureFontPrintEx(mx - 68, y + 16, '< ' + IntToStr(Length(ST[I].Indices)) + ' >', gStdFont, 210, 210, 210, 1);
+
+    // Game mode
+    e_TextureFontPrintEx(mx + 2, y, g_Game_ModeToText(Srv.GameMode), gStdFont, 255, 255, 255, 1);
+
+    // Players
+    e_TextureFontPrintEx(mx + 54, y, IntToStr(Srv.Players) + '/' + IntToStr(Srv.MaxPlayers), gStdFont, 255, 255, 255, 1);
+    e_TextureFontPrintEx(mx + 54, y + 16, IntToStr(Srv.LocalPl) + '+' + IntToStr(Srv.Bots), gStdFont, 210, 210, 210, 1);
+
+    // Version
+    e_TextureFontPrintEx(mx + 106, y, IntToStr(Srv.Protocol), gStdFont, 255, 255, 255, 1);
+
+    y := y + 42;
+  end;
+
+  e_TextureFontPrintEx(20, motdh-20+3, ip, gStdFont, 205, 205, 205, 1);
+  ip := IntToStr(Length(ST)) + _lc[I_NET_SLIST_SERVERS];
+  e_TextureFontPrintEx(gScreenWidth - 48 - (Length(ip) + 1)*cw,
+    motdh-20+3, ip, gStdFont, 205, 205, 205, 1);
+end;
+
+end.