diff -r 22d3f053dd9b -r 195677b0d06b hedgewars/uLand.pas --- a/hedgewars/uLand.pas Wed Nov 07 18:46:00 2012 -0500 +++ b/hedgewars/uLand.pas Wed Nov 07 21:47:00 2012 -0500 @@ -327,14 +327,6 @@ var tmpsurf: PSDL_Surface; x,y: Longword; begin - WriteLnToConsole('Generating land...'); - case cMapGen of - 0: GenBlank(EdgeTemplates[SelectTemplate]); - 1: begin ResizeLand(4096,2048); GenMaze; end; - 2: GenDrawnMap; - else - OutError('Unknown mapgen', true); - end; AddProgress(); tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, LAND_WIDTH, LAND_HEIGHT, 32, RMask, GMask, BMask, 0); @@ -430,11 +422,39 @@ SDL_FreeSurface(tmpsurf); end; +procedure LoadMapConfig; +var f: textfile; + s: shortstring; +begin +// unC0Rr - should this be passed from the GUI? I am not sure which layer does what +s:= UserPathz[ptMapCurrent] + '/map.cfg'; +if not FileExists(s) then + s:= Pathz[ptMapCurrent] + '/map.cfg'; +WriteLnToConsole('Fetching map HH limit'); +{$I-} +Assign(f, s); +filemode:= 0; // readonly +Reset(f); +if IOResult <> 0 then + begin + s:= Pathz[ptMissionMaps] + '/' + ExtractFileName(Pathz[ptMapCurrent]) + '/map.cfg'; + Assign(f, s); + Reset(f); + end; +Readln(f); +if not eof(f) then + Readln(f, MaxHedgehogs); +{$I+} +if (MaxHedgehogs = 0) then + MaxHedgehogs:= 18; +end; + // Loads Land[] from an image, allowing overriding standard collision -procedure LoadMask(mapName: shortstring); +procedure LoadMask; var tmpsurf: PSDL_Surface; p: PLongwordArray; x, y, cpX, cpY: Longword; + mapName: shortstring; begin tmpsurf:= LoadDataImage(ptMapCurrent, 'mask', ifAlpha or ifTransparent or ifIgnoreCaps); if tmpsurf = nil then @@ -444,8 +464,18 @@ end; -if (tmpsurf <> nil) and (tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT) and (tmpsurf^.format^.BytesPerPixel = 4) then +if (tmpsurf <> nil) and (tmpsurf^.format^.BytesPerPixel = 4) then begin + if LAND_WIDTH = 0 then + begin + LoadMapConfig; + ResizeLand(tmpsurf^.w, tmpsurf^.h); + playHeight:= tmpsurf^.h; + playWidth:= tmpsurf^.w; + leftX:= (LAND_WIDTH - playWidth) div 2; + rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1; + topY:= LAND_HEIGHT - playHeight; + end; disableLandBack:= true; cpX:= (LAND_WIDTH - tmpsurf^.w) div 2; @@ -496,7 +526,6 @@ procedure LoadMap; var tmpsurf: PSDL_Surface; s: shortstring; - f: textfile; mapName: shortstring = ''; begin WriteLnToConsole('Loading land from file...'); @@ -511,28 +540,7 @@ TryDo((tmpsurf^.w < $40000000) and (tmpsurf^.h < $40000000) and (tmpsurf^.w * tmpsurf^.h < 6*1024*1024*1024), 'Map dimensions too big!', true); ResizeLand(tmpsurf^.w, tmpsurf^.h); - -// unC0Rr - should this be passed from the GUI? I am not sure which layer does what -s:= UserPathz[ptMapCurrent] + '/map.cfg'; -if not FileExists(s) then - s:= Pathz[ptMapCurrent] + '/map.cfg'; -WriteLnToConsole('Fetching map HH limit'); -{$I-} -Assign(f, s); -filemode:= 0; // readonly -Reset(f); -if IOResult <> 0 then - begin - s:= Pathz[ptMissionMaps] + '/' + mapName + '/map.cfg'; - Assign(f, s); - Reset(f); - end; -Readln(f); -if not eof(f) then - Readln(f, MaxHedgehogs); -{$I+} -if (MaxHedgehogs = 0) then - MaxHedgehogs:= 18; +LoadMapConfig; playHeight:= tmpsurf^.h; playWidth:= tmpsurf^.w; @@ -549,7 +557,7 @@ tmpsurf); SDL_FreeSurface(tmpsurf); -LoadMask(mapname); +LoadMask; end; procedure DrawBottomBorder; // broken out from other borders for doing a floor-only map, or possibly updating bottom during SD @@ -573,6 +581,7 @@ procedure GenMap; var x, y, w, c: Longword; + usermap, usermask, map, mask: shortstring; begin hasBorder:= false; @@ -584,9 +593,31 @@ if (GameFlags and gfForts) = 0 then if Pathz[ptMapCurrent] <> '' then - LoadMap + begin + usermap:= UserPathz[ptMapCurrent] + '/map.png'; + usermask:= UserPathz[ptMapCurrent] + '/mask.png'; + map:= Pathz[ptMapCurrent] + '/map.png'; + mask:= Pathz[ptMapCurrent] + '/mask.png'; + if (not(FileExists(usermap)) and FileExists(usermask)) or + (not(FileExists(map)) and FileExists(mask)) then + begin + LoadMask; + GenLandSurface + end + else LoadMap; + end else + begin + WriteLnToConsole('Generating land...'); + case cMapGen of + 0: GenBlank(EdgeTemplates[SelectTemplate]); + 1: begin ResizeLand(4096,2048); GenMaze; end; + 2: GenDrawnMap; + else + OutError('Unknown mapgen', true); + end; GenLandSurface + end else MakeFortsMap;