# HG changeset patch # User unc0rr # Date 1136036709 0 # Node ID 9367f246fb5f8dbb731908f8947462db51abe05b # Parent fbe30de53d1d85751e773e952cebbb54649757cb - New rope - Increased speed in windowed mode - Surfaces with alpha channel blit poperly in windowed mode - +1 land template diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/Data/Graphics/RopeNode.png Binary file hedgewars/Data/Graphics/RopeNode.png has changed diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Wed Dec 28 23:34:22 2005 +0000 +++ b/hedgewars/SDLh.pas Sat Dec 31 13:45:09 2005 +0000 @@ -223,6 +223,7 @@ function SDL_MapRGB(format: PSDL_PixelFormat; r, g, b: Byte): Integer; cdecl; external SDLLibName; function SDL_DisplayFormat(Surface: PSDL_Surface): PSDL_Surface; cdecl; external SDLLibName; +function SDL_DisplayFormatAlpha(Surface: PSDL_Surface): PSDL_Surface; cdecl; external SDLLibName; function SDL_RWFromFile(filename, mode: PChar): PSDL_RWops; cdecl; external SDLLibName; function SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: Integer): Integer; cdecl; external SDLLibName; diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Wed Dec 28 23:34:22 2005 +0000 +++ b/hedgewars/uConsts.pas Sat Dec 31 13:45:09 2005 +0000 @@ -36,7 +36,7 @@ uses SDLh; {$INCLUDE options.inc} type TStuff = (sHorizont, sSky, sConsoleBG, sPowerBar, sQuestion, sWindBar, - sWindL, sWindR); + sWindL, sWindR, sRopeNode); TGameState = (gsLandGen, gsStart, gsGame, gsConsole, gsExit); TGameType = (gmtLocal, gmtDemo, gmtNet); TPathType = (ptData, ptGraphics, ptThemes, ptThemeCurrent, ptTeams, ptMaps, @@ -197,7 +197,8 @@ (FileName: 'thinking.png'; Path: ptGraphics ), // sQuestion (FileName: 'WindBar.png'; Path: ptGraphics ), // sWindBar (FileName: 'WindL.png'; Path: ptGraphics ), // sWindL - (FileName: 'WindR.png'; Path: ptGraphics ) // sWindR + (FileName: 'WindR.png'; Path: ptGraphics ), // sWindR + (FileName: 'RopeNode.png'; Path: ptGraphics ) // sRopeNode ); StuffPoz: array[TStuff] of TSDL_Rect = ( (x: 0; y: 0; w: 512; h: 256), // sHorizont @@ -207,31 +208,33 @@ (x: 256; y: 512; w: 32; h: 32), // sQuestion (x: 256; y: 800; w: 151; h: 17), // sWindBar (x: 256; y: 817; w: 80; h: 13), // sWindL - (x: 336; y: 817; w: 80; h: 13) // sWindR + (x: 336; y: 817; w: 80; h: 13), // sWindR + (x: 256; y: 544; w: 6; h: 6) // sRopeNode ); SpritesData: array[TSprite] of record - FileName: String[31]; - Path : TPathType; - Surface : PSDL_Surface; - Width, Height: integer; - end = ( - (FileName: 'BlueWater.png'; Path: ptGraphics; Width: 256; Height: 48),// sprWater - (FileName: 'Clouds.png'; Path: ptGraphics; Width: 256; Height:128),// sprCloud - (FileName: 'Bomb.png'; Path: ptGraphics; Width: 16; Height: 16),// sprBomb - (FileName: 'BigDigits.png'; Path: ptGraphics; Width: 32; Height: 32),// sprBigDigit - (FileName: 'Frame.png'; Path: ptGraphics; Width: 4; Height: 32),// sprFrame - (FileName: 'Lag.png'; Path: ptGraphics; Width: 64; Height: 64),// sprLag - (FileName: 'Arrow.png'; Path: ptGraphics; Width: 16; Height: 16),// sprCursor - (FileName: 'Grenade.png'; Path: ptGraphics; Width: 32; Height: 32),// sprGrenade - (FileName: 'Targetp.png'; Path: ptGraphics; Width: 32; Height: 32),// sprTargetP - (FileName: 'UFO.png'; Path: ptGraphics; Width: 32; Height: 32),// sprUFO - (FileName:'SmokeTrace.png'; Path: ptGraphics; Width: 32; Height: 32),// sprSmokeTrace - (FileName: 'RopeHook.png'; Path: ptGraphics; Width: 32; Height: 32),// sprRopeHook - (FileName: 'Expl50.png'; Path: ptGraphics; Width: 64; Height: 64),// sprExplosion50 - (FileName: 'MineOff.png'; Path: ptGraphics; Width: 16; Height: 16),// sprMineOff - (FileName: 'MineOn.png'; Path: ptGraphics; Width: 16; Height: 16),// sprMineOn - (FileName: 'Case.png'; Path: ptGraphics; Width: 32; Height: 32) // sprCase - ); + FileName: String[31]; + Path : TPathType; + Surface : PSDL_Surface; + Width, Height: integer; + hasAlpha: boolean; + end = ( + (FileName: 'BlueWater.png'; Path: ptGraphics; Width: 256; Height: 48; hasAlpha: false),// sprWater + (FileName: 'Clouds.png'; Path: ptGraphics; Width: 256; Height:128; hasAlpha: false),// sprCloud + (FileName: 'Bomb.png'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprBomb + (FileName: 'BigDigits.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: true),// sprBigDigit + (FileName: 'Frame.png'; Path: ptGraphics; Width: 4; Height: 32; hasAlpha: true),// sprFrame + (FileName: 'Lag.png'; Path: ptGraphics; Width: 64; Height: 64; hasAlpha: false),// sprLag + (FileName: 'Arrow.png'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprCursor + (FileName: 'Grenade.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprGrenade + (FileName: 'Targetp.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprTargetP + (FileName: 'UFO.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprUFO + (FileName:'SmokeTrace.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: true),// sprSmokeTrace + (FileName: 'RopeHook.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprRopeHook + (FileName: 'Expl50.png'; Path: ptGraphics; Width: 64; Height: 64; hasAlpha: false),// sprExplosion50 + (FileName: 'MineOff.png'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprMineOff + (FileName: 'MineOn.png'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprMineOn + (FileName: 'Case.png'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false) // sprCase + ); Soundz: array[TSound] of record FileName: String[31]; Path : TPathType; diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/uGears.pas --- a/hedgewars/uGears.pas Wed Dec 28 23:34:22 2005 +0000 +++ b/hedgewars/uGears.pas Sat Dec 31 13:45:09 2005 +0000 @@ -362,11 +362,12 @@ procedure DrawGears(Surface: PSDL_Surface); var Gear: PGear; i: Longword; + roplen: real; procedure DrawRopeLine(X1, Y1, X2, Y2: integer); - var i: integer; - t, k: real; - r: TSDL_Rect; + const nodlen = 5; + var i, x, y: integer; + t, k, ladd: real; begin if abs(X1 - X2) > abs(Y1 - Y2) then begin @@ -380,22 +381,23 @@ Y2:= i end; k:= (Y2 - Y1) / (X2 - X1); + ladd:= sqrt(1 + sqr(k)); if X1 < 0 then begin t:= Y1 - 2 - k * X1; X1:= 0 end else t:= Y1 - 2; if X2 > cScreenWidth then X2:= cScreenWidth; - r.x:= X1; - while r.x <= X2 do - begin - r.y:= round(t); - r.w:= 4; - r.h:= 4; - SDL_FillRect(Surface, @r, cWhiteColor); - t:= t + k*3; - inc(r.x, 3) - end; + for x:= X1 to X2 do + begin + roplen:= roplen + ladd; + if roplen > nodlen then + begin + DrawGear(sRopeNode, x - 2, round(t) - 2, Surface); + roplen:= roplen - nodlen; + end; + t:= t + k; + end; end else begin if Y1 > Y2 then @@ -408,22 +410,23 @@ Y2:= i end; k:= (X2 - X1) / (Y2 - Y1); + ladd:= sqrt(1 + sqr(k)); if Y1 < 0 then begin t:= X1 - 2 - k * Y1; Y1:= 0 end else t:= X1 - 2; if Y2 > cScreenHeight then Y2:= cScreenHeight; - r.y:= Y1; - while r.y <= Y2 do - begin - r.x:= round(t); - r.w:= 4; - r.h:= 4; - SDL_FillRect(Surface, @r, cWhiteColor); - t:= t + k*3; - inc(r.y, 3) - end; + for y:= Y1 to Y2 do + begin + roplen:= roplen + ladd; + if roplen > nodlen then + begin + DrawGear(sRopeNode, round(t) - 2, y - 2, Surface); + roplen:= roplen - nodlen; + end; + t:= t + k; + end; end end; @@ -443,8 +446,7 @@ gtUFO: DrawSprite(sprUFO, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, (GameTicks shr 7) mod 4, Surface); gtSmokeTrace: if Gear.State < 8 then DrawSprite(sprSmokeTrace, Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface); gtRope: begin - DrawRopeLine(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, - Round(PHedgehog(Gear.Hedgehog).Gear.X) + WorldDx, Round(PHedgehog(Gear.Hedgehog).Gear.Y) + WorldDy); + roplen:= 0; if RopePoints.Count > 0 then begin i:= 0; @@ -456,9 +458,15 @@ end; DrawRopeLine(Round(RopePoints.ar[i].X) + WorldDx, Round(RopePoints.ar[i].Y) + WorldDy, Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy); + DrawRopeLine(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, + Round(PHedgehog(Gear.Hedgehog).Gear.X) + WorldDx, Round(PHedgehog(Gear.Hedgehog).Gear.Y) + WorldDy); DrawSprite(sprRopeHook, Round(RopePoints.ar[0].X) + WorldDx - 16, Round(RopePoints.ar[0].Y) + WorldDy - 16, RopePoints.HookAngle, Surface); end else + begin + DrawRopeLine(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, + Round(PHedgehog(Gear.Hedgehog).Gear.X) + WorldDx, Round(PHedgehog(Gear.Hedgehog).Gear.Y) + WorldDy); DrawSprite(sprRopeHook, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, DxDy2Angle32(Gear.dY, Gear.dX), Surface); + end; end; gtExplosion: DrawSprite(sprExplosion50, Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface); gtMine: if ((Gear.State and gstAttacking) = 0)or((Gear.Timer and $3FF) < 420) diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/uLand.pas --- a/hedgewars/uLand.pas Wed Dec 28 23:34:22 2005 +0000 +++ b/hedgewars/uLand.pas Sat Dec 31 13:45:09 2005 +0000 @@ -257,7 +257,7 @@ var tmpsurf: PSDL_Surface; r: TSDL_Rect; begin -tmpsurf:= LoadImage(Pathz[ptThemeCurrent] + 'LandTex.png'); +tmpsurf:= LoadImage(Pathz[ptThemeCurrent] + 'LandTex.png', false); r.y:= 0; while r.y < 1024 do begin @@ -283,7 +283,7 @@ r, rr: TSDL_Rect; x, yd, yu: integer; begin -tmpsurf:= LoadImage(Pathz[ptThemeCurrent] + 'Border.png'); +tmpsurf:= LoadImage(Pathz[ptThemeCurrent] + 'Border.png', false); for x:= 0 to 2047 do begin yd:= 1023; @@ -483,13 +483,13 @@ TryDo(p <> nil, 'No teams on map!', true); with PixelFormat^ do LandSurface:= SDL_CreateRGBSurface(SDL_HWSURFACE, 2048, 1024, BitsPerPixel, RMask, GMask, BMask, 0); -tmpsurf:= LoadImage(Pathz[ptForts] + p.FortName + 'L.png'); +tmpsurf:= LoadImage(Pathz[ptForts] + p.FortName + 'L.png', false); BlitImageAndGenerateCollisionInfo(0, 0, tmpsurf, LandSurface); SDL_FreeSurface(tmpsurf); LoadFortPoints(p.FortName, false, TeamSize(p)); p:= p.Next; TryDo(p <> nil, 'Only one team on map!', true); -tmpsurf:= LoadImage(Pathz[ptForts] + p.FortName + 'R.png'); +tmpsurf:= LoadImage(Pathz[ptForts] + p.FortName + 'R.png', false); BlitImageAndGenerateCollisionInfo(1024, 0, tmpsurf, LandSurface); SDL_FreeSurface(tmpsurf); LoadFortPoints(p.FortName, true, TeamSize(p)); diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Wed Dec 28 23:34:22 2005 +0000 +++ b/hedgewars/uLandObjects.pas Sat Dec 31 13:45:09 2005 +0000 @@ -152,7 +152,7 @@ if x1 > 0 then begin Result:= true; - tmpsurf:= LoadImage(Pathz[ptGraphics] + 'Girder.png'); + tmpsurf:= LoadImage(Pathz[ptGraphics] + 'Girder.png', false); rr.x:= x1; rr.y:= y; while rr.x + 100 < x2 do @@ -271,7 +271,7 @@ Readln(f, s); // filename with ThemeObjects[i] do begin - Surf:= LoadImage(Pathz[ptThemeCurrent] + s + '.png'); + Surf:= LoadImage(Pathz[ptThemeCurrent] + s + '.png', false); Read(f, Width, Height); with inland do Read(f, x, y, w, h); Read(f, rectcnt); diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/uLandTemplates.pas --- a/hedgewars/uLandTemplates.pas Wed Dec 28 23:34:22 2005 +0000 +++ b/hedgewars/uLandTemplates.pas Sat Dec 31 13:45:09 2005 +0000 @@ -189,7 +189,36 @@ (x: 1023; y: 1023) ); -const EdgeTemplates: array[0..5] of TEdgeTemplate = +const Template6Points: array[0..20] of TPoint = + ( + (x: 318; y: 1494), + (x: 270; y: 1023), + (x: 252; y: 921), + (x: 480; y: 888), + (x: 492; y: 753), + (x: 654; y: 756), + (x: 687; y: 630), + (x: 906; y: 627), + (x: 987; y: 813), + (x: 1125; y: 825), + (x: 1134; y: 645), + (x: 1236; y: 558), + (x: 1260; y: 438), + (x: 1467; y: 462), + (x: 1536; y: 348), + (x: 1680; y: 402), + (x: 1713; y: 594), + (x: 1593; y: 693), + (x: 1707; y: 774), + (x: 1728; y: 894), + (x: 1788; y: 1491) + ); + Template6FPoints: array[0..0] of TPoint = + ( + (x: 1023; y: 1023) + ); + +const EdgeTemplates: array[0..6] of TEdgeTemplate = ( (BasePoints: @Template0Points; BasePointsCount: Succ(High(Template0Points)); @@ -250,7 +279,17 @@ FillPoints: @Template5FPoints; FillPointsCount: Succ(High(Template5FPoints)); canMirror: true; canFlip: false; - ) + ), + (BasePoints: @Template6Points; + BasePointsCount: Succ(High(Template6Points)); + BezPassCnt: 3; + PassMin: 15; PassDelta: 1; + WaveAmplMin: 15; WaveAmplDelta: 10; + WaveFreqMin: 0.010; WaveFreqDelta: 0.0015; + FillPoints: @Template6FPoints; + FillPointsCount: Succ(High(Template6FPoints)); + canMirror: true; canFlip: false; + ) ); diff -r fbe30de53d1d -r 9367f246fb5f hedgewars/uStore.pas --- a/hedgewars/uStore.pas Wed Dec 28 23:34:22 2005 +0000 +++ b/hedgewars/uStore.pas Sat Dec 31 13:45:09 2005 +0000 @@ -56,7 +56,7 @@ procedure RenderHealth(var Hedgehog: THedgehog); function RenderString(var s: shortstring; Color, Pos: integer): TSDL_Rect; procedure AddProgress; -function LoadImage(filename: string): PSDL_Surface; +function LoadImage(filename: string; hasAlpha: boolean): PSDL_Surface; var PixelFormat: PSDL_PixelFormat; SDLPrimSurface: PSDL_Surface; @@ -189,9 +189,15 @@ end; procedure StoreInit; +var r: TSDL_Rect; begin StoreSurface := SDL_CreateRGBSurface(SDL_HWSURFACE, 576, 1024, cBits, PixelFormat.RMask, PixelFormat.GMask, PixelFormat.BMask, 0); TryDo( StoreSurface <> nil, errmsgCreateSurface + ': store' , true); +r.x:= 0; +r.y:= 0; +r.w:= 576; +r.h:= 1024; +SDL_FillRect(StoreSurface, @r, 0); TempSurface := SDL_CreateRGBSurface(SDL_HWSURFACE, 724, 320, cBits, PixelFormat.RMask, PixelFormat.GMask, PixelFormat.BMask, 0); TryDo( TempSurface <> nil, errmsgCreateSurface + ': temp' , true); @@ -205,7 +211,7 @@ var tmpsurf: PSDL_Surface; rr: TSDL_Rect; begin - tmpsurf:= LoadImage(Filename); + tmpsurf:= LoadImage(Filename, false); rr.x:= X; rr.y:= Y; SDL_UpperBlit(tmpsurf, nil, Surface, @rr); @@ -406,8 +412,8 @@ WriteLnToConsole(msgOK) end; AddProgress; -s:= Pathz[ptMapCurrent] + cLandFileName; -WriteToConsole(msgLoading + s + ' '); // загружаем текущее поле +//s:= Pathz[ptMapCurrent] + cLandFileName; +//WriteToConsole(msgLoading + s + ' '); //tmpsurf:= IMG_Load(PChar(s)); tmpsurf:= LandSurface; TryDo(tmpsurf <> nil, msgFailed, true); @@ -416,7 +422,7 @@ LandSurface:= SDL_DisplayFormat(tmpsurf); SDL_FreeSurface(tmpsurf); end else LandSurface:= tmpsurf; -TryDo(SDL_SetColorKey(LandSurface, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); +TryDo(SDL_SetColorKey(LandSurface, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); WriteLnToConsole(msgOK); GetExplosionBorderColor; @@ -435,16 +441,13 @@ AddProgress; for ii:= Low(TSprite) to High(TSprite) do with SpritesData[ii] do - begin - Surface:= LoadImage(Pathz[Path] + FileName); - TryDo(SDL_SetColorKey(Surface, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true) - end; + Surface:= LoadImage(Pathz[Path] + FileName, hasAlpha); AddProgress; -tmpsurf:= LoadImage(Pathz[ptGraphics] + cHHFileName); +tmpsurf:= LoadImage(Pathz[ptGraphics] + cHHFileName, false); +TryDo(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); HHSurface:= SDL_DisplayFormat(tmpsurf); SDL_FreeSurface(tmpsurf); -TryDo(SDL_SetColorKey(HHSurface, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); InitHealth; @@ -583,15 +586,17 @@ end; end; -function LoadImage(filename: string): PSDL_Surface; +function LoadImage(filename: string; hasAlpha: boolean): PSDL_Surface; var tmpsurf: PSDL_Surface; begin WriteToConsole(msgLoading + filename + '... '); tmpsurf:= IMG_Load(PChar(filename)); TryDo(tmpsurf <> nil, msgFailed, true); +TryDo(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); if cFullScreen then begin - Result:= SDL_DisplayFormat(tmpsurf); + if hasAlpha then Result:= SDL_DisplayFormatAlpha(tmpsurf) + else Result:= SDL_DisplayFormat(tmpsurf); SDL_FreeSurface(tmpsurf); end else Result:= tmpsurf; WriteLnToConsole(msgOK)