From e4bc2370c6b0c5586f49f6088439e6ae6607049a Mon Sep 17 00:00:00 2001 From: pheonix99 Date: Sat, 14 Jan 2023 21:08:45 -0500 Subject: [PATCH] version 1.4.1 --- Readme.md | 25 ++ TomeOfTheFirebird/BuildContent.cs | 10 +- TomeOfTheFirebird/Config/Blueprints.json | 44 ++- TomeOfTheFirebird/Helpers/MakerTools.cs | 15 +- TomeOfTheFirebird/Info.json | 2 +- .../Modified Content/Archetypes/Witch.cs | 11 +- .../Modified Content/Classes/Witch.cs | 51 +++ .../FighterCombatBoosts.cs | 1 + .../HomebrewArchetypesCompFix.cs | 1 + .../WitchPatronUpgrade.cs | 32 ++ .../Items/RadianceUpgrades.cs | 23 ++ .../PrerequisiteArchetypeCantTakeWithX.cs | 45 +++ .../New Content/Archetypes/SeasonalWitch.cs | 131 +++++++ .../New Content/Feats/DiscordantSong.cs | 1 + .../New Content/Feats/ProdigiousTWF.cs | 1 + .../New Content/Feats/RageStanceMastery.cs | 23 -- .../New Content/Items/PaladinGear.cs | 4 +- .../New Content/Mercies/ExtraMercies.cs | 3 +- .../New Content/RagePowers/ElementalStance.cs | 3 + .../RagePowers/RageStanceMastery.cs | 91 +++++ .../New Content/Spells/BurstOfRadiance.cs | 94 +++++ .../New Content/Spells/EarthTremor.cs | 29 ++ .../Spells/TODO/BurstOfRadiance.cs | 25 -- .../New Content/WildTalents/BasicKinesis.cs | 3 +- .../New Content/WildTalents/ClockworkHeart.cs | 1 + TomeOfTheFirebird/New Content/WitchPatrons.cs | 365 ++++++++++++++++-- TomeOfTheFirebird/Resources.cs | 85 ---- TomeOfTheFirebird/Settings.cs | 31 +- TomeOfTheFirebird/TomeOfTheFirebird.csproj | 33 +- 29 files changed, 976 insertions(+), 207 deletions(-) create mode 100644 TomeOfTheFirebird/Modified Content/Classes/Witch.cs create mode 100644 TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/WitchPatronUpgrade.cs create mode 100644 TomeOfTheFirebird/Modified Content/Items/RadianceUpgrades.cs create mode 100644 TomeOfTheFirebird/New Components/Prerequisites/PrerequisiteArchetypeCantTakeWithX.cs create mode 100644 TomeOfTheFirebird/New Content/Archetypes/SeasonalWitch.cs delete mode 100644 TomeOfTheFirebird/New Content/Feats/RageStanceMastery.cs create mode 100644 TomeOfTheFirebird/New Content/RagePowers/RageStanceMastery.cs create mode 100644 TomeOfTheFirebird/New Content/Spells/BurstOfRadiance.cs create mode 100644 TomeOfTheFirebird/New Content/Spells/EarthTremor.cs delete mode 100644 TomeOfTheFirebird/New Content/Spells/TODO/BurstOfRadiance.cs delete mode 100644 TomeOfTheFirebird/Resources.cs diff --git a/Readme.md b/Readme.md index a01f7da..4d27e47 100644 --- a/Readme.md +++ b/Readme.md @@ -10,6 +10,19 @@ NOW REQUIRES TabletopTweaks Core Module and ModMenu ## Changelog +### 1.4.1 +Added Homebrew Rage Power: Rage Stance Mastery. Use two Barbarian stances at once. + +Add Burst Of Radiance + +Fixed Death Patron being missing from Second Patron + +Added Light, Animal, Protection and Plague patrons + +Added Light to default patron selection list for Ember + +Made Witch Patron spell features use the spell icon. + ### 1.4.0 Switched to building UI with ModMenu @@ -299,9 +312,21 @@ Made rewards from Monster Slayers and Local Production crusade events permanent ##Coming Soon: +Some Crusade Mode goodies + +Earth Tremor spell + +Mountain Witch Patron + +Witch Unique Patrons + +Compatibility Hack for Expanded Content so Death Patron can be used with the EC version of Gloomblind Bolts if that one is enabled and ToTF version is disabled + Extending Draconic Bloodline claw upgrades to Dragon Mystery abilities if Expanded Content is installed +Improved Multi-Archetyping for Witch archetypes that alter patron selection - you explictly *can* take multiple archetypes that reduce your selection as long as you comply with all the restriction on TT +Seasonal Witch archetype Banishing Warden Paladin Archetype diff --git a/TomeOfTheFirebird/BuildContent.cs b/TomeOfTheFirebird/BuildContent.cs index b603f2a..bf78e7e 100644 --- a/TomeOfTheFirebird/BuildContent.cs +++ b/TomeOfTheFirebird/BuildContent.cs @@ -69,6 +69,8 @@ static void Postfix() ElementalShieldSpells.Build(); EntropicShield.Make(); + BurstOfRadiance.Make(); + //Build Feats ProdigiousTWF.AddProdigiousTWF(); SunderingStrike.Build(); @@ -121,12 +123,14 @@ static void Postfix() EldritchScionSage.Make(); - Witch.ReturnAccursedPatrons(); + Modified_Content.Archetypes.Witch.ReturnAccursedPatrons(); + Modified_Content.Classes.Witch.FixIcons(); ShimmeringMirage.Make(); ClockworkHeart.Make(); New_Content.RagePowers.ElementalStance.Make(); + New_Content.RagePowers.RageStanceMastery.Make(); CoordinatedShot.Make(); LastwallPhalanx.Make(); @@ -178,7 +182,7 @@ static void Postfix() ExtraMercies.AddToThings(); FighterArmorTrainingFakeLevel.Connect(); - WitchPatrons.Finish(); + ProdigiousTWF.AddTwoWeaponDefense(); Magus.EScionSanityCheck(); @@ -187,6 +191,8 @@ static void Postfix() // MagusArcanaHandling.MergeEScion(); New_Content.RagePowers.ElementalStance.Finish(); + New_Content.RagePowers.RageStanceMastery.Finish(); + RootConfigurator.ConfigureDelayedBlueprints(); //Modified_Content.ImprovedMultiarchetypeProjct.SpellSlots.Execute(); diff --git a/TomeOfTheFirebird/Config/Blueprints.json b/TomeOfTheFirebird/Config/Blueprints.json index 6aee6e0..b566958 100644 --- a/TomeOfTheFirebird/Config/Blueprints.json +++ b/TomeOfTheFirebird/Config/Blueprints.json @@ -193,7 +193,49 @@ "ElementalStanceRagePowerFireEffectBuff": "ccf6d83d-0fce-4212-9904-389e38f647d3", "ElementalStanceRagePowerFireSwitchBuff": "baabb65f-cb73-40f1-9cba-e693f4fb1673", "ElementalStanceRagePowerFireToggleAbility": "10b6e6aa-bb15-46bd-a0fd-511539b51989", - "ElementalStanceRagePowerSelector": "049d5ffb-0f66-4937-adf0-498bc957ef51" + "ElementalStanceRagePowerSelector": "049d5ffb-0f66-4937-adf0-498bc957ef51", + "BurstOfRadiance": "d0b70b44-8715-4ed3-ae10-e642d927330c", + "RageStanceMastery": "2364aca6-07cd-48aa-8087-d287e9a7499c", + "WitchAnimalPatronProgression": "bc12a8e1-23af-47ad-a2e9-dbf00913d2e5", + "WitchAnimalPatronSpellLevel1": "d7108bfc-cb2a-4904-8455-5ef83fd0f8a9", + "WitchAnimalPatronSpellLevel2": "8438e77d-ffae-4b1e-8a24-fafc417841fd", + "WitchAnimalPatronSpellLevel3": "239cf927-0b03-412e-a7cf-2dec4f92dfb4", + "WitchAnimalPatronSpellLevel4": "5bb664d5-a7dd-4bbb-a1f6-02532f055893", + "WitchAnimalPatronSpellLevel5": "5ad454c3-2f65-417f-85e0-d585f2e219aa", + "WitchAnimalPatronSpellLevel6": "990a5b8c-41af-4ed4-acae-d990730ffdcb", + "WitchAnimalPatronSpellLevel7": "f34aa422-7697-4fd7-bac0-4dd77e815274", + "WitchAnimalPatronSpellLevel8": "e4aa3de3-d03f-45cb-8186-fa29ea9cb55d", + "WitchAnimalPatronSpellLevel9": "31e41b6f-d5b0-41de-bfd8-f1adfe874ea7", + "WitchLightPatronProgression": "4cf44d74-4620-4715-ab5d-1a9c81d335ae", + "WitchLightPatronSpellLevel1": "feca048b-7df8-466e-aaf2-14884138e5c1", + "WitchLightPatronSpellLevel2": "d17bbdb1-8029-4af5-b041-a3167a815f23", + "WitchLightPatronSpellLevel3": "bada7dc0-752a-48ef-9a5c-194e62ec27e4", + "WitchLightPatronSpellLevel4": "c5c5f044-07f3-4825-a4d7-436c8be1decd", + "WitchLightPatronSpellLevel5": "32f4a702-d65b-4955-af01-fb187cccdcb8", + "WitchLightPatronSpellLevel6": "d5fe01be-bf7d-4fc4-a76d-4b176813b185", + "WitchLightPatronSpellLevel7": "7db3f47e-9936-4443-ae06-12e9b288977e", + "WitchLightPatronSpellLevel8": "e42853a6-1c4c-4817-8ffe-91170e8ec2c4", + "WitchLightPatronSpellLevel9": "d16a2a0b-4097-4ac0-a19c-62e4dc66a92a", + "WitchPlaguePatronProgression": "f1894c6b-b214-4449-b83f-a3298e676d16", + "WitchPlaguePatronSpellLevel1": "e4449cbb-31d1-416e-a243-900ac07327bb", + "WitchPlaguePatronSpellLevel2": "c921cd33-795c-48d2-8f92-55f3b5db365c", + "WitchPlaguePatronSpellLevel3": "b578ccea-7297-4b45-befa-c59e04532fd5", + "WitchPlaguePatronSpellLevel4": "c83be906-208e-4f38-b3b3-4c4eee247268", + "WitchPlaguePatronSpellLevel5": "a25132fc-9b5f-4281-aade-563baf2ff5de", + "WitchPlaguePatronSpellLevel6": "0f79a8a2-a86b-4b5a-97e1-2228b8d6fd7f", + "WitchPlaguePatronSpellLevel7": "e0b6794f-5904-4db4-9c22-de83f2ee2fb4", + "WitchPlaguePatronSpellLevel8": "e0a6a7ea-818c-4d4a-8833-98b25c6c1da0", + "WitchPlaguePatronSpellLevel9": "ce8a88a7-9499-4161-8edb-1fcad559fe80", + "WitchProtectionPatronProgression": "2c8f4252-c15f-4c56-82f6-fdf7ad58ad4c", + "WitchProtectionPatronSpellLevel1": "17da840a-eb40-4f57-9817-c777ec264539", + "WitchProtectionPatronSpellLevel2": "03be22cb-85ec-41b4-9a6f-476b7899b4bb", + "WitchProtectionPatronSpellLevel3": "10e9d55e-eb47-40f1-a542-21873a18f4eb", + "WitchProtectionPatronSpellLevel4": "dff98c60-8ab5-4f55-8f0e-d7667acce2fa", + "WitchProtectionPatronSpellLevel5": "ffd40bf0-c9f9-4146-a1f5-a040ad06c201", + "WitchProtectionPatronSpellLevel6": "4a732e96-ac5f-4c0f-a299-eb9238952ed6", + "WitchProtectionPatronSpellLevel7": "c7383468-3c60-4994-ba59-55e348b00d8c", + "WitchProtectionPatronSpellLevel8": "eb1b5787-ddfd-4c4a-8539-58e08218d112", + "WitchProtectionPatronSpellLevel9": "b9685c67-6d2a-428c-b99d-9a09106ba249" }, "DerivedBlueprintMasters": { "DiminishedSpellcastingMaster": "ba5d3cd1-29c3-4836-ae1d-88467323c6cd", diff --git a/TomeOfTheFirebird/Helpers/MakerTools.cs b/TomeOfTheFirebird/Helpers/MakerTools.cs index 5611976..2a0fe5a 100644 --- a/TomeOfTheFirebird/Helpers/MakerTools.cs +++ b/TomeOfTheFirebird/Helpers/MakerTools.cs @@ -17,6 +17,7 @@ using Kingmaker.Blueprints.Classes; using Kingmaker.Blueprints; using TomeOfTheFirebird.New_Components; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; namespace TomeOfTheFirebird.Helpers { @@ -208,7 +209,7 @@ public static AbilityConfigurator MakeAbility(string systemName, string displayN } - public static AbilityConfigurator MakeSpell(string systemName, string displayName, string description, Sprite icon, SpellSchool school, LocalizedString savestring, LocalizedString durationString) + public static AbilityConfigurator MakeSpell(string systemName, string displayName, string description, Sprite icon, SpellSchool school, LocalizedString savestring, LocalizedString durationString = null) { Main.TotFContext.Logger.Log($"Building New Spell: {systemName}"); Kingmaker.Blueprints.BlueprintGuid guid = Main.TotFContext.Blueprints.GetGUID(systemName); @@ -226,10 +227,14 @@ public static AbilityConfigurator MakeSpell(string systemName, string displayNam { Main.TotFContext.Logger.LogError(e.Message); } - - - - return AbilityConfigurator.New(systemName, guid.ToString()).SetDisplayName(name).SetDescription(desc).SetIcon(icon).AddSpellComponent(school).SetLocalizedSavingThrow(savestring).SetLocalizedDuration(durationString); + + + + var config = AbilityConfigurator.New(systemName, guid.ToString()).SetDisplayName(name).SetDescription(desc).SetIcon(icon).AddSpellComponent(school).SetLocalizedSavingThrow(savestring); + if (durationString != null) + config.SetLocalizedDuration(durationString); + + return config; } diff --git a/TomeOfTheFirebird/Info.json b/TomeOfTheFirebird/Info.json index 1b0de7c..18d9776 100644 --- a/TomeOfTheFirebird/Info.json +++ b/TomeOfTheFirebird/Info.json @@ -2,7 +2,7 @@ "Id": "TomeOfTheFirebird", "DisplayName": "Tome Of The Firebird", "Author": "pheonix99", - "Version": "1.4.0", + "Version": "1.4.1", "ManagerVersion": "0.21.3", "AssemblyName": "TomeOfTheFirebird.dll", "EntryMethod": "TomeOfTheFirebird.Main.Load", diff --git a/TomeOfTheFirebird/Modified Content/Archetypes/Witch.cs b/TomeOfTheFirebird/Modified Content/Archetypes/Witch.cs index b3cdd1e..d7a9a61 100644 --- a/TomeOfTheFirebird/Modified Content/Archetypes/Witch.cs +++ b/TomeOfTheFirebird/Modified Content/Archetypes/Witch.cs @@ -1,4 +1,5 @@ -using Kingmaker.Blueprints; +using BlueprintCore.Utils; +using Kingmaker.Blueprints; using Kingmaker.Blueprints.Classes; using Kingmaker.Blueprints.Classes.Selection; using System.Linq; @@ -43,6 +44,14 @@ public static void ReturnAccursedPatrons() m_Selection = patron.ToReference(), m_Features = new BlueprintFeatureReference[] { BlueprintTools.GetBlueprintReference("8fe0a14c90d3ea94a833d087b8a09bb9") } + }); + break; + case Settings.EmberPatron.Light: + emberFeature.Components.OfType().FirstOrDefault().Selections = emberFeature.Components.OfType().FirstOrDefault().Selections.AppendToArray(new SelectionEntry + { + m_Selection = patron.ToReference(), + m_Features = new BlueprintFeatureReference[] { BlueprintTool.GetRef("WitchLightPatronProgression") } + }); break; default: diff --git a/TomeOfTheFirebird/Modified Content/Classes/Witch.cs b/TomeOfTheFirebird/Modified Content/Classes/Witch.cs new file mode 100644 index 0000000..14a1010 --- /dev/null +++ b/TomeOfTheFirebird/Modified Content/Classes/Witch.cs @@ -0,0 +1,51 @@ +using BlueprintCore.Blueprints.CustomConfigurators.Classes; +using BlueprintCore.Utils; +using Kingmaker.Blueprints; +using Kingmaker.Blueprints.Classes; +using Kingmaker.Blueprints.Classes.Selection; +using Kingmaker.UnitLogic.FactLogic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TabletopTweaks.Core.Utilities; + +namespace TomeOfTheFirebird.Modified_Content.Classes +{ + class Witch + { + public static void FixIcons() + { + if (Settings.IsDisabled("FixWitchSpellIcons")) + return; + + var bloodlineselector = BlueprintTool.Get("381cf4c890815d049a4420c6f31d063f"); + + foreach (var v in bloodlineselector.m_AllFeatures) + { + var v2 = BlueprintTools.GetBlueprint(v.Guid); + if (v2 != null) + { + ProgressionConfigurator.For(v2).ModifyLevelEntries(x => + { + foreach (var q in x.m_Features) + { + var feature = q.Get(); + + AddKnownSpell referant = feature.GetComponent(); + if (referant != null) + { + FeatureConfigurator.For(feature).SetIcon(referant.m_Spell.Get().Icon).Configure(); + + } + Main.TotFContext.Logger.LogPatch($"Patched Icon on", feature); + } + }).Configure(); + } + } + + } + + } +} diff --git a/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/FighterCombatBoosts.cs b/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/FighterCombatBoosts.cs index a517d31..4cbfe49 100644 --- a/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/FighterCombatBoosts.cs +++ b/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/FighterCombatBoosts.cs @@ -1,5 +1,6 @@ using BlueprintCore.Blueprints.Configurators.Classes.Selection; using BlueprintCore.Blueprints.CustomConfigurators.Classes; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; using BlueprintCore.Utils; using Kingmaker.Blueprints; using Kingmaker.Blueprints.Classes; diff --git a/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/HomebrewArchetypesCompFix.cs b/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/HomebrewArchetypesCompFix.cs index c620915..a83c630 100644 --- a/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/HomebrewArchetypesCompFix.cs +++ b/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/HomebrewArchetypesCompFix.cs @@ -4,6 +4,7 @@ using Kingmaker.Blueprints.Classes.Selection; using System.Linq; using Kingmaker.Utility; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; namespace TomeOfTheFirebird.Modified_Content.ImprovedMultiarchetypeProjct { diff --git a/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/WitchPatronUpgrade.cs b/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/WitchPatronUpgrade.cs new file mode 100644 index 0000000..eeca5d8 --- /dev/null +++ b/TomeOfTheFirebird/Modified Content/ImprovedMultiarchetypeProjct/WitchPatronUpgrade.cs @@ -0,0 +1,32 @@ +using BlueprintCore.Utils; +using Kingmaker.Blueprints.Classes; +using Kingmaker.Blueprints.Classes.Selection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TomeOfTheFirebird.Modified_Content.ImprovedMultiarchetypeProjct +{ + class WitchPatronUpgrade + { + public static void Handle() + { + List MasterList = new(); + BlueprintFeatureSelection master = BlueprintTool.Get("381cf4c890815d049a4420c6f31d063f"); + foreach(var patron in master.m_AllFeatures) + { + var progression = BlueprintTool.Get(patron.Guid.ToString()); + if (progression != null)//Failsafe for when I do Celestial Agenda + { + + } + + } + + + } + + } +} diff --git a/TomeOfTheFirebird/Modified Content/Items/RadianceUpgrades.cs b/TomeOfTheFirebird/Modified Content/Items/RadianceUpgrades.cs new file mode 100644 index 0000000..c987110 --- /dev/null +++ b/TomeOfTheFirebird/Modified Content/Items/RadianceUpgrades.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TomeOfTheFirebird.Modified_Content.Items +{ + class RadianceUpgrades + { + //Rescue Yaniel Upgrade - I THINK this would just be making the enhancement upgrade + //When wielded by a paladin, this sacred weapon provides spell resistance of 5 + the paladin’s class level to the wielder and anyone adjacent to her. It also enables the paladin to use greater dispel magic (once per round as a standard action) at the class level of the paladin. Only the area dispel is possible, not the targeted dispel or counterspell versions of greater dispel magic. + + + //Vs Deskari - keep the +6 + //This +3 cold iron longsword becomes a +5 holy defiantUE cold iron longsword in the hands of a paladin or a lawful good mythic creature. If the creature wielding this weapon is a paladin with mythic tiers, she can also grant the weapon the brilliant energy special ability on command. Dismissing the brilliant energy ability is a free action. + + //Defiant: This special ability can only be placed on melee weapons. A defiant weapon helps its wielder stay alive in desperate conditions. It stays in its wielder’s hand even if she is panicked, stunned, or unconscious. She adds the weapon’s enhancement bonus as a bonus on checks to stabilize when dying and on saving throws to end ongoing conditions such as disease, poison, and hold person. If the wielder possesses Heroic Defiance, Heroic Recovery, Improved Great Fortitude, Improved Iron Will, or Improved Lightning Reflexes, she gains a number of additional daily uses equal to the weapon’s enhancement bonus that can be used on any of these feats. + + //When wielded by a paladin or a lawful good mythic creature, this weapon provides spell resistance equal to 5 + the character’s paladin class level (if any) + the character’s mythic tier(if any) to the wielder and anyone within 10 feet of her.It also enables the wielder to use mythic greater dispel magic once per round as a standard action, with a caster level equal to either the wielder’s paladin class level or double her mythic tier, whichever is higher.Mythic greater dispel magic functions as greater dispel magic including the benefits of the mythic dispel magic spell, but when the wielder dispels a spell, she heals 1d6 points of damage for every spell level of the dispelled spell instead of healing 1d4 points of damage. + + } +} diff --git a/TomeOfTheFirebird/New Components/Prerequisites/PrerequisiteArchetypeCantTakeWithX.cs b/TomeOfTheFirebird/New Components/Prerequisites/PrerequisiteArchetypeCantTakeWithX.cs new file mode 100644 index 0000000..919baef --- /dev/null +++ b/TomeOfTheFirebird/New Components/Prerequisites/PrerequisiteArchetypeCantTakeWithX.cs @@ -0,0 +1,45 @@ +using JetBrains.Annotations; +using Kingmaker.Blueprints; +using Kingmaker.Blueprints.Classes.Prerequisites; +using Kingmaker.Blueprints.Classes.Selection; +using Kingmaker.UnitLogic; +using Kingmaker.UnitLogic.Class.LevelUp; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TomeOfTheFirebird.New_Components.Prerequisites +{ + class PrerequisiteArchetypeCantTakeWithX : Prerequisite + { + + public List blockedArchetypes = new(); + + public BlueprintFeatureSelectionReference blocked; + + public override bool CheckInternal([CanBeNull] FeatureSelectionState selectionState, [NotNull] UnitDescriptor unit, [CanBeNull] LevelUpState state) + { + if (selectionState.Selection is BlueprintFeatureSelection selection) + { + if (selection.ToReference().Equals(blocked)) + { + foreach(var arch in blockedArchetypes) + { + if (unit.Progression.IsArchetype(arch)) + return false; + } + + } + } + + return true; + } + + public override string GetUITextInternal(UnitDescriptor unit) + { + return ""; + } + } +} diff --git a/TomeOfTheFirebird/New Content/Archetypes/SeasonalWitch.cs b/TomeOfTheFirebird/New Content/Archetypes/SeasonalWitch.cs new file mode 100644 index 0000000..907b8a2 --- /dev/null +++ b/TomeOfTheFirebird/New Content/Archetypes/SeasonalWitch.cs @@ -0,0 +1,131 @@ +using BlueprintCore.Blueprints.CustomConfigurators.Classes; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; +using BlueprintCore.Utils; +using Kingmaker.Blueprints; +using Kingmaker.Blueprints.Classes; +using Kingmaker.Blueprints.Classes.Selection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TabletopTweaks.Core.Utilities; +using TomeOfTheFirebird.Helpers; +using TomeOfTheFirebird.New_Components.Prerequisites; + +namespace TomeOfTheFirebird.New_Content.Archetypes +{ + class SeasonalWitch + { + public void Make() + { + var classID = "1b9873f1e7bfe5449bc84d03e9c8e3cc"; + var archeGuid = Main.TotFContext.Blueprints.GetGUID("SeasonWitchArchetype"); + var SeasonOfTheWitchUIFeatureGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchUIFeature"); + + var winterPatron = BlueprintTool.Get("e98d8d9f907c1814aa7376d6cdaac012"); + + var SummerDCGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchSummerDCFeature"); + var AutumnDCGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchAutumnDCFeature"); + var WinterDCGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchWinterDCFeature"); + var SpringDCGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchSpringDCFeature"); + + + var SummerHexGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchSummerHexFeature"); + var AutumnHexGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchAutumnHexFeature"); + var WinterHexGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchWinterHexFeature"); + var SpringHexGuid = Main.TotFContext.Blueprints.GetGUID("SeasonOfTheWitchSpringHexFeature"); + + + if (Settings.IsEnabled("SeasonWitch")) + { + + + + var SeasonOfTheWitchUIFeature = FeatureConfigurator.New("SeasonOfTheWitchUIFeature", SeasonOfTheWitchUIFeatureGuid.ToString()); + SeasonOfTheWitchUIFeature.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchUIFeature.Name", "Season Of The Witch", false)); + SeasonOfTheWitchUIFeature.SetDescription(LocalizationTool.CreateString("SeasonOfTheWitchUIFeature.Desc", $"A season witch observes the cycles of life through symbolic festivals and the very real passage of time. Their covens celebrate the seasons and their impact on magic. These seasonal cycles alter their magic and mind-set, focusing their spells and hexes on a predominant energy type and philosophy.\n A season witch makes a commitment to embody the sacred symbolism of a season year round, and learns her spells through communion with nature, divining secrets from shapes in the clouds or the play of leaves on the wind.At 1st level, a season witch chooses the season that defines her abilities as her patron; this choice also provides her certain benefits.\nA spring witch has dominion over the renewing spirit of life and youth.The save DCs of her spells that deal electricity damage increase by 1.At 1st level, she gains either the charm hex or disguise hex as a bonus hex.\nA summer witch has dominion over growth, the harvest, and toil.The save DCs of her spells that deal fire damage increase by 1.At 1st level, she gains either the fortune hex or misfortune hex as a bonus hex.\nAn autumn witch has dominion over the provision of the land and the passing of life. The save DCs of her spells that deal acid damage increase by 1.At 1st level, she gains either the blight hex or slumber hex as a bonus hex.\nA winter witch has dominion over hearth and home.The save DCs of her spells that deal cold damage increase by 1.At 1st level, she gains either the healing hex or ward hex as a bonus hex.")); + SeasonOfTheWitchUIFeature.SetIsClassFeature(true); + SeasonOfTheWitchUIFeature.Configure(); + + + var arche = ArchetypeConfigurator.New("SeasonWitch", archeGuid.ToString(), classID); + arche.SetLocalizedName(LocalizationTool.CreateString("SeasonWitch.Name", "Season Witch")); + arche.SetLocalizedName(LocalizationTool.CreateString("SeasonWitch.Desc", "Season witches gain their power from the cyclical and mystical exchange of energy passed from one season of nature to another. Often, season witches carry bitter grudges against their fellow witches, with many believing that the season prior to their chosen focus is inferior and the season that replaces their favored time is an usurper of time, but at other times season witches work together, understanding that all are a part of the cycle of the natural world.")); + + arche.AddToAddFeatures(1, "SeasonOfTheWitchUIFeature"); + + var winterDC = FeatureConfigurator.New("SeasonOfTheWitchWinterDCFeature", WinterDCGuid.ToString()); + winterDC.SetIsClassFeature(true); + winterDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchWinterDCFeature.Name", "Season Of The Witch: Cold DC")); + winterDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchWinterDCFeature.Desc", "A winter witch has dominion over hearth and home. The save DCs of her spells that deal cold damage increase by 1.")); + winterDC.AddIncreaseSpellDescriptorDC(1, new Kingmaker.Blueprints.Classes.Spells.SpellDescriptorWrapper(Kingmaker.Blueprints.Classes.Spells.SpellDescriptor.Cold)); + winterDC.AddPrerequisiteFeature(winterPatron, checkInProgression: true); + winterDC.SetHideNotAvailibleInUI(true); + winterDC.Configure(); + + var springDC = FeatureConfigurator.New("SeasonOfTheWitchSpringDCFeature", SpringDCGuid.ToString()); + springDC.SetIsClassFeature(true); + springDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchSpringDCFeature.Name", "Season Of The Witch: Electricity DC")); + springDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchSpringDCFeature.Desc", "A spring witch has dominion over the renewing spirit of life and youth. The save DCs of her spells that deal electricity damage increase by 1")); + springDC.AddIncreaseSpellDescriptorDC(1, new Kingmaker.Blueprints.Classes.Spells.SpellDescriptorWrapper(Kingmaker.Blueprints.Classes.Spells.SpellDescriptor.Electricity)); + //springDC.AddPrerequisiteFeature(winterPatron, checkInProgression: true); + springDC.SetHideNotAvailibleInUI(true); + springDC.Configure(); + + var summerDC = FeatureConfigurator.New("SeasonOfTheWitchSummerDCFeature", SpringDCGuid.ToString()); + summerDC.SetIsClassFeature(true); + summerDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchSummerDCFeature.Name", "Season Of The Summer: Fire DC")); + summerDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchSummerDCFeature.Desc", "A summer witch has dominion over growth, the harvest, and toil. The save DCs of her spells that deal fire damage increase by 1.")); + summerDC.AddIncreaseSpellDescriptorDC(1, new Kingmaker.Blueprints.Classes.Spells.SpellDescriptorWrapper(Kingmaker.Blueprints.Classes.Spells.SpellDescriptor.Fire)); + //summerDC.AddPrerequisiteFeature(winterPatron, checkInProgression: true); + summerDC.SetHideNotAvailibleInUI(true); + summerDC.Configure(); + + var autumnDC = FeatureConfigurator.New("SeasonOfTheWitchAutumnDCFeature", AutumnDCGuid.ToString()); + autumnDC.SetIsClassFeature(true); + autumnDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchAutumnDCFeature.Name", "Season Of The Witch: Cold DC")); + autumnDC.SetDisplayName(LocalizationTool.CreateString("SeasonOfTheWitchAutumnDCFeature.Desc", "An autumn witch has dominion over the provision of the land and the passing of life. The save DCs of her spells that deal acid damage increase by 1.")); + autumnDC.AddIncreaseSpellDescriptorDC(1, new Kingmaker.Blueprints.Classes.Spells.SpellDescriptorWrapper(Kingmaker.Blueprints.Classes.Spells.SpellDescriptor.Acid)); + //autumnDC.AddPrerequisiteFeature(winterPatron, checkInProgression: true); + autumnDC.SetHideNotAvailibleInUI(true); + autumnDC.Configure(); + + var winterHex = FeatureSelectionConfigurator.New("SeasonOfTheWitchWinterHexFeature", WinterHexGuid.ToString()); + + arche.AddToRemoveFeatures(1, "9846043cf51251a4897728ed6e24e76f"); + arche.AddToAddFeatures(1, "SeasonOfTheWitchWinterDCFeature"); + var archeBuilt = arche.Configure(); + + BlueprintFeatureSelection patronSelector = BlueprintTool.Get("381cf4c890815d049a4420c6f31d063f"); + foreach(var patron in patronSelector.AllFeatures) + { + if (!patron.Equals(winterPatron)) + { + + patron.AddComponent(x => + { + x.blockedArchetypes.Add(archeBuilt.ToReference()); + x.blocked = patronSelector.ToReference(); + x.HideInUI = true; + + }); + } + patron.HideNotAvailibleInUI = true; + } + + + } + else + { + ArchetypeConfigurator.New("SeasonWitch", archeGuid.ToString()).Configure(); + FeatureConfigurator.New("SeasonOfTheWitchUIFeature", SeasonOfTheWitchUIFeatureGuid.ToString()).Configure(); + FeatureConfigurator.New("SeasonOfTheWitchWinterDCFeature", WinterDCGuid.ToString()).Configure(); + FeatureConfigurator.New("SeasonOfTheWitchSpringDCFeature", SpringDCGuid.ToString()).Configure(); + FeatureConfigurator.New("SeasonOfTheWitchSummerDCFeature", SpringDCGuid.ToString()).Configure(); + FeatureConfigurator.New("SeasonOfTheWitchAutumnDCFeature", AutumnDCGuid.ToString()).Configure(); + } + + } + } +} diff --git a/TomeOfTheFirebird/New Content/Feats/DiscordantSong.cs b/TomeOfTheFirebird/New Content/Feats/DiscordantSong.cs index aaba950..143d416 100644 --- a/TomeOfTheFirebird/New Content/Feats/DiscordantSong.cs +++ b/TomeOfTheFirebird/New Content/Feats/DiscordantSong.cs @@ -1,5 +1,6 @@ using BlueprintCore.Blueprints.Configurators.Classes.Selection; using BlueprintCore.Blueprints.CustomConfigurators.Classes; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; using BlueprintCore.Blueprints.CustomConfigurators.UnitLogic.Abilities; using BlueprintCore.Conditions.Builder; using BlueprintCore.Conditions.Builder.ContextEx; diff --git a/TomeOfTheFirebird/New Content/Feats/ProdigiousTWF.cs b/TomeOfTheFirebird/New Content/Feats/ProdigiousTWF.cs index ec635fc..56d3904 100644 --- a/TomeOfTheFirebird/New Content/Feats/ProdigiousTWF.cs +++ b/TomeOfTheFirebird/New Content/Feats/ProdigiousTWF.cs @@ -1,5 +1,6 @@ using BlueprintCore.Blueprints.Configurators.Classes.Selection; using BlueprintCore.Blueprints.CustomConfigurators.Classes; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; using Kingmaker.Blueprints.Classes; using Kingmaker.Blueprints.Classes.Selection; using Kingmaker.EntitySystem.Stats; diff --git a/TomeOfTheFirebird/New Content/Feats/RageStanceMastery.cs b/TomeOfTheFirebird/New Content/Feats/RageStanceMastery.cs deleted file mode 100644 index b6c1a6d..0000000 --- a/TomeOfTheFirebird/New Content/Feats/RageStanceMastery.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TomeOfTheFirebird.New_Content.Feats -{ - class RageStanceMastery - { - public static void Make() - { - string sysname = "RageStanceMastery"; - string displayName = "Rage Stance Mastery"; - string desc = "The barbarian can now take two rage stances at once"; - if (Settings.IsEnabled("RageStanceMastery")) - { - - } - - } - } -} diff --git a/TomeOfTheFirebird/New Content/Items/PaladinGear.cs b/TomeOfTheFirebird/New Content/Items/PaladinGear.cs index 727a18d..5929828 100644 --- a/TomeOfTheFirebird/New Content/Items/PaladinGear.cs +++ b/TomeOfTheFirebird/New Content/Items/PaladinGear.cs @@ -62,7 +62,7 @@ private static void BuildSmite() Kingmaker.Blueprints.Classes.BlueprintFeature avengingFeatureBuilt = avengingFeature.Configure(); - //Add destro active-smite + //If the wearer is not a member of such a class, once per day she may make one smite attack, gaining a bonus on the attack roll equal to her Charisma bonus, and a +5 bonus to the damage roll on a hit. enchant.AddUnitFeatureEquipment(avengingFeatureBuilt.AssetGuidThreadSafe); @@ -72,7 +72,7 @@ private static void BuildSmite() string itemSysName = "BracersOfTheAvengingKnight"; string itemName = "Bracers Of The Avenging Knight"; - string itemDesc = $"TThese silver bracers are polished to a mirrored sheen, but otherwise shift their appearance to match whatever suit of armor they are worn with.\n {sharedDesc}."; + string itemDesc = $"These silver bracers are polished to a mirrored sheen, but otherwise shift their appearance to match whatever suit of armor they are worn with.\n {sharedDesc}."; //TODO add the 1/day lesser resto on LoH BlueprintGuid guid = Main.TotFContext.Blueprints.GetGUID(itemSysName); LocalizedString name = LocalizationTool.CreateString(itemSysName + ".Name", itemName); diff --git a/TomeOfTheFirebird/New Content/Mercies/ExtraMercies.cs b/TomeOfTheFirebird/New Content/Mercies/ExtraMercies.cs index c4d9ecb..f38623b 100644 --- a/TomeOfTheFirebird/New Content/Mercies/ExtraMercies.cs +++ b/TomeOfTheFirebird/New Content/Mercies/ExtraMercies.cs @@ -1,6 +1,7 @@ using BlueprintCore.Actions.Builder; using BlueprintCore.Actions.Builder.ContextEx; using BlueprintCore.Blueprints.Configurators.Classes.Selection; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; using BlueprintCore.Conditions.Builder; using BlueprintCore.Conditions.Builder.ContextEx; using Kingmaker.Blueprints.Classes; @@ -138,7 +139,7 @@ void BuildInjured() public static void AddToThings() { - string TTTExtraMercies = "6e76496c2748405d9946949977bd3e8d"; + //string TTTExtraMercies = "6e76496c2748405d9946949977bd3e8d"; if (Settings.IsEnabled("mercyinjured")) { FeatureSelectionConfigurator.For("02b187038a8dce545bb34bbfb346428d").AddToAllFeatures(injured.AssetGuidThreadSafe).Configure(); diff --git a/TomeOfTheFirebird/New Content/RagePowers/ElementalStance.cs b/TomeOfTheFirebird/New Content/RagePowers/ElementalStance.cs index b7b3e65..faa79e3 100644 --- a/TomeOfTheFirebird/New Content/RagePowers/ElementalStance.cs +++ b/TomeOfTheFirebird/New Content/RagePowers/ElementalStance.cs @@ -1,6 +1,7 @@ using BlueprintCore.Actions.Builder; using BlueprintCore.Actions.Builder.ContextEx; using BlueprintCore.Blueprints.Configurators.Classes.Selection; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; using BlueprintCore.Blueprints.CustomConfigurators.UnitLogic.Buffs; using BlueprintCore.Conditions.Builder; using BlueprintCore.Conditions.Builder.ContextEx; @@ -109,6 +110,7 @@ void AddToOtherRage(string otherRage) selector = stanceSelectFeature.Configure().ToReference(); + /* if (Settings.IsEnabled("RagePowerElementalStance")) { FeatureSelectionConfigurator.For("28710502f46848d48b3f0d6132817c4e").AddToAllFeatures(selector.Guid).Configure(); @@ -122,6 +124,7 @@ void AddToOtherRage(string otherRage) } } + */ //TODO check if need to patch on viking! diff --git a/TomeOfTheFirebird/New Content/RagePowers/RageStanceMastery.cs b/TomeOfTheFirebird/New Content/RagePowers/RageStanceMastery.cs new file mode 100644 index 0000000..59faa20 --- /dev/null +++ b/TomeOfTheFirebird/New Content/RagePowers/RageStanceMastery.cs @@ -0,0 +1,91 @@ +using BlueprintCore.Utils; +using Kingmaker.Blueprints; +using Kingmaker.Blueprints.Classes; +using Kingmaker.Blueprints.Classes.Prerequisites; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TabletopTweaks.Core.Utilities; +using TomeOfTheFirebird.Helpers; + +namespace TomeOfTheFirebird.New_Content.RagePowers +{ + class RageStanceMastery + { + public static void Make() + { + string sysname = "RageStanceMastery"; + string displayName = "Rage Stance Mastery"; + string desc = "The barbarian can now use two rage stances at once"; + if (Settings.IsEnabled("RagePowerRageStanceMastery")) + { + var feature = MakerTools.MakeFeature(sysname, displayName, desc); + List> reqs = new(); + reqs.Add("efb97e482f53f064dab85a9eeaf01085");//Guarded Stance + reqs.Add("e4450dd9c06dc034fb7c0c08abcc202b");//Lethal Stance + reqs.Add("bc64d8f695f6d6448b3863d253353e7f");//Powerful Stance + reqs.Add("cb502c65dab407b4e928f5d8355cafc9");//Reckless stance + if (Settings.IsEnabled("RagePowerElementalStance")) + { + reqs.Add("ElementalStanceRagePowerAcid"); + reqs.Add("ElementalStanceRagePowerFire"); + reqs.Add("ElementalStanceRagePowerElectricity"); + reqs.Add("ElementalStanceRagePowerCold"); + } + + + feature.SetGroups(FeatureGroup.RagePower); + + feature.AddIncreaseActivatableAbilityGroupSize(group: Kingmaker.UnitLogic.ActivatableAbilities.ActivatableAbilityGroup.BarbarianStance); + feature.AddPrerequisiteFeaturesFromList(reqs, 2); + feature.Configure(); + } + else + { + var feature = MakerTools.MakeFeature(sysname, displayName, desc); + + + feature.Configure(); + } + + } + + + public static void Finish() + { + if (Settings.IsEnabled("RagePowerRageStanceMastery")) + { + + var mastery = BlueprintTool.Get("RageStanceMastery"); + + var deadlyFeature = BlueprintTool.Get("c841ffa13d39ce442a408f57feb3cb8e"); + foreach (var comp in deadlyFeature.Components) + { + if (comp is PrerequisiteClassLevel classLevel) + { + mastery.AddComponent(x => + { + + x.m_CharacterClass = classLevel.m_CharacterClass; + x.Level = classLevel.Level + 10; + x.Group = Prerequisite.GroupType.Any; + }); + } + else if (comp is PrerequisiteArchetypeLevel arche) + { + mastery.AddComponent(x => + { + x.m_CharacterClass = arche.m_CharacterClass; + x.Level = arche.Level + 10; + x.m_Archetype = arche.m_Archetype; + x.Group = Prerequisite.GroupType.Any; + }); + + } + } + } + } + } +} diff --git a/TomeOfTheFirebird/New Content/Spells/BurstOfRadiance.cs b/TomeOfTheFirebird/New Content/Spells/BurstOfRadiance.cs new file mode 100644 index 0000000..c64ac46 --- /dev/null +++ b/TomeOfTheFirebird/New Content/Spells/BurstOfRadiance.cs @@ -0,0 +1,94 @@ +using BlueprintCore.Actions.Builder; +using BlueprintCore.Actions.Builder.ContextEx; +using BlueprintCore.Conditions.Builder; +using BlueprintCore.Conditions.Builder.ContextEx; +using BlueprintCore.Utils.Types; +using Kingmaker.Blueprints; +using Kingmaker.Blueprints.Classes.Spells; +using Kingmaker.UnitLogic.Abilities; +using Kingmaker.UnitLogic.Abilities.Blueprints; +using Kingmaker.UnitLogic.Abilities.Components.Base; +using TabletopTweaks.Core.Utilities; +using TomeOfTheFirebird.Helpers; +using TomeOfTheFirebird.Reference; +using static TabletopTweaks.Core.MechanicsChanges.MetamagicExtention; + +namespace TomeOfTheFirebird.New_Spells +{ + class BurstOfRadiance + { + public static void Make() + { + var flare = BlueprintTools.GetBlueprint("39a602aa80cc96f4597778b6d4d49c0a"); + var icon = flare.Icon; + var flarefx = flare.GetComponent(); + + var burst = MakerTools.MakeSpell("BurstOfRadiance", "Burst Of Radiance", "This spell fills the area with a brilliant flash of shimmering light.Creatures in the area are blinded for 1d4 rounds, or dazzled for 1d4 rounds if they succeed at a Reflex save. Evil creatures in the area of the burst take 1d4 points of damage per caster level (max 5d4), whether they succeed at the Reflex save or not.", icon, Kingmaker.Blueprints.Classes.Spells.SpellSchool.Evocation, LocalizedStrings.ReflexPartial); + burst.AddSpellListComponent(2, SpellTools.SpellList.WizardSpellList); + burst.AddSpellListComponent(2, SpellTools.SpellList.ClericSpellList); + burst.AddSpellListComponent(2, SpellTools.SpellList.DruidSpellList); + burst.AddSpellListComponent(2, SpellTools.SpellList.WarpriestSpelllist); + burst.AddSpellListComponent(2, SpellTools.SpellList.HunterSpelllist); + burst.SetActionType(Kingmaker.UnitLogic.Commands.Base.UnitCommand.CommandType.Standard); + burst.SetType(AbilityType.Spell); + burst.SetRange(AbilityRange.Close); + burst.SetCanTargetPoint(true); + burst.SetCanTargetEnemies(true); + burst.SetCanTargetFriends(true); + burst.SetSpellResistance(true); + burst.SetAnimation(Kingmaker.Visual.Animation.Kingmaker.Actions.UnitAnimationActionCastSpell.CastAnimationStyle.Directional); + burst.SetAvailableMetamagic(Metamagic.Quicken, Metamagic.Heighten, Metamagic.CompletelyNormal, Metamagic.Reach, Metamagic.Bolstered, Metamagic.Empower, Metamagic.Heighten, Metamagic.Maximize, Metamagic.Persistent, Metamagic.Selective, (Metamagic)CustomMetamagic.Flaring, (Metamagic)CustomMetamagic.Intensified, (Metamagic)CustomMetamagic.Piercing); + burst.AddAbilityEffectRunAction(savingThrowType: Kingmaker.EntitySystem.Stats.SavingThrowType.Reflex, actions: ActionsBuilder.New().ConditionalSaved(failed: ActionsBuilder.New().ApplyBuff("0ec36e7596a4928489d2049e1e1c76a7", ContextDuration.FixedDice(diceType: Kingmaker.RuleSystem.DiceType.D4)), succeed: ActionsBuilder.New().ApplyBuff("df6d1025da07524429afbae248845ecc", ContextDuration.FixedDice(diceType: Kingmaker.RuleSystem.DiceType.D4))).Conditional(conditions: ConditionsBuilder.New().Alignment(Kingmaker.Enums.AlignmentComponent.Evil), ifTrue: ActionsBuilder.New().DealDamage(damageType: new Kingmaker.RuleSystem.Rules.Damage.DamageTypeDescription() + { + Type = Kingmaker.RuleSystem.Rules.Damage.DamageType.Energy, + Energy = Kingmaker.Enums.Damage.DamageEnergyType.Divine + + }, new Kingmaker.UnitLogic.Mechanics.ContextDiceValue() + { + DiceType = Kingmaker.RuleSystem.DiceType.D6, + DiceCountValue = new Kingmaker.UnitLogic.Mechanics.ContextValue() + { + ValueType = Kingmaker.UnitLogic.Mechanics.ContextValueType.Rank, + ValueRank = Kingmaker.Enums.AbilityRankType.DamageDice + } + }))); + burst.AddAbilityTargetsAround(radius: new Kingmaker.Utility.Feet(10f), targetType: Kingmaker.UnitLogic.Abilities.Components.TargetType.Any, spreadSpeed: new Kingmaker.Utility.Feet(10f)); + burst.AddContextRankConfig(ContextRankConfigs.CasterLevel(type: Kingmaker.Enums.AbilityRankType.DamageDice, max: 5)); + burst.AddAbilitySpawnFx(anchor: flarefx.Anchor, delay: flarefx.Delay, prefabLink: flarefx.PrefabLink); + burst.SetSpellDescriptor(SpellDescriptor.Good | SpellDescriptor.Blindness); + burst.AddCraftInfoComponent(aOEType: Kingmaker.Craft.CraftAOE.AOE, savingThrow: Kingmaker.Craft.CraftSavingThrow.Reflex, spellType: Kingmaker.Craft.CraftSpellType.Damage); + var made = burst.Configure(); + + if (Settings.IsEnabled("BurstOfRadiance")) + { + made.AddToSpellList(SpellTools.SpellList.ClericSpellList, 2); + made.AddToSpellList(SpellTools.SpellList.DruidSpellList, 2); + made.AddToSpellList(SpellTools.SpellList.WizardSpellList, 2); + made.AddToSpellList(SpellTools.SpellList.WarpriestSpelllist, 2); + made.AddToSpellList(SpellTools.SpellList.HunterSpelllist, 2); + + made.AddToSpellSpecialization(); + } + } + + // Burst of Radiance + + //School evocation[good, light]; Level cleric 2, druid 2, sorcerer/wizard 2 + + //CASTING + + //Casting Time 1 standard action + //Components V, S, M/DF(a piece of flint and a pinch of silver dust) + + //EFFECT + + //Range long (400 ft. + 40 ft./level) + //Area 10-ft.-radius burst + //Duration instantaneous + //Saving Throw Reflex partial; Spell Resistance yes + + //DESCRIPTION + + //This spell fills the area with a brilliant flash of shimmering light.Creatures in the area are blinded for 1d4 rounds, or dazzled for 1d4 rounds if they succeed at a Reflex save. Evil creatures in the area of the burst take 1d4 points of damage per caster level (max 5d4), whether they succeed at the Reflex save or not. + } +} diff --git a/TomeOfTheFirebird/New Content/Spells/EarthTremor.cs b/TomeOfTheFirebird/New Content/Spells/EarthTremor.cs new file mode 100644 index 0000000..4556f3e --- /dev/null +++ b/TomeOfTheFirebird/New Content/Spells/EarthTremor.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TomeOfTheFirebird.New_Content.Spells +{ + class EarthTremor + { + /* + * [PFS Legal] Earth Tremor +Source Ultimate Wilderness pg. 228 +School transmutation [earth]; Level arcanist 3, bloodrager 3, druid 3, hunter 3, magus 3, shaman 3, sorcerer 3, witch 3, wizard 3 +Casting +Casting Time 1 standard action +Components V, S +Effect +Range up to 30 ft. (see text) +Area 30-ft. line, 20-ft. cone-shaped spread, or 10-ft.-radius spread (see text) +Duration instantaneous +Saving Throw Reflex half (see text); Spell Resistance no +Description +You strike the ground and unleash a tremor of seismic force, hurling up earth, rock, and sand. You choose whether the earth tremor affects a 30-foot line, a 20-foot cone-shaped spread, or a 10-foot-radius spread centered on you. The space you occupy is not affected by earth tremor. The area you choose becomes dense rubble that costs 2 squares of movement to enter. Dense rubble adds 5 to the DC of Acrobatics checks and adds 2 to the DC of Stealth checks. Creatures on the ground in the area take 1d4 points of bludgeoning damage per caster level you have (maximum 10d4) or half damage on a successful save. Medium or smaller creatures that fail their saves are knocked prone. + +This spell can be cast only on a surface of earth, sand, or stone. It has no effect if you are in a wooden or metal structure or if you are not touching the ground. + */ + } +} diff --git a/TomeOfTheFirebird/New Content/Spells/TODO/BurstOfRadiance.cs b/TomeOfTheFirebird/New Content/Spells/TODO/BurstOfRadiance.cs deleted file mode 100644 index 82029fa..0000000 --- a/TomeOfTheFirebird/New Content/Spells/TODO/BurstOfRadiance.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace TomeOfTheFirebird.New_Spells -{ - class BurstOfRadiance - { -// Burst of Radiance - -//School evocation[good, light]; Level cleric 2, druid 2, sorcerer/wizard 2 - -//CASTING - -//Casting Time 1 standard action -//Components V, S, M/DF(a piece of flint and a pinch of silver dust) - -//EFFECT - -//Range long (400 ft. + 40 ft./level) -//Area 10-ft.-radius burst -//Duration instantaneous -//Saving Throw Reflex partial; Spell Resistance yes - -//DESCRIPTION - -//This spell fills the area with a brilliant flash of shimmering light.Creatures in the area are blinded for 1d4 rounds, or dazzled for 1d4 rounds if they succeed at a Reflex save. Evil creatures in the area of the burst take 1d4 points of damage per caster level (max 5d4), whether they succeed at the Reflex save or not. - } -} diff --git a/TomeOfTheFirebird/New Content/WildTalents/BasicKinesis.cs b/TomeOfTheFirebird/New Content/WildTalents/BasicKinesis.cs index f88a9b9..5985d45 100644 --- a/TomeOfTheFirebird/New Content/WildTalents/BasicKinesis.cs +++ b/TomeOfTheFirebird/New Content/WildTalents/BasicKinesis.cs @@ -1,5 +1,6 @@ using BlueprintCore.Actions.Builder; using BlueprintCore.Actions.Builder.ContextEx; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; using BlueprintCore.Blueprints.CustomConfigurators.UnitLogic.Buffs; using BlueprintCore.Utils; using BlueprintCore.Utils.Types; @@ -17,7 +18,7 @@ class BasicKinesis { public static void Build() { - BlueprintCore.Blueprints.Configurators.Classes.Selection.FeatureSelectionConfigurator UtilitySelector = MakerTools.MakeFeatureSelector("UtilityWildTalentFakeSelector", "Utility Wild Talent", "A kineticist gains her selected element’s basic utility wild talent (basic telekinesis, basic aerokinesis, etc.) as a bonus wild talent at level 1.", false); + FeatureSelectionConfigurator UtilitySelector = MakerTools.MakeFeatureSelector("UtilityWildTalentFakeSelector", "Utility Wild Talent", "A kineticist gains her selected element’s basic utility wild talent (basic telekinesis, basic aerokinesis, etc.) as a bonus wild talent at level 1.", false); UtilitySelector.SetIsClassFeature(true); MakeAerokinesis(); diff --git a/TomeOfTheFirebird/New Content/WildTalents/ClockworkHeart.cs b/TomeOfTheFirebird/New Content/WildTalents/ClockworkHeart.cs index 2b8a77e..fca0f96 100644 --- a/TomeOfTheFirebird/New Content/WildTalents/ClockworkHeart.cs +++ b/TomeOfTheFirebird/New Content/WildTalents/ClockworkHeart.cs @@ -1,5 +1,6 @@ using BlueprintCore.Blueprints.Configurators.Classes.Selection; using BlueprintCore.Blueprints.CustomConfigurators.Classes; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; using Kingmaker.Blueprints.Classes; using TomeOfTheFirebird.Helpers; diff --git a/TomeOfTheFirebird/New Content/WitchPatrons.cs b/TomeOfTheFirebird/New Content/WitchPatrons.cs index 0bffed9..b8f1c79 100644 --- a/TomeOfTheFirebird/New Content/WitchPatrons.cs +++ b/TomeOfTheFirebird/New Content/WitchPatrons.cs @@ -1,9 +1,12 @@ -using BlueprintCore.Utils; +using BlueprintCore.Blueprints.CustomConfigurators.Classes; +using BlueprintCore.Blueprints.CustomConfigurators.Classes.Selection; +using BlueprintCore.Utils; using Kingmaker.Blueprints; using Kingmaker.Blueprints.Classes; using Kingmaker.Blueprints.Classes.Selection; using Kingmaker.UnitLogic.Abilities.Blueprints; using Kingmaker.UnitLogic.FactLogic; +using System; using System.Collections.Generic; using System.Linq; using TabletopTweaks.Core.Utilities; @@ -12,63 +15,316 @@ namespace TomeOfTheFirebird.New_Content { class WitchPatrons { + + + private class PatronDefine + { + + + public List spells = new(); + public Func extraReqs; + public string Name; + + public IEnumerable archetypeSelectorsToAppendTo; + + public PatronDefine(string name, List spells, Func extraReqs = null, IEnumerable arches = null) + { + this.spells = spells; + this.extraReqs = extraReqs; + Name = name; + archetypeSelectorsToAppendTo = arches ?? new string[] { }; + } + + public bool CanComplete() + { + if (!Settings.IsEnabled(SettingName)) + return false; + else if (extraReqs == null) + return true; + else return extraReqs.Invoke(); + + } + + public string ProgName => "Witch" + Name + "PatronProgression"; + public string SettingName => "WitchPatron" + Name; + } + + static List patronDefines = new(); + + public static void Make() { + BlueprintTool.AddGuidsByName(("HagboundPatronSelect", "0b9af221d99a91842b3a2afbc6a68a1e")); + BlueprintTool.AddGuidsByName(("ElementalPatronSelect", "3172b6960c774e19ad029c5e4a96d3e4")); + if (Settings.IsCharOpsPlusEnabled()) + { + BlueprintTool.AddGuidsByName(("WinterWitchPatronSelect", "43e304fade8d447fabf517981fd064c1")); + } + BlueprintFeature template = BlueprintTools.GetBlueprint("4f068ba134bcabf47a370c5ecde812c4"); BlueprintCharacterClassReference witch = BlueprintTools.GetBlueprintReference("1b9873f1e7bfe5449bc84d03e9c8e3cc"); BlueprintProgression templateprog = BlueprintTools.GetBlueprint("cad7c2fdabeb9574f95f4b9ffee20afe"); - + BlueprintFeatureSelection witchSelector = BlueprintTools.GetBlueprint("381cf4c890815d049a4420c6f31d063f"); + MakeAnimal(); MakeDeath(); + MakeLight(); + MakePlague(); + MakeProtection(); + void MakeAnimal() + { + List spells = new(); + spells.Add("403cf599412299a4f9d5d925c7b9fb33");//COTW - magic fang + spells.Add("4c3d08935262b6544ae97599b3a9556d");//COTW - bull's strength + spells.Add("754c478a2aa9bb54d809e648c3f7ac0e"); + spells.Add("c83db50513abdf74ca103651931fac4b"); + spells.Add("56923211d2ac95e43b8ac5031bab74d8"); + spells.Add("9b93040dad242eb43ac7de6bb6547030");//COTW - beast shape III + spells.Add("940a545a665194b48b722c1f9dd78d53"); + spells.Add("cf689244b2c7e904eb85f26fd6e81552"); + spells.Add("a7469ef84ba50ac4cbf3d145e3173f8e"); + + patronDefines.Add(new("Animal", spells)); + + // Animals (Advanced Player's Guide pg. 70): 2nd — charm animals, 4th — speak with animals, 6th — dominate animal, 8th — summon nature's ally IV, 10th — animal growth, 12th — antilife shell, 14th — beast shape IV, 16th — animal shapes, 18th — summon nature's ally IX. + } + void MakeAurora() + { + List spells = new(); + spells.Add("91da41b9793a4624797921f221db653c");//Color Spray + spells.Add("56b8f0304a704a67b3c35cbe8c774854");//Hypnotic Pattern - expanded Content Required! + spells.Add("");//Need Wall Of Nausea Replacement + spells.Add("4b8265132f9c8174f87ce7fa6d0fe47b");//RainbowPattern + spells.Add("");//Need Blazing Rainbow Replacement ... or implement it + spells.Add("6303b404df12b0f4793fa0763b21dd2c");//Elemental Assessor. Is Assessor on level? + spells.Add("b22fd434bdb60fb4ba1068206402c4cf");//PrismaticSpray + spells.Add("");//Need Prismatic Wall replacement. That thing is an ai-breaker can't implement - possibly schintilating pattern + spells.Add("ba48abb52b142164eba309fd09898856");//Polar Midnight + //2nd — color spray, 4th — hypnotic pattern, 6th — wall of nauseaACG, 8th — rainbow pattern, 10th — blazing rainbowACG, 12th — programmed image, 14th — prismatic spray, 16th — prismatic wall, 18th — polar midnightUM. + + } + void MakeAutumn() + { + List spells = new(); + spells.Add("450af0402422b0b4980d9c2175869612");//Ray Of Enfeeblement + spells.Add("29ccc62632178d344ad0be0865fd3113");//Create Pit + spells.Add("");//gentle repose replacement - soothing mud in COTW + spells.Add("VitrolicMist"); + spells.Add("6d1d48a939ce475409f06e1b376bc386");//Major Creation Replacement - vinetrap - vinetrap in COTWW + spells.Add("dbf99b00cd35d0a4491c6cc9e771b487"); + spells.Add("8c29e953190cc67429dc9c701b16b7c2"); + spells.Add("08323922485f7e246acb3d2276515526"); + spells.Add("b24583190f36a8442b212e45226c54fc"); + + /// 2nd — ray of enfeeblement, 4th — create pit, 6th — gentle repose, 8th — vitriolic mist, 10th — major creation, 12th — acid fog, 14th — caustic eruption, 16th — horrid wilting, 18th — wail of the banshee. + } + void MakeDeath() { - List spells = new(); - BlueprintAbility rayOfEnfeeblement = BlueprintTools.GetBlueprint("450af0402422b0b4980d9c2175869612"); - spells.Add(rayOfEnfeeblement); - BlueprintAbility blessingOfCourageAndLife = BlueprintTools.GetBlueprint("c36c1d11771b0584f8e100b92ee5475b"); - BlueprintAbility boneshaker = BlueprintTools.GetBlueprint("b7731c2b4fa1c9844a092329177be4c3"); - - if (!Settings.IsEnabled("witchpatronl2replace")) + List spells = new(); + + spells.Add("450af0402422b0b4980d9c2175869612"); + + + if (!Settings.IsEnabled("WitchPatronDeathL2replace")) { - spells.Add(blessingOfCourageAndLife); + spells.Add("c36c1d11771b0584f8e100b92ee5475b"); } else { - spells.Add(boneshaker); - - } - spells.Add(BlueprintTool.Get( "GloomblindBolts")); - spells.Add(BlueprintTools.GetBlueprint("f2f1efac32ea2884e84ecaf14657298b"));//Boneshatter; - spells.Add(BlueprintTools.GetBlueprint("1cde0691195feae45bab5b83ea3f221e"));//Wracking Ray - spells.Add(BlueprintTools.GetBlueprint("a89dcbbab8f40e44e920cc60636097cf"));//CircleOfDeath - spells.Add(BlueprintTools.GetBlueprint("6f1dcf6cfa92d1948a740195707c0dbe"));//FingerOfDeath - spells.Add(BlueprintTools.GetBlueprint("08323922485f7e246acb3d2276515526"));//HorridWilting - spells.Add(BlueprintTools.GetBlueprint("b24583190f36a8442b212e45226c54fc"));//HorridWilting + spells.Add("b7731c2b4fa1c9844a092329177be4c3"); + } + spells.Add("GloomblindBolts"); + spells.Add("f2f1efac32ea2884e84ecaf14657298b");//Boneshatter; + spells.Add(("1cde0691195feae45bab5b83ea3f221e"));//Wracking Ray + spells.Add(("a89dcbbab8f40e44e920cc60636097cf"));//CircleOfDeath + spells.Add(("6f1dcf6cfa92d1948a740195707c0dbe"));//FingerOfDeath + spells.Add(("08323922485f7e246acb3d2276515526"));//HorridWilting + spells.Add(("b24583190f36a8442b212e45226c54fc"));//HorridWilting - BlueprintProgression deathprog = MakePatronProgression("Death", spells); + patronDefines.Add(new PatronDefine("Death", spells, () => { return Settings.IsEnabled("GloomblindBolts"); }));//TODO patch to work with expanded content gloomblind bolts + } - BlueprintProgression MakePatronProgression(string patronName, List spells) + + void MakeEnchantment() + { + List spells = new(); + spells.Add("feb70aab86cc17f4bb64432c83737ac2");//COTW - command + spells.Add("fd4d9fd7f87575d47aafe2a64a6e2d8d");//COTW - laughter + spells.Add("e6048d85fc3294f4c92b21c8d7526b1f");//COTW - Cacophonus call + spells.Add("dd2918e4a77c50044acba1ac93494c36");// + spells.Add("d7cbd2004ce66a042aeab2e95a3c5c61"); + spells.Add("d316d3d94d20c674db2c24d7de96f6a7");//COTW - serentity + spells.Add("cbf3bafa8375340498b86a3313a11e2f"); + spells.Add("");//irresiststable dange + spells.Add("3c17035ec4717674cae2e841a190e757"); + + //Remember to add to Winter Witch! + // [PFS Legal] Enchantment (Ultimate Magic pg. 83): 2nd — unnatural lust, 4th — calm emotions, 6th — unadulterated loathing, 8th — overwhelming grief, 10th — dominate person, 12th — geas, 14th — euphoric tranquility, 16th — demand, 18th — dominate monster. + } + + + + void MakeLight() + { + List spells = new(); + spells.Add("39a602aa80cc96f4597778b6d4d49c0a");//Flare Burst - COTW used color spray + spells.Add("BurstOfRadiance");// + spells.Add("bf0accce250381a44b857d4af6c8e10d");//Searing Light - COTW used Remove Blindness, disregarding because this is baby sunbeam/sunburst and the game always subs searing for daylight + spells.Add("4b8265132f9c8174f87ce7fa6d0fe47b"); + spells.Add("ebade19998e1f8542a1b55bd4da766b3"); + spells.Add("f8cea58227f59c64399044a82c9735c4");//Chains Of Light - added because seriously Sirocco? + //TODO find replaement out of theme + spells.Add("1fca0ba2fdfe2994a8c8bc1f0f2fc5b1");//Sunbeam + spells.Add("e96424f70ff884947b06f41a765b7658");//Sunburst + spells.Add("08ccad78cac525040919d51963f9ac39"); + // [PFS Legal] Light (Ultimate Magic pg. 83): 2nd — dancing lantern, 4th — continual flame, 6th — daylight, 8th — rainbow pattern, 10th — fire snake, 12th — sirocco, 14th — sunbeam, 16th — sunburst, 18th — fiery body. + + patronDefines.Add(new("Light", spells, ()=> { return Settings.IsEnabled("BurstOfRadiance"); })); + + + } + + void MakeMountain() + { + List spells = new(); + spells.Add("85067a04a97416949b5d1dbf986d93f3"); + spells.Add("5181c2ed0190fc34b8a1162783af5bf4"); + spells.Add("EarthTremor");//COTW used battering blast, lolno go for that tremor attack spell + spells.Add("d1afa8bc28c99104da7d784115552de5"); + spells.Add("7c5d556b9a5883048bf030e20daebe31");//COTW used stoneskin, communal - using + spells.Add("e243740dfdb17a246b116b334ed0b165");//COTW used Stone To Flesh - hilariously niche but I don't think this game could cope with Flesh To Stone. Using + spells.Add("3ecd589cf1a55df42a3b66940ee93ea4");//Summong Greater Earth Elemental + + spells.Add("65254c7a2cf18944287207e1de3e44e8");//Summong Elder Earth Elemental + spells.Add("01300baad090d634cb1a1b2defe068d6");//Summong Elder Earth Elemental + //Mountain (Heroes of the Wild pg. 13): 2nd — stone fist, 4th — stone call, 6th — stone shape, 8th — spike stones, 10th — wall of stone, 12th — flesh to stone, 14th — stone tell, 16th — repel metal or stone, 18th — clashing rocks. + } + + void MakePlague() { - if (spells.Count != 9) - return null; + List spells = new(); + spells.Add("fa3078b9976a5b24caf92e20ee9c0f54");//COTW - ray of sickening + if (Settings.IsEnabled("PlaguePerniciousPoison")) + spells.Add("dee3074b2fbfb064b80b973f9b56319e");//COTW - pernicious poison else + spells.Add("0b101dd5618591e478f825f0eef155b4"); + spells.Add("48e2744846ed04b4580be1a3343a5d3d"); + spells.Add("4b76d32feb089ad4499c3a1ce8e1ac27"); + spells.Add("548d339ba87ee56459c98e80167bdf10");//COTW - cloudkill + spells.Add("82a5b848c05e3f342b893dedb1f9b446");//PlagueStorm - COTW + spells.Add("76a11b460be25e44ca85904d6806e5a3");//COTW - create undead kicked up a level because ye gods plague not getting plage storm + spells.Add("08323922485f7e246acb3d2276515526");//COTW - Horrid WIlting + spells.Add("37302f72b06ced1408bf5bb965766d46"); + // Plague (Advanced Player's Guide pg. 70): 2nd — detect undead, 4th — command undead, 6th — contagion, 8th — animate dead, 10th — giant vermin, 12th — create undead, 14th — control undead, 16th — create greater undead, 18th — energy drain. + //Add to hagbound + patronDefines.Add(new("Plague", spells, arches: new string[] { "HagboundPatronSelect" })); + } + void MakeProtection() + { + List spells = new(); + spells.Add("183d5bb91dea3a1489a6db6c9cb64445");//Shield of faith - h + spells.Add("21ffef7791ce73f468b6fca4d9371e8b"); + spells.Add("d2f116cfe05fcdd4a94e80143b67046f");//COTW - protection from energy + spells.Add("c66e86905f7606c4eaa5c774f0357b2b"); + spells.Add("7c5d556b9a5883048bf030e20daebe31");//COTW used stoneskin, communal - using + spells.Add("fafd77c6bfa85c04ba31fdc1c962c914");//COTW - Restoration, Greater + spells.Add("42aa71adc7343714fa92e471baa98d42");//COTW - protection from spells + spells.Add("7ef49f184922063499b8f1346fb7f521");//COTW - Seamantle + spells.Add("87a29febd010993419f2a4a9bee11cfc");//COTW - mind blank, communal + + // [PFS Legal] Protection (Heroes of the High Court pg. 9): 2nd — sanctuary, 4th — resist energy, 6th — wrathful mantleAPG, 8th — stoneskin, 10th — interposing hand, 12th — forbiddance, 14th — greater spell immunity, 16th — prismatic wall, 18th — freedom. + + patronDefines.Add(new("Protection", spells)); + } + void MakeSpring() + { + List spells = new(); + spells.Add("f3c0b267dd17a2a45a40805e31fe3cd1"); + spells.Add("6c7467f0344004d48848a43d8c078bf8");//COTW sickening entnaglement + spells.Add("d219494150ac1f24f9ce14a3d4f66d26");//COTW feather step mass + spells.Add("a5e23522eda32dc45801e32c05dc9f96");//COTW Good Hope + spells.Add("");//COTW constricting coils ... huh? + spells.Add("645558d63604747428d55f0dd3a4cb58"); + spells.Add("26be70c4664d07446bdfe83504c1d757");//COTW changestaff + spells.Add("7cfbefe0931257344b2cb7ddc4cdff6f");//COTW - stormbolts + spells.Add(""); + + // [PFS Legal] Spring (Ultimate Wilderness pg. 88): 2nd — feather fall, 4th — alter self, 6th — pup shape, 8th — trueform, 10th — lightning arc, 12th — chain lightning, 14th — control weather, 16th — stormbolts, 18th — time stop. + } + + void MakeStorm() + { + List spells = new(); + spells.Add(""); + spells.Add(""); + spells.Add("2a9ef0e0b5822a24d88b16673a267456");//Call Lightning + spells.Add("fcb028205a71ee64d98175ff39a0abf9");//I + spells.Add("d5a36a7ee8177be4f848b953d1c53c84"); + spells.Add(""); + spells.Add(""); + spells.Add("7cfbefe0931257344b2cb7ddc4cdff6f");//Not sure what this is + spells.Add("5d8f1da2fdc0b9242af9f326f9e507be");//COTW - winds of vegneance + //Add to elemental witch + //Storms (Heroes of the Wild pg. 13): 2nd — obscuring mist, 4th — fog cloud, 6th — call lightning, 8th — ice storm, 10th — call lightning storm, 12th — wind walk, 14th — control weather, 16th — whirlwind, 18th — storm of vengeance. + } + + + void MakeSummer() + { + List spells = new(); + spells.Add("f8774451760a427ab4694d10581cfda6");//Goodberry - expanded content! + spells.Add("");//FlamingSphere - needs replacer + spells.Add("bf0accce250381a44b857d4af6c8e10d");//Searing Light + spells.Add("");//Greater flaming + spells.Add("WallOfFireAbility");//Wall of fire - from EC! + spells.Add("093ed1d67a539ad4c939d9d05cfe192c"); + spells.Add("1fca0ba2fdfe2994a8c8bc1f0f2fc5b1");//Sunbeam + spells.Add("e96424f70ff884947b06f41a765b7658");//Sunburst + spells.Add("08ccad78cac525040919d51963f9ac39"); + + // [PFS Legal] Summer (Ultimate Wilderness pg. 88, Heroes of the Wild pg. 13): 2nd — goodberry, 4th — flaming sphere, 6th — daylight, 8th — greater flaming sphere, 10th — wall of fire, 12th — sirocco, 14th — sunbeam, 16th — sunburst, 18th — fiery body. + } + + void MakeWater() + { + List spells = new(); + spells.Add("");//Hydraulic push from expanded content + spells.Add("");//Slipstream from expanded content + spells.Add("");//Need replacement for Water Breathing + spells.Add("");//Need replacement for control water + spells.Add("");//Need replacement for geyser + spells.Add("");//e body III + spells.Add("");// e body IV + spells.Add("7ef49f184922063499b8f1346fb7f521");//Seamantle + spells.Add("");//Tsunami + + // Water (Advanced Player's Guide pg. 70): 2nd — bless water/curse water, 4th — slipstream, 6th — water breathing, 8th — control water, 10th — geyser, 12th — elemental body III (water only), 14th — elemental body IV (water only), 16th — seamantle, 18th — tsunami. + } + + void ProcessPatron(PatronDefine patronDefine) + { + if (patronDefine.CanComplete()) { - BlueprintProgression progression = TabletopTweaks.Core.Utilities.Helpers.CreateBlueprint(Main.TotFContext, $"Witch{patronName}PatronProgression", x => + + List spells = patronDefine.spells.Select(x => BlueprintTool.Get(x)).ToList(); + BlueprintProgression progression = TabletopTweaks.Core.Utilities.Helpers.CreateBlueprint(Main.TotFContext, patronDefine.ProgName, x => { - x.SetName(Main.TotFContext, patronName); + x.SetName(Main.TotFContext, patronDefine.Name); x.AddClass(witch); x.LevelEntries = new LevelEntry[0]; + for (int i = 0; i < 9; i++) { int spelllevel = i + 1; - BlueprintFeature feature = MakeEntry(spelllevel, spells[i], patronName); + BlueprintFeature feature = MakeEntry(spelllevel, spells[i], patronDefine.Name); x.LevelEntries = x.LevelEntries.AppendToArray(new LevelEntry { m_Features = new List() { feature.ToReference() }, Level = spelllevel * 2 }); } @@ -78,16 +334,54 @@ BlueprintProgression MakePatronProgression(string patronName, List().Introduction; }); + x.IsClassFeature = true; - x.Groups = new FeatureGroup[] { FeatureGroup.WitchPatron }; + }); + + + FeatureConfigurator.For(progression).SetGroups(FeatureGroup.WitchPatron).Configure(); Main.TotFContext.Logger.LogPatch(progression); - return progression; + + // FeatureSelectionConfigurator.For(witchSelector).AddToAllFeatures( progression).Configure(); + FeatureSelectionConfigurator.For("24afc8be7a964e5a939b2a199ba60682").AddToAllFeatures(progression).Configure(); + + } + else + { + BlueprintProgression progression = TabletopTweaks.Core.Utilities.Helpers.CreateBlueprint(Main.TotFContext, patronDefine.ProgName, x => + { + x.SetName(Main.TotFContext, patronDefine.Name); + x.AddClass(witch); + x.LevelEntries = new LevelEntry[0]; + + for (int i = 0; i < 9; i++) + { + int spelllevel = i + 1; + + BlueprintFeature feature = TabletopTweaks.Core.Utilities.Helpers.CreateBlueprint(Main.TotFContext, $"Witch{patronDefine.Name}PatronSpellLevel{spelllevel}", x => + { + x.HideInCharacterSheetAndLevelUp = true; + + + + }); + + + + } + + x.IsClassFeature = true; + + }); } + } + + BlueprintFeature MakeEntry(int level, BlueprintAbility Spell, string patron) { @@ -107,17 +401,14 @@ BlueprintFeature MakeEntry(int level, BlueprintAbility Spell, string patron) return entry; } + - } - - public static void Finish() - { - BlueprintFeatureSelection witchSelector = BlueprintTools.GetBlueprint("381cf4c890815d049a4420c6f31d063f"); - if (Settings.IsEnabled("witchpatrondeath") && Settings.IsEnabled("GloomblindBolts")) + foreach(var patron in patronDefines) { - witchSelector.AddFeatures(BlueprintTools.GetModBlueprint(Main.TotFContext, "WitchDeathPatronProgression")); - Main.TotFContext.Logger.LogPatch("Added Death Patron", witchSelector); + ProcessPatron(patron); } } + + } } diff --git a/TomeOfTheFirebird/Resources.cs b/TomeOfTheFirebird/Resources.cs deleted file mode 100644 index 4d70c45..0000000 --- a/TomeOfTheFirebird/Resources.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace TomeOfTheFirebird -{ - static class Resources - { - /* - public static readonly Dictionary ModBlueprints = new Dictionary(); - public static T GetModBlueprint(string name) where T : SimpleBlueprint - { - var assetId = Main.TotFContext.Blueprints.GetGUID(name); - ModBlueprints.TryGetValue(assetId, out var value); - return value as T; - } - public static T GetBlueprint(string id) where T : SimpleBlueprint - { -#if DEBUG - Main.Log($"Getting {id} of {typeof(T)}"); -#endif - var assetId = new BlueprintGuid(System.Guid.Parse(id)); - return GetBlueprint(assetId); - } - public static T GetBlueprint(BlueprintGuid id) where T : SimpleBlueprint - { - SimpleBlueprint asset = ResourcesLibrary.TryGetBlueprint(id); - T value = asset as T; - if (value == null) { Main.TotFContext.Logger.LogError($"COULD NOT LOAD: {id} - {typeof(T)}"); } - return value; - } - public static void AddBlueprint([NotNull] SimpleBlueprint blueprint) - { - AddBlueprint(blueprint, blueprint.AssetGuid); - } - public static void AddBlueprint([NotNull] SimpleBlueprint blueprint, string assetId) - { - var Id = BlueprintGuid.Parse(assetId); - AddBlueprint(blueprint, Id); - } - public static void AddBlueprint([NotNull] SimpleBlueprint blueprint, BlueprintGuid assetId) - { - var loadedBlueprint = ResourcesLibrary.TryGetBlueprint(assetId); - if (loadedBlueprint == null) - { - ModBlueprints[assetId] = blueprint; - ResourcesLibrary.BlueprintsCache.AddCachedBlueprint(assetId, blueprint); - blueprint.OnEnable(); - Main.TotFContext.Logger.LogPatch("Added", blueprint); - } - else - { - Main.TotFContext.Logger.Log($"Failed to Add: {blueprint.name}"); - Main.TotFContext.Logger.Log($"Asset ID: {assetId} already in use by: {loadedBlueprint.name}"); - } - } - - public static T GetTabletopTweaksBlueprint(string name) where T : SimpleBlueprint - { - var assetId = Main.TotFContext.Blueprints.GetGUID(name); - bool modBPExists = ModBlueprints.TryGetValue(assetId, out var value); - if (modBPExists) - { - return value as T; - } - else - { - //Main.Log($"{name} not found locally"); - T blueprint = GetBlueprint(assetId); - if (blueprint != null) - { - - //Main.Log($"{name} located in Tabletop Tweaks"); - //Main.TotFContext.Blueprints.SetTTBPUsed(name, assetId); - return blueprint; - } - else - { - //Main.Log($"{name} not built"); - return null; - } - - } - - } - */ - - } -} diff --git a/TomeOfTheFirebird/Settings.cs b/TomeOfTheFirebird/Settings.cs index 1ef0ad9..7b980fe 100644 --- a/TomeOfTheFirebird/Settings.cs +++ b/TomeOfTheFirebird/Settings.cs @@ -43,7 +43,13 @@ internal static bool IsTTTBaseEnabled() .Any(); } - + internal static bool IsCharOpsPlusEnabled() + { + return UnityModManager.modEntries.Where( + mod => mod.Info.Id.Equals("CharacterOptionsPlus") && mod.Enabled && !mod.ErrorOnLoading) + .Any(); + } + public static void Make() { LocalizationTool.LoadLocalizationPack("Mods\\TomeOfTheFirebird\\Localization\\Settings.json"); @@ -62,8 +68,15 @@ public static void Make() builder.AddToggle(MakeToggle("internalbuffer", "Kineticist: Internal Buffer", true, "Restores Kineticist Internal Buffer Class Feature")); builder.AddToggle(MakeToggle("phoenixbloodline", "Phoenix Bloodline", true, "Adds Phoenix Bloodline (Bloodrager Only)")); builder.AddToggle(MakeToggle("RagePowerElementalStance", "Rage Power: Elemental Stance", true, "Adds barbarian rage power elemental stance to the game. Increases low-level damage from TT to balance with Powerful Stance,")); + builder.AddToggle(MakeToggle("RagePowerRageStanceMastery", "Rage Power: Stance Mastery", true, "Homebrew: Allows a barbarian to use two rage power stances at once. Requires level 14 in a rage power using class or archetype")); + builder.AddToggle(MakeToggle("WitchPatronAnimal", "Witch Patron: Animal", true, "Adds the Animal witch patron. Some deviation from tabletop to deal with unimplementable (speak with/charm animals) and unimplemented (antilife shell) spells.")); builder.AddToggle(MakeToggle("witchpatrondeath", "Witch Patron: Death", true, "Adds the Death witch patron, focusing on necromantic attack spells. Some deviation from tabletop to account for unimplmentable (speak with dead, rest eternal), unimplemented (suffocate, symbol of death) and just plain bad (power word kill) TT spells. Requires Gloomblind Bolts to be enabled.")); - builder.AddToggle(MakeToggle("witchpatronl2replace", "Death Patron: Replace Blessing Of Courage And Life", true, "Replaces TT Death level 2 : Blessing Of Courage and Life with Boneshaker to go all in on necromantic attack")); + builder.AddToggle(MakeToggle("WitchPatronDeathL2replace", "Death Patron: Replace Blessing Of Courage And Life", true, "Replaces TT Death level 2 : Blessing Of Courage and Life with Boneshaker to go all in on necromantic attack")); + builder.AddToggle(MakeToggle("WitchPatronLight", "Witch Patron: Light", true, "Adds the Light witch patron, focusing on light-themed crowd control and damage spells. Some deviation from tabletop to account for lack of detailed lighting system in game making dancing lantern, continual flame, and daylight unimplementable. Also swapped out Sirocco for Chains Of Light because seriously?").IsModificationAllowed(() => Settings.GetDD("WitchEmberPatron") != EmberPatron.Light)); + builder.AddToggle(MakeToggle("WitchPatronPlague", "Witch Patron: Plague", true, "Adds the Plague witch patron, focusing on different necromantic nastiness. Some deviation from tabletop to account for unimplemented (detect undead, control undead, 16th — create greater undead), and just plain bad (giant vermin) TT spells. Kicks Create Undead up a level to slot in Plague Storm")); + builder.AddToggle(MakeToggle("PlaguePerniciousPoison", "Plague Patron: Replace Command Undead with Pernicious Poison", false, "Follow Call Of The Wild's lead and swap Command Undead for Pernicious Poison on the Plague patron")); + builder.AddToggle(MakeToggle("WitchPatronProtection", "Witch Patron: Protection", true, "Adds the Protection witch patron, focusing on defense spells. Some deviation from tabletop to account for most of the list being unimplemented, using CoTW list instead.")); + builder.AddSubHeader(GetString("Feats.Title"), startExpanded: true); @@ -86,14 +99,14 @@ public static void Make() builder.AddToggle(MakeToggle("FixHolyWaterJet", "Arcanist: Fix Holy Water Jet", true, "Holy Water Jet has correct prereqs - no more mythic path requirement")); builder.AddToggle(MakeToggle("FixAngelArtifactCloak", "Bound Of Possibility: Fix Angel Version", true, "The Angel version of Bound Of Possibility now properly applies to weapon attacks - they partially fixed in EE")); - builder.AddToggle(MakeToggle("FixBloodragerSpellIcons", "Bloodrager: Fix Bloodline SpellIcons", true, "Gives Bloodline Spell features the icon of the spell.")); + builder.AddToggle(MakeToggle("FixBloodragerSpellIcons", "Bloodrager: Fix Bloodline Spell Icons", true, "Gives Bloodline Spell features the icon of the spell.")); builder.AddToggle(MakeToggle("FixExtraHitsFirebrand", "Fix Extra Hits: Firebrand", true, "Firebrand now adds a 1d6 fire rider to all attacks, rather than a 1d6 fire extra hit.")); builder.AddToggle(MakeToggle("FixExtraHitsSmallDragon", "Fix Extra Hits: Small Dragon", true, "The adorable little dragon from Dawn Of Dragons now gives his random extra damage as part of the attack, not as an extra hit.")); builder.AddToggle(MakeToggle("FixExtraHitsClawsOfASacredBeast", "Fix Extra Hits: Claws Of A Sacred Beast", true, "Claws Of A Sacred Beast no longer gives an extra hit, now simply adds the correct slash damage.")); + builder.AddToggle(MakeToggle("FixWitchSpellIcons", "Witch: Fix Patron Spell Icons", true, "Gives Witch Spell features the icon of the spell.")); - builder.AddToggle(MakeToggle("CleanupEldritchScion", "Eldritch Scion: Cleanup Progression", true, "Dynamically kills weird add / remove of Arcane Weapon upgrades on Eldritch Scion")); builder.AddToggle(MakeToggle("FixRadianceFinalForm", "Radiance: Fix Final (Holy) Form", true, "The good version of Radiance's final form now properly retains its holy effect")); @@ -113,6 +126,7 @@ public static void Make() builder.AddToggle(MakeToggle("MythicKineticAegis", "Mythic Kinetic Aegis", true, "(Homebrew) Improves Kineticist Elemental Defenses with Mythic Rank.")); builder.AddSubHeader(GetString("Spells.Title"), startExpanded: true); builder.AddToggle(MakeToggle("BoneFists", "Bone Fists", true, "Level 2 spell for many classes, gives +1 natural armor (form-type) and +2 natural weapons damage to group.")); + builder.AddToggle(MakeToggle("BurstOfRadiance", "Burst Of Radiance", true, "Level 2 spell for many classes, targets area, blinds on failed save, dazzles on success, deals small damage to evil.")); builder.AddToggle(MakeToggle("ChainsOfFire", "Chains Of Fire", true, "A fire damage knockoff of chain lightning.")); builder.AddToggle(MakeToggle("EntropicShield", "Entropic Shield", true, "Level 1 Cleric/Oracle spell, gives 20% miss chance to incoming ranged attacks")); builder.AddToggle(MakeToggle("FireShield", "Fire Shield", true, "Resist Fire/Cold, deal backlash damage of other element.")); @@ -139,7 +153,11 @@ public static void Make() builder.AddToggle(MakeToggle("PurifierLevelThreeRevelation", "Purifier: Restore Level Three Revelation", true, "Restores Purifier Level 3 relevation - TT forced pick was not implemented and is unimplementable so pick should be available.")); builder.AddToggle(MakeToggle("PurifierCelestialArmorTraining", "Purifier: Enhance Celestial Armor Training", true, "Purifier's Celestial Armor unique revelation now grants advanced armor training access. Note: Absolutely Requires Tabletop Tweaks Base.")); builder.AddToggle(MakeToggle("WitchRestoreStigmatizedPatron", "Stigmatized Witch: Restore Patron", true, "Moves stigmatized somewhat out of the suck by cancelling the patron removal. By default, this will give Ember the Endurance Patron when first met")); - builder.AddDropdown(MakeDropdown("WitchEmberPatron", "Stigmatized Witch: Select Ember's Patron", EmberPatron.Endurance, UnityEngine.ScriptableObject.CreateInstance(), "Select Ember's Patron")); + builder.AddDropdown(MakeDropdown("WitchEmberPatron", "Stigmatized Witch: Select Ember's Patron", EmberPatron.Endurance, UnityEngine.ScriptableObject.CreateInstance(), "Select Ember's Patron").OnValueChanged(x=> { + + if (x == EmberPatron.Light) + ModMenu.ModMenu.SetSetting(GetKey("WitchPatronLight"), true); + })); builder.AddToggle(MakeToggle("DawnOfDragonsRewardFeatureConversion", "Dawn Of Dragons: Convert Reward To Feature", true, "Converts the Holy Aura you get from siding with the silver dragon in Dawn Of Dragons to a feature from a permabuff to make it harder to lose and clear what is up.")); builder.AddDropdown(MakeDropdown("DawnOfDragonsCustomReward", "Dawn Of Dragons: Custom Reward Selector", DawnOfDragonsCustomReward.Everyone, UnityEngine.ScriptableObject.CreateInstance(), "The custom reward replaces the often redundant perma-Holy-Aura effect with a more thematic perk - bit of cold weapon damage, natural armor and cold resist. Perks are comparable to the level 5 Geniekind as opposed to the level 8 Holy Aura. Requires the above setting to be active.")); @@ -194,7 +212,8 @@ public enum EmberPatron { Elements, Healing, - Endurance + Endurance, + Light } // Declare a non-generic class which inherits from the generic type private class EmberUnityEnumEnum : UISettingsEntityDropdownEnum diff --git a/TomeOfTheFirebird/TomeOfTheFirebird.csproj b/TomeOfTheFirebird/TomeOfTheFirebird.csproj index db859c2..7a4c1af 100644 --- a/TomeOfTheFirebird/TomeOfTheFirebird.csproj +++ b/TomeOfTheFirebird/TomeOfTheFirebird.csproj @@ -47,7 +47,7 @@ all - + @@ -171,12 +171,15 @@ + + + @@ -188,6 +191,7 @@ + @@ -215,6 +219,7 @@ + @@ -232,7 +237,7 @@ - + @@ -262,10 +267,11 @@ + - + @@ -311,7 +317,6 @@ - @@ -351,7 +356,6 @@ - @@ -374,7 +378,7 @@ - + @@ -384,22 +388,17 @@ - + - - - - - - + + + + + - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.