diff -r 93cc73dcc421 -r 1358cc003e4d hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Thu Feb 25 18:34:36 2010 +0000 +++ b/hedgewars/uLandObjects.pas Thu Feb 25 23:28:26 2010 +0000 @@ -304,7 +304,6 @@ bRes: boolean; begin cnt:= 0; -Obj.Maxcnt:= (Obj.Maxcnt * MaxHedgehogs) div 18; with Obj do begin if Maxcnt = 0 then @@ -450,7 +449,7 @@ AddProgress; end; -procedure AddThemeObjects(var ThemeObjects: TThemeObjects; MaxCount: LongInt); +procedure AddThemeObjects(var ThemeObjects: TThemeObjects); var i, ii, t: LongInt; b: boolean; begin @@ -460,8 +459,8 @@ 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 - t := getrandom(1024); repeat + t := getrandom(ThemeObjects.Count); b := false; for i:=0 to ThemeObjects.Count do begin @@ -473,24 +472,27 @@ until not b; end; -procedure AddSprayObjects(Surface: PSDL_Surface; var SprayObjects: TSprayObjects; MaxCount: Longword); -var i: Longword; - ii, t: LongInt; +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...'); -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; + 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; end; procedure AddObjects(); @@ -506,7 +508,7 @@ i:=i+int; until (i>rightX-int); end; -AddThemeObjects(ThemeObjects, (8 * MaxHedgehogs) div 18); // MaxHedgehogs should roughly correspond to available surface area. Was also thinking maybe using playHeight * playWidth div constant :) +AddThemeObjects(ThemeObjects); AddProgress(); FreeRects(); end; @@ -515,7 +517,7 @@ begin InitRects; //AddSprayObjects(Surface, SprayObjects, 12); -AddSprayObjects(Surface, SprayObjects, (2 * MaxHedgehogs) div 3); +AddSprayObjects(Surface, SprayObjects); FreeRects end;