DEADSOFTWARE

render: completely remove opengl calls form game code
[d2df-sdl.git] / src / game / g_main.pas
index 9fadc1beddc6e0c68f2e36ae6ecb39f3e0693985..3da02c2a7969c7b3dcba276fafe2e44dcce79b0e 100644 (file)
@@ -44,13 +44,15 @@ var
   CacheDirs: SSArray;
   ConfigDirs: SSArray;
   ScreenshotDirs: SSArray;
+  StatsDirs: SSArray;
   MapDownloadDirs: SSArray;
   WadDownloadDirs: SSArray;
 
+  GameWADName: string = 'GAME';
+
 implementation
 
 uses
-{$INCLUDE ../nogl/noGLuses.inc}
 {$IFDEF ENABLE_HOLMES}
   g_holmes, sdlcarcass, fui_ctls, fui_wadread, fui_style, fui_gfx_gl,
 {$ENDIF}
@@ -64,11 +66,11 @@ uses
   SDL2,
 {$ENDIF}
   wadreader, e_log, g_window,
-  e_graphics, e_input, g_game, g_console, g_gui,
+  r_graphics, e_input, g_game, g_console, g_gui,
   e_sound, g_options, g_sound, g_player, g_basic,
   g_weapons, SysUtils, g_triggers, MAPDEF, g_map, e_res,
   g_menu, g_language, g_net, g_touch, g_system, g_res_downloader,
-  conbuf, envvars,
+  conbuf, envvars, r_game,
   xparser;
 
 
@@ -345,6 +347,7 @@ begin
         AddDir(MapDownloadDirs, e_CatPath(rwdir, 'maps/downloads'));
         AddDir(WadDownloadDirs, e_CatPath(rwdir, 'wads/downloads'));
         AddDir(ScreenshotDirs, e_CatPath(rwdir, 'screenshots'));
+        AddDir(StatsDirs, e_CatPath(rwdir, 'stats'));
         (* RO *)
         AddDir(DataDirs, e_CatPath(rwdir, 'data'));
         AddDir(ModelDirs, e_CatPath(rwdir, 'data/models'));
@@ -363,6 +366,16 @@ begin
         AddDir(MapDirs, e_CatPath(rodir, 'maps'));
         AddDir(WadDirs, e_CatPath(rodir, 'wads'));
       end;
+    '--game-wad':
+      begin
+        Inc(i);
+        GameWADName := ParamStr(i);
+      end;
+    '--config':
+      begin
+        Inc(i);
+        gConfigScript := ParamStr(i);
+      end;
     end;
     Inc(i)
   end;
@@ -370,7 +383,7 @@ begin
   // prefer bin dir if it writable and contains game.wad
   if forceBinDir = false then
   begin
-    if findDiskWad(binPath + 'data' + '/' + 'GAME') <> '' then
+    if findDiskWad(binPath + 'data' + '/' + GameWADName) <> '' then
       if e_CanCreateFilesAt(binPath) then
         forceBinDir := true
   end;
@@ -392,6 +405,7 @@ begin
   AddDef(MapDownloadDirs, rwdirs, 'maps/downloads');
   AddDef(WadDownloadDirs, rwdirs, 'wads/downloads');
   AddDef(ScreenshotDirs, rwdirs, 'screenshots');
+  AddDef(StatsDirs, rwdirs, 'stats');
 
   for i := 0 to High(MapDirs) do
     AddDir(AllMapDirs, MapDirs[i]);
@@ -411,6 +425,10 @@ begin
       {$ENDIF}
     end
   end;
+  
+  // HACK: ensure the screenshots folder also has a stats subfolder in it
+  rwdir := e_GetWriteableDir(ScreenshotDirs, false);
+  if rwdir <> '' then CreateDir(rwdir + '/stats');
 end;
 
 procedure InitPrep;
@@ -424,10 +442,9 @@ begin
   {$ENDIF}
   for i := 1 to ParamCount do
   begin
-    if (ParamStr(i) = '--con-stdout') then
-    begin
-      conbufDumpToStdOut := true;
-      break
+    case ParamStr(i) of
+      '--con-stdout': conbufDumpToStdOut := true;
+      '--no-fbo': glRenderToFBO := false;
     end
   end;
 
@@ -436,6 +453,8 @@ begin
   e_InitWritelnDriver();
   e_WriteLog('Doom 2D: Forever version ' + GAME_VERSION + ' proto ' + IntToStr(NET_PROTOCOL_VER), 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);
 
   e_LogWritefln('Force bin dir: %s', [forceBinDir], TMsgType.Notify);
   e_LogWritefln('BINARY PATH: [%s]', [binPath], TMsgType.Notify);
@@ -451,16 +470,22 @@ begin
   PrintDirs('CacheDirs', CacheDirs);
   PrintDirs('ConfigDirs', ConfigDirs);
   PrintDirs('ScreenshotDirs', ScreenshotDirs);
+  PrintDirs('StatsDirs', StatsDirs);
   PrintDirs('MapDownloadDirs', MapDownloadDirs);
   PrintDirs('WadDownloadDirs', WadDownloadDirs);
 
-  GameWAD := e_FindWad(DataDirs, 'GAME');
+  GameWAD := e_FindWad(DataDirs, GameWADName);
   if GameWad = '' then
   begin
-    e_WriteLog('GAME.WAD not installed?', TMsgType.Fatal);
+    e_WriteLog('WAD ' + GameWADName + ' not found in data directories.', TMsgType.Fatal);
     {$IF DEFINED(USE_SDL2) AND NOT DEFINED(HEADLESS)}
       if forceBinDir = false then
-        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 'Doom 2D Forever', 'GAME.WAD not installed?', nil);
+        SDL_ShowSimpleMessageBox(
+          SDL_MESSAGEBOX_ERROR, 
+          'Doom 2D Forever',
+          PChar('WAD ' + GameWADName + ' not found in data directories.'),
+          nil
+        );
     {$ENDIF}
     e_DeinitLog;
     Halt(1);
@@ -481,27 +506,18 @@ procedure Main();
 {$IFDEF ENABLE_HOLMES}
   var flexloaded: Boolean;
 {$ENDIF}
-  var s: AnsiString;
 begin
   InitPath;
   InitPrep;
   e_InitInput;
   sys_Init;
 
-  s := CONFIG_FILENAME;
-  if e_FindResource(ConfigDirs, s) = true then
-  begin
-    g_Options_Read(s)
-  end
-  else
-  begin
-    g_Options_SetDefault;
-    g_Options_SetDefaultVideo
-  end;
-  if sys_SetDisplayMode(gScreenWidth, gScreenHeight, gBPP, gFullScreen) = False then
+  g_Options_SetDefault;
+  g_Options_SetDefaultVideo;
+  g_Console_SysInit;
+  if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = False then
     raise Exception.Create('Failed to set videomode on startup.');
 
-  g_Console_SysInit;
   e_WriteLog(gLanguage, TMsgType.Notify);
   g_Language_Set(gLanguage);
 
@@ -570,6 +586,7 @@ begin
     if assigned(oglDeinitCB) then oglDeinitCB;
   {$ENDIF}
 
+  g_Console_WriteGameConfig;
   sys_Final;
 end;
 
@@ -629,13 +646,22 @@ end;
 
 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
-  g_Game_Draw();
+  r_Game_Draw();
 end;