Skip to content

Commit

Permalink
fixed fallout 3/fallout nv load order issues
Browse files Browse the repository at this point in the history
  • Loading branch information
matortheeternal committed May 6, 2018
1 parent 0c7cb7f commit b938360
Showing 1 changed file with 32 additions and 44 deletions.
76 changes: 32 additions & 44 deletions src/xeSetup.pas
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ TRefThread = class(TThread)
procedure RemoveMissingFiles(var sl: TStringList);
procedure RemoveESLs(var sl: TStringList);
procedure AddMissingFiles(var sl: TStringList);
procedure GetPluginDates(var sl: TStringList);
procedure AddBaseMasters(var sl: TStringList);
procedure FixLoadOrder(var sl: TStringList; const filename: String; var index: Integer);
function PluginListCompare(List: TStringList; Index1, Index2: Integer): Integer;
Expand Down Expand Up @@ -486,12 +485,30 @@ procedure RemoveESLs(var sl: TStringList);
sl.Delete(i);
end;

{ Try to fit a meaningful modified date of a file into 32 bits integer value
For relative load order sorting only
Oblivion GOG version has dates from 1969 year and FileAge() doesn't support them }
function GetPluginDate(const aFileName: string): Cardinal;
const
DateOmitYears = 60;
DatePrecision = 100000;
var
F: TSearchRec;
begin
if FindFirst(aFileName, faAnyFile, F) = 0 then begin
Result := Round((F.TimeStamp - 364 * DateOmitYears) * DatePrecision);
FindClose(F);
end else
Result := 0;
end;

{ Add missing *.esp and *.esm files to list }
procedure AddMissingFiles(var sl: TStringList);
var
F: TSearchRec;
i, j: integer;
slNew: TStringList;
fileSortKey: Cardinal;
begin
slNew := TStringList.Create;
try
Expand All @@ -500,8 +517,10 @@ procedure AddMissingFiles(var sl: TStringList);
repeat
if not (IsFileESM(F.Name) or IsFileESP(F.Name)) then
continue;
if sl.IndexOf(F.Name) = -1 then
slNew.AddObject(F.Name, TObject(FileAge(wbDataPath + F.Name)));
if sl.IndexOf(F.Name) = -1 then begin
fileSortKey := GetPluginDate(wbDataPath + F.Name);
slNew.AddObject(F.Name, TObject(fileSortKey));
end;
until FindNext(F) <> 0;
finally
FindClose(F);
Expand Down Expand Up @@ -534,33 +553,21 @@ procedure AddMissingFiles(var sl: TStringList);
end;
end;

{ Get date modified for plugins in load order and store in stringlist objects }
procedure GetPluginDates(var sl: TStringList);
var
i: Integer;
begin
for i := 0 to Pred(sl.Count) do
sl.Objects[i] := TObject(FileAge(wbDataPath + sl[i]));
end;

procedure AddBaseMasters(var sl: TStringList);
var
index: Integer;
begin
index := 0;
if (wbGameMode = gmTES5) then begin
FixLoadOrder(sl, 'Skyrim.esm', index);
FixLoadOrder(sl, 'Update.esm', index);
end
FixLoadOrder(sl, wbGameName + '.esm', index);
if (wbGameMode = gmTES5) then
FixLoadOrder(sl, 'Update.esm', index)
else if (wbGameMode = gmSSE) then begin
FixLoadOrder(sl, 'Skyrim.esm', index);
FixLoadOrder(sl, 'Update.esm', index);
FixLoadOrder(sl, 'Dawnguard.esm', index);
FixLoadOrder(sl, 'HearthFires.esm', index);
FixLoadOrder(sl, 'Dragonborn.esm', index);
end
else if (wbGameMode = gmFO4) then begin
FixLoadOrder(sl, 'Fallout4.esm', index);
FixLoadOrder(sl, 'DLCRobot.esm', index);
FixLoadOrder(sl, 'DLCworkshop01.esm', index);
FixLoadOrder(sl, 'DLCCoast.esm', index);
Expand Down Expand Up @@ -594,32 +601,21 @@ procedure FixLoadOrder(var sl: TStringList; const filename: String; var index: I
function PluginListCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
IsESM1, IsESM2: Boolean;
FileAge1,FileAge2: Integer;
FileDateTime1, FileDateTime2: TDateTime;
FileSK1, FileSK2: Integer;
begin
IsESM1 := IsFileESM(List[Index1]);
IsESM2 := IsFileESM(List[Index2]);

if IsESM1 = IsESM2 then begin
FileAge1 := Integer(List.Objects[Index1]);
FileAge2 := Integer(List.Objects[Index2]);
FileSK1 := Cardinal(List.Objects[Index1]);
FileSK2 := Cardinal(List.Objects[Index2]);

if FileAge1 < FileAge2 then
if FileSK1 < FileSK2 then
Result := -1
else if FileAge1 > FileAge2 then
else if FileSK1 > FileSK2 then
Result := 1
else begin
if not SameText(List[Index1], List[Index1])
and FileAge(List[Index1], FileDateTime1) and FileAge(List[Index2], FileDateTime2) then begin
if FileDateTime1 < FileDateTime2 then
Result := -1
else if FileDateTime1 > FileDateTime2 then
Result := 1
else
Result := 0;
end else
Result := 0;
end;
else
Result := 0;

end else if IsESM1 then
Result := -1
Expand Down Expand Up @@ -768,14 +764,6 @@ function GetLoadOrder(len: PInteger): WordBool; cdecl;
LoadPluginsList(sLoadPath, slPlugins, True);
LoadLoadOrder(sLoadPath, slLoadOrder, slPlugins);

// if GameMode is not SkyrimSE or Fallout 4 and we don't
// have a loadorder.txt, sort by date modified
if (wbGameMode <> gmSSE) and (wbGameMode <> gmFO4)
and not FileExists(sLoadPath + 'loadorder.txt') then begin
GetPluginDates(slLoadOrder);
slLoadOrder.CustomSort(PluginListCompare);
end;

// add base masters if missing
AddBaseMasters(slLoadOrder);

Expand Down

0 comments on commit b938360

Please sign in to comment.