diff -r d8a526934b9f -r 82d93eeecebe hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Tue Jun 20 21:22:15 2006 +0000 +++ b/hedgewars/uLandObjects.pas Fri Jun 23 20:02:41 2006 +0000 @@ -36,24 +36,38 @@ uses SDLh; {$include options.inc} -procedure AddObjects(Surface: PSDL_Surface); +procedure AddObjects(InSurface, Surface: PSDL_Surface); procedure BlitImageAndGenerateCollisionInfo(cpX, cpY: Longword; Image, Surface: PSDL_Surface); implementation uses uLand, uStore, uConsts, uMisc, uConsole, uRandom; const MaxRects = 256; MAXOBJECTRECTS = 16; -type PRectArray = ^TRectsArray; - TRectsArray = array[0..MaxRects] of TSDL_rect; + MAXTHEMEOBJECTS = 32; -type TThemeObject = record +type PRectArray = ^TRectsArray; + TRectsArray = array[0..MaxRects] of TSDL_Rect; + TThemeObject = record Surf: PSDL_Surface; inland: TSDL_Rect; - outland: array[1..MAXOBJECTRECTS] of TSDL_Rect; + outland: array[0..Pred(MAXOBJECTRECTS)] of TSDL_Rect; rectcnt: Longword; Width, Height: Longword; Maxcnt: Longword; end; + TThemeObjects = record + Count: integer; + objs: array[0..Pred(MAXTHEMEOBJECTS)] of TThemeObject; + end; + TSprayObject = record + Surf: PSDL_Surface; + Width, Height: Longword; + Maxcnt: Longword; + end; + TSprayObjects = record + Count: integer; + objs: array[0..Pred(MAXTHEMEOBJECTS)] of TSprayObject + end; var Rects: PRectArray; RectCount: Longword; @@ -81,7 +95,7 @@ begin i:= Longword(@Land[cpY + y, cpX]); for x:= 0 to Pred(Image.w) do - if PWord(p + x * 2)^ <> 0 then PLongWord(i + x * 4)^:= $FFFFFF; + if PWord(p + x * 2)^ <> 0 then PLongWord(i + x * 4)^:= COLOR_LAND; inc(p, Image.pitch); end; 3: for y:= 0 to Pred(Image.h) do @@ -90,14 +104,14 @@ for x:= 0 to Pred(Image.w) do if (PByte(p + x * 3 + 0)^ <> 0) or (PByte(p + x * 3 + 1)^ <> 0) - or (PByte(p + x * 3 + 2)^ <> 0) then PLongWord(i + x * 4)^:= $FFFFFF; + or (PByte(p + x * 3 + 2)^ <> 0) then PLongWord(i + x * 4)^:= COLOR_LAND; inc(p, Image.pitch); end; 4: for y:= 0 to Pred(Image.h) do begin i:= Longword(@Land[cpY + y, cpX]); for x:= 0 to Pred(Image.w) do - if PLongword(p + x * 4)^ <> 0 then PLongWord(i + x * 4)^:= $FFFFFF; + if PLongword(p + x * 4)^ <> 0 then PLongWord(i + x * 4)^:= COLOR_LAND; inc(p, Image.pitch); end; end; @@ -247,7 +261,7 @@ Result:= false end; -function TryPut(var Obj: TThemeObject; Surface: PSDL_Surface): boolean; +function TryPut(var Obj: TThemeObject; Surface: PSDL_Surface): boolean; overload; const MaxPointsIndex = 2047; var x, y: Longword; ar: array[0..MaxPointsIndex] of TPoint; @@ -291,25 +305,76 @@ end end; -procedure AddThemeObjects(Surface: PSDL_Surface; MaxCount: Longword); -const MAXTHEMEOBJECTS = 32; -var f: textfile; - s: string; - ThemeObjects: array[1..MAXTHEMEOBJECTS] of TThemeObject; - i, ii, t, n: Longword; - b: boolean; +function TryPut(var Obj: TSprayObject; Surface: PSDL_Surface): boolean; overload; +const MaxPointsIndex = 8095; +var x, y: Longword; + ar: array[0..MaxPointsIndex] of TPoint; + cnt, i: Longword; + r: TSDL_Rect; +begin +cnt:= 0; +with Obj do + begin + if Maxcnt = 0 then + begin + Result:= false; + exit + end; + 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, $FFFFFF) + 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 > 1023 - Height - 8; + inc(x, getrandom(12) + 12) + until x > 2047 - Width; + Result:= cnt <> 0; + if Result 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 +end; + +procedure ReadThemeInfo(var ThemeObjects: TThemeObjects; var SprayObjects: TSprayObjects); +var s: string; + f: textfile; + i, ii: integer; begin s:= Pathz[ptThemeCurrent] + '/' + cThemeCFGFilename; -WriteLnToConsole('Adding objects...'); +WriteLnToConsole('Reading objects info...'); AssignFile(f, s); {$I-} Reset(f); Readln(f, s); // skip color -Readln(f, n); -for i:= 1 to n do +Readln(f, ThemeObjects.Count); +for i:= 0 to Pred(ThemeObjects.Count) do begin Readln(f, s); // filename - with ThemeObjects[i] do + with ThemeObjects.objs[i] do begin Surf:= LoadImage(Pathz[ptThemeCurrent] + '/' + s + '.png', false); Read(f, Width, Height); @@ -317,37 +382,84 @@ Read(f, rectcnt); for ii:= 1 to rectcnt do with outland[ii] do Read(f, x, y, w, h); - Maxcnt:= 2; + Maxcnt:= 3; ReadLn(f) end; end; + +Readln(f, SprayObjects.Count); +for i:= 0 to Pred(SprayObjects.Count) do + begin + Readln(f, s); // filename + with SprayObjects.objs[i] do + begin + Surf:= LoadImage(Pathz[ptThemeCurrent] + '/' + s + '.png', false); + Width:= Surf.w; + Height:= Surf.h; + ReadLn(f, Maxcnt) + end; + end; Closefile(f); {$I+} -TryDo(IOResult = 0, 'Bad data or cannot access file ' + cThemeCFGFilename, true); +TryDo(IOResult = 0, 'Bad data or cannot access file ' + cThemeCFGFilename, true) +end; -// loaded objects, try to put on land -if n = 0 then exit; +procedure AddThemeObjects(Surface: PSDL_Surface; var ThemeObjects: TThemeObjects; MaxCount: integer); +var i, ii, t: integer; + b: boolean; +begin +if ThemeObjects.Count = 0 then exit; +WriteLnToConsole('Adding theme objects...'); i:= 1; repeat - t:= getrandom(n) + 1; + t:= getrandom(ThemeObjects.Count); ii:= t; repeat inc(ii); - if ii > n then ii:= 1; - b:= TryPut(ThemeObjects[ii], Surface) + if ii = ThemeObjects.Count then ii:= 0; + b:= TryPut(ThemeObjects.objs[ii], Surface) until b or (ii = t); -inc(i) -until (i > MaxCount) or not b + inc(i) +until (i > MaxCount) or not b; end; -procedure AddObjects(Surface: PSDL_Surface); +procedure AddSprayObjects(Surface: PSDL_Surface; var SprayObjects: TSprayObjects; MaxCount: Longword); +var i: Longword; + ii, t: integer; + b: boolean; +begin +if SprayObjects.Count = 0 then exit; +WriteLnToConsole('Adding spray objects...'); +i:= 1; +repeat + t:= getrandom(SprayObjects.Count); + ii:= t; + repeat + inc(ii); + if ii = SprayObjects.Count then ii:= 0; + b:= TryPut(SprayObjects.objs[ii], Surface) + until b or (ii = t); + inc(i) +until (i > MaxCount) or not b; +end; + +procedure AddObjects(InSurface, Surface: PSDL_Surface); +var ThemeObjects: TThemeObjects; + SprayObjects: TSprayObjects; begin InitRects; +AddGirder(256, Surface); AddGirder(512, Surface); +AddGirder(768, Surface); AddGirder(1024, Surface); -AddGirder(1300, Surface); +AddGirder(1280, Surface); AddGirder(1536, Surface); -AddThemeObjects(Surface, 8); +AddGirder(1792, Surface); +ReadThemeInfo(ThemeObjects, SprayObjects); +AddThemeObjects(Surface, ThemeObjects, 8); +AddProgress; +SDL_UpperBlit(InSurface, nil, Surface, nil); +AddSprayObjects(Surface, SprayObjects, 10); FreeRects end;