diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index 0505dceb74d336c6d8a2afe83ea699fc9c13782c..ec7f8f29831e03151a1da5bf2f1227a134d51964 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
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;
procedure g_Game_Init();
var
SR: TSearchRec;
+ knownFiles: array of AnsiString = nil;
+ found: Boolean;
+ wext, s: AnsiString;
+ f: Integer;
begin
gExit := 0;
gMapToDelete := '';
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;
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]));
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;
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]));
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,
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]));
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;
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;
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;
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);
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;
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;
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);
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);
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);
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]);