X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=60aefbda87e3e205fc952aa4b142fbb2cb763d02;hb=986383de4f166773e41335f5b0fec5ee5c0128f0;hp=bf1f9159d096fdfe54d7f42b268b4e07aba425ec;hpb=565edf25d031dba9a1d6436e6b758a22c8329b45;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index bf1f915..60aefbd 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -226,7 +226,7 @@ var gLiftMap: array of array of DWORD; gWADHash: TMD5Digest; BackID: DWORD = DWORD(-1); - gExternalResources: TStringList; + gExternalResources: array of TDiskFileInfo = nil; gMovingWallIds: array of Integer = nil; gdbg_map_use_accel_render: Boolean = true; @@ -259,7 +259,8 @@ uses Math, g_monsters, g_saveload, g_language, g_netmsg, sfs, xstreams, hashtable, wadreader, ImagingTypes, Imaging, ImagingUtility, - ImagingGif, ImagingNetworkGraphics; + ImagingGif, ImagingNetworkGraphics, + g_res_downloader; const FLAGRECT: TRectWH = (X:15; Y:12; Width:33; Height:52); @@ -899,6 +900,26 @@ begin end; +function GetReplacementWad (WadName: AnsiString): AnsiString; +begin + if (length(WadName) = 0) then + begin + result := ''; + end + else + begin + //e_LogWritefln('GetReplacementWad: 000: old=%s', [WadName]); + result := g_Res_FindReplacementWad(WadName); + //e_LogWritefln('GetReplacementWad: 001: old=%s; new=%s', [WadName, result]); + if (result = WadName) then + begin + result := GameDir+'/wads/'+result; + //e_LogWritefln('GetReplacementWad: 002: old=%s; new=%s', [WadName, result]); + end; + end; +end; + + function CreateTexture(RecName: AnsiString; Map: string; log: Boolean): Integer; var WAD: TWADFile; @@ -957,12 +978,10 @@ begin end; // Çàãðóæàåì ðåñóðñ òåêñòóðû â ïàìÿòü èç WAD'à: - WADName := g_ExtractWadName(RecName); + WADName := GetReplacementWad(g_ExtractWadName(RecName)); + if WADName = '' then WADName := Map; //WADName := GameDir+'/wads/'+WADName else WAD := TWADFile.Create(); - - if WADName <> '' then WADName := GameDir+'/wads/'+WADName else WADName := Map; - WAD.ReadFile(WADName); //txname := RecName; @@ -1045,11 +1064,12 @@ begin end; // ×èòàåì WAD-ðåñóðñ àíèì.òåêñòóðû èç WAD'à â ïàìÿòü: - WADName := g_ExtractWadName(RecName); + WADName := GetReplacementWad(g_ExtractWadName(RecName)); + if WADName = '' then WADName := Map; //WADName := GameDir+'/wads/'+WADName else WAD := TWADFile.Create(); try - if WADName <> '' then WADName := GameDir+'/wads/'+WADName else WADName := Map; + //if WADName <> '' then WADName := GameDir+'/wads/'+WADName else WADName := Map; WAD.ReadFile(WADName); @@ -1446,55 +1466,66 @@ begin Result := ''; end; -procedure addResToExternalResList(res: string); + +procedure addResToExternalResList (res: AnsiString); +var + uname: AnsiString; + f: Integer; + fi: TDiskFileInfo; begin - //e_LogWritefln('DBG: ***trying external resource %s', [res]); - res := toLowerCase1251(extractWadName(res)); - // ignore "standart.wad" - if (res <> '') and (res <> 'standart.wad') and (gExternalResources.IndexOf(res) = -1) then + if g_Game_IsClient or not g_Game_IsNet then exit; + if (length(res) = 0) then exit; // map wad + res := extractWadName(res); + if (length(res) = 0) then exit; // map wad + uname := toLowerCase1251(res); + // do not add duplicates + for f := 0 to High(gExternalResources) do begin - //e_LogWritefln('DBG: added external resource %s', [res]); - gExternalResources.Add(res); + if (gExternalResources[f].userName = uname) then exit; end; -end; - -procedure generateExternalResourcesList({mapReader: TMapReader_1}map: TDynRecord); -//var - //textures: TTexturesRec1Array; - //textures: TDynField; - //trec: TDynRecord; - //mapHeader: TMapHeaderRec_1; - //i: integer; - //resFile: String = ''; -begin - if gExternalResources = nil then - gExternalResources := TStringList.Create; - - gExternalResources.Clear; - - (* - { - textures := GetTextures(map); - for i := 0 to High(textures) do + // add new resource + fi.userName := uname; + if (not GetDiskFileInfo(GameDir+'/wads/'+res, fi)) then begin - addResToExternalResList(resFile); + fi.tag := -1; + end + else + begin + fi.tag := 0; // non-zero means "cannot caclucate hash" + try + fi.hash := MD5File(fi.diskName); + except + fi.tag := -1; + end; end; - } + //e_LogWritefln('addext: res=[%s]; uname=[%s]; diskName=[%s]', [res, fi.userName, fi.diskName]); + SetLength(gExternalResources, length(gExternalResources)+1); + gExternalResources[High(gExternalResources)] := fi; +end; - textures := map['texture']; - if (textures <> nil) then + +procedure compactExtResList (); +var + src, dest: Integer; +begin + src := 0; + dest := 0; + for src := 0 to High(gExternalResources) do begin - for trec in textures do + if (gExternalResources[src].tag = 0) then begin - addResToExternalResList(resFile); + // copy it + if (dest <> src) then gExternalResources[dest] := gExternalResources[src]; + Inc(dest); end; end; + if (dest <> length(gExternalResources)) then SetLength(gExternalResources, dest); +end; - textures := nil; - *) - - //mapHeader := GetMapHeader(map); +procedure generateExternalResourcesList (map: TDynRecord); +begin + SetLength(gExternalResources, 0); addResToExternalResList(map.MusicName); addResToExternalResList(map.SkyName); end; @@ -1679,7 +1710,7 @@ begin if (gCurrentMap = nil) then begin FileName := g_ExtractWadName(Res); - e_WriteLog('Loading map WAD: '+FileName, TMsgType.Notify); + e_LogWritefln('Loading map WAD [%s] (res=[%s])', [FileName, Res], TMsgType.Notify); g_Game_SetLoadingText(_lc[I_LOAD_WAD_FILE], 0, False); WAD := TWADFile.Create(); @@ -2280,6 +2311,7 @@ begin end; end; + compactExtResList(); e_WriteLog('Done loading map.', TMsgType.Notify); Result := True; end;