diff -r 803b277e4894 -r 3f21a9dc93d0 hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Sat Mar 06 10:54:24 2010 +0000 +++ b/hedgewars/uLandObjects.pas Sat Mar 06 10:59:20 2010 +0000 @@ -30,9 +30,9 @@ implementation uses uLand, uStore, uConsts, uMisc, uConsole, uRandom, uVisualGears, uFloat, uSound, uWorld, {$IFDEF GLES11} - gles11; + gles11; {$ELSE} - GL; + GL; {$ENDIF} const MaxRects = 512; @@ -86,15 +86,15 @@ p:= Image^.pixels; for y:= 0 to Pred(Image^.h) do - begin - for x:= 0 to Pred(Width) do - if LandPixels[cpY + y, cpX + x] = 0 then - begin - LandPixels[cpY + y, cpX + x]:= p^[x]; - if (p^[x] and AMask) <> 0 then Land[cpY + y, cpX + x]:= COLOR_OBJECT; - end; - p:= @(p^[Image^.pitch shr 2]); - end; + begin + for x:= 0 to Pred(Width) do + if LandPixels[cpY + y, cpX + x] = 0 then + begin + LandPixels[cpY + y, cpX + x]:= p^[x]; + if (p^[x] and AMask) <> 0 then Land[cpY + y, cpX + x]:= COLOR_OBJECT; + end; + p:= @(p^[Image^.pitch shr 2]); + end; if SDL_MustLock(Image) then SDL_UnlockSurface(Image); @@ -122,7 +122,7 @@ procedure FreeRects; begin - Dispose(rects) + Dispose(rects) end; function CheckIntersect(x1, y1, w1, h1: LongInt): boolean; @@ -147,61 +147,61 @@ rr: TSDL_Rect; bRes: boolean; - function CountNonZeroz(x, y: LongInt): Longword; - var i: LongInt; - lRes: Longword; - begin - lRes:= 0; - for i:= y to y + 15 do - if Land[i, x] <> 0 then inc(lRes); - CountNonZeroz:= lRes; - end; + function CountNonZeroz(x, y: LongInt): Longword; + var i: LongInt; + lRes: Longword; + begin + lRes:= 0; + for i:= y to y + 15 do + if Land[i, x] <> 0 then inc(lRes); + CountNonZeroz:= lRes; + end; begin y:= topY+150; repeat - inc(y, 24); - x1:= gX; - x2:= gX; + inc(y, 24); + x1:= gX; + x2:= gX; - while (x1 > Longint(leftX)+150) and (CountNonZeroz(x1, y) = 0) do dec(x1, 2); + while (x1 > Longint(leftX)+150) and (CountNonZeroz(x1, y) = 0) do dec(x1, 2); - i:= x1 - 12; - repeat - dec(x1, 2); - k:= CountNonZeroz(x1, y) - until (x1 < Longint(leftX)+150) or (k = 0) or (k = 16) or (x1 < i); + i:= x1 - 12; + repeat + dec(x1, 2); + k:= CountNonZeroz(x1, y) + until (x1 < Longint(leftX)+150) or (k = 0) or (k = 16) or (x1 < i); - inc(x1, 2); - if k = 16 then - begin - while (x2 < (rightX-150)) and (CountNonZeroz(x2, y) = 0) do inc(x2, 2); - i:= x2 + 12; - repeat - inc(x2, 2); - k:= CountNonZeroz(x2, y) - until (x2 >= (rightX-150)) or (k = 0) or (k = 16) or (x2 > i) or (x2 - x1 >= 768); - if (x2 < (rightX - 150)) and (k = 16) and (x2 - x1 > 250) and (x2 - x1 < 768) - and not CheckIntersect(x1 - 32, y - 64, x2 - x1 + 64, 144) then break; - end; + inc(x1, 2); + if k = 16 then + begin + while (x2 < (rightX-150)) and (CountNonZeroz(x2, y) = 0) do inc(x2, 2); + i:= x2 + 12; + repeat + inc(x2, 2); + k:= CountNonZeroz(x2, y) + until (x2 >= (rightX-150)) or (k = 0) or (k = 16) or (x2 > i) or (x2 - x1 >= 768); + if (x2 < (rightX - 150)) and (k = 16) and (x2 - x1 > 250) and (x2 - x1 < 768) + and not CheckIntersect(x1 - 32, y - 64, x2 - x1 + 64, 144) then break; + end; x1:= 0; until y > (LAND_HEIGHT-125); if x1 > 0 then begin - bRes:= true; - tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/Girder', ifTransparent or ifIgnoreCaps); - if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptGraphics] + '/Girder', ifCritical or ifTransparent or ifIgnoreCaps); + bRes:= true; + tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/Girder', ifTransparent or ifIgnoreCaps); + if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptGraphics] + '/Girder', ifCritical or ifTransparent or ifIgnoreCaps); - rr.x:= x1; - while rr.x < x2 do - begin - BlitImageAndGenerateCollisionInfo(rr.x, y, min(x2 - rr.x, tmpsurf^.w), tmpsurf); - inc(rr.x, tmpsurf^.w); - end; - SDL_FreeSurface(tmpsurf); + rr.x:= x1; + while rr.x < x2 do + begin + BlitImageAndGenerateCollisionInfo(rr.x, y, min(x2 - rr.x, tmpsurf^.w), tmpsurf); + inc(rr.x, tmpsurf^.w); + end; + SDL_FreeSurface(tmpsurf); - AddRect(x1 - 8, y - 32, x2 - x1 + 16, 80); + AddRect(x1 - 8, y - 32, x2 - x1 + 16, 80); end else bRes:= false; @@ -305,46 +305,46 @@ begin cnt:= 0; with Obj do - begin - if Maxcnt = 0 then - exit(false); - x:= 0; - r.x:= 0; - r.y:= 0; - r.w:= Width; - r.h:= Height + 16; - repeat - y:= 8; - repeat - if CheckLand(r, x, y - 8, COLOR_LAND) - and not CheckIntersect(x, y, Width, Height) then - begin - ar[cnt].x:= x; - ar[cnt].y:= y; - inc(cnt); - if cnt > MaxPointsIndex then // buffer is full, do not check the rest land - begin - y:= 5000; - x:= 5000; - end - end; - inc(y, 12); + begin + if Maxcnt = 0 then + exit(false); + x:= 0; + r.x:= 0; + r.y:= 0; + r.w:= Width; + r.h:= Height + 16; + repeat + y:= 8; + repeat + if CheckLand(r, x, y - 8, COLOR_LAND) + and not CheckIntersect(x, y, Width, Height) then + begin + ar[cnt].x:= x; + ar[cnt].y:= y; + inc(cnt); + if cnt > MaxPointsIndex then // buffer is full, do not check the rest land + begin + y:= 5000; + x:= 5000; + end + end; + inc(y, 12); until y > LAND_HEIGHT - 1 - Height - 8; - inc(x, getrandom(12) + 12) + inc(x, getrandom(12) + 12) until x > LAND_WIDTH - 1 - Width; - bRes:= cnt <> 0; - if bRes then - begin - i:= getrandom(cnt); - r.x:= ar[i].X; - r.y:= ar[i].Y; - r.w:= Width; - r.h:= Height; - SDL_UpperBlit(Obj.Surf, nil, Surface, @r); - AddRect(ar[i].x - 32, ar[i].y - 32, Width + 64, Height + 64); - dec(Maxcnt) - end else Maxcnt:= 0 - end; + bRes:= cnt <> 0; + if bRes then + begin + i:= getrandom(cnt); + r.x:= ar[i].X; + r.y:= ar[i].Y; + r.w:= Width; + r.h:= Height; + SDL_UpperBlit(Obj.Surf, nil, Surface, @r); + AddRect(ar[i].x - 32, ar[i].y - 32, Width + 64, Height + 64); + dec(Maxcnt) + end else Maxcnt:= 0 + end; TryPut:= bRes; end; @@ -355,11 +355,11 @@ vobcount: Longword; c1, c2: TSDL_Color; - procedure CheckRect(Width, Height, x, y, w, h: LongWord); - begin - if (x + w > Width) then OutError('Object''s rectangle exceeds image: x + w (' + inttostr(x) + ' + ' + inttostr(w) + ') > Width (' + inttostr(Width) + ')', true); - if (y + h > Height) then OutError('Object''s rectangle exceeds image: y + h (' + inttostr(y) + ' + ' + inttostr(h) + ') > Height (' + inttostr(Height) + ')', true); - end; + procedure CheckRect(Width, Height, x, y, w, h: LongWord); + begin + if (x + w > Width) then OutError('Object''s rectangle exceeds image: x + w (' + inttostr(x) + ' + ' + inttostr(w) + ') > Width (' + inttostr(Width) + ')', true); + if (y + h > Height) then OutError('Object''s rectangle exceeds image: y + h (' + inttostr(y) + ' + ' + inttostr(h) + ') > Height (' + inttostr(Height) + ')', true); + end; begin @@ -396,30 +396,30 @@ Readln(f, ThemeObjects.Count); for i:= 0 to Pred(ThemeObjects.Count) do - begin - Readln(f, s); // filename - with ThemeObjects.objs[i] do - begin - Surf:= LoadImage(Pathz[ptCurrTheme] + '/' + s, ifCritical or ifTransparent or ifIgnoreCaps); - Width:= Surf^.w; - Height:= Surf^.h; - Read(f, Maxcnt); - if (Maxcnt < 1) or (Maxcnt > MAXTHEMEOBJECTS) then OutError('Object''s max count should be between 1 and '+ inttostr(MAXTHEMEOBJECTS) +' (it was '+ inttostr(Maxcnt) +').', true); - with inland do - begin - Read(f, x, y, w, h); - CheckRect(Width, Height, x, y, w, h) - end; - Read(f, rectcnt); - for ii:= 1 to rectcnt do - with outland[ii] do - begin - Read(f, x, y, w, h); - CheckRect(Width, Height, x, y, w, h) - end; - ReadLn(f) - end; - end; + begin + Readln(f, s); // filename + with ThemeObjects.objs[i] do + begin + Surf:= LoadImage(Pathz[ptCurrTheme] + '/' + s, ifCritical or ifTransparent or ifIgnoreCaps); + Width:= Surf^.w; + Height:= Surf^.h; + Read(f, Maxcnt); + if (Maxcnt < 1) or (Maxcnt > MAXTHEMEOBJECTS) then OutError('Object''s max count should be between 1 and '+ inttostr(MAXTHEMEOBJECTS) +' (it was '+ inttostr(Maxcnt) +').', true); + with inland do + begin + Read(f, x, y, w, h); + CheckRect(Width, Height, x, y, w, h) + end; + Read(f, rectcnt); + for ii:= 1 to rectcnt do + with outland[ii] do + begin + Read(f, x, y, w, h); + CheckRect(Width, Height, x, y, w, h) + end; + ReadLn(f) + end; + end; // sprays Readln(f, SprayObjects.Count); @@ -453,46 +453,46 @@ var i, ii, t: LongInt; b: boolean; begin - if ThemeObjects.Count = 0 then exit; - WriteLnToConsole('Adding theme objects...'); + if ThemeObjects.Count = 0 then exit; + WriteLnToConsole('Adding theme objects...'); - for i:=0 to ThemeObjects.Count do - ThemeObjects.objs[i].Maxcnt := max(1, (ThemeObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map - - repeat - t := getrandom(ThemeObjects.Count); - b := false; - for i:=0 to ThemeObjects.Count do - begin - ii := (i+t) mod ThemeObjects.Count; - - if ThemeObjects.objs[ii].Maxcnt <> 0 then - b := b or TryPut(ThemeObjects.objs[ii]) - end; - until not b; + for i:=0 to ThemeObjects.Count do + ThemeObjects.objs[i].Maxcnt := max(1, (ThemeObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map + + repeat + t := getrandom(ThemeObjects.Count); + b := false; + for i:=0 to ThemeObjects.Count do + begin + ii := (i+t) mod ThemeObjects.Count; + + if ThemeObjects.objs[ii].Maxcnt <> 0 then + b := b or TryPut(ThemeObjects.objs[ii]) + end; + until not b; end; procedure AddSprayObjects(Surface: PSDL_Surface; var SprayObjects: TSprayObjects); var i, ii, t: LongInt; b: boolean; begin - if SprayObjects.Count = 0 then exit; - WriteLnToConsole('Adding spray objects...'); + if SprayObjects.Count = 0 then exit; + WriteLnToConsole('Adding spray objects...'); - for i:=0 to SprayObjects.Count do - SprayObjects.objs[i].Maxcnt := max(1, (SprayObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map - - repeat - t := getrandom(SprayObjects.Count); - b := false; - for i:=0 to SprayObjects.Count do - begin - ii := (i+t) mod SprayObjects.Count; - - if SprayObjects.objs[ii].Maxcnt <> 0 then - b := b or TryPut(SprayObjects.objs[ii], Surface) - end; - until not b; + for i:=0 to SprayObjects.Count do + SprayObjects.objs[i].Maxcnt := max(1, (SprayObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map + + repeat + t := getrandom(SprayObjects.Count); + b := false; + for i:=0 to SprayObjects.Count do + begin + ii := (i+t) mod SprayObjects.Count; + + if SprayObjects.objs[ii].Maxcnt <> 0 then + b := b or TryPut(SprayObjects.objs[ii], Surface) + end; + until not b; end; procedure AddObjects();