# HG changeset patch # User unc0rr # Date 1452375913 -10800 # Node ID bd9a2f1b0080b8fab0754d9bb5a68cffb333a936 # Parent 24bef86e3f3a97397482835180bae8bd7a3da779 SDLTry doesn't halt engine no more diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/hwengine.pas Sun Jan 10 00:45:13 2016 +0300 @@ -342,18 +342,23 @@ AddFileLog(inttostr(i) + ': ' + ParamStr(i)); WriteToConsole('Init SDL... '); - if not cOnlyStats then SDLTry(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, 'SDL_Init', true); + if not cOnlyStats then SDLCheck(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, 'SDL_Init', true); WriteLnToConsole(msgOK); + if not cOnlyStats then + begin + WriteToConsole('Init SDL_ttf... '); + SDLCheck(TTF_Init() <> -1, 'TTF_Init', true); + WriteLnToConsole(msgOK); + end; + if not allOK then + begin + freeEverything(true); + exit + end; //SDL_StartTextInput(); SDL_ShowCursor(0); - if not cOnlyStats then - begin - WriteToConsole('Init SDL_ttf... '); - SDLTry(TTF_Init() <> -1, 'TTF_Init', true); - WriteLnToConsole(msgOK); - end; {$IFDEF USE_VIDEO_RECORDING} if GameType = gmtRecord then @@ -401,32 +406,35 @@ LoadRecordFromFile(recordFileName); end; - ScriptOnGameInit; - s:= 'eproto ' + inttostr(cNetProtoVersion); - SendIPCRaw(@s[0], Length(s) + 1); // send proto version + if allOK then + begin + ScriptOnGameInit; + s:= 'eproto ' + inttostr(cNetProtoVersion); + SendIPCRaw(@s[0], Length(s) + 1); // send proto version - InitTeams(); - AssignStores(); + InitTeams(); + AssignStores(); - if GameType = gmtRecord then - SetSound(false); + if GameType = gmtRecord then + SetSound(false); - InitSound(); + InitSound(); - isDeveloperMode:= false; - TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); - //ParseCommand('rotmask', true); + isDeveloperMode:= false; + TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); + //ParseCommand('rotmask', true); -{$IFDEF USE_VIDEO_RECORDING} - if GameType = gmtRecord then - begin - RecorderMainLoop(); - freeEverything(true); - exit; + {$IFDEF USE_VIDEO_RECORDING} + if GameType = gmtRecord then + begin + RecorderMainLoop(); + freeEverything(true); + exit; + end; + {$ENDIF} + + MainLoop; end; -{$ENDIF} - - MainLoop; // clean up all the memory allocated freeEverything(true); end; @@ -437,6 +445,7 @@ // freeEverything - free above. Pay attention to the init/free order! procedure preInitEverything; begin + allOK:= true; Randomize(); uVariables.preInitModule; @@ -537,19 +546,23 @@ initEverything(false); InitIPC; - IPCWaitPongEvent; - TryDo(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); + if allOK then + begin + IPCWaitPongEvent; + TryDo(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); - ScriptOnPreviewInit; -{$IFDEF MOBILE} - GenPreview(Preview); -{$ELSE} - GenPreviewAlpha(Preview); -{$ENDIF} - WriteLnToConsole('Sending preview...'); - SendIPCRaw(@Preview, sizeof(Preview)); - SendIPCRaw(@MaxHedgehogs, sizeof(byte)); - WriteLnToConsole('Preview sent, disconnect'); + ScriptOnPreviewInit; + {$IFDEF MOBILE} + GenPreview(Preview); + {$ELSE} + GenPreviewAlpha(Preview); + {$ENDIF} + WriteLnToConsole('Sending preview...'); + SendIPCRaw(@Preview, sizeof(Preview)); + SendIPCRaw(@MaxHedgehogs, sizeof(byte)); + WriteLnToConsole('Preview sent, disconnect'); + end; + freeEverything(false); end; diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uDebug.pas --- a/hedgewars/uDebug.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uDebug.pas Sun Jan 10 00:45:13 2016 +0300 @@ -24,7 +24,10 @@ procedure OutError(Msg: shortstring; isFatalError: boolean); procedure TryDo(Assert: boolean; Msg: shortstring; isFatal: boolean); inline; -procedure SDLTry(Assert: boolean; Msg: shortstring; isFatal: boolean); +function SDLCheck(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean; + +var + allOK: boolean; implementation uses SDLh, uConsole, uCommands, uConsts; @@ -47,14 +50,17 @@ OutError(Msg, isFatal) end; -procedure SDLTry(Assert: boolean; Msg: shortstring; isFatal: boolean); +function SDLCheck(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean; var s: shortstring; begin -if not Assert then + if not Assert then begin - s:= SDL_GetError(); - OutError(Msg + ': ' + s, isFatal) - end + s:= SDL_GetError(); + OutError(Msg + ': ' + s, false) + end; + + allOK:= allOK and (Assert or (not isFatal)); + SDLCheck:= (not Assert) and isFatal end; end. diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uIO.pas --- a/hedgewars/uIO.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uIO.pas Sun Jan 10 00:45:13 2016 +0300 @@ -114,16 +114,16 @@ var ipaddr: TIPAddress; begin WriteToConsole('Init SDL_Net... '); - SDLTry(SDLNet_Init = 0, 'SDLNet_Init', true); + SDLCheck(SDLNet_Init = 0, 'SDLNet_Init', true); fds:= SDLNet_AllocSocketSet(1); - SDLTry(fds <> nil, 'SDLNet_AllocSocketSet', true); + SDLCheck(fds <> nil, 'SDLNet_AllocSocketSet', true); WriteLnToConsole(msgOK); WriteToConsole('Establishing IPC connection to tcp 127.0.0.1:' + IntToStr(ipcPort) + ' '); {$HINTS OFF} - SDLTry(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, 'SDLNet_ResolveHost', true); + SDLCheck(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, 'SDLNet_ResolveHost', true); {$HINTS ON} IPCSock:= SDLNet_TCP_Open(ipaddr); - SDLTry(IPCSock <> nil, 'SDLNet_TCP_Open', true); + SDLCheck(IPCSock <> nil, 'SDLNet_TCP_Open', true); WriteLnToConsole(msgOK) end; @@ -512,6 +512,7 @@ RegisterVariable('fatal', @chFatalError, true ); IPCSock:= nil; + fds:= nil; headcmd:= nil; lastcmd:= nil; diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uLand.pas Sun Jan 10 00:45:13 2016 +0300 @@ -263,7 +263,7 @@ TryDo(Surface <> nil, 'Assert (LandSurface <> nil) failed', true); if SDL_MustLock(Surface) then - SDLTry(SDL_LockSurface(Surface) >= 0, 'SDL_LockSurface', true); + if SDLCheck(SDL_LockSurface(Surface) >= 0, 'SDL_LockSurface', true) then exit; p:= Surface^.pixels; for y:= 0 to LAND_HEIGHT - 1 do @@ -451,8 +451,10 @@ cpX:= (LAND_WIDTH - tmpsurf^.w) div 2; cpY:= LAND_HEIGHT - tmpsurf^.h; if SDL_MustLock(tmpsurf) then - SDLTry(SDL_LockSurface(tmpsurf) >= 0, 'SDL_LockSurface', true); + SDLCheck(SDL_LockSurface(tmpsurf) >= 0, 'SDL_LockSurface', true); + if allOK then + begin p:= tmpsurf^.pixels; for y:= 0 to Pred(tmpsurf^.h) do begin @@ -461,15 +463,16 @@ p:= PLongwordArray(@(p^[tmpsurf^.pitch div 4])); end; - if SDL_MustLock(tmpsurf) then - SDL_UnlockSurface(tmpsurf); - if not disableLandBack then - begin - // freed in freeModule() below - LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent); - if (LandBackSurface <> nil) and GrayScale then - Surface2GrayScale(LandBackSurface) - end; + if SDL_MustLock(tmpsurf) then + SDL_UnlockSurface(tmpsurf); + if not disableLandBack then + begin + // freed in freeModule() below + LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent); + if (LandBackSurface <> nil) and GrayScale then + Surface2GrayScale(LandBackSurface) + end; + end; end; if (tmpsurf <> nil) then SDL_FreeSurface(tmpsurf); diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uLandGraphics.pas Sun Jan 10 00:45:13 2016 +0300 @@ -716,7 +716,7 @@ col:= Frame div numFramesFirstCol; if SDL_MustLock(Image) then - SDLTry(SDL_LockSurface(Image) >= 0, 'TryPlaceOnLand', true); + if SDLCheck(SDL_LockSurface(Image) >= 0, 'TryPlaceOnLand', true) then exit; bpp:= Image^.format^.BytesPerPixel; TryDo(bpp = 4, 'It should be 32 bpp sprite', true); @@ -835,7 +835,7 @@ col:= Frame div numFramesFirstCol; if SDL_MustLock(Image) then - SDLTry(SDL_LockSurface(Image) >= 0, 'EraseLand', true); + if SDLCheck(SDL_LockSurface(Image) >= 0, 'EraseLand', true) then exit; bpp:= Image^.format^.BytesPerPixel; TryDo(bpp = 4, 'It should be 32 bpp sprite', true); @@ -918,7 +918,8 @@ col:= Frame div numFramesFirstCol; if SDL_MustLock(Image) then - SDLTry(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true); + if SDLCheck(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true) then + exit; bpp:= Image^.format^.BytesPerPixel; TryDo(bpp = 4, 'It should be 32 bpp sprite', true); @@ -930,7 +931,8 @@ TryDo(finalSurface <> nil, 'GetPlaceCollisionTex: fail to create surface', true); if SDL_MustLock(finalSurface) then - SDLTry(SDL_LockSurface(finalSurface) >= 0, 'GetPlaceCollisionTex', true); + if SDLCheck(SDL_LockSurface(finalSurface) >= 0, 'GetPlaceCollisionTex', true) then + exit; p:= PLongWordArray(@(PLongWordArray(Image^.pixels)^[ (Image^.pitch div 4) * row * h + col * w ])); pt:= PLongWordArray(finalSurface^.pixels); diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uLandObjects.pas Sun Jan 10 00:45:13 2016 +0300 @@ -109,7 +109,7 @@ WriteToConsole('Generating collision info... '); if SDL_MustLock(Image) then - SDLTry(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true); + if SDLCheck(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true) then exit; bpp:= Image^.format^.BytesPerPixel; TryDo(bpp = 4, 'Land object should be 32bit', true); @@ -160,7 +160,7 @@ WriteToConsole('Generating collision info... '); if SDL_MustLock(Image) then - SDLTry(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true); + if SDLCheck(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true) then exit; bpp:= Image^.format^.BytesPerPixel; TryDo(bpp = 4, 'Land object should be 32bit', true); diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uRenderUtils.pas --- a/hedgewars/uRenderUtils.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uRenderUtils.pas Sun Jan 10 00:45:13 2016 +0300 @@ -99,7 +99,8 @@ tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr); finalRect.x:= X + cFontBorder + 2; finalRect.y:= Y + cFontBorder; - SDLTry(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true); + if SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then + exit; SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect); SDL_FreeSurface(tmpsurf); finalRect.x:= X; @@ -522,9 +523,11 @@ rect.x:= edgeHeight + 1 + ((i - w) div 2); // trying to more evenly position the text, vertically rect.y:= edgeHeight + ((j-(numLines*h)) div 2) + line * h; - SDLTry(tmpsurf <> nil, 'TTF_Init', true); - SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect); - SDL_FreeSurface(tmpsurf); + if not SDLCheck(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true) then + begin + SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect); + SDL_FreeSurface(tmpsurf); + end; inc(line); end; diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uSound.pas --- a/hedgewars/uSound.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uSound.pas Sun Jan 10 00:45:13 2016 +0300 @@ -322,7 +322,7 @@ end; WriteToConsole('Init SDL_mixer... '); - SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, 'Mix_Init', true); + if SDLCheck(Mix_Init(MIX_INIT_OGG) <> 0, 'Mix_Init', true) then exit; WriteLnToConsole(msgOK); Mix_AllocateChannels(Succ(chanTPU)); @@ -425,7 +425,7 @@ s:= cPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName; WriteToConsole(msgLoading + s + ' '); defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1); - SDLTry(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true); + if not SDLCheck(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true) then exit; WriteLnToConsole(msgOK); end; lastChan[snd]:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], 0, -1) @@ -524,7 +524,7 @@ s:= cPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName; WriteToConsole(msgLoading + s + ' '); defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1); - SDLTry(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true); + if SDLCheck(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true) then exit; WriteLnToConsole(msgOK); end; if fadems > 0 then @@ -575,10 +575,10 @@ WriteToConsole(msgLoading + s + ' '); Mus:= Mix_LoadMUS_RW(rwopsOpenRead(s)); - SDLTry(Mus <> nil, 'Mix_LoadMUS_RW', false); + SDLCheck(Mus <> nil, 'Mix_LoadMUS_RW', false); WriteLnToConsole(msgOK); - SDLTry(Mix_FadeInMusic(Mus, -1, 3000) <> -1, 'Mix_FadeInMusic', false) + SDLCheck(Mix_FadeInMusic(Mus, -1, 3000) <> -1, 'Mix_FadeInMusic', false) end; procedure SetVolume(vol: LongInt); diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uStore.pas Sun Jan 10 00:45:13 2016 +0300 @@ -112,15 +112,19 @@ clr.g:= (Color shr 8) and $FF; clr.b:= Color and $FF; tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, s, clr); -SDLTry(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true); +if tmpsurf = nil then exit; tmpsurf:= doSurfaceConversion(tmpsurf); -SDLTry(tmpsurf <> nil, 'TTF_RenderUTF8_Blended, doSurfaceConversion', true); -SDL_UpperBlit(tmpsurf, nil, Surface, @finalRect); -SDL_FreeSurface(tmpsurf); -finalRect.x:= X; -finalRect.y:= Y; -finalRect.w:= w + cFontBorder * 2 + 4; -finalRect.h:= h + cFontBorder * 2; + +if tmpsurf <> nil then +begin + SDL_UpperBlit(tmpsurf, nil, Surface, @finalRect); + SDL_FreeSurface(tmpsurf); + finalRect.x:= X; + finalRect.y:= Y; + finalRect.w:= w + cFontBorder * 2 + 4; + finalRect.h:= h + cFontBorder * 2; +end; + WriteInRect:= finalRect end; @@ -356,7 +360,7 @@ s:= cPathz[ptFonts] + '/' + Name; WriteToConsole(msgLoading + s + ' (' + inttostr(Height) + 'pt)... '); Handle:= TTF_OpenFontRW(rwopsOpenRead(s), true, Height); - SDLTry(Handle <> nil, 'TTF_OpenFontRW', true); + if SDLCheck(Handle <> nil, 'TTF_OpenFontRW', true) then exit; TTF_SetFontStyle(Handle, style); WriteLnToConsole(msgOK) end; @@ -605,7 +609,7 @@ // anounce that loading failed OutError(msgFailed, false); - SDLTry(false, 'LoadImage', (imageFlags and ifCritical) <> 0); + if SDLCheck(false, 'LoadImage', (imageFlags and ifCritical) <> 0) then exit; // rwops was already freed by IMG_Load_RW rwops:= nil; end else @@ -734,7 +738,6 @@ end; procedure SetupOpenGL; -var buf: array[byte] of char; begin AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_GetCurrentVideoDriver()) + ')'); @@ -744,7 +747,7 @@ //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); if SDLGLcontext = nil then SDLGLcontext:= SDL_GL_CreateContext(SDLwindow); - SDLTry(SDLGLcontext <> nil, 'SDLGLcontext', true); + if SDLCheck(SDLGLcontext <> nil, 'SDLGLcontext', true) then exit; SDL_GL_SetSwapInterval(1); RendererSetup(); @@ -988,7 +991,7 @@ SDL_WINDOWPOS_CENTERED_MASK, SDL_WINDOWPOS_CENTERED_MASK, cScreenWidth, cScreenHeight, SDL_WINDOW_HIDDEN or SDL_WINDOW_OPENGL); - SDLTry(SDLwindow <> nil, 'SDL_CreateWindow', true); + if SDLCheck(SDLwindow <> nil, 'SDL_CreateWindow', true) then exit; SetupOpenGL(); end; {$ENDIF} // USE_VIDEO_RECORDING @@ -1024,7 +1027,7 @@ begin // set window title WriteToConsole('Init SDL_image... '); - SDLTry(IMG_Init(IMG_INIT_PNG) <> 0, 'IMG_Init', true); + if SDLCheck(IMG_Init(IMG_INIT_PNG) <> 0, 'IMG_Init', true) then exit; WriteLnToConsole(msgOK); end else @@ -1082,7 +1085,7 @@ if SDLwindow = nil then SDLwindow:= SDL_CreateWindow(PChar('Hedgewars'), x, y, cScreenWidth, cScreenHeight, flags); - SDLTry(SDLwindow <> nil, 'SDL_CreateWindow', true); + if SDLCheck(SDLwindow <> nil, 'SDL_CreateWindow', true) then exit; // load engine ico {$IFNDEF DARWIN} diff -r 24bef86e3f3a -r bd9a2f1b0080 hedgewars/uTextures.pas --- a/hedgewars/uTextures.pas Wed Jan 13 16:19:50 2016 +0100 +++ b/hedgewars/uTextures.pas Sun Jan 10 00:45:13 2016 +0300 @@ -239,7 +239,8 @@ glBindTexture(GL_TEXTURE_2D, Surface2Tex^.id); if SDL_MustLock(surf) then - SDLTry(SDL_LockSurface(surf) >= 0, 'Lock surface', true); + if SDLCheck(SDL_LockSurface(surf) >= 0, 'Lock surface', true) then + exit(nil); fromP4:= Surf^.pixels;