X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=95bb1a02fd813f82536e759ee6a2b0cfa1f86f8c;hb=414f2873efa0cce84499f64774db7000e6268971;hp=08ebadeb2929d4b429c62c9a7794173bfb0995cc;hpb=bec8cdb3ed10342622663c441db86cbd7bb63885;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 08ebade..95bb1a0 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; @@ -253,7 +253,7 @@ implementation uses {$INCLUDE ../nogl/noGLuses.inc} - e_input, g_main, e_log, e_texture, g_items, g_gfx, g_console, + e_input, g_main, e_log, e_texture, e_res, g_items, g_gfx, g_console, g_weapons, g_game, g_sound, e_sound, CONFIG, g_options, g_triggers, g_player, Math, g_monsters, g_saveload, g_language, g_netmsg, @@ -345,8 +345,8 @@ begin try e_LogWritefln('parsing "mapdef.txt"...', []); - st := openDiskFileRO(DataDir+'mapdef.txt'); - e_LogWritefln('found local "%smapdef.txt"', [DataDir]); + st := e_OpenResourceRO(DataDirs, 'mapdef.txt'); + e_LogWritefln('found local "mapdef.txt"', []); except st := nil; end; @@ -902,24 +902,18 @@ end; function GetReplacementWad (WadName: AnsiString): AnsiString; begin - if (length(WadName) = 0) then + result := ''; + if WadName <> '' then begin - result := ''; - end - else - begin - result := g_Res_FindReplacementWad(WadName); - if (result <> WadName) then - begin - //e_LogWritefln('GetReplacementWad: old=%s; new=%s', [WadName, result]); - end - else - begin - result := GameDir+'/wads/'+result; - end; + result := WadName; + if g_Game_IsClient then + result := g_Res_FindReplacementWad(WadName); + if (result = WadName) then + result := e_FindWad(WadDirs, result) end; end; + function CreateTexture(RecName: AnsiString; Map: string; log: Boolean): Integer; var WAD: TWADFile; @@ -1466,55 +1460,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 + fi.tag := -1; + end + else begin - addResToExternalResList(resFile); + 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; @@ -1699,7 +1704,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(); @@ -2212,21 +2217,13 @@ begin begin e_WriteLog(' Loading sky: ' + gMapInfo.SkyName, TMsgType.Notify); g_Game_SetLoadingText(_lc[I_LOAD_SKY], 0, False); - FileName := g_ExtractWadName(gMapInfo.SkyName); - - if (FileName <> '') then FileName := GameDir+'/wads/'+FileName else FileName := g_ExtractWadName(Res); - if gTextureFilter then TEXTUREFILTER := GL_LINEAR else TEXTUREFILTER := GL_NEAREST; try - s := FileName+':'+g_ExtractFilePathName(gMapInfo.SkyName); + s := e_GetResourcePath(WadDirs, gMapInfo.SkyName, g_ExtractWadName(Res)); if g_Texture_CreateWAD(BackID, s) then - begin - g_Game_SetupScreenSize(); - end + g_Game_SetupScreenSize else - begin - g_FatalError(Format(_lc[I_GAME_ERROR_SKY], [s])); - end; + g_FatalError(Format(_lc[I_GAME_ERROR_SKY], [s])) finally TEXTUREFILTER := GL_NEAREST; end; @@ -2238,16 +2235,8 @@ begin begin e_WriteLog(' Loading music: ' + gMapInfo.MusicName, TMsgType.Notify); g_Game_SetLoadingText(_lc[I_LOAD_MUSIC], 0, False); - FileName := g_ExtractWadName(gMapInfo.MusicName); - - if FileName <> '' then - FileName := GameDir+'/wads/'+FileName - else - begin - FileName := g_ExtractWadName(Res); - end; - s := FileName+':'+g_ExtractFilePathName(gMapInfo.MusicName); + s := e_GetResourcePath(WadDirs, gMapInfo.MusicName, g_ExtractWadName(Res)); if g_Sound_CreateWADEx(gMapInfo.MusicName, s, True) then ok := True else @@ -2300,6 +2289,7 @@ begin end; end; + compactExtResList(); e_WriteLog('Done loading map.', TMsgType.Notify); Result := True; end;