summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: cd0c726)
raw | patch | inline | side by side (parent: cd0c726)
author | FGSFDSFGS <derp.primus@gmail.com> | |
Tue, 12 Apr 2016 19:32:53 +0000 (22:32 +0300) | ||
committer | FGSFDSFGS <derp.primus@gmail.com> | |
Fri, 15 Apr 2016 19:48:11 +0000 (22:48 +0300) |
12 files changed:
build_headless.bat | [new file with mode: 0644] | patch | blob |
src/engine/e_graphics.pas | patch | blob | history | |
src/engine/e_log.pas | patch | blob | history | |
src/engine/e_sound_fmod.inc | patch | blob | history | |
src/engine/e_sound_sdl.inc | patch | blob | history | |
src/engine/e_textures.pas | patch | blob | history | |
src/game/Doom2DF.dpr | patch | blob | history | |
src/game/g_console.pas | patch | blob | history | |
src/game/g_game.pas | patch | blob | history | |
src/game/g_main.pas | patch | blob | history | |
src/game/g_sound.pas | patch | blob | history | |
src/game/g_window.pas | patch | blob | history |
diff --git a/build_headless.bat b/build_headless.bat
--- /dev/null
+++ b/build_headless.bat
@@ -0,0 +1,5 @@
+@echo off
+cd "./src/game"
+fpc -dUSE_FMOD -dHEADLESS -MDELPHI -O2 -FE../../bin -FU../../tmp -oDoom2DF_H.exe Doom2DF.dpr
+cd ".."
+pause
\ No newline at end of file
index 67cdb6567956152e75c79aefe4aed4acbfba3601..43123121a942c5241c0d16fb2e8d8bad6aa2ca50 100644 (file)
procedure e_Clear(); overload;
procedure e_EndRender();
-procedure e_SaveGLContext();
-procedure e_RestoreGLContext();
-
function e_GetGamma(win: PSDL_Window): Byte;
procedure e_SetGamma(win: PSDL_Window;Gamma: Byte);
var
e_Colors: TRGB;
+ e_NoGraphics: Boolean = False;
implementation
//------------------------------------------------------------------
procedure e_InitGL();
begin
- glDisable(GL_DEPTH_TEST);
- glEnable(GL_SCISSOR_TEST);
+ if e_NoGraphics then
+ begin
+ e_DummyTextures := True;
+ Exit;
+ end;
e_Colors.R := 255;
e_Colors.G := 255;
e_Colors.B := 255;
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_SCISSOR_TEST);
glClearColor(0, 0, 0, 0);
end;
mat: Array [0..15] of GLDouble;
begin
+ if e_NoGraphics then Exit;
glLoadIdentity();
glScissor(X, Y, Width, Height);
glViewport(X, Y, Width, Height);
begin
w := e_Textures[ID].Width;
h := e_Textures[ID].Height;
- data := GetMemory(w*h*4);
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, e_Textures[ID].tx.id);
- glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
Result.Y := 0;
Result.X := 0;
Result.Width := w;
Result.Height := h;
+
+ if e_NoGraphics then Exit;
+
+ data := GetMemory(w*h*4);
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, e_Textures[ID].tx.id);
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
for y := h-1 downto 0 do
begin
var
u, v: Single;
begin
+ if e_NoGraphics then Exit;
glColor4ub(e_Colors.R, e_Colors.G, e_Colors.B, 255);
if (Alpha > 0) or (AlphaChannel) or (Blending) then
@@ -491,6 +499,7 @@ procedure e_DrawSize(ID: DWORD; X, Y: Integer; Alpha: Byte; AlphaChannel: Boolea
var
u, v: Single;
begin
+ if e_NoGraphics then Exit;
glColor4ub(e_Colors.R, e_Colors.G, e_Colors.B, 255);
if (Alpha > 0) or (AlphaChannel) or (Blending) then
var
u, v: Single;
begin
+ if e_NoGraphics then Exit;
glColor4ub(e_Colors.R, e_Colors.G, e_Colors.B, 255);
if (Alpha > 0) or (AlphaChannel) or (Blending) then
X2, Y2, dx, w, h: Integer;
u, v: Single;
begin
+ if e_NoGraphics then Exit;
glColor4ub(e_Colors.R, e_Colors.G, e_Colors.B, 255);
if (Alpha > 0) or (AlphaChannel) or (Blending) then
@@ -660,6 +671,7 @@ procedure e_DrawAdv(ID: DWORD; X, Y: Integer; Alpha: Byte; AlphaChannel: Boolean
var
u, v: Single;
begin
+ if e_NoGraphics then Exit;
glColor4ub(e_Colors.R, e_Colors.G, e_Colors.B, 255);
if (Alpha > 0) or (AlphaChannel) or (Blending) then
procedure e_DrawPoint(Size: Byte; X, Y: Integer; Red, Green, Blue: Byte);
begin
+ if e_NoGraphics then Exit;
glDisable(GL_TEXTURE_2D);
glColor3ub(Red, Green, Blue);
glPointSize(Size);
@@ -766,6 +779,7 @@ procedure e_DrawQuad(X1, Y1, X2, Y2: Integer; Red, Green, Blue: Byte; Alpha: Byt
var
nX1, nY1, nX2, nY2: Integer;
begin
+ if e_NoGraphics then Exit;
// Only top-left/bottom-right quad
if X1 > X2 then
begin
procedure e_DrawFillQuad(X1, Y1, X2, Y2: Integer; Red, Green, Blue, Alpha: Byte;
Blending: TBlending = B_NONE);
begin
+ if e_NoGraphics then Exit;
if (Alpha > 0) or (Blending <> B_NONE) then
glEnable(GL_BLEND)
else
procedure e_DrawLine(Width: Byte; X1, Y1, X2, Y2: Integer; Red, Green, Blue: Byte; Alpha: Byte = 0);
begin
+ if e_NoGraphics then Exit;
// Pixel-perfect lines
if Width = 1 then
e_LineCorrection(X1, Y1, X2, Y2);
//------------------------------------------------------------------
procedure e_DeleteTexture(ID: DWORD);
begin
- glDeleteTextures(1, @e_Textures[ID].tx.id);
+ if not e_NoGraphics then
+ glDeleteTextures(1, @e_Textures[ID].tx.id);
e_Textures[ID].tx.id := 0;
e_Textures[ID].Width := 0;
e_Textures[ID].Height := 0;
procedure e_BeginRender();
begin
+ if e_NoGraphics then Exit;
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.0);
end;
procedure e_Clear(Mask: TGLbitfield; Red, Green, Blue: Single); overload;
begin
- glClearColor(Red, Green, Blue, 0);
- glClear(Mask);
+ if e_NoGraphics then Exit;
+ glClearColor(Red, Green, Blue, 0);
+ glClear(Mask);
end;
procedure e_Clear(); overload;
begin
- glClearColor(0, 0, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT);
+ if e_NoGraphics then Exit;
+ glClearColor(0, 0, 0, 0);
+ glClear(GL_COLOR_BUFFER_BIT);
end;
procedure e_EndRender();
begin
+ if e_NoGraphics then Exit;
glPopMatrix();
end;
procedure e_MakeScreenshot(FileName: String; Width, Height: Word);
begin
+ if e_NoGraphics then Exit;
end;
{type
A, B: double;
i, j: integer;
begin
+ Result := 0;
+ if e_NoGraphics then Exit;
rgb[0] := 1.0;
rgb[1] := 1.0;
rgb[2] := 1.0;
r: double;
g: double;
begin
+ if e_NoGraphics then Exit;
g := (100 - Gamma)*(2.7 - 0.23)/100 + 0.23;
for i := 0 to 255 do
var
a: Integer;
begin
+ if e_NoGraphics then Exit;
if Text = '' then Exit;
if e_CharFonts = nil then Exit;
if Integer(FontID) > High(e_CharFonts) then Exit;
a: Integer;
c: TRGB;
begin
+ if e_NoGraphics then Exit;
if Text = '' then Exit;
if e_CharFonts = nil then Exit;
if Integer(FontID) > High(e_CharFonts) then Exit;
tc, c: TRGB;
w, h: Word;
begin
+ if e_NoGraphics then Exit;
if Text = '' then Exit;
if e_CharFonts = nil then Exit;
if Integer(FontID) > High(e_CharFonts) then Exit;
cx, cy : real;
i, id: DWORD;
begin
+ if e_NoGraphics then Exit;
e_WriteLog('Creating texture font...', MSG_NOTIFY);
id := DWORD(-1);
FontID := id;
end;
-procedure e_TextureFontBuildInPlace(id: DWORD);
-var
- loop1 : GLuint;
- cx, cy : real;
- XCount, YCount, Space: Integer;
- {i,} Tex: DWORD;
-begin
- with e_TextureFonts[id] do
- begin
- Base := glGenLists(XC*YC);
- TextureID := e_Textures[Texture].tx.id;
- XCount := XC;
- YCount := YC;
- Space := SPC;
- Tex := Texture;
- end;
-
- glBindTexture(GL_TEXTURE_2D, e_Textures[Tex].tx.id);
- for loop1 := 0 to XCount*YCount-1 do
- begin
- cx := (loop1 mod XCount)/XCount;
- cy := (loop1 div YCount)/YCount;
-
- glNewList(e_TextureFonts[id].Base+loop1, GL_COMPILE);
- glBegin(GL_QUADS);
- glTexCoord2f(cx, 1.0-cy-1/YCount);
- glVertex2d(0, e_Textures[Tex].Height div YCount);
-
- glTexCoord2f(cx+1/XCount, 1.0-cy-1/YCount);
- glVertex2i(e_Textures[Tex].Width div XCount, e_Textures[Tex].Height div YCount);
-
- glTexCoord2f(cx+1/XCount, 1.0-cy);
- glVertex2i(e_Textures[Tex].Width div XCount, 0);
-
- glTexCoord2f(cx, 1.0-cy);
- glVertex2i(0, 0);
- glEnd();
- glTranslated((e_Textures[Tex].Width div XCount)+Space, 0, 0);
- glEndList();
- end;
-end;
-
procedure e_TextureFontKill(FontID: DWORD);
begin
+ if e_NoGraphics then Exit;
glDeleteLists(e_TextureFonts[FontID].Base, 256);
e_TextureFonts[FontID].Base := 0;
end;
procedure e_TextureFontPrint(X, Y: GLint; Text: string; FontID: DWORD);
begin
+ if e_NoGraphics then Exit;
if Integer(FontID) > High(e_TextureFonts) then Exit;
if Text = '' then Exit;
// god forgive me for this, but i cannot figure out how to do it without lists
procedure e_TextureFontPrintChar(X, Y: Integer; Ch: Char; FontID: DWORD; Shadow: Boolean = False);
begin
+ if e_NoGraphics then Exit;
glPushMatrix;
if Shadow then
tc, c: TRGB;
w: Word;
begin
+ if e_NoGraphics then Exit;
if Text = '' then Exit;
if e_TextureFonts = nil then Exit;
if Integer(FontID) > High(e_TextureFonts) then Exit;
procedure e_TextureFontPrintEx(X, Y: GLint; Text: string; FontID: DWORD; Red, Green,
Blue: Byte; Scale: Single; Shadow: Boolean = False);
begin
+ if e_NoGraphics then Exit;
if Text = '' then Exit;
glPushMatrix;
procedure e_TextureFontGetSize(ID: DWORD; var CharWidth, CharHeight: Byte);
begin
+ CharWidth := 16;
+ CharHeight := 16;
+ if e_NoGraphics then Exit;
if Integer(ID) > High(e_TextureFonts) then
Exit;
CharWidth := e_TextureFonts[ID].CharWidth;
var
i: integer;
begin
+ if e_NoGraphics then Exit;
if e_TextureFonts = nil then Exit;
for i := 0 to High(e_TextureFonts) do
e_TextureFonts := nil;
end;
-procedure e_SaveGLContext();
-var
- PxLen: Cardinal;
- i: Integer;
-begin
- e_WriteLog('Backing up GL context:', MSG_NOTIFY);
-
- glPushAttrib(GL_ALL_ATTRIB_BITS);
- glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
-
- if e_Textures <> nil then
- begin
- e_WriteLog(' Backing up textures...', MSG_NOTIFY);
- SetLength(e_SavedTextures, Length(e_Textures));
- for i := Low(e_Textures) to High(e_Textures) do
- begin
- e_SavedTextures[i].Pixels := nil;
- if e_Textures[i].Width > 0 then
- begin
- with e_SavedTextures[i] do
- begin
- PxLen := 3;
- if e_Textures[i].Fmt = GL_RGBA then Inc(PxLen);
- Pixels := GetMem(PxLen * e_Textures[i].Width * e_Textures[i].Height);
- glBindTexture(GL_TEXTURE_2D, e_Textures[i].tx.id);
- glGetTexImage(GL_TEXTURE_2D, 0, e_Textures[i].Fmt, GL_UNSIGNED_BYTE, Pixels);
- glBindTexture(GL_TEXTURE_2D, 0);
- OldID := e_Textures[i].tx.id;
- TexId := i;
- end;
- end;
- end;
- end;
-
- if e_TextureFonts <> nil then
- begin
- e_WriteLog(' Releasing texturefonts...', MSG_NOTIFY);
- for i := 0 to High(e_TextureFonts) do
- if e_TextureFonts[i].Base <> 0 then
- begin
- glDeleteLists(e_TextureFonts[i].Base, 256);
- e_TextureFonts[i].Base := 0;
- end;
- end;
-end;
-
-procedure e_RestoreGLContext();
-var
- //GLID: GLuint;
- i: Integer;
-begin
- e_WriteLog('Restoring GL context:', MSG_NOTIFY);
-
- glPopClientAttrib();
- glPopAttrib();
-
- if e_SavedTextures <> nil then
- begin
- e_WriteLog(' Regenerating textures...', MSG_NOTIFY);
- for i := Low(e_SavedTextures) to High(e_SavedTextures) do
- begin
- if e_SavedTextures[i].Pixels <> nil then
- with e_SavedTextures[i] do
- begin
- CreateTexture(e_Textures[TexID].tx, e_Textures[TexID].Width, e_Textures[TexID].Height, e_Textures[TexID].Fmt, Pixels);
- //GLID := CreateTexture(e_Textures[TexID].Width, e_Textures[TexID].Height, e_Textures[TexID].Fmt, Pixels);
- //e_Textures[TexID].tx := GLID;
- FreeMem(Pixels);
- end;
- end;
- end;
-
- if e_TextureFonts <> nil then
- begin
- e_WriteLog(' Regenerating texturefonts...', MSG_NOTIFY);
- for i := Low(e_TextureFonts) to High(e_TextureFonts) do
- with e_TextureFonts[i] do
- begin
- TextureID := e_Textures[Texture].tx.id;
- Base := 0;
- e_TextureFontBuildInPlace(i);
- end;
- end;
-
- SetLength(e_SavedTextures, 0);
-end;
-
-
function _RGB(Red, Green, Blue: Byte): TRGB;
begin
Result.R := Red;
diff --git a/src/engine/e_log.pas b/src/engine/e_log.pas
index e82bfb41149a0533db9173023bafbfe3cce249d2..e524c1a1a9f522e70191ef1543af9d132912e254 100644 (file)
--- a/src/engine/e_log.pas
+++ b/src/engine/e_log.pas
WriteTime: Boolean = True);
function DecodeIPV4(ip: LongWord): string;
+var
+ e_WriteToStdOut: Boolean = False;
+
implementation
var
var
LogFile: TextFile;
Prefix: ShortString = '';
+ OutStr: String;
begin
if FileName = '' then Exit;
MSG_NOTIFY: Prefix := '***';
end;
if WriteTime then
- Writeln(LogFile, '['+TimeToStr(Time)+'] '+Prefix+' '+TextLine)
+ OutStr := '['+TimeToStr(Time)+'] '+Prefix+' '+TextLine
else
- Writeln(LogFile, Prefix+' '+TextLine);
+ OutStr := Prefix+' '+TextLine;
+ Writeln(LogFile, OutStr);
+ if e_WriteToStdOut then
+ Writeln(OutStr);
finally
Close(LogFile);
end;
index 123db2c84975599d4e71bd124b1cee77371b1fb4..acfd069c2ed1c7100042e3946c4458fe1486c3d7 100644 (file)
const
NO_SOUND_ID = DWORD(-1);
-function e_InitSoundSystem(): Boolean;
+function e_InitSoundSystem(NoOutput: Boolean = False): Boolean;
function e_LoadSound(FileName: string; var ID: DWORD; bLoop: Boolean): Boolean;
function e_LoadSoundMem(pData: Pointer; Length: Integer; var ID: DWORD; bLoop: Boolean): Boolean;
end;
end;
-function e_TrySS (Freq: Integer; forceNoSound: Boolean): Boolean;
+function e_TrySS (Freq: Integer; forceNoSound: Integer): Boolean;
var
res: FMOD_RESULT;
ver: Cardinal;
Exit;
end;
- res := FMOD_System_Init(F_System, N_CHANNELS, FMOD_INIT_NORMAL, nil);
- if res <> FMOD_OK then
+ if forceNoSound = 2 then
begin
- e_WriteLog('Error initializing FMOD system!', MSG_WARNING);
- e_WriteLog(FMOD_ErrorString(res), MSG_WARNING);
-
- {$IFDEF LINUX}
- res := TryInitWithOutput(FMOD_OUTPUTTYPE_ALSA, 'OUTPUTTYPE_ALSA');
- if res <> FMOD_OK then
- res := TryInitWithOutput(FMOD_OUTPUTTYPE_OSS, 'OUTPUTTYPE_OSS');
- {$ENDIF}
- if (res <> FMOD_OK) and not forceNoSound then Exit;
- if res <> FMOD_OK then
- res := TryInitWithOutput(FMOD_OUTPUTTYPE_NOSOUND, 'OUTPUTTYPE_NOSOUND');
+ res := TryInitWithOutput(FMOD_OUTPUTTYPE_NOSOUND, 'OUTPUTTYPE_NOSOUND');
if res <> FMOD_OK then
begin
- e_WriteLog('FMOD: Giving up, can''t init any output.', MSG_FATALERROR);
+ e_WriteLog('FMOD: Giving up, can''t init with NOSOUND.', MSG_FATALERROR);
Exit;
end;
+ end
+ else
+ begin
+ res := FMOD_System_Init(F_System, N_CHANNELS, FMOD_INIT_NORMAL, nil);
+ if res <> FMOD_OK then
+ begin
+ e_WriteLog('Error initializing FMOD system!', MSG_WARNING);
+ e_WriteLog(FMOD_ErrorString(res), MSG_WARNING);
+
+ {$IFDEF LINUX}
+ res := TryInitWithOutput(FMOD_OUTPUTTYPE_ALSA, 'OUTPUTTYPE_ALSA');
+ if res <> FMOD_OK then
+ res := TryInitWithOutput(FMOD_OUTPUTTYPE_OSS, 'OUTPUTTYPE_OSS');
+ {$ENDIF}
+ if (res <> FMOD_OK) and (forceNoSound <> 1) then Exit;
+ if res <> FMOD_OK then
+ res := TryInitWithOutput(FMOD_OUTPUTTYPE_NOSOUND, 'OUTPUTTYPE_NOSOUND');
+ if res <> FMOD_OK then
+ begin
+ e_WriteLog('FMOD: Giving up, can''t init any output.', MSG_FATALERROR);
+ Exit;
+ end;
+ end;
end;
res := FMOD_System_GetOutput(F_System, output);
Result := True;
end;
-function e_InitSoundSystem(): Boolean;
+function e_InitSoundSystem(NoOutput: Boolean = False): Boolean;
begin
- Result := e_TrySS(48000, False);
- if not Result then Result := e_TrySS(44100, True);
+ if NoOutput then
+ begin
+ Result := e_TrySS(48000, 2);
+ Exit;
+ end;
+ Result := e_TrySS(48000, 0);
+ if not Result then Result := e_TrySS(44100, 1);
end;
function FindESound(): DWORD;
index 541f31a908239b7e0d05417ab52cfe1394279bbc..0104f3a3eca925907ba1ea2cbc9f68dafe6d3364 100644 (file)
const
NO_SOUND_ID = DWORD(-1);
-function e_InitSoundSystem(): Boolean;
+function e_InitSoundSystem(NoOutput: Boolean = False): Boolean;
function e_LoadSound(FileName: string; var ID: DWORD; isMusic: Boolean): Boolean;
function e_LoadSoundMem(pData: Pointer; Length: Integer; var ID: DWORD; isMusic: Boolean): Boolean;
end;
end;
-function e_InitSoundSystem(): Boolean;
+function e_InitSoundSystem(NoOutput: Boolean = False): Boolean;
var
res, i: Integer;
rfreq: Integer;
Result := False;
SoundInitialized := False;
+
+ if NoOutput then begin Result := true; Exit end;
// wow, this is actually MIDI player!
// we need module player
index ef9b660c9254c694f15bdf7900c088ba2e18532c..2a4300b71bec0039d68d73cf2e25a6349a29a8c7 100644 (file)
end;
var
+ e_DummyTextures: Boolean = False;
TEXTUREFILTER: Integer = GL_NEAREST;
function CreateTexture(var tex: GLTexture; Width, Height, aFormat: Word; pData: Pointer ): Boolean;
e_WriteLog(Format('NPOT: orig is %ux%u; gl is %ux%u; u=%f; v=%f', [Width, Height, tex.glwidth, tex.glheight, tex.u, tex.v]), MSG_NOTIFY);
end;
+ if e_DummyTextures then
+ begin
+ tex.id := GLuint(-1);
+ Result := True;
+ Exit;
+ end;
+
glGenTextures(1, @Texture);
tex.id := Texture;
glBindTexture(GL_TEXTURE_2D, Texture);
diff --git a/src/game/Doom2DF.dpr b/src/game/Doom2DF.dpr
index 57f516d65c367b608fdc4144f855048467fd1182..df5de459a118d12c5b4c42ec287d16b5ad0adb22 100644 (file)
--- a/src/game/Doom2DF.dpr
+++ b/src/game/Doom2DF.dpr
program Doom2DF;
-{$IFDEF WIN32}
- {$APPTYPE GUI}
+{$IFNDEF HEADLESS}
+ {$IFDEF WIN32}
+ {$APPTYPE GUI}
+ {$ENDIF}
{$ENDIF}
{$HINTS OFF}
diff --git a/src/game/g_console.pas b/src/game/g_console.pas
index 4898bfb113ed2dacad7e59213b5cfaf464dcf02e..27ca859c4167563426b36a324b4e0e4876db1b48 100644 (file)
--- a/src/game/g_console.pas
+++ b/src/game/g_console.pas
uses
g_textures, g_main, e_graphics, e_input, g_game,
SysUtils, g_basic, g_options, WADEDITOR, Math,
- g_menu, g_language, g_net, g_netmsg;
+ g_menu, g_language, g_net, g_netmsg, e_log;
type
TCmdProc = procedure (P: SArray);
Time := MsgTime;
end;
end;
+
+{$IFDEF HEADLESS}
+ e_WriteLog('CON: ' + L, MSG_NOTIFY);
+{$ENDIF}
end;
procedure g_Console_Clear();
diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index 3bb18b729d9cff35516f93ecfdc0e0bdf4c66db2..30605bf67bb66304dc330250e5fd3d3fbed975c7 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
if (s <> '') then
begin
gMapToDelete := MapsDir + map;
- e_WriteLog('"--testdelete" argument doesn''t supported anymore!', MSG_FATALERROR);
+ e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', MSG_FATALERROR);
Halt(1);
end;
diff --git a/src/game/g_main.pas b/src/game/g_main.pas
index 1840635b1ce51b070fb950c573b8db8093fe7d8e..d78c84e12b669971c3928b638ab4e8625f9ecb31 100644 (file)
--- a/src/game/g_main.pas
+++ b/src/game/g_main.pas
charbuff: Array [0..15] of Char;
procedure Main();
+var
+ sdlflags: LongWord;
begin
GetDir(0, GameDir);
MapsDir := GameDir + '/maps/';
e_WriteLog('Read config file', MSG_NOTIFY);
g_Options_Read(GameDir + '/' + CONFIG_FILENAME);
+
+ e_WriteToStdOut := {$IFDEF HEADLESS}True;{$ELSE}False;{$ENDIF}
//GetSystemDefaultLCID()
//g_Language_Load(DataDir + gLanguage + '.txt');
e_WriteLog(gLanguage, MSG_NOTIFY);
g_Language_Set(gLanguage);
-
-{$IFDEF USE_SDLMIXER}
- if SDL_Init({SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO or SDL_INIT_AUDIO}SDL_INIT_EVERYTHING) < 0 then
+
+{$IFDEF HEADLESS}
+ sdlflags := SDL_INIT_TIMER or $00004000;
{$ELSE}
- if SDL_Init(SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO) < 0 then
+ {$IFDEF USE_SDLMIXER}
+ sdlflags := SDL_INIT_EVERYTHING;
+ {$ELSE}
+ sdlflags := SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO;
+ {$ENDIF}
{$ENDIF}
+ if SDL_Init(sdlflags) < 0 then
raise Exception.Create('SDL: Init failed: ' + SDL_GetError());
-
+
+{$IFDEF HEADLESS}
SDL_StartTextInput();
+{$ENDIF}
e_WriteLog('Entering SDLMain', MSG_NOTIFY);
- {$WARNINGS OFF}
+{$WARNINGS OFF}
SDLMain();
- {$WARNINGS ON}
+{$WARNINGS ON}
+{$IFDEF HEADLESS}
SDL_StopTextInput();
+{$ENDIF}
e_WriteLog('Releasing SDL', MSG_NOTIFY);
SDL_Quit();
else
e_WriteLog('Input: No Joysticks.', MSG_NOTIFY);
- if not gNoSound then
+ if (not gNoSound) then
begin
e_WriteLog('Initializing sound system', MSG_NOTIFY);
- e_InitSoundSystem();
+ e_InitSoundSystem({$IFDEF HEADLESS}True{$ELSE}False{$ENDIF});
end;
e_WriteLog('Init game', MSG_NOTIFY);
diff --git a/src/game/g_sound.pas b/src/game/g_sound.pas
index f5ce6c7b9308990ed720398d4f610f19989d7695..b1e09f8b4d91ee642fac286bf529fb0f32ab88c2 100644 (file)
--- a/src/game/g_sound.pas
+++ b/src/game/g_sound.pas
end;
WAD.Free();
-
- if not ok then
+{$IFNDEF HEADLESS}
+ if (not ok) then
begin
if isMusic then
e_WriteLog(Format('Error loading music %s', [Resource]), MSG_WARNING)
e_WriteLog(Format('Error loading sound %s', [Resource]), MSG_WARNING);
Exit;
end;
-
+{$ENDIF}
Result := True;
end;
end;
WAD.Free();
-
- if not ok then
+{$IFNDEF HEADLESS}
+ if (not ok) then
begin
if isMusic then
e_WriteLog(Format('Error loading music %s', [Resource]), MSG_WARNING)
e_WriteLog(Format('Error loading sound %s', [Resource]), MSG_WARNING);
Exit;
end;
-
+{$ENDIF}
Result := True;
end;
diff --git a/src/game/g_window.pas b/src/game/g_window.pas
index 33fc80c2969914e7f43c22d84edbc8c8d9ba55fb..c159ddd236d40221480036aa03394f51e41b51f9 100644 (file)
--- a/src/game/g_window.pas
+++ b/src/game/g_window.pas
var
mode, cmode: TSDL_DisplayMode;
begin
+{$IFDEF HEADLESS}
+ Result := True;
+ Exit;
+{$ENDIF}
+
Result := False;
e_WriteLog('Setting display mode...', MSG_NOTIFY);
res, i, k, n, pw, ph: Integer;
begin
SetLength(Result, 0);
-
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
k := 0; SelRes := 0;
n := SDL_GetNumDisplayModes(0);
pw := 0; ph := 0;
begin
gWinSizeX := gScreenWidth;
gWinSizeY := gScreenHeight;
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
e_ResizeWindow(gScreenWidth, gScreenHeight);
g_Game_SetupScreenSize();
g_Menu_Reset();
Preserve: Boolean;
begin
Result := False;
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
Preserve := False;
if (gScreenWidth <> W) or (gScreenHeight <> H) then
procedure SwapBuffers();
begin
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
SDL_GL_SwapWindow(h_Wnd);
end;
exit;
end;
+{$IFNDEF HEADLESS}
h_Gl := SDL_GL_CreateContext(h_Wnd);
if h_Gl = nil then Exit;
-
+{$ENDIF}
//wWindowCreated := True;
e_ResizeWindow(gScreenWidth, gScreenHeight);
var
v: Byte;
begin
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
if VSync then v := 1 else v := 0;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
function SDLMain(): Integer;
begin
+{$IFDEF HEADLESS}
+ e_NoGraphics := True;
+{$ENDIF}
+
e_WriteLog('Creating GL window', MSG_NOTIFY);
if not CreateGLWindow(PChar(Format('Doom 2D: Forever %s', [GAME_VERSION]))) then
begin