static void LoadFly(BlueprintBuff airWalkBuff) { var wings = wingBuffs.Value; // Wings all have the generic wing icon, which is fine, but bloodline icons are nicer. var wingToIcon = new Dictionary <BlueprintBuff, Sprite>(); foreach (var bloodline in Helpers.bloodlineSelection.AllFeatures.OfType <BlueprintProgression>()) { foreach (var feat in bloodline.GetLevelEntry(15).Features) { var addFacts = feat.GetComponent <AddFacts>(); if (addFacts == null) { continue; } var ability = addFacts.Facts.OfType <BlueprintActivatableAbility>() .FirstOrDefault(a => wings.Contains(a.Buff)); if (ability != null) { wingToIcon.Add(ability.Buff, bloodline.Icon); break; } } } var variants = new List <(BlueprintAbility, BlueprintAbility, BlueprintBuff)>(); foreach (var wing in wings) { var name = wing.name.Replace("BuffWings", ""); if (name.StartsWith("Draconic")) { name = $"{name.Replace("Draconic", "")} Dragon"; } variants.Add(CreateFly(wing, name, wingToIcon[wing], airWalkBuff)); } var flyBuffs = variants.Select(v => v.Item3).ToArray(); foreach (var variant in variants) { // Overland flight needs to suppress all Fly buffs. variant.Item2.AddComponent(Helpers.CreateSuppressBuffs(flyBuffs)); } var fly = library.CopyAndAdd(variants[0].Item1, "FlySpell", "20ab2cd848c04d46882625e696c921bf"); fly.SetName(lc.GetTranslate("spFlyName")); fly.SetComponents( SpellSchool.Transmutation.CreateSpellComponent(), Helpers.CreateSpellDescriptor(), fly.CreateAbilityVariants(variants.Select(v => v.Item1))); fly.AvailableMetamagic = Metamagic.Quicken | Metamagic.Extend | Metamagic.Heighten; fly.AddToSpellList(Helpers.wizardSpellList, 3); fly.AddToSpellList(Helpers.magusSpellList, 3); fly.AddToSpellList(Helpers.alchemistSpellList, 3); Helpers.AddSpellAndScroll(fly, "8f1956fa46b122b4f86c1ce383ad8af7", 0); // scroll righteous might FlySpells.flySpell = fly; // Fix Draconic bloodline to use Fly as the 3rd level choice. WishSpells.FixBloodlineSpell(fly, "7bd143ead2d6c3a409aad6ee22effe34", "606cdd9198fb270429ab6dce1a6b14f1"); // Fix Travel domain to use Fly for the 3rd level spell. fly.FixDomainSpell(3, "ab90308db82342f47bf0d636fe941434"); var overlandFlight = library.CopyAndAdd(variants[0].Item2, "OverlandFlight", "8b5ea075097e4c7e999266b7569ee39d"); overlandFlight.SetName(lc.GetTranslate("spOverlandFlightName")); overlandFlight.SetComponents( SpellSchool.Transmutation.CreateSpellComponent(), Helpers.CreateSpellDescriptor(), overlandFlight.CreateAbilityVariants(variants.Select(v => v.Item2))); overlandFlight.AvailableMetamagic = Metamagic.Extend | Metamagic.Quicken | Metamagic.Heighten; overlandFlight.AddToSpellList(Helpers.wizardSpellList, 5); overlandFlight.AddToSpellList(Helpers.magusSpellList, 5); overlandFlight.AddToSpellList(Helpers.alchemistSpellList, 5); Helpers.AddSpellAndScroll(overlandFlight, "8f1956fa46b122b4f86c1ce383ad8af7", 0); // scroll righteous might FlySpells.overlandFlight = overlandFlight; }
static void LoadFly(BlueprintBuff airWalkBuff) { var wings = wingBuffs.Value; // Wings all have the generic wing icon, which is fine, but bloodline icons are nicer. var wingToIcon = new Dictionary <BlueprintBuff, Sprite>(); foreach (var bloodline in Helpers.bloodlineSelection.AllFeatures.OfType <BlueprintProgression>()) { foreach (var feat in bloodline.GetLevelEntry(15).Features) { var addFacts = feat.GetComponent <AddFacts>(); if (addFacts == null) { continue; } var ability = addFacts.Facts.OfType <BlueprintActivatableAbility>() .FirstOrDefault(a => wings.Contains(a.Buff)); if (ability != null) { wingToIcon.Add(ability.Buff, bloodline.Icon); break; } } } // Wings' name for localization var dictLocalWingName = new Dictionary <string, string> { { "BuffWingsAngel", RES.FlyWingAngelName_info }, // angel { "BuffWingsDemon", RES.FlyWingDemonName_info }, // demon { "BuffWingsDevil", RES.FlyWingDevilName_info }, // devil { "BuffWingsDraconicBlack", RES.FlyWingDraconicBlackName_info }, // black dragon { "BuffWingsDraconicBlue", RES.FlyWingDraconicBlueName_info }, // blue dragon { "BuffWingsDraconicBrass", RES.FlyWingDraconicBrassName_info }, // brass { "BuffWingsDraconicBronze", RES.FlyWingDraconicBronzeName_info }, // bronze { "BuffWingsDraconicCopper", RES.FlyWingDraconicCopperName_info }, // copper { "BuffWingsDraconicGold", RES.FlyWingDraconicGoldName_info }, // gold { "BuffWingsDraconicGreen", RES.FlyWingDraconicGreenName_info }, // green { "BuffWingsDraconicRed", RES.FlyWingDraconicRedName_info }, // red { "BuffWingsDraconicSilver", RES.FlyWingDraconicSilverName_info }, // silver { "BuffWingsDraconicWhite", RES.FlyWingDraconicWhiteName_info } // white }; var variants = new List <FlySpellInfo>(); foreach (var wing in wings) { // var name = wing.name.Replace("BuffWings", ""); // if (name.StartsWith("Draconic")) name = $"{name.Replace("Draconic", "")} Dragon"; variants.Add(CreateFly(wing, dictLocalWingName[wing.name], wingToIcon[wing])); } // Each Fly variant needs to suppress wing buffs, air walk, and previous fly buffs var suppressBuffs = wingBuffs.Value.ToList(); suppressBuffs.Add(airWalkBuff); foreach (var variant in variants) { variant.FlyBuff.AddComponent(Helpers.CreateSuppressBuffs(suppressBuffs)); suppressBuffs.Add(variant.FlyBuff); } // Each Overland flight variant needs to suppress all the buffs Fly suppresses, // all fly buffs, and previous overland flight buffs. foreach (var variant in variants) { variant.OverlandFlightBuff.AddComponent(Helpers.CreateSuppressBuffs(suppressBuffs)); suppressBuffs.Add(variant.OverlandFlightBuff); } var fly = library.CopyAndAdd(variants[0].Fly, "FlySpell", "20ab2cd848c04d46882625e696c921bf"); fly.SetName(RES.FlySpellName_info); fly.SetComponents( SpellSchool.Transmutation.CreateSpellComponent(), Helpers.CreateSpellDescriptor(), fly.CreateAbilityVariants(variants.Select(v => v.Fly))); fly.EffectOnAlly = AbilityEffectOnUnit.Helpful; fly.AvailableMetamagic = Metamagic.Quicken | Metamagic.Extend | Metamagic.Heighten; fly.AddToSpellList(Helpers.wizardSpellList, 3); fly.AddToSpellList(Helpers.magusSpellList, 3); fly.AddToSpellList(Helpers.alchemistSpellList, 3); Helpers.AddSpellAndScroll(fly, "8f1956fa46b122b4f86c1ce383ad8af7", 0); // scroll righteous might FlySpells.flySpell = fly; // Fix Draconic bloodline to use Fly as the 3rd level choice. WishSpells.FixBloodlineSpell(fly, "7bd143ead2d6c3a409aad6ee22effe34", "606cdd9198fb270429ab6dce1a6b14f1"); // Fix Travel domain to use Fly for the 3rd level spell. fly.FixDomainSpell(3, "ab90308db82342f47bf0d636fe941434"); var overlandFlight = library.CopyAndAdd(variants[0].OverlandFlight, "OverlandFlight", "8b5ea075097e4c7e999266b7569ee39d"); overlandFlight.SetName(RES.OverlandFlightSpellName_info); overlandFlight.SetComponents( SpellSchool.Transmutation.CreateSpellComponent(), Helpers.CreateSpellDescriptor(), overlandFlight.CreateAbilityVariants(variants.Select(v => v.OverlandFlight))); overlandFlight.EffectOnAlly = AbilityEffectOnUnit.Helpful; overlandFlight.AvailableMetamagic = Metamagic.Extend | Metamagic.Quicken | Metamagic.Heighten; overlandFlight.AddToSpellList(Helpers.wizardSpellList, 5); overlandFlight.AddToSpellList(Helpers.magusSpellList, 5); overlandFlight.AddToSpellList(Helpers.alchemistSpellList, 5); Helpers.AddSpellAndScroll(overlandFlight, "8f1956fa46b122b4f86c1ce383ad8af7", 0); // scroll righteous might FlySpells.overlandFlight = overlandFlight; }