diff -r 92af50454cf2 -r 8054d9d775fd hedgewars/uLand.pas --- a/hedgewars/uLand.pas Fri Oct 11 11:55:31 2013 +0200 +++ b/hedgewars/uLand.pas Fri Oct 11 17:43:13 2013 +0200 @@ -20,7 +20,7 @@ unit uLand; interface -uses SDLh, uLandTemplates, uFloat, uConsts, GLunit, uTypes, uAILandMarks; +uses SDLh, uLandTemplates, uFloat, uConsts, uTypes, uAILandMarks; procedure initModule; procedure freeModule; @@ -60,29 +60,12 @@ end; end; -procedure ColorizeLand(Surface: PSDL_Surface); + +procedure DrawBorderFromImage(Surface: PSDL_Surface); var tmpsurf: PSDL_Surface; r, rr: TSDL_Rect; x, yd, yu: LongInt; begin - tmpsurf:= LoadDataImage(ptCurrTheme, 'LandTex', ifCritical or ifIgnoreCaps); - r.y:= 0; - while r.y < LAND_HEIGHT do - begin - r.x:= 0; - while r.x < LAND_WIDTH do - begin - SDL_UpperBlit(tmpsurf, nil, Surface, @r); - inc(r.x, tmpsurf^.w) - end; - inc(r.y, tmpsurf^.h) - end; - SDL_FreeSurface(tmpsurf); - - // freed in freeModule() below - LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent); - if (LandBackSurface <> nil) and GrayScale then Surface2GrayScale(LandBackSurface); - tmpsurf:= LoadDataImage(ptCurrTheme, 'Border', ifCritical or ifIgnoreCaps or ifTransparent); for x:= 0 to LAND_WIDTH - 1 do begin @@ -127,6 +110,106 @@ SDL_FreeSurface(tmpsurf); end; + +procedure DrawShoppaBorder; +var x, y, s, i: Longword; + c1, c2, c: Longword; +begin + c1:= AMask; + c2:= AMask or RMask or GMask; + + // vertical + s:= LAND_HEIGHT; + + for x:= 0 to LAND_WIDTH - 1 do + for y:= 0 to LAND_HEIGHT - 1 do + if LandPixels[y, x] = 0 then + if s < y then + begin + for i:= max(s, y - 8) to y - 1 do + begin + if ((x + i) and 16) = 0 then c:= c1 else c:= c2; + + if (cReducedQuality and rqBlurryLand) = 0 then + LandPixels[i, x]:= c + else + LandPixels[i div 2, x div 2]:= c + end; + s:= LAND_HEIGHT + end + else + else + begin + if s > y then s:= y; + if s + 8 > y then + begin + if ((x + y) and 16) = 0 then c:= c1 else c:= c2; + + if (cReducedQuality and rqBlurryLand) = 0 then + LandPixels[y, x]:= c + else + LandPixels[y div 2, x div 2]:= c + end; + end; + + // horizontal + s:= LAND_WIDTH; + + for y:= 0 to LAND_HEIGHT - 1 do + for x:= 0 to LAND_WIDTH - 1 do + if LandPixels[y, x] = 0 then + if s < x then + begin + for i:= max(s, x - 8) to x - 1 do + begin + if ((y + i) and 16) = 0 then c:= c1 else c:= c2; + + if (cReducedQuality and rqBlurryLand) = 0 then + LandPixels[y, i]:= c + else + LandPixels[y div 2, i div 2]:= c + end; + s:= LAND_WIDTH + end + else + else + begin + if s > x then s:= x; + if s + 8 > x then + begin + if ((x + y) and 16) = 0 then c:= c1 else c:= c2; + + if (cReducedQuality and rqBlurryLand) = 0 then + LandPixels[y, x]:= c + else + LandPixels[y div 2, x div 2]:= c + end; + end +end; + +procedure ColorizeLand(Surface: PSDL_Surface); +var tmpsurf: PSDL_Surface; + r: TSDL_Rect; +begin + tmpsurf:= LoadDataImage(ptCurrTheme, 'LandTex', ifCritical or ifIgnoreCaps); + r.y:= 0; + while r.y < LAND_HEIGHT do + begin + r.x:= 0; + while r.x < LAND_WIDTH do + begin + SDL_UpperBlit(tmpsurf, nil, Surface, @r); + inc(r.x, tmpsurf^.w) + end; + inc(r.y, tmpsurf^.h) + end; + SDL_FreeSurface(tmpsurf); + + // freed in freeModule() below + LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent); + if (LandBackSurface <> nil) and GrayScale then Surface2GrayScale(LandBackSurface); +end; + procedure SetPoints(var Template: TEdgeTemplate; var pa: TPixAr; fps: PPointArray); var i: LongInt; begin @@ -276,22 +359,34 @@ end; function SelectTemplate: LongInt; +var l: LongInt; begin if (cReducedQuality and rqLowRes) <> 0 then SelectTemplate:= SmallTemplates[getrandom(Succ(High(SmallTemplates)))] else + begin + if cTemplateFilter = 0 then + begin + l:= getRandom(GroupedTemplatesCount); + repeat + inc(cTemplateFilter); + dec(l, TemplateCounts[cTemplateFilter]); + until l < 0; + end else getRandom(1); + case cTemplateFilter of - 0: SelectTemplate:= getrandom(Succ(High(EdgeTemplates))); - 1: SelectTemplate:= SmallTemplates[getrandom(Succ(High(SmallTemplates)))]; - 2: SelectTemplate:= MediumTemplates[getrandom(Succ(High(MediumTemplates)))]; - 3: SelectTemplate:= LargeTemplates[getrandom(Succ(High(LargeTemplates)))]; - 4: SelectTemplate:= CavernTemplates[getrandom(Succ(High(CavernTemplates)))]; - 5: SelectTemplate:= WackyTemplates[getrandom(Succ(High(WackyTemplates)))]; + 0: OutError('Ask unC0Rr about what you did wrong', true); + 1: SelectTemplate:= SmallTemplates[getrandom(TemplateCounts[cTemplateFilter])]; + 2: SelectTemplate:= MediumTemplates[getrandom(TemplateCounts[cTemplateFilter])]; + 3: SelectTemplate:= LargeTemplates[getrandom(TemplateCounts[cTemplateFilter])]; + 4: SelectTemplate:= CavernTemplates[getrandom(TemplateCounts[cTemplateFilter])]; + 5: SelectTemplate:= WackyTemplates[getrandom(TemplateCounts[cTemplateFilter])]; // For lua only! 6: begin SelectTemplate:= min(LuaTemplateNumber,High(EdgeTemplates)); GetRandom(2) // burn 1 end; + end end; WriteLnToConsole('Selected template #'+inttostr(SelectTemplate)+' using filter #'+inttostr(cTemplateFilter)); @@ -334,10 +429,14 @@ TryDo(tmpsurf <> nil, 'Error creating pre-land surface', true); ColorizeLand(tmpsurf); + if gameFlags and gfShoppaBorder = 0 then DrawBorderFromImage(tmpsurf); AddOnLandObjects(tmpsurf); LandSurface2LandPixels(tmpsurf); SDL_FreeSurface(tmpsurf); + + if gameFlags and gfShoppaBorder <> 0 then DrawShoppaBorder; + for x:= leftX+2 to rightX-2 do for y:= topY+2 to LAND_HEIGHT-3 do if (Land[y, x] = 0) and @@ -518,7 +617,7 @@ tmpsurf:= LoadDataImage(ptMissionMaps, mapName + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps); end; // (bare) Sanity check. Considering possible LongInt comparisons as well as just how much system memoery it would take -TryDo((tmpsurf^.w < $40000000) and (tmpsurf^.h < $40000000) and (tmpsurf^.w * tmpsurf^.h < 6*1024*1024*1024), 'Map dimensions too big!', true); +TryDo((tmpsurf^.w < $40000000) and (tmpsurf^.h < $40000000) and (QWord(tmpsurf^.w) * tmpsurf^.h < 6*1024*1024*1024), 'Map dimensions too big!', true); ResizeLand(tmpsurf^.w, tmpsurf^.h); LoadMapConfig;