private static void SaveZippedPatch(string path, Context destinationContext) { using (ZipOutputStream stream = new ZipOutputStream(File.Open(path, FileMode.Create, FileAccess.ReadWrite))) { const string fileVersion = "1.0"; bool psp = destinationContext == Context.US_PSP; WriteFileToZip(stream, "version", Encoding.UTF8.GetBytes(fileVersion)); WriteFileToZip(stream, "type", Encoding.UTF8.GetBytes(destinationContext.ToString())); WriteFileToZip(stream, elementNames[ElementName.Abilities], Abilities.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.AbilityAnimations], AbilityAnimations.ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.AbilityEffects], Abilities.ToEffectsByteArray()); WriteFileToZip(stream, elementNames[ElementName.ItemAbilityEffects], Abilities.ToItemEffectsByteArray()); WriteFileToZip(stream, elementNames[ElementName.ReactionAbilityEffects], Abilities.ToReactionEffectsByteArray()); WriteFileToZip(stream, elementNames[ElementName.Items], Items.ToFirstByteArray()); WriteFileToZip(stream, elementNames[ElementName.ItemAttributes], ItemAttributes.ToFirstByteArray()); if (psp && Context == Context.US_PSP) { WriteFileToZip(stream, elementNames[ElementName.PSPItems], Items.ToSecondByteArray()); WriteFileToZip(stream, elementNames[ElementName.PSPItemAttributes], ItemAttributes.ToSecondByteArray()); WriteFileToZip(stream, elementNames[ElementName.ENTD5], ENTDs.PSPEventsToByteArray()); } WriteFileToZip(stream, elementNames[ElementName.Jobs], Jobs.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.JobLevels], JobLevels.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.MonsterSkills], MonsterSkills.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.SkillSets], SkillSets.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.ActionMenus], ActionMenus.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.StatusAttributes], StatusAttributes.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.InflictStatuses], InflictStatuses.ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.Poaching], PoachProbabilities.ToByteArray(destinationContext)); WriteFileToZip(stream, elementNames[ElementName.ENTD1], ENTDs.ENTDs[0].ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.ENTD2], ENTDs.ENTDs[1].ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.ENTD3], ENTDs.ENTDs[2].ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.ENTD4], ENTDs.ENTDs[3].ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.MoveFindItems], MoveFind.ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.StoreInventories], StoreInventories.ToByteArray()); WriteFileToZip(stream, elementNames[ElementName.Propositions], Propositions.ToByteArray()); if (!AllPropositions.CanFixBuggyLevelBonuses(destinationContext)) { WriteFileToZip(stream, "BuggyPropositions", new byte[0]); } } }
public static void ConvertPsxPatchToPsp(string filename) { Dictionary <string, byte[]> fileList = new Dictionary <string, byte[]>(); using (ZipFile zipFile = new ZipFile(filename)) { foreach (ZipEntry entry in zipFile) { byte[] bytes = new byte[entry.Size]; StreamUtils.ReadFully(zipFile.GetInputStream(entry), bytes); fileList[entry.Name] = bytes; } } File.Delete(filename); if (fileList["type"].ToUTF8String() == Context.US_PSX.ToString()) { List <byte> amBytes = new List <byte>(fileList["actionMenus"]); amBytes.AddRange(PSPResources.ActionEventsBin.Sub(0xE0, 0xE2)); fileList["actionMenus"] = amBytes.ToArray(); AllJobs aj = new AllJobs(Context.US_PSX, fileList["jobs"]); List <Job> jobs = new List <Job>(aj.Jobs); AllJobs defaultPspJobs = new AllJobs(Context.US_PSP, PSPResources.JobsBin); for (int i = 0; i < jobs.Count; i++) { jobs[i].Equipment.Unknown1 = defaultPspJobs.Jobs[i].Equipment.Unknown1; jobs[i].Equipment.Unknown2 = defaultPspJobs.Jobs[i].Equipment.Unknown2; jobs[i].Equipment.Unknown3 = defaultPspJobs.Jobs[i].Equipment.Unknown3; jobs[i].Equipment.FellSword = defaultPspJobs.Jobs[i].Equipment.FellSword; jobs[i].Equipment.LipRouge = defaultPspJobs.Jobs[i].Equipment.LipRouge; jobs[i].Equipment.Unknown6 = defaultPspJobs.Jobs[i].Equipment.Unknown6; jobs[i].Equipment.Unknown7 = defaultPspJobs.Jobs[i].Equipment.Unknown7; jobs[i].Equipment.Unknown8 = defaultPspJobs.Jobs[i].Equipment.Unknown8; } for (int i = 160; i < 169; i++) { jobs.Add(defaultPspJobs.Jobs[i]); } ReflectionHelpers.SetFieldOrProperty(aj, "Jobs", jobs.ToArray()); fileList["jobs"] = aj.ToByteArray(Context.US_PSP); JobLevels jl = new JobLevels(Context.US_PSX, fileList["jobLevels"]); JobLevels pspJobLevels = new JobLevels(Context.US_PSP, PSPResources.JobLevelsBin); foreach (string jobName in new string[19] { "Archer", "Arithmetician", "Bard", "BlackMage", "Chemist", "Dancer", "Dragoon", "Geomancer", "Knight", "Mime", "Monk", "Mystic", "Ninja", "Orator", "Samurai", "Summoner", "Thief", "TimeMage", "WhiteMage" }) { Requirements psxR = ReflectionHelpers.GetFieldOrProperty <Requirements>(jl, jobName); Requirements pspR = ReflectionHelpers.GetFieldOrProperty <Requirements>(pspJobLevels, jobName); psxR.Unknown1 = pspR.Unknown1; psxR.Unknown2 = pspR.Unknown2; psxR.DarkKnight = pspR.DarkKnight; psxR.OnionKnight = pspR.OnionKnight; } ReflectionHelpers.SetFieldOrProperty(jl, "OnionKnight", pspJobLevels.OnionKnight); ReflectionHelpers.SetFieldOrProperty(jl, "DarkKnight", pspJobLevels.DarkKnight); ReflectionHelpers.SetFieldOrProperty(jl, "Unknown", pspJobLevels.Unknown); fileList["jobLevels"] = jl.ToByteArray(Context.US_PSP); List <byte> ssBytes = new List <byte>(fileList["skillSets"]); ssBytes.AddRange(PSPResources.SkillSetsBin.Sub(ssBytes.Count)); fileList["skillSets"] = ssBytes.ToArray(); fileList["entd5"] = PSPResources.ENTD5; fileList["type"] = Encoding.UTF8.GetBytes(Context.US_PSP.ToString()); fileList["pspItemAttributes"] = PSPResources.NewItemAttributesBin; fileList["pspItems"] = PSPResources.NewItemsBin; } using (FileStream outFile = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) using (ZipOutputStream output = new ZipOutputStream(outFile)) { foreach (KeyValuePair <string, byte[]> entry in fileList) { WriteFileToZip(output, entry.Key, entry.Value); } } }