Exemple #1
0
        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]);
            }
        }
Exemple #2
0
        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();
            }
        }
Exemple #3
0
        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();
            }
        }
Exemple #4
0
        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]);
                }
            }
        }
Exemple #5
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);
                    }
                }
        }