anchor.diff:  end;
   
   
  -procedure TKMGame.AutoSave(aTimestamp: TDateTime);
  +procedure DoAutoSaveRename(aIsMultiPlayerOrSpec: Boolean);
   var
     I: Integer;
   begin
  -  Save('autosave', aTimestamp); //Save to temp file
  -
     //Delete last autosave
  -  KMDeleteFolder(SavePath('autosave' + Int2Fix(gGameApp.GameSettings.AutosaveCount, 2), IsMultiPlayerOrSpec));
  +  KMDeleteFolder(TKMGame.SavePath('autosave' + Int2Fix(gGameApp.GameSettings.AutosaveCount, 2), aIsMultiPlayerOrSpec));
   
     //Shift remaining autosaves by 1 position back
     for I := gGameApp.GameSettings.AutosaveCount downto 2 do // 03 to 01
  -    KMMoveFolder(SavePath('autosave' + Int2Fix(I - 1, 2), IsMultiPlayerOrSpec), SavePath('autosave' + Int2Fix(I, 2), IsMultiPlayerOrSpec));
  +    KMMoveFolder(TKMGame.SavePath('autosave' + Int2Fix(I - 1, 2), aIsMultiPlayerOrSpec), TKMGame.SavePath('autosave' + Int2Fix(I, 2), aIsMultiPlayerOrSpec));
   
     //Rename temp to be first in list
  -  KMMoveFolder(SavePath('autosave', IsMultiPlayerOrSpec), SavePath('autosave01', IsMultiPlayerOrSpec));
  +  KMMoveFolder(TKMGame.SavePath('autosave', aIsMultiPlayerOrSpec), TKMGame.SavePath('autosave01', aIsMultiPlayerOrSpec));
  +end;
  +
  +
  +procedure TKMGame.AutoSave(aTimestamp: TDateTime);
  +{$IFDEF WDC}
  +var
  +  LocalIsMultiPlayerOrSpec: Boolean;
  +{$ENDIF}
  +begin
  +  Save('autosave', aTimestamp); //Save to temp file
  +
  +  //If possible perform file deletion/renaming in a different thread so we don't delay game
  +  {$IFDEF WDC}
  +    //Avoid accessing Self from async thread, copy required states to local variables
  +    LocalIsMultiPlayerOrSpec := IsMultiPlayerOrSpec;
  +    TTask.Run(procedure
  +    begin
  +      DoAutoSaveRename(LocalIsMultiPlayerOrSpec);
  +    end);
  +  {$ELSE}
  +    DoAutoSaveRename(IsMultiPlayerOrSpec);
  +  {$ENDIF}
   end;
   
   
  
positive.code: end;
  
  
  function TKMGame.SavePath(const aName: UnicodeString; aIsMultiplayer: Boolean): UnicodeString;
  begin
    Result := TKMSavesCollection.Path(aName, aIsMultiplayer);
  end;
  
  
  function TKMGame.SaveName(const aFolder, aName, aExt: UnicodeString; aIsMultiplayer: Boolean): UnicodeString;
  begin
    Result := TKMSavesCollection.Path(aFolder, aIsMultiplayer) + aName + '.' + aExt;
  end;
  
  
  function TKMGame.SaveName(const aName, aExt: UnicodeString; aIsMultiplayer: Boolean): UnicodeString;
  begin
    Result := TKMSavesCollection.FullPath(aName, aExt, aIsMultiplayer);
  end;
  
negative.code:     procedure SetGameSpeedActual(aSpeed: Single);
      procedure SetGameSpeedGIP(aSpeed: Single; aUpdateActual: Boolean = False);
  
      class function SavePath(const aName: UnicodeString; aIsMultiplayer: Boolean): UnicodeString;
      class function SaveName(const aFolder, aName, aExt: UnicodeString; aIsMultiplayer: Boolean): UnicodeString; overload;
      class function SaveName(const aName, aExt: UnicodeString; aIsMultiplayer: Boolean): UnicodeString; overload;
  
      procedure UpdateMultiplayerTeams;
  
  