public JobLevels(Context context, IList <byte> bytes, JobLevels defaults) { Default = defaults; int jobCount = context == Context.US_PSP ? 22 : 19; int requirementsLength = context == Context.US_PSP ? 12 : 10; for (int i = 0; i < jobCount; i++) { ReflectionHelpers.SetFieldOrProperty(this, reqs[i], new Requirements(context, bytes.Sub(i * requirementsLength, (i + 1) * requirementsLength - 1), defaults == null ? null : ReflectionHelpers.GetFieldOrProperty <Requirements>(defaults, reqs[i]))); } int start = requirementsLength * jobCount; if (context == Context.US_PSX) { start += 2; } for (int i = 0; i < levels.Length; i++) { levels[i] = PatcherLib.Utilities.Utilities.BytesToUShort(bytes[start + i * 2], bytes[start + i * 2 + 1]); } }
private static void LoadDataFromBytes( IList <byte> abilities, IList <byte> abilityEffects, IList <byte> itemAbilityEffects, IList <byte> reactionEffects, IList <byte> abilityAnimations, IList <byte> oldItems, IList <byte> oldItemAttributes, IList <byte> newItems, IList <byte> newItemAttributes, IList <byte> jobs, IList <byte> jobLevels, IList <byte> skillSets, IList <byte> monsterSkills, IList <byte> actionMenus, IList <byte> statusAttributes, IList <byte> inflictStatuses, IList <byte> poach, IList <byte> entd1, IList <byte> entd2, IList <byte> entd3, IList <byte> entd4, IList <byte> entd5, IList <byte> moveFind, IList <byte> inventories, IList <byte> propositions, bool brokenLevelBonuses) { try { bool psp = Context == Context.US_PSP; var Abilities = new AllAbilities(abilities, abilityEffects, itemAbilityEffects, reactionEffects); var AbilityAnimations = new AllAnimations(Context, abilityAnimations, psp ? PSPResources.Binaries.AbilityAnimations : PSXResources.Binaries.AbilityAnimations); var Items = new AllItems(oldItems, newItems != null ? newItems : null); var ItemAttributes = new AllItemAttributes(oldItemAttributes, newItemAttributes != null ? newItemAttributes : null); var Jobs = new AllJobs(Context, jobs); var JobLevels = new JobLevels(Context, jobLevels, new JobLevels(Context, Context == Context.US_PSP ? PSPResources.Binaries.JobLevels : PSXResources.Binaries.JobLevels)); var SkillSets = new AllSkillSets(Context, skillSets, Context == Context.US_PSP ? PSPResources.Binaries.SkillSets : PSXResources.Binaries.SkillSets); var MonsterSkills = new AllMonsterSkills(monsterSkills); var ActionMenus = new AllActionMenus(actionMenus, Context); var StatusAttributes = new AllStatusAttributes(statusAttributes); var InflictStatuses = new AllInflictStatuses(inflictStatuses); var PoachProbabilities = new AllPoachProbabilities(poach); var ENTDs = psp ? new AllENTDs(entd1, entd2, entd3, entd4, entd5) : new AllENTDs(entd1, entd2, entd3, entd4); var MoveFind = new AllMoveFindItems(Context, moveFind, new AllMoveFindItems(Context, psp ? PSPResources.Binaries.MoveFind : PSXResources.Binaries.MoveFind)); var StoreInventories = new AllStoreInventories(Context, inventories, psp ? PSPResources.Binaries.StoreInventories : PSXResources.Binaries.StoreInventories); var Propositions = new AllPropositions(propositions, psp ? PSPResources.Binaries.Propositions : PSXResources.Binaries.Propositions, brokenLevelBonuses); FFTPatch.Propositions = Propositions; FFTPatch.Abilities = Abilities; FFTPatch.AbilityAnimations = AbilityAnimations; FFTPatch.Items = Items; FFTPatch.ItemAttributes = ItemAttributes; FFTPatch.Jobs = Jobs; FFTPatch.JobLevels = JobLevels; FFTPatch.SkillSets = SkillSets; FFTPatch.MonsterSkills = MonsterSkills; FFTPatch.ActionMenus = ActionMenus; FFTPatch.StatusAttributes = StatusAttributes; FFTPatch.InflictStatuses = InflictStatuses; FFTPatch.PoachProbabilities = PoachProbabilities; FFTPatch.ENTDs = ENTDs; FFTPatch.MoveFind = MoveFind; FFTPatch.StoreInventories = StoreInventories; } catch (Exception) { throw new LoadPatchException(); } }
private static void BuildFromContext() { switch (Context) { case Context.US_PSP: Abilities = new AllAbilities(PSPResources.Binaries.Abilities, PSPResources.Binaries.AbilityEffects, PSPResources.Binaries.ItemAbilityEffects, PSPResources.Binaries.ReactionAbilityEffects); AbilityAnimations = new AllAnimations(Context, PSPResources.Binaries.AbilityAnimations, PSPResources.Binaries.AbilityAnimations); Items = new AllItems( PSPResources.Binaries.OldItems, PSPResources.Binaries.NewItems); ItemAttributes = new AllItemAttributes( PSPResources.Binaries.OldItemAttributes, PSPResources.Binaries.NewItemAttributes); Jobs = new AllJobs(Context, PSPResources.Binaries.Jobs); JobLevels = new JobLevels(Context, PSPResources.Binaries.JobLevels, new JobLevels(Context, PSPResources.Binaries.JobLevels)); SkillSets = new AllSkillSets(Context, PSPResources.Binaries.SkillSets, PSPResources.Binaries.SkillSets); MonsterSkills = new AllMonsterSkills(PSPResources.Binaries.MonsterSkills); ActionMenus = new AllActionMenus(PSPResources.Binaries.ActionEvents, Context); StatusAttributes = new AllStatusAttributes(PSPResources.Binaries.StatusAttributes); InflictStatuses = new AllInflictStatuses(PSPResources.Binaries.InflictStatuses); PoachProbabilities = new AllPoachProbabilities(PSPResources.Binaries.PoachProbabilities); ENTDs = new AllENTDs(PSPResources.Binaries.ENTD1, PSPResources.Binaries.ENTD2, PSPResources.Binaries.ENTD3, PSPResources.Binaries.ENTD4, PSPResources.Binaries.ENTD5); MoveFind = new AllMoveFindItems(Context, PSPResources.Binaries.MoveFind, new AllMoveFindItems(Context, PSPResources.Binaries.MoveFind)); StoreInventories = new AllStoreInventories(Context, PSPResources.Binaries.StoreInventories, PSPResources.Binaries.StoreInventories); Propositions = new AllPropositions(PSPResources.Binaries.Propositions, PSPResources.Binaries.Propositions, false); break; case Context.US_PSX: Abilities = new AllAbilities(PSXResources.Binaries.Abilities, PSXResources.Binaries.AbilityEffects, PSXResources.Binaries.ItemAbilityEffects, PSXResources.Binaries.ReactionAbilityEffects); AbilityAnimations = new AllAnimations(Context, PSXResources.Binaries.AbilityAnimations, PSXResources.Binaries.AbilityAnimations); Items = new AllItems(PSXResources.Binaries.OldItems, null); ItemAttributes = new AllItemAttributes(PSXResources.Binaries.OldItemAttributes, null); Jobs = new AllJobs(Context, PSXResources.Binaries.Jobs); JobLevels = new JobLevels(Context, PSXResources.Binaries.JobLevels, new JobLevels(Context, PSXResources.Binaries.JobLevels)); SkillSets = new AllSkillSets(Context, PSXResources.Binaries.SkillSets, PSXResources.Binaries.SkillSets); MonsterSkills = new AllMonsterSkills(PSXResources.Binaries.MonsterSkills); ActionMenus = new AllActionMenus(PSXResources.Binaries.ActionEvents, Context); StatusAttributes = new AllStatusAttributes(PSXResources.Binaries.StatusAttributes); InflictStatuses = new AllInflictStatuses(PSXResources.Binaries.InflictStatuses); PoachProbabilities = new AllPoachProbabilities(PSXResources.Binaries.PoachProbabilities); ENTDs = new AllENTDs(PSXResources.Binaries.ENTD1, PSXResources.Binaries.ENTD2, PSXResources.Binaries.ENTD3, PSXResources.Binaries.ENTD4); MoveFind = new AllMoveFindItems(Context, PSXResources.Binaries.MoveFind, new AllMoveFindItems(Context, PSXResources.Binaries.MoveFind)); StoreInventories = new AllStoreInventories(Context, PSXResources.Binaries.StoreInventories, PSXResources.Binaries.StoreInventories); Propositions = new AllPropositions(PSXResources.Binaries.Propositions, PSXResources.Binaries.Propositions, false); break; default: throw new ArgumentException(); } }
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); } } }