public static void CopyParticle(FileSource fieldSource, string srcField, string destField) { var srcPath = FieldScript.GetFieldPath(srcField); var destPath = FieldScript.GetFieldPath(destField); var srcSource = new FileSource(srcPath, fieldSource); var destSource = new FileSource(destPath, fieldSource); destSource.ReplaceFile(Path.Combine(destPath, destField + ".pmd"), srcSource.GetFile(Path.Combine(srcPath, srcField + ".pmd"))); destSource.ReplaceFile(Path.Combine(destPath, destField + ".pmp"), srcSource.GetFile(Path.Combine(srcPath, srcField + ".pmp"))); fieldSource.Encode(); }
private static void SwapSets(FileSource mainSource, Random random, Kernel kernel, Init init) { var unmatchedGFs = Enumerable.Range(0, 16).ToList(); var cleanKernel = new Kernel(mainSource.GetFile(Globals.KernelPath)); var cleanInit = new Init(mainSource.GetFile(Globals.InitPath)); for (int i = 0; i < 16; i++) { var matchedGF = unmatchedGFs[random.Next(unmatchedGFs.Count)]; unmatchedGFs.Remove(matchedGF); init.GFs[i].Abilities = cleanInit.GFs[matchedGF].Abilities; init.GFs[i].CurrentAbility = cleanInit.GFs[matchedGF].CurrentAbility; kernel.JunctionableGFs[i].Abilities = cleanKernel.JunctionableGFs[matchedGF].Abilities; } }
// extract from field archive & construct public static FieldScript FromSource(FileSource fieldSource, string fieldName) { var fieldPath = GetFieldPath(fieldName); var innerSource = new FileSource(fieldPath, fieldSource); return(FromBytes(innerSource.GetFile(fieldPath + "\\" + fieldName + Globals.ScriptFileExtension))); }
public void AddWeapons(FileSource mainSource, List <WeaponUpgrade> upgrades) { Weapons = new Section(); Weapons.Heading("Weapons"); var kernel = new Kernel(mainSource.GetFile(Globals.KernelPath)); for (var i = 0; i < upgrades.Count; i++) { Weapons.Bullet(string.Format("{0} - {1}0g", kernel.Weapons[i].Name, upgrades[i].Price)); Weapons.Bullet(string.Format("{0} x{1}", Item.Lookup[upgrades[i].Item1].Name, upgrades[i].Item1Quantity), 1); if (upgrades[i].Item2 != 0) { Weapons.Bullet(string.Format("{0} x{1}", Item.Lookup[upgrades[i].Item2].Name, upgrades[i].Item2Quantity), 1); } if (upgrades[i].Item3 != 0) { Weapons.Bullet(string.Format("{0} x{1}", Item.Lookup[upgrades[i].Item3].Name, upgrades[i].Item3Quantity), 1); } if (upgrades[i].Item4 != 0) { Weapons.Bullet(string.Format("{0} x{1}", Item.Lookup[upgrades[i].Item4].Name, upgrades[i].Item4Quantity), 1); } Weapons.NewLine(); } }
public static void Apply(FileSource menuSource) { // pull the relevant file out of the archive var file = menuSource.GetFile(ArchivePath); var mes3bytes = new ArraySegment <byte>(file, FileOffset, FileLength); var mes3 = TextFile.FromBytes(mes3bytes.ToArray(), true); // set names mes3.Pages[NamesPage].Strings[Squall] = Properties.Settings.Default.NameSquall; mes3.Pages[NamesPage].Strings[Rinoa] = Properties.Settings.Default.NameRinoa; mes3.Pages[NamesPage].Strings[Angelo] = Properties.Settings.Default.NameAngelo; mes3.Pages[NamesPage].Strings[Quezacotl] = Properties.Settings.Default.NameQuezacotl; mes3.Pages[NamesPage].Strings[Shiva] = Properties.Settings.Default.NameShiva; mes3.Pages[NamesPage].Strings[Ifrit] = Properties.Settings.Default.NameIfrit; mes3.Pages[NamesPage].Strings[Siren] = Properties.Settings.Default.NameSiren; mes3.Pages[NamesPage].Strings[Brothers] = Properties.Settings.Default.NameBrothers; mes3.Pages[NamesPage].Strings[Diablos] = Properties.Settings.Default.NameDiablos; mes3.Pages[NamesPage].Strings[Carbuncle] = Properties.Settings.Default.NameCarbuncle; mes3.Pages[NamesPage].Strings[Leviathan] = Properties.Settings.Default.NameLeviathan; mes3.Pages[NamesPage].Strings[Pandemona] = Properties.Settings.Default.NamePandemona; mes3.Pages[NamesPage].Strings[Cerberus] = Properties.Settings.Default.NameCerberus; mes3.Pages[NamesPage].Strings[Alexander] = Properties.Settings.Default.NameAlexander; mes3.Pages[NamesPage].Strings[Doomtrain] = Properties.Settings.Default.NameDoomtrain; mes3.Pages[NamesPage].Strings[Bahamut] = Properties.Settings.Default.NameBahamut; mes3.Pages[NamesPage].Strings[Cactuar] = Properties.Settings.Default.NameCactuar; mes3.Pages[NamesPage].Strings[Tonberry] = Properties.Settings.Default.NameTonberry; mes3.Pages[NamesPage].Strings[Eden] = Properties.Settings.Default.NameEden; mes3.Pages[NamesPage].Strings[Boko] = Properties.Settings.Default.NameBoko; mes3.Pages[NamesPage].Strings[Griever] = Properties.Settings.Default.NameGriever; // apply changes Array.Copy(mes3.Encode(), 0, file, FileOffset, FileLength); menuSource.ReplaceFile(ArchivePath, file); }
public static List <JunctionableGF> Randomise(FileSource mainSource, int seed, State settings) { var random = new Random(seed + 1); var kernel = new Kernel(mainSource.GetFile(Globals.KernelPath)); var init = new Init(mainSource.GetFile(Globals.InitPath)); if (settings.GfAbilitiesSwapSets) { SwapSets(mainSource, random, kernel, init); } else { GenerateRandomSets(settings, random, kernel, init); } ModifyAPCosts(kernel); SaveChanges(mainSource, kernel, init); return(kernel.JunctionableGFs.ToList()); }
public static List <WeaponUpgrade> ReadAllFromSource(FileSource menuSource) { var result = new List <WeaponUpgrade>(); using (var stream = new MemoryStream(menuSource.GetFile(Globals.WeaponUpgradePath).ToArray())) using (var reader = new BinaryReader(stream)) { for (int i = 0; i < 33; i++) { result.Add(new WeaponUpgrade(reader.ReadBytes(12))); } } return(result); }
public static void Randomise(FileSource mainSource, int seed) { var random = new Random(seed); var kernel = new Kernel(mainSource.GetFile(Globals.KernelPath)); for (int i = 0; i < 16; i++) { for (int j = 0; j < 21; j++) { kernel.JunctionableGFs[i].Abilities[j].Ability = (byte)random.Next(1, 116); kernel.JunctionableGFs[i].Abilities[j].Unlocker = 0; } } mainSource.ReplaceFile(Globals.KernelPath, kernel.Encode()); }
public static void Apply(FileSource menuSource, State settings) { // pull the relevant file out of the archive var file = menuSource.GetFile(ArchivePath); var mes3bytes = file.Skip(FileOffset).Take(FileLength); var mes3 = TextFile.FromBytes(mes3bytes, true); // set names mes3.Pages[NamesPage].Strings[Squall] = settings.NameSquall; mes3.Pages[NamesPage].Strings[Rinoa] = settings.NameRinoa; mes3.Pages[NamesPage].Strings[Angelo] = settings.NameAngelo; mes3.Pages[NamesPage].Strings[Quezacotl] = settings.NameQuezacotl; mes3.Pages[NamesPage].Strings[Shiva] = settings.NameShiva; mes3.Pages[NamesPage].Strings[Ifrit] = settings.NameIfrit; mes3.Pages[NamesPage].Strings[Siren] = settings.NameSiren; mes3.Pages[NamesPage].Strings[Brothers] = settings.NameBrothers; mes3.Pages[NamesPage].Strings[Diablos] = settings.NameDiablos; mes3.Pages[NamesPage].Strings[Carbuncle] = settings.NameCarbuncle; mes3.Pages[NamesPage].Strings[Leviathan] = settings.NameLeviathan; mes3.Pages[NamesPage].Strings[Pandemona] = settings.NamePandemona; mes3.Pages[NamesPage].Strings[Cerberus] = settings.NameCerberus; mes3.Pages[NamesPage].Strings[Alexander] = settings.NameAlexander; mes3.Pages[NamesPage].Strings[Doomtrain] = settings.NameDoomtrain; mes3.Pages[NamesPage].Strings[Bahamut] = settings.NameBahamut; mes3.Pages[NamesPage].Strings[Cactuar] = settings.NameCactuar; mes3.Pages[NamesPage].Strings[Tonberry] = settings.NameTonberry; mes3.Pages[NamesPage].Strings[Eden] = settings.NameEden; mes3.Pages[NamesPage].Strings[Boko] = settings.NameBoko; mes3.Pages[NamesPage].Strings[Griever] = settings.NameGriever; // apply changes var newFile = file.Take(FileOffset).ToList(); newFile.AddRange(mes3.Encode()); newFile.AddRange(file.Skip(FileOffset + FileLength)); menuSource.ReplaceFile(ArchivePath, newFile); }
public static MessageFile FromSource(FileSource source, string path) { return(FromBytes(source.GetFile(path))); }
public static List <JunctionableGF> Randomise(FileSource mainSource, int seed, State settings) { var random = new Random(seed + 1); var kernel = new Kernel(mainSource.GetFile(Globals.KernelPath)); var init = new Init(mainSource.GetFile(Globals.InitPath)); if (settings.GfAbilitiesSwapSets) { var unmatchedGFs = Enumerable.Range(0, 16).ToList(); var cleanKernel = new Kernel(mainSource.GetFile(Globals.KernelPath)); var cleanInit = new Init(mainSource.GetFile(Globals.InitPath)); for (int i = 0; i < 16; i++) { var matchedGF = unmatchedGFs[random.Next(unmatchedGFs.Count)]; unmatchedGFs.Remove(matchedGF); init.GFs[i].Abilities = cleanInit.GFs[matchedGF].Abilities; init.GFs[i].CurrentAbility = cleanInit.GFs[matchedGF].CurrentAbility; kernel.JunctionableGFs[i].Abilities = cleanKernel.JunctionableGFs[matchedGF].Abilities; } } else { var includedAbilities = Abilities.Where(a => !a.ItemExclusive || settings.GfAbilitiesIncludeItemOnly).ToList(); for (int i = 0; i < 16; i++) { // clear auto-unlocked abilities init.GFs[i].Abilities = new BitArray(init.GFs[i].Abilities.Length, false); var unusedAbilities = includedAbilities.Select(a => a.AbilityID).ToList(); for (int j = 0; j < 21; j++) { // guarantee basic commands (magic, gf, draw, item) if (j < 4 && settings.GfAbilitiesBasics) { var id = j + 20; kernel.JunctionableGFs[i].Abilities[j].Ability = (byte)id; kernel.JunctionableGFs[i].Abilities[j].Unlocker = 0; init.GFs[i].Abilities[id] = true; unusedAbilities.Remove(id); continue; } // roll abilities var ability = unusedAbilities[random.Next(unusedAbilities.Count)]; kernel.JunctionableGFs[i].Abilities[j].Ability = (byte)ability; kernel.JunctionableGFs[i].Abilities[j].Unlocker = 0; init.GFs[i].Abilities[ability] = (ability >= 20 && ability <= 23); unusedAbilities.Remove(ability); } // sort abilities kernel.JunctionableGFs[i].Abilities = kernel.JunctionableGFs[i].Abilities.OrderBy(a => a.Ability == 0 ? byte.MaxValue : a.Ability).ToArray(); // clear ability being learned init.GFs[i].CurrentAbility = 0; } } // reduce "empty" cost kernel.Abilities[24].APCost = 60; // increase "ribbon" cost kernel.Abilities[77].APCost = 250; // save changes mainSource.ReplaceFile(Globals.KernelPath, kernel.Encode()); mainSource.ReplaceFile(Globals.InitPath, init.Encode()); return(kernel.JunctionableGFs.ToList()); }
public static EncounterFile FromSource(FileSource source, string path) { return(FromBytes(source.GetFile(path))); }