private void SavePatchXML() { List <AsmPatch> patches = GetAllSelectedPatches(); foreach (AsmPatch patch in patches) { patch.Update(AsmUtility); } FreeSpaceMode mode = FreeSpace.GetMode(AsmUtility); string xml = PatchXmlReader.CreatePatchXML(patches, mode); SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "XML file (*.xml)|*.xml"; saveFileDialog.FileName = string.Empty; saveFileDialog.CheckFileExists = false; if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { btn_SavePatchXML.Enabled = false; System.IO.File.WriteAllText(saveFileDialog.FileName, xml, Encoding.UTF8); PatcherLib.MyMessageBox.Show(this, "Complete!", "Complete!", MessageBoxButtons.OK); Close(); } }
private void btn_OpenConflictChecker_Click(object sender, EventArgs e) { FreeSpaceMode mode = FreeSpace.GetMode(asmUtility); ConflictCheckerForm conflictCheckerForm = new ConflictCheckerForm(GetCurrentFilePatches(), mode); conflictCheckerForm.Show(); }
public void MoveBlocks(ASMEncoding.ASMEncodingUtility utility, IEnumerable <MovePatchRange> movePatchRanges) { /* * Dictionary<PatchRange, bool> isSequentialAdd = new Dictionary<PatchRange, bool>(); * foreach (KeyValuePair<PatchRange, uint> blockMove in blockMoves) * { * isSequentialAdd[blockMove.Key] = false; * } */ List <ASMEncoding.Helpers.BlockMove> blockMoves = new List <ASMEncoding.Helpers.BlockMove>(); foreach (MovePatchRange patchRange in movePatchRanges) { //PatchRange patchRange = movePair.Key; //uint fileToRamOffset = PatcherLib.Iso.PsxIso.GetRamOffset(patchRange.Sector, true); FreeSpaceMode mode = FreeSpace.GetMode(utility); Type sectorType = (mode == FreeSpaceMode.PSP) ? typeof(PatcherLib.Iso.PspIso.Sectors) : typeof(PatcherLib.Iso.PsxIso.Sectors); Enum sector = (Enum)Enum.ToObject(sectorType, patchRange.Sector); uint fileToRamOffset = (mode == FreeSpaceMode.PSP) ? PatcherLib.Iso.PspIso.GetRamOffsetUnsigned((PatcherLib.Iso.PspIso.Sectors)sector) : PatcherLib.Iso.PsxIso.GetRamOffset((PatcherLib.Iso.PsxIso.Sectors)sector, true); ASMEncoding.Helpers.BlockMove blockMove = new ASMEncoding.Helpers.BlockMove(); blockMove.Location = (uint)patchRange.StartOffset + fileToRamOffset; blockMove.EndLocation = (uint)patchRange.EndOffset + fileToRamOffset; blockMove.Offset = patchRange.MoveOffset; blockMoves.Add(blockMove); } List <PatchedByteArray> allPatchList = GetAllPatches(); //foreach (PatchedByteArray patchedByteArray in innerList) foreach (PatchedByteArray patchedByteArray in allPatchList) { if (patchedByteArray is InputFilePatch) { continue; } byte[] bytes = patchedByteArray.GetBytes(); foreach (MovePatchRange patchRange in movePatchRanges) { //PatchRange patchRange = movePair.Key; //uint offset = movePair.Value; //if ((patchedByteArray.RamOffset == blockMove.Location) && ((patchedByteArray.RamOffset + bytes.Length) == blockMove.EndLocation)) //if (patchedByteArray.RamOffset == blockMove.Location) //PatchRange patchRange = new PatchRange(patchedByteArray); //PatchRange patchRange2 = new PatchRange( //if ( //if (blockMove.Key if (patchRange.HasOverlap(patchedByteArray)) { patchedByteArray.Offset += patchRange.MoveOffset; // offset; patchedByteArray.RamOffset += patchRange.MoveOffset; // offset; //isSequentialAdd[patchRange] = true; } /* * else if ((isSequentialAdd[patchRange]) && (patchedByteArray.IsSequentialOffset)) * { * patchedByteArray.Offset += offset; * patchedByteArray.RamOffset += offset; * //patchRange.EndOffset += (uint)bytes.Length; * } * else * { * isSequentialAdd[patchRange] = false; * } */ } if ((patchedByteArray.IsCheckedAsm) && (!patchedByteArray.IsMoveSimple)) { byte[] newBytes = utility.UpdateBlockReferences(bytes, (uint)patchedByteArray.RamOffset, true, blockMoves); patchedByteArray.SetBytes(newBytes); } } foreach (ASMEncoding.Helpers.BlockMove blockMove in blockMoves) { bool isAlreadyPresent = false; foreach (ASMEncoding.Helpers.BlockMove listBlockMove in blockMoveList) { if (blockMove.IsEqual(listBlockMove)) { isAlreadyPresent = true; break; } } if (!isAlreadyPresent) { blockMoveList.Add(blockMove); } } }
public static ConflictResolveResult ResolveConflicts(IList <AsmPatch> patchList, ASMEncoding.ASMEncodingUtility asmUtility, int maxConflictResolveAttempts = MaxConflictResolveAttempts) { List <AsmPatch> resultPatchList = new List <AsmPatch>(); Dictionary <AsmPatch, int> patchIndexMap = new Dictionary <AsmPatch, int>(); StringBuilder sbMessage = new StringBuilder(); bool hasConflicts = false; for (int index = 0; index < patchList.Count; index++) { resultPatchList.Add(patchList[index]); patchIndexMap.Add(patchList[index], index); } Context context = (asmUtility.EncodingMode == ASMEncoding.ASMEncodingMode.PSP) ? Context.US_PSP : Context.US_PSX; FreeSpaceMode mode = FreeSpace.GetMode(context); FreeSpaceMaps freeSpaceMaps = FreeSpace.GetFreeSpaceMaps(resultPatchList, mode); foreach (PatchRange freeSpaceRange in freeSpaceMaps.PatchRangeMap.Keys) { List <PatchedByteArray> innerPatches = freeSpaceMaps.PatchRangeMap[freeSpaceRange]; FreeSpaceAnalyzeResult analyzeResult = FreeSpace.Analyze(innerPatches, freeSpaceRange, true); int conflictResolveAttempts = 0; /* * Type sectorType = ISOHelper.GetSectorType(context); * Enum sector = (Enum)Enum.ToObject(sectorType, freeSpaceRange.Sector); * string strSector = (mode == FreeSpaceMode.PSP) ? PspIso.GetSectorName((PspIso.Sectors)sector) : PsxIso.GetSectorName((PsxIso.Sectors)sector); */ string strSector = ISOHelper.GetSectorName(freeSpaceRange.Sector, context); while ((analyzeResult.HasConflicts) && (conflictResolveAttempts < maxConflictResolveAttempts)) { bool isStatic = false; bool stayStatic = false; int endIndex = innerPatches.Count - 1; for (int index = 0; index < endIndex; index++) { PatchedByteArray innerPatch = innerPatches[index]; isStatic = innerPatch.IsStatic || stayStatic; stayStatic = (innerPatch.IsStatic) && (innerPatch.IsPatchEqual(innerPatches[index + 1])); if ((analyzeResult.ConflictIndexes.Contains(index)) && (!isStatic)) { long moveOffset = analyzeResult.LargestGapOffset - innerPatch.Offset; MovePatchRange movePatchRange = new MovePatchRange(new PatchRange(innerPatch), moveOffset); AsmPatch asmPatch = freeSpaceMaps.InnerPatchMap[innerPatch]; int resultPatchIndex = patchIndexMap[asmPatch]; patchIndexMap.Remove(asmPatch); asmPatch = asmPatch.Copy(); resultPatchList[resultPatchIndex] = asmPatch; patchIndexMap.Add(asmPatch, resultPatchIndex); asmPatch.MoveBlock(asmUtility, movePatchRange); asmPatch.Update(asmUtility); sbMessage.AppendLine("Conflict resolved by moving segment of patch \"" + asmPatch.Name + "\" in sector " + strSector + " from offset " + innerPatch.Offset.ToString("X") + " to " + analyzeResult.LargestGapOffset.ToString("X") + "."); freeSpaceMaps = FreeSpace.GetFreeSpaceMaps(resultPatchList, mode); innerPatches = freeSpaceMaps.PatchRangeMap[freeSpaceRange]; analyzeResult = FreeSpace.Analyze(innerPatches, freeSpaceRange, false); conflictResolveAttempts++; break; } } } if (analyzeResult.HasConflicts) { hasConflicts = true; int endIndex = innerPatches.Count - 1; for (int index = 0; index < endIndex; index++) { if (analyzeResult.ConflictIndexes.Contains(index)) { sbMessage.Length = 0; sbMessage.AppendLine("Conflict in sector " + strSector + " at offset " + innerPatches[index].Offset.ToString("X") + "!"); break; } } } } return(new ConflictResolveResult(resultPatchList, hasConflicts, sbMessage.ToString())); }