X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=8366787a04365305daa80afd9c8d47e574458427;hb=36689adbefc512dc228ccdc28b615246e1b24609;hp=4fd60574821c735e0e057cf05dbfe67e00812e9c;hpb=4ee9edff7adfcf0f2cbd3cf32b1cb1790061fe14;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 4fd6057..8366787 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; @@ -4364,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])); @@ -4454,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; @@ -4565,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])); @@ -4693,7 +4693,7 @@ begin //if newResPath = '' then begin //g_Game_SetLoadingText(_lc[I_LOAD_DL_RES], 0, False); - newResPath := g_Res_DownloadMapWAD(WadName, gWADHash); + newResPath := g_Res_DownloadMapWAD(ExtractFileName(WadName), gWADHash); if newResPath = '' then begin g_FatalError(_lc[I_NET_ERR_HASH]); @@ -4704,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, @@ -4723,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])); @@ -4784,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; @@ -4804,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; @@ -4820,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; @@ -4845,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); @@ -5037,30 +5065,28 @@ 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; end; -(* - xwad := ExtractRelativePath(MapsDir, gWAD); - e_LogWritefln('using downloaded client map wad [%s] for [%s]`', [xwad, NewWAD], TMsgType.Notify); - NewWAD := xwad; - g_Game_LoadWAD(NewWAD); -*) + e_LogWritefln('using downloaded client map wad [%s] for [%s]', [gWAD, NewWAD], TMsgType.Notify); + NewWAD := gWAD; - 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; @@ -5473,7 +5499,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); @@ -5492,7 +5518,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); @@ -5512,7 +5538,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); @@ -6733,6 +6759,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]); @@ -7217,16 +7244,24 @@ begin end; procedure g_TakeScreenShot; - var s: TStream; t: TDateTime; date, name: String; + var s: TStream; t: TDateTime; dir, date, name: String; begin if e_NoGraphics then Exit; - t := Now; - DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t); - name := 'screenshot-' + date + '.png'; try - s := e_CreateResource(ScreenshotDirs, name); - e_MakeScreenshot(s, gScreenWidth, gScreenHeight); - g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name])) + t := Now; + dir := e_GetWriteableDir(ScreenshotDirs); + DateTimeToString(date, 'yyyy-mm-dd-hh-nn-ss', t); + name := e_CatPath(dir, 'screenshot-' + date + '.png'); + s := createDiskFile(name); + try + e_MakeScreenshot(s, gScreenWidth, gScreenHeight); + s.Free; + g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [name])) + except + g_Console_Add(Format(_lc[I_CONSOLE_ERROR_WRITE], [name])); + s.Free; + DeleteFile(name) + end except g_Console_Add('oh shit, i can''t create screenshot!') end