X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=ec7f8f29831e03151a1da5bf2f1227a134d51964;hb=a959696d242bc66e6890d281eb6e5d627c2588e9;hp=0505dceb74d336c6d8a2afe83ea699fc9c13782c;hpb=414f2873efa0cce84499f64774db7000e6268971;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 0505dce..ec7f8f2 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -101,9 +101,9 @@ procedure g_Game_StartClient(Addr: String; Port: Word; PW: String); procedure g_Game_Restart(); procedure g_Game_RestartLevel(); procedure g_Game_RestartRound(NoMapRestart: Boolean = False); -procedure g_Game_ClientWAD(NewWAD: String; const WHash: TMD5Digest); +function g_Game_ClientWAD (NewWAD: String; const WHash: TMD5Digest): AnsiString; procedure g_Game_SaveOptions(); -function g_Game_StartMap(Map: String; Force: Boolean = False; const oldMapPath: AnsiString=''): Boolean; +function g_Game_StartMap(asMegawad: Boolean; Map: String; Force: Boolean = False; const oldMapPath: AnsiString=''): Boolean; procedure g_Game_ChangeMap(const MapPath: String); procedure g_Game_ExitLevel(const Map: AnsiString); function g_Game_GetFirstMap(WAD: String): String; @@ -1273,6 +1273,10 @@ end; procedure g_Game_Init(); var SR: TSearchRec; + knownFiles: array of AnsiString = nil; + found: Boolean; + wext, s: AnsiString; + f: Integer; begin gExit := 0; gMapToDelete := ''; @@ -1302,26 +1306,42 @@ begin g_Game_SetLoadingText(_lc[I_LOAD_MODELS], 0, False); g_PlayerModel_LoadData(); - if e_FindFirst(ModelDirs, '*.wad', faAnyFile, SR) = 0 then - repeat - if not g_PlayerModel_Load(e_FindWad(ModelDirs, SR.Name)) then - e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning); - until FindNext(SR) <> 0; - FindClose(SR); - - if e_FindFirst(ModelDirs, '*.pk3', faAnyFile, SR) = 0 then - repeat - if not g_PlayerModel_Load(e_FindWad(ModelDirs, SR.Name)) then - e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning); - until FindNext(SR) <> 0; - FindClose(SR); - - if e_FindFirst(ModelDirs, '*.zip', faAnyFile, SR) = 0 then - repeat - if not g_PlayerModel_Load(e_FindWad(ModelDirs, SR.Name)) then - e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning); - until FindNext(SR) <> 0; - FindClose(SR); + // load models from all possible wad types, in all known directories + // this does a loosy job (linear search, ooph!), but meh + for wext in wadExtensions do + begin + for f := High(ModelDirs) downto Low(ModelDirs) do + begin + if (FindFirst(ModelDirs[f]+DirectorySeparator+'*'+wext, faAnyFile, SR) = 0) then + begin + repeat + found := false; + for s in knownFiles do + begin + if (strEquCI1251(forceFilenameExt(SR.Name, ''), forceFilenameExt(ExtractFileName(s), ''))) then + begin + found := true; + break; + end; + end; + if not found then + begin + SetLength(knownFiles, length(knownFiles)+1); + knownFiles[High(knownFiles)] := ModelDirs[f]+DirectorySeparator+SR.Name; + end; + until (FindNext(SR) <> 0); + end; + FindClose(SR); + end; + end; + + if (length(knownFiles) = 0) then raise Exception.Create('no player models found!'); + + if (length(knownFiles) = 1) then e_LogWriteln('1 player model found.', TMsgType.Notify) else e_LogWritefln('%d player models found.', [Integer(length(knownFiles))], TMsgType.Notify); + for s in knownFiles do + begin + if not g_PlayerModel_Load(s) then e_LogWritefln('Error loading model "%s"', [s], TMsgType.Warning); + end; gGameOn := false; gPauseMain := false; @@ -4344,7 +4364,7 @@ begin end; // Çàãðóçêà è çàïóñê êàðòû: - if not g_Game_StartMap(MAP, True) then + if not g_Game_StartMap(false{asMegawad}, MAP, True) then begin if (Pos(':\', Map) > 0) or (Pos(':/', Map) > 0) then tmps := Map else tmps := gGameSettings.WAD + ':\' + MAP; g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [tmps])); @@ -4434,7 +4454,7 @@ begin end; // Çàãðóçêà è çàïóñê êàðòû: - if not g_Game_StartMap(Map, True) then + if not g_Game_StartMap(true{asMegawad}, Map, True) then begin g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Map])); Exit; @@ -4545,7 +4565,7 @@ begin g_Net_Slist_ServerStarted(); // Çàãðóçêà è çàïóñê êàðòû: - if not g_Game_StartMap(Map, True) then + if not g_Game_StartMap(false{asMegawad}, Map, True) then begin g_Net_Slist_ServerClosed(); g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Map])); @@ -4684,7 +4704,7 @@ begin e_LogWritefln('using downloaded map wad [%s] for [%s]`', [newResPath, WadName], TMsgType.Notify); end; //newResPath := ExtractRelativePath(MapsDir, newResPath); - + gPlayer1 := g_Player_Get(g_Player_Create(gPlayer1Settings.Model, gPlayer1Settings.Color, @@ -4703,7 +4723,7 @@ begin gPlayer1.UID := NetPlrUID1; gPlayer1.Reset(True); - if not g_Game_StartMap(newResPath + ':\' + Map, True) then + if not g_Game_StartMap(false{asMegawad}, newResPath + ':\' + Map, True) then begin g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [WadName + ':\' + Map])); @@ -4764,13 +4784,16 @@ end; procedure g_Game_SaveOptions; var s: AnsiString; begin - s := e_GetDir(ConfigDirs); + s := e_GetWriteableDir(ConfigDirs); if s <> '' then g_Options_Write_Video(s + '/' + CONFIG_FILENAME) else e_LogWritefln('unable to find or create directory for configs', []); end; +var + lastAsMegaWad: Boolean = false; + procedure g_Game_ChangeMap(const MapPath: String); var Force: Boolean; @@ -4784,7 +4807,7 @@ begin Force := False; gExitByTrigger := False; end; - if not g_Game_StartMap(MapPath, Force) then + if not g_Game_StartMap(lastAsMegaWad, MapPath, Force) then g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [MapPath])); end; @@ -4800,10 +4823,10 @@ begin MessageTime := 0; gGameOn := False; g_Game_ClearLoading(); - g_Game_StartMap(Map, True, gCurrentMapFileName); + g_Game_StartMap(lastAsMegaWad, Map, True, gCurrentMapFileName); end; -function g_Game_StartMap(Map: String; Force: Boolean = False; const oldMapPath: AnsiString=''): Boolean; +function g_Game_StartMap (asMegawad: Boolean; Map: String; Force: Boolean = False; const oldMapPath: AnsiString=''): Boolean; var NewWAD, ResName: String; I: Integer; @@ -4825,34 +4848,59 @@ begin g_Player_ResetTeams(); + lastAsMegaWad := asMegawad; if isWadPath(Map) then begin NewWAD := g_ExtractWadName(Map); ResName := g_ExtractFileName(Map); if g_Game_IsServer then begin -// nws := e_FindWad(MapDirs, NewWAD); - nws := NewWAD; + nws := findDiskWad(NewWAD); + //writeln('000: Map=[', Map, ']; nws=[', nws, ']; NewWAD=[', NewWAD, ']'); + if (asMegawad) then + begin + if (length(nws) = 0) then nws := e_FindWad(MegawadDirs, NewWAD); + if (length(nws) = 0) then nws := e_FindWad(MapDirs, NewWAD); + end + else + begin + if (length(nws) = 0) then nws := e_FindWad(MapDirs, NewWAD); + if (length(nws) = 0) then nws := e_FindWad(MegawadDirs, NewWAD); + end; + //if (length(nws) = 0) then nws := e_FindWad(MapDownloadDirs, NewWAD); + //writeln('001: Map=[', Map, ']; nws=[', nws, ']; NewWAD=[', NewWAD, ']'); + //nws := NewWAD; if (length(nws) = 0) then begin - ResName := ''; + ResName := ''; // failed end else begin + NewWAD := nws; if (g_Game_IsNet) then gWADHash := MD5File(nws); //writeln('********: nws=', nws, ' : Map=', Map, ' : nw=', NewWAD, ' : resname=', ResName); g_Game_LoadWAD(NewWAD); end; - end else + end + else + begin // hash received in MC_RECV_GameEvent -> NET_EV_MAPSTART - g_Game_ClientWAD(NewWAD, gWADHash); - end else + NewWAD := g_Game_ClientWAD(NewWAD, gWADHash); + end; + end + else + begin + NewWAD := gGameSettings.WAD; ResName := Map; + end; //writeln('********: gsw=', gGameSettings.WAD, '; rn=', ResName); result := false; - if ResName <> '' then - result := g_Map_Load(gGameSettings.WAD + ':\' + ResName); + if (ResName <> '') and (NewWAD <> '') then + begin + //result := g_Map_Load(gGameSettings.WAD + ':\' + ResName); + result := g_Map_Load(NewWAD+':\'+ResName); + end; if Result then begin g_Player_ResetAll(Force or gLastMap, gGameSettings.GameType = GT_SINGLE); @@ -5017,16 +5065,18 @@ begin gNextMap := Map; end; -procedure g_Game_ClientWAD(NewWAD: String; const WHash: TMD5Digest); +function g_Game_ClientWAD (NewWAD: String; const WHash: TMD5Digest): AnsiString; var gWAD{, xwad}: String; begin + result := NewWAD; if not g_Game_IsClient then Exit; //e_LogWritefln('*** g_Game_ClientWAD: `%s`', [NewWAD]); gWAD := g_Res_DownloadMapWAD(ExtractFileName(NewWAD), WHash); if gWAD = '' then begin + result := ''; g_Game_Free(); g_FatalError(Format(_lc[I_GAME_ERROR_MAP_WAD], [ExtractFileName(NewWAD)])); Exit; @@ -5041,6 +5091,7 @@ begin e_LogWritefln('using downloaded client map wad [%s]`', [NewWAD], TMsgType.Notify); g_Game_LoadWAD(NewWAD); + result := NewWAD; { if LowerCase(NewWAD) = LowerCase(gGameSettings.WAD) then Exit; @@ -5453,7 +5504,7 @@ begin if (Length(P) > 1) then NetInterpLevel := StrToIntDef(P[1], NetInterpLevel); g_Console_Add('net_interp = ' + IntToStr(NetInterpLevel)); - s := e_GetDir(ConfigDirs); + s := e_GetWriteableDir(ConfigDirs); if s <> '' then begin config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME); @@ -5472,7 +5523,7 @@ begin else g_Console_Add('net_forceplayerupdate = 0'); - s := e_GetDir(ConfigDirs); + s := e_GetWriteableDir(ConfigDirs); if s <> '' then begin config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME); @@ -5492,7 +5543,7 @@ begin else g_Console_Add('net_predictself = 0'); - s := e_GetDir(ConfigDirs); + s := e_GetWriteableDir(ConfigDirs); if s <> '' then begin config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME); @@ -6713,6 +6764,7 @@ begin if found then begin // no such map, found wad + pw := P[1]; SetLength(P, 3); P[1] := ExpandFileName(pw); P[2] := g_Game_GetFirstMap(P[1]);