DEADSOFTWARE

cleanup: move init and main loop code from g_window
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Tue, 15 Jun 2021 18:42:00 +0000 (21:42 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 9 Jun 2023 07:45:41 +0000 (10:45 +0300)
12 files changed:
src/game/Doom2DF.lpr
src/game/g_game.pas
src/game/g_holmes.pas
src/game/g_menu.pas
src/game/g_netmaster.pas
src/game/g_options.pas
src/game/g_player.pas
src/game/g_window.pas
src/game/opengl/r_game.pas
src/game/sdl/g_system.pas
src/game/sdl2/g_system.pas
src/game/sdl2/g_touch.pas

index 452b7715fe53bfcbc551b6683674a8326cc74799..ac4218ad9ec310efbd6ec98e2cb2f5a2af9b7ff0 100644 (file)
@@ -200,7 +200,8 @@ uses
   fui_ctls in '../flexui/fui_ctls.pas',
 {$ENDIF}
   {$I ../shared/vampimg.inc}
-  SysUtils;
+
+  SysUtils, Classes;
 
 {$IFDEF WINDOWS}
   {$R *.res}
@@ -210,6 +211,314 @@ uses
     noct: Boolean = False;
     binPath: AnsiString = '';
     forceBinDir: Boolean = False;
+    {$IFDEF USE_SDLMIXER}
+      UseNativeMusic: Boolean;
+    {$ENDIF}
+
+    wLoadingQuit: Boolean = false;
+    Time, Time_Delta, Time_Old: Int64;
+    Frame: Int64;
+    flag: Boolean = false;
+
+procedure Update ();
+begin
+  // remember old mobj positions, prepare for update
+  g_Game_PreUpdate();
+  // server: receive client commands for new frame
+  // client: receive game state changes from server
+       if (NetMode = NET_SERVER) then g_Net_Host_Update()
+  else if (NetMode = NET_CLIENT) then g_Net_Client_Update();
+  // think
+  g_Game_Update();
+  // server: send any accumulated outgoing data to clients
+  if NetMode = NET_SERVER then g_Net_Flush();
+end;
+
+procedure Init();
+  {$IFDEF USE_SDLMIXER}
+    var timiditycfg: AnsiString;
+    var oldcwd, newcwd: RawByteString;
+  {$ENDIF}
+  var NoSound: Boolean;
+begin
+  Randomize;
+
+{$IFDEF HEADLESS}
+ {$IFDEF USE_SDLMIXER}
+  NoSound := False; // hope env has set SDL_AUDIODRIVER to dummy
+ {$ELSE}
+  NoSound := True; // FMOD backend will sort it out
+ {$ENDIF}
+{$ELSE}
+  NoSound := False;
+{$ENDIF}
+
+  g_Touch_Init;
+
+(*
+  if (e_JoysticksAvailable > 0) then
+    e_WriteLog('Input: Joysticks available.', TMsgType.Notify)
+  else
+    e_WriteLog('Input: No Joysticks.', TMsgType.Notify);
+*)
+
+  if gNoSound = false then
+  begin
+    e_WriteLog('Initializing sound system', TMsgType.Notify);
+    {$IFDEF USE_SDLMIXER}
+      newcwd := '';
+      if UseNativeMusic then
+        SetEnvVar('SDL_NATIVE_MUSIC', '1');
+      timiditycfg := GetEnvironmentVariable('TIMIDITY_CFG');
+      if timiditycfg = '' then
+      begin
+        timiditycfg := 'timidity.cfg';
+        if e_FindResource(ConfigDirs, timiditycfg) OR e_FindResource(DataDirs, timiditycfg) then
+        begin
+          timiditycfg := ExpandFileName(timiditycfg);
+          newcwd := ExtractFileDir(timiditycfg);
+          SetEnvVar('TIMIDITY_CFG', timiditycfg);
+        end
+        else
+          timiditycfg := '';
+      end;
+      e_LogWritefln('TIMIDITY_CFG = "%s"', [timiditycfg]);
+      e_LogWritefln('SDL_NATIVE_MUSIC = "%s"', [GetEnvironmentVariable('SDL_NATIVE_MUSIC')]);
+    {$ENDIF}
+    e_InitSoundSystem(NoSound);
+    {$IFDEF USE_SDLMIXER}
+      if e_TimidityDecoder and (newcwd <> '') then
+      begin
+        (* HACK: Set CWD to load GUS patches relatively to cfg file. *)
+        (*       CWD not restored after sound init because timidity  *)
+        (*       store relative pathes internally and load patches   *)
+        (*       later. I hope game never relies on CWD.             *)
+        oldcwd := '';
+        GetDir(0, oldcwd);
+        ChDir(newcwd);
+        e_logwritefln('WARNING: USED TIMIDITY CONFIG HACK, CWD SWITCHED "%s" -> "%s"', [oldcwd, newcwd]);
+      end;
+    {$ENDIF}
+  end;
+
+  e_WriteLog('Init game', TMsgType.Notify);
+  g_Game_Init();
+
+//  FillChar(charbuff, sizeof(charbuff), ' ');
+end;
+
+procedure Release();
+begin
+  e_WriteLog('Releasing engine', TMsgType.Notify);
+  e_ReleaseEngine();
+
+  e_WriteLog('Releasing input', TMsgType.Notify);
+  e_ReleaseInput();
+
+  if not gNoSound then
+  begin
+    e_WriteLog('Releasing sound', TMsgType.Notify);
+    e_ReleaseSoundSystem();
+  end;
+end;
+
+function ProcessMessage (): Boolean;
+var
+  i, t: Integer;
+begin
+  result := sys_HandleInput();
+
+  Time := sys_GetTicks();
+  Time_Delta := Time-Time_Old;
+
+  flag := false;
+
+  if wNeedTimeReset then
+  begin
+    Frame := 0;
+    Time_Delta := 28;
+    wNeedTimeReset := false;
+  end;
+
+  g_Map_ProfilersBegin();
+  g_Mons_ProfilersBegin();
+
+  t := Time_Delta div 28;
+  if (t > 0) then
+  begin
+    flag := true;
+    for i := 1 to t do
+      Update();
+  end;
+
+  g_Map_ProfilersEnd();
+  g_Mons_ProfilersEnd();
+
+  if wLoadingQuit then
+  begin
+    g_Game_Free();
+    g_Game_Quit();
+  end;
+
+  if (gExit = EXIT_QUIT) then
+  begin
+    result := true;
+    exit;
+  end;
+
+  // Время предыдущего обновления
+  if flag then
+    Time_Old := Time - (Time_Delta mod 28);
+
+  // don't wait if VSync is on, GL already probably waits enough
+  if gLerpActors then
+    flag := (Time - Frame >= gFrameTime) or gVSync;
+
+  if flag then
+  begin
+    if gPause or (not gLerpActors) or (gState = STATE_FOLD) then
+      gLerpFactor := 1.0
+    else
+      gLerpFactor := nmin(1.0, (Time - Time_Old) / 28.0);
+    r_Game_Draw;
+    sys_Repaint;
+    Frame := Time
+  end
+  else
+    sys_Delay(1);
+
+  e_SoundUpdate();
+end;
+
+
+function SDLMain (): Integer;
+var
+  idx: Integer;
+  arg: AnsiString;
+  mdfo: TStream;
+  {$IFDEF ENABLE_HOLMES}
+  itmp: Integer;
+  valres: Word;
+  {$ENDIF}
+begin
+
+  idx := 1;
+  while (idx <= ParamCount) do
+  begin
+    arg := ParamStr(idx);
+    Inc(idx);
+    //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
+    if arg = '--jah' then g_profile_history_size := 100;
+    if arg = '--no-particles' then gpart_dbg_enabled := false;
+    if arg = '--no-los' then gmon_dbg_los_enabled := false;
+
+    if arg = '--profile-render' then g_profile_frame_draw := true;
+    if arg = '--profile-coldet' then g_profile_collision := true;
+    if arg = '--profile-los' then g_profile_los := true;
+
+    if arg = '--no-part-phys' then gpart_dbg_phys_enabled := false;
+    if arg = '--no-part-physics' then gpart_dbg_phys_enabled := false;
+    if arg = '--no-particles-phys' then gpart_dbg_phys_enabled := false;
+    if arg = '--no-particles-physics' then gpart_dbg_phys_enabled := false;
+    if arg = '--no-particle-phys' then gpart_dbg_phys_enabled := false;
+    if arg = '--no-particle-physics' then gpart_dbg_phys_enabled := false;
+
+    if arg = '--debug-input' then g_dbg_input := True;
+
+    {.$IF DEFINED(D2F_DEBUG)}
+    if arg = '--aimline' then g_dbg_aimline_on := true;
+    {.$ENDIF}
+
+{$IFDEF ENABLE_HOLMES}
+    if arg = '--holmes' then begin g_holmes_enabled := true; g_Game_SetDebugMode(); end;
+
+    if (arg = '--holmes-ui-scale') or (arg = '-holmes-ui-scale') then
+    begin
+      if (idx <= ParamCount) then
+      begin
+        if not conParseFloat(fuiRenderScale, ParamStr(idx)) then fuiRenderScale := 1.0;
+        Inc(idx);
+      end;
+    end;
+
+    if (arg = '--holmes-font') or (arg = '-holmes-font') then
+    begin
+      if (idx <= ParamCount) then
+      begin
+        itmp := 0;
+        val(ParamStr(idx), itmp, valres);
+        {$IFNDEF HEADLESS}
+        if (valres = 0) and (not g_holmes_imfunctional) then
+        begin
+          case itmp of
+            8: uiContext.font := 'win8';
+            14: uiContext.font := 'win14';
+            16: uiContext.font := 'win16';
+          end;
+        end;
+        {$ELSE}
+        // fuck off, fpc!
+        itmp := itmp;
+        valres := valres;
+        {$ENDIF}
+        Inc(idx);
+      end;
+    end;
+{$ENDIF}
+
+    if (arg = '--game-scale') or (arg = '-game-scale') then
+    begin
+      if (idx <= ParamCount) then
+      begin
+        if not conParseFloat(g_dbg_scale, ParamStr(idx)) then g_dbg_scale := 1.0;
+        Inc(idx);
+      end;
+    end;
+
+    if (arg = '--write-mapdef') or (arg = '-write-mapdef') then
+    begin
+      mdfo := createDiskFile('mapdef.txt');
+      mdfo.WriteBuffer(defaultMapDef[1], Length(defaultMapDef));
+      mdfo.Free();
+      Halt(0);
+    end;
+
+    if (arg = '--pixel-scale') or (arg = '-pixel-scale') then
+    begin
+      if (idx <= ParamCount) then
+      begin
+        if not conParseFloat(r_pixel_scale, ParamStr(idx)) then r_pixel_scale := 1.0;
+        Inc(idx);
+      end;
+    end;
+  end;
+
+  r_Window_Initialize;
+
+  Init;
+  Time_Old := sys_GetTicks();
+
+  g_Net_InitLowLevel();
+
+  // game commad line
+  if (ParamCount > 0) then g_Game_Process_Params();
+
+{$IFNDEF HEADLESS}
+  if (not gGameOn) and gAskLanguage then g_Menu_AskLanguage();
+{$ENDIF}
+
+  e_WriteLog('Entering the main loop', TMsgType.Notify);
+
+  // main loop
+  while not ProcessMessage() do begin end;
+
+  g_Net_Slist_ShutdownAll();
+
+  Release();
+
+  g_Net_DeinitLowLevel();
+  result := 0;
+end;
 
 function GetBinaryPath (): AnsiString;
   {$IFDEF LINUX}
@@ -580,6 +889,7 @@ begin
     e_InitLog(LogFileName, TWriteMode.WM_NEWFILE);
   e_InitWritelnDriver();
   e_WriteLog('Doom 2D: Forever version ' + GAME_VERSION + ' proto ' + IntToStr(NET_PROTOCOL_VER), TMsgType.Notify);
+  e_WriteLog('Build arch: ' + g_GetBuildArch(), TMsgType.Notify);
   e_WriteLog('Build date: ' + GAME_BUILDDATE + ' ' + GAME_BUILDTIME, TMsgType.Notify);
   e_WriteLog('Build hash: ' + g_GetBuildHash(), TMsgType.Notify);
   e_WriteLog('Build by: ' + g_GetBuilderName(), TMsgType.Notify);
@@ -625,6 +935,15 @@ procedure Main;
   var flexloaded: Boolean;
 {$ENDIF}
 begin
+  {$IFDEF USE_SDLMIXER}
+    conRegVar('sdl_native_music', @UseNativeMusic, 'use native midi music output when possible', 'use native midi');
+    {$IFDEF DARWIN}
+      UseNativeMusic := true; (* OSX have a good midi support, so why not? *)
+    {$ELSE}
+      UseNativeMusic := false;
+    {$ENDIF}
+  {$ENDIF}
+
   InitPath;
   InitPrep;
   e_InitInput;
index 85892570c59ceb9e2b65a5b8e8d140d148e173c1..b5139c37a19e1cf2d591309fdd62afb14340fe85 100644 (file)
@@ -384,6 +384,7 @@ var
   g_rlayer_water: Boolean = true;
   g_rlayer_fore: Boolean = true;
 
+  wNeedTimeReset: Boolean = false;
 
 procedure g_ResetDynlights ();
 procedure g_AddDynLight (x, y, radius: Integer; r, g, b, a: Single);
@@ -3619,7 +3620,7 @@ begin
       gGameOn := True;
 
       DisableCheats();
-      ResetTimer();
+      wNeedTimeReset := True;
 
       if gGameSettings.GameMode = GM_CTF then
       begin
index 7f74dc18f600bfd8e24343f0a1d98797560c9c61..e21faf5d8ffac4227e00fc4654e2cfd381d9fd3c 100644 (file)
@@ -21,7 +21,7 @@ uses
   mempool, geom,
   e_log, e_input,
   g_textures, g_basic, r_graphics, g_phys, g_grid, g_player, g_monsters,
-  g_window, g_map, g_triggers, g_items, g_game, g_panel, g_console, g_gfx,
+  g_map, g_triggers, g_items, g_game, g_panel, g_console, g_gfx,
   xprofiler,
   sdlcarcass,
   fui_common, fui_events, fui_ctls,
index bf16be8604bbb3ba5a91b4156d4a5fb23819d5c7..cc6f6862bbd5a0400dfb1d2cd94aee15a034765b 100644 (file)
@@ -43,7 +43,7 @@ var
 implementation
 
 uses
-  g_gui, g_textures, r_graphics, g_window, g_game, g_map,
+  g_gui, g_textures, r_graphics, g_game, g_map,
   g_base, g_basic, g_console, g_sound, g_gfx, g_player, g_options, g_weapons,
   e_log, SysUtils, CONFIG, g_playermodel, DateUtils,
   MAPDEF, Math, g_saveload,
index bb6f10e521e150e7a5d0e81087ee020c533fa333..9f8af0bc4210d2fb906894bbb375af157e6d63aa 100644 (file)
@@ -176,7 +176,7 @@ function GetTimerMS (): Int64;
 implementation
 
 uses
-  e_input, e_log, g_window, g_net, g_console,
+  e_input, e_log, g_net, g_console,
   g_map, g_game, g_sound, g_gui, g_menu, g_options, g_language, g_basic, r_game,
   wadreader, g_system, utils, hashtable;
 
index 661d99f6986dad84ceaab0a2f96e56d8e064b984..dc45df447807a0bf31c342d080e46b10d975cffe 100644 (file)
@@ -85,6 +85,11 @@ var
   g_dbg_scale: Single = 1.0;
   r_pixel_scale: Single = 1.0;
 
+  gwin_has_stencil: Boolean = false;
+  gwin_k8_enable_light_experiments: Boolean = false;
+  g_dbg_aimline_on: Boolean = false;
+  g_dbg_input: Boolean = False;
+
   {--- Read-only dirs ---}
   GameWAD: string;
   DataDirs: SSArray;
@@ -113,7 +118,7 @@ uses
   {$IFDEF USE_SDL2}
     SDL2,
   {$ENDIF}
-  e_log, e_input, g_console, g_window, g_sound, g_gfx, g_player, Math,
+  e_log, e_input, g_console, g_sound, g_gfx, g_player, Math,
   g_map, g_net, g_netmaster, SysUtils, CONFIG, g_game,
   g_items, wadreader, g_touch, envvars, g_system;
 
@@ -399,4 +404,6 @@ initialization
   conRegVar('g_save_stats', @gSaveStats, '', '');
   conRegVar('g_screenshot_stats', @gScreenshotStats, '', '');
   conRegVar('g_lastmap', @gsMap, '', '');
+
+  conRegVar('d_input', @g_dbg_input, '', '')
 end.
index 15711235288d6f5a968934a817677d4fed5c36d0..75775079fc244b3060310b2d9618bf7577716d35 100644 (file)
@@ -662,7 +662,7 @@ uses
   e_log, g_map, g_items, g_console, g_gfx, Math,
   g_options, g_triggers, g_menu, g_game, g_grid, e_res,
   wadreader, g_monsters, CONFIG, g_language,
-  g_net, g_netmsg, g_window,
+  g_net, g_netmsg,
   utils, xstreams;
 
 const PLR_SAVE_VERSION = 0;
index f31257236b45de2c43d6510b403ffc4d12e69a27..98d27cc1287f61af97d568de9fffb3727750dbbb 100644 (file)
@@ -17,385 +17,27 @@ unit g_window;
 
 interface
 
-uses
-  utils;
-
-function SDLMain (): Integer;
-procedure ResetTimer ();
-procedure ProcessLoading (forceUpdate: Boolean = False);
-
-var
-  gwin_has_stencil: Boolean = false;
-  gwin_k8_enable_light_experiments: Boolean = false;
-  g_dbg_aimline_on: Boolean = false;
-  g_dbg_input: Boolean = False;
+  procedure ProcessLoading (forceUpdate: Boolean=false);
 
 implementation
 
-uses
-{$IFDEF WINDOWS}Windows,{$ENDIF}
-{$IFDEF ENABLE_HOLMES}
-  g_holmes, sdlcarcass, fui_ctls,
-{$ENDIF}
-  SysUtils, Classes, MAPDEF, Math, r_graphics,
-  r_window, e_log, e_res, envvars, r_game,
-  g_console, r_console, e_input, g_options, g_game,
-  g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net,
-  g_map, g_gfx, g_monsters, xprofiler,
-  g_touch, g_gui, g_system, g_netmaster;
-
-var
-  Time, Time_Delta, Time_Old: Int64;
-  Frame: Int64;
-  flag: Boolean;
-  wNeedTimeReset: Boolean = false;
-  wLoadingQuit: Boolean = false;
-
-  {$IFDEF USE_SDLMIXER}
-    UseNativeMusic: Boolean;
-  {$ENDIF}
-
-procedure Update ();
-begin
-  // remember old mobj positions, prepare for update
-  g_Game_PreUpdate();
-  // server: receive client commands for new frame
-  // client: receive game state changes from server
-       if (NetMode = NET_SERVER) then g_Net_Host_Update()
-  else if (NetMode = NET_CLIENT) then g_Net_Client_Update();
-  // think
-  g_Game_Update();
-  // server: send any accumulated outgoing data to clients
-  if NetMode = NET_SERVER then g_Net_Flush();
-end;
-
-
-procedure Draw ();
-begin
-  r_Game_Draw();
-end;
-
-
-procedure Init();
-  {$IFDEF USE_SDLMIXER}
-    var timiditycfg: AnsiString;
-    var oldcwd, newcwd: RawByteString;
-  {$ENDIF}
-  var NoSound: Boolean;
-begin
-  Randomize;
-
-{$IFDEF HEADLESS}
- {$IFDEF USE_SDLMIXER}
-  NoSound := False; // hope env has set SDL_AUDIODRIVER to dummy
- {$ELSE}
-  NoSound := True; // FMOD backend will sort it out
- {$ENDIF}
-{$ELSE}
-  NoSound := False;
-{$ENDIF}
-
-  g_Touch_Init;
-
-(*
-  if (e_JoysticksAvailable > 0) then
-    e_WriteLog('Input: Joysticks available.', TMsgType.Notify)
-  else
-    e_WriteLog('Input: No Joysticks.', TMsgType.Notify);
-*)
-
-  if gNoSound = false then
-  begin
-    e_WriteLog('Initializing sound system', TMsgType.Notify);
-    {$IFDEF USE_SDLMIXER}
-      newcwd := '';
-      if UseNativeMusic then
-        SetEnvVar('SDL_NATIVE_MUSIC', '1');
-      timiditycfg := GetEnvironmentVariable('TIMIDITY_CFG');
-      if timiditycfg = '' then
-      begin
-        timiditycfg := 'timidity.cfg';
-        if e_FindResource(ConfigDirs, timiditycfg) OR e_FindResource(DataDirs, timiditycfg) then
-        begin
-          timiditycfg := ExpandFileName(timiditycfg);
-          newcwd := ExtractFileDir(timiditycfg);
-          SetEnvVar('TIMIDITY_CFG', timiditycfg);
-        end
-        else
-          timiditycfg := '';
-      end;
-      e_LogWritefln('TIMIDITY_CFG = "%s"', [timiditycfg]);
-      e_LogWritefln('SDL_NATIVE_MUSIC = "%s"', [GetEnvironmentVariable('SDL_NATIVE_MUSIC')]);
-    {$ENDIF}
-    e_InitSoundSystem(NoSound);
-    {$IFDEF USE_SDLMIXER}
-      if e_TimidityDecoder and (newcwd <> '') then
-      begin
-        (* HACK: Set CWD to load GUS patches relatively to cfg file. *)
-        (*       CWD not restored after sound init because timidity  *)
-        (*       store relative pathes internally and load patches   *)
-        (*       later. I hope game never relies on CWD.             *)
-        oldcwd := '';
-        GetDir(0, oldcwd);
-        ChDir(newcwd);
-        e_logwritefln('WARNING: USED TIMIDITY CONFIG HACK, CWD SWITCHED "%s" -> "%s"', [oldcwd, newcwd]);
-      end;
-    {$ENDIF}
-  end;
-
-  e_WriteLog('Init game', TMsgType.Notify);
-  g_Game_Init();
-
-//  FillChar(charbuff, sizeof(charbuff), ' ');
-end;
-
-procedure Release();
-begin
-  e_WriteLog('Releasing engine', TMsgType.Notify);
-  e_ReleaseEngine();
-
-  e_WriteLog('Releasing input', TMsgType.Notify);
-  e_ReleaseInput();
-
-  if not gNoSound then
-  begin
-    e_WriteLog('Releasing sound', TMsgType.Notify);
-    e_ReleaseSoundSystem();
-  end;
-end;
-
-procedure ResetTimer ();
-begin
-  wNeedTimeReset := true;
-end;
-
-procedure ProcessLoading (forceUpdate: Boolean=false);
-begin
-  if sys_HandleInput() = True then
-    Exit;
-
-{$IFNDEF HEADLESS}
-  r_Window_DrawLoading(forceUpdate);
-{$ENDIF}
-
-  e_SoundUpdate();
-
-  // TODO: At the moment, I left here only host network processing, because the client code must
-  // handle network events on its own. Otherwise separate network cases that use different calls to
-  // enet_host_service() WILL lose their packets (for example, resource downloading). So they have
-  // to handle everything by themselves. But in general, this MUST be removed completely, since
-  // updating the window should never affect the network. Use single enet_host_service(), period.
-  if NetMode = NET_SERVER
-    then g_Net_Host_Update();
-end;
-
-
-function ProcessMessage (): Boolean;
-var
-  i, t: Integer;
-begin
-  result := sys_HandleInput();
-
-  Time := sys_GetTicks();
-  Time_Delta := Time-Time_Old;
-
-  flag := false;
-
-  if wNeedTimeReset then
-  begin
-    Frame := 0;
-    Time_Delta := 28;
-    wNeedTimeReset := false;
-  end;
-
-  g_Map_ProfilersBegin();
-  g_Mons_ProfilersBegin();
-
-  t := Time_Delta div 28;
-  if (t > 0) then
-  begin
-    flag := true;
-    for i := 1 to t do
-      Update();
-  end;
-
-  g_Map_ProfilersEnd();
-  g_Mons_ProfilersEnd();
-
-  if wLoadingQuit then
-  begin
-    g_Game_Free();
-    g_Game_Quit();
-  end;
-
-  if (gExit = EXIT_QUIT) then
-  begin
-    result := true;
-    exit;
-  end;
-
-  // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
-  if flag then
-    Time_Old := Time - (Time_Delta mod 28);
+  uses e_sound, g_system, g_net, r_window;
 
-  // don't wait if VSync is on, GL already probably waits enough
-  if gLerpActors then
-    flag := (Time - Frame >= gFrameTime) or gVSync;
-
-  if flag then
+  procedure ProcessLoading (forceUpdate: Boolean = False);
   begin
-    if gPause or (not gLerpActors) or (gState = STATE_FOLD) then
-      gLerpFactor := 1.0
-    else
-      gLerpFactor := nmin(1.0, (Time - Time_Old) / 28.0);
-    Draw;
-    sys_Repaint;
-    Frame := Time
-  end
-  else
-    sys_Delay(1);
-
-  e_SoundUpdate();
-end;
-
-function SDLMain (): Integer;
-var
-  idx: Integer;
-  arg: AnsiString;
-  mdfo: TStream;
-  {$IFDEF ENABLE_HOLMES}
-  itmp: Integer;
-  valres: Word;
-  {$ENDIF}
-begin
-
-  idx := 1;
-  while (idx <= ParamCount) do
-  begin
-    arg := ParamStr(idx);
-    Inc(idx);
-    if arg = '--jah' then g_profile_history_size := 100;
-    if arg = '--no-particles' then gpart_dbg_enabled := false;
-    if arg = '--no-los' then gmon_dbg_los_enabled := false;
-
-    if arg = '--profile-render' then g_profile_frame_draw := true;
-    if arg = '--profile-coldet' then g_profile_collision := true;
-    if arg = '--profile-los' then g_profile_los := true;
-
-    if arg = '--no-part-phys' then gpart_dbg_phys_enabled := false;
-    if arg = '--no-part-physics' then gpart_dbg_phys_enabled := false;
-    if arg = '--no-particles-phys' then gpart_dbg_phys_enabled := false;
-    if arg = '--no-particles-physics' then gpart_dbg_phys_enabled := false;
-    if arg = '--no-particle-phys' then gpart_dbg_phys_enabled := false;
-    if arg = '--no-particle-physics' then gpart_dbg_phys_enabled := false;
-
-    if arg = '--debug-input' then g_dbg_input := True;
-
-    {.$IF DEFINED(D2F_DEBUG)}
-    if arg = '--aimline' then g_dbg_aimline_on := true;
-    {.$ENDIF}
-
-{$IFDEF ENABLE_HOLMES}
-    if arg = '--holmes' then begin g_holmes_enabled := true; g_Game_SetDebugMode(); end;
-
-    if (arg = '--holmes-ui-scale') or (arg = '-holmes-ui-scale') then
+    if sys_HandleInput() = False then
     begin
-      if (idx <= ParamCount) then
-      begin
-        if not conParseFloat(fuiRenderScale, ParamStr(idx)) then fuiRenderScale := 1.0;
-        Inc(idx);
-      end;
-    end;
-
-    if (arg = '--holmes-font') or (arg = '-holmes-font') then
-    begin
-      if (idx <= ParamCount) then
-      begin
-        itmp := 0;
-        val(ParamStr(idx), itmp, valres);
-        {$IFNDEF HEADLESS}
-        if (valres = 0) and (not g_holmes_imfunctional) then
-        begin
-          case itmp of
-            8: uiContext.font := 'win8';
-            14: uiContext.font := 'win14';
-            16: uiContext.font := 'win16';
-          end;
-        end;
-        {$ELSE}
-        // fuck off, fpc!
-        itmp := itmp;
-        valres := valres;
-        {$ENDIF}
-        Inc(idx);
-      end;
-    end;
-{$ENDIF}
-
-    if (arg = '--game-scale') or (arg = '-game-scale') then
-    begin
-      if (idx <= ParamCount) then
-      begin
-        if not conParseFloat(g_dbg_scale, ParamStr(idx)) then g_dbg_scale := 1.0;
-        Inc(idx);
-      end;
-    end;
-
-    if (arg = '--write-mapdef') or (arg = '-write-mapdef') then
-    begin
-      mdfo := createDiskFile('mapdef.txt');
-      mdfo.WriteBuffer(defaultMapDef[1], Length(defaultMapDef));
-      mdfo.Free();
-      Halt(0);
-    end;
-
-    if (arg = '--pixel-scale') or (arg = '-pixel-scale') then
-    begin
-      if (idx <= ParamCount) then
-      begin
-        if not conParseFloat(r_pixel_scale, ParamStr(idx)) then r_pixel_scale := 1.0;
-        Inc(idx);
-      end;
-    end;
+      {$IFNDEF HEADLESS}
+        r_Window_DrawLoading(forceUpdate);
+      {$ENDIF}
+      e_SoundUpdate();
+      // TODO: At the moment, I left here only host network processing, because the client code must
+      // handle network events on its own. Otherwise separate network cases that use different calls to
+      // enet_host_service() WILL lose their packets (for example, resource downloading). So they have
+      // to handle everything by themselves. But in general, this MUST be removed completely, since
+      // updating the window should never affect the network. Use single enet_host_service(), period.
+      if NetMode = NET_SERVER then g_Net_Host_Update();
+    end
   end;
 
-  r_Window_Initialize;
-
-  Init;
-  Time_Old := sys_GetTicks();
-
-  g_Net_InitLowLevel();
-
-  // Êîìàíäíàÿ ñòðîêà
-  if (ParamCount > 0) then g_Game_Process_Params();
-
-{$IFNDEF HEADLESS}
-  // Çàïðîñ ÿçûêà
-  if (not gGameOn) and gAskLanguage then g_Menu_AskLanguage();
-{$ENDIF}
-
-  e_WriteLog('Entering the main loop', TMsgType.Notify);
-
-  // main loop
-  while not ProcessMessage() do begin end;
-
-  g_Net_Slist_ShutdownAll();
-
-  Release();
-
-  g_Net_DeinitLowLevel();
-  result := 0;
-end;
-
-
-initialization
-{$IFDEF USE_SDLMIXER}
-  conRegVar('sdl_native_music', @UseNativeMusic, 'use native midi music output when possible', 'use native midi');
-  {$IFDEF DARWIN}
-    UseNativeMusic := true; (* OSX have a good midi support, so why not? *)
-  {$ELSE}
-    UseNativeMusic := false;
-  {$ENDIF}
-{$ENDIF}
-  conRegVar('d_input', @g_dbg_input, '', '')
 end.
index 9b5d96718405dfd8f0fa9dda2598088bf3101f22..641544f8e5978e35226f063bb8d953766c18725f 100644 (file)
@@ -33,7 +33,7 @@ implementation
     g_system, g_touch,
     MAPDEF, xprofiler, utils, wadreader,
     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_language, g_console, g_menu, g_triggers, g_player, g_options, g_monsters, g_map, g_panel,
     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, r_netmaster, r_player
   ;
index bf7ea938cb88ab83d9a15f036efe5d5484281b07..99b338cdc92f3d610c22a7d555c46c75f3070854 100644 (file)
@@ -52,7 +52,7 @@ implementation
     SysUtils, SDL, Math,
     {$INCLUDE ../nogl/noGLuses.inc}
     e_log, r_graphics, e_input, e_sound,
-    g_options, g_window, g_console, g_game, g_menu, g_gui, g_basic;
+    g_options, g_console, g_game, g_menu, g_gui, g_basic;
 
   const
     GameTitle = 'Doom 2D: Forever (SDL 1.2, %s, %s)';
index 95c3aca8151d658c07d282c33dd6a9eea609785c..bf44ceaaa23d956e52107e5a6c18c16ccc305625 100644 (file)
@@ -49,7 +49,7 @@ implementation
     {$IFDEF ENABLE_HOLMES}
       g_holmes, sdlcarcass, fui_ctls,
     {$ENDIF}
-    g_touch, g_options, g_window, g_console, g_game, g_menu, g_gui, g_basic;
+    g_touch, g_options, g_console, g_game, g_menu, g_gui, g_basic;
 
   const
     GameTitle = 'Doom 2D: Forever (SDL 2, %s)';
index 12a46645989b8d016dd6cc056c3aeab61e4ad935..629ca3a69fde4a62f866d0bcf140f2ba131f3190 100644 (file)
@@ -36,7 +36,7 @@ implementation
 
   uses
     SysUtils,
-    e_log, r_graphics, e_input, g_options, g_game, g_gui, g_weapons, g_console, g_window;
+    e_log, r_graphics, e_input, g_options, g_game, g_gui, g_weapons, g_console;
 
   var
     angleFire: Boolean;